构建 libwebrtc · depot_tools、GN 与 Ninja

把 libwebrtc 这个庞然大物编译出来本身就是一门学问——它用 Chromium 的构建体系:depot_tools 拉代码、GN 生成构建、Ninja 编译。这一章讲清这套工具链、为什么构建这么重(自带整套依赖与工具链的 hermetic 设计),以及实际的构建步骤。

作者 David更新于 第 111 篇(共 112 篇)

构建 libwebrtc · depot_tools、GN 与 Ninja

读了这么多源码,一个很实际的问题:怎么把 libwebrtc 真正编译出来?这不是 ./configure && make 那么简单——WebRTC 用的是 Chromium 的整套构建体系,自成一个世界。这一章讲清它,让你从“读源码”走到“能构建”。

三件套:depot_tools、GN、Ninja

WebRTC 不用 CMake、不用 Make,而是(根目录的 .gn、遍地的 BUILD.gn 就是证据):

WebRTC 的构建靠 Chromium 三件套:

  • depot_tools —— Google 的工具集合,含 fetch、gclient(拉代码 + 依赖)、gn、ninja。第一步是把它加进 PATH。
  • GN(Generate Ninja) —— 元构建系统:读 BUILD.gn(根 BUILD.gn 就有 2000 多行)里声明的目标和依赖,生成 Ninja 构建文件。gn gen out/Default 干这事。
  • Ninja —— 真正执行编译的构建器,追求极致的增量构建速度(Chromium 那种体量,编译速度是刚需)。ninja -C out/Default 开编。

为什么是“GN 生成 Ninja、而非直接写 Ninja”?因为 WebRTC 要跨这么多平台 / 架构(Win/mac/Linux/Android/iOS × x86/arm),配置组合爆炸。GN 用声明式的 BUILD.gn + 参数描述“要构建什么”,再据目标平台生成对应的 Ninja 文件——一套构建描述、生成各平台的实际构建,和一套 C++ 核心服务各平台是同构的思路。

典型构建流程

一次从零构建大致是这几步:

# 1. 装 depot_tools 并加入 PATH
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
export PATH="$PWD/depot_tools:$PATH"

# 2. 拉源码 + 全部依赖(gclient 按 DEPS 文件拉)
mkdir webrtc && cd webrtc
fetch --nohooks webrtc
gclient sync                    # 拉下 third_party 里的一切

# 3. GN 生成构建配置
gn gen out/Default              # 可加 --args='target_os="android"' 等

# 4. Ninja 编译
ninja -C out/Default

关键是第 2 步的 gclient sync:它读 DEPS 文件,把 WebRTC 依赖的一切第三方库拉进 third_party/——而这个“一切”大得惊人。

为什么构建这么重:hermetic 单体

libwebrtc 构建“重”是出了名的——拉下来几个 GB、首次编译动辄几十分钟。根源是它hermetic(自足):不依赖你系统里装了什么,而是自带整套依赖和工具链**。** third_party/ 里 vendored(内置)了它需要的所有东西:

好处是构建结果高度可复现:任何人、任何机器,拉同一个版本编出的二进制一致,不受“你本地装了什么版本的 OpenSSL”干扰——这对一个要在无数环境一致运行的库至关重要。代价就是重:你下载的不只是 WebRTC 代码,而是整个自足的构建宇宙。这也解释了本教程用的源码为何常按“扁平化的单一源码树”分发——完整 checkout 太庞大。

对读者的实际意义

多数人不需要从头构建 libwebrtc——用预编译库、或直接用浏览器内建的 WebRTC 就够。你需要自己构建,通常是为了:改核心源码做定制(如加个 field trial、改拥塞控制参数)、调试深层问题(带符号的本地构建配合event log)、或移植到特殊平台。真到那一步,记住:构建体系是 Chromium 的 GN/Ninja,文档看官方 webrtc.googlesource.com 的构建指南,别指望用通用 C++ 构建习惯套。

小结与下一章

libwebrtc 用 Chromium 构建体系:depot_tools(fetch/gclient)拉代码与依赖、GN(读 BUILD.gn 生成 Ninja,应对跨平台配置爆炸)、Ninja(极速编译)。流程是 fetch webrtc → gclient sync(按 DEPS 拉 third_party)→ gn gen → ninja。构建“重”因它 hermetic 自足:vendored 了 BoringSSL/libvpx/Opus/abseil 和整套工具链,换来高度可复现、代价是庞大。多数人用预编译库即可,要自己构建多为定制核心 / 深度调试。

平台集成的全部拼图到齐了。最后一章,为整个专栏画上句号。👉 全专栏回顾与结语。

参考资料

  • [1] libwebrtc 源码..gn、BUILD.gn、DEPS(GN/gclient 配置)。
  • [2] WebRTC 官方构建文档(webrtc.googlesource.com/src/+/main/docs/native-code/)、Chromium depot_tools。
  • [3] 关联第三方集成 BoringSSL、编解码器、平台策略。

本页目录