CMake 3.0 發行說明

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

文件變更

新功能

語法

  • CMake 語言已使用受 Lua 長括號啟發的 括號引數括號註解 語法進行擴展

    set(x [===[bracket argument]===] #[[bracket comment]])
    

    等長開括號和閉括號之間的內容會被視為字面意義,不進行變數替換。

    警告

    此語法變更無法以完全相容的方式進行。由於語法解析發生在任何設定策略的機會之前,因此不可能制定策略。現有程式碼使用以開括號開頭的未引號引數將被不同地解釋,而不會有任何診斷訊息。幸運的是,這種語法足夠晦澀,以至於在實務中不太可能出現此問題。

產生器

  • 新的 CodeLite 額外產生器可用於 Makefile 或 Ninja 產生器。

  • 新的 Kate 額外產生器可用於 Makefile 或 Ninja 產生器。

  • Ninja 產生器學會了在使用新的 JOB_POOLS 全域屬性指定時使用 ninja 工作池。

命令

  • add_library() 命令學到了一個新的 INTERFACE 函式庫類型。介面函式庫沒有建置規則,但可能具有定義 使用需求 的屬性,並且可以安裝、匯出和匯入。這對於建立僅標頭檔函式庫非常有用,這些函式庫對其他函式庫具有具體的連結依賴性。

  • export() 命令學到了一種新的 EXPORT 模式,該模式從由 install(TARGETS) 命令 EXPORT 選項配置的匯出集合中檢索要匯出的目標列表。這使得從建置樹匯出與從安裝樹匯出相同的目標變得容易。

  • export() 命令學會了與多個相依的匯出集合一起工作,從而允許從單個樹建置和匯出多個套件。此功能需要 CMake 等待產生步驟才能寫入輸出檔案。這意味著不應在專案配置期間稍後 include() 產生的目標檔案,因為它將不可用。請改用 別名目標。請參閱策略 CMP0024

  • install(FILES) 命令學會了在檔案列表中支援 產生器表達式

  • project() 命令學會了將一些版本變數設定為由新的 VERSION 選項指定的值或空字串。請參閱策略 CMP0048

  • string() 命令學到了一種新的 CONCAT 模式。它與新的 括號引數 語法結合使用時特別有用。

  • unset() 命令學到了一個與 set() 命令的 PARENT_SCOPE 選項相符的選項。

  • include_external_msproject() 命令學會了處理非 C++ 專案,如 .vbproj.csproj

  • ctest_update() 命令學會了更新由 Perforce (p4) 版本控制工具管理的工作樹。

  • message() 命令學到了一種 DEPRECATION 模式。預設情況下不會發出此類訊息,但如果啟用 CMAKE_WARN_DEPRECATED,則可能會作為警告發出,如果啟用 CMAKE_ERROR_DEPRECATED,則可能會作為錯誤發出。

  • target_link_libraries() 命令現在允許重複使用 LINK_PUBLICLINK_PRIVATE 關鍵字。

變數

屬性

模組

  • CheckTypeSize 模組 check_type_size 巨集和 CheckStructHasMember 模組 check_struct_has_member 巨集學到了一個新的 LANGUAGE 選項,以選擇性地檢查 C++ 類型。

  • ExternalData 模組學會了在本地儲存可用時無需 URL 範本即可工作。

  • ExternalProject 函數 ExternalProject_Add 學到了一個新的 GIT_SUBMODULES 選項,以指定要檢出的可用子模組的子集。

  • 新增了一個新的 FindBacktrace 模組,以支援 find_package(Backtrace) 呼叫。

  • 新增了一個新的 FindLua 模組,以支援 find_package(Lua) 呼叫。

  • FindBoost 模組學到了一個新的 Boost_NAMESPACE 選項,用於變更函式庫名稱上的 boost 前綴。

  • FindBoost 模組學會了使用新的 Boost_USE_DEBUG_RUNTIME 選項來控制對具有 g 標籤(用於 MS 除錯執行階段)的函式庫的搜尋。預設情況下,它為 ON,以保留現有行為。

  • FindJavaFindJNI 模組學會了使用 JAVA_HOME CMake 變數或環境變數,然後在 OS X 上嘗試 /usr/libexec/java_home

  • UseJava 模組 add_jar 函數學到了一個新的 MANIFEST 選項,用於將 -m 選項傳遞給 jar

  • 引入了一個新的 CMakeFindDependencyMacro 模組,其中包含一個 find_dependency 巨集,用於在 套件配置檔案 中尋找可轉移的依賴項目。此類依賴項目被 FeatureSummary 模組的列表省略。

  • FindQt4 模組學會了為 Qt 可執行檔建立 匯入目標。這有助於在使用同一個建置系統中的多個 Qt 版本 時消除歧義。

  • FindRuby 模組學會了搜尋 Ruby 2.0 和 2.1。

產生器表達式

其他

  • cmake(1) -E 選項學到了一個新的 sleep 命令。

  • ccmake(1) 對話方塊學習到可接受 STRINGS 快取條目屬性,以循環遍歷可能值的枚舉列表。

  • cmake-gui(1) 對話方塊學習到可記住工作階段之間的視窗設定。

  • cmake-gui(1) 對話方塊學習到可記住快取條目的類型,以便在 Add Entry 對話方塊中完成。

新的診斷訊息

  • 在匯入目標的 INTERFACE_INCLUDE_DIRECTORIES 目標屬性中命名的目錄,透過 generator expression 有條件地連結,過去不會檢查其是否存在。現在會檢查了。請參閱政策 CMP0027

  • 建置目標名稱現在必須符合有效性模式,並且不得與 CMake 定義的目標衝突。請參閱政策 CMP0037

  • 將自身指定為連結依賴項的建置目標過去會被靜默接受,但現在會診斷出來。請參閱 CMP0038

  • target_link_libraries() 命令過去會靜默忽略將由 add_custom_target() 建立的建置目標指定為其第一個引數的呼叫,但現在會診斷出此錯誤。請參閱政策 CMP0039

  • add_custom_command() 命令過去會靜默忽略使用不存在的目標指定 TARGET 選項的呼叫,但現在會診斷出此錯誤。請參閱政策 CMP0040

  • 如果 INTERFACE_INCLUDE_DIRECTORIES 目標屬性中的相對路徑包含 generator expression,過去會被靜默接受,但現在會被拒絕。請參閱政策 CMP0041

  • get_target_property() 命令學習到可拒絕指定不存在目標的呼叫。請參閱政策 CMP0045

  • add_dependencies() 命令學習到可拒絕指定依賴於不存在目標的呼叫。請參閱政策 CMP0046

  • 連結依賴性分析學習到假設包含 :: 的名稱指的是別名目標匯入目標。如果缺少此類連結目標,現在會產生錯誤。先前在這種情況下,CMake 產生了一個在建置時會失敗的連結行。請參閱政策 CMP0028

  • project()enable_language() 命令初始化對語言的支援時,如果找不到編譯器的完整路徑並且無法將其儲存在對應的 CMAKE_<LANG>_COMPILER 變數中,現在會發生錯誤。這會在最前端產生更友善的錯誤訊息,並在已知沒有可用的工作編譯器時停止處理。

  • 使用 add_library()add_executable() 命令指定的目標來源學習到可拒絕需要未記錄的額外變數擴展層級的項目。請參閱政策 CMP0049

  • 使用 add_custom_command() 未記錄的 SOURCE 簽名現在會導致錯誤。請參閱政策 CMP0050

已棄用和移除的功能

其他變更

  • 版本方案已變更為僅使用兩個元件來表示功能層級,而不是三個。第三個元件現在將用於錯誤修復版本或開發版本的日期。有關詳細資訊,請參閱 CMAKE_VERSION 變數文件。

  • Windows 和 OS X 上 CMake 本身的預設安裝位置不再包含 CMake 版本號碼。這樣可以輕鬆更換,而無需手動重新產生本機建置樹。

  • Visual Studio 10 (2010) 及更高版本的產生器已重新命名為包含產品年份,如同舊版 VS 產生器一樣

    這闡明了哪個產生器對應於哪個 Visual Studio 版本。為了相容性,舊名稱仍然被識別。

  • Apple 提供的 Clang 的 CMAKE_<LANG>_COMPILER_ID 值現在為 AppleClang。它必須與上游 Clang 區分開來,因為版本號碼不同。請參閱政策 CMP0025

  • QNX 上 qccCMAKE_<LANG>_COMPILER_ID 值現在為 QCC。它必須與 GNU 區分開來,因為命令列選項不同。請參閱政策 CMP0047

  • 在 64 位元 OS X 上,CMAKE_HOST_SYSTEM_PROCESSOR 值現在已正確偵測為 x86_64,而不是 i386

  • 在 OS X 上,CMake 學習到預設啟用 MACOSX_RPATH 目標屬性指定的行為。這會啟用使用 @rpath 進行執行階段共用程式庫搜尋。請參閱政策 CMP0042

  • build_command() 命令現在傳回 cmake(1) --build 命令列,而不是直接調用原生建置工具。當使用 Visual Studio 產生器時,CMake 和 CTest 不再需要預先找到 CMAKE_MAKE_PROGRAM。現在會盡可能延遲在解決方案 (.sln) 檔案可用時選擇適當的 msbuild 或 devenv 工具,以便它可以依賴專案內容。

  • cmake(1) --build 命令現在預設與原生建置工具共用其自身的 stdout 和 stderr 管道。曾經啟動此功能的 --use-stderr 選項現在被忽略。

  • $<C_COMPILER_ID:...>$<CXX_COMPILER_ID:...> generator expressions 過去執行不區分大小寫的比較,但現在已更正為執行區分大小寫的比較。請參閱政策 CMP0044

  • 當沒有可用的互動式終端機時(例如使用 Ninja 或 IDE 產生器),內建的 edit_cache 目標將不再預設選擇 ccmake(1)。如果可用,則會優先選擇 cmake-gui(1)

  • ExternalProject 下載步驟學習到在某些情況下重新嘗試下載,以更可靠地應對暫時性的網路故障。

  • FeatureSummary 不再列出遞移依賴項,因為它們不是目前專案直接請求的。

  • cmake-mode.el 主要 Emacs 編輯模式已在多個方面進行清理和增強。

  • 當作為 使用需求 處理時,在 匯入目標INTERFACE_INCLUDE_DIRECTORIES 中指定的包含目錄預設會被視為 SYSTEM 包含。