CMake 3.3 发行说明

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

新特性

生成器

  • Makefile 生成器 现在将 .DELETE_ON_ERROR 添加到包含磁盘文件实际构建规则的 makefile 中。这告诉 GNU make 在规则配方修改输出但失败时删除规则输出。

  • Visual Studio 生成器 学习支持 .xaml 源文件,并自动将它们与相应的 .h.cpp 源文件关联起来。

  • 在 Windows 上添加了一个新的实验性 Green Hills MULTI 生成器。Green Hills MULTI 是用于嵌入式实时系统的 IDE。

命令

变量

属性

模块

  • 引入了 CheckFortranCompilerFlag 模块来检查 Fortran 编译器标志,就像 CheckCCompilerFlag 模块已经为 C 所做的那样。

  • ExternalData 模块学习了一个新的 ExternalData_NO_SYMLINKS 选项,以禁用使用符号链接来填充实际数据文件,而改用副本。

  • ExternalData 模块在 DATA{} 引用中学习了一个新的 RECURSE: 选项,用于指定目录。这允许匹配关联文件的整个目录树。

  • ExternalData 模块学习了一个新的 URL 模板占位符 %(algo:<key>),以允许通过配置新的 ExternalData_URL_ALGO_<algo>_<key> 变量来自定义从算法名称到 URL 组件的映射。这允许在远程 URL 中有更大的灵活性。

  • ExternalProject 模块学习替换每个步骤的 BYPRODUCTS 中的标记,例如 <BINARY_DIR>

  • ExternalProject 模块 API 学习在使用 LOG_* 选项和 CMake 初始缓存选项时支持 生成器表达式

  • FindBoost 模块现在分别针对 RELEASE 和 DEBUG 配置跟踪包含库的目录。

  • FindCUDA 模块现在默认使用静态 CUDA 运行时库(如果可用)。提供了一个新的 CUDA_USE_STATIC_CUDA_RUNTIME 选项来控制此行为。

  • FindMatlab 模块已完全重写。它了解了版本和组件,并以更精确和多平台的方式查找 Matlab。该模块现在提供用于创建 mex 扩展、文档和单元测试的 API。

  • FindPackageHandleStandardArgs 模块 find_package_handle_standard_args 函数现在始终填充 <PackageName>_FOUND<UPPERCASE_NAME>_FOUND 变量(后者用于向后兼容)。FOUND_VAR 选项现在被忽略,除了强制执行其允许的值。

  • InstallRequiredSystemLibraries 模块学习了一个新的 CMAKE_INSTALL_SYSTEM_RUNTIME_COMPONENT 选项来指定安装组件。

生成器表达式

  • 引入了一个新的 COMPILE_LANGUAGE 生成器表达式,以允许基于每个源文件的 LANGUAGE 指定目标文件的编译选项。由于底层原生构建工具的限制,此功能在不同生成器之间的支持程度各不相同。有关详细信息,请参阅 cmake-generator-expressions(7) 手册。

CTest

CPack

其他

  • 编译特性 功能现在了解 Windows 上 GNU 编译器(版本 4.4 到 5.0)支持的特性。

  • cmake(1) -E tar 命令学习了一个新的 --format<format> 选项,以指定要写入的存档格式。

  • 在 OS X 上,CMake 学习创建 XCTest bundle 以在 Xcode 中测试 Frameworks 和 App Bundles。FindXCTest 模块提供了方便的函数来处理 XCTEST bundle。

已弃用和移除的特性

  • 在 OS X 上,cmake-gui(1) 不再具有 为命令行使用安装 菜单项。相反,有一个 如何为命令行使用安装 菜单项,该菜单项显示一个信息对话框,解释如何使命令行工具可用。例如

    /Applications/CMake.app/Contents/bin/cmake-gui --install
    
  • ctest_build()build_command() 命令不再告诉 make 工具使用 -i 选项忽略错误。以前,这是为 Makefile 生成器 完成的,但不是为其他生成器完成的。请参阅策略 CMP0061

  • Visual Studio 10 2010 生成器不再检查是否打开了项目的 VS IDE 正在运行,也不再要求它们重新加载。最初,这是为 VS 10 完成的,因为它已经为 VS 7 到 9 完成,以避免提示解决方案中的每个项目。由于 VS >= 10 允许一次重新加载整个解决方案,因此它们不需要 CMake 来帮助它们。

  • Visual Studio 7 生成器 (.NET 2002) 现已弃用,将在 CMake 的未来版本中删除。

  • Visual Studio 6 生成器现已弃用,将在 CMake 的未来版本中删除。

  • find_package() 命令不再考虑最近在 cmake-gui(1) 中配置的项目构建树。以前仅在 Windows 上完成此操作,现在永远不会完成。NO_CMAKE_BUILDS_PATH 选项现在被忽略(如果给定),并且实际上始终处于启用状态。项目可以填充 用户包注册表,以帮助用户一个接一个地构建多个依赖项目。

  • add_definitions() 命令不再导致填充 DEFINITIONS 目录属性。请参阅策略 CMP0059

  • 对于 Visual Studio 7、8 和 9 生成器,$(OutDir) 占位符的值不再评估为配置名称。项目应改用 $(ConfigurationName)

  • 不再允许将 export() 的输出与 install(FILES) 命令一起使用。有关详细信息,请参阅策略 CMP0062

其他更改

  • Ninja 生成器现在要求调用 add_custom_command()add_custom_target() 命令使用 BYPRODUCTS 选项来显式指定自定义命令生成的任何未列为输出的文件(可能是因为它们的时间戳允许比输入旧)。请参阅策略 CMP0058

  • Makefile 生成器 的构建时进度输出已得到改进。在并行构建期间,它不再混合进度和构建规则消息。链接规则消息现在具有进度,并显示为粗体绿色而不是粗体红色(因为红色通常与错误消息相关联)。

  • Visual Studio 7、8 和 9 的 CMAKE_CFG_INTDIR 变量值现在是 $(ConfigurationName) 而不是 $(OutDir)。这应该对变量的预期用例没有影响。

  • 在隐式链接器搜索目录(例如 /usr/lib/libfoo.a)中通过完整路径链接到库文件不再要求链接器搜索库(例如 -lfoo),现在通过完整路径链接。请参阅策略 CMP0060