CMake 3.8 发行说明

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

新特性

语言

C#

  • CMake 学会了支持 CSharp (C#) 作为可以通过 project()enable_language() 命令启用的头等语言。它目前受针对 VS 2010 及以上版本的 Visual Studio 生成器 支持。

    可以使用 add_library()add_executable() 命令添加 C# 程序集和程序,就像添加常见的 C++ 目标一样。同一源树中的 C# 目标之间的引用可由 target_link_libraries() 指定,就像用于 C++ 一样。对系统或第三方程序集的引用可由目标属性 VS_DOTNET_REFERENCE_<refname>VS_DOTNET_REFERENCES 指定。

  • 可以使用目标和源文件属性对 C# 目标进行更精细的微调。具体来说,与 Visual Studio 相关的目标属性(VS_*)值得一看(用于设置工具集版本、根命名空间、程序集图标等)。

CUDA

  • CMake 学会支持 CUDA 作为一门可通过 project()enable_language() 命令启用的高级语言。

  • CUDA 目前受 Makefile 发生器Ninja 发生器在 Linux、macOS 和 Windows 系统上的支持。对 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 窗体、WPF/XAML 或其他技术。

  • 使用不同的哈希,例如支持一个数据文件多个内容链接,ExternalData 模块了解 img.png.sha256img.png.sha1。这让对象能够从按不同哈希算法编制的索引对象中提取出来。

  • 获得了 ExternalProject 模块 GIT_PROGRESS 选项,以强制 Git 在克隆存储库时显示进度。

  • ExternalProject 模块获得了一个 GIT_CONFIG 选项,以在克隆存储库时向 Git 传递 --config 选项。

  • 现在,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() 命令不再自动向 AddressSanitizer 使用的选项添加 leak_check=1。除非 leak_check=0,否则 AddressSanitizer 的默认行为是运行 LeakSanitizer 进行泄漏检查。

  • 为正确追加从 CTEST_MEMORYCHECK_SANITIZER_OPTIONS 变量读取的附加整理程序选项,已修复 ctest_memcheck() 命令,使该选项能够内部被整理程序使用,并内嵌到环境变量中。

  • 现在,FeatureSummary 模块不再将包类型强制为 OPTIONAL,这是在没有明确设置类型时执行的 set_package_properties() 命令。

  • 编译 功能 功能现在了解 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 的变量值。

  • Visual Studio 生成器 用于 VS 2010 及更高版本,在将这些生成器归类为无项目文件设置的原始标记时(AdditionalOptions),它们会将每个源文件的标记放置在目标范围的标记之后。此行为与其他生成器生成的标记顺序保持一致,并且允许特定属性(每个源文件)上的标记覆盖更通用的属性(每个目标)。

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