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_SYSTEM_NAME
变量设置为WindowsPhone
或WindowsStore
,在cmake(1)
命令行或CMAKE_TOOLCHAIN_FILE
中激活这些平台。 还可以将CMAKE_SYSTEM_VERSION
设置为8.0
或8.1
,以指定要面向的 Windows 版本。
NVIDIA Nsight Tegra¶
Visual Studio 10 (2010) 及更高版本的生成器学会了为 NVIDIA Nsight Tegra Visual Studio Edition 生成项目。可以将
CMAKE_SYSTEM_NAME
变量设置为Android
,在cmake(1)
命令行或CMAKE_TOOLCHAIN_FILE
中激活此平台。
语法¶
命令¶
add_custom_command()
命令学会了解释cmake-generator-expressions(7)
在DEPENDS
参数中。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
目标属性。
变量¶
Visual Studio 8 (2005) 及更高版本的生成器学会了从新的
CMAKE_GENERATOR_PLATFORM
变量中读取目标平台名称,当它未指定为生成器名称的一部分时。 平台名称可以在cmake(1)
命令行中使用-A
选项指定,例如-G "Visual Studio 12 2013" -A x64
。现在可以在由
CMAKE_TOOLCHAIN_FILE
变量指定的工具链文件中初始化CMAKE_GENERATOR_TOOLSET
变量。 当使用 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
为NEW
。SOURCES
目标属性现在通常支持generator expression
。 生成器表达式可以在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 运行时 (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_summary
API 学会了接受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
generator expression
允许基于可用的编译器功能设置构建属性。
CTest¶
ctest_coverage()
命令学会了读取变量CTEST_COVERAGE_EXTRA_FLAGS
以设置CoverageExtraFlags
。The
ctest_coverage()
命令学会了通过codecov
工具支持 Intel 覆盖率文件。The
ctest_memcheck()
命令学会了支持 sanitizers 模式,包括AddressSanitizer
、MemorySanitizer
、ThreadSanitizer
和UndefinedBehaviorSanitizer
。 可以使用新的CTEST_MEMORYCHECK_SANITIZER_OPTIONS
变量来设置选项。
CPack¶
cpack(1)
获得了IFW
生成器,用于使用 Qt Framework Installer 工具进行打包。 请参阅CPack IFW Generator
。cpack(1)
获得了支持 lzma 压缩归档文件的7Z
和TXZ
生成器。The
CPack DEB Generator
学习了一个新的CPACK_DEBIAN_COMPRESSION_TYPE
变量,用于设置 tarball 压缩类型。The
CPack WIX Generator
学习了支持CPACK_WIX_ACL
安装的文件属性,以指定访问控制列表。
其他¶
The
cmake(1)
-E
选项学习了一个新的env
命令。The
cmake(1)
-E tar
命令学会了支持 lzma 压缩文件。对象库 现在可以有额外的源文件,这些源文件不会编译为目标文件,只要它们不影响普通库的链接(例如,
.dat
可以,但.def
不可以)。Visual Studio 生成器对于 VS 8 及更高版本,学会了支持
ASM_MASM
语言。Visual Studio 生成器学会了将
.hlsl
源文件视为高级着色语言源文件(在.vcxproj
文件中使用FXCompile
)。 添加了源文件属性VS_SHADER_TYPE
、VS_SHADER_MODEL
和VS_SHADER_ENTRYPOINT
,用于指定着色器类型、模型和入口点名称。
新的诊断信息¶
引入了策略
CMP0052
,以控制导出目标的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
变量值,使解决方法也特定于版本。由
variable_watch()
命令建立的回调将不再接收到ALLOWED_UNKNOWN_READ_ACCESS
访问类型,当未记录在案的CMAKE_ALLOW_UNKNOWN_VARIABLE_READ_ACCESS
变量被设置时。 未初始化的变量访问将始终报告为UNKNOWN_READ_ACCESS
。The
CMakeDetermineVSServicePack
模块现在警告说它已被弃用,不应再使用。 请改用CMAKE_<LANG>_COMPILER_VERSION
变量。The
FindITK
模块已完全移除。 它是find_package(ITK ... NO_MODULE)
的一个轻量级封装。 当未找到 ITK 时,这会产生更清晰的错误消息。The
FindVTK
模块已完全移除。 它是find_package(VTK ... NO_MODULE)
的一个轻量级封装。 当未找到 VTK 时,这会产生更清晰的错误消息。该模块还为查找 VTK 4.0 提供了兼容性支持。 此功能已被删除。
其他更改¶
The
cmake-gui(1)
学会了捕获由execute_process()
命令启动的子进程的输出,并将其显示在输出窗口中。The
cmake-language(7)
生成器表达式和列表展开解析器的内部实现已得到优化,并在大型项目上显示出明显的加速。Makefile 生成器学会了在 Windows 上使用带有 GNU 工具的响应文件,将库目录和名称传递给链接器。
在生成链接器命令行时,CMake 现在避免重复与 SHARED 库目标对应的项。
对 Open Watcom 编译器的支持进行了全面修订。
CMAKE_<LANG>_COMPILER_ID
现在是OpenWatcom
,并且CMAKE_<LANG>_COMPILER_VERSION
现在使用 Open Watcom 外部版本编号。 外部版本号比内部版本号低 11。The
cmake-mode.el
major Emacs 编辑模式不再将_
视为单词的一部分,使其与其他主要模式更加一致。