CMake 3.0 发布说明

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

文档更改

新功能

语法

  • CMake 语言已通过受 Lua 长括号启发的 括号参数括号注释语法进行了扩展。

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

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

    警告

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

生成器

  • 可使用 Makefile 或 Ninja 生成器获得新的 CodeLite 附加生成器。

  • 可使用 Makefile 或 Ninja 生成器获得新的 Kate 附加生成器。

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

命令

  • add_library 命令支持了新的 INTERFACE 库类型。Interface 库没有构建规则,但可以具有定义 使用要求 的属性,并且可以被安装、导出和导入。这对于创建具有其他库的具体链接依赖关系的仅头文件库很有用。

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

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

  • install(FILES) 命令支持在文件列表中使用 生成器表达式

  • project() 命令学会了将一些版本变量设置为由新的 VERSION 选项指定的值或空字符串。请参阅策略 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_PUBLIC 和 LINK_PRIVATE 关键字。

变量

  • 引入了变量 CMAKE_FIND_NO_INSTALL_PREFIX,用于告知 CMake 默认不将 CMAKE_INSTALL_PREFIX 的值添加到 CMAKE_SYSTEM_PREFIX_PATH 变量中。这在使用项目安装其自身依赖项以避免查找其即将替换的文件时很有用。

  • 引入了 CMAKE_STAGING_PREFIX 变量,用于交叉编译时指定主机系统上的安装前缀,该前缀与目标系统上的 CMAKE_INSTALL_PREFIX 值不同。

  • 引入了 CMAKE_SYSROOT 变量,用于指定工具链 SDK 的安装前缀,通常用于交叉编译。这用于将 --sysroot 选项传递给编译器,并作为 find_* 命令搜索的前缀。

  • 引入了 CMAKE__COMPILER_TARGET 变量,用于交叉编译时,在 CMAKE_TOOLCHAIN_FILE 变量指定的 工具链文件 中指定目标平台。这用于向某些交叉编译编译器驱动程序传递 --target= 等选项。

  • 引入了 CMAKE_MAP_IMPORTED_CONFIG_ 变量,用于可选地初始化 MAP_IMPORTED_CONFIG_ 目标属性。

属性

  • ADDITIONAL_MAKE_CLEAN_FILES 目录属性支持 生成器表达式

  • 引入了新的目录属性 CMAKE_CONFIGURE_DEPENDS,允许项目指定配置过程依赖的其他文件。当这些文件中的任何一个被修改时,CMake 将在构建时重新运行。以前,这只能通过将这些文件指定为 configure_file() 命令的输入来实现。

  • 新的 AUTORCC 功能通过允许将 .qrc 文件列为目标源,取代了调用 qt4_add_resources() 的需要。

  • 新的 AUTOUIC 功能取代了调用 qt4_wrap_ui() 的需要。

  • 测试属性学会了支持 生成器表达式。这对于为诸如 REQUIRED_FILES 和 WORKING_DIRECTORY 等测试属性指定每个配置的值很有用。

  • 引入了新的测试属性 SKIP_RETURN_CODE,用于告知 ctest(1) 将特定测试的返回码视为未运行。这对于测试驱动程序报告某些测试需求不可用非常有用。

  • 引入了新的 兼容接口属性 类型,即 COMPATIBLE_INTERFACE_NUMBER_MAX 和 COMPATIBLE_INTERFACE_NUMBER_MIN,分别用于计算数值的最大值和最小值。

模块

  • 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,以保持现有行为。

  • FindJava 和 FindJNI 模块学会了使用 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 对话框学会了响应 STRINGS 缓存条目属性,以循环遍历枚举的可能值列表。

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

  • cmake-gui 对话框学会了记住缓存条目的类型,以便在“添加条目”对话框中进行补全。

新的诊断

  • 之前,在由 生成器表达式 条件链接的导入目标的 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__COMPILER 变量中,现在将视为错误。这可以提供更好的初步错误消息,并在未找到可用编译器时停止处理。

  • add_library() 或 add_executable() 命令中指定的 Target 源学会了拒绝需要额外层变量扩展的项目。请参阅策略 CMP0049。

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

已弃用和移除的功能

  • 移除了支持 CMake 2.4 之前版本代码的兼容性选项。

  • 已通过策略禁止了几个长期过时的、不应再调用的命令。

    • 策略 CMP0029 禁止 subdir_depends()。

    • 策略 CMP0030 禁止 use_mangled_mesa()。

    • 策略 CMP0031 禁止 load_command()。

    • 策略 CMP0032 禁止 output_required_files()。

    • 策略 CMP0033 禁止 export_library_dependencies()。

    • 策略 CMP0034 禁止 utility_source()。

    • 策略 CMP0035 禁止 variable_requires()。

    • 策略 CMP0036 禁止 build_name()。

  • cmake(1) -i 向导模式已移除。请改用交互式对话框,如 ccmake(1),或使用 -D 选项从命令行设置缓存值。

  • 支持 --help-man 和 --help-html 等命令行选项的内置文档格式化程序已移除,取而代之的是上述新文档系统。这些以及其他曾经生成 man 和 html 格式页面的命令行选项不再有效。cmake(1) --help-custom-modules 选项现在会在运行时产生警告,并生成一个报告限制的最小文档。

  • 目录属性 COMPILE_DEFINITIONS_ 和目标属性 COMPILE_DEFINITIONS_ 已被弃用。请改用相应的 COMPILE_DEFINITIONS 目录属性或 COMPILE_DEFINITIONS 目标属性,并使用 $ 等生成器表达式来指定每个配置的定义。请参阅策略 CMP0043。

  • 不再应从非导入的目标读取 LOCATION 目标属性。由于在配置项目时未知构建配置,因此在多配置生成器中没有意义。它已被 $ 生成器表达式所取代。请参阅策略 CMP0026。

  • 目标属性 COMPILE_FLAGS 已被文档化为已弃用,尽管不会发出警告。请改用 COMPILE_OPTIONS 目标属性或 target_compile_options() 命令。

  • GenerateExportHeader 模块的 add_compiler_export_flags 命令现已弃用。它已被 _VISIBILITY_PRESET 和 VISIBILITY_INLINES_HIDDEN 目标属性所取代。

其他更改

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

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

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

    • Visual Studio 10 -> Visual Studio 10 2010

    • Visual Studio 11 -> Visual Studio 11 2012

    • Visual Studio 12 -> Visual Studio 12 2013

    这澄清了哪个生成器与哪个 Visual Studio 版本匹配。为了兼容性,旧名称仍然被识别。

  • Apple 提供的 Clang 的 CMAKE__COMPILER_ID 值现在是 AppleClang。它必须与上游 Clang 区分开,因为版本号不同。请参阅策略 CMP0025。

  • QNX 上的 qcc 的 CMAKE__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 选项现在被忽略。

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

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

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

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

  • cmake-mode.el 主 Emacs 编辑模式已在多个方面进行了清理和增强。

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