CMake 3.14 發行說明¶
自 CMake 3.13 以來所做的變更包括以下內容。
新功能¶
產生器¶
新增了
Visual Studio 16 2019
產生器。這是實驗性的,並且基於 “Visual Studio 2019 Preview 4”,因為此版本的 VS 尚未發布。VS 2019 產生器與早期版本的產生器不同之處在於,它不提供在產生器名稱中指定目標平台的變體。而是必須使用
CMAKE_GENERATOR_PLATFORM
,例如透過-A
命令列選項。此外,預設目標平台(架構)現在基於主機平台。VS 主機工具組選擇現在也基於主機架構。已更新
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
。install(TARGETS)
命令學習了如何根據GNUInstallDirs
模組中的變數和內建預設值,為給定的目標類型安裝到適當的預設目錄,而不是使用DESTINATION
參數。install(FILES)
和install(DIRECTORY)
命令學習了一組新的參數,用於將檔案作為檔案類型安裝,根據GNUInstallDirs
中的適當變數和內建預設值設定目的地,而不是使用DESTINATION
參數。list()
操作REMOVE_ITEM
、REMOVE_DUPLICATES
、SORT
、REVERSE
和FILTER
現在都接受不存在的變數作為列表,因為對空列表的這些操作也是空列表。list()
操作REMOVE_AT
現在指示給定的索引對於不存在的變數或空列表無效。try_compile()
和try_run()
命令獲得了一個新的LINK_OPTIONS
選項。
變數¶
新增了
CMAKE_BUILD_RPATH_USE_ORIGIN
變數和對應的BUILD_RPATH_USE_ORIGIN
目標屬性,以啟用相對執行時期路徑 (RPATH) 的使用。這有助於實現可重新定位且可重現的建置,這些建置與建置目錄無關。為 Visual Studio 產生器 新增了
CMAKE_VS_PLATFORM_NAME_DEFAULT
變數,以報告未明確設定CMAKE_GENERATOR_PLATFORM
時使用的預設平台。
屬性¶
新增了
CMAKE_ROLE
全域屬性,允許腳本確定它們是在專案模式、腳本模式、find-package 模式、CTest 還是 CPack 中執行。現在共享程式庫、模組程式庫和可執行目標支援
CUDA_RESOLVE_DEVICE_SYMBOLS
目標屬性。先前僅在靜態程式庫上遵循此屬性。建立了
EXCLUDE_FROM_ALL
目標屬性,以覆寫其目錄的設定。如果目標的EXCLUDE_FROM_ALL
屬性設定為OFF
,即使其包含目錄標記為EXCLUDE_FROM_ALL
,目標也將作為 “all” 的一部分建置。INTERFACE_POSITION_INDEPENDENT_CODE
目標屬性獲得了對產生器表達式
的支援。
模組¶
用於檢查功能的模組系列(例如
CheckCSourceCompiles
)獲得了管理LINK_OPTIONS
的能力。新增了
CheckFortranSourceRuns
模組,以提供check_fortran_source_runs()
命令,以檢查 Fortran 原始碼片段是否可以編譯和執行。CMakePackageConfigHelpers
模組的write_basic_package_version_file()
命令獲得了一個新的ARCH_INDEPENDENT
選項,用於支援與架構無關的套件。ExternalProject
模組ExternalProject_Add()
命令獲得了LOG_DIR
和LOG_MERGED_STDOUTERR
選項來控制日誌記錄。ExternalProject
模組ExternalProject_Add()
命令獲得了LOG_PATCH
選項,可選擇記錄修補步驟。ExternalProject
模組ExternalProject_Add()
命令學習了在也使用BUILD_IN_SOURCE
時應用SOURCE_SUBDIR
。BUILD_COMMAND
在SOURCE_DIR
的給定SOURCE_SUBDIR
中執行。FetchContent
模組獲得了一個新的FetchContent_MakeAvailable()
命令。它接受相依性名稱的列表,然後迭代這些名稱,使用標準模式填充每個名稱並將其新增到主建置中。這顯著減少了專案中所需的樣板程式碼量。FindBISON
模組的BISON_TARGET
命令現在使用CMAKE_CURRENT_BINARY_DIR
作為工作目錄來執行bison
。請參閱政策CMP0088
。FindCURL
模組獲得了支援,可以將協定作為套件組件請求。新增了
FindFontconfig
模組,以尋找 fontconfig。FindGDAL
模組現在提供匯入的目標。FindGIF
模組現在提供匯入的目標。FindGit
模組現在為 Git 可執行檔提供匯入的目標。FindIce
模組學習了尋找slice2confluence
和slice2matlab
。新增了
FindLibinput
模組,以尋找 libinput。FindLibLZMA
模組現在提供匯入的目標。FindMatlab
模組獲得了新的選項R2017b
和R2018a
,以指定要使用的 MEX API 版本;這些選項反映了 MATLAB R2018a 中mex
命令的新選項。MX_LIBRARY
選項不再需要。FindPostgreSQL
模組現在提供匯入的目標。FindPython
、FindPython2
和FindPython3
模組獲得了對NumPy
組件的支援。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
模組提供了匯入目標 (imported targets)。UseSWIG
模組學會了將-module <module_name>
傳遞給SWIG
編譯器,如果檔案屬性SWIG_MODULE_NAME
有定義的話。請參閱政策CMP0086
。UseSWIG
模組新增了一個選項,可以指定SWIG
原始檔副檔名。
產生器表達式 (Generator Expressions)¶
新增了
$<Fortran_COMPILER_ID:...>
和$<Fortran_COMPILER_VERSION:...>
generator expressions
(產生器表達式)。$<IN_LIST:...>
產生器表達式現在可以正確地處理空參數。詳情請參閱CMP0085
。
Autogen¶
新增了
AUTOMOC_EXECUTABLE
、AUTORCC_EXECUTABLE
和AUTOUIC_EXECUTABLE
目標屬性。它們都接受一個可執行檔的路徑,並強制 automoc/autorcc/autouic 使用此可執行檔。設定這些屬性也會阻止在配置 (configure) 時測試這些可執行檔。當您自行建置這些工具時,這特別有用。
新增了變數
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 target) 依賴項轉發到對應的 <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
參數。
已棄用和移除的功能 (Deprecated and Removed Features)¶
為政策
CMP0064
和CMP0065
新增了明確的棄用診斷訊息(CMP0063
和更早的版本已經被棄用)。cmake-policies(7)
手冊說明了所有政策的舊有 (OLD) 行為都已被棄用,專案應移植到新的 (NEW) 行為。Xcode
產生器已棄用對 Xcode 5 之前版本的支援。對這些版本的支援將在未來版本的 CMake 中移除。FindQt
模組不再被find_package()
命令作為尋找模組 (find module) 使用。這允許 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
提交。
其他變更 (Other Changes)¶
已修復物件程式庫連結,以將物件程式庫的私有連結程式庫 (private link libraries) 傳播到使用目標 (consuming targets)。
在
add_subdirectory()
下的安裝規則現在與呼叫目錄中的規則交錯 (interleave)。詳情請參閱政策CMP0082
。CMake 現在強制執行最大遞迴限制,以防止在無限遞迴的腳本上發生堆疊溢位。該限制可以在運行時使用
CMAKE_MAXIMUM_RECURSION_DEPTH
進行調整。當透過
CMAKE_<LANG>_CPPCHECK
變數或<LANG>_CPPCHECK
屬性使用 cppcheck 時,如果cppcheck
傳回非零值(根據其命令行選項配置),建置將會失敗。當設定
POSITION_INDEPENDENT_CODE
時,現在會新增管理位置獨立可執行檔 (Position Independent Executable) 所需的連結選項。專案負責使用CheckPIESupported
模組來檢查PIE
支援,以確保POSITION_INDEPENDENT_CODE
目標屬性在連結可執行檔時會被遵循。此行為由政策CMP0083
控制。適用於 VS 2010 及更高版本的 Visual Studio 產生器 學會了支援透過
add_custom_target()
建立的目標上的VS_DEBUGGER_*
屬性。CPack
模組不再預設為CPACK_DEBIAN_ARCHIVE_TYPE
變數中的paxr
值,因為dpkg
從未支援 PAX tar 格式。paxr
值將會對應到gnutar
,並發出棄用訊息。如果
install(TARGETS)
命令中列出的目標將其EXCLUDE_FROM_ALL
屬性設定為 true,CMake 不再發出警告。
更新 (Updates)¶
自 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
變數,以協助工具鏈檔案 (toolchain files) 與Visual Studio 16 2019
產生器一起運作,其中預設平台現在取決於主機平台。
3.14.4¶
在 CMake 3.14.0 到 3.14.3 版本中,呼叫
target_link_libraries()
以將PRIVATE
依賴項新增到另一個目錄中建立的靜態程式庫(在政策CMP0079
NEW
行為下)會錯誤地將這些依賴項的使用需求傳播到連結該靜態程式庫的依賴項 (dependents)。這已被修復。該錯誤也存在於 3.13.0 到 3.13.4 版本中,並已在 3.13.5 版本中修復。
3.14.5¶
CPATH
環境變數的條目 (entries) 不再像 CMake 3.14.0 到 3.14.4 版本中那樣,被排除在透過include_directories()
和target_include_directories()
顯式使用。
3.14.6¶
3.14.7¶
在 CMake 3.14.0 到 3.14.6 版本中,
EXCLUDE_FROM_ALL
目錄屬性從 3.14 之前的行為退化,並導致目錄中的目標即使從其自身的 "all" 中也被排除。這已被修復。