CMake 3.0 發行說明¶
自 CMake 2.8.12 以來所做的變更包括以下內容。
文件變更¶
CMake 文件已轉換為 reStructuredText,現在透過 Sphinx (https://sphinx-doc.dev.org.tw) 轉換為 man 和 html 頁面。這讓文件可以正確地建立索引並包含交叉參照。
從舊的內部文件格式轉換是由自動程序完成的,因此某些文件可能仍然包含人為錯誤。它們會隨著時間的推移逐步更新。
已實作基本 reStructuredText 處理器,以支援
cmake --help-command
和類似的命令列選項。新增了新的手冊
cmake-commands(7)
,取代cmakecommands(1)
和cmakecompat(1)
cmake-modules(7)
,取代cmakemodules(1)
cmake-policies(7)
,取代cmakepolicies(1)
cmake-properties(7)
,取代cmakeprops(1)
cmake-variables(7)
,取代cmakevars(1)
CMake 3.0.0 及更高版本的發行說明現在將包含在 html 文件中。
新功能¶
語法¶
產生器¶
命令¶
add_library()
命令學習了一種新的INTERFACE
程式庫類型。介面程式庫沒有建置規則,但可能有定義用法 需求
的屬性,並且可以安裝、匯出和匯入。這對於建立對其他程式庫具有具體連結相依性的僅標頭程式庫非常有用。export()
命令學習了一種新的EXPORT
模式,該模式從install(TARGETS)
命令EXPORT
選項所設定的匯出集中擷取要匯出的目標清單。這使得從建置樹匯出與從安裝樹匯出的相同目標變得容易。export()
命令學習與多個相依的匯出集一起使用,因此允許從單一樹建置和匯出多個套件。此功能需要 CMake 等待產生步驟來寫入輸出檔。這表示不應在專案設定期間稍後include()
產生的目標檔,因為它將不可用。請改用別名目標。請參閱政策CMP0024
。install(FILES)
命令學習支援檔案清單中的產生器 表達式
。project()
命令學習將某些版本變數設定為新VERSION
選項指定的值,或設定為空字串。請參閱政策CMP0048
。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 2.4 之前版本編寫的程式碼提供支援的相容性選項。
一些長期過時且不應再呼叫的命令已透過政策禁止在新程式碼中使用。
政策
CMP0029
禁止使用subdir_depends()
政策
CMP0030
禁止使用use_mangled_mesa()
政策
CMP0031
禁止使用load_command()
政策
CMP0032
禁止使用output_required_files()
政策
CMP0033
禁止使用export_library_dependencies()
政策
CMP0034
禁止使用utility_source()
政策
CMP0035
禁止使用variable_requires()
政策
CMP0036
禁止使用build_name()
已移除
cmake(1)
的-i
精靈模式。請改用互動式對話方塊,例如ccmake(1)
或使用-D
選項從命令列設定快取值。已移除支援命令列選項(例如
--help-man
和--help-html
)的內建文件格式器,改用上述新文件系統。這些和曾經用於產生 man 和 html 格式頁面的其他命令列選項不再有效。cmake(1)
--help-custom-modules
選項現在會在執行時產生警告,並產生一份報告此限制的最小文件。已棄用
COMPILE_DEFINITIONS_<CONFIG>
目錄屬性和COMPILE_DEFINITIONS_<CONFIG>
目標屬性。請改為設定對應的COMPILE_DEFINITIONS
目錄屬性或COMPILE_DEFINITIONS
目標屬性,並使用產生器 運算式
,例如$<CONFIG:...>
來指定每個組態的定義。請參閱政策CMP0043
。不應再從非匯入的目標讀取
LOCATION
目標屬性。在多組態產生器中,由於在設定專案時不知道建置組態,因此沒有意義。它已被$<TARGET_FILE>
產生器運算式取代。請參閱政策CMP0026
。COMPILE_FLAGS
目標屬性現在被記錄為已棄用,但不會發出警告。請改用COMPILE_OPTIONS
目標屬性或target_compile_options()
命令。GenerateExportHeader
模組add_compiler_export_flags
函式現在已棄用。它已被<LANG>_VISIBILITY_PRESET
和VISIBILITY_INLINES_HIDDEN
目標屬性取代。
其他變更¶
版本架構已變更為僅使用兩個組件來表示功能層級,而非三個。第三個組件現在將用於錯誤修復版本或開發版本的日期。詳情請參閱
CMAKE_VERSION
變數的文件。在 Windows 和 OS X 上,CMake 本身的預設安裝位置不再包含 CMake 版本號。這樣可以方便地進行替換,而無需手動重新產生本機建置樹。
Visual Studio 10 (2010) 及更高版本的產生器已重新命名,以包含產品年份,如同較舊 VS 版本的產生器一樣。
Visual Studio 10
->Visual Studio 10 2010
Visual Studio 11
->Visual Studio 11 2012
Visual Studio 12
->Visual Studio 12 2013
這可以釐清每個 Visual Studio 版本對應的產生器。為了相容性,舊名稱仍然可被識別。
Apple 提供的 Clang 的
CMAKE_<LANG>_COMPILER_ID
值現在是AppleClang
。由於版本號碼不同,它必須與上游的 Clang 區分開來。請參閱原則CMP0025
。QNX 上的
qcc
的CMAKE_<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
包含。