CMake 3.9 发行说明¶
自 CMake 3.8 以来的更改包括以下内容。
新功能¶
语言¶
对于 VS 2010 及以上版本的 Visual Studio 生成器,现在支持
CUDA。这补充了 Makefile 生成器 和Ninja生成器现有的支持。建议使用 CUDA 8.0.61 或更高版本,因为早期版本中存在 VS 集成的已知错误。
生成器¶
对于 VS 2010 及以上版本的 Visual Studio 生成器,当安装了
nasm时,可以支持ASM_NASM语言。Xcode生成器已学会创建 Xcode 模式文件。这是一个实验性功能,可以通过将CMAKE_XCODE_GENERATE_SCHEME变量设置为TRUE值来激活。
命令¶
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变量,以便为编译和链接使用单独的 sysroots。
属性¶
引入了一个新的
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模块,用于提供gtest_add_tests()函数,该函数独立于FindGTest模块。该函数还更新以支持关键字参数,功能已扩展,允许指定测试名称前缀和后缀,使对源文件的依赖成为可选,并将发现的测试用例列表返回给调用者。
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¶
由于
<PackageName>_ROOT变量的新使用引起的回归,CMake 3.9.0 添加的find_命令PACKAGE_ROOT搜索路径组已被移除,不再适用于 3.9 系列。该行为将来可能会以更兼容的方式重新引入。
3.9.2¶
在 macOS 上,默认的应用程序捆绑包
Info.plist文件不再像 3.9.0 和 3.9.1 中那样启用 Hi-DPI 支持。此更改已被撤销,因为它破坏了 iOS 应用程序。Xcode 生成器不再像 3.9.0 和 3.9.1 中那样将“outputPaths”添加到自定义脚本构建阶段。添加此项是为了支持 Xcode 9 的新构建系统,但它破坏了旧版和新版 Xcode 构建系统的增量重建。