CMake 3.15 版本說明

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

新功能

產生器 (Generators)

程式語言

  • 初步支援 Swift 語言已新增至 Ninja 產生器

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

編譯器

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

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

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

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

命令列

  • 新增了 CMAKE_GENERATOR 環境變數,以指定當執行 cmake(1) 而沒有 -G 選項時要使用的預設產生器。此外,還建立了環境變數 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 (清單)、c (建立) 或 x (擷取)。

    • 現在支援僅擷取 (-x) 或列出 (-t) 特定檔案或目錄。

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

指令

變數

  • 新增了

  • 新增了

  • 新增了

  • 引入了

  • 新增了

屬性

  • 新增了

  • 新增了

  • 新增了

  • 新增了

模組

  • 重做了

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

    • 新增了輸出變數 Boost_VERSION_MACROBoost_VERSION_MAJORBoost_VERSION_MINORBoost_VERSION_PATCHBoost_VERSION_COUNT

    • 傳遞給 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。這可以用於指定您原始碼樹的目前版本,而不是使用更新命令來發現已簽出的目前版本。

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 編譯器支援使用對應的 -std= 旗標實作 CMAKE_CXX_STANDARD 值 98 和 11。但是,這些模式不適用於 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

  • 已針對 Cray Programming Environment 的 19.06 版本更新 CrayPrgEnv 編譯器包裝函式支援,其中 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 版本中修復。