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()
指令新增了一個新的GENEX_STRIP
子指令,用於移除generator expression
。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:...>
generator expression
。引入了一個新的
INTERFACE_SOURCES
目標屬性。 這由相依目標使用,這些目標編譯和連結列出的來源。如果政策
CMP0051
為NEW
,則SOURCES
目標屬性現在在配置時讀取時包含generator expression
,例如TARGET_OBJECTS
。SOURCES
目標屬性現在通常支援generator expression
。 產生器表達式可以用於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 檔案參考類型。
模組¶
BundleUtilities 模組已學會在 OS X 上解析和取代
@rpath
佔位符,以正確地捆綁使用它們的應用程式。CMakePackageConfigHelpers 模組
configure_package_config_file()
指令新增了一個新的INSTALL_PREFIX
選項,以產生用於CMAKE_INSTALL_PREFIX
以外前綴的套件組態檔。新增了 CheckFortranSourceCompiles 模組以提供
CHECK_Fortran_SOURCE_COMPILES
巨集。ExternalData 模組已學會容忍對遺失來源檔案的
DATA{}
參考,並發出警告,而不是以錯誤拒絕它。 這有助於開發人員編寫新的DATA{}
參考,以測試尚未建立的參考輸出。ExternalProject 模組已學會支援帶有
.7z
、.tar.xz
和.txz
副檔名的 lzma 壓縮來源 tarball。ExternalProject 模組
ExternalProject_Add
指令新增了一個BUILD_ALWAYS
選項,以使外部專案建置步驟在每次建置主機專案時執行。ExternalProject 模組
ExternalProject_Add
指令新增了一個EXCLUDE_FROM_ALL
選項,以使外部專案目標設定EXCLUDE_FROM_ALL
目標屬性。ExternalProject 模組
ExternalProject_Add_Step
指令新增了一個EXCLUDE_FROM_MAIN
選項,以使步驟不成為主要外部專案目標的直接相依性。ExternalProject 模組
ExternalProject_Add
指令新增了一個DOWNLOAD_NO_PROGRESS
選項,以在下載來源 tarball 時停用進度輸出。FeatureSummary 模組
feature_summary
API 已學會接受WHAT
選項的多個值並適當地組合它們。FindCUDA 模組已學會支援
fatbin
和cubin
模組。FindGTest 模組
gtest_add_tests
巨集新增了一個AUTO
選項,以自動讀取測試可執行檔的SOURCES
目標屬性,並掃描來源檔案以新增測試。FindGLEW 模組現在提供匯入的目標。
FindGLUT 模組現在提供匯入的目標。
FindHg 模組新增了一個
Hg_WC_INFO
巨集,以協助執行hg
來提取有關 Mercurial 工作副本的資訊。已導入
FindOpenCL
模組。FindOpenMP
模組已學會支援 Fortran 語言。FindPkgConfig
模組已學會使用PKG_CONFIG
環境變數值作為pkg-config
執行檔,如果已設定的話。已導入
FindXercesC
模組。FindZLIB
模組現在提供匯入目標。GenerateExportHeader
模組的generate_export_header
函數已學會允許與 物件函式庫 一起使用。InstallRequiredSystemLibraries
模組新增了一個CMAKE_INSTALL_OPENMP_LIBRARIES
選項,用於安裝 MSVC OpenMP 執行階段函式庫。UseSWIG
模組已學會從.i
原始碼檔案偵測模組名稱(如果可能),以避免需要明確設定SWIG_MODULE_NAME
原始碼檔案屬性。新增了
WriteCompilerDetectionHeader
模組,以允許建立用於編譯器可選功能偵測的可攜式標頭檔。
產生器表達式¶
新的
COMPILE_FEATURES
產生器 表達式
允許根據可用的編譯器功能設定建置屬性。
CTest¶
ctest_coverage()
命令已學會讀取變數CTEST_COVERAGE_EXTRA_FLAGS
以設定CoverageExtraFlags
。ctest_coverage()
命令已學會使用codecov
工具來支援 Intel 覆蓋率檔案。ctest_memcheck()
命令已學會支援 Sanitizer 模式,包括AddressSanitizer
、MemorySanitizer
、ThreadSanitizer
和UndefinedBehaviorSanitizer
。可以使用新的CTEST_MEMORYCHECK_SANITIZER_OPTIONS
變數來設定選項。
CPack¶
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
安裝檔案屬性,以指定存取控制列表 (Access Control List)。
其他¶
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 編輯模式不再將_
視為單字的一部分,使其與其他主要模式更加一致。