CMake 3.14 发行说明

自 CMake 3.13 起所做的更改包括以下内容。

新功能

生成器

  • 添加了 Visual Studio 16 2019 生成器。由于尚未发布此版本,因此这是实验性的并基于“Visual Studio 2019 Preview 4”。

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

  • 已更新 Green Hills MULTI 生成器

基于文件的 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 参数,用于明确指定源和构建目录。

Commands

  • 命令 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() 命令学会在使用 BUILD_IN_SOURCE 时应用 SOURCE_SUBDIRBUILD_COMMAND 在给定的 SOURCE_DIRSOURCE_SUBDIR 内运行。

  • FetchContent 模块获得一个新的 FetchContent_MakeAvailable() 命令。它接受依赖性名称的列表,然后迭代它,填充并使用规范模式将其添加至主要版本中。这显著地降低了项目中所需样板例子的数量。

  • 现在 FindBISON 模块的 BISON_TARGET 命令以 CMAKE_CURRENT_BINARY_DIR 作为工作目录,运行 bison。请参阅策略 CMP0088

  • 现在 FindCURL 模块支持将协议作为包组件请求。

  • 已添加 FindFontconfig 模块来查找 fontconfig

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

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

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

  • 现在 FindIce 模块已学会查找 slice2confluenceslice2matlab

  • 已添加 FindLibinput 模块来查找 libinput

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

  • 现在 FindMatlab 模块获得了新的选项 R2017bR2018a,用于指定要使用的 MEX API 版本;这些选项反映了 MATLAB R2018a 中 mex 命令的新选项。不再需要 MX_LIBRARY 选项。

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

  • 模块 FindPythonFindPython2FindPython3 已支持 NumPy 组件。

  • 现在,模块 FindPython2FindPython3FindPython 支持在脚本模式下运行,方法是跳过创建导入目标和助手函数。

  • 模块 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 模块已学会将 -module <module_name> 传递给 SWIG 编译器,如果已定义文件属性 SWIG_MODULE_NAME。请参阅策略 CMP0086

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

Generator Expressions(生成器表达式)

  • generator expressions 已添加 $<Fortran_COMPILER_ID:...>$<Fortran_COMPILER_VERSION:...>

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

Autogen

CTest

  • ctest(1) 获得 --show-only=json-v1 选项,以机器可读的 JSON 格式显示测试列表。请参见手册中的 以 JSON 对象模型显示 部分。

  • 命令 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 以前的 Xcode 版本的支持。对这些版本的 Xcode 的支持将在 CMake 的未来版本中放弃。

  • FindQt 模块不再被 find_package() 命令用作 find 模块。这允许 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 进行提交。

其他更改

更新

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

3.14.1

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

3.14.3

3.14.4

  • 在CMake 3.14.0 到 3.14.3 中,调用 target_link_libraries() 以向在另一个目录中创建的静态库(在策略 CMP0079 NEW 行为下)添加 PRIVATE 依赖项会导致错误地传播这些依赖项的使用要求到链接此静态库的从属项。此问题已得到修复。此错误还存在于 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”。此问题已得到修复。