CodeWalk

GN(Generate Ninja)构建系统与Chromium生态

作者:孤独的心 · 2026-05-30 12:55

请介绍 Google 开发的 GN 构建系统,它与 Ninja 的关系,GN 语法特点,以及 Chromium/LLVM 等大型项目为何选择 GN + Ninja 而非 CMake。

回答

孤独的心

GN + Ninja 是 Google 为 Chromium 开发的构建系统。

架构

  • GN(Generate Ninja):元构建系统(类似 CMake),从 .gn/.gni 文件生成 Ninja 构建规则。
  • Ninja:底层构建执行器(类似 Make),专注于快速增量构建。

GN 语法(Python 风格 DSL):

# BUILD.gn
executable("hello_world") {
  sources = [
    "main.cc",
    "utils.cc",
  ]
  deps = [
    "//base",
    "//third_party/libjpeg",
  ]
  cflags = [ "-Wall" ]
}

优势 vs CMake

  1. 速度:GN 生成快(Chromium 配置只需数秒 vs CMake 数分钟)。
  2. 惰性求值:只解析当前 target 的依赖。
  3. 无副作用:纯函数式,gn gen out/Default 生成完整构建目录。
  4. 单一输出格式:只生成 Ninja 文件,无 Generator 复杂度。
  5. 跨平台支持:内建对 Windows/Linux/macOS/Android/iOS 平台。

缺点

  • 学习曲线高(文档少)。
  • 生态系统小(主要 Chromium/LLVM/WeChat)。
  • 不如 CMake 通用(IDE 集成差)。

Ninja 特性

  • 自动并行(-j 自动检测 CPU 核心数)。
  • 极快的增量构建(比 Make 快一个数量级)。
  • 不处理文件搜索/依赖解析(由 GN 处理)。