CMake 3.0 发行说明¶
自 CMake 2.8.12 以来的更改包括以下内容。
文档更改¶
CMake 文档已转换为 reStructuredText,现在通过 Sphinx (https://sphinx-doc.cn) 转换为 man 和 html 页面。这使得文档能够被正确索引并包含交叉引用。
从旧的内部文档格式转换是通过自动过程完成的,因此某些文档可能仍包含瑕疵。它们将随着时间的推移而逐步更新。
已实现一个基本的 reStructuredText 处理器来支持
cmake --help-command和类似的命令行选项。新增手册
cmake-commands(7),取代cmakecommands(1)和cmakecompat(1)cmake-modules(7),取代cmakemodules(1)cmake-policies(7),取代cmakepolicies(1)cmake-properties(7),取代cmakeprops(1)cmake-variables(7),取代cmakevars(1)
CMake 3.0.0 及更高版本的发行说明将包含在 html 文档中。
新功能¶
语法¶
生成器¶
命令¶
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_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_<LANG>_COMPILER_TARGET,用于在交叉编译时,在CMAKE_TOOLCHAIN_FILE变量指定的 工具链文件 中指定目标平台。这用于将--target=<triple>之类的选项传递给某些交叉编译的编译器驱动程序。引入了变量
CMAKE_MAP_IMPORTED_CONFIG_<CONFIG>,用于可选地初始化MAP_IMPORTED_CONFIG_<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_HOMECMake 变量或环境变量,然后在 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命令。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。
已弃用和移除的功能¶
删除了支持为 CMake 2.4 之前版本编写的代码的兼容性选项。
几个长期过时的、不应再调用的命令已通过策略在新的代码中被禁止。
策略
CMP0029禁止subdir_depends()策略
CMP0030禁止use_mangled_mesa()策略
CMP0031禁止load_command()策略
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_<CONFIG>目录属性和COMPILE_DEFINITIONS_<CONFIG>目标属性已被弃用。现在应设置相应的COMPILE_DEFINITIONS目录属性或COMPILE_DEFINITIONS目标属性,并使用生成器表达式,如$<CONFIG:...>,来指定每个配置的定义。请参阅策略CMP0043。LOCATION目标属性不应再从非导入目标读取。在多配置生成器中没有意义,因为在配置项目时不知道构建配置。它已被$<TARGET_FILE>生成器表达式取代。请参阅策略CMP0026。COMPILE_FLAGS目标属性现在被记录为已弃用,尽管不发出警告。请改用COMPILE_OPTIONS目标属性或target_compile_options()命令。GenerateExportHeader模块命令add_compiler_export_flags现在已弃用。它已被<LANG>_VISIBILITY_PRESET和VISIBILITY_INLINES_HIDDEN目标属性所取代。
其他更改¶
版本方案已更改为仅使用两个组件表示功能级别,而不是三个。第三个组件将用于 bug 修复版本或开发版本的日期。有关详细信息,请参阅
CMAKE_VERSION变量文档。CMake 本身在 Windows 和 OS X 上的默认安装位置不再包含 CMake 版本号。这使得可以轻松替换而无需手动重新生成本地构建树。
Visual Studio 10 (2010) 及更高版本的生成器已重命名,以包含产品年份,就像旧 VS 版本的生成器一样。
Visual Studio 10->Visual Studio 10 2010Visual Studio 11->Visual Studio 11 2012Visual Studio 12->Visual Studio 12 2013
这阐明了哪个生成器与哪个 Visual Studio 版本对应。为了兼容性,旧名称仍然被识别。
Apple 提供的 Clang 的
CMAKE_<LANG>_COMPILER_ID值现在是AppleClang。它必须与上游 Clang 不同,因为版本号不同。请参阅策略CMP0025。QNX 上的
qcc的CMAKE_<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中指定的包含目录,在作为 使用要求 处理时,默认被视为SYSTEMinclude。