gn是编译Chromium工程的工具,它负责生成ninja文件。
gn工具包含在depot_tools中, 它的源代码在https://gn.googlesource.com

chromium中的常用方法

配置编译选项

  1. gn args

生成工程

  1. gn gen out/Debug --ide=xcode

罗列目标

  1. gn ls out/Debug
  2. Lists all targets in the default toolchain.
  3. gn ls out/Debug "//base/*"
  4. Lists all targets in the directory base and all subdirectories.
  5. gn ls out/Debug "//base:*"
  6. Lists all targets defined in //base/BUILD.gn.
  7. gn ls out/Debug //base --as=output
  8. Lists the build output file for //base:base
  9. gn ls out/Debug --type=executable
  10. Lists all executables produced by the build.
  11. gn ls out/Debug "//base/*" --as=output | xargs ninja -C out/Debug
  12. Builds all targets in //base and all subdirectories.
  13. gn ls out/Debug //base --all-toolchains
  14. Lists all variants of the target //base:base (it may be referenced
  15. in multiple toolchains).

gn desc

  1. gn desc out/Default base:base
  2. gn desc out/Default base:base --blame

depot_tools中的gn工具只是个简单的bash脚本。

  1. #!/usr/bin/env bash
  2. # Copyright 2013 The Chromium Authors. All rights reserved.
  3. # Use of this source code is governed by a BSD-style license that can be
  4. # found in the LICENSE file.
  5. base_dir=$(dirname "$0")
  6. PYTHONDONTWRITEBYTECODE=1 exec python "$base_dir/gn.py" "$@"

PYTHONDONTWRTEBYTECODE是python环境变量。
exec 将执行‘gn.py’python脚本替换当前的gn进程。

创建一个简单的工程~/cake/src, 试试能不能直接跑gn命令呢。运行一下gn help试试看,Oops, 抛异常了。
gn 基础 - 图1

使用VSCode打开开工程,切换到调试界面,入截图中program替换成gn.py所在位置,设置执行带的参数我们就可以来调试gn.py看看它到底做些什么了。
gn 基础 - 图2
调试发现gn.py会尝试寻找gn可执行程序,可执行文件可能在~/cake/src/buildtools/mac/ 或者~/cake/src/third_party/gn/gn/下。拷贝Chromium工程下的buildtools到cake工程gn help就可用了。

如何在自己的工程里面使用GN呢?

  1. 为工程创建目录project/src,符合chromium规范。

  2. 拷贝chromuim工程里面的,build, build_overrides, buildtools, third_party/llvm-build, tools目录,gn依赖这些文件。

  3. 在src目录下,创建.gn文件。关于.gn的详细功能可以通过gn help dotfile了解。在该文件中添加一行指定编译配置文件。buildconfig = "//build/config/BUILDCONFIG.gn"

  4. 创建BUILD.gn, 如下配置好target,一个简单demo工程就建好了。

    1. executable("play") {
    2. sources = [
    3. "source.c"
    4. ]
    5. }

一些简单的函数

这些函数列表可以使用gn help 命令找到,位于Buildfile functions归类下面。gn help 函数名可以查看关于该函数的详细信息。
declare_args


建立新的工程目录

  1. mkdir fei

用gclient设置远端代码

  1. gclient config --unmanaged https://github.com/zhaorui/limit.git

从chromium工程下拷贝gn依赖的目录

  1. cd chromium/src
  2. git checkout lkgr
  3. cp -a build