CMake 3.0 发行说明

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

文档更改

新功能

语法

  • CMake 语言已扩展支持 括号参数括号注释 语法,灵感来自 Lua 的长括号。

    set(x [===[bracket argument]===] #[[bracket comment]])
    

    等长开括号和闭括号之间的内容按字面意思解释,不做变量替换。

    警告

    此语法更改无法以完全兼容的方式实现。不可能制定策略,因为语法解析发生在设置任何策略之前。现有代码使用以开括号开头的未引用参数将在没有任何诊断的情况下被解释为不同。幸运的是,这种语法足够晦涩,在实践中不太可能出现此问题。

生成器

  • 一个新的 CodeLite 附加生成器可与 Makefile 或 Ninja 生成器一起使用。

  • 一个新的 Kate 附加生成器可与 Makefile 或 Ninja 生成器一起使用。

  • Ninja 生成器学习使用 ninja 作业池,当由新的全局属性 JOB_POOLS 指定时。

命令

  • add_library() 命令获得了一种新的 INTERFACE 库类型。接口库没有构建规则,但可以具有定义 使用需求 的属性,并且可以被安装、导出和导入。这对于创建头文件库很有用,该库具有对其他库的具体链接依赖。

  • export() 命令获得了一种新的 EXPORT 模式,该模式从由 install(TARGETS) 命令的 EXPORT 选项配置的导出集中检索要导出的目标列表。这使得从构建树导出与从安装树导出的相同目标变得容易。

  • export() 命令学习与多个依赖的导出集一起工作,从而允许从单个树构建和导出多个包。此功能要求 CMake 等待到生成步骤才能写入输出文件。这意味着不应在项目配置期间稍后 include() 生成的目标文件,因为它们将不可用。而是使用 别名目标。请参阅策略 CMP0024

  • install(FILES) 命令学习支持文件列表中的 生成器表达式

  • project() 命令学习将某些版本变量设置为新 VERSION 选项指定的值或空字符串。请参阅策略 CMP0048

  • string() 命令获得了一种新的 CONCAT 模式。它特别适用于与新的 括号参数 语法结合使用。

  • unset() 命令获得了一个 PARENT_SCOPE 选项,与 set() 命令的匹配。

  • include_external_msproject() 命令学习处理非 C++ 项目,如 .vbproj.csproj

  • ctest_update() 命令学习更新由 Perforce (p4) 版本控制工具管理的工程目录。

  • message() 命令获得了一种 DEPRECATION 模式。此类消息默认不发出,但如果启用 CMAKE_WARN_DEPRECATED,则可能作为警告发出,或者如果启用 CMAKE_ERROR_DEPRECATED,则作为错误发出。

  • target_link_libraries() 命令现在允许重复使用 LINK_PUBLICLINK_PRIVATE 关键字。

变量

属性

模块

  • CheckTypeSize 模块的 check_type_size() 命令和 CheckStructHasMember 模块的 check_struct_has_member() 命令学习了一个新的 LANGUAGE 选项,用于可选地检查 C++ 类型。

  • ExternalData 模块学习在有本地存储可用时,无需 URL 模板即可工作。

  • ExternalProject 函数 ExternalProject_Add 学习了一个新的 GIT_SUBMODULES 选项,用于指定要检出的可用子模块的子集。

  • 添加了一个新的 FindBacktrace 模块,用于支持 find_package(Backtrace) 调用。

  • 添加了一个新的 FindLua 模块,用于支持 find_package(Lua) 调用。

  • FindBoost 模块学习了一个新的 Boost_NAMESPACE 选项,用于更改库名称上的 boost 前缀。

  • FindBoost 模块学习通过新的 Boost_USE_DEBUG_RUNTIME 选项来控制搜索带有 g 标签(用于 MS 调试运行时)的库。它默认设置为 ON,以保持现有行为。

  • FindJavaFindJNI 模块学习使用 JAVA_HOME CMake 变量或环境变量,然后在 OS X 上尝试 /usr/libexec/java_home

  • UseJava 模块函数 add_jar 学习了一个新的 MANIFEST 选项,用于将 -m 选项传递给 jar

  • 引入了一个新的 CMakeFindDependencyMacro 模块,其中包含一个 find_dependency 宏,用于在 包配置文件 中查找传递性依赖项。这些依赖项被 FeatureSummary 模块的列表所省略。

  • FindQt4 模块学习为 Qt 可执行文件创建 导入的目标。这有助于在同一构建系统中同时使用多个 Qt 版本 时消除歧义。

  • FindRuby 模块学习搜索 Ruby 2.0 和 2.1。

生成器表达式

其他 (Other)

  • cmake(1) -E 选项获得了一个新的 sleep 命令。

  • ccmake(1) 对话框学习了如何通过 STRINGS 缓存条目属性来循环遍历枚举的可能值列表。

  • cmake-gui(1) 对话框学习了在会话之间记住窗口设置。

  • cmake-gui(1) 对话框学习了在 Add Entry 对话框中为缓存条目类型进行补全时记住其类型。

新的诊断

  • INTERFACE_INCLUDE_DIRECTORIES 目标属性中命名的目录,这些属性由导入的目标通过 生成器表达式 条件链接,过去没有被检查是否存在。现在它们被检查了。请参阅策略 CMP0027

  • 构建目标名称现在必须匹配一个有效性模式,并且不能再与 CMake 定义的目标冲突。请参阅策略 CMP0037

  • 将自身指定为链接依赖项的构建目标以前是默默接受的,但现在会进行诊断。请参阅 CMP0038

  • target_link_libraries() 命令以前会默默忽略将由 add_custom_target() 创建的构建目标作为其第一个参数的调用,但现在会诊断此错误。请参阅策略 CMP0039

  • add_custom_command() 命令以前会默默忽略指定 TARGET 选项但目标不存在的调用,但现在会诊断此错误。请参阅策略 CMP0040

  • INTERFACE_INCLUDE_DIRECTORIES 目标属性中的相对路径,如果它们包含 生成器表达式,以前会被默默接受,但现在会被拒绝。请参阅策略 CMP0041

  • get_target_property() 命令学习拒绝指定不存在目标的调用。请参阅策略 CMP0045

  • add_dependencies() 命令学习拒绝指定对不存在目标的依赖项的调用。请参阅策略 CMP0046

  • 链接依赖项分析学习假定包含 :: 的名称是指 别名目标导入的目标。如果链接的目标丢失,它现在会产生一个错误。以前在这种情况下 CMake 会生成一个在构建时失败的链接行。请参阅策略 CMP0028

  • project()enable_language() 命令初始化对某种语言的支持时,如果无法找到编译器的完整路径并将其存储在相应的 CMAKE_<LANG>_COMPILER 变量中,现在会产生错误。这会在开始时产生更友好的错误消息,并在不知道有可用编译器时停止处理。

  • 使用 add_library()add_executable() 命令指定的目标源学习拒绝需要额外一层未记录变量扩展的项目。请参阅策略 CMP0049

  • 使用 add_custom_command() 的未记录 SOURCE 签名现在会导致错误。请参阅策略 CMP0050

已弃用和移除的功能

其他更改

  • 版本方案已更改为仅使用两个组件表示功能级别,而不是三个。第三个组件将用于 bug 修复版本或开发版本的日期。有关详细信息,请参阅 CMAKE_VERSION 变量文档。

  • CMake 本身在 Windows 和 OS X 上的默认安装位置不再包含 CMake 版本号。这使得可以轻松替换而无需手动重新生成本地构建树。

  • Visual Studio 10 (2010) 及更高版本的生成器已重命名,以包含产品年份,就像旧 VS 版本的生成器一样。

    这阐明了哪个生成器与哪个 Visual Studio 版本对应。为了兼容性,旧名称仍然被识别。

  • Apple 提供的 Clang 的 CMAKE_<LANG>_COMPILER_ID 值现在是 AppleClang。它必须与上游 Clang 不同,因为版本号不同。请参阅策略 CMP0025

  • QNX 上的 qccCMAKE_<LANG>_COMPILER_ID 值现在是 QCC。它必须与 GNU 不同,因为命令行选项不同。请参阅策略 CMP0047

  • 在 64 位 OS X 上,CMAKE_HOST_SYSTEM_PROCESSOR 值现在正确检测为 x86_64 而不是 i386

  • 在 OS X 上,CMake 默认启用了由 MACOSX_RPATH 目标属性指定的行为。这激活了 @rpath 的使用,用于运行时共享库搜索。请参阅策略 CMP0042

  • build_command() 命令现在返回一个 cmake(1) --build 命令行,而不是直接调用本地构建工具。在使用 Visual Studio 生成器时,CMake 和 CTest 不再要求 CMAKE_MAKE_PROGRAM 预先定位。正确的 msbuild 或 devenv 工具的选择现在尽可能晚地执行,当解决方案(.sln)文件可用时,以便它可以依赖于项目内容。

  • cmake(1) --build 命令现在默认与其本地构建工具共享自己的 stdout 和 stderr 管道。曾经激活此功能的 --use-stderr 选项现在被忽略。

  • $<C_COMPILER_ID:...>$<CXX_COMPILER_ID:...> 生成器表达式 以前执行不区分大小写的比较,但现在已更正为执行区分大小写的比较。请参阅策略 CMP0044

  • 当没有可用的交互式终端时(例如,使用 Ninja 或 IDE 生成器时),内置的 edit_cache 目标将不再默认选择 ccmake(1)。如果可用,将优先选择 cmake-gui(1)

  • ExternalProject 下载步骤学习在某些情况下重新尝试下载,以提高对临时网络故障的健壮性。

  • FeatureSummary 不再列出传递性依赖项,因为它们不是由当前项目直接请求的。

  • Emacs 的 cmake-mode.el 主要编辑模式已在多个方面得到清理和增强。

  • 导入的目标INTERFACE_INCLUDE_DIRECTORIES 中指定的包含目录,在作为 使用要求 处理时,默认被视为 SYSTEM include。