CMake 3.1 發行說明¶
自 CMake 3.0 以來所做的變更包括以下。
文件變更¶
新增了一個新的
cmake-compile-features(7)
手冊。
新功能¶
產生器¶
新增了
Visual Studio 14 2015
產生器。
Windows Phone 和 Windows Store¶
Visual Studio 11 (2012) 及更高版本的產生器學會了為 Windows Phone 和 Windows Store 產生專案。可以在
CMAKE_SYSTEM_NAME
變數設定為WindowsPhone
或WindowsStore
,在cmake(1)
命令列或在CMAKE_TOOLCHAIN_FILE
中啟用這些平台。同時將CMAKE_SYSTEM_VERSION
設定為8.0
或8.1
來指定目標 Windows 版本。
NVIDIA Nsight Tegra¶
Visual Studio 10 (2010) 及更高版本的產生器學會了為 NVIDIA Nsight Tegra Visual Studio Edition 產生專案。可以在
CMAKE_SYSTEM_NAME
變數設定為Android
,在cmake(1)
命令列或在CMAKE_TOOLCHAIN_FILE
中啟用此平台。
語法¶
指令¶
add_custom_command()
指令學會了在DEPENDS
的引數中解析cmake-generator-expressions(7)
。export(PACKAGE)
指令學會了檢查CMAKE_EXPORT_NO_PACKAGE_REGISTRY
變數,以跳過匯出套件。file(STRINGS)
指令獲得了一個新的ENCODING
選項,以啟用提取UTF-8
字串。find_package()
指令學會了檢查CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY
和CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY
變數,以跳過搜尋套件註冊表。get_property()
指令學習了一個新的INSTALL
屬性範圍。install()
指令學習了一個MESSAGE_NEVER
選項,以避免在安裝期間輸出。set_property()
指令學習了一個新的INSTALL
屬性範圍。string()
指令學習了一個新的UUID
子指令,以產生通用唯一識別碼。新的
target_compile_features()
指令允許填充COMPILE_FEATURES
目標屬性,就像任何其他組建變數一樣。新增了
target_sources()
指令,以新增到SOURCES
目標屬性。
變數¶
Visual Studio 產生器(適用於 8 (2005) 及以上版本)學會從新的
CMAKE_GENERATOR_PLATFORM
變數讀取目標平台名稱,當平台名稱未指定為產生器名稱的一部分時。平台名稱可以在cmake(1)
命令列中使用-A
選項指定,例如-G "Visual Studio 12 2013" -A x64
。CMAKE_GENERATOR_TOOLSET
變數現在可以在由CMAKE_TOOLCHAIN_FILE
變數指定的工具鏈檔案中初始化。這在使用 Xcode 或 Visual Studio 產生器進行交叉編譯時很有用。引入
CMAKE_INSTALL_MESSAGE
變數,以便選擇性地減少安裝輸出。
屬性¶
新的
CXX_STANDARD
和CXX_EXTENSIONS
目標屬性可以指定 CMake 用於計算所需編譯選項的值,例如-std=c++11
或-std=gnu++11
。CMAKE_CXX_STANDARD
和CMAKE_CXX_EXTENSIONS
變數可以設定為初始化目標屬性。新的
C_STANDARD
和C_EXTENSIONS
目標屬性可以指定 CMake 用於計算所需編譯選項的值,例如-std=c11
或-std=gnu11
。CMAKE_C_STANDARD
和CMAKE_C_EXTENSIONS
變數可以設定為初始化目標屬性。新的
COMPILE_FEATURES
目標屬性可以包含編譯目標所需的功能清單。CMake 使用此資訊來確保正在使用的編譯器能夠建置目標,並新增任何必要的編譯標誌以支援語言功能。引入了新的
COMPILE_PDB_NAME
和COMPILE_PDB_OUTPUT_DIRECTORY
目標屬性,以指定 MSVC 編譯器程式資料庫檔案位置 (cl /Fd
)。這補充了現有的PDB_NAME
和PDB_OUTPUT_DIRECTORY
目標屬性,這些屬性指定連結器程式資料庫檔案位置 (link /pdb
)。INTERFACE_LINK_LIBRARIES
目標屬性現在支援$<LINK_ONLY:...>
產生器運算式
。引入了新的
INTERFACE_SOURCES
目標屬性。這由相依目標使用,相依目標會編譯和連結所列出的來源。當在設定時讀取時,如果政策
CMP0051
為NEW
時,SOURCES
目標屬性現在包含產生器運算式
,例如TARGET_OBJECTS
。SOURCES
目標屬性現在普遍支援產生器運算式
。產生器運算式可以在add_library()
和add_executable()
命令中使用。現在可以寫入和附加到
SOURCES
目標屬性。CMAKE_DEBUG_TARGET_PROPERTIES
變數可以用於追蹤來源的來源。新增了
VS_DEPLOYMENT_CONTENT
來源檔案屬性,以告知 Visual Studio 產生器在 Windows Phone 和 Windows Store 專案中標記要部署的內容。新增了
VS_DEPLOYMENT_LOCATION
來源檔案屬性,以告知 Visual Studio 產生器在 Windows Phone 和 Windows Store 專案中標記要部署的內容的相對位置。建立了
VS_WINRT_COMPONENT
目標屬性,以告知 Visual Studio 產生器將共用程式庫編譯為 Windows Runtime (WinRT) 元件。Xcode
產生器學會檢查來源檔案屬性XCODE_EXPLICIT_FILE_TYPE
和XCODE_LAST_KNOWN_FILE_TYPE
,以取得自訂 Xcode 檔案參考類型。
模組¶
cpack(1)
新增了IFW
產生器,可使用 Qt Framework Installer 工具進行封裝。請參閱CPack IFW Generator
。cpack(1)
新增了7Z
和TXZ
產生器,支援 lzma 壓縮封存檔。CPack DEB Generator
學習了一個新的CPACK_DEBIAN_COMPRESSION_TYPE
變數,用於設定 tarball 壓縮類型。CPack WIX Generator
學習支援CPACK_WIX_ACL
安裝檔案屬性,以指定存取控制列表。
其他¶
cmake(1)
-E
選項新增了env
命令。cmake(1)
-E tar
命令學習支援 lzma 壓縮檔案。物件程式庫現在可以擁有額外的原始碼,這些原始碼不會編譯成物件檔案,只要它們不會影響一般程式庫的連結(例如,
.dat
可以,但.def
不行)。適用於 VS 8 及更新版本的 Visual Studio 產生器學習支援
ASM_MASM
語言。Visual Studio 產生器學習將
.hlsl
原始碼檔案視為高階著色語言原始碼(在.vcxproj
檔案中使用FXCompile
)。新增了原始碼檔案屬性VS_SHADER_TYPE
、VS_SHADER_MODEL
和VS_SHADER_ENTRYPOINT
,以指定著色器類型、模型和進入點名稱。
新的診斷¶
引入了政策
CMP0052
,以控制匯出目標的INTERFACE_INCLUDE_DIRECTORIES
中的目錄。
已棄用和移除的功能¶
在 CMake 3.0 中,
target_link_libraries()
命令意外開始允許未加引號的參數使用包含以(;
分隔)列表的產生器 表達式
。例如set(libs B C) target_link_libraries(A PUBLIC $<BUILD_INTERFACE:${libs}>)
這等同於寫入
target_link_libraries(A PUBLIC $<BUILD_INTERFACE:B C>)
而且從未打算要這樣運作。它在 CMake 2.8.12 中無法運作。此類產生器表達式應放在帶引號的參數中
set(libs B C) target_link_libraries(A PUBLIC "$<BUILD_INTERFACE:${libs}>")
CMake 3.1 再次要求使用引號才能使其正確運作。
在 CMake 3.1 之前,Makefile 產生器並未正確逸出在產生之 makefile 中使用的 make 變數指派內的
#
,導致它們被視為註解。這使得如下程式碼add_compile_options(-Wno-#pragma-messages)
在 Makefile 產生器中無法運作,但在其他產生器中可以運作。現在它已正確逸出,使行為在各個產生器中保持一致。但是,有些專案可能已嘗試使用如下程式碼來解決原始錯誤
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-\\#pragma-messages")
這為 Makefile 產生器新增了所需的逸出,但也導致其他產生器將
-Wno-\#pragma-messages
傳遞給 shell,這僅在 POSIX shell 中有效。不幸的是,無法以相容的方式進行逸出修復,因此這種平台和產生器特定的變通方法不再有效。專案程式碼可以測試CMAKE_VERSION
變數值,以使變通方法也具有版本特定性。當設定未記錄的
CMAKE_ALLOW_UNKNOWN_VARIABLE_READ_ACCESS
變數時,variable_watch()
命令建立的回呼將不再接收ALLOWED_UNKNOWN_READ_ACCESS
存取類型。未初始化的變數存取將一律回報為UNKNOWN_READ_ACCESS
。CMakeDetermineVSServicePack
模組現在警告說它已棄用,不應再使用。請改用CMAKE_<LANG>_COMPILER_VERSION
變數。已完全移除
FindITK
模組。它是find_package(ITK ... NO_MODULE)
周圍的薄包裝函式。當找不到 ITK 時,這會產生更清晰的錯誤訊息。已完全移除
FindVTK
模組。它是find_package(VTK ... NO_MODULE)
周圍的薄包裝函式。當找不到 VTK 時,這會產生更清晰的錯誤訊息。該模組還提供尋找 VTK 4.0 的相容性支援。此功能已捨棄。
其他變更¶
cmake-gui(1)
學習擷取由execute_process()
命令啟動的子進程的輸出,並將其顯示在輸出視窗中。已最佳化
cmake-language(7)
的產生器表達式和清單展開剖析器的內部實作,並在大型專案上顯示出顯著的加速。Makefile 產生器學習在 Windows 上使用 GNU 工具的回應檔,將程式庫目錄和名稱傳遞給連結器。
產生連結器命令列時,CMake 現在會避免重複對應於 SHARED 程式庫目標的項目。
對 Open Watcom 編譯器的支援已全面翻新。
CMAKE_<LANG>_COMPILER_ID
現在是OpenWatcom
,而CMAKE_<LANG>_COMPILER_VERSION
現在使用 Open Watcom 的外部版本編號。外部版本號比內部版本號低 11。cmake-mode.el
這個 Emacs 主要編輯模式不再將_
視為單字的一部分,使其與其他主要模式更加一致。