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 版本中发生变化。
编译器¶
现在支持针对 MSVC ABI 但具有类似 GNU 命令行的 Windows 上的
Clang编译器变体。添加了对基于 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 图书馆 1 图书馆 2``。cmake(1)命令获得了一个新的--install选项。这可以在构建项目后使用,以在不使用生成的构建系统或本机构建工具的情况下运行安装。cmake(1)命令学习了一个新的 CLI 选项--loglevel。cmake(1)-E remove_directory命令行工具学会了支持删除多个目录。cmake(1)-E tar` 工具已得到改进:
命令¶
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。请参阅政策:policy:CMP0091。添加了
CMAKE_PROJECT_INCLUDE和CMAKE_PROJECT_INCLUDE_BEFORE变量以允许在不知道项目名称的情况下在project()调用的站点注入自定义代码。
特性¶
添加了
ADDITIONAL_CLEAN_FILES目标属性和ADDITIONAL_CLEAN_FILES目录属性。它们允许注册在清理阶段应删除的其他文件。现在可以在 接口库 上设置
PUBLIC_HEADER和PRIVATE_HEADER属性。通过分别传递PUBLIC_HEADER和PRIVATE_HEADER参数,可以使用install(TARGETS)命令安装由这些属性指定的标头。添加了
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参数在配置模式下不再被忽略。请注意,Boost 1.70.0 附带的 CMake 包会忽略传递给 find_package 的 QUIET 参数。这将在下一个 Boost 版本中修复。输入开关“Boost_DETAILED_FAILURE_MSG”已被删除。
Boost_VERSION现在在模块模式下以x.y.z格式报告版本。请参阅政策:policy:CMP0093。
FindCups模块现在提供导入的目标。添加了
FindEnvModules模块以在 CTest Scripts 中使用基于 Lua 和 TCL 的环境模块。FindGLEW 模块现在提供的接口与上游 GLEW 在其自己的 CMake 包文件中提供的接口更加一致。
FindPkgConfig现在使用其他(非库)链接器标志填充导入目标的INTERFACE_LINK_OPTIONS属性。FindPostgreSQL模块学会了分别查找调试和发布变体。模块
FindPython3、FindPython2和FindPython获得了额外的查找策略和控制,以及一个新的默认值。请参阅政策:policy: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*>generator expressions以检索各种工件文件名的前缀、基本名称和后缀:$<TARGET_OBJECTS:...>生成器表达式现在支持SHARED、STATIC、MODULE库和可执行文件。
C测试¶
ctest_submit()命令学习了一个新选项:BUILD_ID。这可用于将 CDash 分配给此构建的 ID 存储到变量中。ctest_update()命令学习了一个新变量:CTEST_UPDATE_VERSION_OVERRIDE。这可用于指定源代码树的当前版本,而不是使用更新命令来发现签出的当前版本。
包装¶
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启用。请参阅政策:policy:CMP0090。Xcode生成器现在至少需要 Xcode 5。为策略“CMP0066”添加了明确的弃用诊断(“CMP0065”及以下已弃用)。
cmake-policies(7)手册解释说所有策略的旧行为都已弃用,项目应该移植到新行为。
其他变化¶
如果
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`。请参阅政策:policy:CMP0092。
定义
__ibmxl__的基于 IBM Clang 的 XL 编译器现在使用编译器 IDXLClang而不是XL。请参阅政策:policy: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++14 标准标志,即使对于 C++98 和 C++11。这与 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¶
CrayPrgEnv编译器包装器支持已针对 Cray 编程环境的 19.06 版本更新,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 中得到修复。