CMake 3.15 發行說明¶
自 CMake 3.14 以來所做的變更包括以下內容。
新功能¶
產生器¶
現在
Xcode
產生器支援每個目標的 schemes。請參閱CMAKE_XCODE_GENERATE_SCHEME
變數和XCODE_GENERATE_SCHEME
目標屬性。Green Hills MULTI
產生器已更新現在它支援
add_custom_command()
和add_custom_target()
命令。現在它在 Linux 上可用。
語言¶
已在
Ninja
產生器中新增對Swift
語言的初步支援使用
SWIFTC
環境變數來指定編譯器。新增了
Swift_DEPENDENCIES_FILE
目標屬性和Swift_DEPENDENCIES_FILE
原始檔屬性,以自訂相依性檔案。新增了
Swift_MODULE_NAME
目標屬性,以自訂 Swift 模組名稱。新增了
Swift_DIAGNOSTICS_FILE
原始碼屬性,以指示在哪裡寫入序列化的 Swift 診斷資訊。
Swift 支援是實驗性的,不被認為是穩定的,並且在 CMake 的未來版本中可能會變更。
編譯器¶
現在支援 Windows 上以 MSVC ABI 為目標但具有類似 GNU 命令列的
Clang
編譯器變體。新增了對基於 Clang 的 ARM 編譯器的支援,編譯器 ID 為
ARMClang
。新增了對 IAR 編譯器架構 Renesas RX、RL78、RH850 和 Texas Instruments MSP430 的支援。
新增了對為 Linux 建置的 IAR 編譯器 (IAR BuildLx) 的支援。
命令列¶
新增了
CMAKE_GENERATOR
環境變數,用於在未帶-G
選項執行cmake(1)
時,指定要使用的預設產生器。此外,還建立了環境變數CMAKE_GENERATOR_PLATFORM
、CMAKE_GENERATOR_TOOLSET
和CMAKE_GENERATOR_INSTANCE
,以設定產生器。cmake(1)
--build
工具的--target
參數增加了對多個目標的支援,例如cmake --build . --target Library1 Library2
。現在它也有簡短形式-t
別名,例如cmake --build . -t Library1 Library2
。cmake(1)
命令新增了一個--install
選項。這可以在建置專案後使用,以執行安裝,而無需使用產生的建置系統或原生建置工具。cmake(1)
命令學習了一個新的 CLI 選項--loglevel
。cmake(1)
-E remove_directory
命令列工具學習支援移除多個目錄。cmake(1)
-E tar
工具已改進即使某些檔案不可讀,它現在也會繼續將檔案新增到封存檔中。此行為與經典的
tar
工具更加一致。它現在會解析所有旗標,如果提供了無效的旗標,則會發出警告。
如果未指定任何動作旗標,它現在會顯示錯誤,並列出可能的動作:
t
(list)、c
(create) 或x
(extract)。它現在支援僅解壓縮 (
-x
) 或列出 (-t
) 特定檔案或目錄。它現在支援使用
--zstd
選項進行 Zstandard 壓縮。Zstandard 的設計旨在提供與 DEFLATE (zip) 演算法相當的壓縮率,但速度更快,尤其是在解壓縮方面。
命令¶
add_custom_command()
和add_custom_target()
命令新增了一個JOB_POOL
選項,該選項與Ninja
產生器搭配使用,以在建置語句上設定 pool 變數。add_library()
命令的ALIAS
選項學習支援UNKNOWN
類型的匯入程式庫。cmake_parse_arguments()
命令新增了一個額外的<prefix>_KEYWORDS_MISSING_VALUES
輸出變數,以報告呼叫端在沒有值的情況下提供的關鍵字引數。execute_process()
命令新增了一個COMMAND_ECHO
選項和支援CMAKE_EXECUTE_PROCESS_COMMAND_ECHO
變數,以在執行之前啟用命令列字串的回顯。file(INSTALL)
命令學習了一個新的引數FOLLOW_SYMLINK_CHAIN
,可用於遞迴解析和安裝符號連結。list()
學習了新的子命令:PREPEND
、POP_FRONT
和POP_BACK
。message()
命令學習了新的類型:NOTICE
、VERBOSE
、DEBUG
和TRACE
。string()
學習了一個新的子命令REPEAT
。
變數¶
CMAKE_CROSSCOMPILING_EMULATOR
變數和對應的CROSSCOMPILING_EMULATOR
目標屬性學習支援模擬器的引數。新增了
CMAKE_FIND_PACKAGE_PREFER_CONFIG
變數,以告知find_package()
呼叫首先尋找套件組態檔,即使有 find 模組可用。新增了
CMAKE_FRAMEWORK
變數,以初始化所有目標上的FRAMEWORK
屬性。新增了
CMAKE_VS_JUST_MY_CODE_DEBUGGING
變數和VS_JUST_MY_CODE_DEBUGGING
目標屬性,以在使用 MSVC cl 19.05 及更高版本進行編譯時,啟用 Visual Studio 偵錯工具的 Just My Code 功能。引入了
CMAKE_MSVC_RUNTIME_LIBRARY
變數和MSVC_RUNTIME_LIBRARY
目標屬性,以選擇以 MSVC ABI 為目標的編譯器所使用的執行階段程式庫。請參閱政策CMP0091
。新增了
CMAKE_PROJECT_INCLUDE
和CMAKE_PROJECT_INCLUDE_BEFORE
變數,以允許在不知道專案名稱的情況下,在project()
呼叫的位置注入自訂程式碼。
屬性¶
新增了
ADDITIONAL_CLEAN_FILES
目標屬性和ADDITIONAL_CLEAN_FILES
目錄屬性。它們允許註冊在清除階段應移除的其他檔案。現在可以在 介面程式庫 上設定
PUBLIC_HEADER
和PRIVATE_HEADER
屬性。可以使用install(TARGETS)
命令並分別傳遞PUBLIC_HEADER
和PRIVATE_HEADER
引數來安裝這些屬性指定的標頭檔。新增了
VS_PACKAGE_REFERENCES
目標屬性,以告知 Visual Studio 產生器 新增對nuget
套件的參考。新增了
VS_PROJECT_IMPORT
目標屬性,以允許受管理的 Visual Studio 專案檔案匯入外部.props
檔案。新增了
VS_NO_SOLUTION_DEPLOY
目標屬性,以告知 Visual Studio 產生器 是否將成品部署到 WinCE 或 Windows Phone 目標裝置。
模組¶
重新設計了
FindBoost
模組,以便在其「Config」和「Module」模式之間以及與其他 find 模組之間展現更一致的使用者體驗。現在定義了一個新的匯入目標
Boost::headers
(與Boost::boost
相同)。新增了新的輸出變數
Boost_VERSION_MACRO
、Boost_VERSION_MAJOR
、Boost_VERSION_MINOR
、Boost_VERSION_PATCH
和Boost_VERSION_COUNT
。在 config 模式下,傳遞給
find_package()
的QUIET
引數不再被忽略。請注意,Boost1.70.0
隨附的 CMake 套件會忽略傳遞給find_package()
的QUIET
引數。這已在下一個 Boost 版本中修正。移除了輸入開關
Boost_DETAILED_FAILURE_MSG
。現在
Boost_VERSION
在模組模式下以x.y.z
格式報告版本。請參閱政策CMP0093
。
現在
FindCups
模組提供匯入的目標。新增了
FindEnvModules
模組,以在 CTest 腳本 中使用基於 Lua 和 TCL 的環境模組。現在
FindGLEW
模組提供的介面與上游 GLEW 在其自己的 CMake 套件檔案中提供的介面更加一致。現在
FindPkgConfig
使用其他 (非程式庫) 連結器旗標填入匯入目標的INTERFACE_LINK_OPTIONS
屬性。FindPostgreSQL
模組學習分別尋找偵錯和發行變體。FindPython3
、FindPython2
和FindPython
模組獲得了額外的查找策略和控制,以及新的預設值。請參閱政策CMP0094
。FindPython
、FindPython2
和FindPython3
模組獲得了一個新的目標 (分別為Python::Module
、Python2::Module
和Python3::Module
),可用於開發 Python 模組。FindPython3
、FindPython2
和FindPython
模組獲得了控制虛擬環境處理方式的功能。UseSWIG
模組學習透過將-interface <library_name>
傳遞給python
語言或將-dllimport <library_name>
傳遞給CSharp
語言到SWIG
編譯器,來管理替代的程式庫名稱。
產生器運算式¶
產生器運算式
$<C_COMPILER_ID>
、$<CXX_COMPILER_ID>
、$<CUDA_COMPILER_ID>
、$<Fortran_COMPILER_ID>
、$<COMPILE_LANGUAGE>
、$<COMPILE_LANG_AND_ID>
和$<PLATFORM_ID>
學習支援從逗號分隔清單中比對一個值。新增了
$<CUDA_COMPILER_ID:...>
和$<CUDA_COMPILER_VERSION:...>
產生器運算式。引入了
$<COMPILE_LANG_AND_ID:...>
產生器表達式,以允許基於每個源檔案的CMAKE_<LANG>_COMPILER_ID
和LANGUAGE
來指定目標檔案的編譯選項。新增了
$<FILTER:list,INCLUDE|EXCLUDE,regex>
產生器表達式。新增了
$<REMOVE_DUPLICATES:list>
產生器表達式。$<SHELL_PATH:...>
產生器表達式增加了對路徑列表的支援。新增了
$<TARGET_FILE*>
產生器表達式
,用於檢索各種產出檔案的字首、基本名稱和後綴$<TARGET_OBJECTS:...>
產生器表達式現在支援SHARED
、STATIC
、MODULE
程式庫和可執行檔。
CTest¶
ctest_submit()
命令新增了一個選項:BUILD_ID
。這可以用於將 CDash 分配給此建置的 ID 儲存到變數中。ctest_update()
命令學會了採用一個新的變數:CTEST_UPDATE_VERSION_OVERRIDE
。這可以用於指定您的原始碼樹的當前版本,而不是使用 update 命令來發現已簽出的當前版本。
CPack¶
CPack IFW 產生器
獲得了一個新的CPACK_IFW_PACKAGE_STYLE_SHEET
變數,用於自訂安裝程式樣式表。
已棄用和移除的功能¶
cmake-server(7)
模式已被棄用,並將在未來版本的 CMake 中移除。請將客戶端移植到使用cmake-file-api(7)
來代替。ADDITIONAL_MAKE_CLEAN_FILES
目錄屬性現在已被棄用。請改用ADDITIONAL_CLEAN_FILES
目錄屬性。變數
CMAKE_AUTOMOC_RELAXED_MODE
被認為已棄用。仍然存在支援,但將在未來版本中移除。export(PACKAGE)
命令現在不執行任何操作,除非透過CMAKE_EXPORT_PACKAGE_REGISTRY
啟用。請參閱政策CMP0090
。Xcode
產生器現在至少需要 Xcode 5。為政策
CMP0066
新增了明確的棄用診斷訊息(CMP0065
及更低版本已經被棄用)。cmake-policies(7)
手冊解釋說,所有政策的 OLD 行為都已棄用,專案應移植到 NEW 行為。
其他變更¶
如果
target_compile_features()
指定的功能在編譯器的預設標準級別中可用,則 CMake 3.14 及更低版本錯誤地新增了不必要的-std=
標誌,這些標誌可能會降低標準級別。此錯誤已在 CMake 3.15 中修復。此行為變更可能會暴露出依賴未記錄實作細節的現有專案中的錯誤。指定編譯功能僅確保編譯器在具有這些功能的模式下運行,而不是使用任何特定的標準級別或傳遞明確的-std=
標誌。CMake 學會了如何使用 IBM AIX XL 編譯器和 SunPro 編譯器編譯 C++14,以及如何使用 AppleClang 編譯器編譯 C++20。
對於類似 MSVC 的編譯器,
CMAKE_<LANG>_FLAGS
的值預設不再包含像/W3
這樣的警告標誌。請參閱政策CMP0092
。定義了
__ibmxl__
的基於 IBM Clang 的 XL 編譯器現在使用編譯器 IDXLClang
而不是XL
。請參閱政策CMP0089
。file(REMOVE)
和file(REMOVE_RECURSE)
命令已更改為忽略帶有警告的空引數,而不是將它們視為相對路徑並刪除當前目錄的內容。
更新¶
自 CMake 3.15.0 以來進行的變更包括以下內容。
3.15.1¶
在 CMake 3.15.0 中,針對 MSVC ABI 的類 GNU
Clang
編譯器的支援實作了CMAKE_CXX_STANDARD
值 98 和 11,使用了相應的-std=
標誌。但是,這些模式不適用於 MSVC 標準程式庫。因此,即使對於 C++98 和 C++11,CMake 3.15.1 也會傳遞 C++14 標準標誌。這與 MSVC 本身一致,MSVC 本身始終在感知 C++14 的模式下運行。已更新 3.15.0 中新增的初步 Swift 支援。
3.15.2¶
在 CMake 3.15.0 和 3.15.1 中,即使沒有
REQUIRED
選項,CMAKE_FIND_PACKAGE_PREFER_CONFIG
變數也會導致find_package()
命令在套件遺失時失敗。這已被修復。
3.15.3¶
CrayPrgEnv
編譯器包裝器支援已針對 Cray Programming Environment 的 19.06 版本進行了更新,對於該版本,XC Cray 系統上的預設連結模式現在是動態的而不是靜態的。
3.15.4¶
在 CMake 3.15.0 到 3.15.3 中,
EXCLUDE_FROM_ALL
目錄屬性從 3.14 之前的行為退化,並導致目錄中的目標即使從其自己的 "all" 中也被排除。這已被修復。此錯誤也存在於 3.14.0 到 3.14.6 中,並已在 3.14.7 中修復。