gn是编译Chromium工程的工具,它负责生成ninja文件。
gn工具包含在depot_tools中, 它的源代码在https://gn.googlesource.com
chromium中的常用方法
配置编译选项
gn args
生成工程
gn gen out/Debug --ide=xcode
罗列目标
gn ls out/Debug
Lists all targets in the default toolchain.
gn ls out/Debug "//base/*"
Lists all targets in the directory base and all subdirectories.
gn ls out/Debug "//base:*"
Lists all targets defined in //base/BUILD.gn.
gn ls out/Debug //base --as=output
Lists the build output file for //base:base
gn ls out/Debug --type=executable
Lists all executables produced by the build.
gn ls out/Debug "//base/*" --as=output | xargs ninja -C out/Debug
Builds all targets in //base and all subdirectories.
gn ls out/Debug //base --all-toolchains
Lists all variants of the target //base:base (it may be referenced
in multiple toolchains).
gn desc
gn desc out/Default base:base
gn desc out/Default base:base --blame
depot_tools中的gn工具只是个简单的bash脚本。
#!/usr/bin/env bash
# Copyright 2013 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
base_dir=$(dirname "$0")
PYTHONDONTWRITEBYTECODE=1 exec python "$base_dir/gn.py" "$@"
PYTHONDONTWRTEBYTECODE是python环境变量。
exec 将执行‘gn.py’python脚本替换当前的gn进程。
创建一个简单的工程~/cake/src, 试试能不能直接跑gn命令呢。运行一下gn help
试试看,Oops, 抛异常了。
使用VSCode打开开工程,切换到调试界面,入截图中program替换成gn.py所在位置,设置执行带的参数我们就可以来调试gn.py看看它到底做些什么了。
调试发现gn.py会尝试寻找gn可执行程序,可执行文件可能在~/cake/src/buildtools/mac/ 或者~/cake/src/third_party/gn/gn/下。拷贝Chromium工程下的buildtools到cake工程gn help就可用了。
如何在自己的工程里面使用GN呢?
为工程创建目录project/src,符合chromium规范。
拷贝chromuim工程里面的,build, build_overrides, buildtools, third_party/llvm-build, tools目录,gn依赖这些文件。
在src目录下,创建.gn文件。关于.gn的详细功能可以通过
gn help dotfile
了解。在该文件中添加一行指定编译配置文件。buildconfig = "//build/config/BUILDCONFIG.gn"
创建BUILD.gn, 如下配置好target,一个简单demo工程就建好了。
executable("play") {
sources = [
"source.c"
]
}
一些简单的函数
这些函数列表可以使用gn help 命令找到,位于Buildfile functions归类下面。gn help 函数名可以查看关于该函数的详细信息。
declare_args
建立新的工程目录
mkdir fei
用gclient设置远端代码
gclient config --unmanaged https://github.com/zhaorui/limit.git
从chromium工程下拷贝gn依赖的目录
cd chromium/src
git checkout lkgr
cp -a build