CMake 3.8 发行说明¶
自 CMake 3.7 以来的更改包括以下内容。
新特性¶
语言¶
C#¶
CMake 已支持将
CSharp(C#) 作为一级语言,可以通过project()和enable_language()命令启用。目前,它已通过 Visual Studio Generators 支持 VS 2010 及以上版本。C# 程序集和程序可以通过
add_library()和add_executable()命令像常见的 C++ 目标一样进行添加。同一源树中的 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 Generators 和Ninja生成器支持。对 Visual Studio IDE 的支持正在开发中,但未包含在此版本中。支持 NVIDIA CUDA Toolkit 编译器(
nvcc)。
C & C++¶
Compile Features功能现在提供元功能,用于请求特定语言标准级别的编译器模式(例如cxx_std_11)。请参阅CMAKE_C_KNOWN_FEATURES和CMAKE_CXX_KNOWN_FEATURES。Compile Features功能现在支持 C++17。除了cxx_std_17元功能外,尚未列出任何特定功能。Compile Features功能现在已知 gcc 自 3.4 版本起支持 C99。
平台¶
添加了
Fuchsia的新的最小平台文件。
生成器¶
现在可以使用
CodeBlocks扩展生成器,使用NMake Makefiles JOM进行生成。VS 2013 及以上版本的 Visual Studio Generators 支持在
CMAKE_GENERATOR_TOOLSET值中添加host=x64选项(例如通过cmake(1)的-T选项)来请求在 64 位主机上使用 VS 64 位工具链。Visual Studio Generators 现在可以将传递给
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 Generators 将PACKAGE目标包含在默认构建中,类似于现有的CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD变量用于INSTALL目标。
属性¶
添加了
BUILD_RPATH目标属性和相应的CMAKE_BUILD_RPATH变量,以支持将自定义RPATH位置添加到构建树中的二进制文件。COMPILE_FLAGS源文件属性现在支持生成器表达式。对于 Apple 目标,
FRAMEWORK目标属性现在也可以应用于静态库。它将生成一个正确的 Framework,但其中包含一个静态库。导入的 接口库 现在支持新的
IMPORTED_LIBNAME和IMPORTED_LIBNAME_<CONFIG>目标属性来指定链接库名,因为接口库不构建自己的库文件。引入了
<LANG>_CPPLINT目标属性和支持的CMAKE_<LANG>_CPPLINT变量,用于指示 Makefile Generators 和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 Generators 是否应将文件复制到输出目录。添加了
VS_DEBUGGER_WORKING_DIRECTORY目标属性,用于告知 VS 2010 及以上版本的 Visual Studio Generators 应为目标设置的调试器工作目录。添加了
VS_DOTNET_REFERENCES_COPY_LOCAL目标属性,用于指定是否将引用的程序集复制到输出目录。添加了
VS_DOTNET_REFERENCE_<refname>目标属性,用于告知 VS 2010 及以上版本的 Visual Studio Generators 添加一个具有给定提示路径的 .NET 引用。添加了
VS_INCLUDE_IN_VSIX源文件属性,用于告知 VS 2010 及以上版本的 Visual Studio Generators 是否将文件包含在 Visual Studio 扩展包中。添加了
VS_RESOURCE_GENERATOR源文件属性,用于为 VS 2010 及以上版本的 Visual Studio Generators 提供资源生成器(仅限C#)的设置。添加了
VS_USER_PROPS目标属性,用于告知 VS 2010 及以上版本的 Visual Studio Generators 使用自定义的 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变量读取检测器的抑制文件位置。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现在可以省略不支持的标签。如果设置了不支持的标签,它们将被忽略并打印开发警告。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变量读取的额外检测器选项附加到检测器内部使用的环境变量。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中。因此,不再需要将CMAKE_CURRENT_BINARY_DIR添加到目标的INCLUDE_DIRECTORIES中。Sublime Text 2生成器不再以启用详细构建输出的方式运行本机构建命令(例如ninja或make)。调用
try_compile()命令时,源文件签名现在会遵守生成的测试项目中CMAKE_WARN_DEPRECATED变量的值。VS 2010 及以上版本的 Visual Studio Generators 现在将源文件级别的标志放置在目标级别的标志之后,当这些标志被归类为原始标志且没有项目文件设置(
AdditionalOptions)时。这种行为与其他生成器生成的标志顺序更一致,并允许更具体属性(源文件级别)上的标志覆盖更通用属性(目标级别)上的标志。在
cmake.org上提供的 Windows 二进制 MSI 包现在会在 Windows 注册表中HKLM\Software\Kitware\CMake键下,以名为InstallDir的值记录安装目录。