CMake 3.9 发行说明

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

新功能

语言

生成器

命令

  • add_library() 命令的 add_library() 命令的 IMPORTED 选项学会了支持 对象库

  • find_library() 命令学会了在构建目标为 x32 ABI 时搜索 libx32 路径。请参见 FIND_LIBRARY_USE_LIBX32_PATHS 全局属性。

  • include_external_msproject() 命令学会了使用 MAP_IMPORTED_CONFIG_<CONFIG> 目标属性将当前配置映射到外部配置。

  • install(TARGETS) 命令学会了新的 OBJECTS 选项来指定安装 对象库 的位置。

  • install(EXPORT) 命令学会了如何导出 对象库

  • project() 命令学会了一个可选的 DESCRIPTION 参数来设置 PROJECT_DESCRIPTION 变量。

  • separate_arguments() 命令获得了 NATIVE_COMMAND 模式,该模式根据主机操作系统执行参数分离。

变量

属性

模块

  • 添加了一个 CheckIPOSupported 模块,以帮助项目检查当前工具链和 CMake 版本是否支持过程间优化 (IPO)。

  • CMakeFindDependencyMacro 模块的 find_dependency 宏现在将所有参数转发给底层的 find_package() 调用。现有用法将继续按原样工作,但调用者现在可以访问 find_package() 接受的完整参数集。

  • FeatureSummary 模块的 feature_summary() 命令现在接受新的 DEFAULT_DESCRIPTION 选项,该选项将打印所选包类型的默认标题。

  • FeatureSummary 模块获得了一个新的 FeatureSummary_<TYPE>_DESCRIPTION 变量,该变量可以为每个 <TYPE> 定义,以便在模块在输出字符串中使用包类型时,将类型名称替换为指定的字符串。

  • FindDoxygen 模块学会了使用 CMake 变量控制 Doxygen 的行为,并通过新添加的 doxygen_add_docs() 命令生成文档。Doxygen 输入文件(Doxyfile)会自动生成,doxygen 作为自定义目标的一部分运行。可以指定其他组件来查找可选工具:dotmscgendia

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

  • FindProtobuf 模块的 protobuf_generate_cpp() 命令获得了一个 EXPORT_MACRO 选项,用于指定 DLL 导出标记宏的名称。

  • FindProtobuf 模块现在支持通过新的 Protobuf_USE_STATIC_LIBS 输入变量在 Unix 上使用静态库。

  • FindProtobuf 模块现在提供导入的目标(当找到库时)。

  • 添加了一个新的 GoogleTest 模块,用于独立于 FindGTest 模块提供 gtest_add_tests() 函数。该函数还更新为支持关键字参数,功能得到扩展,允许指定测试名称前缀和后缀,源文件的依赖项可以设为可选,并将发现的测试用例列表返回给调用者。

CTest

  • ctest_submit() 命令获得了一个 HTTPHEADER 选项,用于指定提交时发送的自定义标头。

  • ctest(1) 可执行文件获得了新的选项,允许开发人员禁用自动添加测试以满足 fixture 依赖。 -FS 可阻止添加匹配提供的正则表达式的 fixture 的设置测试,-FC 可阻止添加匹配的 fixture 的清理测试,-FA 可阻止为匹配的 fixture 添加任何测试。

  • 添加了一个 DISABLED 测试属性,用于标记已配置但显式禁用的测试,使其不运行。

