CMake 3.9 发行说明¶
自 CMake 3.8 以来所做的更改包括以下内容。
新功能¶
语言¶
VS 2010 及更高版本的 Visual Studio Generators 现在支持
CUDA。这补充了 Makefile Generators 和 Ninja 生成器的现有支持。由于早期版本的 VS 集成中存在已知错误,建议使用 CUDA 8.0.61 或更高版本。CMake 现在知道:prop_tgt:C++ 标准 <CXX_STANDARD> 和:prop_tgt:C 标准 <C_STANDARD> 及其相关的元特性,用于以下
编译器 ID:Cray、PGI和XL。
生成器¶
Visual Studio 生成器 for VS 2010 and above learned to support the
ASM_NASMlanguage whennasmis installed.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变量,以便在 :ref:`使用 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变量,告诉find_library()命令在通常搜索的每个lib目录之前搜索lib<suffix>目录。添加了
CMAKE_INTERPROCEDURAL_OPTIMIZATION变量以初始化所有目标上的INTERPROCEDURAL_OPTIMIZATION属性。添加了一个
CMAKE_<LANG>_COMPILER_AR变量来保存ar的 GCC/Clang 包装器的路径。添加了一个
CMAKE_<LANG>_COMPILER_RANLIB变量来保存ranlib的 GCC/Clang 包装器的路径。添加了
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构建树中二进制文件的目标属性值。这适用于 macOSinstall_name,因为BUILD_WITH_INSTALL_RPATH适用于RPATH。CUDA_PTX_COMPILATION目标属性已添加到 对象库 以支持编译为 .ptx` 文件而不是宿主对象文件。添加了
GENERATOR_IS_MULTI_CONFIG全局属性以确定当前生成器是否为多配置生成器(例如 Visual Studio 生成器 或Xcode)。INTERPROCEDURAL_OPTIMIZATION目标属性现在在启用时强制执行。 CMake 将无条件地添加 IPO 标志,或者如果它不知道当前编译器的标志则产生错误。该项目现在负责使用 CheckIPOSupported 模块在启用目标属性之前检查 IPO 支持。请参阅政策:policy: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 模块的:command:gtest_add_tests 函数。该函数也被更新以支持关键字参数,功能扩展到允许指定测试名称前缀和后缀,对源文件的依赖是可选的,并将发现的测试用例列表返回给调用者。
C测试¶
ctest_submit()命令获得了一个HTTPHEADER选项来指定在提交期间发送的自定义标头。ctest(1)可执行文件获得了新选项,允许开发人员禁用自动将测试添加到测试集以满足夹具依赖性。-FS防止为匹配提供的正则表达式的夹具添加设置测试,-FC防止为匹配的夹具添加清理测试,-FA防止为匹配的夹具添加任何测试。添加了
DISABLED测试属性以标记已配置但显式禁用的测试,因此它们不会运行。
包装¶
CPack Archive Generator学会了修改每个组件的文件名。请参阅CPACK_ARCHIVE_FILE_NAME变量及其每个组件版本CPACK_ARCHIVE_<component>_FILE_NAME。CPackComponent模块cpack_add_component()命令获得了一个新的PLIST <filename>选项,用于在使用 :module 时指定pkgbuild--component-plist参数 :productbuild <CPackProductBuild> 生成器。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。
其他¶
使用链接时间优化 (LTO) 标志的 GNU 和 Clang 编译器现在支持过程间优化 (IPO)。请参阅
INTERPROCEDURAL_OPTIMIZATION目标属性和CheckIPOsupported模块。TARGET_OBJECTSgenerator expression现在由add_custom_command()和file(GENERATE)命令支持。添加了两个用于检索 Apple Bundle 目录的新信息生成器表达式。第一个
$<TARGET_BUNDLE_DIR:tgt>输出 Bundle 目录的完整路径,另一个$<TARGET_BUNDLE_CONTENT_DIR:tgt>输出到Contents目录的完整路径macOS 捆绑包和 App 捆绑包。对于所有其他捆绑包类型和 SDK,它与$<TARGET_BUNDLE_DIR:tgt>相同。新表达式有助于查询独立于 macOS 和 iOS 上不同 Bundle 类型和布局的 Bundle 位置。
弃用和删除的功能¶
为策略“CMP0036”及以下添加了明确的弃用诊断。
cmake-policies(7)手册解释说,所有策略的旧行为都已弃用,项目应始终尽快移植到新行为。Visual Studio 8 2005生成器现已弃用,并将在未来版本的 CMake 中删除。Visual Studio 7 .NET 2003生成器已被删除。Xcode生成器不再支持早于 3 的 Xcode 版本。FindDoxygen 模块弃用了几个变量。
由于上游 curl 7.52 的更改,与 CMake 捆绑在一起的 curl 版本在 Windows 上不再接受
file://c:/...形式的 URL。使用形式file:///c:/...而不是在所有版本上工作。
其他变化¶
使用
AUTOMOC 时,CMake 现在会扫描 ``Q_PLUGIN_METADATA`宏的存在,并在来自宏的FILE参数的文件发生更改时重新运行 moc。当
AUTOMOC检测到形式为``#include "moc_<basename>.cpp"`` 的包含语句时,搜索相应的头文件现在也会在目标的INCLUDE_DIRECTORIES中查找.在运行测试时,CTest 学会了将跳过的测试(使用
SKIP_RETURN_CODE属性)处理为与使用新的DISABLED属性的测试相同。由于此更改,当所有测试都被跳过或通过时,CTest 将不会指示失败。Ninja生成器放宽了对象编译的依赖性。对象编译现在仅依赖于与对象目标所依赖的库关联的自定义目标和自定义命令,不再依赖于库本身。依赖目标中的源文件现在可以编译而无需等待其目标的依赖项链接。在 macOS 上,
RPATH设置,例如BUILD_WITH_INSTALL_RPATH不再影响install_name字段。请参阅政策:policy:CMP0068。Visual Studio 14 2015生成器已了解 VS 2015 更新对v140工具集的更改。 VS 更改了它理解的生成“-DEBUG”链接器标志变体的“GenerateDebugInformation”链接器设置的值集。
更新¶
自 CMake 3.9.0 以来所做的更改包括以下内容。
3.9.1¶
CMake 3.9.0 添加的
find_命令PACKAGE_ROOT搜索路径组已从 3.9 系列中删除,这是由于新使用<PackageName>_ROOT变量导致的回归。将来可能会以更兼容的方式重新引入该行为。
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 构建系统的增量重建。