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 上的
Clang编译器变体,该变体以 MSVC ABI 为目标,但具有类 GNU 的命令行。使用编译器 ID
ARMClang添加了对基于 Clang 的 ARM 编译器的支持。添加了对 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 Generators 添加对nuget包的引用。添加了
VS_PROJECT_IMPORT目标属性,以允许托管的 Visual Studio 项目文件导入外部.props文件。添加了
VS_NO_SOLUTION_DEPLOY目标属性,用于指示 Visual Studio Generators 是否将构件部署到 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参数在 config 模式下不再被忽略。请注意,与 Boost1.70.0一起提供的 CMake 包会忽略传递给find_package()的QUIET参数。这将在下一个 Boost 版本中修复。删除了输入开关
Boost_DETAILED_FAILURE_MSG。Boost_VERSION现在会在 module 模式下以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>来管理备用库名称。
生成器表达式¶
生成器表达式
$<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。这可用于指定源代码树的当前版本,而不是使用更新命令来发现当前检出的版本。
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已被视为弃用。支持仍然存在,但将在未来版本中移除。export(PACKAGE)命令现在不做任何事情,除非通过CMAKE_EXPORT_PACKAGE_REGISTRY启用。请参阅策略CMP0090。Xcode生成器现在至少需要 Xcode 5。为策略
CMP0066添加了明确的弃用诊断(CMP0065及更低版本已被弃用)。cmake-policies(7)手册解释说,所有策略的 OLD 行为都已被弃用,项目应移植到 NEW 行为。
其他更改¶
如果
target_compile_features()指定的功能在编译器的默认标准级别可用,CMake 3.14 及以下版本会错误地添加不必要的-std=标志,这可能会降低标准级别。此 bug 已在 CMake 3.15 中修复。此行为更改可能会暴露现有项目中依赖于未记录的实现细节的 bug。指定编译功能仅确保编译器在具有这些功能的模式下运行,而不是传递任何特定的标准级别或显式的-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 本身一致,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 19.06 编程环境版本更新了
CrayPrgEnv编译器包装器支持,该版本在 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 中修复。