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) 版本控制工具管理的工作樹。message()
命令學到了一種DEPRECATION
模式。預設情況下不會發出此類訊息,但如果啟用CMAKE_WARN_DEPRECATED
,則可能會作為警告發出,如果啟用CMAKE_ERROR_DEPRECATED
,則可能會作為錯誤發出。target_link_libraries()
命令現在允許重複使用LINK_PUBLIC
和LINK_PRIVATE
關鍵字。
變數¶
引入了變數
CMAKE_FIND_NO_INSTALL_PREFIX
,以告知 CMake 不要將CMAKE_INSTALL_PREFIX
的值預設新增到CMAKE_SYSTEM_PREFIX_PATH
變數。當建置安裝自身某些依賴項目的專案以避免找到即將被取代的檔案時,這非常有用。引入了變數
CMAKE_STAGING_PREFIX
,用於交叉編譯時指定主機系統上的安裝前綴,該前綴與用於目標系統的CMAKE_INSTALL_PREFIX
值不同。引入了變數
CMAKE_SYSROOT
,以指定工具鏈 SDK 安裝前綴,通常用於交叉編譯。這用於將--sysroot
選項傳遞給編譯器,並作為find_*
命令搜尋的前綴。引入了變數
CMAKE_<LANG>_COMPILER_TARGET
,用於交叉編譯時在由CMAKE_TOOLCHAIN_FILE
變數指定的 工具鏈檔案 中指定目標平台。這用於將諸如--target=<triple>
之類的選項傳遞給某些交叉編譯器驅動程式。引入了變數
CMAKE_MAP_IMPORTED_CONFIG_<CONFIG>
,以選擇性地初始化MAP_IMPORTED_CONFIG_<CONFIG>
目標屬性。
屬性¶
ADDITIONAL_MAKE_CLEAN_FILES
目錄屬性學會了支援產生器表達式
。引入了一個新的目錄屬性
CMAKE_CONFIGURE_DEPENDS
,以允許專案指定配置過程所依賴的其他檔案。當這些檔案之一被修改時,CMake 將在建置時重新執行。以前,這只能透過將此類檔案指定為configure_file()
命令的輸入來實現。新的 AUTORCC 功能取代了調用
qt4_add_resources()
的需求,允許將.qrc
檔案列為目標來源。新的 AUTOUIC 功能取代了調用
qt4_wrap_ui()
的需求。測試屬性學會了支援
產生器表達式
。這對於為測試屬性(如REQUIRED_FILES
和WORKING_DIRECTORY
)指定每個配置的值非常有用。引入了一個新的
SKIP_RETURN_CODE
測試屬性,以告知ctest(1)
將特定的測試傳回碼視為測試未執行。這對於測試驅動程式報告某些測試需求不可用非常有用。引入了新的 相容介面屬性 類型,即
COMPATIBLE_INTERFACE_NUMBER_MAX
和COMPATIBLE_INTERFACE_NUMBER_MIN
,分別用於計算數值最大值和最小值。
模組¶
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
,以保留現有行為。FindJava
和FindJNI
模組學會了使用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
命令。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
。
已棄用和移除的功能¶
已移除支援為 2.4 之前 CMake 版本編寫的程式碼的相容性選項。
透過政策,新的程式碼中已不允許數個早已過時且不應再呼叫的命令
政策
CMP0029
不允許subdir_depends()
政策
CMP0030
不允許use_mangled_mesa()
政策
CMP0031
不允許load_command()
政策
CMP0032
不允許output_required_files()
政策
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
目標屬性,並使用generator expressions
,例如$<CONFIG:...>
,以指定每個組態的定義。請參閱政策CMP0043
。不應再從非 IMPORTED 目標讀取
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
。現在會盡可能延遲在解決方案 (.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
包含。