CMake 3.14 发行说明

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

新功能

生成器

  • 添加了 Visual Studio 16 2019 生成器。这是实验性的,基于“Visual Studio 2019 Preview 4”,因为这个版本的 VS 还没有发布。

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

  • Green Hills MULTI 生成器已更新:

    • 现在支持 对象库

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

    • 现在为调用 project() 命令的每个目录生成一个顶级``<PROJECT-NAME>.top.gpj``。不再创建顶级项目文件“default.gpj”。

    • 现在支持目标重命名和目标输出控制属性,例如:prop_tgt: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 变量以为所有目标启用此功能。

基于文件的 API

  • 添加了一个基于文件的 api,供客户端获取语义构建系统信息。请参阅 cmake-file-api(7) 手册。这旨在取代 IDE 的 cmake-server(7) 模式。

平台

  • CMake 现在支持使用简单的工具链文件对 iOS、tvOS 或 watchOS 进行交叉编译。

命令行

  • cmake(1) Build Tool Mode (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) 命令学会了支持生成器表达式。请参阅政策:policy:CMP0087

  • install(TARGETS) 命令学习了如何根据 GNUInstallDirs 模块中的变量和内置默认值,为给定的目标类型安装到适当的默认目录,代替 `` DESTINATION`` 参数。

  • install(FILES)install(DIRECTORY) 命令学习了一组新的参数,用于将文件安装为文件类型,并根据来自 GNUInstallDirs 的适当变量设置目标和内置默认值,代替``DESTINATION``参数。

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

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

  • try_compile()try_run() 命令获得了一个新的 LINK_OPTIONS 选项。

变量

  • 添加了 CMAKE_BUILD_RPATH_USE_ORIGIN 变量和相应的 BUILD_RPATH_USE_ORIGIN 目标属性以启用相对运行时路径 (RPATH)。这有助于实现构建目录不变的可重定位和可重现构建。

  • 为 Visual Studio Generators 添加了 CMAKE_VS_PLATFORM_NAME_DEFAULT 变量,以报告在未明确设置 CMAKE_GENERATOR_PLATFORM 时使用的默认平台。

特性

模块

  • 检查功能的模块系列(如:module: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_COMMANDSOURCE_DIR 的给定 SOURCE_SUBDIR 中运行。

  • FetchContent 模块获得了一个新的 FetchContent_MakeAvailable() 命令。它接受依赖项名称列表,然后对其进行迭代,使用规范模式将每个依赖项名称填充并添加到主构建中。这显着减少了项目中所需的样板文件数量。

  • FindBISON 模块的 BISON_TARGET 命令现在以 CMAKE_CURRENT_BINARY_DIR 作为工作目录运行 bison。请参阅政策:policy: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 现在提供导入的目标。

  • 如果定义了文件属性“SWIG_MODULE_NAME”,则 UseSWIG 模块学会了将“-module <module_name>”传递给“SWIG”编译器。请参阅政策:policy:CMP0086

  • UseSWIG 模块获得了一个选项来指定 SWIG 源文件扩展名。

生成器表达式

  • 添加了``$<Fortran_COMPILER_ID:...>`` 和``$<Fortran_COMPILER_VERSION:...>`` generator expressions

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

自动生成器

  • 添加了 AUTOMOC_EXECUTABLEAUTORCC_EXECUTABLEAUTOUIC_EXECUTABLE 目标属性。它们都采用指向可执行文件的路径并强制 automoc/autorcc/autouic 使用该可执行文件。

    设置这些也会阻止对这些可执行文件的配置时间测试。当您自己构建这些工具时,这主要有用。

  • 新变量 cmake_global_autogen_targetcmake_global_autogen_autogen_target_name,:actible:cmake_global_autorcc_target' `outorcc'目标。

  • 一个新的 CMAKE_AUTOGEN_ORIGIN_DEPENDS 变量和 :prop_tgt:AUTOGEN_ORIGIN_DEPENDS 目标属性可以设置为启用或禁用将原始目标依赖项转发到相应的 _autogen 目标。

C测试

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

  • ctest_submit() 命令学习了一个新的 Done 部分,可用于通知 CDash 构建已完成,不再上传更多部分。

  • CTest 学会了接受来自单个变量的仪表板服务器提交 URL。请参阅 ctest(1) 中的 SubmitURL 设置、CTEST_SUBMIT_URL 变量和 ctest_submit 命令的 SUBMIT_URL 参数。

弃用和删除的功能

  • 为策略“CMP0064”和“CMP0065”添加了明确的弃用诊断(“CMP0063”及以下已弃用)。 cmake-policies(7) 手册解释说所有策略的旧行为都已弃用,项目应该移植到新行为。

  • Xcode 生成器弃用了对 Xcode 5 之前的 Xcode 版本的支持。在未来的 CMake 版本中将不再支持这些版本。

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

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

  • CTest 不再支持通过“ftp”、“scp”、“cp”和“xmlrpc”提交。 CDash 是 CTest 唯一维护的测试仪表板,它只支持通过 httphttps 提交。

其他变化

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

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

  • CMake 现在施加最大递归限制,以防止无限递归的脚本发生堆栈溢出。可以在运行时使用 CMAKE_MAXIMUM_RECURSION_DEPTH 调整限制。

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

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

  • VS 2010 及更高版本的 Visual Studio Generators 学会了在通过 add_custom_target 创建的目标上支持 VS_DEBUGGER_* 属性。

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

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

更新

自 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 行为)会错误地将这些依赖项的使用要求传播到链接静态库的依赖项。这已得到修复。该错误也存在于 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 之前的行为中退化,导致目录中的目标甚至被排除在它自己的“全部”之外。这已得到修复。