CMake 3.9 发行说明¶
自 CMake 3.8 以来的更改包括以下内容。
新特性¶
语言¶
CUDA
现在受 Visual Studio 生成器 支持,适用于 VS 2010 及更高版本。这补充了 Makefile 生成器 和Ninja
生成器对 CUDA 的现有支持。建议使用 CUDA 8.0.61 或更高版本,因为早期版本在 VS 集成中存在已知错误。
构建生成器¶
适用于 VS 2010 及更高版本的 Visual Studio 生成器 学习了在安装
nasm
时支持ASM_NASM
语言。Xcode
生成器学习了创建 Xcode schema 文件。这是一个实验性功能,可以通过将CMAKE_XCODE_GENERATE_SCHEME
变量设置为TRUE
值来激活。
命令¶
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
模式,该模式根据主机操作系统执行参数分离。
变量¶
添加了
CMAKE_ANDROID_NDK_DEPRECATED_HEADERS
变量,以便在 使用 NDK 为 Android 进行交叉编译 时,即使统一标头可用,也请求使用已弃用的标头。现在的默认设置是在统一标头可用时使用它们。引入了
CMAKE_AUTOMOC_DEPEND_FILTERS
变量,以允许CMAKE_AUTOMOC
从源文件的内容中提取moc
的其他依赖文件名。引入了
CMAKE_AUTOUIC_SEARCH_PATHS
变量,以允许CMAKE_AUTOUIC
在更多位置搜索foo.ui
,而不仅仅是包含ui_foo.h
的文件附近。添加了
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
变量,以便为编译和链接使用单独的 sysroot。
属性¶
引入了一个新的
AUTOGEN_BUILD_DIR
目标属性,用于为AUTOMOC
、AUTOUIC
和AUTORCC
设置自定义输出目录。引入了一个新的
AUTOMOC_DEPEND_FILTERS
目标属性,以允许AUTOMOC
从源文件的内容中提取moc
的其他依赖文件名。引入了一个新的
AUTOUIC_SEARCH_PATHS
目标属性,以允许AUTOUIC
在更多位置搜索foo.ui
,而不仅仅是包含ui_foo.h
的文件附近。引入了全局属性
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 支持。请参阅策略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 添加 setup 测试,-FC
阻止为匹配的 fixture 添加 cleanup 测试,-FA
阻止为匹配的 fixture 添加任何测试。添加了
DISABLED
测试属性,以标记已配置但显式禁用的测试,以便它们不运行。
CPack¶
CPack 归档生成器
学习了按组件修改文件名。请参阅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 生成器
学习了新的提示CPACK_IFW_ROOT
变量,用于查找安装在非标准位置的 QtIFW 工具套件。CPack productbuild 生成器
获得了一个新的CPACK_PRODUCTBUILD_RESOURCES_DIR
变量,用于指定要复制到Resources
目录中的资源。CPack RPM 生成器
学习了修改debuginfo
包名称。请参阅CPACK_RPM_DEBUGINFO_FILE_NAME
变量。现在,
CPack WIX Generator
修补系统能够设置额外的属性。这可以通过在使用Id
属性后,使用CPackWiXFragment
XML 标签来指定属性来完成。请参阅CPACK_WIX_PATCH_FILE
变量。The
CPack WIX Generator
实施了一个新的CPACK_WIX_ROOT_FOLDER_ID
变量,该变量允许使用自定义根文件夹 ID,而不是默认的ProgramFilesFolder
/ProgramFiles64Folder
。
其他¶
现在,GNU 和 Clang 编译器在使用链接时间优化 (LTO) 标志时支持过程间优化 (IPO)。请参阅
INTERPROCEDURAL_OPTIMIZATION
目标属性和CheckIPOSupported
模块。TARGET_OBJECTS
generator expression
现在被add_custom_command()
和file(GENERATE)
命令支持。添加了两个新的信息性生成器表达式来检索 Apple Bundle 目录。第一个表达式
$<TARGET_BUNDLE_DIR:tgt>
输出 Bundle 目录的完整路径,另一个表达式$<TARGET_BUNDLE_CONTENT_DIR:tgt>
输出 macOS Bundles 和 App Bundles 的Contents
目录的完整路径。对于所有其他 bundle 类型和 SDK,它与$<TARGET_BUNDLE_DIR:tgt>
相同。新的表达式有助于查询 Bundle 位置,而无需考虑 macOS 和 iOS 上不同的 Bundle 类型和布局。
已弃用和移除的功能¶
为策略
CMP0036
及更低版本添加了显式的弃用诊断。cmake-policies(7)
手册解释说,所有策略的 OLD 行为都已弃用,项目应始终尽快移植到 NEW 行为。Visual Studio 8 2005
生成器现已弃用,并将在 CMake 的未来版本中移除。Visual Studio 7 .NET 2003
生成器已被移除。Xcode
生成器已停止支持低于 3 的 Xcode 版本。FindDoxygen
模块已弃用多个变量。由于上游 curl 7.52 中的更改,CMake 捆绑的 curl 版本不再接受
file://c:/...
形式的 URL(在 Windows 上)。请改用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
搜索路径组已从 3.9 系列中移除,原因是由于新使用<PackageName>_ROOT
变量而导致的回退。此行为将来可能会以更兼容的方式重新引入。
3.9.2¶
在 macOS 上,默认应用程序 bundle
Info.plist
文件不再像 3.9.0 和 3.9.1 中那样启用 Hi-DPI 支持。此更改必须被还原,因为它破坏了 iOS 应用程序。Xcode 生成器不再像 3.9.0 和 3.9.1 中那样向自定义脚本构建阶段添加 "outputPaths"。添加此功能是为了尝试支持 Xcode 9 的新构建系统,但破坏了旧的和新的 Xcode 构建系统的增量重建。