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。该模块现在提供 API 来创建 mex 扩展、文档和单元测试。

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

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

生成器表达式 (Generator Expressions)

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

CTest

CPack

其他 (Other)

  • 编译特性 功能现在能够识别 GNU 编译器在 Windows 4.4 到 5.0 版本中支持的特性。

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

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

已弃用和移除的功能 (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