CMake 3.19 發行說明¶
自 CMake 3.18 以來所做的變更包括以下內容。
新功能¶
預設集¶
cmake(1)
和cmake-gui(1)
現在可以識別CMakePresets.json
和CMakeUserPresets.json
檔案 (請參閱cmake-presets(7)
)。
產生器¶
Xcode
產生器在為 Xcode 12.0 或更高版本產生時,現在使用 Xcode “新的建置系統”。請參閱CMAKE_XCODE_BUILD_SYSTEM
變數。可以使用-T buildsystem=1
切換到舊版建置系統。Xcode
產生器增加了透過連結二進制檔案與函式庫建置階段連結函式庫和框架的支援,而不是總是直接嵌入連結器旗標。此行為由新的XCODE_LINK_BUILD_PHASE_MODE
目標屬性控制,該屬性由新的CMAKE_XCODE_LINK_BUILD_PHASE_MODE
變數初始化。用於 VS 2015 及更高版本的 Visual Studio 產生器 增加了對 Visual Studio Tools for Android 的支援。現在可以將
CMAKE_SYSTEM_NAME
設定為Android
,以產生 Android 工具的.vcxproj
檔案。
語言¶
CMake 學會支援
ISPC
作為一流語言,可以透過project()
和enable_language()
命令啟用。ISPC
目前受到 Makefile 產生器 和Ninja
產生器在 Linux、macOS 和 Windows 上使用 Intel ISPC 編譯器的支援。CUDA
語言對 Clang 的支援現在包括可分離編譯 (
CUDA_SEPARABLE_COMPILATION
),以及在交叉編譯時尋找分散的工具包安裝。
CUDA
語言支援現在可以在 QNX 上運作。
平台¶
現在支援 Apple Silicon (自 CMake 3.19.2 起)
CMAKE_HOST_SYSTEM_PROCESSOR
是使用uname -m
選擇的。由於這可能會根據 CMake 自身的架構和調用進程樹的架構而有所不同,因此可以設定CMAKE_APPLE_SILICON_PROCESSOR
變數或CMAKE_APPLE_SILICON_PROCESSOR
環境變數來明確指定主機架構。如果未設定
CMAKE_OSX_ARCHITECTURES
,CMake 會新增明確的旗標來告知編譯器為CMAKE_HOST_SYSTEM_PROCESSOR
建置,以便工具鏈不必根據進程樹的架構進行猜測。
基於檔案的 API¶
cmake-file-api(7)
“codemodel” 版本 2version
欄位已更新為 2.2。cmake-file-api(7)
“codemodel” 版本 2 “target” 物件在compileGroups
物件中獲得了新的languageStandard
欄位。
命令列¶
圖形使用者介面¶
CMake GUI
現在具有環境變數編輯器。
命令¶
add_test()
命令現在 (正式) 支援在其建立的測試名稱中使用空格和其他特殊字元。請參閱政策CMP0110
。cmake_language()
命令獲得了DEFER
模式,用於排程命令調用在處理目錄結束時發生。configure_file()
命令獲得了NO_SOURCE_PERMISSIONS
選項,用於禁止將輸入檔案的權限複製到輸出檔案。execute_process()
命令獲得了COMMAND_ERROR_IS_FATAL
選項,用於指定嚴重錯誤。file(ARCHIVE_CREATE)
命令獲得了COMPRESSION_LEVEL
選項,用於指定壓縮等級。file(CHMOD)
和file(CHMOD_RECURSE)
子命令已新增,用於設定檔案和目錄的權限。file(DOWNLOAD)
命令<file>
引數現在是選填的。如果未指定,則不會儲存檔案。file(GENERATE)
命令獲得了新的TARGET
關鍵字,以支援解析依賴目標的產生器表達式。file()
命令獲得了新的REAL_PATH
子命令,用於計算已解析符號連結的路徑。find_package()
命令學會處理版本範圍。separate_arguments()
命令獲得了新的PROGRAM
選項。它允許將引數視為程式調用,並在可以找到可執行檔時將其解析為完整路徑。DIRECTORY
選項的set_property()
、get_property()
和get_directory_property()
命令現在接受對二進制目錄路徑的引用,例如CMAKE_CURRENT_BINARY_DIR
的值。string()
命令獲得了一組新的JSON
子命令,這些子命令提供 JSON 解析功能。
變數¶
新增了
CMAKE_CLANG_VFS_OVERLAY
變數,以告知 Clang 使用 VFS 覆蓋來支援從具有區分大小寫檔案系統的主機進行交叉編譯時的 Windows SDK。CMAKE_MFC_FLAG
變數現在支援產生器表達式。新增了
CMAKE_OPTIMIZE_DEPENDENCIES
變數,以初始化新的OPTIMIZE_DEPENDENCIES
目標屬性,並避免不必要地建置靜態函式庫的依賴項。新增了
CMAKE_PCH_INSTANTIATE_TEMPLATES
變數,以初始化新的PCH_INSTANTIATE_TEMPLATES
目標屬性。新增了
CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION_MAXIMUM
變數,以告知 Visual Studio 產生器 要選擇的 Windows SDK 的最大版本。
屬性¶
EXCLUDE_FROM_ALL
目標屬性現在支援產生器 表達式
。新增了
OPTIMIZE_DEPENDENCIES
目標屬性,以避免不必要地建置靜態函式庫的依賴項。新增了
PCH_INSTANTIATE_TEMPLATES
目標屬性,以啟用在預編譯標頭中的模板實例化。預設情況下啟用此功能,並且可以顯著縮短編譯時間。目前僅支援 Clang (版本 11 或更高版本)。WIN32_EXECUTABLE
目標屬性現在支援產生器 表達式
。
模組¶
新增了
CheckCompilerFlag
模組,以將CheckCCompilerFlag
和CheckCXXCompilerFlag
推廣到更多語言。它還支援CUDA
和ISPC
語言。CheckLinkerFlag
模組現在支援CUDA
語言。新增了
CheckSourceCompiles
模組,以將CheckCSourceCompiles
和CheckCXXSourceCompiles
推廣到更多語言。它還支援CUDA
和ISPC
語言。新增了
CheckSourceRuns
模組,以將CheckCSourceRuns
和CheckCXXSourceRuns
推廣到更多語言。它還支援CUDA
語言。CMakePackageConfigHelpers
模組增加了對版本範圍的支援。FindCUDAToolkit
模組增加了對尋找不包含nvcc
的 CUDA 工具包的支援,以及在交叉編譯時尋找分散的工具包安裝的支援。FindPackageHandleStandardArgs
模組學會處理版本範圍。它還獲得了find_package_check_version()
命令,用於針對find_package()
命令的版本相關引數檢查版本的有效性。FindPython3
、FindPython2
和FindPython
模組增加了處理版本範圍的能力。FindPython3
、FindPython2
和FindPython
模組分別為連結選項提供變數Python3_LINK_OPTIONS
、Python2_LINK_OPTIONS
和Python_LINK_OPTIONS
。FindSDL
模組現在提供匯入的目標
SDL::SDL
。結果變數
SDL_LIBRARIES
和SDL_INCLUDE_DIRS
。版本變數
SDL_VERSION
、SDL_VERSION_MAJOR
、SDL_VERSION_MINOR
和SDL_VERSION_PATCH
。
FindSWIG
模組增加了處理版本範圍的能力。FindTIFF
模組獲得了CXX
組件,用於尋找包含 C++ 綁定的tiffxx
函式庫。FindVulkan
模組現在提供Vulkan::glslc
匯入的目標和相關的Vulkan_GLSLC_EXECUTABLE
變數,其中包含 GLSL SPIR-V 編譯器的路徑。UseSWIG
模組增加了對新的原始檔屬性OUTPUT_DIR
和OUTFILE_DIR
的支援,以在每個原始檔的基礎上管理輸出目錄。
CTest¶
ctest(1)
現在支援 CUDAcompute-sanitizer
檢查器 (以前稱為cuda-memcheck
) 作為CTEST_MEMORYCHECK_COMMAND
。compute-sanitizer
支援的不同工具 (memcheck
、racecheck
、synccheck
和initcheck
) 可以透過將適當的旗標新增到CTEST_MEMORYCHECK_COMMAND_OPTIONS
變數來選擇。預設旗標為--tool memcheck --leak-check full
。
CPack¶
CPack 獲得了
CPACK_PRE_BUILD_SCRIPTS
、CPACK_POST_BUILD_SCRIPTS
和CPACK_PACKAGE_FILES
變數。「
CPack External Generator
」獲得了「CPACK_EXTERNAL_BUILT_PACKAGES
」變數。「
CPack WIX Generator
」獲得了一個「CPACK_WIX_CUSTOM_XMLNS
」選項,用於指定自訂 XML 命名空間。
其他¶
介面函式庫現在可以透過
add_library()
或target_sources()
新增原始檔。 具有原始檔的項目將會作為建置系統的一部分產生。
已棄用和移除的功能¶
與舊於 2.8.12 版本的 CMake 的相容性現在已棄用,並將在未來版本中移除。 調用
cmake_minimum_required()
或cmake_policy()
將策略版本設定為較舊值的操作,現在會發出棄用診斷訊息。已為策略
CMP0071
新增明確的棄用診斷訊息(CMP0071
及以下版本已遭棄用)。cmake-policies(7)
手冊說明所有策略的舊行為都已棄用,專案應移植到新行為。不再支援舊於 10.5 的 macOS SDK。
「
cmake-gui(1)
」現在需要 Qt5。 已移除使用 Qt4 編譯的支援。「
cmake(1)
」命令列選項--warn-unused-vars
已移除,現在會靜默忽略。 此選項自 CMake 3.3 以來就未正確運作。
文件¶
已新增以下指南
其他變更¶
現在為 macOS 建置時,將使用系統上可用的最新 SDK,除非使用者已使用
CMAKE_OSX_SYSROOT
明確選擇 SDK。 部署目標或系統 macOS 版本不會影響 SDK 的選擇。「
CMAKE_<LANG>_COMPILER
」變數現在可用於儲存「強制性」編譯器旗標,例如CC
和其他環境變數。如果未設定其他來源(例如「
CMAKE_<LANG>_FLAGS
」或「CFLAGS
」),則在編譯器識別檢查期間,現在將考慮「CMAKE_<LANG>_FLAGS_INIT
」變數。「
find_program()
」命令現在需要執行權限,但不需要讀取找到的檔案。 請參閱策略「CMP0109
」。如果使用位置,則缺少位置屬性的匯入目標在產生期間會失敗。 請參閱策略「
CMP0111
」。以下查詢目錄或檔案名稱組件的目標基礎產生器運算式,不再對評估的目標新增依賴項。 請參閱策略「
CMP0112
」。TARGET_FILE_DIR
TARGET_LINKER_FILE_BASE_NAME
TARGET_LINKER_FILE_NAME
TARGET_LINKER_FILE_DIR
TARGET_SONAME_FILE_NAME
TARGET_SONAME_FILE_DIR
TARGET_PDB_FILE_NAME
TARGET_PDB_FILE_DIR
TARGET_BUNDLE_DIR
TARGET_BUNDLE_CONTENT_DIR
Makefile 產生器不再重複來自目標依賴項的自訂命令。 請參閱策略「
CMP0113
」。已修訂「
ExternalProject
」模組對步驟目標依賴項的處理方式。 請參閱策略「CMP0114
」。現在針對
ASM
語言,會採用「OSX_ARCHITECTURES
」目標屬性。如果
CUDA
編譯器偵測失敗,並具有使用者指定的「CMAKE_CUDA_ARCHITECTURES
」或「CMAKE_CUDA_HOST_COMPILER
」,則會引發錯誤。
更新¶
自 CMake 3.19.0 以來所做的變更包括以下內容。
3.19.1¶
CMake 3.19.0 透過傳遞明確的語言旗標(例如
-x c
),使用「LANGUAGE
」屬性編譯原始檔。 這與屬性文件中說明的含義一致,即原始檔是以指定的語言撰寫。 然而,這可能會破壞僅使用該屬性來導致使用指定語言的編譯器的專案。 此變更已還原,以恢復 CMake 3.18 及以下版本的行為。CUDA 11.1 支援 Clang。
3.19.2¶
在
cmake.org
上提供的預先編譯 macOS 二進位檔現在是具有x86_64
和arm64
架構的通用二進位檔。 它需要 macOS 10.10 或更新版本。 套件檔案命名模式已從cmake-$ver-Darwin-x86_64
變更為cmake-$ver-macos-universal
。已更新 Apple Silicon 主機架構選取支援。 CMake 3.19.0 和 3.19.1 始終選擇
arm64
作為主機架構。 CMake 3.19.2 還原為使用uname -m
,如同 CMake 3.18 及以下版本所為。 由於這可能會根據 CMake 自身的架構以及調用進程樹的架構而有所不同,因此可以設定「CMAKE_APPLE_SILICON_PROCESSOR
」變數或「CMAKE_APPLE_SILICON_PROCESSOR
」環境變數,以明確指定主機架構。已新增「
CMAKE_ISPC_HEADER_SUFFIX
」變數和對應的「ISPC_HEADER_SUFFIX
」目標屬性,以控制ISPC
編譯器產生的標頭所使用的標頭後綴。
3.19.3¶
現在在
cmake.org
上提供預先編譯 Linuxaarch64
二進位檔。現在在
cmake.org
上提供兩個預先編譯 macOS 二進位檔命名模式
cmake-$ver-macos-universal
是具有x86_64
和arm64
架構的通用二進位檔。 它需要 macOS 10.13 或更新版本。命名模式
cmake-$ver-macos10.10-universal
是具有x86_64
和arm64
架構的通用二進位檔。 它需要 macOS 10.10 或更新版本。
3.19.4¶
在 3.19.0 中引入的「
CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION_MAXIMUM
」變數先前僅適用於「Visual Studio 14 2015
」產生器。 現在已修正為也適用於更新 VS 版本的 Visual Studio 產生器。
3.19.5¶
當啟用「
IOS_INSTALL_COMBINED
」並使用「Xcode
」產生器時,現在可以透過從命令列執行cmake --install
或cpack
來啟動安裝或套件建立。 當使用 Xcode 新建置系統時,由於 Xcode 的限制,這些是唯一支援的方法。 僅當使用舊版建置系統時,才支援透過在 Xcode 中建置install
或package
目標來啟動這些操作。在 3.19.0 中引入的框架處理,作為支援 Xcode 的連結二進位檔與函式庫建置階段的一部分,破壞了在裝置和模擬器建置之間切換而無需重新設定的能力。 該功能現在已恢復。
3.19.6¶
「
cmake-presets(7)
」功能不再允許在CMakePresets.json
或CMakeUserPresets.json
檔案中加入註解。 CMake 3.19.0 到 CMake 3.19.5 中的實作錯誤地允許了此操作,且未在文件中說明。
3.19.7¶
對於 VS 2017 及更高版本的 Visual Studio 產生器,「
CMAKE_GENERATOR_TOOLSET
」欄位version=
現在接受三組件 MSVC 工具組版本,例如14.28.29910
。 請參閱「CMAKE_VS_PLATFORM_TOOLSET_VERSION
」變數。