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 起已完全支援。Linux 上的
ifx
Fortran 編譯器,自 oneAPI 2021.1 起已支援。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 多配置
產生器時控制跨配置處理。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
目標屬性,以支援產生在 Unity 建置中每個來源檔案唯一的識別符。它可以幫助解決匿名命名空間的重複符號問題。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 版本未知依賴項的警告。FindCUDAToolkit
模組增加了對在nvcc
是符號連結時尋找 CUDA 工具組的支援,例如由於ccache
或colornvcc
包裝腳本。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¶
這些版本未對已記錄的功能或介面進行任何變更。進行了一些實作更新,以支援生態系統變更和/或修復回歸錯誤。