CMake 3.15 版本说明¶
自 CMake 3.14 以来的更改包括以下内容。
新功能¶
生成器¶
Xcode
生成器现在支持每个目标方案。请参阅CMAKE_XCODE_GENERATE_SCHEME
变量和XCODE_GENERATE_SCHEME
目标属性。Green Hills MULTI
生成器已更新现在支持
add_custom_command()
和add_custom_target()
命令。它现在可在 Linux 上使用。
语言¶
为
Ninja
生成器添加了对Swift
语言的初步支持使用
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
)特定文件或目录。它现在支持 Zstandard 压缩,并带有
--zstd
选项。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
模块进行了重构,使其“Config”和“Module”模式之间的用户体验更加一致,并且与其他查找模块的整体体验也更一致。现在定义了一个新的导入目标
Boost::headers
(与Boost::boost
相同)。添加了新的输出变量
Boost_VERSION_MACRO
、Boost_VERSION_MAJOR
、Boost_VERSION_MINOR
、Boost_VERSION_PATCH
和Boost_VERSION_COUNT
。传递给
find_package()
的QUIET
参数在配置模式下不再被忽略。请注意,CMake 随 Boost1.70.0
提供的包会忽略传递给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
模块增加了管理替代库名称的功能,通过为python
语言传递-interface <library_name>
或为CSharp
语言传递-dllimport <library_name>
给SWIG
编译器。
生成器表达式¶
生成器表达式
$<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*>
生成器表达式
,用于检索各种构件文件名的前缀、基本名称和后缀。$<TARGET_OBJECTS:...>
生成器表达式现在支持SHARED
、STATIC
、MODULE
库和可执行文件。
CTest¶
ctest_submit()
命令增加了一个新选项:BUILD_ID
。这可以用来将 CDash 分配给此构建的 ID 存储到一个变量中。ctest_update()
命令现在可以识别一个新变量:CTEST_UPDATE_VERSION_OVERRIDE
。这可以用来指定源代码树的当前版本,而不是使用 update 命令来发现当前签出的版本。
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__
的基于 Clang 的 IBM XL 编译器现在使用编译器 IDXLClang
而不是XL
。请参阅策略CMP0089
。命令
file(REMOVE)
和file(REMOVE_RECURSE)
已更改为忽略带警告的空参数,而不是将它们视为相对路径并删除当前目录的内容。
更新¶
自 CMake 3.15.0 以来的更改包括以下内容。
3.15.1¶
在 CMake 3.15.0 中,对针对 MSVC ABI 的类似 GNU 的
Clang
编译器的支持实现了CMAKE_CXX_STANDARD
值 98 和 11,使用了相应的-std=
标志。然而,这些模式不适用于 MSVC 标准库。因此,CMake 3.15.1 即使对于 C++98 和 C++11 也传递 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¶
Cray PrgEnv 编译器包装器支持已为 Cray 编程环境的 19.06 版本进行了更新,该版本在 XC Cray 系统上默认的链接模式已从静态改为动态。
3.15.4¶
在 CMake 3.15.0 到 3.15.3 版本中,目录属性
EXCLUDE_FROM_ALL
相对于 3.14 之前的行为出现了回归,导致目录内的目标即使在其自身的“all”目标中也被排除。此问题已修复。此 bug 也存在于 3.14.0 至 3.14.6 版本中,并在 3.14.7 版本中修复。