CMake 3.18 發行說明

自 CMake 3.17 以來的變更包括以下內容。

新功能

程式語言

  • 現在可以使用 Clang 在非 Windows 平台上編譯 CUDA 語言。目前任何平台都不支援可分離編譯。

命令列

  • cmake(1) 透過參數 --profiling-output--profiling-format 獲得了對 CMake 指令碼效能分析的支援。

  • cmake(1) 獲得了 cat 命令列選項,可用於串連檔案並將其列印到標準輸出。

指令

  • add_library()add_executable() 指令學會了建立參照非 GLOBAL 匯入目標別名目標

  • 新增了 cmake_language() 指令,用於對指令碼或內建指令進行元操作,首先是 CALL 其他指令的模式,以及 EVAL CODE 來就地評估 CMake 指令碼。

  • execute_process() 指令新增了 ECHO_OUTPUT_VARIABLEECHO_ERROR_VARIABLE 選項。

  • 如果多次使用相同的 FILE 而沒有 APPENDexport() 指令現在會引發錯誤。請參閱政策 CMP0103

  • file() 指令新增了 ARCHIVE_CREATEARCHIVE_EXTRACT 子指令,將 cmake(1) -E tar 功能公開給 CMake 指令碼程式碼。

  • 建立 file(CONFIGURE) 子指令,以便複製 configure_file() 的功能,而無需使用磁碟上預先存在的檔案作為輸入。內容改為以字串形式傳遞。

  • file(UPLOAD) 指令新增了 TLS_VERIFYTLS_CAINFO 選項來控制伺服器憑證驗證。

  • find_program()find_library()find_path()find_file() 指令新增了新的 REQUIRED 選項,如果找不到任何內容,將會停止處理並顯示錯誤訊息。

  • 帶有 SOURCE 範圍的 get_property() 指令新增了 DIRECTORYTARGET_DIRECTORY 選項,以從提供的目錄範圍取得屬性。

  • get_source_file_property() 指令新增了 DIRECTORYTARGET_DIRECTORY 選項,以從提供的目錄範圍取得屬性。

  • list() 操作 SORT 新增了 NATURAL 排序選項,以使用自然順序進行排序(請參閱 strverscmp(3) 手冊)。

  • 帶有 SOURCE 範圍的 set_property() 指令新增了 DIRECTORYTARGET_DIRECTORY 選項,以在提供的目錄範圍中設定屬性。

  • set_source_files_properties() 指令新增了 DIRECTORYTARGET_DIRECTORY 選項,以在提供的目錄範圍中設定屬性。

  • string() 指令學習了新的 HEX 子指令,該指令會將字串轉換為十六進位表示法。

變數

屬性

模組

  • 新增 CheckLinkerFlag 模組,以提供檢查連結器旗標有效性的功能。

  • ExternalProject 模組的 ExternalProject_Add() 命令新增了 GIT_REMOTE_UPDATE_STRATEGY 關鍵字。這可用於指定在 git 更新期間,應如何處理失敗的 rebase 操作。CMAKE_EP_GIT_REMOTE_UPDATE_STRATEGY 變數也被新增為全域預設值,並由 ExternalProjectFetchContent 模組採用。

  • FetchContent 模組的 FetchContent_Declare() 命令現在支援 SOURCE_SUBDIR 選項。它可用於指示 FetchContent_MakeAvailable() 在不同的位置尋找 CMakeLists.txt 檔案。

  • FindBLAS 模組現在提供已匯入的目標。

  • FindCUDAToolkit 模組

    • 獲得了變數 CUDAToolkit_LIBRARY_ROOT,這是包含 nvvm 目錄和 version.txt 的目錄。

    • 使用在 CUDA 編譯器偵測期間找到的工具組和程式庫根目錄。

  • FindLAPACK 模組現在提供已匯入的目標。

  • FindPython3FindPython2FindPython 模組

    • 增加了在 cmake-gui(1)ccmake(1) 中為互動式編輯建立每個成品快取變數的可能性。

    • Development 元件下新增了子元件 Development.ModuleDevelopment.Embed

    • 新增了指定要尋找的 Python 實作的功能,包括 IronPythonPyPy

  • 為了與其他尋找模組保持一致,FindRuby 模組的輸入和輸出變數全部從 RUBY_ 重新命名為 Ruby_。如果提供舊格式的輸入變數,將會被採用,並且始終會提供舊格式的輸出變數。

  • FindSWIG 模組現在接受目標語言作為 COMPONENTSOPTIONAL_COMPONENTS 引數,傳遞給 find_package

  • GoogleTest 模組的 gtest_discover_tests() 命令

    • 新增了 DISCOVERY_MODE 選項,以控制執行測試探索步驟的時間。它提供了一個新的 PRE_TEST 設定,在測試時而不是建置時執行探索。可以使用新的 CMAKE_GTEST_DISCOVER_TESTS_DISCOVERY_MODE 變數來全域變更預設值。

    • 新增了一個新的可選參數 XML_OUTPUT_DIR。設定後,JUnit XML 測試結果會儲存在該目錄中。

  • FindLibXslt 模組現在提供已匯入的目標。

  • 如果 SWIG_EXECUTABLESWIG-FortranUseSWIG 模組現在支援 Fortran 作為目標語言。

