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 選項,以變更寫入到產生匯出標頭的包含保護符號的名稱。此外,它現在會在產生的匯出標頭的包含保護上的結束 #endif 之後新增註解。

  • UseJava 模組 add_jar 命令獲得 GENERATE_NATIVE_HEADERS 選項,以針對 javac 1.8 或以上版本使用 javac -h 產生原生標頭檔。這取代了 create_javah,由於 JEP 313 移除了 javah 工具,因此 create_javah 不再適用於 JDK 1.10 和以上版本。

自動產生

  • 當使用 AUTOMOCAUTOUIC 時,CMake 現在啟動多個平行 mocuic 處理程序以減少建置時間。可以設定新的 CMAKE_AUTOGEN_PARALLEL 變數和 AUTOGEN_PARALLEL 目標屬性,以指定要啟動的平行 mocuic 處理程序的數量。預設值衍生自主機上的 CPU 數量。

CTest

CPack

其他

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

  • 介面函式庫 現在可以在其上設定自訂屬性,如果它們以底線 (_) 或小寫 ASCII 字元開頭。最初的意圖是僅允許對 INTERFACE 函式庫有意義的屬性,但它也阻止了自訂屬性的使用。

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

已棄用和移除的功能

  • 已為政策 CMP0037CMP0054 新增明確的棄用診斷訊息(CMP0036 及更早的版本已棄用)。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

  • CheckIncludeFile 模組 check_include_file 巨集、CheckIncludeFileCXX 模組 check_include_file_cxx 巨集和 CheckIncludeFiles 模組 check_include_files 巨集被教導要在 CMake 3.11.0 中遵循 CMAKE_REQUIRED_LIBRARIES 變數。由於變更了現有專案的檢查行為,因此已還原此功能。未來可能會透過相容性政策恢復此功能。

3.11.2

  • 呼叫 add_library() 以建立非全域可見的匯入目標的別名,現在再次導致錯誤,就像 3.11.0 之前的版本一樣。此診斷訊息在 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 磁碟機上的損壞,此功能已被還原。