通用的bazel workspace 模板

通用的bazel workspace 模板

以下是一个通用的 Bazel Workspace 模板,支持 C++/Python 混合项目、多平台构建、外部依赖管理和单元测试,适用于现代 C++(17/20)和 Python 3 项目:

WORKSPACE 文件:

# WORKSPACE 文件(项目根目录)
workspace(
    name = "my_project",
    managed_directories = {"@npm": ["node_modules"]},  # 可选:前端依赖管理
)

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")

# ================ Bazel 版本和工具链 ================
# 强制 Bazel 最低版本
bazel_version = "7.0.0"

# ================ 外部依赖管理 ================
# 1. 规则集依赖
http_archive(
    name = "rules_cc",
    sha256 = "3d9e271e2876ba42e114c9b9bc51454e379cbf0ec9af9ed1d1f3d0e7b109b6b4",
    urls = ["https://github.com/bazelbuild/rules_cc/releases/download/0.0.9/rules_cc-0.0.9.tar.gz"],
)

http_archive(
    name = "rules_python",
    sha256 = "a30ab357c7314a805538d5a4c8ca8a9cad11f6e2e07e6a6e8c8e89e5a4d8b8e7",
    urls = ["https://github.com/bazelbuild/rules_python/releases/download/0.25.0/rules_python-0.25.0.tar.gz"],
)

# 2. 第三方库(示例:spdlog)
http_archive(
    name = "com_github_gabime_spdlog",
    sha256 = "6fff9215f5cb81760be4cc16d033526d1080427d236e86d70bb02994f85e3d38",
    strip_prefix = "spdlog-1.11.0",
    urls = ["https://github.com/gabime/spdlog/archive/refs/tags/v1.11.0.tar.gz"],
)

# 3. 工具链配置(示例:Linux GCC)
load("@rules_cc//cc:defs.bzl", "cc_register_toolchains")
cc_register_toolchains(version = "12")  # 使用系统 GCC 12

# ================ 本地依赖加载 ================
# 加载子模块(如果有)
local_repository(
    name = "submodule",
    path = "third_party/submodule",
)

# ================ 语言支持扩展 ================
# Python 环境配置
load("@rules_python//python:repositories.bzl", "python_register_toolchains")
python_register_toolchains(
    name = "python3",
    python_version = "3.10",
)

# ================ 项目配置 ================
load("//:version.bzl", "PROJECT_VERSION")  # 从version.bzl加载版本号

BUILD 文件:

# BUILD 文件(示例:主程序)
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_test")

# ================ C++ 主库 ================
cc_library(
    name = "core",
    srcs = glob([
        "src/core/*.cpp",
    ]),
    hdrs = glob([
        "include/core/*.h",
    ]),
    deps = [
        "@com_github_gabime_spdlog//:spdlog",
    ],
    copts = ["-std=c++17"],
    visibility = ["//visibility:public"],
)

# ================ 可执行文件 ================
cc_binary(
    name = "main",
    srcs = ["src/main.cpp"],
    deps = [":core"],
)

# ================ 单元测试 ================
cc_test(
    name = "core_test",
    srcs = ["tests/core_test.cpp"],
    deps = [
        ":core",
        "@com_google_googletest//:gtest_main",
    ],
)

# ================ Python 扩展(可选) ================
py_binary(
    name = "py_tool",
    srcs = ["tools/script.py"],
    deps = [
        requirement("numpy"),
    ],
)

.bazelrc 配置文件(可选)

公共构建选项

  • build --cxxopt=-std=c++17
  • build --host_cxxopt=-std=c++17
  • build --copt=-Wall
  • build --copt=-Wextra

平台特定配置

  • build:linux --copt=-D_LINUX
  • build:windows --copt=-D_WINDOWS

远程缓存配置(加速构建)

  • build --remote_cache=grpc://buildcache.example.com

核心功能说明

模块 功能
依赖管理 支持 http_archive(源码下载)和系统工具链
多语言支持 同时支持 C++ 和 Python 构建
模块化设计 通过 cc_library 分离核心逻辑和可执行文件
测试集成 原生支持 cc_test 和 py_test
跨平台构建 通过 .bazelrc 配置不同平台的编译选项
高性能构建 支持远程缓存(Remote Cache)和沙盒构建

项目结构建议

my_project/
├── WORKSPACE          # Bazel 工作区定义
├── .bazelrc           # 全局构建配置
├── BUILD              # 根构建文件
├── src/
│   ├── core/          # 核心库源码
│   └── main.cpp       # 主程序
├── include/
│   └── core/          # 公共头文件
├── tests/
│   └── core_test.cpp  # 单元测试
└── tools/
    └── script.py      # Python 工具脚本

常用命令

# 构建主程序
bazel build //:main

# 运行程序
bazel run //:main

# 运行测试
bazel test //:core_test

# 构建所有目标
bazel build //...

# 清理构建缓存
bazel clean --expunge

高级功能扩展

1. 自定义工具链:

load("@rules_cc//cc:defs.bzl", "cc_toolchain")
cc_toolchain(
    name = "custom_toolchain",
    cpu = "k8",
    compiler = "clang",
)

2. Docker 集成:

load("@io_bazel_rules_docker//cc:image.bzl", "cc_image")
cc_image(
    name = "docker_image",
    binary = ":main",
    base = "@alpine_linux//image",
)

3. 前端集成(需安装 rules_nodejs):

load("@build_bazel_rules_nodejs//:index.bzl", "nodejs_binary")
nodejs_binary(
    name = "frontend",
    entry_point = "webpack.config.js",
)

此模板提供了现代 C++/Python 项目所需的基础设施,支持从单体应用到微服务架构的平滑扩展。根据实际需求调整依赖项和构建规则即可。

posted @ 2025-05-09 19:47  michaelchengjl  阅读(74)  评论(0)    收藏  举报