產生器表達式

CTest

CPack

其他

已棄用和移除的功能

  • 通過 CMP0106Documentation 模組已被棄用。此模組本質上是 VTK 程式碼,CMake 不應再發佈。

  • 為原則 CMP0070 和原則 CMP0071 新增了明確的棄用診斷(CMP0069 及以下版本已棄用)。cmake-policies(7) 手冊解釋了所有原則的舊行為已棄用,並且專案應移植到新行為。

其他變更

  • 在 Windows 上,當未明確指定編譯器時,NinjaNinja Multi-Config 產生器現在會選擇在 PATH 環境變數所列目錄中找到的第一個編譯器(不論名稱)。

  • LINK_OPTIONSINTERFACE_LINK_OPTIONS 目標屬性現在用於裝置連結步驟。請參閱原則 CMP0105

  • 建立覆蓋現有目標的 ALIAS 目標現在會引發錯誤。請參閱原則 CMP0107

  • 通過別名將目標連結到自身現在會引發錯誤。請參閱原則 CMP0108

  • 如果指定了 HANDLE_COMPONENTSFindPackageHandleStandardArgs 模組選項 REQUIRED_VARS 現在為選用。

  • source_group() 命令現在也將正斜線視為子群組分隔符號,而不僅是反斜線。

  • ctest(1) 現在會記錄它為每個測試設定的環境變數,這些變數可能是由於 ENVIRONMENT 屬性或 資源分配 功能所設定,並將此記錄提交至 CDash。它不會記錄在 CTest 之外設定的環境變數。

  • 當從原始碼建置 CMake 本身且不使用系統提供的 libcurl 時,現在為透過 http(s) 支援網路通訊的指令啟用 HTTP/2 支援,例如 file(DOWNLOAD)file(UPLOAD)ctest_submit()cmake.org 上提供的預編譯二進位檔現在支援 HTTP/2。

  • cmake-file-api(7) "codemodel" 版本 2 的 version 欄位已更新為 2.1。

  • cmake-file-api(7) "codemodel" 版本 2 的 "target" 物件在 compileGroups 物件中新增了 precompileHeaders 欄位。

更新

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

3.18.1

  • CMAKE_OSX_ARCHITECTURES 未定義時,Xcode 產生器現在會選取 $(NATIVE_ARCH_ACTUAL) 作為預設架構(Xcode 的 ARCHS 設定)。Xcode 12 需要此設定才能選取主機的架構,而舊版的 Xcode 預設會執行此操作。

  • 在 CMake 3.18.0 中,add_test() 指令學會了支援測試名稱中的特殊字元。這被意外地遺漏在發行說明中。不幸的是,此修正會破壞使用手動引號或跳脫字元來規避先前限制的現有專案。此修正已在 3.18.1 中還原,但可能會在未來版本的 CMake 中重新引入,並採用相容性政策。

3.18.2

  • CMAKE_AUTOMOC_PATH_PREFIX 的預設值已變更為 OFF,因為此功能可能會破壞在不同包含目錄中具有相同名稱標頭檔的現有專案。這恢復了與 CMake 3.15 和更早版本的行為的相容性。在 3.16.9 和 3.17.5 中,預設值也變更為 OFF

  • 如上所述,編譯功能 功能已針對 MSVC 19.27 進行更新 (c_restrict)。

3.18.3

  • 如上所述,編譯功能 功能已針對 MSVC 19.28 進行更新 (c_static_assert)。