CMake 3.15 版本说明¶
自 CMake 3.14 以来的更改包括以下内容。
新特性¶
生成器¶
Xcode
生成器现在支持单目标方案。见CMAKE_XCODE_GENERATE_SCHEME
变量和XCODE_GENERATE_SCHEME
目标属性。Green Hills MULTI
生成器已更新它现在支持
add_custom_command()
和add_custom_target()
命令。它现在可在 Linux 上使用。
语言¶
Swift
语言的初步支持已添加到Ninja
生成器中使用
SWIFTC
环境变量来指定编译器。Swift_DEPENDENCIES_FILE
目标属性和Swift_DEPENDENCIES_FILE
源文件属性已添加到自定义依赖项文件。添加
Swift_MODULE_NAME
目标属性旨在自定义 Swift 模块名称。添加
Swift_DIAGNOSTICS_FILE
源属性,用于指明序列化 Swift 诊断信息的写入位置。
Swift 支持属于实验性支持,尚未稳定,并且可能在未来的 CMake 版本中发生改变。
编译器¶
现在支持 Windows 上针对 MSVC ABI 的
Clang
编译器变体,它具有类似于 GNU 的命令行。添加了基于 Clang 的 ARM 编译器支持,编译器 ID 为
ARMClang
。添加了对以下 IAR 编译器架构的支持:Renesas RX、RL78、RH850 和 Texas Instruments MSP430。
添加了对专为 Linux 构建的 IAR 编译器 (IAR BuildLx) 的支持。
命令行¶
添加了
CMAKE_GENERATOR
环境变量,用于指定cmake(1)
在未指定-G
选项的情况下运行时要使用的默认生成器。此外,创建了环境变量CMAKE_GENERATOR_PLATFORM
、CMAKE_GENERATOR_TOOLSET
和CMAKE_GENERATOR_INSTANCE
,用于配置生成器。添加了对
cmake(1)
--build
工具--target
参数的多目标支持,例如:cmake --build . --target Library1 Library2
。现在它还具有-t
别名缩写形式,例如:cmake --build . -t Library1 Library2
。添加了
cmake(1)
命令的新选项--install
。该选项可在构建项目后使用,以便在不使用生成的构建系统或原生构建工具的情况下运行安装。cmake(1)
命令学习了一个新 CLI 选项--loglevel
。cmake(1)
命令行工具-E remove_directory
学会支持移除多个目录。cmake(1)
-E tar
工具已经改进即使某些文件不可读,它现在也会继续将文件添加到归档文件中。这种行为与经典
tar
工具更一致。它现在解析所有标志,并且如果提供了无效标志,则会发出警告。
现在,如果没有指定动作标志,它会显示一个错误,以及可能的动作列表:
t
(列表)、c
(创建)或x
(提取)。它现在支持提取(
-x
)或仅列出(-t
)特定文件或目录。它现在支持使用
--zstd
选项进行 Zstandard 压缩。Zstandard 的设计使其压缩率可与 DEFLATE(zip)算法相媲美,但速度更快,尤其是在解压缩方面。
命令¶
add_custom_command()
和add_custom_target()
命令获得了一个新的JOB_POOL
选项,该选项与Ninja
生成器协同工作,以在构建语句中设置池变量。add_library()
命令ALIAS
选项学会支持UNKNOWN
类型的导入库。cmake_parse_arguments()
命令获得了一个额外的<prefix>_KEYWORDS_MISSING_VALUES
输出变量,用于报告调用者提供的没有值的关键字参数。execute_process()
命令获得了一个COMMAND_ECHO
选项和支持的CMAKE_EXECUTE_PROCESS_COMMAND_ECHO
变量以启用在执行之前发送命令行字符串。file(INSTALL)
命令学习了一个新参数,FOLLOW_SYMLINK_CHAIN
,它可以用来递归解析和安装符号链接。list()
学习了新的子命令:PREPEND
,POP_FRONT
和POP_BACK
。message()
命令学习了新的类型:NOTICE
,VERBOSE
,DEBUG
和TRACE
。string()
学习了一个新的子命令REPEAT
。
变量¶
CMAKE_CROSSCOMPILING_EMULATOR
变量和对应的CROSSCOMPILING_EMULATOR
目标属性学习支持传递参数到模拟器。CMAKE_FIND_PACKAGE_PREFER_CONFIG
变量被添加以告知find_package()
调用首先寻找一个包配置文件,即使一个查找模块是可用的。CMAKE_FRAMEWORK
变量已添加来初始化FRAMEWORK
在所有目标上的属性。CMAKE_VS_JUST_MY_CODE_DEBUGGING
变量和VS_JUST_MY_CODE_DEBUGGING
目标属性已添加,以便在使用 MSVC cl 19.05 及更高版本进行编译时启用 Visual Studio 调试器的“仅限我的代码”功能。CMAKE_MSVC_RUNTIME_LIBRARY
变量和MSVC_RUNTIME_LIBRARY
目标属性已引入,以便选择针对 MSVC ABI 的编译器所使用的运行时库。参见策略CMP0091
。CMAKE_PROJECT_INCLUDE
和CMAKE_PROJECT_INCLUDE_BEFORE
变量已添加,以便允许在project()
调用位置注入自定义代码,而不必事先了解项目名称。
属性¶
ADDITIONAL_CLEAN_FILES
目标属性和ADDITIONAL_CLEAN_FILES
目录属性已添加。它们允许注册在清理阶段应该移除的其他文件。PUBLIC_HEADER
和PRIVATE_HEADER
属性现在可以设置在 接口库上。使用install(TARGETS)
命令,通过传递PUBLIC_HEADER
和PRIVATE_HEADER
参数,可以安装那些属性设置的头文件。VS_PACKAGE_REFERENCES
目标属性被添加到告诉 Visual Studio 生成器 添加对nuget
包的引用。VS_PROJECT_IMPORT
目标属性被添加,以允许托管 Visual Studio 项目文件导入外部.props
文件。VS_NO_SOLUTION_DEPLOY
目标属性被添加,以告诉 Visual Studio 生成器 是否将工件部署到 WinCE 或 Windows Phone 目标设备。
模块¶
FindBoost
模块经过重新设计,以在其“配置”和“模块”模式之间以及与其他查找模块之间呈现更加一致的用户体验。现在定义了一个新的导入目标
Boost::headers
(与Boost::boost
相同)。添加了新的输出变量
Boost_VERSION_MACRO
、Boost_VERSION_MAJOR
、Boost_VERSION_MINOR
、Boost_VERSION_PATCH
和Boost_VERSION_COUNT
。传递给
find_package()
的QUIET
参数在配置模式下不再被忽略。请注意,随 Boost 1.70.0 一起提供的 CMake 软件包会忽略传递给find_package()
的QUIET
参数。这已在 Boost 的下一个版本中得到修复。输入开关
Boost_DETAILED_FAILURE_MSG
已被移除。Boost_VERSION
现以x.y.z
格式在模块模式中报告该版本。参阅策略CMP0093
。
FindCups
模块现已提供导入目标。FindEnvModules
模块已添加以在 CTest 脚本 中使用基于 Lua 和 TCL 的环境模块。FindGLEW
模块现提供了一个界面,其与上游 GLEW 在其自己的 CMake 包文件中提供的更为一致。FindPkgConfig
现在会通导入目标的INTERFACE_LINK_OPTIONS
属性填充其他(非库)链接器标志。FindPostgreSQL
模块已学会分别查找调试和发行变量。模块
FindPython3
、FindPython2
和FindPython
已经获得额外的查找策略和控件,以及新的默认设置。参阅策略CMP0094
。模块
FindPython
、FindPython2
和FindPython3
增加了一个新目标(分别为Python::Module
、Python2::Module
和Python3::Module
),可用于开发 Python 模块。模块
FindPython3
、FindPython2
和FindPython
具备了控制如何处理虚拟环境的能力。UseSWIG
模块学会通过向SWIG
编译器传递-interface <library_name>
(针对python
语言)或-dllimport <library_name>
(针对CSharp
语言)来管理备用库名称。
生成器表达式¶
生成器表达式
$<C_COMPILER_ID>
、$<CXX_COMPILER_ID>
、$<CUDA_COMPILER_ID>
、$<Fortran_COMPILER_ID>
、$<COMPILE_LANGUAGE>
、$<COMPILE_LANG_AND_ID>
以及$<PLATFORM_ID>
了解到如何支持从用逗号分隔的列表中匹配一个值。添加了
$<CUDA_COMPILER_ID:...>
和$<CUDA_COMPILER_VERSION:...>
生成器表达式。引入了
$<COMPILE_LANG_AND_ID:...>
生成器表达式,以允许根据CMAKE_<LANG>_COMPILER_ID
和每个源文件LANGUAGE
针对目标文件指定编译选项。添加了
$<FILTER:list,INCLUDE|EXCLUDE,regex>
生成器表达式。添加了
$<REMOVE_DUPLICATES:list>
生成器表达式。$<SHELL_PATH:...>
生成器表达式支持一个路径列表。为获取各种工件的文件名前缀、基础名称和后缀,添加了新的
$<TARGET_FILE*>
generator expressions
。现在,
$<TARGET_OBJECTS:...>
generator expression 在SHARED
、STATIC
、MODULE
库和可执行文件中得到支持。
CTest¶
本
ctest_submit()
命令学习了一个新选项:BUILD_ID
。此选项可用于将 CDash 分配给此构建的 ID 存储到变量中。该
ctest_update()
命令了解到遵循一个新变量:CTEST_UPDATE_VERSION_OVERRIDE
。这可用来指定源代码树的当前版本,而不是使用更新命令发现已签出版本。
CPack¶
该
CPack IFW Generator
获得了一个新CPACK_IFW_PACKAGE_STYLE_SHEET
变量来定制安装程序样式表。
已过时和移除的功能¶
该
cmake-server(7)
模式已被弃用,并将在未来版本的 CMake 中移除。请迁移客户端以使用cmake-file-api(7)
。该
ADDITIONAL_MAKE_CLEAN_FILES
目录属性现在已被弃用。请使用ADDITIONAL_CLEAN_FILES
目录属性。变量
CMAKE_AUTOMOC_RELAXED_MODE
被认为已过时。支持仍存在,但将在未来版本中移除。若未通过
CMAKE_EXPORT_PACKAGE_REGISTRY
启用,现在export(PACKAGE)
命令将不再起作用。请参阅策略CMP0090
。现在生成器
Xcode
至少需要 Xcode 5。为策略
CMP0066
添加了明确的弃用诊断(CMP0065
及以下版本已弃用)。cmake-policies(7)
手册说明,所有策略的 OLD 行为已被弃用,项目应移植到 NEW 行为。
其他更改¶
如果通过
target_compile_features()
指定的功能在编译器的默认标准级别中可用,则 CMake 3.14 及更低版本错误地添加了不必要的-std=
标志,这可能会降低标准级别。此错误已在 CMake 3.15 中修复。此行为更改可能会在依赖于未记录的实现细节的现有项目中暴露出错误。指定编译功能仅确保编译器以具有这些功能的模式运行,而不是使用任何特定标准级别或传递显式-std=
标志。CMake 学会了如何使用 IBM AIX XL 编译器和 SunPro 编译器编译 C++14,以及使用 AppleClang 编译器编译 C++20。
使用类似 MSVC 的编译器时,
CMAKE_<LANG>_FLAGS
的值不再包含警告标志,例如/W3
。请参阅策略CMP0092
。定义
__ibmxl__
的基于 IBM Clang 的 XL 编译器现在使用编译器 IDXLClang
而不是XL
。请参阅策略CMP0089
。命令
file(REMOVE)
和file(REMOVE_RECURSE)
已更改为忽略带有警告的空参数,而不是将其视为相对路径并删除当前目录的内容。
更新¶
自 CMake 3.15.0 以来所做的更改包括以下内容。
3.15.1¶
在 CMake 3.15.0 中,对类 GNU 的
Clang
编译器(针对 MSVC ABI 实施)的支持实现了CMAKE_CXX_STANDARD
值 98 和 11,使用相应的-std=
标志。但这些模式不能与 MSVC 标准库配合使用。因此,即使对于 C++98 和 C++11,CMake 3.15.1 通过 C++14 标准标志。这与 MSVC 本身始终在了解 C++14 的模式中运行一致。在 3.15.0 中增加的初步 Swift 支持已更新。
3.15.2¶
在 CMake 3.15.0 和 3.15.1 中,
CMAKE_FIND_PACKAGE_PREFER_CONFIG
变量导致find_package()
命令在缺少某个数据包时失败,即使没有REQUIRED
选项。此问题已解决。
3.15.3¶
CrayPrgEnv
编译器封装已针对 19.06 版 Cray 编程环境更新,在 XC Cray 系统上的默认链接模式现是动态而不是静态。
3.15.4¶
在 CMake 3.15.0 到 3.15.3 中,
EXCLUDE_FROM_ALL
目录属性从 3.14 之前的行为中恢复,并且导致目录中的目标被排除,甚至从其自身的“所有”中排除。此问题已修复。该错误还存在于 3.14.0 到 3.14.6 中,已在 3.14.7 中修复。