CMake 3.8 发行说明

自 CMake 3.7 以来的更改包括以下内容。

新特性

语言

C#

  • CMake 现在支持将 CSharp (C#) 作为一等语言,可以通过 project()enable_language() 命令启用。目前,它由 VS 2010 及以上版本的 Visual Studio 生成器 支持。

    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 生成器Ninja 生成器支持。对 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_PKG_TYPESFeatureSummary_REQUIRED_PKG_TYPESFeatureSummary_DEFAULT_PKG_TYPE 全局属性来调整 FeatureSummary 模块接受的包类型。

  • 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() 命令不再自动向 AddressSanitizer 使用的选项中添加 leak_check=1AddressSanitizer 的默认行为是运行 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