CMake 3.15 版本說明¶
自 CMake 3.14 以來所做的變更包括以下內容。
新功能¶
產生器 (Generators)¶
Xcode
產生器現在支援每個目標的 scheme。請參閱CMAKE_XCODE_GENERATE_SCHEME
變數和XCODE_GENERATE_SCHEME
目標屬性。Green Hills MULTI
產生器已更新現在支援
add_custom_command()
和add_custom_target()
指令。現在可在 Linux 上使用。
程式語言¶
初步支援
Swift
語言已新增至Ninja
產生器使用
SWIFTC
環境變數來指定編譯器。新增了
Swift_DEPENDENCIES_FILE
目標屬性和Swift_DEPENDENCIES_FILE
原始檔屬性,以自訂相依性檔案。新增了
Swift_MODULE_NAME
目標屬性,以自訂 Swift 模組名稱。新增了
Swift_DIAGNOSTICS_FILE
原始檔屬性,以指示寫入序列化 Swift 診斷的位置。
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_PLATFORM
、CMAKE_GENERATOR_TOOLSET
和CMAKE_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_MACRO
、Boost_VERSION_MAJOR
、Boost_VERSION_MINOR
、Boost_VERSION_PATCH
和Boost_VERSION_COUNT
。傳遞給
find_package()
的QUIET
參數在配置模式下不再被忽略。請注意,Boost1.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
模組學會了分別尋找偵錯和發行變體。模組
FindPython3
、FindPython2
和FindPython
獲得了額外的查找策略和控制,以及新的預設值。請參閱政策CMP0094
。模組
FindPython
、FindPython2
和FindPython3
獲得了一個新的目標(分別為Python::Module
、Python2::Module
和Python3::Module
),可用於開發 Python 模組。模組
FindPython3
、FindPython2
和FindPython
獲得了控制虛擬環境處理方式的功能。UseSWIG
模組學會了透過傳遞-interface <library_name>
給python
語言或-dllimport <library_name>
給CSharp
語言來管理替代的函式庫名稱 給SWIG
編譯器。
產生器運算式¶
產生器運算式
$<C_COMPILER_ID>
、$<CXX_COMPILER_ID>
、$<CUDA_COMPILER_ID>
、$<Fortran_COMPILER_ID>
、$<COMPILE_LANGUAGE>
、$<COMPILE_LANG_AND_ID>
和$<PLATFORM_ID>
學會了從逗號分隔的清單中比對一個值。新增了
$<CUDA_COMPILER_ID:...>
和$<CUDA_COMPILER_VERSION:...>
產生器運算式。引入了
$<COMPILE_LANG_AND_ID:...>
產生器運算式,以允許根據每個原始程式檔的CMAKE_<LANG>_COMPILER_ID
和LANGUAGE
來指定目標檔案的編譯選項。新增了
$<FILTER:list,INCLUDE|EXCLUDE,regex>
產生器運算式。新增了
$<REMOVE_DUPLICATES:list>
產生器運算式。$<SHELL_PATH:...>
產生器運算式獲得了對路徑清單的支援。新增了
$<TARGET_FILE*>
產生器 運算式
,以擷取各種成品檔案名稱的前置詞、基本名稱和後置詞現在
$<TARGET_OBJECTS:...>
產生器表達式支援於SHARED
、STATIC
、MODULE
函式庫和可執行檔。
CTest¶
ctest_submit()
命令新增了一個選項:BUILD_ID
。這可以用於將 CDash 指派給此建置的 ID 儲存到一個變數中。ctest_update()
命令學會了採用一個新的變數:CTEST_UPDATE_VERSION_OVERRIDE
。這可以用於指定您原始碼樹的目前版本,而不是使用更新命令來發現已簽出的目前版本。
CPack¶
CPack IFW 產生器
新增了一個CPACK_IFW_PACKAGE_STYLE_SHEET
變數,用於自訂安裝程式樣式表。
已棄用和移除的功能¶
cmake-server(7)
模式已被棄用,並將在未來版本的 CMake 中移除。請將客戶端移植為改用cmake-file-api(7)
。現在已棄用
ADDITIONAL_MAKE_CLEAN_FILES
目錄屬性。請改用ADDITIONAL_CLEAN_FILES
目錄屬性。變數
CMAKE_AUTOMOC_RELAXED_MODE
被視為已棄用。仍然存在支援,但會在未來版本中移除。除非透過
CMAKE_EXPORT_PACKAGE_REGISTRY
啟用,否則export(PACKAGE)
命令現在不做任何事情。請參閱原則CMP0090
。現在
Xcode
產生器至少需要 Xcode 5。為原則
CMP0066
(CMP0065
及更早的版本已遭棄用)新增了明確的棄用診斷。cmake-policies(7)
手冊說明,所有原則的 OLD 行為都已棄用,而且專案應移植到 NEW 行為。
其他變更¶
如果
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 編譯器現在使用編譯器 IDXLClang
,而不是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¶
在 CMake 3.15.0 和 3.15.1 中,即使沒有
REQUIRED
選項,CMAKE_FIND_PACKAGE_PREFER_CONFIG
變數也會導致find_package()
命令在遺失封包時失敗。此問題已修正。
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 版本中修復。