CMake 3.6 Release Notes¶
自 CMake 3.5 以来的更改包括以下内容。
新特性¶
生成器¶
Ninja
生成器学习生成sub/dir/all
形式的伪目标,以驱动子目录的构建。这等效于使用 Makefile 生成器 的cd sub/dir; make all
。Ninja
生成器现在在构建依赖项中包含系统头文件,以确保在系统软件包更新时正确地重新构建。Visual Studio 14 2015
生成器学习支持 Clang/C2 工具集,例如使用-T v140_clang_3_7
选项。此功能为实验性功能。
命令¶
add_custom_command()
和add_custom_target()
命令学习了如何使用CROSSCOMPILING_EMULATOR
可执行目标属性。install()
命令学习了一个新的EXCLUDE_FROM_ALL
选项,用于将安装规则排除在默认安装之外。list()
命令增加了一个FILTER
子命令,用于按正则表达式过滤列表元素。string(TIMESTAMP)
和file(TIMESTAMP)
命令增加了对%s
占位符的支持。这是自 UNIX Epoch 以来的秒数。
变量¶
引入了
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()
命令构建静态库而不是可执行文件。这对于无法在没有自定义标志或脚本的情况下链接二进制文件的交叉编译工具链非常有用。
属性¶
引入了
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
文件)的默认启动项目。
模块¶
CMakePushCheckState
模块现在推送/弹出/重置CMAKE_EXTRA_INCLUDE_FILES
变量,该变量在CheckTypeSize
中使用。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 通用 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:
标签的一部分(例如,在 Fedora 上,对于某些 Linux 发行版是强制性的)。请参阅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
学习了如何正确处理指向生成软件包外部的符号链接。
其他¶
Compile Features
功能现在可以识别 Intel C++ 编译器版本 12.1 到 16.0 在 UNIX 平台上支持的特性。
已弃用和移除的特性¶
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 以来,它已被弃用。
其他更改¶
在
cmake.org
上提供的预编译 OS X 二进制文件现在需要 OS X 10.7 或更高版本。在 Linux 和 FreeBSD 平台上,当从源代码构建 CMake 本身,并且不使用系统提供的 libcurl 时,如果系统上找到了 OpenSSL,则默认使用 OpenSSL。这为支持通过
https
进行网络通信的命令启用了 SSL/TLS 支持,例如file(DOWNLOAD)
、file(UPLOAD)
和ctest_submit()
。cmake(1)
命令行工具现在会拒绝使用多个--target
选项,并报错,而不是像以前那样静默地忽略除最后一个之外的所有选项。AUTOMOC
现在可以诊断当不同目录中的多个源文件使用相同的名称#include <moc_foo.cpp>
时发生的名称冲突(因为生成的moc_foo.cpp
文件会冲突)。FindBISON
模块BISON_TARGET
宏现在通过将VERBATIM
选项传递给内部add_custom_command()
调用来支持特殊字符。这可能会破坏手动添加转义符以解决该错误的客户端。FindFLEX
模块FLEX_TARGET
宏现在通过将VERBATIM
选项传递给内部add_custom_command()
调用来支持特殊字符。这可能会破坏手动添加转义符以解决该错误的客户端。FindProtobuf
模块的输入和输出变量已全部从PROTOBUF_
重命名为Protobuf_
,以与其他查找模块保持一致。如果提供了旧格式的输入变量,则仍然有效,并且始终提供旧格式的输出变量。CPack RPM Generator
现在支持每个组件的 CPackRPM 特定变量中使用大写的组件名称。例如,名为foo
的组件现在期望组件特定的变量为CPACK_RPM_FOO_PACKAGE_NAME
,而之前它期望的是CPACK_RPM_foo_PACKAGE_NAME
。变量中大写的组件名称部分与用于其他 CPack 变量的约定兼容。为了向后兼容,旧格式的变量仍然有效,如果设置了两个版本的变量,则优先使用旧格式,但未来的首选用法是在变量中使用大写的组件名称。在后续版本中添加到 CPackRPM 的新变量将仅支持大写的组件变量格式。CPack NSIS 生成器的配置文件模板已修复,可以引用
CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL
选项使用的卸载工具的路径。这避免了依赖不安全的 Windows 功能来运行路径中带有空格的卸载工具。