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 文档中。
新功能¶
语法¶
生成器¶
命令¶
The
add_library()
命令学习了一种新的INTERFACE
库类型。接口库没有构建规则,但可能具有定义usage requirements
的属性,并且可以安装、导出和导入。这对于创建仅包含头文件的库非常有用,这些库对其他库具有具体的链接依赖性。The
export()
命令学习了一种新的EXPORT
模式,该模式从install(TARGETS)
命令EXPORT
选项配置的导出集中检索要导出的目标列表。这使得从构建树中导出与从安装树中导出的相同目标变得容易。The
export()
命令学习了如何使用多个依赖的导出集,从而允许从单个树中构建和导出多个包。该功能要求 CMake 等待生成步骤完成才能写入输出文件。这意味着不应include()
在项目配置期间稍后包含生成的 target 文件,因为它将不可用。使用 别名目标。请参阅策略CMP0024
。The
install(FILES)
命令学习了如何支持文件列表中的generator expressions
。The
project()
命令学习了如何将某些版本变量设置为由新的VERSION
选项指定的值,或设置为空字符串。请参阅策略CMP0048
。The
string()
command has learned a newCONCAT
mode. This is especially useful when combined with the new Bracket Argument syntax.The
unset()
command has learned aPARENT_SCOPE
option, similar to that of theset()
command.The
include_external_msproject()
command has learned to handle non-C++ projects like.vbproj
or.csproj
.The
ctest_update()
command has learned to update work trees managed by the Perforce (p4) version control tool.The
message()
command has learned aDEPRECATION
mode. These messages are not issued by default, but may be issued as a warning ifCMAKE_WARN_DEPRECATED
is enabled, or as an error ifCMAKE_ERROR_DEPRECATED
is enabled.The
target_link_libraries()
command now allows repeated use of theLINK_PUBLIC
andLINK_PRIVATE
keywords.
Variables¶
Variable
CMAKE_FIND_NO_INSTALL_PREFIX
has been introduced to tell CMake not to add the value ofCMAKE_INSTALL_PREFIX
to theCMAKE_SYSTEM_PREFIX_PATH
variable by default. This is useful when building a project that installs some of its own dependencies to avoid finding files it is about to replace.Variable
CMAKE_STAGING_PREFIX
was introduced for use when cross-compiling to specify an installation prefix on the host system that differs from aCMAKE_INSTALL_PREFIX
value meant for the target system.Variable
CMAKE_SYSROOT
was introduced to specify the toolchain SDK installation prefix, typically for cross-compiling. This is used to pass a--sysroot
option to the compiler and as a prefix searched byfind_*
commands.Variable
CMAKE_<LANG>_COMPILER_TARGET
was introduced for use when cross-compiling to specify the target platform in the toolchain file specified by theCMAKE_TOOLCHAIN_FILE
variable. This is used to pass an option such as--target=<triple>
to some cross-compiling compiler drivers.Variable
CMAKE_MAP_IMPORTED_CONFIG_<CONFIG>
has been introduced to optionally initialize theMAP_IMPORTED_CONFIG_<CONFIG>
target property.
Properties¶
The
ADDITIONAL_MAKE_CLEAN_FILES
directory property has learned to supportgenerator expressions
.A new directory property
CMAKE_CONFIGURE_DEPENDS
was introduced to allow projects to specify additional files on which the configuration process depends. CMake will re-run at build time when one of these files is modified. Previously this was only possible to achieve by specifying such files as the input to aconfigure_file()
command.A new AUTORCC feature replaces the need to invoke
qt4_add_resources()
by allowing.qrc
files to be listed as target sources.A new AUTOUIC feature replaces the need to invoke
qt4_wrap_ui()
.Test properties learned to support
generator expressions
. This is useful to specify per-configuration values for test properties likeREQUIRED_FILES
andWORKING_DIRECTORY
.A new
SKIP_RETURN_CODE
test property was introduced to tellctest(1)
to treat a particular test return code as if the test were not run. This is useful for test drivers to report that certain test requirements were not available.New types of Compatible Interface Properties were introduced, namely the
COMPATIBLE_INTERFACE_NUMBER_MAX
andCOMPATIBLE_INTERFACE_NUMBER_MIN
for calculating numeric maximum and minimum values respectively.
Modules¶
The
CheckTypeSize
modulecheck_type_size
macro and theCheckStructHasMember
modulecheck_struct_has_member
macro have learned a newLANGUAGE
option to optionally check C++ types.The
ExternalData
module has learned to work with no URL templates if a local store is available.The
ExternalProject
functionExternalProject_Add
has learned a newGIT_SUBMODULES
option to specify a subset of available submodules to checkout.添加了一个新的
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
对话框中记住缓存条目的类型,以供自动完成。
新的诊断信息¶
在由
generator expression
有条件地链接的导入目标的INTERFACE_INCLUDE_DIRECTORIES
目标属性中命名的目录未经检查是否存在。现在已进行检查。参见策略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
。
已弃用和已删除的功能¶
支持为早于 2.4 版本的 CMake 编写的代码的兼容性选项已被删除。
在策略中,新代码不再允许调用几个长期过时的命令。
策略
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
变量文档。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_<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
。内置
edit_cache
目标在没有交互式终端可用时(例如,使用Ninja
或 IDE 生成器)不再默认选择ccmake(1)
。 相反,如果可用,cmake-gui(1)
将被优先选择。ExternalProject
下载步骤学会在某些情况下重新尝试下载,以便对临时网络故障更加稳健。FeatureSummary
不再列出传递依赖项,因为它们不是由当前项目直接请求的。主要的 Emacs 编辑模式
cmake-mode.el
已以多种方式清理并增强。在处理为 使用需求 时,默认情况下,导入目标 的
INTERFACE_INCLUDE_DIRECTORIES
中指定的目录被视为SYSTEM
包含目录。