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 版本学习了为其生成项目的技能。可以设置
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
目标属性。
Variables¶
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
目标属性包含generator expression
(如TARGET_OBJECTS
)。现在一般来说,
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
了解如何支持 lzma 压缩源 tar 包,包括.7z
、.tar.xz
和.txz
扩展。模块
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
选项,用于在下载源 tar 包时禁用进度输出。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
现在提供了导入的 target。模块
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()
命令习得支持清理器模式,包括AddressSanitizer
、MemorySanitizer
、ThreadSanitizer
和UndefinedBehaviorSanitizer
。可以使用新的CTEST_MEMORYCHECK_SANITIZER_OPTIONS
设置选项。
CPack¶
cpack(1)
获取了一个IFW
生成器,用于打包 Qt Framework Installer 工具。请参阅CPack IFW Generator
。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
)。源文件属性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 生成器中工作,但在其他生成器中工作。现在已正确转义,使生成器之间保持行为一致。然而,某些项目可能尝试通过以下代码修复原始错误:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-\\#pragma-messages")
为 Makefile 生成器添加了必要的转义,但也导致其他生成器将
-Wno-\#pragma-messages
传递给 shell,这仅适用于 POSIX shell。不幸的是,无法以兼容方式进行转义修复,因此此平台和生成器特定的权宜之计不再适用。项目代码可以测试CMAKE_VERSION
变量值,以使权宜之计也特定于版本。通过
variable_watch()
命令建立的回调函数在设置未记录的CMAKE_ALLOW_UNKNOWN_VARIABLE_READ_ACCESS
variable 时,将不再接收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 会避免重复与共享库目标相对应的项目。
对 Open Watcom 编译器的支持已全面修订。
CMAKE_<LANG>_COMPILER_ID
现为OpenWatcom
,而CMAKE_<LANG>_COMPILER_VERSION
现在使用 Open Watcom 外部版本编号。外部版本号比内部版本号低 11。cmake-mode.el
主要 Emacs 编辑模式不再将_
视为单词的一部分,使其与其他主要模式更加一致。