CMake 3.0 发行说明

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

文档更改

新功能

句法

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

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

    等长的左括号和右括号之间的内容按字面意思获取,没有变量替换。

    警告

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

生成器

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

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

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

命令

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

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

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

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

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

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

  • 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 配置文件 中查找传递依赖项。 FeatureSummary 模块的清单省略了此类依赖项。

  • FindQt4 模块学会了为 Qt 可执行文件创建 进口目标。这有助于在同一构建系统中使用多个 Qt 版本 <cmake-qt(7)> 时消除歧义。

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

生成器表达式

  • 添加了新的 $<PLATFORM_ID>$<PLATFORM_ID:...> generator expressions

  • $<CONFIG> generator expression 现在有一个不带参数的变体。这相当于 $<CONFIGURATION> 表达式。

  • 添加了新的 $<UPPER_CASE:...>$<LOWER_CASE:...> generator expressions 生成器表达式。

  • 添加了一个新的``$<MAKE_C_IDENTIFIER:...>``:manual:generator expression <cmake-generator-expressions(7)>

其他

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

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

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

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

新诊断

  • 不检查由生成器表达式 <cmake-generator-expressions(7)> 有条件链接的导入目标的 INTERFACE_INCLUDE_DIRECTORIES 目标属性中命名的目录是否存在。现在他们被检查了。请参阅政策:policy:CMP0027

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

  • 将自己指定为链接依赖项的构建目标被静默接受,但现在已被诊断。请参阅:policy:CMP0038

  • target_link_libraries() 命令过去常常默默地忽略指定为第一个参数的构建目标的调用,这些构建目标由 add_custom_target() 创建,但现在诊断出这个错误。请参阅政策:policy:CMP0039

  • add_custom_command() 命令用于静默忽略指定带有不存在目标的 TARGET 选项的调用,但现在诊断出此错误。请参阅政策:policy:CMP0040

  • INTERFACE_INCLUDE_DIRECTORIES 目标属性中的相对路径如果包含 generator expression 过去会被静默接受,但现在被拒绝了。请参阅政策:policy:CMP0041

  • get_target_property() 命令学会了拒绝指定不存在目标的调用。请参阅政策:policy:CMP0045

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

  • 链接依赖分析学会假设名称包含 ::` 是指:ref:Alias Targets进口目标。如果缺少这样的链接目标,它现在会产生错误。以前在这种情况下,CMake 生成了一个在构建时失败的链接行。请参阅政策:policy:CMP0028

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

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

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

弃用和删除的功能

其他变化

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

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

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

    这阐明了哪个生成器适用于每个 Visual Studio 版本。旧名称的兼容性得到认可。

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

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

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

  • 在 OS X 上,CMake 学会了默认启用 MACOSX_RPATH 目标属性指定的行为。这会激活使用“@rpath”进行运行时共享库​​搜索。请参阅政策:policy:CMP0042

  • build_command() 命令现在返回一个 cmake(1) --build 命令行,而不是直接调用本机构建工具。使用 Visual Studio 生成器时,CMake 和 CTest 不再需要 CMAKE_MAKE_PROGRAM 位于最前面。当解决方案 (.sln) 文件可用时,现在会尽可能晚地选择合适的 msbuild 或 devenv 工具,因此它可以取决于项目内容。

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

  • $<C_COMPILER_ID:...> 和``$<CXX_COMPILER_ID:...>`` generator expressions 用于执行不区分大小写的比较但现在已更正为执行区分大小写的比较。请参阅政策:policy:CMP0044

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

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

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

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

  • 进口目标 的 INTERFACE_INCLUDE_DIRECTORIES` 中指定的包含目录被视为 SYSTEM 默认情况下,当处理为 usage requirements 时。