CMake 3.0 发行说明

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

文档变更

新功能

语法

  • CMake 语言已使用受 Lua 长括号启发的 Bracket ArgumentBracket Comment 语法进行了扩展

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

    等长的开放和闭合括号之间的内容按字面意思理解,不进行变量替换。

    警告

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

生成器

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

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

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

命令

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

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

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

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

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

  • string() 命令学习了一种新的 CONCAT 模式。它与新的 Bracket Argument 语法结合使用时特别有用。

  • unset() 命令学习了与 set() 命令的 PARENT_SCOPE 选项匹配的选项。

  • 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 宏,用于在 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 对话框中完成的缓存条目的类型。

新的诊断信息

  • 在导入目标的 INTERFACE_INCLUDE_DIRECTORIES 目标属性中命名的目录,这些导入目标通过 generator expression 条件性链接,以前不会检查其是否存在。现在会检查了。请参阅策略 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 变量文档。

  • Windows 和 OS X 上 CMake 本身的默认安装位置不再包含 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

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

  • ExternalProject 下载步骤学会了在某些情况下重新尝试下载,以便更可靠地应对临时网络故障。

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

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

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