CMake 3.0 版本说明

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

文档变更

新功能

语法

  • CMake 语言已扩展了 方括号参数方括号注释 语法,灵感来自 Lua 长括号

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

    位于等长开括号和闭括号之间的内容被逐字取用,不会进行变量替换。

    警告

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

生成器

  • 新的 CodeLite 额外生成器可用于 Makefile 或 Ninja 生成器。

  • 新的 Kate 额外生成器可用于 Makefile 或 Ninja 生成器。

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

命令

  • The add_library() 命令学习了一种新的 INTERFACE 库类型。接口库没有构建规则,但可能具有定义 usage requirements 的属性,并且可以安装、导出和导入。这对于创建仅包含头文件的库非常有用,这些库对其他库具有具体的链接依赖性。

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

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

  • The install(FILES) 命令学习了如何支持文件列表中的 generator expressions

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

  • The string() command has learned a new CONCAT mode. This is especially useful when combined with the new Bracket Argument syntax.

  • The unset() command has learned a PARENT_SCOPE option, similar to that of the set() command.

  • The include_external_msproject() command has learned to handle non-C++ projects like .vbproj or .csproj.

  • The ctest_update() command has learned to update work trees managed by the Perforce (p4) version control tool.

  • The message() command has learned a DEPRECATION mode. These messages are not issued by default, but may be issued as a warning if CMAKE_WARN_DEPRECATED is enabled, or as an error if CMAKE_ERROR_DEPRECATED is enabled.

  • The target_link_libraries() command now allows repeated use of the LINK_PUBLIC and LINK_PRIVATE keywords.

Variables

Properties

Modules

  • The CheckTypeSize module check_type_size macro and the CheckStructHasMember module check_struct_has_member macro have learned a new LANGUAGE option to optionally check C++ types.

  • The ExternalData module has learned to work with no URL templates if a local store is available.

  • The ExternalProject function ExternalProject_Add has learned a new GIT_SUBMODULES option to specify a subset of available submodules to checkout.

  • 添加了一个新的 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 宏,用于查找 package configuration file 中的传递依赖项。这些依赖项被 FeatureSummary 模块的列出所忽略。

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

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

生成器表达式

其他

  • cmake(1)-E 选项学习了新的 sleep 命令。

  • ccmake(1) 对话框学习了尊重 STRINGS 缓存条目属性,以循环遍历可能的枚举值列表。

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

  • cmake-gui(1) 对话框学习了在 Add Entry 对话框中记住缓存条目的类型,以供自动完成。

新的诊断信息

  • 在由 generator expression 有条件地链接的导入目标的 INTERFACE_INCLUDE_DIRECTORIES 目标属性中命名的目录未经检查是否存在。现在已进行检查。参见策略 CMP0027

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

  • 将自身指定为链接依赖项的构建目标被静默接受,但现在会进行诊断。参见 CMP0038

  • target_link_libraries() 命令过去会静默忽略将 add_custom_target() 创建的构建目标作为其第一个参数指定的调用,但现在会诊断此错误。参见策略 CMP0039

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

  • 目标属性 INTERFACE_INCLUDE_DIRECTORIES 中的相对路径,如果包含 generator expression,以前会静默接受,现在则会被拒绝。请参见策略 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

已弃用和已删除的功能

其他更改

  • 版本方案已更改为仅使用两个组件表示功能级别,而不是三个。 第三个组件现在将用于错误修复版本或开发版本的日期。 有关详细信息,请参阅 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:...> generator expressions 过去执行不区分大小写的比较,但现在已更正为执行区分大小写的比较。 请参阅策略 CMP0044

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

  • ExternalProject 下载步骤学会在某些情况下重新尝试下载,以便对临时网络故障更加稳健。

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

  • 主要的 Emacs 编辑模式 cmake-mode.el 已以多种方式清理并增强。

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