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 起已完全支援。

    • Linux 上的 ifx Fortran 編譯器,自 oneAPI 2021.1 起已支援。

    • Windows 上的 ifx Fortran 編譯器尚不支援。

    Intel oneAPI Classic 編譯器 (iccicpcifort) 繼續透過編譯器 ID Intel 支援。

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

平台

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

基於檔案的 API

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

指令

變數

屬性

模組

  • ExternalData 模組 ExternalData_Add_Target() 函數獲得了一個 SHOW_PROGRESS <bool> 選項,用於控制是否在建置期間顯示進度輸出。

  • ExternalProject 模組 ExternalProject_Add() 函數獲得了一個 CONFIGURE_HANDLED_BY_BUILD 選項。當外部專案依賴項重建時,可以使用它來使後續執行配置步驟由建置步驟觸發,而不是在這種情況下總是重新執行配置步驟。

  • FindBoost 模組獲得了一個 Boost_NO_WARN_NEW_VERSIONS 選項,以消除有關新 Boost 版本未知依賴項的警告。

  • FindCUDAToolkit 模組增加了對在 nvcc 是符號連結時尋找 CUDA 工具組的支援,例如由於 ccachecolornvcc 包裝腳本。

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

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

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

  • FindPython3FindPython2FindPython 模組獲得了控制如何搜尋未版本化的直譯器名稱的選項。

  • UseJava 模組 add_jar() 指令的 GENERATE_NATIVE_HEADERS 功能獲得了匯出產生目標的選項。

  • UseSWIG 模組獲得了針對 MakefileNinja 產生器使用 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

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