CMake 3.20 發行說明¶
自 CMake 3.19 以來進行的變更包括以下內容。
新功能¶
預設配置¶
cmake-presets(7)
增加了對建置和測試預設配置的支援。
產生器¶
Makefile 產生器,對於某些工具鏈,現在會在編譯原始程式碼檔案時使用編譯器來提取隱含的依賴關係。
程式語言¶
現在可以透過
CXX_STANDARD
、CUDA_STANDARD
或OBJCXX_STANDARD
目標屬性,或透過編譯 功能
功能的cxx_std_23
元功能來指定 C++23 編譯器模式。當
nvcc
是符號連結時,例如由於ccache
或colornvcc
包裝腳本時,現在CUDA
語言支援可以正常運作。新增了
CUDAARCHS
環境變數,用於初始化CMAKE_CUDA_ARCHITECTURES
。在編譯器預設值不適用於機器 GPU 的情況下非常有用。
編譯器¶
現在支援 NVIDIA HPC SDK 編譯器,編譯器 ID 為
NVHPC
。現在支援 Intel oneAPI NextGen LLVM 編譯器,編譯器 ID 為
IntelLLVM
。在 Linux 上的
icx
/icpx
C/C++ 編譯器,以及 Windows 上的icx
C/C++ 編譯器,自 oneAPI 2021.1 起已完全支援。自 oneAPI 2021.1 起支援 Linux 上的
ifx
Fortran 編譯器。Windows 上的
ifx
Fortran 編譯器尚未支援。
Intel oneAPI Classic 編譯器(
icc
、icpc
和ifort
)繼續使用編譯器 IDIntel
支援。新增了對 IAR STM8 編譯器的支援。
平台¶
CMake 對 為 Android 進行交叉編譯 的支援現在已與 Android NDK 的工具鏈檔案合併。它們現在具有類似的行為,儘管某些變數名稱不同。面向使用者的變更包括
find_*
函式預設會搜尋 NDK ABI / API 特定路徑。Android 的預設
CMAKE_BUILD_TYPE
現在為RelWithDebInfo
。新增了
CMAKE_ANDROID_NDK_VERSION
變數,以報告 NDK 的版本。
基於檔案的 API¶
cmake-file-api(7)
獲得了一個新的「toolchains」物件種類,用於描述每個已啟用語言使用的編譯器。
命令¶
add_custom_command()
和add_custom_target()
現在在其OUTPUT
和BYPRODUCTS
選項中支援產生器 運算式
。它們的
COMMAND
、WORKING_DIRECTORY
和DEPENDS
選項新增了對新產生器運算式$<COMMAND_CONFIG:...>
和$<OUTPUT_CONFIG:...>
的支援,這些運算式在使用Ninja Multi-Config
產生器時控制跨組態處理。add_custom_command()
命令在 Makefile 產生器 上新增了DEPFILE
支援。當使用可能的多架構配置時,
add_library()
命令先前禁止匯入的物件程式庫。這主要影響了Xcode
產生器,例如,當目標為 iOS 或其他裝置平台之一時。此限制現已移除。新增了
cmake_path()
命令,用於操作檔案系統路徑。configure_file()
命令新增了USE_SOURCE_PERMISSIONS
和FILE_PERMISSIONS
選項,以支援複製原始程式碼檔案的權限,以及使用指定的權限。file(GENERATE)
命令新增了NEWLINE_STYLE
選項,用於指定如何處理產生的檔案的換行符號。file(GENERATE)
命令新增了NO_SOURCE_PERMISSIONS
、USE_SOURCE_PERMISSIONS
和FILE_PERMISSIONS
選項,用於控制產生的檔案的權限。install(FILES)
命令的RENAME
選項學習支援產生器 運算式
。target_include_directories()
命令新增了一個選項AFTER
。target_sources()
命令現在支援由add_custom_target()
命令建立的目標。try_run()
命令新增了WORKING_DIRECTORY
選項,用於設定執行編譯後的檢查執行檔的工作目錄。
變數¶
新增了
CMAKE_<LANG>_BYTE_ORDER
變數,以提供從工具鏈偵測到的目標架構位元組順序。CMAKE_RUNTIME_OUTPUT_DIRECTORY
、CMAKE_LIBRARY_OUTPUT_DIRECTORY
和CMAKE_ARCHIVE_OUTPUT_DIRECTORY
變數現在支援依賴於目標的產生器運算式。
屬性¶
<LANG>_CLANG_TIDY
目標屬性和相關的CMAKE_<LANG>_CLANG_TIDY
變數學會支援OBJC
和OBJCXX
語言。新增了
EXPORT_COMPILE_COMMANDS
目標屬性和相關的CMAKE_EXPORT_COMPILE_COMMANDS
變數,以允許針對每個目標配置匯出編譯命令。產生的原始碼可以跨目錄使用,而無需手動標記。此外,
GENERATED
原始碼檔案屬性一旦啟用就不能關閉,也不能設定為布林值以外的值。請參閱策略CMP0118
。新增了
UNITY_BUILD_UNIQUE_ID
目標屬性,以支援產生在單元建置中每個原始碼檔案唯一的識別符號。這有助於解決匿名命名空間的重複符號問題。WIN32_EXECUTABLE
目標屬性現在可以在 Windows 上與 Clang 搭配使用。新增了
XCODE_EMBED_FRAMEWORKS
目標屬性,以告知Xcode
產生器嵌入框架。可以使用XCODE_EMBED_FRAMEWORKS_PATH
、XCODE_EMBED_FRAMEWORKS_CODE_SIGN_ON_COPY
和XCODE_EMBED_FRAMEWORKS_REMOVE_HEADERS_ON_COPY
目標屬性來自訂嵌入的各個方面。
模組¶
ExternalData
模組的ExternalData_Add_Target()
函式新增了SHOW_PROGRESS <bool>
選項,用於控制在建置期間是否顯示進度輸出。ExternalProject
模組的ExternalProject_Add()
函式新增了CONFIGURE_HANDLED_BY_BUILD
選項。當外部專案相依性重新建置時,可以使用此選項使後續的組態步驟由建置步驟觸發,而不是在這種情況下總是重新執行組態步驟。FindBoost
模組新增了Boost_NO_WARN_NEW_VERSIONS
選項,以靜音關於新 Boost 版本未知相依性的警告。當
nvcc
是符號連結時,例如由於ccache
或colornvcc
包裝腳本,FindCUDAToolkit
模組增加了對尋找 CUDA 工具組的支援。FindGDAL
模組已得到改進,可以記錄其快取變數並將其標記為進階。有一個新的FindGDAL_SKIP_GDAL_CONFIG
變數,可用於跳過基於gdal-config
的搜尋。使用者也可以設定GDAL_ADDITIONAL_LIBRARY_VERSIONS
以將其他版本加入程式庫名稱搜尋策略。FindIntl
模組現在提供一個匯入的目標。FindOpenSSL
模組學會支援版本範圍。FindPython3
、FindPython2
和FindPython
模組新增了選項,用於控制如何搜尋無版本解釋器名稱。UseJava
模組的add_jar()
命令的GENERATE_NATIVE_HEADERS
功能新增了匯出產生目標的選項。
自動產生¶
AUTOMOC 功能現在可以使用每個組態的原始碼。
CTest¶
ctest(1)
新增了--test-dir
選項,用於指定搜尋測試的目錄。
CPack¶
CPack
新增了CPACK_THREADS
變數,用於控制平行化操作(例如壓縮安裝程式套件)時使用的執行緒數量。CPack DEB 產生器
新增了CPACK_DEBIAN_PACKAGE_SHLIBDEPS_PRIVATE_DIRS
變數,用於在使用dpkg-shlibdeps
時,指定額外的搜尋目錄來解析私有程式庫的相依性。CPack IFW 產生器
新增了CPACK_IFW_PACKAGE_WIZARD_SHOW_PAGE_LIST
變數,用於控制精靈左側顯示安裝程式頁面的小工具的能見度。此功能僅在 QtIFW 4.0 及更新版本中可用。CPack NSIS 產生器
新增了CPACK_NSIS_BRANDING_TEXT
和CPACK_NSIS_BRANDING_TEXT_TRIM_POSITION
變數,用於變更安裝視窗底部的文字及其裁剪位置。CPack NSIS 產生器
現在能正確處理 Unicode 字元。如果想要使用包含 UTF-8 字元的CPACK_RESOURCE_FILE_LICENSE
,則需要使用 UTF-8 BOM 編碼。CPack NuGet 產生器
新增了選項CPACK_NUGET_PACKAGE_ICON
和CPACK_NUGET_<compName>_PACKAGE_ICON
允許使用本機檔案指定套件圖示。CPACK_NUGET_PACKAGE_LICENSE_EXPRESSION
和CPACK_NUGET_<compName>_PACKAGE_LICENSE_EXPRESSION
增加了對指定 軟體套件資料交換 (SPDX) 認可的授權條款的支援。CPACK_NUGET_PACKAGE_LICENSE_FILE_NAME
和CPACK_NUGET_<compName>_PACKAGE_LICENSE_FILE_NAME
允許使用本機檔案指定授權條款。CPACK_NUGET_PACKAGE_LANGUAGE
和CPACK_NUGET_<compName>_PACKAGE_LANGUAGE
允許指定套件的地區設定,例如en_CA
。
已棄用和移除的功能¶
已移除
cmake-server(7)
模式。用戶端應改用cmake-file-api(7)
。已透過政策
CMP0120
棄用WriteCompilerDetectionHeader
模組。專案應移植為不再使用它。已棄用
TestBigEndian
模組,改用CMAKE_<LANG>_BYTE_ORDER
變數。已棄用
AddFileDependencies
模組。請將專案移植為直接使用set_property()
。CPack NuGet 產生器
棄用了一些變數,以反映 NuGet 規格的變更。已棄用
CPACK_NUGET_PACKAGE_ICONURL
和CPACK_NUGET_<compName>_PACKAGE_ICONURL
,請改用對本機圖示檔案的參照。已棄用
CPACK_NUGET_PACKAGE_LICENSEURL
和CPACK_NUGET_<compName>_PACKAGE_LICENSEURL
,請改用對專案授權檔案或 SPDX 授權表達式的參照。
其他變更¶
當執行
cmake(1)
來 產生專案建置系統 時,開頭為連字號 (-
) 的未知命令列引數現在會遭到拒絕並顯示錯誤。先前它們會被靜默忽略。原始碼檔案的副檔名現在必須明確指定。詳情請參閱政策
CMP0115
。在 AIX 上,安裝 XCOFF 可執行檔和共享程式庫不再需要重新連結,即可將執行階段搜尋路徑從建置樹狀結構 RPATH 變更為安裝樹狀結構 RPATH。CMake 現在會在安裝期間直接編輯 XCOFF 二進位檔,這就像在 ELF 平台上長期所做的一樣。
對於類似 MSVC 的編譯器,
CMAKE_CXX_FLAGS
的值預設不再包含用於執行階段類型資訊的/GR
旗標。請參閱政策CMP0117
。Ninja 產生器現在會轉換
add_custom_command()
產生的DEPFILE
。詳情請參閱政策CMP0116
。cmake.org 上提供的預先編譯 Linux 二進位檔已將其命名模式變更為
cmake-$ver-linux-$arch
,其中$arch
為x86_64
或aarch64
。在 cmake.org 上提供的預編譯 Windows 二進制檔案,其命名模式已變更為
cmake-$ver-windows-$arch
,其中$arch
為x86_64
或i386
。
更新¶
自 CMake 3.20.0 以來所做的變更包括以下內容。
3.20.1¶
CMake 3.20.0 中的
FindIntl
模組新增了Intl_HAVE_GETTEXT_BUILTIN
、Intl_HAVE_DCGETTEXT_BUILTIN
和Intl_IS_BUILTIN
的檢查,但它們的實作不正確。這些已移除,並替換為單一的Intl_IS_BUILT_IN
檢查,其名稱與FindIconv
模組一致。現在
-rpath
連結器標誌被指定為在所有 Apple 平台上皆支援,而不僅限於 macOS。用於 iOS、tvOS 和 watchOS 的install_name_dir
現在應預設為@rpath
,而不是使用完整的絕對路徑,並在將程式庫或框架嵌入應用程式包中時於執行階段失敗(請參閱XCODE_EMBED_<type>
)。
3.20.2¶
Intel Classic 2021 編譯器版本號現在可以正確偵測為具有主要版本 2021。CMake 3.20.1 及更早版本並未意識到 Intel 從 2021 版本開始對識別巨集版本方案所做的變更,並將版本偵測為 20.2。
Intel oneAPI Fortran 編譯器現在被識別為
IntelLLVM
。oneAPI 2021.1 Fortran 編譯器缺少識別巨集,因此 CMake 3.20.1 及更早版本將其識別為Intel
。CMake 現在有一個特殊情況可以將 oneAPI 2021.1 Fortran 識別為IntelLLVM
。oneAPI 2021.2 Fortran 編譯器定義了正確的識別巨集,因此所有 CMake 3.20 版本都將其識別為IntelLLVM
。
3.20.3、3.20.4、3.20.5、3.20.6¶
這些版本未對已記錄的功能或介面進行任何變更。為支援生態系統變更和/或修復回歸問題,進行了一些實作更新。