CMake 3.18 發行說明¶
自 CMake 3.17 以來的變更包括以下內容。
新功能¶
程式語言¶
現在可以使用 Clang 在非 Windows 平台上編譯
CUDA
語言。目前任何平台都不支援可分離編譯。
命令列¶
指令¶
add_library()
和add_executable()
指令學會了建立參照非GLOBAL
匯入目標 的 別名目標。新增了
cmake_language()
指令,用於對指令碼或內建指令進行元操作,首先是CALL
其他指令的模式,以及EVAL CODE
來就地評估 CMake 指令碼。execute_process()
指令新增了ECHO_OUTPUT_VARIABLE
和ECHO_ERROR_VARIABLE
選項。file()
指令新增了ARCHIVE_CREATE
和ARCHIVE_EXTRACT
子指令,將cmake(1)
-E tar
功能公開給 CMake 指令碼程式碼。建立
file(CONFIGURE)
子指令,以便複製configure_file()
的功能,而無需使用磁碟上預先存在的檔案作為輸入。內容改為以字串形式傳遞。file(UPLOAD)
指令新增了TLS_VERIFY
和TLS_CAINFO
選項來控制伺服器憑證驗證。find_program()
、find_library()
、find_path()
和find_file()
指令新增了新的REQUIRED
選項,如果找不到任何內容,將會停止處理並顯示錯誤訊息。帶有
SOURCE
範圍的get_property()
指令新增了DIRECTORY
和TARGET_DIRECTORY
選項,以從提供的目錄範圍取得屬性。get_source_file_property()
指令新增了DIRECTORY
和TARGET_DIRECTORY
選項,以從提供的目錄範圍取得屬性。list()
操作SORT
新增了NATURAL
排序選項,以使用自然順序進行排序(請參閱strverscmp(3)
手冊)。帶有
SOURCE
範圍的set_property()
指令新增了DIRECTORY
和TARGET_DIRECTORY
選項,以在提供的目錄範圍中設定屬性。set_source_files_properties()
指令新增了DIRECTORY
和TARGET_DIRECTORY
選項,以在提供的目錄範圍中設定屬性。string()
指令學習了新的HEX
子指令,該指令會將字串轉換為十六進位表示法。
變數¶
新增了
CMAKE_CUDA_ARCHITECTURES
變數,用於指定 CUDA 輸出架構。建議使用者使用此變數,而不是手動指定選項,因為這種方法與編譯器無關。當CMAKE_CUDA_COMPILER_ID
為NVIDIA
時,會自動初始化此變數。此變數用於初始化新的CUDA_ARCHITECTURES
目標屬性。請參閱政策CMP0104
。新增了
CMAKE_PCH_WARN_INVALID
變數,以初始化PCH_WARN_INVALID
目標屬性,以允許移除預先編譯標頭的無效警告。
屬性¶
新增了
CUDA_ARCHITECTURES
目標屬性,用於指定 CUDA 輸出架構。建議使用者使用此屬性,而不是手動指定選項,因為這種方法與編譯器無關。此屬性由新的CMAKE_CUDA_ARCHITECTURES
變數初始化。請參閱政策CMP0104
。新增了
Fortran_PREPROCESS
目標屬性和Fortran_PREPROCESS
原始碼檔案屬性,以控制 Fortran 原始碼檔案的預處理。建立
FRAMEWORK_MULTI_CONFIG_POSTFIX_<CONFIG>
目標屬性和相關的CMAKE_FRAMEWORK_MULTI_CONFIG_POSTFIX_<CONFIG>
變數,以便在使用多配置產生器時,允許在框架檔案名稱中加入後綴。OBJECT_OUTPUTS
來源檔案屬性現在支援產生器 表達式
。新增
PCH_WARN_INVALID
目標屬性,允許移除預編譯標頭無效警告。新增
UNITY_BUILD_MODE
目標屬性,告知產生器要使用哪個演算法來分組包含的來源檔案。新增
VS_SOURCE_SETTINGS_<tool>
目標屬性,告知 Visual Studio 產生器 (適用於 VS 2010 及更高版本) 使用<tool>
將中繼資料新增至未建置的來源檔案。新增
VS_SETTINGS
來源檔案屬性,告知 Visual Studio 產生器 (適用於 VS 2010 及更高版本) 將中繼資料新增至未建置的來源檔案。新增
VS_PLATFORM_TOOLSET
目標屬性,告知 Visual Studio 產生器 (適用於 VS 2010 及更高版本) 覆寫平台工具組。新增
VS_SOLUTION_DEPLOY
目標屬性,告知 Visual Studio 產生器 (適用於 VS 2010 及更高版本) 標記要部署的目標,即使不是為 Windows Phone/Store/CE 建置。
模組¶
新增
CheckLinkerFlag
模組,以提供檢查連結器旗標有效性的功能。ExternalProject
模組的ExternalProject_Add()
命令新增了GIT_REMOTE_UPDATE_STRATEGY
關鍵字。這可用於指定在 git 更新期間,應如何處理失敗的 rebase 操作。CMAKE_EP_GIT_REMOTE_UPDATE_STRATEGY
變數也被新增為全域預設值,並由ExternalProject
和FetchContent
模組採用。FetchContent
模組的FetchContent_Declare()
命令現在支援SOURCE_SUBDIR
選項。它可用於指示FetchContent_MakeAvailable()
在不同的位置尋找CMakeLists.txt
檔案。FindBLAS
模組現在提供已匯入的目標。-
獲得了變數
CUDAToolkit_LIBRARY_ROOT
,這是包含nvvm
目錄和version.txt
的目錄。使用在
CUDA
編譯器偵測期間找到的工具組和程式庫根目錄。
FindLAPACK
模組現在提供已匯入的目標。FindPython3
、FindPython2
和FindPython
模組增加了在
cmake-gui(1)
和ccmake(1)
中為互動式編輯建立每個成品快取變數的可能性。在
Development
元件下新增了子元件Development.Module
和Development.Embed
。新增了指定要尋找的 Python 實作的功能,包括
IronPython
和PyPy
。
為了與其他尋找模組保持一致,
FindRuby
模組的輸入和輸出變數全部從RUBY_
重新命名為Ruby_
。如果提供舊格式的輸入變數,將會被採用,並且始終會提供舊格式的輸出變數。FindSWIG
模組現在接受目標語言作為COMPONENTS
和OPTIONAL_COMPONENTS
引數,傳遞給find_package
。GoogleTest
模組的gtest_discover_tests()
命令新增了
DISCOVERY_MODE
選項,以控制執行測試探索步驟的時間。它提供了一個新的PRE_TEST
設定,在測試時而不是建置時執行探索。可以使用新的CMAKE_GTEST_DISCOVER_TESTS_DISCOVERY_MODE
變數來全域變更預設值。新增了一個新的可選參數
XML_OUTPUT_DIR
。設定後,JUnit XML 測試結果會儲存在該目錄中。
FindLibXslt
模組現在提供已匯入的目標。如果
SWIG_EXECUTABLE
是 SWIG-Fortran,UseSWIG
模組現在支援 Fortran 作為目標語言。
產生器表達式¶
新增了
$<DEVICE_LINK:...>
和$<HOST_LINK:...>
產生器表達式,以管理裝置和主機連結步驟。新增了
$<LINK_LANGUAGE:...>
和$<LINK_LANG_AND_ID:...>
產生器表達式。
CTest¶
ctest(1)
新增了CTEST_RESOURCE_SPEC_FILE
變數,可用於指定資源規格檔案。ctest(1)
新增了--stop-on-failure
選項,可用於在有測試失敗時停止執行測試。ctest_test()
命令新增了STOP_ON_FAILURE
選項,可用於在有測試失敗時停止執行測試。CTestCoverageCollectGCOV
模組的ctest_coverage_collect_gcov()
命令新增了TARBALL_COMPRESSION
選項,用於控制收集結果的 tarball 壓縮方式。
CPack¶
CPack Archive Generator
的TXZ
格式新增了CPACK_ARCHIVE_THREADS
變數,以啟用平行壓縮。需要 CMake 使用的liblzma
支援。CPack NSIS Generator
新增了CPACK_NSIS_MANIFEST_DPI_AWARE
變數,用於宣告安裝程式具備 DPI 感知能力。CPack RPM Generator
新增了CPACK_RPM_PRE_TRANS_SCRIPT_FILE
和CPACK_RPM_POST_TRANS_SCRIPT_FILE
變數,用於指定前置和後置交易腳本。
其他¶
cmake-gui(1)
現在會從CMAKE_GENERATOR
環境變數填入其產生器選擇小工具的預設值。此外,環境變數CMAKE_GENERATOR_PLATFORM
和CMAKE_GENERATOR_TOOLSET
會用於填入其各自小工具的預設值。ccmake(1)
學會讀取CCMAKE_COLORS
環境變數來自訂顏色。編譯功能
功能現在可感知 MSVC 19.27 和 19.28 中 C11 功能的可用性,包括支援c_restrict
、c_static_assert
功能和-std:c11
標誌。
已棄用和移除的功能¶
通過
CMP0106
,Documentation
模組已被棄用。此模組本質上是 VTK 程式碼,CMake 不應再發佈。為原則
CMP0070
和原則CMP0071
新增了明確的棄用診斷(CMP0069
及以下版本已棄用)。cmake-policies(7)
手冊解釋了所有原則的舊行為已棄用,並且專案應移植到新行為。
其他變更¶
在 Windows 上,當未明確指定編譯器時,
Ninja
和Ninja Multi-Config
產生器現在會選擇在PATH
環境變數所列目錄中找到的第一個編譯器(不論名稱)。LINK_OPTIONS
和INTERFACE_LINK_OPTIONS
目標屬性現在用於裝置連結步驟。請參閱原則CMP0105
。建立覆蓋現有目標的
ALIAS
目標現在會引發錯誤。請參閱原則CMP0107
。通過別名將目標連結到自身現在會引發錯誤。請參閱原則
CMP0108
。如果指定了
HANDLE_COMPONENTS
,FindPackageHandleStandardArgs
模組選項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
)。