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/
  2. https://gn.googlesource.com/gn/