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 GeneratorsNinja 生成器支持。对 Visual Studio IDE 的支持正在开发中,但未包含在此版本中。

  • 支持 NVIDIA CUDA Toolkit 编译器(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

CPack

其他

  • 使用加密哈希的 CMake 功能现在支持 SHA-3 算法。

  • 添加了一个新的生成器表达式 $<IF:cond,true-value,false-value>。如果条件为 1,则解析为 true-value;如果条件为 0,则解析为 false-value。

已弃用和已删除的特性

其他更改

  • 如果 <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() 命令之后,可以重新评估给定前缀的缓存值,以响应对该前缀的命令参数所做的更改。

  • 使用 AUTOMOCAUTOUIC 时,生成的 moc_**.mocui_* 文件会放置在 <CMAKE_CURRENT_BINARY_DIR>/<TARGETNAME>_autogen/include 目录中,该目录会自动添加到目标的 INCLUDE_DIRECTORIES 中。因此,不再需要将 CMAKE_CURRENT_BINARY_DIR 添加到目标的 INCLUDE_DIRECTORIES 中。

  • Sublime Text 2 生成器不再以启用详细构建输出的方式运行本机构建命令(例如 ninjamake)。

  • 调用 try_compile() 命令时,源文件签名现在会遵守生成的测试项目中 CMAKE_WARN_DEPRECATED 变量的值。

  • VS 2010 及以上版本的 Visual Studio Generators 现在将源文件级别的标志放置在目标级别的标志之后,当这些标志被归类为原始标志且没有项目文件设置(AdditionalOptions)时。这种行为与其他生成器生成的标志顺序更一致,并允许更具体属性(源文件级别)上的标志覆盖更通用属性(目标级别)上的标志。

  • cmake.org 上提供的 Windows 二进制 MSI 包现在会在 Windows 注册表中 HKLM\Software\Kitware\CMake 键下,以名为 InstallDir 的值记录安装目录。