CMake 3.21 發行說明¶
自 CMake 3.20 以來進行的變更包括以下內容。
新功能¶
預設集¶
cmake-presets(7)
新增了在設定預設集中指定安裝前綴的支援。cmake-presets(7)
新增了有條件地啟用預設集的支援。cmake-presets(7)
新增了對${hostSystemName}
巨集的支援。cmake-presets(7)
新增了省略generator
和binaryDir
欄位的支援。
產生器¶
新增了
Visual Studio 17 2022
產生器。Makefile 產生器 和
Ninja
產生器學會了為C
、CXX
、OBJC
和OBJCXX
語言新增連結器啟動器工具以及連結器。請參閱CMAKE_<LANG>_LINKER_LAUNCHER
變數和<LANG>_LINKER_LAUNCHER
目標屬性以取得詳細資訊。
語言¶
CMake 學會了支援
HIP
作為第一級語言,可以透過project()
和enable_language()
命令啟用。C_STANDARD
、OBJC_STANDARD
和編譯 功能
功能新增了對 C17 和 C23 的支援。原始碼副檔名
.ixx
和.cppm
現在被視為 C++。
命令列¶
cmake(1)
新增了--install-prefix
命令列選項,以指定安裝前綴的位置。cmake(1)
新增了--toolchain
命令列選項,以指定工具鏈檔案。cmake(1)
-E capabilities
輸出,對於某些產生器,現在可能包含supportedPlatforms
欄位,列出在CMAKE_GENERATOR_PLATFORM
中已知的支援平台。列印到終端機的訊息現在可能會根據訊息類型著色。
編譯器¶
現在支援 Fujitsu 編譯器,在傳統 (
Trad
) 模式下使用編譯器 IDFujitsu
,在Clang
模式下使用編譯器 IDFujitsuClang
。
平台¶
CMake 現在支援 MSYS 執行階段環境,非常類似 CYGWIN。
基於檔案的 API¶
cmake-file-api(7)
"codemodel" 版本 2version
欄位已更新至 2.3。cmake-file-api(7)
"codemodel" 版本 2 新增了一個包含目錄層級資訊的新 "directory" 物件。這包括由install()
命令產生的安裝程式清單。
命令¶
add_custom_command()
命令DEPFILE
選項現在可以使用
產生器 表達式
,現在受 VS 2012 及更高版本的 Visual Studio 產生器 支援,並且
現在受
Xcode
產生器支援。
add_custom_command(TARGET)
命令(用於 建置事件)新增了對解析依賴於目標的產生器表達式的支援。build_command()
命令新增了PARALLEL_LEVEL
選項。新增了
file(COPY_FILE)
命令以複製單個檔案。file(GET_RUNTIME_DEPENDENCIES)
命令新增了POST_INCLUDE_FILES
和POST_EXCLUDE_FILES
引數。file(REAL_PATH)
命令新增了EXPAND_TILDE
選項,以將任何開頭的波浪符號替換為使用者主目錄的路徑。file(RENAME)
命令學會了選擇性地在結果變數中捕獲失敗。它還新增了NO_REPLACE
選項,以便在目的地存在時失敗。install()
命令新增了一種新的IMPORTED_RUNTIME_ARTIFACTS
模式,可用於安裝匯入目標的執行階段成品。install()
命令新增了一種新的RUNTIME_DEPENDENCY_SET
模式,可用於使用file(GET_RUNTIME_DEPENDENCIES)
安裝執行階段依賴項。install(TARGETS)
命令新增了RUNTIME_DEPENDENCIES
和RUNTIME_DEPENDENCY_SET
引數,可用於使用file(GET_RUNTIME_DEPENDENCIES)
安裝執行階段依賴項。install(SCRIPT|CODE)
命令支援新的選項ALL_COMPONENTS
,允許對每個組件安裝的每個組件執行相應的程式碼。project()
命令現在設定變數PROJECT_IS_TOP_LEVEL
和<PROJECT-NAME>_IS_TOP_LEVEL
,以指示它是否在頂層CMakeLists.txt
檔案中呼叫。
變數¶
新增了
CMAKE_TOOLCHAIN_FILE
環境變數,以提供CMAKE_TOOLCHAIN_FILE
變數的預設值。
屬性¶
新增了
IMPORTED_TARGETS
目錄屬性,以取得在目前目錄中建立的 匯入目標 清單。新增了
XCODE_EMBED_APP_EXTENSIONS
目標屬性,以告知Xcode
產生器嵌入應用程式擴充功能,例如 iMessage 貼圖包。可以使用XCODE_EMBED_APP_EXTENSIONS_PATH
、XCODE_EMBED_APP_EXTENSIONS_CODE_SIGN_ON_COPY
和XCODE_EMBED_APP_EXTENSIONS_REMOVE_HEADERS_ON_COPY
屬性自訂嵌入的各個方面。
模組¶
FindBLAS
和FindLAPACK
模組學會了支援串列Fujitsu_SSL2
和並行Fujitsu_SSL2BLAMP
程式庫。FindDevIL
模組現在提供匯入目標。FindIconv
模組現在具有版本支援。FindIntl
模組現在具有版本支援。FindMPI
模組學會了在主機和跨編譯模式下支援Fujitsu
和FujitsuClang
。新增了
FindMsys
模組,以尋找 MSYS 安裝。與FindCygwin
類似,其他一些尋找模組會自動使用它來在 Windows 上定位 UNIX 風格的工具。FindOpenMP
模組學會了支援Fujitsu
和FujitsuClang
。FindVulkan
模組新增了匯入目標Vulkan::Headers
和Vulkan::glslangValidator
。UseJava
模組命令add_jar
新增了RESOURCES
選項,以允許使用非選用命名空間顯式命名資源。
產生器表達式¶
新增了新的
TARGET_RUNTIME_DLLS
產生器表達式。
CTest¶
ctest(1)
學會了識別在執行階段附加到測試的檔案。以前只能在設定時透過使用ATTACHED_FILES
或ATTACHED_FILES_ON_FAIL
測試屬性將檔案附加到測試。請參閱 額外測試量測 以取得更多資訊。ctest(1)
新增了--output-junit
選項,以將測試結果寫入 JUnit XML 檔案。ctest_build()
命令新增了PARALLEL_LEVEL
選項。
CPack¶
CPack DragNDrop 產生器
新增了選項CPACK_DMG_FILESYSTEM
以控制.dmg
檔案系統。CPack IFW 產生器
現在支援在給予cpack_ifw_configure_component()
或cpack_ifw_configure_component_group()
的名稱中包含連字號,作為DEPENDS
或DEPENDENCIES
引數。這需要 QtIFW 3.1 或更高版本。CPack NSIS 產生器
新增了CPACK_NSIS_EXECUTABLE
變數,以指定要使用的makensis
可執行檔,而不是預設的可執行檔。新增了
CPACK_CUSTOM_INSTALL_VARIABLES
變數,以在 CPack 進行的cmake_install.cmake
腳本調用中設定變數。
已棄用和移除的功能¶
完全移除了未記錄的
CMAKE_SYSTEM_NAME
版本剝離行為。如果它是由-D
旗標或工具鏈 檔案
設定的,則即使它仍然包含版本號碼,也會保持不變。類似的CMAKE_HOST_SYSTEM_NAME
版本剝離行為(也未記錄)已提前移動到project()
或enable_language()
呼叫之前。不再根據
CMAKE_SYSTEM_PROCESSOR
變數或未記錄的CMAKE_SYSTEM_ARCH
變數自動新增ARMClang
cpu/arch 編譯和連結旗標。它們必須明確指定。請參閱原則CMP0123
。
其他變更¶
find_file()
、find_path()
、find_program()
和find_library()
命令以相同的方式處理快取變數,無論它們是如何定義的。請參閱原則CMP0125
以取得詳細資訊。find_file()
、find_path()
、find_program()
和find_library()
命令新增了NO_CACHE
選項,可將尋找結果儲存在一般變數中。foreach()
命令現在會在迴圈範圍中隔離迴圈變數。詳情請參閱政策CMP0124
。list()
命令的GET
、INSERT
、SUBLIST
和REMOVE_AT
子命令現在在根據政策CMP0121
的設定,以無效(即非整數)值作為其任何索引引數時會產生錯誤。set(CACHE)
命令不再移除同名的普通變數(如果有的話)。詳情請參閱政策CMP0126
。透過
TARGET_OBJECTS
產生器表達式引用物件庫的target_link_libraries()
呼叫,現在會將物件檔案放在連結行上所有程式庫之前,而無論其指定的順序為何。詳情請參閱 透過 $<TARGET_OBJECTS> 連結物件庫 的文件。Ninja 產生器 現在使用絕對路徑將原始檔和包含目錄傳遞給編譯器。這使得診斷訊息和偵錯符號更加一致,並與 Makefile 產生器 相符。
NMake Makefiles
產生器現在在使用 VS 9 或更高版本的nmake
時,將產生的 makefile 編碼為帶有 BOM 的 UTF-8。適用於 VS 2010 及更高版本的 Visual Studio 產生器 現在將每個來源的預處理器定義放在目標範圍的預處理器定義之後。這使得 VS 與 Ninja 產生器 和 Makefile 產生器 一致。
cmake.org 上提供的預編譯二進制檔案現在支援
liblzma
多執行緒。請參閱CPACK_THREADS
和CPACK_ARCHIVE_THREADS
變數。
更新¶
自 CMake 3.21.0 以來進行的變更包括以下內容。
3.21.1¶
Visual Studio 17 2022
產生器現在基於 "Visual Studio 2022 Preview 2"。之前它基於 "Preview 1.1"。
3.21.2¶
啟用
CUDA_SEPARABLE_COMPILATION
的CUDA
目標現在可以在非根目錄中正確產生。Visual Studio 17 2022
產生器現在基於 "Visual Studio 2022 Preview 3.1"。之前它基於 "Preview 2"。
3.21.3¶
Visual Studio 17 2022
產生器現在基於 "Visual Studio 2022 Preview 4"。之前它基於 "Preview 3.1"。AMD ROCm Platform
hipcc
編譯器在 CMake 3.21.0 到 3.21.2 中被識別為具有 idROCMClang
的不同編譯器。這已被移除,因為它導致了回歸。相反地hipcc
可能不再用作HIP
編譯器,因為它干擾了 CMake 需要傳遞給 Clang 的旗標。請直接使用 Clang。hipcc
可以再次用作CXX
編譯器,並且被視為它在底層選擇的任何編譯器,就像 CMake 3.20 及更早版本所做的那樣。
3.21.4¶
Visual Studio 17 2022
產生器現在基於 "Visual Studio 2022" 發行候選版本。之前它基於預覽版本。
3.21.5, 3.21.6, 3.21.7¶
這些版本未對已記錄的功能或介面進行任何變更。進行了一些實作更新以支援生態系統變更和/或修復回歸。