CMake 3.11 發行說明

自 CMake 3.10 以來所做的變更包括以下。

新功能

平台

  • Ninja 產生器現在支援 TI C/C++ 編譯器。

產生器

命令

變數

屬性

模組

  • CheckIncludeFiles 模組的 CHECK_INCLUDE_FILES() 命令新增了 LANGUAGE 選項,用於指定是要使用 CCXX 編譯器來進行檢查。

  • CMakePackageConfigHelpers 模組的 write_basic_package_version_file() 命令針對 COMPATIBILITY 引數新增了 SameMinorVersion 模式。

  • ExternalProject 模組學會了在註解、命令、工作目錄和副產品中替換 <DOWNLOAD_DIR>

  • ExternalProject 模組新增了 NETRCNETRC_FILE 選項,用於指定使用 .netrc 檔案。

  • 新增了 FetchContent 模組,支援使用 ExternalProject_Add() 支援的任何下載/更新方法,在組態時填入內容。這樣就能在組態階段立即使用內容,例如使用 add_subdirectory() 等。完善支援階層式專案結構,允許父專案覆寫子專案的內容詳細資料,並確保在整個專案樹狀結構中不會多次填入內容。

  • FindBLASFindLAPACK 模組學會支援 FLAME blislibflame

  • FindDoxygen 模組的 doxygen_add_docs() 函數現在支援新的 DOXYGEN_VERBATIM_VARS 清單變數。包含在該清單中的任何 DOXYGEN_... 變數都會略過自動引號邏輯,在將其傳輸到輸出 Doxyfile 時保持其內容不變。

  • 新增 FindIconv 模組以尋找 iconv 支援。

  • GenerateExportHeader 模組的 GENERATE_EXPORT_HEADER 命令新增了 INCLUDE_GUARD_NAME 選項,以變更寫入產生的匯出標頭的 include guard 符號名稱。此外,它現在會在產生的匯出標頭 include guard 的結尾 #endif 後面新增註解。

  • UseJava 模組的 add_jar 命令新增了 GENERATE_NATIVE_HEADERS 選項,以便使用 javac -hjavac 1.8 或更高版本產生原生標頭檔。這取代了 create_javah,由於 JEP 313 移除了 javah 工具,因此不再適用於 JDK 1.10 及更高版本。

Autogen

  • 當使用 AUTOMOCAUTOUIC 時,CMake 現在會啟動多個平行 mocuic 處理程序以縮短建置時間。可以設定新的 CMAKE_AUTOGEN_PARALLEL 變數和 AUTOGEN_PARALLEL 目標屬性,以指定要啟動的平行 mocuic 處理程序數量。預設值是從主機上的 CPU 數量推導而來。

CTest

CPack

其他

  • 別名目標 現在可以將使用 GLOBAL 選項以 add_library() 建立的 匯入目標 設定為別名。

  • 如果 介面程式庫 的自訂屬性以底線 (_) 或小寫 ASCII 字元開頭,現在可以設定這些屬性。最初的目的是僅允許適用於 INTERFACE 程式庫的屬性,但這也阻礙了自訂屬性的使用。

  • 新增了 cmake(1) --open <dir> 命令列選項,以開啟產生的 IDE 專案,例如 Visual Studio 解決方案或 Xcode 專案。

已棄用和移除的功能

  • 針對原則 CMP0037CMP0054CMP0036 和以下版本已棄用)新增了明確的棄用診斷。cmake-policies(7) 手冊說明了所有原則的舊有行為都已棄用,專案應移植到新的行為。

  • 已移除 KDevelop3 產生器。

其他變更

  • 原則 CMP0037 不再保留與選用功能相關聯的目標名稱,例如 testpackage,除非已啟用對應的功能。

  • FindOpenGL 模組現在會優先使用可用的 GLVND 程式庫。請參閱原則 CMP0072

  • CMAKE_OSX_DEPLOYMENT_TARGET 變數中設定的最低部署目標過去僅適用於 macOS,無論選取的 SDK 為何。現在,它會根據 CMAKE_OSX_SYSROOT 選取的目標平台正確設定。例如,如果 sysroot 變數指定 iOS SDK,則 CMAKE_OSX_DEPLOYMENT_TARGET 中的值會被解譯為最低 iOS 版本。

  • Xcode 產生器行為(每個 project() 命令產生一個專案檔)現在可以使用 CMAKE_XCODE_GENERATE_TOP_LEVEL_PROJECT_ONLY 變數來控制。這對於加速大型專案的 CMake 產生步驟以及解決 ZERO_CHECK 邏輯中的錯誤可能很有用。

  • 由於 CMakeCache.txt 格式不支援值中的換行符號,因此現在會將包含換行符號的值截斷,然後再寫入檔案。此外,會在快取檔案中寫入警告註解,並在主控台上向使用者顯示警告訊息。

更新

自 CMake 3.11.0 以來所做的變更包括以下內容。

3.11.1

  • 在 CMake 3.11.0 中,CheckIncludeFile 模組的 check_include_file 巨集、CheckIncludeFileCXX 模組的 check_include_file_cxx 巨集,以及 CheckIncludeFiles 模組的 check_include_files 巨集,被修改為會參考 CMAKE_REQUIRED_LIBRARIES 變數。但因為這項改動會改變現有專案的檢查行為,所以已被還原。未來可能會透過相容性政策重新加入。

3.11.2

  • 如同 3.11.0 之前的版本,現在呼叫 add_library() 來建立一個非全域可見的匯入目標的別名,會再次造成錯誤。這個診斷功能在 CMake 3.11.0 和 3.11.1 中被意外地移除了,因為修改允許全域可見的匯入目標被建立別名。

  • FindQt4 模組的 qt4_wrap_cppqt4_wrap_uiqt4_add_resources 巨集現在會在它們產生的檔案上設定 SKIP_AUTOMOCSKIP_AUTOUIC。這些檔案不需要被 moc 或 uic 處理,為了符合政策 CMP0071,我們必須明確地聲明。

3.11.3

  • CMake 3.11.0 引入了在 Windows 上解析符號連結的功能,這個功能通常只在 UNIX 上執行。由於在 subst 磁碟機上出現問題,此功能已被還原。