CMake 3.6 版本说明¶
自 CMake 3.5 起的更改包括以下内容。
新特性¶
生成器 (Generators)¶
Ninja生成器学会了生成sub/dir/all形式的虚假目标,以驱动子目录的构建。这等同于使用 Makefile 生成器 时执行cd sub/dir; make all。Ninja生成器现在将系统头文件包含在构建依赖中,以确保在系统包更新时正确地重新构建。Visual Studio 14 2015生成器学会了支持 Clang/C2 工具集,例如使用-T v140_clang_3_7选项。此功能是实验性的。
命令 (Commands)¶
add_custom_command()和add_custom_target()命令学会了如何使用CROSSCOMPILING_EMULATOR可执行目标属性。install()命令新增了一个EXCLUDE_FROM_ALL选项,用于将安装规则排除在默认安装之外。list()命令新增了一个FILTER子命令,用于通过正则表达式过滤列表元素。string(TIMESTAMP)和file(TIMESTAMP)命令新增了对%s占位符的支持。这是自 UNIX Epoch 以来经过的秒数。
变量 (Variables)¶
引入了
CMAKE_DEPENDS_IN_PROJECT_ONLY变量,用于告知 Makefile 生成器 仅将依赖扫描限制在项目源文件和构建树中的文件。引入了新的
CMAKE_HOST_SOLARIS变量,用于指示 CMake 何时运行在 Oracle Solaris 主机上。添加了
CMAKE_<LANG>_STANDARD_INCLUDE_DIRECTORIES变量,供工具链文件使用,以指定要追加到所有编译器命令行中的系统包含目录。现在已记录
CMAKE_<LANG>_STANDARD_LIBRARIES变量。它旨在供工具链文件使用,以指定要添加到所有链接器命令行中的系统库。引入了
CMAKE_NINJA_OUTPUT_PATH_PREFIX变量,用于告知Ninja生成器配置生成的build.ninja文件以用作subninja。添加了
CMAKE_TRY_COMPILE_PLATFORM_VARIABLES变量,供工具链文件使用,以指定必须由try_compile()命令传播到测试项目中的特定于平台的变量。添加了
CMAKE_TRY_COMPILE_TARGET_TYPE变量,以可选地告诉try_compile()命令构建一个静态库而不是可执行文件。这对于无法在没有自定义标志或脚本的情况下链接二进制文件的交叉编译工具链很有用。
属性 (Properties)¶
引入了
DEPLOYMENT_REMOTE_DIRECTORY目标属性,用于告知Visual Studio 9 2008和Visual Studio 8 2005生成器为 WinCE 项目部署和调试器设置生成“远程目录”。引入了
<LANG>_CLANG_TIDY目标属性和支持的CMAKE_<LANG>_CLANG_TIDY变量,用于告知 Makefile 生成器 和Ninja生成器与编译器一起为C和CXX语言运行clang-tidy。引入了
TIMEOUT_AFTER_MATCH测试属性,用于可选地告诉 CTest 在匹配测试的某些输出后强制执行二次超时。引入了
VS_CONFIGURATION_TYPE目标属性,用于为支持 VS 2010 及更高版本的 Visual Studio 生成器 指定自定义项目文件类型。引入了
VS_STARTUP_PROJECT目录属性,用于为 Visual Studio 生成器 指定生成解决方案(.sln文件)的默认启动项目。
模块 (Modules)¶
CMakePushCheckState模块现在会推送/弹出/重置在CheckTypeSize中使用的CMAKE_EXTRA_INCLUDE_FILES变量。ExternalProject模块学会了GIT_SHALLOW 1选项,以执行 Git 存储库的浅层克隆。ExternalProject模块学会了递归初始化 Git 子模块,并在更新时初始化新的子模块。使用GIT_SUBMODULES选项限制要初始化和更新的子模块。ExternalProject模块学会了DOWNLOAD_NO_EXTRACT 1参数,以跳过解压下载的文件(例如,用于自解压 shell 安装程序或.msi文件)。ExternalProject模块现在在从 git 存储库获取时使用TLS_VERIFY。FindBLAS和FindLAPACK模块学会了支持 OpenBLAS。FindCUDA模块学会了查找cublas_device库。FindGTest模块的gtest_add_tests函数现在会导致 CMake 在测试源更改时自动重新运行,以便可以重新扫描它们。引入了
FindLTTngUST模块,用于查找 LTTng-UST 库。FindPkgConfig模块学会了可选地为找到的库创建导入的目标。FindProtobuf模块学会了提供Protobuf_VERSION变量,并检查find_package()调用中请求的版本号。InstallRequiredSystemLibraries模块新增了CMAKE_INSTALL_UCRT_LIBRARIES选项,以启用使用 Visual Studio 2015 的 Windows Universal CRT 库的应用程序本地部署。
平台¶
现在支持 CYGWIN 上的 Clang 编译器。
添加了对 Bruce C 编译器(编译器 ID 为
Bruce)的支持。
CTest¶
ctest_update()命令现在会查看CTEST_GIT_INIT_SUBMODULES变量,以确定在更新前是否应更新子模块。ctest_update()命令现在将在更新时同步子模块。添加了子模块或更改了子模块 URL 的更新现在将正确拉取。
CPack¶
CPack DEB Generator学会了在CPACK_DEBIAN_PACKAGE_SHLIBDEPS用于依赖项自动检测时,如何处理CMAKE_INSTALL_RPATH中的$ORIGIN。CPack DEB Generator学会了在包包含共享库时如何生成DEBIAN/shlibs控制文件。CPack DEB Generator学会了在包安装库到由 ldconfig 控制的位置(例如/lib/,/usr/lib/)时如何生成DEBIAN/postinst和DEBIAN/postrm文件。CPack DEB Generator学会了在使用了多组件设置并且设置了CPACK_COMPONENT_<compName>_DEPENDS变量时,如何生成 Debian 包之间的依赖关系。为了向后兼容,此功能默认禁用。请参阅CPACK_DEBIAN_ENABLE_COMPONENT_DEPENDS。CPack DEB Generator学会了如何设置自定义包文件名,包括如何生成命名正确的 Debian 包。<PackageName>_<VersionNumber>-<DebianRevisionNumber>_<DebianArchitecture>.deb
为了向后兼容,此功能默认禁用。请参阅
CPACK_DEBIAN_FILE_NAME和CPACK_DEBIAN_<COMPONENT>_FILE_NAME。CPack DEB Generator学会了如何设置包的发布编号(当与CPACK_DEBIAN_FILE_NAME设置的DEB-DEFAULT值结合使用时,包文件名称中的DebianRevisionNumber)。请参阅CPACK_DEBIAN_PACKAGE_RELEASE。CPack DEB Generator学会了如何按组件设置包架构。请参阅CPACK_DEBIAN_<COMPONENT>_PACKAGE_ARCHITECTURE。CPack DragNDrop Generator新增了一个选项以跳过/Applications符号链接。请参阅CPACK_DMG_DISABLE_APPLICATIONS_SYMLINK变量。CPackIFW模块新增了cpack_ifw_update_repository()命令,用于从远程存储库更新 QtIFW 特定的存储库。CPack RPM Generator学会了在启用时设置 RPMdist标签作为 RPMRelease:标签的一部分(在某些 Linux 发行版上是必需的,例如 Fedora)。请参阅CPACK_RPM_PACKAGE_RELEASE_DIST。CPack RPM Generator学会了为包内容设置拥有用户/组和文件/目录权限的默认值。请参阅CPACK_RPM_DEFAULT_USER、CPACK_RPM_DEFAULT_GROUP、CPACK_RPM_DEFAULT_FILE_PERMISSIONS、CPACK_RPM_DEFAULT_DIR_PERMISSIONS以及它们针对不同组件的版本。CPack RPM Generator学会了如何设置用户定义的包文件名,如何指定 rpmbuild 决定文件名格式,以及如何处理由单个用户定义的 spec 文件生成的多个 rpm 包。请参阅CPACK_RPM_FILE_NAME和CPACK_RPM_<component>_FILE_NAME。CPack RPM Generator学会了如何正确处理指向生成包外部的符号链接。
其他 (Other)¶
Compile Features功能现在能够识别 Intel C++ 编译器版本 12.1 到 16.0 在 UNIX 平台上的支持功能。
已弃用和移除的功能 (Deprecated and Removed Features)¶
CMakeForceCompiler模块及其宏现已弃用。请参阅模块文档了解解释。find_library()、find_path()和find_file()命令在非 Windows 平台上不再搜索从PATH环境变量派生的安装前缀。此行为是在 CMake 3.3 中添加的,以支持 Windows 主机,但已证明在 UNIX 主机上存在问题。将一些<prefix>/bin目录保留在PATH中仅用于其工具的用户,不一定希望搜索任何支持的<prefix>/lib目录。可以通过设置CMAKE_PREFIX_PATH环境变量并提供一个 分号分隔的列表 来指定要搜索的前缀。Visual Studio 7 .NET 2003生成器现已弃用,并将在未来的 CMake 版本中移除。已移除
Visual Studio 7生成器(用于 VS .NET 2002)。它自 CMake 3.3 起已弃用。已移除
Visual Studio 6生成器。它自 CMake 3.3 起已弃用。
其他更改 (Other Changes)¶
在
cmake.org上提供的预编译 OS X 二进制文件现在需要 OS X 10.7 或更高版本。在 Linux 和 FreeBSD 平台上,当从源代码构建 CMake 本身且不使用系统提供的 libcurl 时,如果系统上找到 OpenSSL,默认将使用 OpenSSL。这使得支持通过
https进行网络通信的命令(如file(DOWNLOAD)、file(UPLOAD)和ctest_submit())支持 SSL/TLS。cmake(1)的--build命令行工具现在将拒绝多个--target选项,并报告错误,而不是默默地忽略除最后一个之外的所有选项。AUTOMOC现在会诊断名称冲突,当不同目录中的多个源文件使用名称相同的#include <moc_foo.cpp>时(因为生成的moc_foo.cpp文件会发生冲突)。FindBISON模块的bison_target()命令现在通过将VERBATIM选项传递给内部的add_custom_command()调用来支持特殊字符。这可能会破坏手动添加转义以解决此 bug 的客户端。FindFLEX模块的flex_target()命令现在通过将VERBATIM选项传递给内部的add_custom_command()调用来支持特殊字符。这可能会破坏手动添加转义以解决此 bug 的客户端。FindProtobuf模块的输入和输出变量均已从PROTOBUF_重命名为Protobuf_,以与其他查找模块保持一致。如果提供了旧格式的输入变量,仍将予以支持,并且始终会提供旧格式的输出变量。CPack RPM Generator现在支持 CPackRPM 特定的每个组件变量中的大写组件名称。例如,名为foo的组件现在期望组件特定的变量为CPACK_RPM_FOO_PACKAGE_NAME,而以前期望的是CPACK_RPM_foo_PACKAGE_NAME。变量中大写组件名称部分与其他 CPack 变量使用的约定兼容。为了向后兼容,旧格式的变量仍然有效,并且在同时设置两种变量时首选,但将来首选使用大写组件名称的变量。将在后续 CMake 版本中添加到 CPackRPM 的新变量将仅支持大写组件变量格式。CPack NSIS 生成器的配置文件模板已修复,以正确引用
CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL选项使用的卸载程序工具的路径。这避免了依赖不安全的 Windows 功能来运行带有空格路径的卸载程序工具。