CMake 3.0 发行说明¶
自 CMake 2.8.12 以来所做的更改包括以下内容。
文档更改¶
CMake 文档已转换为 reStructuredText,现在通过 Sphinx (https://www.sphinx-doc.org) 转换为手册和 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-qt(7)cmake-variables(7),替换``cmakevars(1)``
CMake 3.0.0 及更高版本的发行说明现在将包含在 html 文档中。
新功能¶
句法¶
生成器¶
命令¶
add_library()命令学习了一个新的INTERFACE库类型。接口库没有构建规则,但可能具有定义usage requirements的属性,并且可以安装、导出和导入。这对于创建对其他库具有具体链接依赖性的仅标头库很有用。export()命令学习了一种新的EXPORT模式,该模式从install(TARGETS)命令的EXPORT选项配置的导出集中检索要导出的目标列表.这使得从构建树中导出与从安装树中导出的目标相同的目标变得容易。export()命令学会了使用多个依赖导出集,从而允许从单个树构建和导出多个包。该功能要求 CMake 等到生成步骤写入输出文件。这意味着稍后在项目配置期间不应该include()生成的目标文件,因为它不可用。请改用 别名目标。请参阅政策:policy:CMP0024。install(FILES)命令学会了在文件列表中支持generator expressions。project()命令学会了将一些版本变量设置为新的VERSION选项指定的值或空字符串。请参阅政策:policy:CMP0048。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,以便在交叉编译时使用,以在 toolchain 文件 中指定目标平台,该文件由CMAKE_TOOLCHAIN_FILE变量指定。这用于将诸如“--target=<triple>”之类的选项传递给某些交叉编译的编译器驱动程序。引入了变量
CMAKE_MAP_IMPORTED_CONFIG_<CONFIG>以选择性地初始化MAP_IMPORTED_CONFIG_<CONFIG>目标属性。
特性¶
ADDITIONAL_MAKE_CLEAN_FILES目录属性学会了支持generator expressions。引入了一个新的目录属性
CMAKE_CONFIGURE_DEPENDS以允许项目指定配置过程所依赖的其他文件。当其中一个文件被修改时,CMake 将在构建时重新运行。以前,这只能通过将此类文件指定为configure_file()命令的输入来实现。新的 AUTORCC 认证 功能通过允许将``.qrc`` 文件列为目标源来取代调用``qt4_add_resources()`` 的需要。
新的 自动档 功能取代了调用
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宏,用于在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命令。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。
弃用和删除的功能¶
支持为 2.4 之前的 CMake 版本编写的代码的兼容性选项已被删除。
政策禁止在新代码中使用一些不应再调用的过时命令:
政策:policy:CMP0029 不允许
subdir_depends()策略:policy:CMP0030 不允许
use_mangled_mesa()策略:policy:CMP0031 不允许
load_command()策略:policy:CMP0032 不允许
output_required_files()政策:policy:CMP0033 不允许
export_library_dependencies()策略:policy:CMP0034 不允许
utility_source()政策:policy:CMP0035 不允许
variable_requires()策略:policy: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目标属性并使用generator expressionslike$<CONFIG:... >指定每个配置定义。请参阅政策:policy:CMP0043。LOCATION目标属性不应再从非导入目标中读取。它在多配置生成器中没有意义,因为在配置项目时构建配置是未知的。它已被$<TARGET_FILE>生成器表达式取代。请参阅政策:policy:CMP0026。COMPILE_FLAGS目标属性现在被记录为已弃用,但没有发出警告。请改用COMPILE_OPTIONS目标属性或target_compile_options()命令。GenerateExportHeader模块``add_compiler_export_flags`` 函数现已弃用。它已被<LANG>_VISIBILITY_PRESET和VISIBILITY_INLINES_HIDDEN目标属性所取代。
其他变化¶
版本方案更改为仅使用两个组件而不是三个组件用于功能级别。第三个组件现在将用于错误修复版本或开发版本的日期。有关详细信息,请参阅
CMAKE_VERSION变量文档。Windows 和 OS X 上 CMake 本身的默认安装位置不再包含 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 不同,因为版本号不同。请参阅政策:policy:CMP0025。QNX 上
qcc的CMAKE_<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 时。