CMake 3.14 發行說明¶
自 CMake 3.13 以來所做的變更包括以下內容。
新功能¶
產生器¶
已新增
Visual Studio 16 2019
產生器。這是實驗性的,並且基於「Visual Studio 2019 Preview 4」,因為此版本的 VS 尚未發布。VS 2019 產生器與早期版本的產生器不同之處在於,它不提供在產生器名稱中指定目標平台的變體。而是必須使用
CMAKE_GENERATOR_PLATFORM
,例如透過-A
命令列選項。此外,預設目標平台(架構)現在基於 _host_ 平台。VS host 工具組選取現在也基於 host 架構。已更新
Green Hills MULTI
產生器現在支援 物件程式庫。
現在會針對不支援的專案類型(例如共用程式庫)發出警告。
現在會為每個呼叫
project()
指令的目錄產生最上層的<PROJECT-NAME>.top.gpj
。不再建立最上層的專案檔案default.gpj
。現在會遵守目標重新命名和目的地輸出控制屬性,例如
RUNTIME_OUTPUT_DIRECTORY
和OUTPUT_NAME
。這也修正了install()
所產生的安裝規則的支援。現在會遵守來源檔案屬性
INCLUDE_DIRECTORIES
、COMPILE_DEFINITIONS
和COMPILE_OPTIONS
。現在支援動態下載完整性應用程式,這些應用程式不包含透過
GHS_INTEGRITY_APP
整合檔案,並設定目標連結旗標-dynamic
。專案檔案的內容現在會依名稱排序來源群組和檔案。將
GHS_NO_SOURCE_GROUP_FILE
目標屬性設定為ON
,以針對目標產生單一專案檔案,而不是針對每個來源群組產生專案檔案。設定CMAKE_GHS_NO_SOURCE_GROUP_FILE
變數,以便為所有目標啟用此功能。
基於檔案的 API¶
已新增基於檔案的 API,供用戶端取得語義建置系統資訊。請參閱
cmake-file-api(7)
手冊。此 API 旨在取代 IDE 的cmake-server(7)
模式。
平台¶
CMake 現在支援使用簡單的工具鏈檔案進行 iOS、tvOS 或 watchOS 的交叉編譯。
命令列¶
cmake(1)
建置工具模式 (cmake --build
) 新增了--verbose
和-v
選項,以指定詳細的建置輸出。某些產生器(例如 Xcode)目前不支援此選項。cmake(1)
-E compare_files
指令新增了--ignore-eol
選項,以指定在比較檔案時應忽略行尾差異 (例如 LF 與 CRLF)。cmake-gui(1)
對話方塊新增了-S
和-B
引數,以明確指定來源和建置目錄。
指令¶
file()
指令新增了一個子指令CREATE_LINK
,可用於建立硬連結或符號連結。file()
指令新增了一個子指令READ_SYMLINK
,可用於判斷符號連結指向的路徑。file()
指令新增了一個SIZE
模式,以取得檔案在磁碟上的大小。find_package()
指令已學會選擇性地解析套件組態檔案路徑中的符號連結。請參閱CMAKE_FIND_PACKAGE_RESOLVE_SYMLINKS
變數。get_filename_component()
指令新增了LAST_EXT
和NAME_WLE
變體,以使用名稱中最後一個.
後面的副檔名。if()
指令新增了支援,可使用DEFINED CACHE{VAR}
語法檢查是否定義了快取變數。install(CODE)
和install(SCRIPT)
指令已學會支援產生器表達式。請參閱原則CMP0087
。
變數¶
屬性¶
模組¶
FetchContent
模組新增了FetchContent_MakeAvailable()
命令。它接受一個相依性名稱的列表,然後迭代這些名稱,使用標準模式填充每個名稱並將其添加到主建置中。這大大減少了專案中所需的樣板程式碼量。FindBISON
模組的BISON_TARGET
命令現在會以CMAKE_CURRENT_BINARY_DIR
為工作目錄來執行bison
。請參閱原則CMP0088
。FindCURL
模組已支援將協定作為套件元件請求。新增了
FindFontconfig
模組以尋找 fontconfig。FindGDAL
模組現在提供匯入的目標。FindGIF
模組現在提供匯入的目標。FindGit
模組現在為 Git 可執行檔提供匯入的目標。FindIce
模組學會尋找slice2confluence
和slice2matlab
。FindLibLZMA
模組現在提供匯入的目標。FindMatlab
模組新增了選項R2017b
和R2018a
以指定要使用的 MEX API 版本;這些選項對應 MATLAB R2018a 中mex
命令的新選項。不再需要MX_LIBRARY
選項。FindPostgreSQL
模組現在提供匯入的目標。FindPython2
模組、FindPython3
模組和FindPython
模組現在支援以指令碼模式執行,方法是跳過匯入目標和輔助函式的建立。新增了
FindSQLite3
模組以尋找 SQLite v3.x 程式庫。FindX11
模組的下列變數已重新命名,以便與其程式庫名稱而非標頭名稱相符。為了相容性,仍提供舊變數X11_Xxf86misc_INCLUDE_PATH
而非X11_xf86misc_INCLUDE_PATH
X11_Xxf86misc_LIB
而非X11_xf86misc_LIB
X11_Xxf86misc_FOUND
而非X11_xf86misc_FOUND
X11_Xxf86vm_INCLUDE_PATH
而非X11_xf86vmode_INCLUDE_PATH
X11_Xxf86vm_LIB
而非X11_xf86vmode_LIB
X11_Xxf86vm_FOUND
而非X11_xf86vmode_FOUND
X11_xkbfile_INCLUDE_PATH
而非X11_Xkbfile_INCLUDE_PATH
X11_xkbfile_LIB
而非X11_Xkbfile_LIB
X11_xkbfile_FOUND
而非X11_Xkbfile_FOUND
X11_Xtst_INCLUDE_PATH
而非X11_XTest_INCLUDE_PATH
X11_Xtst_LIB
而非X11_XTest_LIB
X11_Xtst_FOUND
而非X11_XTest_FOUND
X11_Xss_INCLUDE_PATH
而非X11_Xscreensaver_INCLUDE_PATH
X11_Xss_LIB
而非X11_Xscreensaver_LIB
X11_Xss_FOUND
而非X11_Xscreensaver_FOUND
由於下列變數基本上是重複的,因此已完全棄用
X11_Xinput_INCLUDE_PATH
(請使用X11_Xi_INCLUDE_PATH
)X11_Xinput_LIB
(請使用X11_Xi_LIB
)X11_Xinput_FOUND
(請使用X11_Xi_FOUND
)
FindX11
模組現在提供X11_Xext_INCLUDE_PATH
。FindX11
模組現在提供匯入的目標。UseSWIG
模組學會將-module <module_name>
傳遞給SWIG
編譯器,如果定義了檔案屬性SWIG_MODULE_NAME
。請參閱原則CMP0086
。UseSWIG
模組新增了一個選項來指定SWIG
原始檔副檔名。
產生器運算式¶
自動產生¶
新增了
AUTOMOC_EXECUTABLE
、AUTORCC_EXECUTABLE
和AUTOUIC_EXECUTABLE
目標屬性。它們都接受一個可執行檔的路徑,並強制 automoc/autorcc/autouic 使用此可執行檔。設定這些屬性也會防止組態時測試這些可執行檔。當您自行建置這些工具時,這會特別有用。
新增了變數
CMAKE_GLOBAL_AUTOGEN_TARGET
、CMAKE_GLOBAL_AUTOGEN_TARGET_NAME
、CMAKE_GLOBAL_AUTORCC_TARGET
和CMAKE_GLOBAL_AUTORCC_TARGET_NAME
,以控制全域autogen
和autorcc
目標的產生。新增了
CMAKE_AUTOGEN_ORIGIN_DEPENDS
變數和AUTOGEN_ORIGIN_DEPENDS
目標屬性,可用於啟用或停用將原始目標依賴關係轉發到對應的 <ORIGIN>_autogen 目標。
CTest¶
ctest(1)
新增了--show-only=json-v1
選項,以機器可讀的 JSON 格式顯示測試清單。請參閱手冊的 以 JSON 物件模型顯示 區段。ctest_submit()
命令新增了一個Done
部分,可用於通知 CDash 建置已完成且不會再上傳任何部分。CTest 現在可以從單一變數接受儀表板伺服器提交 URL。請參閱
ctest(1)
中的SubmitURL
設定、CTEST_SUBMIT_URL
變數,以及ctest_submit()
命令的SUBMIT_URL
引數。
已棄用和移除的功能¶
針對策略
CMP0064
和CMP0065
新增了明確的棄用診斷(CMP0063
及以下的策略已遭棄用)。cmake-policies(7)
手冊說明了所有策略的舊行為皆已棄用,專案應移植到新行為。Xcode
產生器已棄用對 Xcode 5 之前版本的支援。對這些版本的支援將在未來版本的 CMake 中移除。FindQt
模組不再由find_package()
命令作為尋找模組使用。這允許 Qt Project 上游選擇性地提供其自身的QtConfig.cmake
套件組態檔,並讓應用程式透過find_package(Qt)
而非find_package(Qt CONFIG)
來使用它。請參閱策略CMP0084
。已移除在 Windows XP 和 Windows Vista 上執行 CMake 的支援。在
cmake.org
上提供的預先編譯 Windows 二進位檔現在需要 Windows 7 或更高版本。CTest 不再支援透過
ftp
、scp
、cp
和xmlrpc
提交。CDash 是 CTest 唯一維護的測試儀表板,且僅支援透過http
和https
提交。
其他變更¶
已修正物件程式庫連結,以將物件程式庫的私有連結程式庫傳播到使用目標。
在
add_subdirectory()
下的安裝規則現在與呼叫目錄中的安裝規則交錯。詳情請參閱策略CMP0082
。CMake 現在會強制執行最大遞迴限制,以防止在無限遞迴的腳本上發生堆疊溢位。可以在執行時使用
CMAKE_MAXIMUM_RECURSION_DEPTH
來調整限制。當透過
CMAKE_<LANG>_CPPCHECK
變數或<LANG>_CPPCHECK
屬性使用 cppcheck 時,如果cppcheck
根據其命令列選項傳回非零值,則建置現在會失敗。當設定
POSITION_INDEPENDENT_CODE
時,現在會新增管理位置無關可執行檔的必要連結選項。專案負責使用CheckPIESupported
模組來檢查PIE
支援,以確保POSITION_INDEPENDENT_CODE
目標屬性在可執行檔的連結時會被採用。此行為由策略CMP0083
控制。適用於 VS 2010 及更高版本的 Visual Studio 產生器 已學習支援透過
add_custom_target()
建立的目標上的VS_DEBUGGER_*
屬性。由於
dpkg
從未支援 PAX tar 格式,CPack
模組不再預設將CPACK_DEBIAN_ARCHIVE_TYPE
變數的值設為paxr
。paxr
值將會被對應到gnutar
,並發出棄用訊息。如果
install(TARGETS)
命令中列出的目標,其EXCLUDE_FROM_ALL
屬性設定為 true,CMake 不再發出警告。
更新¶
自 CMake 3.14.0 以來所做的變更包括以下內容。
3.14.1¶
3.14.0 新增的
FindFontconfig
模組,意外地使用了不符合我們慣例的大寫FONTCONFIG_*
變數名稱。3.14.1 版本修正了此模組,改用Fontconfig_*
變數名稱。這與 3.14.0 版本不相容,但由於此模組在 3.14 系列中是新的,因此使用應該還不廣泛。
3.14.3¶
新增了
CMAKE_VS_PLATFORM_NAME_DEFAULT
變數,以協助工具鏈檔案使用Visual Studio 16 2019
產生器,其中預設平台現在取決於主機平台。
3.14.4¶
在 CMake 3.14.0 到 3.14.3 版本中,呼叫
target_link_libraries()
以將PRIVATE
相依性新增至另一個目錄中建立的靜態程式庫(在政策CMP0079
NEW
行為下),會不正確地將這些相依性的使用需求傳播給連結靜態程式庫的依賴項目。此問題已修正。此錯誤也存在於 3.13.0 到 3.13.4 版本中,並已在 3.13.5 版本中修正。
3.14.5¶
不再像 CMake 3.14.0 到 3.14.4 版本一樣,將
CPATH
環境變數的項目排除在透過include_directories()
和target_include_directories()
顯式使用之外。
3.14.6¶
3.14.7¶
在 CMake 3.14.0 到 3.14.6 版本中,
EXCLUDE_FROM_ALL
目錄屬性從 3.14 之前的行為回歸,並導致目錄中的目標,即使從其自己的 "all" 中也被排除。此問題已修正。