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的链接器导入文件。通过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变量中)手动为可执行文件启用运行时链接。
命令行¶
cmake(1)的-E命令现在支持true和false命令,它们不执行任何操作,但分别返回退出码 0 和 1。cmake(1)增加了一个--trace-redirect=<file>命令行选项,用于将--trace输出重定向到文件而不是stderr。cmake(1)的--loglevel命令行选项已重命名为--log-level,以使其与其他命令行选项命名保持一致。为了保持向后兼容性,--loglevel选项仍然受支持。
命令¶
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目标属性现在支持生成器表达式。增加了
INSTALL_REMOVE_ENVIRONMENT_RPATH目标属性,用于从目标中移除编译器定义的RPATH条目。此属性由CMAKE_INSTALL_REMOVE_ENVIRONMENT_RPATH变量初始化。增加了
PRECOMPILE_HEADERS目标属性,用于指定要预编译的头文件列表,以加快编译速度。使用target_precompile_headers()命令进行设置。增加了
UNITY_BUILD目标属性,以告知生成器批处理包含源文件以加快编译速度。VS_CONFIGURATION_TYPE目标属性现在支持生成器表达式。增加了
VS_DPI_AWARE目标属性,用于告知 Visual Studio 生成器 在.vcxproj文件中设置EnableDpiAwareness属性。增加了
XCODE_SCHEME_DEBUG_DOCUMENT_VERSIONING目标属性,用于告知Xcode生成器设置Allow debugging when using document Versions Browser方案选项的值。
模块¶
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模块增加了选项来控制搜索哪些ABIs。FindPython3、FindPython2和FindPython模块现在支持通过缓存条目直接指定构件。
Autogen¶
在使用
AUTOMOC时,新的CMAKE_AUTOMOC_PATH_PREFIX变量或AUTOMOC_PATH_PREFIX目标属性可以被启用,以生成moc的-p路径前缀选项。这可以确保moc输出文件在不同的构建设置下是相同的(前提是moc编译的头文件位于include directory中)。它还确保当源目录和/或构建目录是符号链接时,moc输出文件能够正确编译。
CTest¶
ctest(1)现在能够根据每个测试的资源需求来调度测试。详情请参阅 资源分配。添加了一个新的测试属性
SKIP_REGULAR_EXPRESSION。此属性类似于FAIL_REGULAR_EXPRESSION和PASS_REGULAR_EXPRESSION,但其含义与SKIP_RETURN_CODE相同。这很有用,例如,在用户无法控制测试返回码的情况下。例如,在 Catch2 中,返回值是失败的断言数量,因此无法将其用于SKIP_RETURN_CODE。
CPack¶
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)手册解释说,所有策略的 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.qch,文件名中不再包含版本号。当 CMake 进行就地升级时,此文件的名称和位置将保持不变。现在,IDE、帮助查看器等工具可以在一个固定的位置引用此文件,该位置在 CMake 升级后仍然有效。安装生成的 CMake 脚本中
RPATH条目已被正确转义。请参阅策略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设置,用户无法有意义地编辑。此外,这些模块不再公开其内部
_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 及以下版本的兼容性。