CMake 3.17 發行說明¶
自 CMake 3.16 以來所做的變更包括以下內容。
新功能¶
產生器¶
cmake(1)
獲得了Ninja Multi-Config
產生器,它類似於Ninja
產生器,但可以用於一次建置多個組態。Visual Studio 產生器 學會了支援每個組態的來源。先前只有 命令列建置工具產生器 支援它們。
適用於 VS 2010 及更高版本的 Visual Studio 產生器 現在支援在
CMAKE_GENERATOR_TOOLSET
設定中指定專案檔案的VCTargetsPath
值。適用於 VS 2010 及更高版本的 Visual Studio 產生器 學會了支援 .NET Standard 和 .NET Core。請參閱
DOTNET_TARGET_FRAMEWORK
目標屬性和相關的CMAKE_DOTNET_TARGET_FRAMEWORK
變數。
語言¶
編譯功能
功能現在為 CUDA 語言標準層級提供元功能(例如,cuda_std_03
、cuda_std_14
)。請參閱CMAKE_CUDA_KNOWN_FEATURES
。
編譯器¶
現在
Ninja
產生器支援 IBM XL Fortran 編譯器。
命令列¶
指令¶
add_custom_command()
指令學會了解譯在DEPENDS
引數中指定相對於目前二進位目錄的路徑。foreach()
指令學會了一個新的ZIP_LISTS
選項,可同時疊代多個清單。現在,當使用
cmake -P
來 執行腳本 時,允許使用load_cache(READ_WITH_PREFIX)
指令模式。message()
指令學會了輸出CMAKE_MESSAGE_CONTEXT
變數中提供的記錄層級NOTICE
及以下內容的內容。使用新的--log-context
命令列選項或CMAKE_MESSAGE_CONTEXT_SHOW
變數來啟用此輸出。message()
指令獲得了新的關鍵字CHECK_START
、CHECK_PASS
和CHECK_FAIL
。target_compile_options()
指令現在更一致地遵循BEFORE
關鍵字。請參閱原則CMP0101
。
變數¶
新增了
CMAKE_CTEST_ARGUMENTS
變數,以指定在透過產生的建置系統的test
(或RUN_TESTS
) 目標執行時,傳遞給 CTest 的命令列引數清單。現在在
function()
內定義了下列變數引入了
CMAKE_CUDA_RUNTIME_LIBRARY
變數和CUDA_RUNTIME_LIBRARY
目標屬性,用於選擇連結使用 CUDA 的目標時所使用的 CUDA 執行期函式庫。引入了
CMAKE_FIND_DEBUG_MODE
變數,以便在 cmake 執行期間向標準錯誤輸出額外的find_*
呼叫資訊。輸出內容是為了方便人類閱讀,而不是為了解析。如果沒有給定明確的配置,
CMAKE_EXPORT_COMPILE_COMMANDS
變數現在會從CMAKE_EXPORT_COMPILE_COMMANDS
環境變數取得其初始值。如果沒有明確設定,
CMAKE_<LANG>_COMPILER_LAUNCHER
變數現在會從CMAKE_<LANG>_COMPILER_LAUNCHER
環境變數取得其初始值。現在可以使用
CMAKE_MESSAGE_LOG_LEVEL
變數來持久化 CMake 執行之間的記錄層級,這與僅適用於特定執行的--log-level
命令列選項不同。新增了
CMAKE_XCODE_SCHEME_ENVIRONMENT
變數,用於初始化XCODE_SCHEME_ENVIRONMENT
目標屬性。新增了
CMAKE_XCODE_SCHEME_WORKING_DIRECTORY
變數和相關的XCODE_SCHEME_WORKING_DIRECTORY
目標屬性,以告知Xcode
產生器設定Custom Working Directory
方案選項的值。
屬性¶
建立了
AIX_EXPORT_ALL_SYMBOLS
目標屬性和相關的CMAKE_AIX_EXPORT_ALL_SYMBOLS
變數,以便在 AIX 上選擇性地明確停用從共享函式庫自動匯出符號。新增了
DEPRECATION
目標屬性,用於將目標標記為已棄用。如果連結的目標被標記為已棄用,則在產生時會發出包含棄用訊息的警告。INSTALL_NAME_DIR
目標屬性現在支援產生器運算式
。特別是,可以使用$<INSTALL_PREFIX>
產生器運算式來設定相對於安裝時前置詞的目錄。新增了目標屬性
MACHO_COMPATIBILITY_VERSION
和MACHO_CURRENT_VERSION
,分別設定 Mach-O 二進制檔案的compatibility_version
和curent_version
。為了向後相容,如果沒有設定這些屬性,則分別使用SOVERSION
和VERSION
作為後備。新增了
VS_DOTNET_DOCUMENTATION_FILE
目標屬性,以告知 Visual Studio 產生器 在.csproj
檔案中產生DocumentationFile
參考。
模組¶
ExternalProject
模組的ExternalProject_Add()
命令新增了一個GIT_SUBMODULES_RECURSE
選項,用於指定是否應遞迴更新 Git 子模組。預設值為開啟,以保留現有行為。新增了
FindCUDAToolkit
模組,用於在不啟用 CUDA 作為語言的情況下尋找 CUDA 工具組。FindCURL
模組學會使用 CURL 的 cmake 建置系統產生的CURLConfig.cmake
套件設定檔來尋找 CURL。它還新增了一個新的CURL_NO_CURL_CMAKE
選項來停用此行為。FindFLEX
模組的FLEX_TARGET
命令現在使用CMAKE_CURRENT_BINARY_DIR
作為工作目錄來執行flex
。請參閱政策CMP0098
。FindLibArchive
模組現在為 libarchive 提供導入的目標。FindPython
模組已學會在conda
管理的活動虛擬環境中尋找 Python 組件。FindPython3
和FindPython
模組分別新增了變數Python3_SOABI
和Python_SOABI
,給出模組的標準副檔名後綴。此外,命令Python3_add_library()
和Python_add_library()
新增了WITH_SOABI
選項,用於以SOABI
的值作為函式庫後綴的前綴。FindLibXml2
模組現在為xmllint
可執行檔提供導入的目標。
自動產生¶
CTest¶
當使用
-C <cfg>
呼叫ctest(1)
時,CTEST_CONFIGURATION_TYPE
變數現在會從命令列設定。ctest(1)
工具新增了 Dr. Memory 的支援,可以執行記憶體檢查。ctest(1)
工具新增了--no-tests=<[error|ignore]>
選項,可以在未找到任何測試時,明確設定並統一直接調用和腳本模式之間的行為。ctest(1)
工具新增了--repeat <mode>:<n>
選項,可以指定重複測試的條件。這將現有的--repeat-until-fail <n>
選項一般化,增加了until-pass
和after-timeout
模式。ctest_test()
命令新增了REPEAT <mode>:<n>
選項,可以指定重複測試的條件。
CPack¶
CPack DragNDrop Generator
現在可以使用CPACK_DMG_<component>_FILE_NAME
變數,在將組件封裝到各自的 DMG 中時,設定自訂的檔案名稱。CPack DragNDrop Generator
現在可以處理 RTF 格式的授權檔案。當設定CPACK_DMG_SLA_DIR
變數時,會考慮<language>.license.rtf
,但僅作為找不到純文字 (.txt
) 檔案時的備用選項,以保持向後相容性。CPack NSIS Generator
新增了一個變數CPACK_NSIS_MUI_HEADERIMAGE
,用於設定標頭圖像。為了不破壞現有的設定,如果沒有設定新的變數,它仍然會預設為CPACK_PACKAGE_ICON
。CPack NSIS Generator
現在支援CPACK_NSIS_UNINSTALL_NAME
。這可以用來指定解除安裝程式的名稱。CPack NSIS Generator
現在支援CPACK_NSIS_WELCOME_TITLE
和CPACK_NSIS_WELCOME_TITLE_3LINES
。這些可以用來指定歡迎頁面的標題,並以三行顯示。CPack NSIS Generator
現在支援CPACK_NSIS_FINISH_TITLE
和CPACK_NSIS_FINISH_TITLE_3LINES
。這些可以用來指定完成頁面的標題,並以三行顯示。CPack productbuild Generator
新增了對CPACK_PRODUCTBUILD_BACKGROUND
變數的支援,可以為 macOS 安裝程式指定背景圖像。
其他¶
已棄用和移除的功能¶
為政策
CMP0068
和政策CMP0069
新增了明確的棄用診斷(CMP0067
及以下的政策已經被棄用)。cmake-policies(7)
手冊解釋說,所有政策的 OLD 行為都已棄用,專案應該移植到 NEW 行為。CPack
PackageMaker
產生器已被棄用,因為 Xcode 不再分發 PackageMaker 工具。未記載的OSXX11
產生器也已被棄用。為了支持新的
-E rm
工具,cmake(1)
命令列工具的-E remove
和-E remove_directory
已被棄用。舊的工具即使沒有強制選項,如果指定的路徑不存在,總是返回 0,並且在不破壞相容性的情況下無法修復,因此已被取代。CPack NSIS Generator
現在需要 NSIS 3.0 或更高版本。
其他變更¶
file API
索引檔案現在會發出一個multiConfig
旗標,指定產生器是否支援多個輸出設定。目標連結屬性
INTERFACE_LINK_OPTIONS
、INTERFACE_LINK_DIRECTORIES
和INTERFACE_LINK_DEPENDS
現在會透過靜態程式庫的私有相依性進行傳遞。請參閱政策CMP0099
。當使用 MinGW 工具時,
find_library()
命令預設不再尋找.dll
檔案。相反地,它期望.dll.a
匯入程式庫可用。MinGW Makefiles
產生器如果環境的PATH
中存在sh.exe
,則不再發出錯誤訊息。Ninja
產生器現在優先選擇PATH
中出現的第一個 ninja 建置工具,無論它被稱為ninja-build
、ninja
還是samu
。 以前,無論在PATH
中的任何位置,首先出現的名稱將會被優先選擇。對於 SDCC,現在優先使用
sdar
工具而不是sdcclib
作為程式庫管理員。後者已在 SDCC 3.2.0 中被棄用,並在 SDCC 3.8.6 中移除。對於 SDCC,預設標誌不再包含任何特定目標的標誌。以前的預設標誌是為 8051 硬編碼的。
CMAKE_VS_GLOBALS
變數的值現在在編譯器識別期間以及由add_custom_target()
命令建立的目標中應用。Xcode
產生器不再硬編碼-Wmost
、-Wno-four-char-constants
和-Wno-unknown-pragmas
警告標誌。
更新¶
自 CMake 3.17.0 以來的變更包括以下內容。
3.17.1¶
CMake 3.17.0 更新了
CPack NSIS Generator
,其變更需要 NSIS 3.0 或更高版本。 CMake 3.17.1 現在強制使用足夠新的版本。
3.17.3¶
Objective C 或 C++ 編譯器的選擇現在會考慮
CC
或CXX
環境變數,如果未設定OBJC
或OBJCXX
環境變數。FindPkgConfig
模組現在會將帶有-isystem
前綴的包含目錄提取到*_INCLUDE_DIRS
變數和INTERFACE_INCLUDE_DIRECTORIES
目標屬性中。以前,它們會被放置在*_CFLAGS_OTHER
變數和INTERFACE_COMPILE_OPTIONS
目標屬性中。
3.17.5¶
CMAKE_AUTOMOC_PATH_PREFIX
的預設值已變更為OFF
,因為此功能可能會破壞在不同包含目錄中具有相同名稱標頭檔的現有專案。這會恢復與 CMake 3.15 及以下版本的行為相容性。 預設值在 3.16.9 中也已變更為OFF
。