CMake 3.16 发行说明¶
自 CMake 3.15 以来所做的更改包括以下内容。
新功能¶
语言¶
CMake 学会了支持 Objective C (
OBJC) 和 Objective C++ (OBJCXX) 语言。它们可以通过project()和enable_language()命令启用。当启用OBJC或OBJCXX时,分别带有.m或.mm的源文件将被编译为 Objective C 或 C++。否则,它们将像以前一样被视为纯 C++ 源代码。
编译器¶
Solaris现在支持Clang编译器。
平台¶
在 AIX 上,除了可执行文件之外,使用
ENABLE_EXPORTS目标属性的可执行文件现在还生成一个带有.imp扩展名的链接器导入文件。使用target_link_libraries()链接到其符号的可执行文件的插件(通过add_library()和MODULE选项创建)现在使用导入文件进行链接。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生成器设置“使用文档版本浏览器时允许调试”模式选项的值。
模块¶
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 模块现在支持通过缓存条目直接指定工件。
自动生成器¶
使用 AUTOMOC 时,可以启用新的 CMAKE_AUTOMOC_PATH_PREFIX 变量或 AUTOMOC_PATH_PREFIX 目标属性来为 moc 生成 -p 路径前缀选项。这确保了
moc输出文件在不同的构建设置上是相同的(假定由moc编译的标头位于include 目录)。它还确保当源和/或构建目录是符号链接时,moc输出文件将正确编译。
C测试¶
ctest(1)现在能够根据每个测试的资源需求安排测试。有关详细信息,请参阅:ref:ctest-resource-allocation。添加了一个新的测试属性
SKIP_REGULAR_EXPRESSION。此属性类似于FAIL_REGULAR_EXPRESSION和PASS_REGULAR_EXPRESSION,但与SKIP_RETURN_CODE含义相同。这很有用,例如,在用户无法控制测试返回码的情况下。例如,在 Catch2 中,返回值是断言失败的次数,因此不能将其用于SKIP_RETURN_CODE。
包装¶
cpack(1)学习了对-C选项的多种配置的支持。CPack DEB Generator现在可以根据 Debian Policy Manual 格式化通用文本(通常用作多个 CPack 生成器的描述)。请参阅CPACK_PACKAGE_DESCRIPTION_FILE和CPACK_DEBIAN_<COMPONENT>_DESCRIPTION变量。CPack Archive Generator学会了使用 Zstandard 压缩生成.tar.zst包。
弃用和删除的功能¶
为策略“CMP0067”添加了明确的弃用诊断(“CMP0066”及以下已弃用)。
cmake-policies(7)手册解释说所有策略的旧行为都已弃用,项目应该移植到新行为。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 ""不初始化任何子模块。请参阅政策:policy:CMP0097。FindGTest模块已更新,可以识别 GTest 1.8.1 生成的 MSVC 构建树。project()命令不再删除版本组件中的前导零。请参阅政策:policy:CMP0096。Qt 压缩帮助文件现在命名为“CMake.qch”,文件名中不再包含发布版本。当 CMake 就地升级时,该文件的名称和位置将保持不变。 IDE、帮助查看器等工具现在应该能够在固定位置引用此文件,该位置在 CMake 升级期间仍然有效。
RPATH条目在生成的用于安装的 CMake 脚本中被正确转义。请参阅政策:policy:CMP0095。在 Windows 上使用
CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS时,自动生成的导出现在仅在更新提供符号的目标文件时更新。
更新¶
自 CMake 3.16.0 以来所做的更改包括以下内容。
3.16.2¶
CMake 3.16.0 和 3.16.1 使用 AUTOMOC 处理
.hh文件。这是 CMake 3.15 及以下版本的行为更改,可能会破坏现有项目,因此从 3.16.2 起已将其还原。
3.16.5¶
FindPython、FindPython2和FindPython3模块不再为Python{,2,3}_LIBRARY_RELEASE和Python{,2,3 创建缓存条目}_LIBRARY_DEBUG。这些值始终是根据其他结果计算得出的,因此不应缓存。这些条目由 CMake 3.16.0 到 3.16.4 创建,但始终为“FORCE”-set,用户无法进行有意义的编辑。此外,模块不再公开公开其内部
_Python*缓存条目。 CMake 3.16.0 到 3.16.4 意外地将它们显示为高级缓存条目。
3.16.7¶
如果未设置
OBJC或OBJCXX环境变量,现在选择 Objective C 或 C++ 编译器会考虑CC或CXX环境变量。FindPkgConfig模块现在将包含前缀为-isystem的目录提取到*_INCLUDE_DIRS变量和INTERFACE_INCLUDE_DIRECTORIES目标属性中。以前它们会放在``*_CFLAGS_OTHER`` 变量和INTERFACE_COMPILE_OPTIONS目标属性中。
3.16.9¶
CMAKE_AUTOMOC_PATH_PREFIX的默认值已更改为OFF,因为此功能可能会破坏在不同包含目录中具有相同名称头文件的现有项目。这将恢复与 CMake 3.15 及更低版本行为的兼容性。