CMake 4.0 发行说明¶
自 CMake 3.31 以来的更改包括以下内容。
新功能¶
基于文件的 API¶
cmake-file-api(7)
"codemodel" 版本 2version
字段已更新为 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 时,
AIX
和CMAKE_HOST_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
生成器在测试操作的方案“构建配置”设置中放置什么。
属性¶
添加了
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
选项,用于在使用 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
变量。以前,此变量仅适用于基于组件的包。
已弃用和已删除的功能¶
与 CMake 3.5 之前版本的兼容性已删除。调用
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 -S
脚本触发,该脚本不调用任何 CTest 命令,除非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 在/usr/local
中的用户,在不使用 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 缓存和环境变量摘要。该摘要现在仅在消息日志级别设置为VERBOSE
、DEBUG
或TRACE
时显示,通过cmake --log-level
选项或CMAKE_MESSAGE_LOG_LEVEL
缓存变量。现在在 cmake.org 上提供了预编译的 SunOS
sparc64
和x86_64
二进制文件。
更新¶
自 CMake 4.0.0 以来的更改包括以下内容。
4.0.1¶
此版本未对文档功能或接口进行任何更改。进行了一些实现更新以支持生态系统更改和/或修复回归。
4.0.2¶
当为 macOS 构建时,如果使用的 Clang 没有默认的 macOS SDK,并且
CMAKE_OSX_SYSROOT
为空,CMake 现在会自动传递-isysroot
和xcrun --show-sdk-path
打印的 macOS SDK。这恢复了在 macOS 上无需手动设置CMAKE_OSX_SYSROOT
即可使用 LLVM/Clang 的支持,该支持在 CMake 4.0.0 移除默认值后被破坏。DEBUGGER_WORKING_DIRECTORY
目标属性现在被Xcode
生成器用作XCODE_SCHEME_WORKING_DIRECTORY
目标属性的备用。
4.0.3¶
此版本未对文档功能或接口进行任何更改。进行了一些实现更新以支持生态系统更改和/或修复回归。