CMake 3.9 發行說明¶
自 CMake 3.8 以來的變更包括以下內容。
新功能¶
程式語言¶
CUDA
現在受到 Visual Studio 產生器 對於 VS 2010 及更高版本的支援。這補充了現有的 Makefile 產生器 和Ninja
產生器的支援。建議使用 CUDA 8.0.61 或更高版本,因為早期版本在 VS 整合方面存在已知錯誤。CMake 現在可以識別
C++ 標準
和C 標準
以及它們相關的後設功能,適用於以下編譯器 ID
:Cray
、PGI
和XL
。
產生器¶
適用於 VS 2010 及更高版本的 Visual Studio 產生器 學會了在安裝
nasm
時支援ASM_NASM
程式語言。Xcode
產生器學會了建立 Xcode 結構描述檔案。這是一項實驗性功能,可以將CMAKE_XCODE_GENERATE_SCHEME
變數設定為TRUE
值來啟用。
命令¶
add_library()
命令的IMPORTED
選項學會了支援 物件程式庫。find_library()
命令學會在建置目標為x32
ABI 時搜尋libx32
路徑。請參閱FIND_LIBRARY_USE_LIBX32_PATHS
全域屬性。include_external_msproject()
命令學會使用MAP_IMPORTED_CONFIG_<CONFIG>
目標屬性,將目前的組態對應至外部組態。install(TARGETS)
命令學到了一個新的OBJECTS
選項,用於指定安裝 物件程式庫 的位置。install(EXPORT)
命令學會如何匯出 物件程式庫。project()
命令學到了一個可選的DESCRIPTION
參數,用於設定PROJECT_DESCRIPTION
變數。separate_arguments()
命令獲得了NATIVE_COMMAND
模式,該模式會根據主機作業系統執行參數分離。
變數¶
新增了一個
CMAKE_ANDROID_NDK_DEPRECATED_HEADERS
變數,用於在 使用 NDK 為 Android 進行交叉編譯 時,即使在統一標頭可用時,也要求使用已棄用的標頭。預設現在是在統一標頭可用時使用。引入了一個
CMAKE_AUTOMOC_DEPEND_FILTERS
變數,以允許CMAKE_AUTOMOC
從來源檔案的內容中擷取moc
的其他相依性檔案名稱。引入了一個
CMAKE_AUTOUIC_SEARCH_PATHS
變數,以允許CMAKE_AUTOUIC
在比包含ui_foo.h
的檔案更廣泛的位置搜尋foo.ui
。新增了一個
CMAKE_FIND_LIBRARY_CUSTOM_LIB_SUFFIX
變數,以告知find_library()
命令在每個通常會被搜尋的lib
目錄之前,先在lib<suffix>
目錄中搜尋。新增了一個
CMAKE_INTERPROCEDURAL_OPTIMIZATION
變數,以初始化所有目標的INTERPROCEDURAL_OPTIMIZATION
屬性。新增了一個
CMAKE_<LANG>_COMPILER_AR
變數,用於儲存ar
的 GCC/Clang 包裝函式的路徑。新增了一個
CMAKE_<LANG>_COMPILER_RANLIB
變數,用於儲存ranlib
的 GCC/Clang 包裝函式的路徑。新增了
CMAKE_SYSROOT_COMPILE
和CMAKE_SYSROOT_LINK
變數,用於為編譯和連結使用單獨的 sysroot。
屬性¶
引入了一個新的
AUTOGEN_BUILD_DIR
目標屬性,用於為AUTOMOC
、AUTOUIC
和AUTORCC
設定自訂輸出目錄。新增了
AUTOMOC_DEPEND_FILTERS
目標屬性,允許AUTOMOC
從原始程式碼的內容中提取moc
的額外相依性檔案名稱。新增了
AUTOUIC_SEARCH_PATHS
目標屬性,允許AUTOUIC
在更多位置(而不僅僅是包含ui_foo.h
的檔案附近)搜尋foo.ui
。新增了全域屬性
AUTOGEN_SOURCE_GROUP
、AUTOMOC_SOURCE_GROUP
和AUTORCC_SOURCE_GROUP
,允許將AUTOMOC
或AUTORCC
產生的檔案放置在source_group()
中。新增了
BUILD_WITH_INSTALL_NAME_DIR
目標屬性和對應的CMAKE_BUILD_WITH_INSTALL_NAME_DIR
變數,以控制是否在建置樹狀結構中使用二進制檔的INSTALL_NAME_DIR
目標屬性值。這適用於 macOS 的install_name
,如同BUILD_WITH_INSTALL_RPATH
適用於RPATH
。為 物件程式庫 新增了
CUDA_PTX_COMPILATION
目標屬性,以支援編譯成.ptx
檔案而非主機物件檔案。新增了
GENERATOR_IS_MULTI_CONFIG
全域屬性,以判斷目前的產生器是否為多組態產生器 (例如 Visual Studio 產生器 或Xcode
)。現在會強制執行
INTERPROCEDURAL_OPTIMIZATION
目標屬性 (啟用時)。CMake 會無條件新增 IPO 旗標,如果它不知道目前編譯器的旗標,則會產生錯誤。專案現在有責任使用CheckIPOSupported
模組來檢查 IPO 支援,然後再啟用目標屬性。請參閱原則CMP0069
。現在可以將
WINDOWS_EXPORT_ALL_SYMBOLS
目標屬性與明確的.def
檔案結合使用,以便從目標中的物件檔案匯出所有符號,以及從連結器在相依性中找到的明確符號清單 (例如msvcrt.lib
)。
模組¶
新增了
CheckIPOSupported
模組,以協助專案檢查目前的工具鏈和 CMake 版本是否支援跨程序最佳化 (IPO)。CMakeFindDependencyMacro
模組find_dependency
巨集現在會將所有引數轉發到基礎的find_package()
呼叫。現有的用法會繼續像之前一樣運作,但呼叫者現在可以存取find_package()
接受的完整引數套件。FeatureSummary
模組feature_summary()
命令現在接受新的DEFAULT_DESCRIPTION
選項,這會列印所選取套件類型的預設標題。FeatureSummary
模組新增了一個新的FeatureSummary_<TYPE>_DESCRIPTION
變數,可以為每個<TYPE>
定義,以便在模組在輸出字串中使用套件類型時,以指定的字串取代類型名稱。FindDoxygen
模組學會使用 CMake 變數控制 Doxygen 行為,並透過新加入的doxygen_add_docs()
函式產生文件。Doxygen 輸入檔案 (Doxyfile
) 會自動產生,而 doxygen 會作為自訂目標的一部分執行。可以指定其他元件來尋找選用的工具:dot
、mscgen
和dia
。FindMPI
模組現在提供匯入的目標。FindProtobuf
模組protobuf_generate_cpp()
命令新增了EXPORT_MACRO
選項,以指定 DLL 匯出標記巨集的名稱。FindProtobuf
模組現在透過新的Protobuf_USE_STATIC_LIBS
輸入變數,支援在 Unix 上使用靜態程式庫。FindProtobuf
模組現在會在找到程式庫時提供匯入的目標。新增了
GoogleTest
模組,以便獨立於FindGTest
模組提供gtest_add_tests()
函式。此函式也已更新以支援關鍵字引數,並擴展功能以允許指定測試名稱字首和字尾、使原始程式碼檔案的相依性成為選用項目,以及將探索到的測試案例清單傳回給呼叫者。
CTest¶
ctest_submit()
命令新增了HTTPHEADER
選項,用於指定提交期間要發送的自訂標頭。ctest(1)
執行檔新增了一些選項,允許開發人員停用自動將測試新增至測試集以滿足 fixture 相依性的功能。-FS
防止為符合所提供正規表示式的 fixture 新增設定測試,-FC
防止為符合的 fixture 新增清理測試,而-FA
則防止為符合的 fixture 新增任何測試。新增了
DISABLED
測試屬性,用於標記已設定但明確停用而不會執行的測試。
CPack¶
CPack 封存產生器
學習了如何依元件修改檔名。請參閱CPACK_ARCHIVE_FILE_NAME
變數及其依元件版本CPACK_ARCHIVE_<component>_FILE_NAME
。CPackComponent
模組的cpack_add_component()
命令新增了一個新的PLIST <filename>
選項,用於在使用productbuild
產生器時,指定pkgbuild
--component-plist
引數。CPackIFW
模組的cpack_ifw_configure_component()
和cpack_ifw_configure_component_group()
命令,新增了對DISPLAY_NAME
和DESCRIPTION
選項的國際化支援。CPack IFW 產生器
學習了新的提示CPACK_IFW_ROOT
變數,用於在非標準位置尋找已安裝的 QtIFW 工具套件。CPack productbuild 產生器
新增了一個新的CPACK_PRODUCTBUILD_RESOURCES_DIR
變數,用於指定要複製到Resources
目錄的資源。CPack RPM 產生器
學習了如何修改debuginfo
套件名稱。請參閱CPACK_RPM_DEBUGINFO_FILE_NAME
變數。CPack WIX 產生器
修補系統現在可以設定其他屬性。這可以透過在Id
屬性之後使用CPackWiXFragment
XML 標籤指定屬性來完成。請參閱CPACK_WIX_PATCH_FILE
變數。CPack WIX 產生器
實作了一個新的CPACK_WIX_ROOT_FOLDER_ID
變數,允許使用自訂根資料夾 ID,而不是預設的ProgramFilesFolder
/ProgramFiles64Folder
。
其他¶
現在,GNU 和 Clang 編譯器可以使用連結時最佳化 (LTO) 旗標來支援程序間最佳化 (IPO)。請參閱
INTERPROCEDURAL_OPTIMIZATION
目標屬性和CheckIPOSupported
模組。TARGET_OBJECTS
產生器運算式
現在受到add_custom_command()
和file(GENERATE)
命令支援。新增了兩個新的資訊產生器運算式,用於擷取 Apple 組合目錄。第一個運算式
$<TARGET_BUNDLE_DIR:tgt>
輸出組合目錄的完整路徑,另一個運算式$<TARGET_BUNDLE_CONTENT_DIR:tgt>
輸出 macOS 組合和 App 組合的Contents
目錄的完整路徑。對於所有其他組合類型和 SDK,它與$<TARGET_BUNDLE_DIR:tgt>
相同。新的運算式有助於查詢與 macOS 和 iOS 上不同的組合類型和佈局無關的組合位置。
已棄用和移除的功能¶
針對
CMP0036
及以下原則新增了明確的棄用診斷。cmake-policies(7)
手冊說明所有原則的 OLD 行為都已棄用,專案應儘快移植到 NEW 行為。Visual Studio 8 2005
產生器現在已棄用,將在未來版本的 CMake 中移除。已移除
Visual Studio 7 .NET 2003
產生器。Xcode
產生器已停止支援舊於 3 的 Xcode 版本。FindDoxygen
模組已棄用數個變數。由於上游 curl 7.52 的變更,CMake 捆綁的 curl 版本不再接受 Windows 上
file://c:/...
形式的 URL。請改用file:///c:/...
形式,以便在所有版本上都能正常運作。
其他變更¶
當使用
AUTOMOC
時,CMake 現在會掃描是否存在Q_PLUGIN_METADATA
巨集,並在巨集的FILE
引數中的檔案變更時,重新執行 moc。當
AUTOMOC
偵測到#include "moc_<basename>.cpp"
形式的 include 語句時,對應標頭檔的搜尋現在也會在目標的INCLUDE_DIRECTORIES
中進行。執行測試時,CTest 學會將跳過的測試(使用
SKIP_RETURN_CODE
屬性)視為與具有新DISABLED
屬性的測試相同。由於此變更,當所有測試皆為跳過或通過時,CTest 將不會指示失敗。Ninja
產生器已放寬物件編譯的依賴性。物件編譯現在僅依賴與物件的目標所依賴的程式庫相關聯的自訂目標和自訂命令,不再依賴程式庫本身。相依目標中的原始碼檔案現在可以編譯,而無需等待其目標的依賴項連結。在 macOS 上,諸如
BUILD_WITH_INSTALL_RPATH
之類的RPATH
設定不再影響install_name
欄位。請參閱政策CMP0068
。Visual Studio 14 2015
產生器已學習有關 VS 2015 更新對v140
工具組所做的變更。VS 變更了它理解的GenerateDebugInformation
連結器設定值的集合,該設定會產生-DEBUG
連結器旗標變體。
更新¶
自 CMake 3.9.0 以來所做的變更包括以下內容。
3.9.1¶
由於新使用
<PackageName>_ROOT
變數而導致的回歸,CMake 3.9.0 新增的find_
命令PACKAGE_ROOT
搜尋路徑群組已從 3.9 系列中移除。此行為可能會在未來以更相容的方式重新引入。
3.9.2¶
在 macOS 上,預設應用程式套件
Info.plist
檔案不再像在 3.9.0 和 3.9.1 中那樣啟用 Hi-DPI 支援。此變更必須還原,因為它破壞了 iOS 應用程式。Xcode 產生器不再像在 3.9.0 和 3.9.1 中那樣將 "outputPaths" 新增至自訂腳本建置階段。新增此功能是為了支援 Xcode 9 的新建置系統,但破壞了舊的和新的 Xcode 建置系統的增量重建。