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 文档中。
新功能¶
语法¶
CMake 语言已使用受 Lua 长括号启发的 Bracket Argument 和 Bracket Comment 语法进行了扩展
set(x [===[bracket argument]===] #[[bracket comment]])
等长的开放和闭合括号之间的内容按字面意思理解,不进行变量替换。
警告
此语法更改无法以完全兼容的方式进行。不可能制定策略,因为语法解析发生在任何设置策略的机会之前。使用以开放括号开头的未加引号的参数的现有代码将被不同地解释,而没有任何诊断。幸运的是,该语法足够晦涩,以至于在实践中不太可能出现此问题。
生成器¶
命令¶
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 语法结合使用时特别有用。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
目录属性学习了支持generator expressions
。引入了新的目录属性
CMAKE_CONFIGURE_DEPENDS
,以允许项目指定配置过程所依赖的其他文件。当这些文件之一被修改时,CMake 将在构建时重新运行。以前,这只能通过将此类文件指定为configure_file()
命令的输入来实现。新的 AUTORCC 功能取代了调用
qt4_add_resources()
的需要,允许将.qrc
文件列为目标源。新的 AUTOUIC 功能取代了调用
qt4_wrap_ui()
的需要。测试属性学习了支持
generator expressions
。这对于为测试属性(如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
宏,用于在package configuration file
中查找传递依赖项。FeatureSummary
模块的列表省略了这些依赖项。FindQt4
模块学习了为 Qt 可执行文件创建 导入目标。这有助于在使用同一构建系统中的多个Qt versions
时消除歧义。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:...>
generator expression
。
其他¶
cmake(1)
-E
选项学习了新的sleep
命令。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 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_<CONFIG>
目录属性和COMPILE_DEFINITIONS_<CONFIG>
目标属性已被弃用。请改为设置相应的COMPILE_DEFINITIONS
目录属性或COMPILE_DEFINITIONS
目标属性,并使用generator expressions
(如$<CONFIG:...>
)来指定每个配置的定义。请参阅策略CMP0043
。不应再从非 IMPORTED 目标读取
LOCATION
目标属性。这在多配置生成器中没有意义,因为在配置项目时构建配置是未知的。它已被$<TARGET_FILE>
生成器表达式取代。请参阅策略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 2010
Visual Studio 11
->Visual Studio 11 2012
Visual 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:...>
generator expressions
以前执行不区分大小写的比较,但现在已更正为执行区分大小写的比较。请参阅策略CMP0044
。当没有可用的交互式终端时(例如,使用
Ninja
或 IDE 生成器),内置的edit_cache
目标将不再默认选择ccmake(1)
。如果可用,则将优先选择cmake-gui(1)
。ExternalProject
下载步骤学会了在某些情况下重新尝试下载,以便更可靠地应对临时网络故障。FeatureSummary
不再列出传递依赖项,因为当前项目没有直接请求它们。cmake-mode.el
主要 Emacs 编辑模式已得到清理并在多个方面得到增强。当作为使用要求处理时,导入目标的
INTERFACE_INCLUDE_DIRECTORIES
中指定的包含目录默认被视为SYSTEM
包含。