CMake 3.0 發行說明

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

文件變更

新功能

語法

  • CMake 語言已透過受 Lua 長括號啟發的括號參數括號註解語法進行擴充

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

    等長開頭和結尾括號之間的內容會以字面方式擷取,不進行變數替換。

    警告

    此語法變更無法以完全相容的方式進行。因為語法解析發生在任何設定政策的機會之前,所以不可能制定政策。使用以開頭括號開頭的未加引號引數的現有程式碼,將被以不同的方式解譯,而不會有任何診斷。幸運的是,該語法非常晦澀,以至於在實務上不太可能出現此問題。

產生器

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

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

  • 當新的 JOB_POOLS 全域屬性指定時,Ninja 產生器學會使用 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) 版本控制工具所管理的工作樹。

變數

屬性

模組

  • 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。對應的 msbuild 或 devenv 工具的選擇現在盡可能延後,當解決方案(.sln)檔案可用時才會進行,以便它能夠取決於專案內容。

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

  • 用於執行不區分大小寫比較的 $<C_COMPILER_ID:...>$<CXX_COMPILER_ID:...> 產生器 表達式 現在已修正為執行區分大小寫的比較。請參閱原則 CMP0044

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

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

  • FeatureSummary 不再列出傳遞相依性,因為這些相依性並非目前專案直接請求的。

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

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