CPack

  • CPack Archive Generator 学会了按组件修改文件名。请参见 CPACK_ARCHIVE_FILE_NAME 变量及其按组件的版本 CPACK_ARCHIVE_<component>_FILE_NAME

  • CPackComponent 模块的 cpack_add_component() 命令获得了一个新的 PLIST <filename> 选项,用于在使用 productbuild 生成器时指定 pkgbuild--component-plist 参数。

  • CPackIFW 模块的 cpack_ifw_configure_component()cpack_ifw_configure_component_group() 命令获得了 DISPLAY_NAMEDESCRIPTION 选项的国际化支持。

  • CPack IFW Generator 学会了新的提示变量 CPACK_IFW_ROOT,用于查找安装在非标准位置的 QtIFW 工具套件。

  • CPack productbuild Generator 获得了一个新的 CPACK_PRODUCTBUILD_RESOURCES_DIR 变量,用于指定要复制到 Resources 目录中的资源。

  • CPack RPM Generator 学会了修改 debuginfo 包名。请参见 CPACK_RPM_DEBUGINFO_FILE_NAME 变量。

  • CPack WIX Generator 的修补系统现在能够设置附加属性。这可以通过在 Id 属性之后指定 CPackWiXFragment XML 标签的属性来完成。请参见 CPACK_WIX_PATCH_FILE 变量。

  • CPack WIX Generator 实现了一个新的 CPACK_WIX_ROOT_FOLDER_ID 变量,允许使用自定义根文件夹 ID,而不是默认的 ProgramFilesFolder / ProgramFiles64Folder

其他

已弃用和移除的功能

  • 为策略 CMP0036 及以下版本添加了显式的弃用诊断。 cmake-policies(7) 手册解释说,所有策略的 OLD 行为都已被弃用,项目应尽快迁移到 NEW 行为。

  • Visual Studio 8 2005 生成器已被弃用,将在 CMake 的未来版本中移除。

  • 已移除 Visual Studio 7 .NET 2003 生成器。

  • Xcode 生成器已停止支持 Xcode 3 以下版本。

  • FindDoxygen 模块已弃用多个变量。

  • CMake 捆绑的 curl 版本不再接受 Windows 上的 file://c:/... 形式的 URL,因为上游 curl 7.52 进行了更改。请使用 file:///c:/... 形式以在所有版本上正常工作。

其他更改

  • 在使用 AUTOMOC 时,CMake 现在会扫描 Q_PLUGIN_METADATA 宏的存在,并在宏的 FILE 参数指定的文件更改时重新运行 moc。

  • AUTOMOC 检测到形如 #include "moc_<basename>.cpp" 的 include 语句时,对相应头文件的搜索现在也会查找目标 INCLUDE_DIRECTORIES

  • 在运行测试时,CTest 学会了将跳过的测试(使用 SKIP_RETURN_CODE 属性)与具有新 DISABLED 属性的测试进行相同的处理。由于此更改,当所有测试都被跳过或通过时,CTest 不会指示失败。

  • Ninja 生成器已放宽了对象编译的依赖关系。对象编译现在仅依赖于与对象目标所依赖的库关联的自定义目标和自定义命令,不再依赖于库本身。依赖目标中的源文件现在可以在等待其目标的依赖项链接之前进行编译。

  • 在 macOS 上,RPATH 设置(如 BUILD_WITH_INSTALL_RPATH)不再影响 install_name 字段。请参见策略 CMP0068

  • Visual Studio 14 2015 生成器已获悉 VS 2015 更新对 v140 工具集的更改。VS 更改了其为 GenerateDebugInformation 链接器设置所理解的值集,该设置会生成 -DEBUG 链接器标志变体。

更新

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

3.9.1

  • 由于 CMake 3.9.0 添加的 find_ 命令 PACKAGE_ROOT 搜索路径组因新的 <PackageName>_ROOT 变量的使用而导致回归,已在 3.9 系列中移除。该行为将来可能会以更兼容的方式重新引入。

3.9.2

  • 在 macOS 上,默认应用程序 Bundle Info.plist 文件不再像 3.9.0 和 3.9.1 中那样启用 Hi-DPI 支持。此更改不得不被撤销,因为它破坏了 iOS 应用程序。

  • Xcode 生成器不再将“outputPaths”添加到自定义脚本构建阶段,这与 3.9.0 和 3.9.1 中的行为不同。添加此项是为了支持 Xcode 9 的新构建系统,但它破坏了旧版和新版 Xcode 构建系统的增量重建。