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
選項。export()
命令現在在多次使用相同的FILE
而沒有APPEND
的情況下會引發錯誤。請參閱政策CMP0103
。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
選項,如果找不到任何內容,將停止處理並顯示錯誤訊息。get_property()
命令與SOURCE
範圍一起獲得了DIRECTORY
和TARGET_DIRECTORY
選項,以從提供的目錄範圍取得屬性。get_source_file_property()
命令獲得了DIRECTORY
和TARGET_DIRECTORY
選項,以從提供的目錄範圍取得屬性。list()
操作SORT
獲得了NATURAL
排序選項,以使用自然順序進行排序(請參閱strverscmp(3)
手冊)。set_property()
命令與SOURCE
範圍一起獲得了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>
目標屬性,以告知用於 VS 2010 及更高版本的 Visual Studio 產生器 使用<tool>
將中繼資料新增到非建置的原始程式檔。新增了
VS_SETTINGS
原始程式檔屬性,以告知用於 VS 2010 及更高版本的 Visual Studio 產生器 將中繼資料新增到非建置的原始程式檔。新增了
VS_PLATFORM_TOOLSET
目標屬性,以告知用於 VS 2010 及更高版本的 Visual Studio 產生器 覆寫平台工具組。新增了
VS_SOLUTION_DEPLOY
目標屬性,以告知用於 VS 2010 及更高版本的 Visual Studio 產生器 將目標標記為部署,即使未針對 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
模組現在接受目標語言作為find_package
的COMPONENTS
和OPTIONAL_COMPONENTS
引數。GoogleTest
模組gtest_discover_tests()
命令獲得了一個新的
DISCOVERY_MODE
選項,以控制何時執行測試探索步驟。它提供了一個新的PRE_TEST
設定,以便在測試時而不是建置時執行探索。新的CMAKE_GTEST_DISCOVER_TESTS_DISCOVERY_MODE
變數可用於全域變更預設值。獲得了一個新的可選參數
XML_OUTPUT_DIR
。設定後,JUnit XML 測試結果將儲存在該目錄中。
FindLibXslt
模組現在提供匯入目標。UseSWIG
模組現在如果SWIG_EXECUTABLE
是 SWIG-Fortran,則支援 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
旗標。
已棄用和移除的功能¶
Documentation
模組已透過CMP0106
政策棄用。此模組本質上是 VTK 程式碼,CMake 不應再運送。為政策
CMP0070
和政策CMP0071
(CMP0069
及更早版本已棄用)新增了明確的棄用診斷。cmake-policies(7)
手冊解釋說,所有政策的 OLD 行為都已棄用,專案應移植到 NEW 行為。
其他變更¶
在 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" 版本 2version
欄位已更新為 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)
作為預設架構(XcodeARCHS
設定)。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
)。