CMake 3.3 发行说明

自 CMake 3.2 以来的更改包括:

新特性

生成器 (Generators)

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

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

  • 在 Windows 上新增了一个实验性的 Green Hills MULTI 生成器。Green Hills MULTI 是一个面向嵌入式实时系统的 IDE。

命令 (Commands)

变量 (Variables)

属性 (Properties)

模块 (Modules)

  • 引入了 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

其他 (Other)

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

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

  • 在 OS X 上,CMake 已支持创建 XCTest 束来测试 Xcode 中的 Frameworks 和 App Bundles。FindXCTest 模块提供了便捷函数来处理 XCTEST 束。

已弃用和移除的功能 (Deprecated and Removed Features)

  • 在 OS X 上,cmake-gui(1) 不再显示“Install For Command Line Use”(为命令行使用安装)菜单项。取而代之的是一个“How to Install For Command Line Use”(如何为命令行使用安装)菜单项,它会显示一个信息对话框,解释如何使命令行工具可用。例如:

    /Applications/CMake.app/Contents/bin/cmake-gui --install
    
  • ctest_build()build_command() 命令不再使用 -i 选项指示 make 工具忽略错误。之前,这只针对 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

其他更改 (Other Changes)

  • 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