GN(Generate Ninja)构建系统与Chromium生态
请介绍 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:
- 速度:GN 生成快(Chromium 配置只需数秒 vs CMake 数分钟)。
- 惰性求值:只解析当前 target 的依赖。
- 无副作用:纯函数式,
gn gen out/Default生成完整构建目录。 - 单一输出格式:只生成 Ninja 文件,无 Generator 复杂度。
- 跨平台支持:内建对 Windows/Linux/macOS/Android/iOS 平台。
缺点:
- 学习曲线高(文档少)。
- 生态系统小(主要 Chromium/LLVM/WeChat)。
- 不如 CMake 通用(IDE 集成差)。
Ninja 特性:
- 自动并行(
-j自动检测 CPU 核心数)。 - 极快的增量构建(比 Make 快一个数量级)。
- 不处理文件搜索/依赖解析(由 GN 处理)。