CMake 3.8 發行說明

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

新功能

語言

C#

  • CMake 學會了支援 CSharp (C#) 作為一級語言,可以透過 project()enable_language() 指令啟用。目前 Visual Studio 產生器對於 VS 2010 及更高版本支援此功能。

    C# 組件和程式可以像常見的 C++ 目標一樣新增,使用 add_library()add_executable() 指令。相同原始碼樹狀結構中 C# 目標之間的參考可以透過 target_link_libraries() 指定,就像 C++ 一樣。系統或第三方組件的參考可以透過目標屬性 VS_DOTNET_REFERENCE_<refname>VS_DOTNET_REFERENCES 指定。

  • 可以使用目標和原始碼檔案屬性來更精細地調整 C# 目標。特別是與 Visual Studio 相關的目標屬性 (VS_*) 值得一看 (用於設定工具組版本、根命名空間、組件圖示等)。

CUDA

  • CMake 學會了支援 CUDA 作為一級語言,可以透過 project()enable_language() 指令啟用。

  • CUDA 目前在 Linux、macOS 和 Windows 上受到 Makefile 產生器Ninja 產生器的支援。Visual Studio IDE 的支援正在開發中,但未包含在此版本中。

  • 支援 NVIDIA CUDA 工具組編譯器 (nvcc)。

C & C++

平台

  • 新增了適用於 Fuchsia 的新最小平台檔案。

產生器

指令

  • add_custom_command()add_custom_target() 指令學會了 COMMAND_EXPAND_LISTS 選項,該選項會導致展開 COMMAND 引數中的列表,包括產生器運算式建立的列表。

  • execute_process() 指令新增了 ENCODING 選項,用於指定在 Windows 上子程序輸出的編碼。

  • math(EXPR) 指令新增了對一元 +- 運算子的支援。

  • source_group() 指令新增了 TREEPREFIX 選項,以根據原始碼樹狀目錄結構新增群組。

  • string(TIMESTAMP) 指令學會了將 %% 作為編碼純 % 的方式。

  • string(TIMESTAMP) 指令現在將遵循 SOURCE_DATE_EPOCH 環境變數,並使用其值而不是目前時間。

  • try_compile() 指令原始碼檔案簽章新增了選項,用於指定在產生的測試專案中使用的語言標準。

  • try_compile() 指令原始碼檔案簽章現在遵循語言標準變數,例如 CMAKE_CXX_STANDARD。請參閱政策 CMP0067

變數

屬性

模組

  • 新增了 CSharpUtilities 模組,以協助 Visual Studio C# 目標的參數化。它提供了一些函數,可以自動設定原始碼檔案屬性,以支援 Windows Forms、WPF/XAML 或其他需要的技術。

  • ExternalData 模組學會了使用不同的雜湊,支援一個資料檔案的多個內容連結,例如 img.png.sha256img.png.sha1。這允許從由不同雜湊演算法索引的來源擷取物件。

  • ExternalProject 模組新增了 GIT_PROGRESS 選項,以強制 Git 在複製儲存庫時顯示進度。

  • ExternalProject 模組新增了 GIT_CONFIG 選項,以在複製儲存庫時將 --config 選項傳遞給 Git。

  • FeatureSummary 模組 feature_summary() 指令現在接受新的 QUIET_ON_EMPTY 選項,當屬於選定類別的套件列表為空時,該選項會抑制輸出。

  • FeatureSummary 模組 add_feature_info() 指令現在接受相依性列表,以決定是否啟用功能。

  • 現在可以透過變更 FeatureSummary 模組接受的套件類型,變更 FeatureSummary_PKG_TYPESFeatureSummary_REQUIRED_PKG_TYPESFeatureSummary_DEFAULT_PKG_TYPE 全域屬性來進行調整。

  • FindOpenGL 模組現在在找到函式庫時提供匯入的目標 OpenGL::GLOpenGL::GLU

  • UseSWIG 模組新增了 swig_add_library 指令,以便比舊的 swig_add_module 指令提供更大的彈性。

  • UseSWIG 模組 swig_add_source_to_module 指令學會了新的 SWIG_OUTFILE_DIR 選項,以控制輸出檔案位置 (swig -o)。

  • WriteCompilerDetectionHeader 模組新增了 ALLOW_UNKNOWN_COMPILERSALLOW_UNKNOWN_COMPILER_VERSIONS 選項,這些選項允許建立也適用於未知或舊編譯器的標頭,方法是簡單地假設它們不支援任何請求的功能。

CTest

  • ctest_memcheck() 指令新增了 DEFECT_COUNT <var> 選項,以擷取偵測到的記憶體缺陷數量。

  • ctest_memcheck() 命令學會從 CTEST_MEMORYCHECK_SUPPRESSIONS_FILE 變數讀取用於 Sanitizers 的 suppressions 檔案位置。

  • ctest_memcheck() 命令學會獨立於 AddressSanitizer 支援 LeakSanitizer

  • ctest_update() 命令 CDASH_UPLOAD 簽章被教導要遵循 RETRY_COUNTRETRY_DELAYQUIET 選項。

CPack

  • 新增了 CPackIFWConfigureFile 模組,以定義新的 cpack_ifw_configure_file() 命令,來設定以 QtIFW/SDK/Creator 風格準備的檔案範本。

  • CPackIFW 模組的 cpack_ifw_configure_component()cpack_ifw_configure_component_group() 命令新增了 DEFAULTVIRTUALFORCED_INSTALLATIONREQUIRES_ADMIN_RIGHTSDISPLAY_NAMEUPDATE_TEXTDESCRIPTIONRELEASE_DATEAUTO_DEPEND_ONTRANSLATIONS 選項,以進行更具體的配置。

  • CPackIFW 模組的 cpack_ifw_configure_component() 命令新增了 DEPENDENCIES 別名,用於 DEPENDS 選項。

  • CPackIFW 模組的 cpack_ifw_configure_component_group() 命令新增了 DEPENDS 選項。也新增了 DEPENDENCIES 別名。

  • CPackIFW 模組的 cpack_ifw_configure_component()cpack_ifw_configure_component_group() 命令的 PRIORITY 選項現在已被棄用,並將在未來版本的 CMake 中移除。請改用新的 SORTING_PRIORITY 選項。

  • CPack IFW Generator 新增了 CPACK_IFW_PACKAGE_WATERMARKCPACK_IFW_PACKAGE_BANNERCPACK_IFW_PACKAGE_BACKGROUNDCPACK_IFW_PACKAGE_WIZARD_STYLECPACK_IFW_PACKAGE_WIZARD_DEFAULT_WIDTHCPACK_IFW_PACKAGE_WIZARD_DEFAULT_HEIGHTCPACK_IFW_PACKAGE_TITLE_COLOR 變數,以自訂 QtIFW 安裝程式的外觀。

  • CPack productbuild Generator 增加了簽署套件的選項。請參閱變數 CPACK_PRODUCTBUILD_IDENTITY_NAMECPACK_PRODUCTBUILD_KEYCHAIN_PATHCPACK_PKGBUILD_IDENTITY_NAMECPACK_PKGBUILD_KEYCHAIN_PATH

  • CPack RPM Generator 學會省略提供的 rpmbuild 工具不支援的標籤。如果設定了不支援的標籤,它們將被忽略並印出開發人員警告。

  • CPack RPM Generator 學會產生主元件套件,該套件強制為定義的元件產生 rpm,而檔案名稱和套件名稱中沒有元件後綴。請參閱 CPACK_RPM_MAIN_COMPONENT 變數。

  • CPack RPM Generator 學會按需產生單一 debuginfo 套件,即使使用了元件封裝。請參閱 CPACK_RPM_DEBUGINFO_SINGLE_PACKAGE 變數。

  • CPack RPM Generator 學會在使用 CPACK_RPM_USER_FILELIST 變數時支援每個檔案多個指令。

其他

  • 使用密碼雜湊的 CMake 功能現在支援 SHA-3 演算法。

  • 新增了新的產生器表達式 $<IF:cond,true-value,false-value>。如果條件為 1,它會解析為 true-value,如果條件為 0,則解析為 false-value。

已棄用和移除的功能

  • FeatureSummary 模組命令 set_package_info()set_feature_info()print_enabled_features()print_disabled_features() 現在已被棄用。

  • UseSWIG 模組 swig_add_module 命令現在已被棄用,建議改用 swig_add_library

其他變更

  • 如果 <LANG>_CLANG_TIDY 目標屬性指定的命令在建置時傳回非零值,現在會將其視為錯誤,而不是靜默忽略。

  • ctest_memcheck() 命令不再自動將 leak_check=1 新增到 AddressSanitizer 使用的選項。AddressSanitizer 的預設行為是執行 LeakSanitizer 來檢查洩漏,除非 leak_check=0

  • 修正了 ctest_memcheck() 命令,以正確地將從 CTEST_MEMORYCHECK_SANITIZER_OPTIONS 變數讀取的額外 sanitizer 選項附加到 sanitizer 內部使用的環境變數。

  • FeatureSummary 模組 set_package_properties() 命令在未明確設定類型時,不再強制將套件類型設為 OPTIONAL

  • Compile Features 功能現在可以識別 Intel C++ 編譯器版本 12.1 到 17.0 在 UNIX 和 Windows 平台上支援的功能。

  • 在成功呼叫之後,呼叫 FindPkgConfig 模組 pkg_check_modules() 命令學會重新評估給定前綴的快取值,在變更該前綴的命令參數之後。

  • 當使用 AUTOMOCAUTOUIC 時,產生的 moc_**.mocui_* 會放置在 <CMAKE_CURRENT_BINARY_DIR>/<TARGETNAME>_autogen/include 目錄中,該目錄會自動新增到目標的 INCLUDE_DIRECTORIES。因此,不再需要在目標的 INCLUDE_DIRECTORIES 中包含 CMAKE_CURRENT_BINARY_DIR

  • Sublime Text 2 產生器不再以啟用詳細建置輸出的方式執行原生建置命令 (例如 ninjamake)。

  • try_compile() 命令來源檔案簽章現在遵循產生的測試專案中的 CMAKE_WARN_DEPRECATED 變數值。

  • 用於 VS 2010 及更高版本的 Visual Studio 產生器 現在將每個來源檔案的旗標放置在目標範圍旗標之後,當它們被分類為沒有專案檔案設定的原始旗標 (AdditionalOptions) 時。此行為與其他產生器產生的旗標順序更一致,並允許更具體屬性 (每個來源) 的旗標覆蓋更通用屬性 (每個目標) 的旗標。

  • cmake.org 上提供的預編譯 Windows 二進制 MSI 套件現在將安裝目錄記錄在 Windows 登錄檔的 HKLM\Software\Kitware\CMake 金鑰下,值名稱為 InstallDir