Step into Chromium (1) - GN 构建系统简述
2025/10/24大约 2 分钟
这是什么
GN 是一个可生成 Ninja 构建配置文件的源构建系统。常用 C/C++ 的同志们都知道 CMake,GN 在某种意义上和 CMake 同级,只不过它只能生成 Ninja makefile,但也提供比 CMake 更多更便利的功能。
和 CMake 类似,GN 也是一个 DSL (领域特定语言),像是 Python 和 C 的混合体。
这并不是一个完整的教程,只是用到了就会来补充用法,权当一个速查手册。
如何:构建一个可执行文件/库
写一个 BUILD.gn(不要改名):
executable("demo_exe") {
sources = [ "demo.cc" ]
}That's All!
这里我们创建了一个名叫 demo_exe 的 target,类型是可执行文件,源文件有 demo.cc。
对于静态库,使用 static_library;动态库是 shared_library。
如何:引入一个组件/静态库
这在 GN 中被描述为“依赖” (deps)。如果我们的 demo_exe 使用了 base 库的内容,则我们需要这样将依赖加入 deps 数组即可:
executable("demo_exe") {
sources = [ "demo.cc" ]
deps = [ "//base" ] # here
}// 是指项目根目录。
如何:预定义一个宏
在 target 内部加入 defines 数组即可:
defines = [
"HELLO_SHARED_IMPLEMENTATION",
"ENABLE_DOOM_MELON=0",
]如何:条件编译
GN 内部存在很多的变量,我们也可以可以定义变量,然后使用条件控制语句控制。
以常见的跨平台场景为例,我们有 demo.h 定义了接口,然后对于 Windows, linux 和 mac 有 demo_win.cc, demo_linux.cc 和 demo_mac.cc 作为实现。则可以这样写:
executable("demo_exe") {
sources = [ "demo.h" ]
if(is_win){
sources += ["demo_win.cc"]
}
if(is_linux){
sources += ["demo_linux.cc"]
}
if(is_mac) {
sources += ["demo_mac.cc"]
}
}这里的 is_win,is_linux 和 is_mac 都是 GN 的预定义变量。自定义变量只需要直接写 var_name = value 即可。
如何:生成 Ninja 构建文件
$ gn gen <out_dir>随后转到 out_dir 执行 ninja 即可。