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()
命令学会了在构建目标为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
变量,用于在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
属性之后指定CPackWiXFragment
XML 标签的属性来完成。请参见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 构建系统的增量重建。