CMake 4.0 版本说明¶
自 CMake 3.31 以来的更改包括以下内容。
新功能¶
基于文件的 API¶
cmake-file-api(7)"codemodel" 版本 2 的version字段已更新至 2.8。cmake-file-api(7)"codemodel" 版本 2 的 "target" 对象添加了一个新的debugger字段。
命令行¶
添加了
cmake --link-no-warning-as-error选项,以抑制LINK_WARNING_AS_ERROR目标属性和CMAKE_LINK_WARNING_AS_ERROR变量的效果。添加了
cmake --project-file选项,用于指定CMakeLists.txt文件的备用文件名。此选项旨在供开发人员在增量过渡期间临时使用,不适用于最终产品的发布。当项目文件不是CMakeLists.txt时,CMake 始终会发出警告。
命令¶
target_link_libraries()命令现在支持LINKER:前缀。
变量¶
AIX和CMAKE_HOST_AIX变量现在分别在目标系统或主机系统为 AIX 时设置为 true。链接器标志变量学会支持
LINKER:前缀。请参阅策略
CMP0181。添加了
CMAKE_EXECUTE_PROCESS_COMMAND_ERROR_IS_FATAL变量,以指定execute_process()命令的默认COMMAND_ERROR_IS_FATAL行为。添加了
CMAKE_<LANG>_LINK_MODE和CMAKE_<LANG>_DEVICE_LINK_MODE变量,以提供有关链接步骤如何完成的信息。添加了
CMAKE_LINK_WARNING_AS_ERROR变量和相应的LINK_WARNING_AS_ERROR目标属性,以使用特定于链接器的标志进行链接,将警告视为错误。引入了
CMAKE_MSVC_RUNTIME_CHECKS变量和MSVC_RUNTIME_CHECKS目标属性,以选择针对 MSVC ABI 的编译器的运行时检查。请参阅策略CMP0184。添加了
CMAKE_POLICY_VERSION_MINIMUM变量,以帮助打包人员和最终用户尝试配置尚未更新为支持 CMake 版本的新项目的现有项目。添加了CMAKE_POLICY_VERSION_MINIMUM环境变量来初始化它。添加了
CMAKE_UNITY_BUILD_RELOCATABLE变量和相应的UNITY_BUILD_RELOCATABLE目标属性,以使为CMAKE_UNITY_BUILD生成的源文件能够使用相对路径(如果可能)#include原始源文件。添加了
CMAKE_XCODE_SCHEME_LLDB_INIT_FILE变量和相应的XCODE_SCHEME_LLDB_INIT_FILE目标属性,以告知Xcode生成器在方案的 "LLDB Init File" 设置中放入什么。添加了
CMAKE_XCODE_SCHEME_TEST_CONFIGURATION变量和相应的XCODE_SCHEME_TEST_CONFIGURATION目标属性,以告知Xcode生成器在方案的测试操作的 "Build Configuration" 设置中放入什么。
属性¶
添加了
DEBUGGER_WORKING_DIRECTORY目标属性和相应的CMAKE_DEBUGGER_WORKING_DIRECTORY变量,以告知生成器应为目标设置的调试器工作目录。STATIC_LIBRARY_OPTIONS目标属性现在支持ARCHIVER:前缀,以通过编译器驱动程序以可移植的方式将选项传递给归档器。Swift_MODULE_DIRECTORY目标属性现在支持生成器表达式。添加了
VS_CUSTOM_COMMAND_DISABLE_PARALLEL_BUILD源文件属性,以告知 Visual Studio 生成器 不要并行运行自定义命令。添加了
VS_SOLUTION_ITEMS目录属性,以告知 Visual Studio 生成器 将文件直接附加到解决方案(.sln)。
模块¶
ExternalData模块添加了ExternalData_HTTPHEADERS变量,用于指定 HTTP 标头。ExternalProject模块的ExternalProject_Add()命令添加了INSTALL_JOB_SERVER_AWARE选项,以在使用显式的INSTALL_COMMAND和 Makefile 生成器 时启用 GNU Make 作业服务器的集成。FeatureSummary模块的add_feature_info()命令现在支持完整的 条件语法。请参阅策略CMP0183。FindBISON模块的bison_target()命令添加了OPTIONS选项,用于指定 Bison 命令行选项。FindCURL模块现在提供CURL_VERSION结果变量,以匹配上游 cURL 的 CMake 包。FindFLEX模块的flex_target()命令添加了OPTIONS选项,用于指定 Flex 命令行选项。FindProtobuf模块的protobuf_generate()命令添加了PROTOC_EXE选项,用于指定自定义protoc可执行文件。FindPython、FindPython2和FindPython3模块通过分别使用变量Python_ARTIFACTS_PREFIX、Python2_ARTIFACTS_PREFIX和Python3_ARTIFACTS_PREFIX,在同一目录中支持多次调用。FindRuby模块学会了查找 rbenv 提供的安装。
生成器表达式¶
$<PATH>生成器表达式添加了NATIVE_PATH操作,用于将 CMake 路径转换为原生路径。
CTest¶
在 Windows 上,
ctest --interactive-debug-mode选项默认启用测试进程中的 Windows 错误报告,允许它们创建调试弹出窗口和核心转储。这恢复了 CMake 3.11 在libuv更新使其成为可能后删除的行为。
CPack¶
CPack Archive Generator学会了生成不压缩的.tar包。CPack Archive Generator现在遵守所有包的CPACK_ARCHIVE_FILE_NAME变量。以前,此变量仅适用于基于组件的包。
已弃用和已删除的特性¶
已删除与低于 3.5 的 CMake 版本的兼容性。调用将策略版本设置为旧值的
cmake_minimum_required()或cmake_policy()现在会发出错误。请注意,通过使用VERSION参数的<min>...<max>语法,调用这些命令仍然可以支持旧版本的 CMake。这只需要 CMake 的<min>版本,但在运行新版本时,会将策略设置为<max>版本。Visual Studio 14 2015和Visual Studio 15 2017生成器不再支持将平台作为生成器名称的一部分。请参阅 Visual Studio 平台选择。CMAKE_<LANG>_USING_LINKER_MODE变量不再用于确定CMAKE_<LANG>_USING_LINKER_<TYPE>变量的内容类型。而是使用 CMake 设置的CMAKE_<LANG>_LINK_MODE变量。FindGDAL模块现已弃用,转而使用上游 GDAL 的官方 CMake 包配置文件。通过调用find_package(GDAL CONFIG)将项目迁移到后者。有关详细信息,请参阅 GDAL 关于 CMake 集成的文档。已移除 CTest 的未声明的声明式脚本模式。此模式过去由不调用任何 CTest 命令 的
ctest -S脚本触发,除非CTEST_RUN_CURRENT_SCRIPT被显式设置为OFF。ctest_run_script()命令现在不能在不带任何参数的情况下调用。
其他更改¶
在 macOS 上使用 Ninja 生成器 和 Makefile 生成器 时,当在
/usr/bin中找到编译器时,它现在会按原样使用,不再映射到 Xcode 内的相应编译器。此映射由 CMake 3.2 引入,用于允许构建树在xcode-select切换到不同的 Xcode 安装时继续使用其原始编译器。但是,Xcode 内的编译器无法在没有显式-isysroot标志的情况下使用,因此不适合传递给任意第三方构建系统。此外,映射行为可能会覆盖用户指定的编译器路径。因此,此行为已被撤销。在针对 macOS 的构建中,
CMAKE_OSX_SYSROOT现在默认为空,将延迟到编译器默认的 macOS SDK 选择。要通过编译器的-isysroot标志传递显式的 macOS SDK,用户可以配置其构建树,使用-DCMAKE_OSX_SYSROOT=macosx,或在其环境中export SDKROOT="$(xcrun --sdk macosx --show-sdk-path)"。备注
macOS 编译器在
/usr/bin中,当不使用-isysroot调用时,在系统 SDK 路径之前搜索/usr/local/include中的标头,这与许多平台上的约定一致。在 macOS-x86_64 主机上安装了 Homebrew 的用户,如果不在使用 Homebrew 工具构建时,应按上述方法传递显式 SDK。某些 Clang 编译器没有默认的 macOS SDK 选择。对于这些编译器,如果
CMAKE_OSX_SYSROOT为空,CMake 将自动传递-isysroot和xcrun --show-sdk-path打印的 macOS SDK。
在 Windows 上,项目中命名的文件路径(例如,在
CMakeLists.txt中)不再自动转换为其磁盘上的大/小写形式。项目应在调用add_library()、set_property(SOURCE)或set_source_files_properties()时,一致地使用其规范的大小写拼写源文件路径。这与区分大小写文件系统的平台上的行为一致。在 AIX 上,
SHARED库目标现在默认生成共享库归档。请参阅策略CMP0182。cmake --preset命令不再默认输出预设 CMake 缓存和环境变量的摘要。该摘要现在仅在通过cmake --log-level选项或CMAKE_MESSAGE_LOG_LEVEL缓存变量将消息日志级别设置为VERBOSE、DEBUG或TRACE时显示。在 cmake.org 上提供了预编译的 SunOS
sparc64和x86_64二进制文件。
更新¶
自 CMake 4.0.0 以来的更改包括以下内容。
4.0.1¶
此版本未对文档功能或接口进行任何更改。进行了一些实现更新以支持生态系统更改和/或修复回归。
4.0.2¶
在为 macOS 构建并使用没有默认 macOS SDK 的 Clang 时,如果
CMAKE_OSX_SYSROOT为空,CMake 现在会自动传递-isysroot和xcrun --show-sdk-path打印的 macOS SDK。这恢复了在 macOS 上使用 LLVM/Clang 的支持,而无需手动设置CMAKE_OSX_SYSROOT,此功能在 CMake 4.0.0 移除默认值时被破坏。DEBUGGER_WORKING_DIRECTORY目标属性现在被Xcode生成器用作XCODE_SCHEME_WORKING_DIRECTORY目标属性的回退。
4.0.3, 4.0.4¶
这些版本未对已记录的功能或接口进行任何更改。为了支持生态系统更改和/或修复回归,进行了一些实现更新。
4.0.5¶
当使用
Xcode生成器为 macOS 构建时,如果CMAKE_OSX_DEPLOYMENT_TARGET再次默认为主机的 macOS 版本(如果它比 macOS SDK 版本旧),就像在 CMake 4.0 之前的版本中所做的那样。execute_process()命令在达到其TIMEOUT时会再次终止子进程。这在 CMake 3.29 中被意外回归。