ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Google Benchmark 构建工具依赖政策:CMake 与 Python 版本要求详解

Google Benchmark 构建工具依赖政策:CMake 与 Python 版本要求详解 Google Benchmark 构建工具依赖政策CMake 与 Python 版本要求详解【免费下载链接】benchmarkA microbenchmark support library项目地址: https://gitcode.com/GitHub_Trending/benchmark3/benchmark本篇指南围绕 Google Benchmark一个用于 C 代码片段微基准测试的开源库的构建工具依赖政策展开说明项目在 CMake 与 Python 两个维度上锁定的最低版本、各主流发行版的实际版本分布以及这些要求与仓库源码、构建配置之间的对应关系。读完本文你将掌握判断当前环境是否满足 Google Benchmark 构建前置条件的完整方法并能理解为什么 Python 绑定的版本下限被定为 3.8而 PyPI 安装则要求 3.10。一、背景Google Benchmark 的构建工具依赖政策Google Benchmark 官方在 docs/dependencies.md 中明确声明构建工具的选择遵循 Google 的 Foundational C support policy基础 C 支持政策尤其是其中关于构建系统的章节。这意味着项目不会无限制地追逐最新工具链而是锚定一个当前受支持的版本在保证大多数现代发行版可用性与最低系统要求之间取得平衡。这份政策直接决定了两个关键约束CMake当前受支持版本为CMake 3.13截至 2024-10-24Python从 PyPI 安装 Python 绑定要求Python 3.10自 v1.9.0 起2024-08-16理论最低支持版本为Python 3.8。政策还隐含了第三条约束——C 语言标准。虽然依赖文档本身未展开但 README.md 的 Requirements 一节明确指出库的使用只需 C11但构建含编译器和标准库支持需要 C17。这一约束在源码中得到了直接印证根目录 CMakeLists.txt 设置了set(BENCHMARK_CXX_STANDARD 17)、CMAKE_CXX_STANDARD_REQUIRED YES、CMAKE_CXX_EXTENSIONS OFF即强制以严格的 C17 模式编译。因此任何构建环境的编译器都必须具备完整的 C17 支持。二、CMake 版本要求3.13 下限与各发行版现状2.1 官方声明的支持版本根据 docs/dependencies.md当前支持的 CMake 版本为3.13截至 2024-10-24。这一版本号并非随意选取而是与源码中的实际约束严格对应根目录 CMakeLists.txt 第一行即声明# Require CMake 3.13. If available, use the policies up to CMake 3.22. cmake_minimum_required (VERSION 3.13...3.22)这里的3.13...3.22语法是 CMake 3.12 引入的版本范围写法它表示最低要求 3.13并且如果运行环境中的 CMake 版本在 3.13 到 3.22 之间则启用对应最高版本即 3.22的兼容性策略policies若 CMake 版本高于 3.22则仍按 3.22 的策略行为执行。也就是说3.13 是硬性下限而 3.22 是项目已验证过的策略上限。2.2 主流发行版自带的 CMake 版本文档给出了三个参考发行版的默认 CMake 版本用于说明大多数现代发行版都带有比 3.13 更新的版本发行版自带 CMake 版本相对 3.13 下限Ubuntu 20.043.16.3满足Debian 11.43.18.4满足Ubuntu 22.043.22.1满足从这张表可以看出即使是不算太新的 LTS 发行版如 Ubuntu 20.04其自带 CMake 也显著高于 3.13因此绝大多数用户无需额外安装较新的 CMake。只有那些仍然停留在更老系统例如 Ubuntu 18.04 及更早、Debian 10 及更早的环境才可能触及 3.13 下限。2.3 如何检查本地 CMake 版本在配置构建前可以先用以下命令确认本机 CMake 版本是否满足要求cmake --version输出中的版本号应不低于 3.13。若低于该版本需要从系统包管理器如apt install cmake升级或从 CMake 官方渠道安装更新的二进制包。需要留意的是部分发行版自带的 CMake 可能因打包修改而行为略有差异文档中的版本号指的是发行版发布时自带的默认版本。2.4 CMake 相关的构建开关CMake 3.13 这个下限也约束了项目可用的构建选项。结合 CMakeLists.txt 与 README.md 的安装章节构建时常用的关键选项包括-DCMAKE_BUILD_TYPERelease以 Release 而非默认的 Debug 方式构建Debug 构建时会在输出中给出警告-DBENCHMARK_DOWNLOAD_DEPENDENCIESON允许 CMake 通过 ExternalProject 机制自动下载缺失的依赖如 GoogleTest默认 OFF-DBENCHMARK_ENABLE_GTEST_TESTSOFF关闭依赖 GoogleTest 的单元测试构建适合不需要跑测试的场景-DBENCHMARK_ENABLE_TESTINGOFF整体关闭测试-DBENCHMARK_ENABLE_LTOON启用链接时优化默认 OFF-DBENCHMARK_ENABLE_INSTALLOFF关闭 install 规则常用于把 Google Benchmark 嵌入到其他项目中的场景。一个典型的 Release 构建命令如下摘自 README.mdcmake -E make_directory build cmake -DBENCHMARK_DOWNLOAD_DEPENDENCIESon -DCMAKE_BUILD_TYPERelease -S . -B build cmake --build build --config Release cmake -E chdir build ctest --build-config Release # 可选运行测试值得强调的是Google Test 是构建和运行测试所必需的依赖有两种提供方式将 Google Test 源码检出到benchmark/googletest目录或是在配置阶段传入-DBENCHMARK_DOWNLOAD_DEPENDENCIESON让其自动下载构建README.md。三、Python 版本要求PyPI 安装 3.10源码构建理论上限 3.83.1 两层版本要求的区别依赖文档对 Python 的描述需要区分两个场景从 PyPI 安装预编译 wheel要求Python 3.10这一要求自 v1.9.02024-08-16起生效。对应地pyproject.toml 中声明了requires-python 3.10classifiers 列出了 Python 3.10、3.11、3.12、3.13 四个版本档位。从源码构建较旧版本的 Python 大概率仍然可以编译但项目只保证最低Python 3.8因为绑定生成器 nanobind 仅支持 Python 3.8。这一双下限设计意味着PyPI 上的 wheel 只对 3.10 提供但如果你使用的是 3.8 或 3.9 这样的老版本 Python仍可尝试从源码自行构建绑定模块。3.2 为什么最低是 3.8nanobind 的约束从源码构建的理论下限 3.8 并非 Google Benchmark 自身的选择而是由它使用的 Python 绑定生成器 nanobind 决定的。仓库中有多处证据支持这一结论bazel/benchmark_deps.bzl 中通过new_git_repository拉取 nanobind指定版本为v1.9.2MODULE.bazel 声明了nanobind_bazel依赖版本 2.12.0并且该文件注册了Python 3.8 到 3.13的完整 toolchainMODULE.bazel其中 3.12 为默认版本docs/python_bindings.md 说明预编译 wheel 目前覆盖 macOSARM64 与 Intel x86、Linux x86-64 和 64 位 Windows支持的 Python 版本为 3.8 - 3.12此文档撰写时 PyPI 支持范围而 pyproject.toml 已将安装门槛提升至 3.10。此外setup.py 在构建 Python 扩展时显式传入--cxxopt-stdc17Windows 下为/std:c17注释明确写道C17 is required by nanobind——这解释了为什么构建整个项目需要 C17即便基准测试库本身的使用只需要 C11nanobind 绑定的编译也强制要求 C17。3.3 安装与构建命令从 PyPI 直接安装推荐使用虚拟环境python -m pip install --upgrade pip # 为 manylinux2014 支持升级 pip python -m pip install google-benchmark从源码构建 wheel需要先安装 Bazel绑定模块实际由 Bazel 构建git clone https://github.com/google/benchmark.git cd benchmark python3 -m venv venv --system-site-packages source venv/bin/activate # Windows 下为 .\venv\Scripts\Activate.ps1 python -m pip install --upgrade pip build python -m build # 生成的 wheel 存放在 dist/ 目录关于这条源码构建路径仓库中还有几个值得注意的实现细节setup.py 定义了BazelExtension与BuildBazelExtension说明 wheel 的构建流程是由 setuptools 调用bazel run去构建//bindings/python/google_benchmark:benchmark_stubgen目标bindings/python/google_benchmark/BUILD 中用nanobind_extension定义_benchmark扩展并链接//:benchmark核心库再把产物拷回 setuptools 的 libdir 打包成 wheel对于 Python 3.12setup.py 会启用稳定 ABIpy_limited_api构建生成.abi3.so扩展macOS 构建时 setup.py 会附加--macos_minimum_os10.14因为 C17 至少需要 macOS 10.14。3.4 Python 绑定使用示例安装完成后绑定的用法与 C 版基准测试一一对应。以 bindings/python/google_benchmark/init.py 中的文档示例为参考import google_benchmark as benchmark benchmark.register def my_benchmark(state): ... # while 循环外的代码不计时 while state: ... # while 循环内的代码被计时 if __name__ __main__: benchmark.main()google_benchmark模块还从底层_benchmark扩展重新导出了State、Counter以及时间单位常量如kNanosecond、kMicrosecond、kMillisecond、kSecond详见init.py。四、其他间接依赖测试框架与 Bazel 工具链4.1 GoogleTest构建测试的必备依赖虽然依赖文档没有单独列出 GoogleTest但它是构建测试环节的间接依赖。根 CMakeLists.txt 提供了两个相关开关BENCHMARK_USE_BUNDLED_GTEST默认 ON使用仓库捆绑的 GoogleTest关闭后改用find_package(GTest CONFIG REQUIRED)查找系统安装的 GoogleTestBENCHMARK_DOWNLOAD_DEPENDENCIES默认 OFF允许 CMake 自动下载缺失依赖。若不需要构建和运行测试直接在配置时加上-DBENCHMARK_ENABLE_GTEST_TESTSOFF即可完全避开 GoogleTest 依赖README.md。4.2 Bazel 路径下的依赖管理对于使用 Bazel 的用户WORKSPACE 通过bazel/benchmark_deps.bzl中的benchmark_deps()加载外部依赖包括bazel_skylib、rules_python0.27.1、googletestrelease-1.12.1、nanobindv1.9.2与libpfm4.11.0等使用 Bzlmod 的用户则在 MODULE.bazel 中声明bazel_dep并注册 3.83.13 的 Python toolchain 供绑定构建使用。C 侧的 Bazel 集成方式可参考 docs/bazel.md。五、版本要求速查与常见问题5.1 速查表依赖项使用要求构建要求来源依据C 语言标准C11C17README.md、CMakeLists.txtCMake—≥ 3.13建议 ≥ 3.22docs/dependencies.md、CMakeLists.txtPythonPyPI 安装≥ 3.10自 v1.9.0 起—docs/dependencies.md、pyproject.tomlPython源码构建≥ 3.8nanobind 约束≥ 3.8docs/dependencies.md、MODULE.bazelGoogleTest—构建测试时需要CMakeLists.txtBazelPython wheel 构建—构建绑定需要docs/python_bindings.md5.2 常见问题Q1我的系统 CMake 是 3.16能构建吗可以。3.16 高于 3.13 下限且在3.13...3.22版本范围内CMake 会自动应用 3.16 对应的策略行为。Q2我只有 Python 3.9能用 Python 绑定吗可以从源码尝试自行构建因为 nanobind 支持 3.8但无法直接安装 PyPI 上为 3.10 发布的 wheelrequires-python 3.10会阻止 pip 在 3.9 环境下安装。Q3为什么库的使用只要 C11构建却要 C17基准库的公开 API 保持 C11 兼容方便用户以低标准接入但项目自身的构建代码以及 Python 绑定所依赖的 nanobind 均需要 C17因此构建门槛统一为 C17见 setup.py 中 nanobind 的注释。Q4不想安装 GoogleTest 怎么办配置时传入-DBENCHMARK_ENABLE_GTEST_TESTSOFF即可跳过所有依赖 GoogleTest 的测试构建若只是不希望自动下载依赖保持BENCHMARK_DOWNLOAD_DEPENDENCIES为默认 OFF 并将 GoogleTest 源码放入benchmark/googletest目录即可。六、结语Google Benchmark 的构建工具依赖政策本质上是一套下限清晰、上限兼容的版本策略CMake 以 3.13 为硬性下限并兼容到 3.22 的策略行为Python 则以 3.8nanobind 的理论下限与 3.10PyPI 安装门槛构成双层要求C17 则作为贯穿整个构建链的统一标准。理解这些版本约束不仅能帮你快速判断构建环境是否合规也能在遇到编译失败、wheel 安装报错时准确定位是工具链版本问题还是依赖缺失问题。完整的构建细节还可以进一步参考 docs/user_guide.md 与 docs/platform_specific_build_instructions.md。【免费下载链接】benchmarkA microbenchmark support library项目地址: https://gitcode.com/GitHub_Trending/benchmark3/benchmark创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表