CMake 3.20 發行說明

自 CMake 3.19 以來進行的變更包括以下內容。

新功能

預設配置

產生器

  • Makefile 產生器,對於某些工具鏈,現在會在編譯原始程式碼檔案時使用編譯器來提取隱含的依賴關係。

程式語言

  • 現在可以透過 CXX_STANDARDCUDA_STANDARDOBJCXX_STANDARD 目標屬性,或透過 編譯 功能 功能的 cxx_std_23 元功能來指定 C++23 編譯器模式。

  • nvcc 是符號連結時,例如由於 ccachecolornvcc 包裝腳本時,現在 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 編譯器(iccicpcifort)繼續使用編譯器 ID Intel 支援。

  • 新增了對 IAR STM8 編譯器的支援。

平台

  • CMake 對 為 Android 進行交叉編譯 的支援現在已與 Android NDK 的工具鏈檔案合併。它們現在具有類似的行為,儘管某些變數名稱不同。面向使用者的變更包括

基於檔案的 API

  • cmake-file-api(7) 獲得了一個新的「toolchains」物件種類,用於描述每個已啟用語言使用的編譯器。

命令

  • add_custom_command()add_custom_target() 現在在其 OUTPUTBYPRODUCTS 選項中支援 產生器 運算式

    它們的 COMMANDWORKING_DIRECTORYDEPENDS 選項新增了對新產生器運算式 $<COMMAND_CONFIG:...>$<OUTPUT_CONFIG:...> 的支援,這些運算式在使用 Ninja Multi-Config 產生器時控制跨組態處理。

  • add_custom_command() 命令在 Makefile 產生器 上新增了 DEPFILE 支援。

  • 當使用可能的多架構配置時,add_library() 命令先前禁止匯入的物件程式庫。這主要影響了 Xcode 產生器,例如,當目標為 iOS 或其他裝置平台之一時。此限制現已移除。

  • 新增了 cmake_path() 命令,用於操作檔案系統路徑。

  • configure_file() 命令新增了 USE_SOURCE_PERMISSIONSFILE_PERMISSIONS 選項,以支援複製原始程式碼檔案的權限,以及使用指定的權限。

  • file(GENERATE) 命令新增了 NEWLINE_STYLE 選項,用於指定如何處理產生的檔案的換行符號。

  • file(GENERATE) 命令新增了 NO_SOURCE_PERMISSIONSUSE_SOURCE_PERMISSIONSFILE_PERMISSIONS 選項,用於控制產生的檔案的權限。

  • install(FILES) 命令的 RENAME 選項學習支援 產生器 運算式

  • target_include_directories() 命令新增了一個選項 AFTER

  • target_sources() 命令現在支援由 add_custom_target() 命令建立的目標。

  • try_run() 命令新增了 WORKING_DIRECTORY 選項,用於設定執行編譯後的檢查執行檔的工作目錄。

變數

  • 新增了 CMAKE_<LANG>_BYTE_ORDER 變數,以提供從工具鏈偵測到的目標架構位元組順序。

  • CMAKE_RUNTIME_OUTPUT_DIRECTORYCMAKE_LIBRARY_OUTPUT_DIRECTORYCMAKE_ARCHIVE_OUTPUT_DIRECTORY 變數現在支援依賴於目標的產生器運算式。

屬性

  • <LANG>_CLANG_TIDY 目標屬性和相關的 CMAKE_<LANG>_CLANG_TIDY 變數學會支援 OBJCOBJCXX 語言。

  • 新增了 EXPORT_COMPILE_COMMANDS 目標屬性和相關的 CMAKE_EXPORT_COMPILE_COMMANDS 變數,以允許針對每個目標配置匯出編譯命令。

  • 產生的原始碼可以跨目錄使用,而無需手動標記。此外,GENERATED 原始碼檔案屬性一旦啟用就不能關閉,也不能設定為布林值以外的值。請參閱策略 CMP0118

  • 新增了 UNITY_BUILD_UNIQUE_ID 目標屬性,以支援產生在單元建置中每個原始碼檔案唯一的識別符號。這有助於解決匿名命名空間的重複符號問題。

  • WIN32_EXECUTABLE 目標屬性現在可以在 Windows 上與 Clang 搭配使用。

  • 新增了 XCODE_EMBED_FRAMEWORKS 目標屬性,以告知 Xcode 產生器嵌入框架。可以使用 XCODE_EMBED_FRAMEWORKS_PATHXCODE_EMBED_FRAMEWORKS_CODE_SIGN_ON_COPYXCODE_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 是符號連結時,例如由於 ccachecolornvcc 包裝腳本,FindCUDAToolkit 模組增加了對尋找 CUDA 工具組的支援。

  • FindGDAL 模組已得到改進,可以記錄其快取變數並將其標記為進階。有一個新的 FindGDAL_SKIP_GDAL_CONFIG 變數,可用於跳過基於 gdal-config 的搜尋。使用者也可以設定 GDAL_ADDITIONAL_LIBRARY_VERSIONS 以將其他版本加入程式庫名稱搜尋策略。

  • FindIntl 模組現在提供一個匯入的目標。

  • FindOpenSSL 模組學會支援版本範圍。

  • FindPython3FindPython2FindPython 模組新增了選項,用於控制如何搜尋無版本解釋器名稱。

  • UseJava 模組的 add_jar() 命令的 GENERATE_NATIVE_HEADERS 功能新增了匯出產生目標的選項。

  • 對於 MakefileNinja 產生器,UseSWIG 模組增加了使用 swig 工具產生隱式相依性的能力。

自動產生

  • AUTOMOC 功能現在可以使用每個組態的原始碼。

CTest

  • ctest(1) 新增了 --test-dir 選項,用於指定搜尋測試的目錄。

CPack

已棄用和移除的功能

其他變更

  • 當執行 cmake(1)產生專案建置系統 時,開頭為連字號 (-) 的未知命令列引數現在會遭到拒絕並顯示錯誤。先前它們會被靜默忽略。

  • 原始碼檔案的副檔名現在必須明確指定。詳情請參閱政策 CMP0115

  • LANGUAGE 原始碼檔案屬性現在會強制以指定的語言進行編譯。請參閱政策 CMP0119

  • 在 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,其中 $archx86_64aarch64

  • cmake.org 上提供的預編譯 Windows 二進制檔案,其命名模式已變更為 cmake-$ver-windows-$arch,其中 $archx86_64i386

更新

自 CMake 3.20.0 以來所做的變更包括以下內容。

3.20.1

  • CMake 3.20.0 中的 FindIntl 模組新增了 Intl_HAVE_GETTEXT_BUILTINIntl_HAVE_DCGETTEXT_BUILTINIntl_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

這些版本未對已記錄的功能或介面進行任何變更。為支援生態系統變更和/或修復回歸問題,進行了一些實作更新。