CMake 3.15 發行說明

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

新功能

產生器

語言

  • 已在 Ninja 產生器中新增對 Swift 語言的初步支援

    Swift 支援是實驗性的,不被認為是穩定的,並且在 CMake 的未來版本中可能會變更。

編譯器

  • 現在支援 Windows 上以 MSVC ABI 為目標但具有類似 GNU 命令列的 Clang 編譯器變體。

  • 新增了對基於 Clang 的 ARM 編譯器的支援,編譯器 ID 為 ARMClang

  • 新增了對 IAR 編譯器架構 Renesas RX、RL78、RH850 和 Texas Instruments MSP430 的支援。

  • 新增了對為 Linux 建置的 IAR 編譯器 (IAR BuildLx) 的支援。

命令列

  • 新增了 CMAKE_GENERATOR 環境變數,用於在未帶 -G 選項執行 cmake(1) 時,指定要使用的預設產生器。此外,還建立了環境變數 CMAKE_GENERATOR_PLATFORMCMAKE_GENERATOR_TOOLSETCMAKE_GENERATOR_INSTANCE,以設定產生器。

  • cmake(1) --build 工具的 --target 參數增加了對多個目標的支援,例如 cmake --build . --target Library1 Library2。現在它也有簡短形式 -t 別名,例如 cmake --build . -t Library1 Library2

  • cmake(1) 命令新增了一個 --install 選項。這可以在建置專案後使用,以執行安裝,而無需使用產生的建置系統或原生建置工具。

  • cmake(1) 命令學習了一個新的 CLI 選項 --loglevel

  • cmake(1) -E remove_directory 命令列工具學習支援移除多個目錄。

  • cmake(1) -E tar 工具已改進

    • 即使某些檔案不可讀,它現在也會繼續將檔案新增到封存檔中。此行為與經典的 tar 工具更加一致。

    • 它現在會解析所有旗標,如果提供了無效的旗標,則會發出警告。

    • 如果未指定任何動作旗標,它現在會顯示錯誤,並列出可能的動作:t (list)、c (create) 或 x (extract)。

    • 它現在支援僅解壓縮 (-x) 或列出 (-t) 特定檔案或目錄。

    • 它現在支援使用 --zstd 選項進行 Zstandard 壓縮。Zstandard 的設計旨在提供與 DEFLATE (zip) 演算法相當的壓縮率,但速度更快,尤其是在解壓縮方面。

命令

  • add_custom_command()add_custom_target() 命令新增了一個 JOB_POOL 選項,該選項與 Ninja 產生器搭配使用,以在建置語句上設定 pool 變數。

  • add_library() 命令的 ALIAS 選項學習支援 UNKNOWN 類型的匯入程式庫。

  • cmake_parse_arguments() 命令新增了一個額外的 <prefix>_KEYWORDS_MISSING_VALUES 輸出變數,以報告呼叫端在沒有值的情況下提供的關鍵字引數。

  • execute_process() 命令新增了一個 COMMAND_ECHO 選項和支援 CMAKE_EXECUTE_PROCESS_COMMAND_ECHO 變數,以在執行之前啟用命令列字串的回顯。

  • file(INSTALL) 命令學習了一個新的引數 FOLLOW_SYMLINK_CHAIN,可用於遞迴解析和安裝符號連結。

  • list() 學習了新的子命令:PREPENDPOP_FRONTPOP_BACK

  • message() 命令學習了新的類型:NOTICEVERBOSEDEBUGTRACE

  • string() 學習了一個新的子命令 REPEAT

變數

屬性

