CMake 3.6 发行说明¶
自 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 纪元以来的秒数。
变量¶
引入了
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
目标属性,以便为 Visual Studio 生成器(支持 VS 2010 及以上版本)指定自定义项目文件类型。一个
VS_STARTUP_PROJECT
目录属性已引入,用于在 Visual Studio Generators 中为生成的解决方案指定默认启动项目(.sln
文件)。
模块¶
CMakePushCheckState
模块现已推送/弹出/重置变量CMAKE_EXTRA_INCLUDE_FILES
,该变量已用于CheckTypeSize
。ExternalProject
模块懂得了GIT_SHALLOW 1
选项,用以执行 Git 仓库的浅克隆。ExternalProject
模块学会了递归初始化 Git 子模块,以及在更新时初始化新的子模块。使用GIT_SUBMODULES
选项来限制要初始化和更新的子模块。ExternalProject
模块懂得了DOWNLOAD_NO_EXTRACT 1
参数,用于跳过已下载文件的提取(例如,用于自解压 Shell 安装程序或.msi
文件)。ExternalProject
模块现已使用TLS_VERIFY
,从 git 仓库中获取。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 编译器。
增加了对使用编译器 ID
Bruce
的 Bruce C 编译器的支持。
CTest¶
命令
ctest_update()
现在会查看CTEST_GIT_INIT_SUBMODULES
变量,以确定更新前是否应更新子模块。命令
ctest_update()
现在会在更新中同步子模块。添加子模块或更改子模块 URL 的更新现在会得到恰当的执行。
CPack¶
当
CPACK_DEBIAN_PACKAGE_SHLIBDEPS
用于依赖自动检测时,CPack DEB Generator
学会了如何处理$ORIGIN
中的CMAKE_INSTALL_RPATH
。当软件包包含共享库时,
CPack DEB Generator
学会了如何生成DEBIAN/shlibs
控制文件。如果该软件包在 ldconfig 控制的位置(例如,
/lib/
、/usr/lib/
)中安装库,CPack DEB Generator
学会了如何生成DEBIAN/postinst
和DEBIAN/postrm
文件。如果使用多组件设置以及设置了
CPACK_COMPONENT_<compName>_DEPENDS
变量,CPack DEB Generator
学会了如何生成 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_DEBIAN_FILE_NAME
组合使用,由CPack DEB Generator
设置的DEB-DEFAULT
值中设置的包文件名称中学到了如何设置包发布号(DebianRevisionNumber
)。请参见CPACK_DEBIAN_PACKAGE_RELEASE
。当与
CPack DEB Generator
组合使用,由CPACK_DEBIAN_FILE_NAME
组合使用,由CPack DEB Generator
设置的DEB-DEFAULT
值中设置的包文件名称中学到了如何设置包架构逐个设置。请参见CPACK_DEBIAN_<COMPONENT>_PACKAGE_ARCHITECTURE
。CPack DragNDrop Generator
学到了跳过/Applications
符号链接的新选项。请参见CPACK_DMG_DISABLE_APPLICATIONS_SYMLINK
变量。CPackIFW
模块获得了一个新cpack_ifw_update_repository()
命令,用于更新远程存储库中的 QtIFW 特定存储库。当启用时(在某些 Linux 发行版上是必须的,例如在 Fedora 上),
CPack RPM Generator
学到了如何将 RPMdist
标记作为 RPMRelease:
标记的一部分进行设置。请参见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 应决定文件名格式及如何处理单个用户定义规范文件生成的多个 RPM 软件包。请参见CPACK_RPM_PACKAGE_NAME
和CPACK_RPM_<component>_PACKAGE_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
,例如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()
调用。这可能会破坏手动添加转义符来解决此错误的客户端。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 功能来使用路径中带空格的卸载工具。