GN 构建系统常用命令

  • 生成Ninja构建文件
1
gn gen out/Default
  • 编译项目
1
ninja -C out/Default
  • 打开文本编辑器修改构建参数
1
gn args out/Default
  • 清理指定输出目录中的所有生成文件
1
2
# 不会删除args.gn文件
gn clean out/Default
  • 查找引用了给定源文件的目标
1
gn refs out/Default //path/to/source_file.cpp
  • 编译特定目标
1
2
3
4
5
# 编译 base_target 组
ninja -C out base_target

# 编译 logger 共享库
ninja -C out logger
  • 如果目标在不同目录中,需要使用完整路径
1
2
3
4
5
# 编译 base 目录下的 base_target
ninja -C out //base:base_target

# 编译 logger 共享库
ninja -C out //base/logger:logger
  • 列出所有构建目标
1
2
3
4
5
6
7
8
9
# 列出所有构建目标
gn ls out

# 列出所有构建目标(含路径)
gn ls out --as=output

# 列出所有构建目标及其类型
gn ls out --type=group # 只显示 group 类型
gn ls out --type=shared_library # 只显示共享库
  • 编译多个特定目标
1
2
3
4
5
# 编译 base_target 和 logger
ninja -C out base_target logger

# 使用完整路径编译多个目标
ninja -C out //base:base_target //base/logger:logger
  • 使用GN命令直接编译
1
2
3
4
5
# 生成 base_target 的构建文件
gn gen out --filters=//base:base_target

# 然后编译
ninja -C out
  • 依赖关系编译
1
2
3
4
5
# 编译目标及其所有依赖项
ninja -C out base_target:all

# 只编译直接依赖项
ninja -C out base_target:deps
  • 查看构建目标信息
1
2
3
4
5
6
7
8
# 查看目标描述
gn desc out //base:base_target

# 查看目标依赖树
gn desc out //base:base_target deps --tree

# 查看目标包含的文件
gn desc out //base:base_target sources
  • 使用技巧
1
2
3
4
5
6
7
8
# 并行编译(使用多核)
ninja -C out -j$(nproc) base_target

# 显示详细编译输出
ninja -C out -v base_target

# 只检查而不实际编译
ninja -C out -n base_target

参考资料

  1. https://gn.googlesource.com/gn/

相关笔记

  • [[高性能日志系统实现]] — GN 构建系统在日志项目中的应用
  • [[C基础知识]] — C 编译链接过程详解