CMake 3.9 发布说明¶
自 CMake 3.8 以来的更改包括以下内容。
新功能¶
语言¶
CUDA
现在受 Visual Studio 生成器(适用于 VS 2010 及更高版本)支持。这补充了 Makefile 生成器 和Ninja
生成器现有的支持。由于早期版本在 VS 集成中存在已知错误,因此建议使用 CUDA 8.0.61 或更高版本。
生成器¶
Visual Studio 生成器(适用于 VS 2010 及更高版本)学会了在安装
nasm
时支持ASM_NASM
语言。Xcode
生成器学会了创建 Xcode 模式文件。这是一个实验性功能,可以通过将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
在包含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
变量来保存 GCC/Clang 的ranlib
包装器的路径。添加了
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>
定义它,以便在模块通过输出字符串使用程序包类型时,用指定的字符串替换类型名称。The
FindDoxygen
模块学会了使用 CMake 变量控制 Doxygen 的行为,并通过新添加的doxygen_add_docs()
函数生成文档。Doxygen 输入文件(Doxyfile
)会自动生成,并且 doxygen 会作为自定义目标的一部分运行。可以指定其他组件来查找可选工具:dot
、mscgen
和dia
。The
FindMPI
模块现在提供了导入的目标。The
FindProtobuf
模块的protobuf_generate_cpp()
命令新增了一个EXPORT_MACRO
选项,用于指定 DLL 导出标记宏的名称。The
FindProtobuf
模块现在通过新的Protobuf_USE_STATIC_LIBS
输入变量支持在 Unix 上使用静态库。The
FindProtobuf
模块现在在找到库时提供导入的目标。添加了一个新的
GoogleTest
模块,以提供gtest_add_tests()
函数,独立于FindGTest
模块。该函数也已更新为支持关键字参数,功能扩展为允许指定测试名称前缀和后缀,使源文件依赖项可选,并将发现的测试用例列表返回给调用方。
CTest¶
The
ctest_submit()
命令新增了一个HTTPHEADER
选项,用于指定在提交过程中发送的自定义标头。The
ctest(1)
可执行文件新增了选项,允许开发人员禁用自动将测试添加到测试集中以满足夹具依赖项的功能。-FS
阻止为与提供的正则表达式匹配的夹具添加设置测试,-FC
阻止为匹配的夹具添加清理测试,-FA
阻止为匹配的夹具添加任何测试。添加了一个
DISABLED
测试属性,用于标记已配置但显式禁用的测试,以便它们不会运行。
CPack¶
The
CPack Archive Generator
学会了根据每个组件修改文件名。请参阅CPACK_ARCHIVE_FILE_NAME
变量及其每个组件版本CPACK_ARCHIVE_<component>_FILE_NAME
。The
CPackComponent
模块的cpack_add_component()
命令新增了一个PLIST <filename>
选项,用于在使用productbuild
生成器时指定pkgbuild
--component-plist
参数。The
CPackIFW
模块的cpack_ifw_configure_component()
和cpack_ifw_configure_component_group()
命令为DISPLAY_NAME
和DESCRIPTION
选项增加了国际化支持。The
CPack IFW Generator
学习了新的提示CPACK_IFW_ROOT
变量,用于查找安装在非标准位置的 QtIFW 工具套件。The
CPack productbuild Generator
新增了一个CPACK_PRODUCTBUILD_RESOURCES_DIR
变量,用于指定要复制到Resources
目录中的资源。The
CPack RPM Generator
学会了修改debuginfo
包的名称。请参阅CPACK_RPM_DEBUGINFO_FILE_NAME
变量。The
CPack WIX Generator
修补系统现在能够设置其他属性。这可以通过在Id
属性之后使用CPackWiXFragment
XML 标记指定属性来完成。请参阅CPACK_WIX_PATCH_FILE
变量。The
CPack WIX Generator
实现了一个新的CPACK_WIX_ROOT_FOLDER_ID
变量,它允许使用自定义根文件夹 ID 而不是默认的ProgramFilesFolder
/ProgramFiles64Folder
。
其他¶
现在支持使用链接时优化 (LTO) 标记针对 GNU 和 Clang 编译器进行过程间优化 (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)
手册解释说,所有策略的旧行为都已弃用,并且项目应尽快移植到新行为。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 语句时,对相应头文件的搜索现在也会在目标的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
文件不再启用 Hi-DPI 支持,就像它在 3.9.0 和 3.9.1 中所做的那样。必须撤消此更改,因为它破坏了 iOS 应用程序。Xcode 生成器不再像在 3.9.0 和 3.9.1 中那样向自定义脚本构建阶段添加“outputPaths”。这是为了尝试支持 Xcode 9 的新构建系统而添加的,但破坏了旧版和新版 Xcode 构建系统的增量重建。