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 为目标但具有类 GNU 命令行 的
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 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
参数在配置模式下不再被忽略。请注意,Boost1.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
模块学习了通过为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*>
生成器表达式
,以检索各种工件的文件名的前缀、基本名称和后缀现在在
SHARED
、STATIC
、MODULE
库和可执行文件上支持$<TARGET_OBJECTS:...>
生成器表达式。
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
被认为是已弃用的。 仍然存在支持,但将在未来的版本中移除。export(PACKAGE)
命令现在不执行任何操作,除非通过CMAKE_EXPORT_PACKAGE_REGISTRY
启用。 请参阅策略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 中,针对 MSVC ABI 实现的类 GNU
Clang
编译器的支持,使用相应的-std=
标志实现了CMAKE_CXX_STANDARD
值 98 和 11。 但是,这些模式不适用于 MSVC 标准库。 因此,即使对于 C++98 和 C++11,CMake 3.15.1 也传递 C++14 标准标志。 这与 MSVC 本身一致,MSVC 本身始终在了解 C++14 的模式下运行。3.15.0 中添加的初步 Swift 支持已更新。
3.15.2¶
在 CMake 3.15.0 和 3.15.1 中,即使没有
REQUIRED
选项,CMAKE_FIND_PACKAGE_PREFER_CONFIG
变量也会导致find_package()
命令在缺少软件包时失败。 这已被修复。
3.15.3¶
CrayPrgEnv
编译器包装器支持已针对 Cray Programming Environment 的 19.06 版本进行了更新,在该版本中,XC Cray 系统上的默认链接模式现在是动态的而不是静态的。
3.15.4¶
在 CMake 3.15.0 到 3.15.3 中,
EXCLUDE_FROM_ALL
目录属性从 3.14 之前的行为回归,并导致目录中的目标即使从其自身的 "all" 中也被排除。 这已被修复。 该错误也存在于 3.14.0 到 3.14.6 中,并在 3.14.7 中修复。