CMake 3.9 发行说明¶
自 CMake 3.8 以来的更改包括以下内容。
新功能¶
语言¶
对于 VS 2010 及以上版本,Visual Studio 生成器现已支持
CUDA。这补充了 Makefile 生成器 和Ninja生成器现有的支持。由于早期版本 VS 集成中存在已知 bug,建议使用 CUDA 8.0.61 或更高版本。
生成器¶
对于 VS 2010 及以上版本,Visual Studio 生成器学会了在安装
nasm时支持ASM_NASM语言。Xcode生成器学会了创建 Xcode 方案文件。这是一个实验性功能,可以通过将CMAKE_XCODE_GENERATE_SCHEME变量设置为TRUE来激活。
命令¶
add_library()命令的add_library()命令的IMPORTED选项学会了支持 对象库。find_library()命令学会了在构建目标为x32ABI 时搜索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模式,该模式根据主机操作系统执行参数分离。
变量¶
添加了一个
CMAKE_ANDROID_NDK_DEPRECATED_HEADERS变量,用于在 使用 NDK 交叉编译 Android 时,请求即使在有统一头文件的情况下仍使用已弃用的头文件。现在,如果有统一头文件,则默认使用统一头文件。引入了一个
CMAKE_AUTOMOC_DEPEND_FILTERS变量,允许CMAKE_AUTOMOC从源文件内容中提取额外的moc依赖文件名称。引入了一个
CMAKE_AUTOUIC_SEARCH_PATHS变量,允许CMAKE_AUTOUIC在比ui_foo.h文件附近更多的位置搜索foo.ui。添加了一个
CMAKE_FIND_LIBRARY_CUSTOM_LIB_SUFFIX变量,用于在lib目录之前,告诉find_library()命令搜索lib<suffix>目录。添加了一个
CMAKE_INTERPROCEDURAL_OPTIMIZATION变量,用于在所有目标上初始化INTERPROCEDURAL_OPTIMIZATION属性。添加了一个
CMAKE_<LANG>_COMPILER_AR变量,用于存储 GCC/Clangar包装器的路径。添加了一个
CMAKE_<LANG>_COMPILER_RANLIB变量,用于存储 GCC/Clangranlib包装器的路径。添加了
CMAKE_SYSROOT_COMPILE和CMAKE_SYSROOT_LINK变量,用于为编译和链接使用单独的 sysroot。
属性¶
引入了一个新的
AUTOGEN_BUILD_DIR目标属性,用于为AUTOMOC、AUTOUIC和AUTORCC设置自定义输出目录。引入了一个新的
AUTOMOC_DEPEND_FILTERS目标属性,允许AUTOMOC从源文件内容中提取额外的moc依赖文件名称。引入了一个新的
AUTOUIC_SEARCH_PATHS目标属性,允许AUTOUIC在比ui_foo.h文件附近更多的位置搜索foo.ui。引入了全局属性
AUTOGEN_SOURCE_GROUP、AUTOMOC_SOURCE_GROUP和AUTORCC_SOURCE_GROUP,允许将AUTOMOC或AUTORCC生成的文件放置在source_group()中。添加了
BUILD_WITH_INSTALL_NAME_DIR目标属性和相应的CMAKE_BUILD_WITH_INSTALL_NAME_DIR变量,以控制是否在构建树中使用INSTALL_NAME_DIR目标属性值。这适用于 macOS 的install_name,而BUILD_WITH_INSTALL_RPATH用于RPATH。向 对象库 添加了
CUDA_PTX_COMPILATION目标属性,以支持编译为.ptx文件而不是主机目标文件。添加了一个全局属性
GENERATOR_IS_MULTI_CONFIG,用于确定当前生成器是否是多配置生成器(例如 Visual Studio 生成器 或Xcode)。现在会强制执行
INTERPROCEDURAL_OPTIMIZATION目标属性。CMake 将无条件添加 IPO 标志,或者在不知道当前编译器的标志时产生错误。现在项目负责在使用该目标属性之前使用CheckIPOSupported模块来检查 IPO 支持。请参见策略CMP0069。现在可以在
WINDOWS_EXPORT_ALL_SYMBOLS目标属性的同时使用显式的.def文件,以便从目标内的目标文件中导出所有符号,再加上链接器在依赖项(例如msvcrt.lib)中找到的显式符号列表。
模块¶
添加了一个
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 作为自定义目标的一部分运行。可以指定其他组件来查找可选工具:dot、mscgen和dia。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_NAME和DESCRIPTION选项的国际化支持。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属性之后指定CPackWiXFragmentXML 标签的属性来完成。请参见CPACK_WIX_PATCH_FILE变量。CPack WIX Generator实现了一个新的CPACK_WIX_ROOT_FOLDER_ID变量,允许使用自定义根文件夹 ID,而不是默认的ProgramFilesFolder/ProgramFiles64Folder。
其他¶
现在支持 GNU 和 Clang 编译器使用链接时优化 (LTO) 标志进行过程间优化 (IPO)。请参见
INTERPROCEDURAL_OPTIMIZATION目标属性和CheckIPOSupported模块。TARGET_OBJECTS生成器表达式现在得到add_custom_command()和file(GENERATE)命令的支持。添加了两个新的信息性生成器表达式来检索 Apple Bundle 目录。第一个
$<TARGET_BUNDLE_DIR:tgt>输出 Bundle 目录的完整路径,另一个$<TARGET_BUNDLE_CONTENT_DIR:tgt>输出 macOS Bundle 和 App Bundle 的Contents目录的完整路径。对于所有其他 Bundle 类型和 SDK,它与$<TARGET_BUNDLE_DIR:tgt>相同。新的表达式有助于独立于 macOS 和 iOS 上的不同 Bundle 类型和布局来查询 Bundle 位置。
已弃用和移除的功能¶
为策略
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 构建系统的增量重建。