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_TYPES, FeatureSummary_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 变量读取的额外 sanitizer 选项附加到 sanitizers 内部使用的环境变量中。

  • FeatureSummary 模块的 set_package_properties() 命令在未显式设置类型时,不再强制将包类型设置为 OPTIONAL

  • 编译特性 功能现在可以识别 UNIX 和 Windows 平台上 Intel C++ 编译器 12.1 到 17.0 版本支持的特性。

  • 在成功调用之后,对 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