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 版本中修复。