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_DIRECTORYOUTPUT_NAME。這也修正了對 install() 產生的安裝規則的支援。

    • 現在會遵循來源檔案屬性 INCLUDE_DIRECTORIESCOMPILE_DEFINITIONSCOMPILE_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(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_EXTNAME_WLE 變體,以處理名稱中最後一個 . 之後的副檔名。

  • if() 命令獲得了支援,可以使用 DEFINED CACHE{VAR} 語法檢查是否已定義快取變數。

  • install(CODE)install(SCRIPT) 命令學習了支援產生器表達式。請參閱政策 CMP0087

  • install(TARGETS) 命令學習了如何根據 GNUInstallDirs 模組中的變數和內建預設值,為給定的目標類型安裝到適當的預設目錄,而不是使用 DESTINATION 參數。

  • install(FILES)install(DIRECTORY) 命令學習了一組新的參數,用於將檔案作為檔案類型安裝,根據 GNUInstallDirs 中的適當變數和內建預設值設定目的地,而不是使用 DESTINATION 參數。

  • list() 操作 REMOVE_ITEMREMOVE_DUPLICATESSORTREVERSEFILTER 現在都接受不存在的變數作為列表,因為對空列表的這些操作也是空列表。

  • list() 操作 REMOVE_AT 現在指示給定的索引對於不存在的變數或空列表無效。

  • try_compile()try_run() 命令獲得了一個新的 LINK_OPTIONS 選項。

變數

屬性

模組

  • 用於檢查功能的模組系列(例如 CheckCSourceCompiles)獲得了管理 LINK_OPTIONS 的能力。

  • 新增了 CheckFortranSourceRuns 模組,以提供 check_fortran_source_runs() 命令,以檢查 Fortran 原始碼片段是否可以編譯和執行。

  • CMakePackageConfigHelpers 模組的 write_basic_package_version_file() 命令獲得了一個新的 ARCH_INDEPENDENT 選項,用於支援與架構無關的套件。

  • ExternalProject 模組 ExternalProject_Add() 命令獲得了 LOG_DIRLOG_MERGED_STDOUTERR 選項來控制日誌記錄。

  • ExternalProject 模組 ExternalProject_Add() 命令獲得了 LOG_PATCH 選項,可選擇記錄修補步驟。

  • ExternalProject 模組 ExternalProject_Add() 命令學習了在也使用 BUILD_IN_SOURCE 時應用 SOURCE_SUBDIRBUILD_COMMANDSOURCE_DIR 的給定 SOURCE_SUBDIR 中執行。

  • FetchContent 模組獲得了一個新的 FetchContent_MakeAvailable() 命令。它接受相依性名稱的列表,然後迭代這些名稱,使用標準模式填充每個名稱並將其新增到主建置中。這顯著減少了專案中所需的樣板程式碼量。

  • FindBISON 模組的 BISON_TARGET 命令現在使用 CMAKE_CURRENT_BINARY_DIR 作為工作目錄來執行 bison。請參閱政策 CMP0088

  • FindCURL 模組獲得了支援,可以將協定作為套件組件請求。

  • 新增了 FindFontconfig 模組,以尋找 fontconfig

  • FindGDAL 模組現在提供匯入的目標。

  • FindGIF 模組現在提供匯入的目標。

  • FindGit 模組現在為 Git 可執行檔提供匯入的目標。

  • FindIce 模組學習了尋找 slice2confluenceslice2matlab

  • 新增了 FindLibinput 模組,以尋找 libinput

  • FindLibLZMA 模組現在提供匯入的目標。

  • FindMatlab 模組獲得了新的選項 R2017bR2018a,以指定要使用的 MEX API 版本;這些選項反映了 MATLAB R2018a 中 mex 命令的新選項。MX_LIBRARY 選項不再需要。

  • FindPostgreSQL 模組現在提供匯入的目標。

  • FindPythonFindPython2FindPython3 模組獲得了對 NumPy 組件的支援。

  • FindPython2FindPython3FindPython 模組現在支援在腳本模式下執行,方法是跳過匯入目標和輔助函數的建立。

  • 新增了 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

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)

  • 為政策 CMP0064CMP0065 新增了明確的棄用診斷訊息(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 不再支援透過 ftpscpcpxmlrpc 提交。CDash 是 CTest 唯一維護的測試儀表板,它僅支援透過 httphttps 提交。

其他變更 (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

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

3.14.6

  • 在 CMake 3.14.0 到 3.14.5 版本中,FindBISON 模組政策 CMP0088 NEW 行為意外地將 .y 輸入的相對路徑解釋為相對於建置樹目錄 (build tree directory) 而不是原始碼樹目錄 (source tree directory)。這已被修復。

3.14.7

  • 在 CMake 3.14.0 到 3.14.6 版本中,EXCLUDE_FROM_ALL 目錄屬性從 3.14 之前的行為退化,並導致目錄中的目標即使從其自身的 "all" 中也被排除。這已被修復。