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 選項。

  • export() 命令現在在多次使用相同的 FILE 而沒有 APPEND 的情況下會引發錯誤。請參閱政策 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 選項,如果找不到任何內容,將停止處理並顯示錯誤訊息。

  • get_property() 命令與 SOURCE 範圍一起獲得了 DIRECTORYTARGET_DIRECTORY 選項,以從提供的目錄範圍取得屬性。

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

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

  • set_property() 命令與 SOURCE 範圍一起獲得了 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 模組現在接受目標語言作為 find_packageCOMPONENTSOPTIONAL_COMPONENTS 引數。

  • GoogleTest 模組 gtest_discover_tests() 命令

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

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

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

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

產生器運算式

CTest

CPack

其他

已棄用和移除的功能

  • Documentation 模組已透過 CMP0106 政策棄用。此模組本質上是 VTK 程式碼,CMake 不應再運送。

  • 為政策 CMP0070 和政策 CMP0071CMP0069 及更早版本已棄用)新增了明確的棄用診斷。cmake-policies(7) 手冊解釋說,所有政策的 OLD 行為都已棄用,專案應移植到 NEW 行為。

其他變更

  • 在 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)。