CMake 3.14 发行说明

自 CMake 3.13 以来的更改包括以下内容。

新功能

生成器

  • 添加了 Visual Studio 16 2019 生成器。此生成器处于实验阶段,基于“Visual Studio 2019 Preview 4”,因为此版本的 VS 尚未发布。

    VS 2019 生成器与早期版本的生成器不同之处在于,它不提供在生成器名称中指定目标平台的变体。相反,必须使用 CMAKE_GENERATOR_PLATFORM,例如通过 -A 命令行选项。此外,默认目标平台(架构)现在基于 *宿主* 平台。VS 宿主工具集选择也基于宿主架构。

  • 已更新 Green Hills MULTI 生成器

    • 现在支持 对象库

    • 现在会警告不支持的项目类型,例如共享库。

    • 现在,对于每个调用 project() 命令的目录,都会生成一个顶层 <PROJECT-NAME>.top.gpj 文件。不再创建顶层项目文件 default.gpj

    • 现在会遵守目标重命名和目标输出控制属性,例如 RUNTIME_OUTPUT_DIRECTORYOUTPUT_NAME。这也修复了 install() 生成的安装规则的支持。

    • 现在会遵守源文件属性 INCLUDE_DIRECTORIESCOMPILE_DEFINITIONSCOMPILE_OPTIONS

    • 现在支持未通过 GHS_INTEGRITY_APP 集成文件并设置目标链接标志 -dynamic 的动态下载完整性应用程序。

    • 项目文件的内容现在按名称对源文件组和文件进行排序。将 GHS_NO_SOURCE_GROUP_FILE 目标属性设置为 ON,以生成目标单个项目文件,而不是为每个源文件组生成项目文件。将 CMAKE_GHS_NO_SOURCE_GROUP_FILE 变量设置为 ON,以启用所有目标的此功能。

基于文件的 API

  • 已添加用于客户端获取语义构建系统信息的基于文件的 API。请参阅 cmake-file-api(7) 手册。这旨在替换 IDE 的 cmake-server(7) 模式。

平台

命令行

  • cmake(1) 构建工具模式cmake --build)添加了 --verbose-v 选项以指定详细的构建输出。某些生成器(如 Xcode)目前不支持此选项。

  • cmake(1) -E compare_files 命令新增了 --ignore-eol 选项,用于指定在比较文件时忽略行尾差异(例如 LF 与 CRLF)。

  • cmake-gui(1) 对话框新增了 -S-B 参数,以显式指定源目录和构建目录。

命令

  • file() 命令新增了子命令 CREATE_LINK,可用于创建硬链接或符号链接。

  • file() 命令新增了子命令 READ_SYMLINK,可用于确定符号链接指向的路径。

  • file() 命令新增了 SIZE 模式,用于获取磁盘上文件的大小。

  • find_package() 命令新增了可选解析包配置文件路径中符号链接的功能。请参阅 CMAKE_FIND_PACKAGE_RESOLVE_SYMLINKS 变量。

  • get_filename_component() 命令新增了 LAST_EXTNAME_WLE 变体,用于处理名称中最后一个 . 之后的部分。

  • if() 命令新增了对使用 DEFINED CACHE{VAR} 语法检查缓存变量是否已定义的と支持。

  • install(CODE)install(SCRIPT) 命令新增了对生成器表达式的支持。请参阅策略 CMP0087

  • install(TARGETS) 命令新增了根据 GNUInstallDirs 模块中的变量和内置默认值,为给定目标类型安装到适当的默认目录的功能,而不是使用 DESTINATION 参数。

  • install(FILES)install(DIRECTORY) 命令新增了一组参数,用于将文件作为文件类型安装,根据 GNUInstallDirs 中的相应变量和内置默认值设置目标目录,而不是使用 DESTINATION 参数。

  • list() 操作 REMOVE_ITEMREMOVE_DUPLICATESSORTREVERSEFILTER 现在都接受不存在的变量作为列表,因为对空列表执行这些操作的结果也是空列表。

  • list() 操作 REMOVE_AT 现在指示给定的索引对于不存在的变量或空列表是无效的。

  • try_compile()try_run() 命令新增了 LINK_OPTIONS 选项。

变量

属性

