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++¶
編譯功能
功能現在提供元功能,可以請求特定語言標準等級的編譯器模式 (例如cxx_std_11
)。請參閱CMAKE_C_KNOWN_FEATURES
和CMAKE_CXX_KNOWN_FEATURES
。編譯功能
功能現在可以識別 C++ 17。除了cxx_std_17
元功能之外,尚未列舉任何特定功能。編譯功能
功能現在可以識別 gcc 自 3.4 版本以來 C99 的可用性。
平台¶
新增了適用於
Fuchsia
的新最小平台檔案。
產生器¶
CodeBlocks
額外產生器現在可以用於使用NMake Makefiles JOM
產生。適用於 VS 2013 及更高版本的 Visual Studio 產生器 學會了在
CMAKE_GENERATOR_TOOLSET
值 (例如透過cmake(1)
-T
選項) 中支援host=x64
選項,以便在 64 位元主機上請求使用 VS 64 位元工具鏈。Visual Studio 產生器 學會了將傳遞給
target_link_libraries()
且名稱以.targets
結尾的檔案視為 MSBuild "targets" 檔案,以便匯入到產生的專案檔案中。
指令¶
add_custom_command()
和add_custom_target()
指令學會了COMMAND_EXPAND_LISTS
選項,該選項會導致展開COMMAND
引數中的列表,包括產生器運算式建立的列表。execute_process()
指令新增了ENCODING
選項,用於指定在 Windows 上子程序輸出的編碼。math(EXPR)
指令新增了對一元+
和-
運算子的支援。source_group()
指令新增了TREE
和PREFIX
選項,以根據原始碼樹狀目錄結構新增群組。string(TIMESTAMP)
指令學會了將%%
作為編碼純%
的方式。string(TIMESTAMP)
指令現在將遵循SOURCE_DATE_EPOCH
環境變數,並使用其值而不是目前時間。try_compile()
指令原始碼檔案簽章新增了選項,用於指定在產生的測試專案中使用的語言標準。try_compile()
指令原始碼檔案簽章現在遵循語言標準變數,例如CMAKE_CXX_STANDARD
。請參閱政策CMP0067
。
變數¶
新增了
CMAKE_CODELITE_USE_TARGETS
變數,以告知CodeLite
額外產生器變更產生的專案以具有以目標為中心的組織。CodeLite
中的build
、rebuild
和clean
操作隨後將作用於選定的目標,而不是整個工作區。(請注意,Ninja
對目標的 clean 操作包括其依賴項。)新增了
CMAKE_SUBLIME_TEXT_2_ENV_SETTINGS
變數,以告知Sublime Text 2
額外產生器將指定的環境變數放置在產生的.sublime-project
中。新增了
CMAKE_SUBLIME_TEXT_2_EXCLUDE_BUILD_TREE
變數,以告知Sublime Text 2
額外產生器是否要從.sublime-project
中排除組建樹狀結構 (當其位於原始碼樹狀結構內時)。新增了
CMAKE_VS_INCLUDE_PACKAGE_TO_DEFAULT_BUILD
變數,以告知適用於 VS 2010 及更高版本的 Visual Studio 產生器 在預設組建中包含PACKAGE
目標,類似於現有的CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD
變數,用於INSTALL
目標。
屬性¶
新增了
BUILD_RPATH
目標屬性和對應的CMAKE_BUILD_RPATH
變數,以支援要新增至組建樹狀結構中二進位檔的自訂RPATH
位置。COMPILE_FLAGS
原始碼檔案屬性學會了支援產生器運算式
。FRAMEWORK
目標屬性現在也可以應用於 Apple 目標上的靜態函式庫。它將產生適當的 Framework,但內部包含靜態函式庫。匯入的 介面函式庫 學會了新的
IMPORTED_LIBNAME
和IMPORTED_LIBNAME_<CONFIG>
目標屬性,以指定連結函式庫名稱,因為介面函式庫不會組建自己的函式庫檔案。引入了
<LANG>_CPPLINT
目標屬性和支援的CMAKE_<LANG>_CPPLINT
變數,以告知 Makefile 產生器 和Ninja
產生器,針對C
和CXX
語言在編譯器執行時同時執行cpplint
樣式檢查器。新增了
MANUALLY_ADDED_DEPENDENCIES
目標屬性。它提供了使用add_dependencies()
指令新增的相依性的唯讀列表。MAP_IMPORTED_CONFIG_<CONFIG>
目標屬性學會了將空列表元素解釋為參考IMPORTED_LOCATION
指定的無組態匯入位置。現在在 匯入的 介面函式庫 上支援
NO_SYSTEM_FROM_IMPORTED
目標屬性。新增了新的原始碼檔案屬性
SKIP_AUTOMOC
、SKIP_AUTOUIC
、SKIP_AUTORCC
和SKIP_AUTOGEN
,以允許從AUTOMOC
、AUTOUIC
和AUTORCC
目標屬性處理中排除原始碼檔案。新增了
VS_COPY_TO_OUT_DIR
原始碼檔案屬性,以告知適用於 VS 2010 及更高版本的 Visual Studio 產生器 檔案是否應複製到輸出目錄。新增了
VS_DEBUGGER_WORKING_DIRECTORY
目標屬性,以告知適用於 VS 2010 及更高版本的 Visual Studio 產生器 應為目標設定哪個偵錯工具工作目錄。新增了
VS_DOTNET_REFERENCES_COPY_LOCAL
目標屬性,以指定是否將參考的組件複製到輸出目錄。新增了
VS_DOTNET_REFERENCE_<refname>
目標屬性,以告知適用於 VS 2010 及更高版本的 Visual Studio 產生器 新增具有指定提示路徑的 .NET 參考。新增了
VS_INCLUDE_IN_VSIX
原始碼檔案屬性,以告知適用於 VS 2010 及更高版本的 Visual Studio 產生器 是否將檔案包含在 Visual Studio 擴充套件中。新增了
VS_RESOURCE_GENERATOR
原始碼檔案屬性,以為適用於 VS 2010 及更高版本的 Visual Studio 產生器 提供資源產生器設定 (僅限C#
)。新增了
VS_USER_PROPS
目標屬性,以告知適用於 VS 2010 及更高版本的 Visual Studio 產生器 使用自訂 MSBuild 使用者.props
檔案。新增了
XCODE_EMIT_EFFECTIVE_PLATFORM_NAME
全域屬性,以告知Xcode
產生器是否要發出EFFECTIVE_PLATFORM_NAME
變數。當使用多個 SDK (例如並行macosx
和iphoneos
) 進行組建時,這非常有用。建立了新的
XCODE_PRODUCT_TYPE
和XCODE_EXPLICIT_FILE_TYPE
目標屬性,以告知Xcode
產生器對產生的 Xcode 專案中的目標使用對應屬性的自訂值。
模組¶
新增了
CSharpUtilities
模組,以協助 Visual Studio C# 目標的參數化。它提供了一些函數,可以自動設定原始碼檔案屬性,以支援 Windows Forms、WPF/XAML 或其他需要的技術。ExternalData
模組學會了使用不同的雜湊,支援一個資料檔案的多個內容連結,例如img.png.sha256
和img.png.sha1
。這允許從由不同雜湊演算法索引的來源擷取物件。ExternalProject
模組新增了GIT_PROGRESS
選項,以強制 Git 在複製儲存庫時顯示進度。ExternalProject
模組新增了GIT_CONFIG
選項,以在複製儲存庫時將--config
選項傳遞給 Git。FeatureSummary
模組feature_summary()
指令現在接受新的QUIET_ON_EMPTY
選項,當屬於選定類別的套件列表為空時,該選項會抑制輸出。FeatureSummary
模組add_feature_info()
指令現在接受相依性列表,以決定是否啟用功能。現在可以透過變更
FeatureSummary
模組接受的套件類型,變更FeatureSummary_PKG_TYPES
、FeatureSummary_REQUIRED_PKG_TYPES
和FeatureSummary_DEFAULT_PKG_TYPE
全域屬性來進行調整。FindOpenGL
模組現在在找到函式庫時提供匯入的目標OpenGL::GL
和OpenGL::GLU
。UseSWIG
模組新增了swig_add_library
指令,以便比舊的swig_add_module
指令提供更大的彈性。UseSWIG
模組swig_add_source_to_module
指令學會了新的SWIG_OUTFILE_DIR
選項,以控制輸出檔案位置 (swig -o
)。WriteCompilerDetectionHeader
模組新增了ALLOW_UNKNOWN_COMPILERS
和ALLOW_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_COUNT
、RETRY_DELAY
和QUIET
選項。
CPack¶
新增了
CPackIFWConfigureFile
模組,以定義新的cpack_ifw_configure_file()
命令,來設定以 QtIFW/SDK/Creator 風格準備的檔案範本。CPackIFW
模組的cpack_ifw_configure_component()
和cpack_ifw_configure_component_group()
命令新增了DEFAULT
、VIRTUAL
、FORCED_INSTALLATION
、REQUIRES_ADMIN_RIGHTS
、DISPLAY_NAME
、UPDATE_TEXT
、DESCRIPTION
、RELEASE_DATE
、AUTO_DEPEND_ON
和TRANSLATIONS
選項,以進行更具體的配置。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_WATERMARK
、CPACK_IFW_PACKAGE_BANNER
、CPACK_IFW_PACKAGE_BACKGROUND
、CPACK_IFW_PACKAGE_WIZARD_STYLE
、CPACK_IFW_PACKAGE_WIZARD_DEFAULT_WIDTH
、CPACK_IFW_PACKAGE_WIZARD_DEFAULT_HEIGHT
和CPACK_IFW_PACKAGE_TITLE_COLOR
變數,以自訂 QtIFW 安裝程式的外觀。CPack productbuild Generator
增加了簽署套件的選項。請參閱變數CPACK_PRODUCTBUILD_IDENTITY_NAME
、CPACK_PRODUCTBUILD_KEYCHAIN_PATH
、CPACK_PKGBUILD_IDENTITY_NAME
和CPACK_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()
命令學會重新評估給定前綴的快取值,在變更該前綴的命令參數之後。當使用
AUTOMOC
或AUTOUIC
時,產生的moc_*
、*.moc
和ui_*
會放置在<CMAKE_CURRENT_BINARY_DIR>/<TARGETNAME>_autogen/include
目錄中,該目錄會自動新增到目標的INCLUDE_DIRECTORIES
。因此,不再需要在目標的INCLUDE_DIRECTORIES
中包含CMAKE_CURRENT_BINARY_DIR
。Sublime Text 2
產生器不再以啟用詳細建置輸出的方式執行原生建置命令 (例如ninja
或make
)。try_compile()
命令來源檔案簽章現在遵循產生的測試專案中的CMAKE_WARN_DEPRECATED
變數值。用於 VS 2010 及更高版本的 Visual Studio 產生器 現在將每個來源檔案的旗標放置在目標範圍旗標之後,當它們被分類為沒有專案檔案設定的原始旗標 (
AdditionalOptions
) 時。此行為與其他產生器產生的旗標順序更一致,並允許更具體屬性 (每個來源) 的旗標覆蓋更通用屬性 (每個目標) 的旗標。在
cmake.org
上提供的預編譯 Windows 二進制 MSI 套件現在將安裝目錄記錄在 Windows 登錄檔的HKLM\Software\Kitware\CMake
金鑰下,值名稱為InstallDir
。