CMake 3.1 發行說明

自 CMake 3.0 以來所做的變更包括以下內容。

文件變更

新功能

產生器

Windows Phone 和 Windows Store

  • Visual Studio 11 (2012) 及更高版本的產生器已學會為 Windows Phone 和 Windows Store 產生專案。可以將 CMAKE_SYSTEM_NAME 變數設定為 WindowsPhoneWindowsStore,在 cmake(1) 命令列或 CMAKE_TOOLCHAIN_FILE 中以啟用這些平台。 也可將 CMAKE_SYSTEM_VERSION 設定為 8.08.1 以指定要目標化的 Windows 版本。

NVIDIA Nsight Tegra

  • Visual Studio 10 (2010) 及更高版本的產生器已學會為 NVIDIA Nsight Tegra Visual Studio Edition 產生專案。可以將 CMAKE_SYSTEM_NAME 變數設定為 Android,在 cmake(1) 命令列或 CMAKE_TOOLCHAIN_FILE 中以啟用此平台。

語法

  • 為了實現更快速的實作,cmake-language(7) 中用於變數參考跳脫序列的語法已簡化。請參閱政策 CMP0053

  • if() 指令不再自動解參考在引號或方括號引數中命名的變數。請參閱政策 CMP0054

指令

變數

  • 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 變數以選擇性地減少安裝輸出。

屬性

模組

  • 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 模組已學會支援 fatbincubin 模組。

  • 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 模式,包括 AddressSanitizerMemorySanitizerThreadSanitizerUndefinedBehaviorSanitizer。可以使用新的 CTEST_MEMORYCHECK_SANITIZER_OPTIONS 變數來設定選項。

CPack

其他

  • cmake(1) -E 選項新增了 env 命令。

  • cmake(1) -E tar 命令已學會支援 lzma 壓縮的檔案。

  • 物件函式庫 現在可以有不編譯為物件檔案的額外原始碼,只要它們不會影響一般函式庫的連結(例如,.dat 可以,但 .def 不行)。

  • VS 8 及更高版本的 Visual Studio 產生器已學會支援 ASM_MASM 語言。

  • Visual Studio 產生器已學會將 .hlsl 原始碼檔案視為高階著色語言原始碼(在 .vcxproj 檔案中使用 FXCompile)。已新增原始碼檔案屬性 VS_SHADER_TYPEVS_SHADER_MODELVS_SHADER_ENTRYPOINT,以指定著色器類型、模型和進入點名稱。

新診斷

已棄用和移除的功能

  • 在 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 編輯模式不再將 _ 視為單字的一部分,使其與其他主要模式更加一致。