模块

  • 用于检查功能的模块系列(如 CheckCSourceCompiles)获得了管理 LINK_OPTIONS 的能力。

  • 添加了 CheckFortranSourceRuns 模块,提供 check_fortran_source_runs() 命令,用于检查 Fortran 源片段是否可以编译和运行。

  • CMakePackageConfigHelpers 模块的 write_basic_package_version_file() 命令新增了 ARCH_INDEPENDENT 选项,用于支持与架构无关的包。

  • ExternalProject 模块的 ExternalProject_Add() 命令新增了 LOG_DIRLOG_MERGED_STDOUTERR 选项来控制日志记录。

  • ExternalProject 模块的 ExternalProject_Add() 命令新增了 LOG_PATCH,以可选地记录补丁步骤。

  • ExternalProject 模块的 ExternalProject_Add() 命令在同时使用 SOURCE_SUBDIRBUILD_IN_SOURCE 时,学会了应用 SOURCE_SUBDIRBUILD_COMMANDSOURCE_DIR 的给定 SOURCE_SUBDIR 中运行。

  • FetchContent 模块新增了 FetchContent_MakeAvailable() 命令。它接受一个依赖项名称列表,然后遍历这些名称,使用标准模式填充并添加到主构建中。这大大减少了项目中所需的样板代码。

  • FindBISON 模块的 bison_target() 命令现在将 bison 作为一个工作目录来执行 CMAKE_CURRENT_BINARY_DIR。请参阅策略 CMP0088

  • FindCURL 模块新增了支持将协议作为包组件请求的功能。

  • 添加了 FindFontconfig 模块,用于查找 fontconfig

  • FindGDAL 模块现在提供导入的目标。

  • FindGIF 模块现在提供导入的目标。

  • FindGit 模块现在为 Git 可执行文件提供导入的目标。

  • FindIce 模块学会了查找 slice2confluenceslice2matlab

  • 添加了 FindLibinput 模块,用于查找 libinput

  • FindLibLZMA 模块现在提供导入的目标。

  • FindMatlab 模块新增了选项 R2017bR2018a,用于指定要使用的 MEX API 版本;这些选项与 MATLAB R2018a 中 mex 命令的新选项相对应。不再需要 MX_LIBRARY 选项。

  • FindPostgreSQL 模块现在提供导入的目标。

  • FindPython、FindPython2 和 FindPython3 模块新增了对 NumPy 组件的支持。

  • FindPython2、FindPython3 和 FindPython 模块现在支持通过脚本模式运行,通过跳过导入的目标和辅助函数的创建。

  • 添加了 FindSQLite3 模块,用于查找 SQLite v3.x 库。

  • FindX11 模块的变量名已重命名,以匹配其库名称而不是头文件名称。保留了旧变量以兼容。

    • X11_Xxf86misc_INCLUDE_PATH 而不是 X11_xf86misc_INCLUDE_PATH

    • X11_Xxf86misc_LIB 而不是 X11_xf86misc_LIB

    • X11_Xxf86misc_FOUND 而不是 X11_xf86misc_FOUND

    • X11_Xxf86vm_INCLUDE_PATH 而不是 X11_xf86vmode_INCLUDE_PATH

    • X11_Xxf86vm_LIB 而不是 X11_xf86vmode_LIB

    • X11_Xxf86vm_FOUND 而不是 X11_xf86vmode_FOUND

    • X11_xkbfile_INCLUDE_PATH 而不是 X11_Xkbfile_INCLUDE_PATH

    • X11_xkbfile_LIB 而不是 X11_Xkbfile_LIB

    • X11_xkbfile_FOUND 而不是 X11_Xkbfile_FOUND

    • X11_Xtst_INCLUDE_PATH 而不是 X11_XTest_INCLUDE_PATH

    • X11_Xtst_LIB 而不是 X11_XTest_LIB

    • X11_Xtst_FOUND 而不是 X11_XTest_FOUND

    • X11_Xss_INCLUDE_PATH 而不是 X11_Xscreensaver_INCLUDE_PATH

    • X11_Xss_LIB 而不是 X11_Xscreensaver_LIB

    • X11_Xss_FOUND 而不是 X11_Xscreensaver_FOUND

    以下变量已完全弃用,因为它们本质上是重复的。

    • X11_Xinput_INCLUDE_PATH (使用 X11_Xi_INCLUDE_PATH

    • X11_Xinput_LIB (使用 X11_Xi_LIB

    • X11_Xinput_FOUND (使用 X11_Xi_FOUND

  • FindX11 现在提供了 X11_Xext_INCLUDE_PATH

  • FindX11 现在提供导入的目标。

  • UseSWIG 模块学会了在定义了 SWIG_MODULE_NAME 文件属性时,将 -module <module_name> 传递给 SWIG 编译器。请参阅策略 CMP0086

  • UseSWIG 模块新增了一个选项,用于指定 SWIG 源文件扩展名。

生成器表达式

  • 添加了 $<Fortran_COMPILER_ID:...>$<Fortran_COMPILER_VERSION:...> 生成器表达式

  • $<IN_LIST:...> 生成器表达式现在能正确处理空参数。有关详细信息,请参阅 CMP0085

Autogen

CTest

  • ctest(1) 新增了 --show-only=json-v1 选项,以机器可读的 JSON 格式显示测试列表。请参阅手册的 Show as JSON Object Model 部分。

  • ctest_submit() 命令新增了 Done 部分,可用于通知 CDash 构建已完成,并且不会再上传其他部分。

  • CTest 现在可以从单个变量接受仪表板服务器提交 URL。请参阅 ctest(1) 中的 SubmitURL 设置、CTEST_SUBMIT_URL 变量以及 ctest_submit() 命令的 SUBMIT_URL 参数。

弃用和移除的功能

  • 为策略 CMP0064CMP0065CMP0063 及更低版本已弃用)添加了显式弃用诊断。 cmake-policies(7) 手册解释了所有策略的 OLD 行为均已被弃用,并且项目应迁移到 NEW 行为。

  • Xcode 生成器弃用了对 Xcode 5 及更早版本的支持。对这些版本的支持将在 CMake 的未来版本中删除。

  • FindQt 模块不再被 find_package 命令用作查找模块。这允许 Qt Project 上游选择性地提供自己的 QtConfig.cmake 包配置文件,并让应用程序通过 find_package(Qt) 而不是 find_package(Qt CONFIG) 来使用它。请参阅策略 CMP0084

  • 已停止支持在 Windows XP 和 Windows Vista 上运行 CMake。在 cmake.org 上提供的预编译 Windows 二进制文件现在需要 Windows 7 或更高版本。

  • CTest 不再支持通过 ftpscpcpxmlrpc 进行提交。CDash 是 CTest 唯一维护的测试仪表板,它仅支持通过 httphttps 进行提交。

其他更改

  • 对象库链接已修复,以便将对象库的私有链接库传播到消耗目标。

  • 现在,add_subdirectory() 下的安装规则会与调用目录中的安装规则交错。有关详细信息,请参阅策略 CMP0082

  • CMake 现在强制执行最大递归限制,以防止无限递归脚本导致堆栈溢出。可以使用 CMAKE_MAXIMUM_RECURSION_DEPTH 在运行时调整此限制。

  • 通过 CMAKE_<LANG>_CPPCHECK 变量或 <LANG>_CPPCHECK 属性使用 cppcheck 时,如果 cppcheck 根据其命令行选项返回非零值,则构建现在将失败。

  • 现在,当设置 POSITION_INDEPENDENT_CODE 时,将添加管理独立于位置的可执行文件的必需链接选项。项目负责使用 CheckPIESupported 模块来检查 PIE 支持,以确保在链接时会遵守可执行文件的 POSITION_INDEPENDENT_CODE 目标属性。此行为由策略 CMP0083 控制。

  • Visual Studio 生成器(针对 VS 2010 及更高版本)学会了支持通过 add_custom_target() 创建的目标上的 VS_DEBUGGER_* 属性。

  • CPack 模块不再默认使用 CPACK_DEBIAN_ARCHIVE_TYPE 变量中的 paxr 值,因为 dpkg 从未支持 PAX tar 格式。 paxr 值将被映射到 gnutar 并发出弃用消息。

  • CMake 不再对 install(TARGETS) 命令中列出的目标(其 EXCLUDE_FROM_ALL 属性设置为 true)发出警告。

更新

自 CMake 3.14.0 以来的更改包括以下内容。

3.14.1

  • 3.14.0 中添加的 FindFontconfig 模块意外使用了大写的 FONTCONFIG_* 变量名,这不符合我们的约定。3.14.1 修订了该模块以使用 Fontconfig_* 变量名。这与 3.14.0 不兼容,但由于该模块是 3.14 系列中的新模块,因此使用量应该还不广泛。

3.14.3

  • 添加了 CMAKE_VS_PLATFORM_NAME_DEFAULT 变量,以帮助工具链文件与 Visual Studio 16 2019 生成器协同工作,在该生成器中,默认平台现在取决于宿主平台。

3.14.4

  • 在 CMake 3.14.0 到 3.14.3 版本中,使用 target_link_libraries()PRIVATE 依赖项添加到在另一个目录中创建的静态库(根据策略 CMP0079 NEW 行为)时,会错误地将这些依赖项的使用要求传播给链接静态库的依赖项。此问题已修复。此 bug 也存在于 3.13.0 到 3.13.4 版本中,并在 3.13.5 版本中修复。

3.14.5

3.14.6

  • 在 CMake 3.14.0 到 3.14.5 版本中,FindBISON 模块策略 CMP0088 NEW 行为意外地将 .y 输入的相对路径解释为相对于构建目录而不是源目录。此问题已修复。

3.14.7

  • 在 CMake 3.14.0 到 3.14.6 版本中,EXCLUDE_FROM_ALL 目录属性相对于 3.14 之前的行为出现了回归,导致目录中的目标即使在其自身的“all”目标中也被排除。此问题已修复。