CMake 3.1 发行说明¶
自 CMake 3.0 以来的更改包括以下内容。
文档更改¶
新增了一个
cmake-compile-features(7)手册。
新功能¶
生成器¶
新增了
Visual Studio 14 2015生成器。
Windows Phone 和 Windows Store¶
Visual Studio 11 (2012) 及以上版本的生成器学会了为 Windows Phone 和 Windows Store 生成项目。可以在
cmake(1)命令行或CMAKE_TOOLCHAIN_FILE中将CMAKE_SYSTEM_NAME变量设置为WindowsPhone或WindowsStore来激活这些平台。还可以将CMAKE_SYSTEM_VERSION设置为8.0或8.1来指定目标 Windows 的版本。
NVIDIA Nsight Tegra¶
Visual Studio 10 (2010) 及以上版本的生成器学会了为 NVIDIA Nsight Tegra Visual Studio Edition 生成项目。可以在
cmake(1)命令行或CMAKE_TOOLCHAIN_FILE中将CMAKE_SYSTEM_NAME变量设置为Android来激活此平台。
语法¶
为了实现更快的实现,
cmake-language(7)中 变量引用 和 转义序列 的语法已得到简化。请参阅策略CMP0053。if()命令不再自动解引用在带引号或方括号参数中命名的变量。请参阅策略CMP0054。
命令¶
add_custom_command()命令学会了解释DEPENDS参数中的cmake-generator-expressions(7)。export(PACKAGE)命令学会了检查CMAKE_EXPORT_NO_PACKAGE_REGISTRY变量以跳过导出包。file(STRINGS)命令获得了一个新的ENCODING选项,以启用对UTF-8字符串的提取。find_package()命令学会了检查CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY和CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY变量,以跳过搜索包注册表。get_property()命令获得了一个新的INSTALL范围用于属性。install()命令获得了一个MESSAGE_NEVER选项,以避免在安装过程中输出。set_property()命令获得了一个新的INSTALL范围用于属性。string()命令获得了一个新的GENEX_STRIP子命令,用于移除生成器表达式。string()命令获得了一个新的UUID子命令,用于生成一个通用唯一标识符。新的
target_compile_features()命令允许填充COMPILE_FEATURES目标属性,就像其他构建变量一样。新增了
target_sources()命令,用于添加到SOURCES目标属性。
变量¶
Visual Studio 8 (2005) 及以上版本的生成器学会了从新的
CMAKE_GENERATOR_PLATFORM变量读取目标平台名称,当它未在生成器名称中指定时。可以在cmake(1)命令行上使用-A选项指定平台名称,例如-G "Visual Studio 12 2013" -A x64。CMAKE_GENERATOR_TOOLSET变量现在可以在CMAKE_TOOLCHAIN_FILE变量指定的工具链文件中初始化。当使用 Xcode 或 Visual Studio 生成器进行交叉编译时,这很有用。引入了
CMAKE_INSTALL_MESSAGE变量,用于可选地减少安装时的输出。
属性¶
新的
CXX_STANDARD和CXX_EXTENSIONS目标属性可以指定 CMake 用于计算所需编译选项(如-std=c++11或-std=gnu++11)的值。可以设置CMAKE_CXX_STANDARD和CMAKE_CXX_EXTENSIONS变量来初始化目标属性。新的
C_STANDARD和C_EXTENSIONS目标属性可以指定 CMake 用于计算所需编译选项(如-std=c11或-std=gnu11)的值。可以设置CMAKE_C_STANDARD和CMAKE_C_EXTENSIONS变量来初始化目标属性。新的
COMPILE_FEATURES目标属性可以包含编译目标所需的特性列表。CMake 使用此信息来确保所使用的编译器能够构建目标,并添加任何必要的编译标志来支持语言特性。引入了
COMPILE_PDB_NAME和COMPILE_PDB_OUTPUT_DIRECTORY目标属性,用于指定 MSVC 编译器程序数据库文件位置 (cl /Fd)。这补充了现有的PDB_NAME和PDB_OUTPUT_DIRECTORY目标属性,它们指定了链接器程序数据库文件位置 (link /pdb)。INTERFACE_LINK_LIBRARIES目标属性现在支持$<LINK_ONLY:...>生成器表达式。引入了一个新的
INTERFACE_SOURCES目标属性。这被依赖目标使用,它们会编译并链接列出的源文件。当策略
CMP0051为NEW时,SOURCES目标属性在配置时现在包含生成器表达式,如TARGET_OBJECTS。SOURCES目标属性现在普遍支持生成器表达式。生成器表达式可以在add_library()和add_executable()命令中使用。现在可以写入和追加到
SOURCES目标属性。可以使用CMAKE_DEBUG_TARGET_PROPERTIES变量来跟踪源文件的来源。新增了
VS_DEPLOYMENT_CONTENT源文件属性,用于告知 Visual Studio 生成器将内容标记为在 Windows Phone 和 Windows Store 项目中部署。新增了
VS_DEPLOYMENT_LOCATION源文件属性,用于告知 Visual Studio 生成器在 Windows Phone 和 Windows Store 项目中标记为部署的内容的相对位置。创建了
VS_WINRT_COMPONENT目标属性,用于告知 Visual Studio 生成器将共享库编译为 Windows Runtime (WinRT) 组件。Xcode生成器学会了检查源文件属性XCODE_EXPLICIT_FILE_TYPE和XCODE_LAST_KNOWN_FILE_TYPE以获取自定义 Xcode 文件引用类型。
模块¶
BundleUtilities模块学会了在 OS X 上解析和替换@rpath占位符,以便正确地打包使用它们的应用程序。CMakePackageConfigHelpers模块的configure_package_config_file()命令获得了一个新的INSTALL_PREFIX选项,用于生成安装前缀非CMAKE_INSTALL_PREFIX的包配置文件。新增了
CheckFortranSourceCompiles模块,提供了一个check_fortran_source_compiles()命令。ExternalData模块学会了容忍对丢失源文件的DATA{}引用,将其作为警告而不是错误处理。这有助于开发人员编写新的DATA{}引用来测试尚未创建的引用输出。ExternalProject模块学会了支持带有.7z、.tar.xz和.txz扩展名的 lzma 压缩源 tarball。ExternalProject模块的ExternalProject_Add命令获得了一个新的BUILD_ALWAYS选项,以使外部项目构建步骤在每次构建主项目时都运行。ExternalProject模块的ExternalProject_Add命令获得了一个新的EXCLUDE_FROM_ALL选项,以使外部项目目标设置为EXCLUDE_FROM_ALL目标属性。ExternalProject模块的ExternalProject_Add_Step命令获得了一个新的EXCLUDE_FROM_MAIN选项,以使该步骤不成为主外部项目目标的直接依赖项。ExternalProject模块的ExternalProject_Add命令获得了一个新的DOWNLOAD_NO_PROGRESS选项,用于在下载源 tarball 时禁用进度输出。FeatureSummary模块的feature_summaryAPI 学会了接受WHAT选项的多个值,并适当地组合它们。FindCUDA模块学会了支持fatbin和cubin模块。FindGTest模块的gtest_add_tests宏获得了一个新的AUTO选项,以自动读取测试可执行文件的SOURCES目标属性,并扫描源文件以添加测试。FindGLEW模块现在提供已导入的目标。FindGLUT模块现在提供已导入的目标。FindHg模块获得了一个新的Hg_WC_INFO命令,以帮助运行hg命令来提取关于 Mercurial 工作副本的信息。引入了
FindOpenCL模块。FindOpenMP模块学会了支持 Fortran。FindPkgConfig模块学会了使用PKG_CONFIG环境变量的值作为pkg-config可执行文件,如果已设置。引入了
FindXercesC模块。FindZLIB模块现在提供已导入的目标。GenerateExportHeader模块的generate_export_header命令学会了允许与 对象库 一起使用。InstallRequiredSystemLibraries模块获得了一个新的CMAKE_INSTALL_OPENMP_LIBRARIES选项,用于安装 MSVC OpenMP 运行时库。UseSWIG模块学会了在可能的情况下从.i源文件检测模块名称,以避免需要显式设置SWIG_MODULE_NAME源文件属性。新增了
WriteCompilerDetectionHeader模块,以允许创建用于编译器可选特性检测的可移植头文件。
生成器表达式¶
新的
COMPILE_FEATURES生成器表达式允许基于可用的编译器特性设置构建属性。
CTest¶
ctest_coverage()命令学会了读取变量CTEST_COVERAGE_EXTRA_FLAGS来设置CoverageExtraFlags。ctest_coverage()命令学会了使用codecov工具支持 Intel 覆盖文件。ctest_memcheck()命令学会了支持 Sanitizer 模式,包括AddressSanitizer、MemorySanitizer、ThreadSanitizer和UndefinedBehaviorSanitizer。可以通过新的CTEST_MEMORYCHECK_SANITIZER_OPTIONS变量设置选项。
CPack¶
cpack(1)获得了IFW生成器,用于使用 Qt Framework Installer 工具进行打包。请参阅CPack IFW Generator。cpack(1)获得了7Z和TXZ生成器,支持 lzma 压缩的存档。CPack DEB Generator学会了一个新的CPACK_DEBIAN_COMPRESSION_TYPE变量,用于设置 tarball 的压缩类型。CPack WIX Generator学会了支持CPACK_WIX_ACL已安装文件属性,用于指定访问控制列表。
其他¶
cmake(1)的-E选项获得了一个新的env命令。cmake(1)的-E tar命令学会了支持 lzma 压缩文件。现在对象库可以有额外的源文件,这些源文件不会编译成对象文件,只要它们不影响普通库的链接即可(例如,
.dat可以,但.def不行)。Visual Studio 生成器对 VS 8 及更高版本学会了支持
ASM_MASM语言。Visual Studio 生成器学会了将
.hlsl源文件视为 High Level Shading Language 源文件(在.vcxproj文件中使用FXCompile)。新增了源文件属性VS_SHADER_TYPE、VS_SHADER_MODEL和VS_SHADER_ENTRYPOINT,用于指定着色器类型、模型和入口点名称。
新诊断¶
引入了策略
CMP0052,用于控制导出目标的INTERFACE_INCLUDE_DIRECTORIES中的目录。
已弃用和移除的功能¶
在 CMake 3.0 中,
target_link_libraries()命令意外地允许未加引号的参数使用生成器表达式,其中包含一个(用;分隔的)列表。例如set(libs B C) target_link_libraries(A PUBLIC $<BUILD_INTERFACE:${libs}>)
这等同于编写
target_link_libraries(A PUBLIC $<BUILD_INTERFACE:B C>)
并且从未打算这样工作。在 CMake 2.8.12 中不起作用。此类生成器表达式应放在带引号的参数中
set(libs B C) target_link_libraries(A PUBLIC "$<BUILD_INTERFACE:${libs}>")
CMake 3.1 再次要求使用引号才能使其正常工作。
在 CMake 3.1 之前,Makefile 生成器在生成的 makefile 中使用的 make 变量赋值内部没有正确转义
#,导致它们被视为注释。这使得像add_compile_options(-Wno-#pragma-messages)
这样的代码在 Makefile 生成器中不起作用,但在其他生成器中起作用。现在它被正确转义,使得不同生成器之间的行为一致。但是,一些项目可能尝试通过类似以下的代码来解决原始 bug:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-\\#pragma-messages")
这添加了 Makefile 生成器所需的转义,但也导致其他生成器将
-Wno-\#pragma-messages传递给 shell,而这只在 POSIX shell 中有效。不幸的是,无法以兼容的方式进行转义修复,因此这种特定于平台和生成器的变通方法不再有效。项目代码可以测试CMAKE_VERSION变量的值,以便使该变通方法也具有版本特异性。由
variable_watch()命令建立的回调将不再接收ALLOWED_UNKNOWN_READ_ACCESS访问类型,当(未记录的)CMAKE_ALLOW_UNKNOWN_VARIABLE_READ_ACCESS变量被设置时。未初始化的变量访问将始终报告为UNKNOWN_READ_ACCESS。CMakeDetermineVSServicePack模块现在警告它已弃用,不应再使用。改为使用CMAKE_<LANG>_COMPILER_VERSION变量。FindITK模块已被完全移除。它只是find_package(ITK ... NO_MODULE)的一个轻量级包装器。当找不到 ITK 时,这会产生更清晰的错误消息。FindVTK模块已被完全移除。它只是find_package(VTK ... NO_MODULE)的一个轻量级包装器。当找不到 VTK 时,这会产生更清晰的错误消息。该模块还提供了查找 VTK 4.0 的兼容性支持。此功能已被删除。
其他更改¶
cmake-gui(1)学会了捕获由execute_process()命令启动的子进程的输出,并将其显示在输出窗口中。cmake-language(7)的生成器表达式和列表展开解析器的内部实现已得到优化,在大项目上显示了非凡的速度提升。Makefile 生成器学会了在 Windows 上的 GNU 工具中使用响应文件,将库目录和名称传递给链接器。
在生成链接器命令行时,CMake 现在避免重复对应于 SHARED 库目标的项。
对 Open Watcom 编译器的支持已得到改进。
CMAKE_<LANG>_COMPILER_ID现在是OpenWatcom,而CMAKE_<LANG>_COMPILER_VERSION现在使用 Open Watcom 的外部版本编号。外部版本号比内部版本号低 11。cmake-mode.elEmacs 主要编辑模式不再将_视为单词的一部分,使其与其他主要模式更一致。