bazel编译系统(TODO)
TODO1 简介Bazel 是Google 开源的多语言、大规模代码库构建 / 测试工具前身是 Google 内部自研构建系统Blaze2007 年开发2015 年开源命名 Bazel2019 年正式稳定版发布。 定位替代 Make、CMake、Gradle、Maven主打超大单体仓库 (Monorepo)、多语言、跨平台、可复现、极速增量构建。目前谷歌全系开源项目原生采用 Bazel代表有 TensorFlow、gRPC、Protobuf、新版 AOSPEnvoy、Redpanda 等云原生中间件、百度 Apollo 自动驾驶、brpc 也基于 Bazel 构建海外大厂 Uber、Spotify、Stripe 用它统一管理多语言单体仓库国内微信后台、网易游戏引擎、高通车载 BSP、地平线芯片固件同样落地 Bazel。Bazel 集中用于多语言大仓库、车载嵌入式、AI 框架、微服务基础设施这类对构建一致性、远程缓存、并行编译要求高的项目小型单语言项目、Chrome 等传统桌面工程大多不选用部分项目也曾因配置维护成本中途弱化或移除 Bazel。特点1 所有依赖必须显式声明禁止隐式依赖。2 每一步构建动作输入输出完全可追踪天然支持缓存、沙箱隔离。优势1 按单个文件 编译参数做内容哈希而非文件修改时间。只重编真正变更及其依赖百万行代码库改动单个头文件也毫秒判断需重编范围。2 本地缓存本机复用历史构建产物远程缓存团队 / CI 共享集群缓存多人开发、流水线大幅提速只要输入完全一致任意机器直接拉取编译结果无需重复编译。3 沙箱隔离构建过程只能读取显式声明的文件禁止读取系统全局头文件、环境变量所有第三方依赖带哈希校验同一套代码在 Linux/macOS/Windows/CI 产出二进制完全一致。4 Action Graph 自动识别无依赖任务并行编译支持把编译任务分发到云端构建集群多核/多机器同时跑超大型项目编译数十倍提速。5 一套 BUILD 语法同时管理C/C/Java/Python/Go/Android/iOSbazel test统一执行所有单元 / 集成测试内置测试结果缓存、失败重跑、日志收集。2 构建流程1 加载阶段 Load读取 WORKSPACE、所有 BUILD 文件解析外部依赖、目标定义。2 分析阶段 Analyze遍历所有 Target解析 srcs/hdrs/deps生成一张完整 Action Graph动作图每个编译 / 链接 / 测试都是独立 Action记录全部输入文件、编译参数、输出产物哈希。3 执行阶段 Execute沙箱隔离执行每个 Action不污染本地环境对比输入哈希仅执行变更 Action命中本地 / 远程缓存直接复用产物跳过编译。常用命令# 构建目标 bazel build //src:main_app # 构建当前目录所有目标 bazel build :all # 运行可执行文件 bazel run //src:main_app # 执行所有测试 bazel test //tests/... # 查询依赖图 bazel query deps(//src:main_app) # 清理构建缓存 bazel clean # 彻底清空所有外部依赖缓存 bazel clean --expunge3 简单例子Bazelisk不用手动装固定版本工程自带项目根目录放 bazelisk 脚本运行时自动下载项目指定版本 Bazel不用本地提前安装。./bazelisk build //:hello目录结构demo/├── WORKSPACE # 工作区标记文件空文件即可├── BUILD.bazel # 构建规则└── main.c # C源码main.c#include stdio.h int main() { printf(Hello Bazel C!\n); return 0; }BUILD.bazelcc_binary( name hello, srcs [main.c], )编译命令# 编译 bazel build :hello # 直接运行 bazel run :hello