CMake 3.1 发行说明¶
自 CMake 3.0 以来所做的更改包括以下内容。
文档更改¶
添加了新的
cmake-compile-features(7)手册。
新功能¶
生成器¶
添加了
Visual Studio 14 2015生成器。
Windows Phone 和 Windows 应用商店¶
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)语法得到了简化,以便实现更快的实现。请参阅政策:policy:CMP0053。if()命令不再自动取消引用在引号或括号参数中命名的变量。请参阅政策:policy: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子命令,它删除了generator expression。string()命令学习了一个新的UUID子命令来生成一个通用的唯一标识符。新的
target_compile_features()命令允许填充COMPILE_FEATURES目标属性,就像任何其他构建变量一样。添加了
target_sources()命令以添加到SOURCES目标属性。
变量¶
版本 8 (2005) 及更高版本的 Visual Studio 生成器学会了从新的 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:...>generator expression。引入了一个新的
INTERFACE_SOURCES目标属性。这由编译和链接列出的源的依赖目标使用。SOURCES目标属性现在包含generator expression例如TARGET_OBJECTS在配置时读取时,如果策略CMP0051是``新``。SOURCES目标属性现在普遍支持generator expression。生成器表达式可以在add_library()和add_executable()命令中使用。现在可以写入并附加到
SOURCES目标属性。CMAKE_DEBUG_TARGET_PROPERTIES变量可用于跟踪源的来源。添加了
VS_DEPLOYMENT_CONTENT源文件属性,以告知 Visual Studio 生成器标记要在 Windows Phone 和 Windows 应用商店项目中部署的内容。添加了
VS_DEPLOYMENT_LOCATION源文件属性,以告知 Visual Studio 生成器标记为部署在 Windows Phone 和 Windows Store 项目中的内容的相对位置。VS_WINRT_COMPONENT目标属性的创建是为了告诉 Visual Studio 生成器将共享库编译为 Windows 运行时 (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_FEATURESgenerator expression允许根据可用的编译器功能设置构建属性。
C测试¶
ctest_coverage()命令学会了读取变量CTEST_COVERAGE_EXTRA_FLAGS来设置CoverageExtraFlags。ctest_coverage()命令学会了使用codecov工具支持 Intel 覆盖率文件。ctest_memcheck()命令学会了支持清理器模式,包括AddressSanitizer、MemorySanitizer、ThreadSanitizer和UndefinedBehaviorSanitizer。可以使用新的 CTEST_MEMORYCHECK_SANITIZER_OPTIONS 变量设置选项。
包装¶
cpack(1)获得了一个IFW生成器,可以使用 Qt Framework Installer 工具进行打包。请参阅CPack IFW 生成器。cpack(1)获得了支持 lzma 压缩档案的7Z和TXZ生成器。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不行) .VS 8 的 Visual Studio 生成器和后来学习支持“ASM_MASM”语言。
Visual Studio 生成器学会了将“.hlsl”源文件视为高级着色语言源(在“.vcxproj”文件中使用“FXCompile”)。添加了源文件属性:prop_sf:VS_SHADER_TYPE、
VS_SHADER_MODEL和VS_SHADER_ENTRYPOINT以指定着色器类型、模型和入口点名称。
新诊断¶
引入策略:policy:CMP0052 以控制导出目标的:prop_tgt:INTERFACE_INCLUDE_DIRECTORIES 中的目录。
弃用和删除的功能¶
在 CMake 3.0 中,
target_link_libraries()命令意外开始允许不带引号的参数使用generator expressions其中包含一个(;分隔)列表。例如::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 生成器中不起作用,但在其他生成器中起作用。现在它被正确转义,使得生成器之间的行为一致。但是,某些项目可能已尝试使用以下代码来解决原始错误:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-\\#pragma-messages")这为 Makefile 生成器添加了所需的转义,但也导致其他生成器将
-Wno-\#pragma-messages传递给 shell,这只能在 POSIX shell 中工作。不幸的是,无法以兼容的方式进行转义修复,因此这种特定于平台和生成器的解决方法不再有效。项目代码可能会测试CMAKE_VERSION变量值以使解决方法也特定于版本。当设置未记录的
CMAKE_ALLOW_UNKNOWN_VARIABLE_READ_ACCESS变量时,由variable_watch()命令建立的回调将不再接收ALLOWED_UNKNOWN_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.el主要 Emacs 编辑模式不再将_视为单词的一部分,使其与其他主要模式更加一致。