模組

  • 重新設計了 FindBoost 模組,以便在其「Config」和「Module」模式之間以及與其他 find 模組之間展現更一致的使用者體驗。

    • 現在定義了一個新的匯入目標 Boost::headers (與 Boost::boost 相同)。

    • 新增了新的輸出變數 Boost_VERSION_MACROBoost_VERSION_MAJORBoost_VERSION_MINORBoost_VERSION_PATCHBoost_VERSION_COUNT

    • 在 config 模式下,傳遞給 find_package()QUIET 引數不再被忽略。請注意,Boost 1.70.0 隨附的 CMake 套件會忽略傳遞給 find_package()QUIET 引數。這已在下一個 Boost 版本中修正。

    • 移除了輸入開關 Boost_DETAILED_FAILURE_MSG

    • 現在 Boost_VERSION 在模組模式下以 x.y.z 格式報告版本。請參閱政策 CMP0093

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

  • 新增了 FindEnvModules 模組,以在 CTest 腳本 中使用基於 Lua 和 TCL 的環境模組。

  • 現在 FindGLEW 模組提供的介面與上游 GLEW 在其自己的 CMake 套件檔案中提供的介面更加一致。

  • 現在 FindPkgConfig 使用其他 (非程式庫) 連結器旗標填入匯入目標的 INTERFACE_LINK_OPTIONS 屬性。

  • FindPostgreSQL 模組學習分別尋找偵錯和發行變體。

  • FindPython3FindPython2FindPython 模組獲得了額外的查找策略和控制,以及新的預設值。請參閱政策 CMP0094

  • FindPythonFindPython2FindPython3 模組獲得了一個新的目標 (分別為 Python::ModulePython2::ModulePython3::Module),可用於開發 Python 模組。

  • FindPython3FindPython2FindPython 模組獲得了控制虛擬環境處理方式的功能。

  • UseSWIG 模組學習透過將 -interface <library_name> 傳遞給 python 語言或將 -dllimport <library_name> 傳遞給 CSharp 語言到 SWIG 編譯器,來管理替代的程式庫名稱。

產生器運算式

CTest

  • ctest_submit() 命令新增了一個選項:BUILD_ID。這可以用於將 CDash 分配給此建置的 ID 儲存到變數中。

  • ctest_update() 命令學會了採用一個新的變數:CTEST_UPDATE_VERSION_OVERRIDE。這可以用於指定您的原始碼樹的當前版本,而不是使用 update 命令來發現已簽出的當前版本。

CPack

已棄用和移除的功能

其他變更

  • 如果 target_compile_features() 指定的功能在編譯器的預設標準級別中可用,則 CMake 3.14 及更低版本錯誤地新增了不必要的 -std= 標誌,這些標誌可能會降低標準級別。此錯誤已在 CMake 3.15 中修復。此行為變更可能會暴露出依賴未記錄實作細節的現有專案中的錯誤。指定編譯功能僅確保編譯器在具有這些功能的模式下運行,而不是使用任何特定的標準級別或傳遞明確的 -std= 標誌。

  • CMake 學會了如何使用 IBM AIX XL 編譯器和 SunPro 編譯器編譯 C++14,以及如何使用 AppleClang 編譯器編譯 C++20。

  • 對於類似 MSVC 的編譯器,CMAKE_<LANG>_FLAGS 的值預設不再包含像 /W3 這樣的警告標誌。請參閱政策 CMP0092

  • 定義了 __ibmxl__ 的基於 IBM Clang 的 XL 編譯器現在使用編譯器 ID XLClang 而不是 XL。請參閱政策 CMP0089

  • file(REMOVE)file(REMOVE_RECURSE) 命令已更改為忽略帶有警告的空引數,而不是將它們視為相對路徑並刪除當前目錄的內容。

更新

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

3.15.1

  • 在 CMake 3.15.0 中,針對 MSVC ABI 的類 GNU Clang 編譯器的支援實作了 CMAKE_CXX_STANDARD 值 98 和 11,使用了相應的 -std= 標誌。但是,這些模式不適用於 MSVC 標準程式庫。因此,即使對於 C++98 和 C++11,CMake 3.15.1 也會傳遞 C++14 標準標誌。這與 MSVC 本身一致,MSVC 本身始終在感知 C++14 的模式下運行。

  • 已更新 3.15.0 中新增的初步 Swift 支援。

3.15.2

3.15.3

  • CrayPrgEnv 編譯器包裝器支援已針對 Cray Programming Environment 的 19.06 版本進行了更新,對於該版本,XC Cray 系統上的預設連結模式現在是動態的而不是靜態的。

3.15.4

  • 在 CMake 3.15.0 到 3.15.3 中,EXCLUDE_FROM_ALL 目錄屬性從 3.14 之前的行為退化,並導致目錄中的目標即使從其自己的 "all" 中也被排除。這已被修復。此錯誤也存在於 3.14.0 到 3.14.6 中,並已在 3.14.7 中修復。