CMake 3.9 發行說明¶
自 CMake 3.8 以來所做的變更包括以下內容。
新功能¶
語言¶
CUDA
現在受到適用於 VS 2010 及更高版本的 Visual Studio 產生器 的支援。這 дополняет Makefile 產生器 和Ninja
產生器現有的支援。建議使用 CUDA 8.0.61 或更高版本,因為早期版本在 VS 整合中存在已知錯誤。CMake 現在已了解以下
編譯器 ID
的C++ 標準
和C 標準
及其相關的中繼功能:Cray
、PGI
和XL
。
產生器¶
適用於 VS 2010 及更高版本的 Visual Studio 產生器 學習在安裝
nasm
時支援ASM_NASM
語言。Xcode
產生器學習建立 Xcode schema 檔案。這是一項實驗性功能,可以透過將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
目標屬性值。這是用於 macOSinstall_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 Archive 產生器
學習修改每個組件的檔案名稱。請參閱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
。
其他¶
現在使用連結時間最佳化 (LTO) 旗標的 GNU 和 Clang 編譯器支援程序間最佳化 (IPO)。請參閱
INTERPROCEDURAL_OPTIMIZATION
目標屬性和CheckIPOSupported
模組。TARGET_OBJECTS
產生器 表達式
現在受到add_custom_command()
和file(GENERATE)
命令的支援。已新增兩個新的資訊性產生器表達式,用於檢索 Apple Bundle 目錄。第一個是
$<TARGET_BUNDLE_DIR:tgt>
,輸出 Bundle 目錄的完整路徑;另一個是$<TARGET_BUNDLE_CONTENT_DIR:tgt>
,輸出 macOS Bundle 和 App Bundle 的Contents
目錄的完整路徑。對於所有其他 bundle 類型和 SDK,它與$<TARGET_BUNDLE_DIR:tgt>
相同。新的表達式有助於查詢 Bundle 位置,而無需考慮 macOS 和 iOS 上不同的 Bundle 類型和佈局。
已棄用和移除的功能¶
為策略
CMP0036
及更低版本新增了明確的棄用診斷。cmake-policies(7)
手冊說明,所有策略的舊有行為都已棄用,專案應盡快移植到新的行為。Visual Studio 8 2005
產生器現在已棄用,並將在未來版本的 CMake 中移除。Visual Studio 7 .NET 2003
產生器已被移除。Xcode
產生器已停止支援低於 3 的 Xcode 版本。FindDoxygen
模組已棄用幾個變數。與 CMake 捆綁的 curl 版本不再接受
file://c:/...
形式的 URL(在 Windows 上),因為上游 curl 7.52 中發生了變更。請改用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 上,
RPATH
設定(例如BUILD_WITH_INSTALL_RPATH
)不再影響install_name
欄位。請參閱策略CMP0068
。Visual Studio 14 2015
產生器已被告知 VS 2015 更新對v140
工具組所做的變更。VS 變更了它理解的GenerateDebugInformation
連結器設定值集,該設定產生-DEBUG
連結器旗標變體。
更新¶
自 CMake 3.9.0 以來所做的變更包括以下內容。
3.9.1¶
CMake 3.9.0 新增的
find_
命令PACKAGE_ROOT
搜尋路徑群組已從 3.9 系列中移除,因為使用新的<PackageName>_ROOT
變數導致了回歸。此行為可能會在未來以更相容的方式重新引入。
3.9.2¶
在 macOS 上,預設應用程式 bundle
Info.plist
檔案不再像 3.9.0 和 3.9.1 中那樣啟用 Hi-DPI 支援。此變更必須還原,因為它破壞了 iOS 應用程式。Xcode 產生器不再像 3.9.0 和 3.9.1 中那樣將 "outputPaths" 新增至自訂腳本建置階段。新增此功能是為了嘗試支援 Xcode 9 的新建置系統,但破壞了舊版和新版 Xcode 建置系統的增量重建。