CMake 3.16 发行说明¶
自 CMake 3.15 以来的更改包括以下内容。
新特性¶
语言¶
CMake 学习了对 Objective C (
OBJC
) 和 Objective C++ (OBJCXX
) 语言的支持。它们可以通过project()
和enable_language()
命令启用。当OBJC
或OBJCXX
启用时,扩展名为.m
或.mm
的源文件将分别被编译为 Objective C 或 C++。否则,它们将像以前一样被视为纯 C++ 源文件。
编译器¶
Clang
编译器现在在Solaris
上受支持。
平台¶
在 AIX 上,使用
ENABLE_EXPORTS
目标属性的可执行文件现在除了可执行文件之外,还会生成一个扩展名为.imp
的链接器导入文件。使用add_library()
与MODULE
选项创建的插件,使用target_link_libraries()
链接到可执行文件以获取其符号的插件,现在使用导入文件进行链接。install(TARGETS)
命令现在将导入文件作为ARCHIVE
工件安装。在 AIX 上,运行时链接不再默认启用。CMake 为链接器提供了足够的信息来预先解析所有符号。可以通过将
-Wl,-G
添加到其链接标志(例如,在CMAKE_SHARED_LINKER_FLAGS
或CMAKE_MODULE_LINKER_FLAGS
变量中)来手动为共享库和/或可加载模块启用运行时链接。可以通过将-Wl,-brtl
添加到其链接标志(例如,在CMAKE_EXE_LINKER_FLAGS
变量中)来手动为可执行文件启用运行时链接。
命令行¶
命令¶
add_test()
命令学习了COMMAND_EXPAND_LISTS
选项,该选项使COMMAND
参数中的列表能够被展开,包括由生成器表达式创建的列表。file()
命令学习了一个新的子命令GET_RUNTIME_DEPENDENCIES
,它允许您递归地获取可执行文件或库链接的库列表。此子命令旨在替代GetPrerequisites
。find_file()
、find_library()
、find_path()
、find_package()
和find_program()
命令学习了检查以下变量以控制搜索位置组的默认行为CMAKE_FIND_USE_PACKAGE_ROOT_PATH
- 控制搜索<PackageName>_ROOT
变量的默认行为。CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH
- 控制搜索 CMake 特定环境变量的默认行为。CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH
- 控制搜索标准系统环境变量的默认行为。CMAKE_FIND_USE_CMAKE_PATH
- 控制搜索 CMake 特定缓存变量的默认行为。CMAKE_FIND_USE_CMAKE_SYSTEM_PATH
- 控制搜索平台特定 CMake 变量的默认行为。
find_package()
命令学习了检查CMAKE_FIND_USE_PACKAGE_REGISTRY
变量以控制搜索 CMake 用户包注册表的默认行为,并检查CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY
变量以控制搜索 CMake 系统包注册表的默认行为。message()
命令学习了使用新的CMAKE_MESSAGE_INDENT
变量进行缩进控制。target_precompile_headers()
命令被添加,用于指定要预编译的头文件列表,以加快编译速度。
变量¶
引入了
CMAKE_CUDA_RESOLVE_DEVICE_SYMBOLS
变量,用于可选地初始化CUDA_RESOLVE_DEVICE_SYMBOLS
目标属性。添加了
CMAKE_ECLIPSE_RESOURCE_ENCODING
变量,用于为Eclipse CDT4
额外的生成器指定资源编码。添加了
CMAKE_UNITY_BUILD
变量,用于初始化UNITY_BUILD
目标属性,以告知生成器批量包含源文件以加快编译速度。
属性¶
BUILD_RPATH
和INSTALL_RPATH
目标属性现在支持generator expressions
。添加了
INSTALL_REMOVE_ENVIRONMENT_RPATH
目标属性,用于从目标中移除编译器定义的RPATH
条目。此属性由CMAKE_INSTALL_REMOVE_ENVIRONMENT_RPATH
变量初始化。添加了
PRECOMPILE_HEADERS
目标属性,用于指定要预编译的头文件列表,以加快编译速度。使用target_precompile_headers()
命令设置它。添加了
UNITY_BUILD
目标属性,以告知生成器批量包含源文件以加快编译速度。VS_CONFIGURATION_TYPE
目标属性现在支持generator expressions
。添加了
VS_DPI_AWARE
目标属性,以告知 Visual Studio 生成器 在.vcxproj
文件中设置EnableDpiAwareness
属性。添加了
XCODE_SCHEME_DEBUG_DOCUMENT_VERSIONING
目标属性,以告知Xcode
生成器设置Allow debugging when using document Versions Browser
schema 选项的值。
模块¶
FindDoxygen
模块doxygen_add_docs()
命令获得了一个新的USE_STAMP_FILE
选项。当此选项存在时,由该命令创建的自定义目标仅在自上次成功运行以来任何源文件发生更改时才重新运行 Doxygen。FindGnuTLS
模块现在提供了一个导入的目标。FindPackageHandleStandardArgs
模块find_package_handle_standard_args()
命令获得了一个新的REASON_FAILURE_MESSAGE
选项,用于指定给出失败原因的消息。FindPkgConfig
模块pkg_search_module()
宏现在定义了一个<prefix>_MODULE_NAME
结果变量,其中包含第一个匹配的模块名称。FindPython3
和FindPython
模块获得了控制将搜索哪些ABI
的选项。FindPython3
、FindPython2
和FindPython
模块现在支持通过缓存条目直接指定工件。
Autogen¶
当使用
AUTOMOC
时,可以启用新的CMAKE_AUTOMOC_PATH_PREFIX
变量或AUTOMOC_PATH_PREFIX
目标属性,以生成moc
的-p
路径前缀选项。这确保了在不同的构建设置上moc
输出文件是相同的(假设moc
编译的头文件位于include directory
中)。此外,它还确保当源目录和/或构建目录是符号链接时,moc
输出文件将正确编译。
CTest¶
添加了一个新的测试属性
SKIP_REGULAR_EXPRESSION
。此属性类似于FAIL_REGULAR_EXPRESSION
和PASS_REGULAR_EXPRESSION
,但含义与SKIP_RETURN_CODE
相同。这在用户无法控制测试的返回代码的情况下很有用。例如,在 Catch2 中,返回值是断言失败的数量,因此不可能将其用于SKIP_RETURN_CODE
。
CPack¶
cpack(1)
学习了对-C
选项的多种配置的支持。CPack DEB Generator
现在能够根据 Debian 策略手册格式化通用文本(通常用作多个 CPack 生成器的描述)。请参阅CPACK_PACKAGE_DESCRIPTION_FILE
和CPACK_DEBIAN_<COMPONENT>_DESCRIPTION
变量。CPack Archive Generator
学习了使用 Zstandard 压缩生成.tar.zst
包。
已弃用和移除的特性¶
为策略
CMP0067
添加了显式弃用诊断(CMP0066
及以下版本已被弃用)。cmake-policies(7)
手册解释说,所有策略的 OLD 行为都已被弃用,项目应移植到 NEW 行为。CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY
变量已被弃用。请改用CMAKE_FIND_USE_PACKAGE_REGISTRY
变量。GetPrerequisites
模块已被弃用,因为它已被file(GET_RUNTIME_DEPENDENCIES)
取代。CPACK_INSTALL_SCRIPT
变量已被弃用,取而代之的是新的、名称更准确的CPACK_INSTALL_SCRIPTS
变量。
其他更改¶
cmake(1)
-C <initial-cache>
选项现在使用设置为顶层源树和构建树的CMAKE_SOURCE_DIR
和CMAKE_BINARY_DIR
评估初始缓存脚本。当给定目录的符号链接路径时,
cmake(1)
-E remove_directory
命令行工具现在仅删除符号链接。它不再删除链接目录的内容。ctest(1)
--build-makeprogram
命令行选项现在指定在使用Ninja
生成器或 Makefile 生成器 配置项目时使用的 make 程序。ExternalProject
模块ExternalProject_Add()
命令已更新,以便GIT_SUBMODULES ""
初始化时不初始化任何子模块。请参阅策略CMP0097
。FindGTest
模块已更新,以识别 GTest 1.8.1 生成的 MSVC 构建树。
命令不再去除版本组件中的前导零。请参阅策略project()
。CMP0096
Qt 压缩帮助文件现在命名为
,其中不再包含文件名中的发行版本。当 CMake 就地升级时,此文件的名称和位置将保持不变。诸如 IDE、帮助查看器等工具现在应该能够在固定的位置引用此文件,该位置在 CMake 升级过程中保持有效。CMake.qch
条目在用于安装的生成的 CMake 脚本中被正确转义。请参阅策略RPATH
。CMP0095
在 Windows 上使用
时,自动生成的导出现在仅在提供符号的目标文件更新时才更新。CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS
更新
自 CMake 3.16.0 以来的更改包括以下内容。
3.16.2
CMake 3.16.0 和 3.16.1 使用
处理AUTOMOC
文件。这是 CMake 3.15 及更低版本的一个行为变更,可能会破坏现有项目,因此已在 3.16.2 中恢复。.hh
3.16.5
、FindPython
和FindPython2
模块不再为FindPython3
和Python{,2,3}_LIBRARY_RELEASE
创建缓存条目。这些值始终从其他结果计算得出,因此不应缓存。这些条目由 CMake 3.16.0 到 3.16.4 创建,但始终是Python{,2,3}_LIBRARY_DEBUG
设置的,用户无法有意义地编辑。FORCE
此外,这些模块不再公开其内部
缓存条目。CMake 3.16.0 到 3.16.4 意外地使它们作为高级缓存条目可见。_Python*
3.16.7
现在,如果未设置
或OBJC
环境变量,则 Objective C 或 C++ 编译器的选择现在会考虑OBJCXX
或CC
环境变量。CXX
模块现在将以FindPkgConfig
为前缀的包含目录提取到-isystem
变量和*_INCLUDE_DIRS
目标属性中。以前,它们会被放置在INTERFACE_INCLUDE_DIRECTORIES
变量和*_CFLAGS_OTHER
目标属性中。INTERFACE_COMPILE_OPTIONS
3.16.9
的默认值已更改为CMAKE_AUTOMOC_PATH_PREFIX
,因为此功能可能会破坏在不同包含目录中具有同名头文件的现有项目。这恢复了与 CMake 3.15 及更低版本的行为的兼容性。OFF