Index: tools/gn/docs/quick_start.md |
diff --git a/tools/gn/docs/quick_start.md b/tools/gn/docs/quick_start.md |
new file mode 100644 |
index 0000000000000000000000000000000000000000..49f16ae08be33b2a32e749ad653eb33590518e20 |
--- /dev/null |
+++ b/tools/gn/docs/quick_start.md |
@@ -0,0 +1,329 @@ |
+# GN Quick Start guide |
+ |
+[TOC] |
+ |
+## Running GN |
+ |
+You just run `gn` from the command line. There is a script in |
+depot\_tools (which is presumably on your path) with this name. The |
+script will find the binary in the source tree containing the current |
+directory and run it. |
+ |
+## Setting up a build |
+ |
+In GYP, the system would generate `Debug` and `Release` build |
+directories for you and configure them accordingly. GN doesn't do this. |
+Instead, you set up whatever build directory you want with whatever |
+configuration you want. The Ninja files will be automatically |
+regenerated if they're out of date when you build in that directory. |
+ |
+To make a build directory: |
+ |
+``` |
+gn gen out/my_build |
+``` |
+ |
+## Passing build arguments |
+ |
+Set build arguments on your build directory by running: |
+ |
+``` |
+gn args out/my_build |
+``` |
+ |
+This will bring up an editor. Type build args into that file like this: |
+ |
+``` |
+is_component_build = true |
+is_debug = false |
+``` |
+ |
+You can see the list of available arguments and their default values by |
+typing |
+ |
+``` |
+gn args --list out/my_build |
+``` |
+ |
+on the command line. See "Taking build arguments" below for information |
+on how to use these in your code. (Note that you have to specify the |
+build directory for this command because the available arguments can |
+change according to what's set. |
+ |
+## Configuring goma |
+ |
+ |
+Run `gn args out/Default` (substituting your build directory as needed). |
+Add: |
+ |
+``` |
+use_goma = true |
+goma_dir = "~/foo/bar/goma" |
+``` |
+ |
+If your goma is in the default location (`~/goma`) then you can omit the |
+`goma_dir` line. |
+ |
+## Configuring component mode |
+ |
+This is a build arg like the goma flags. run `gn args out/Default` and add: |
+ |
+``` |
+is_component_build = true |
+``` |
+ |
+## Step-by-step |
+ |
+### Adding a build file |
+ |
+Create a `tools/gn/tutorial/BUILD.gn` file and enter the following: |
+ |
+``` |
+executable("hello_world") { |
+ sources = [ |
+ "hello_world.cc", |
+ ] |
+} |
+``` |
+ |
+There should already be a `hello_world.cc` file in that directory, |
+containing what you expect. That's it! Now we just need to tell the |
+build about this file. Open the `BUILD.gn` file in the root directory |
+and add the label of this target to the dependencies of the root group |
+(a "group" target is a meta-target that is just a collection of other |
+targets): |
+ |
+``` |
+group("root") { |
+ deps = [ |
+ ... |
+ "//url", |
+ "//tools/gn/tutorial:hello_world", |
+ ] |
+} |
+``` |
+ |
+You can see the label of your target is "//" (indicating the source |
+root), followed by the directory name, a colon, and the target name. |
+ |
+### Testing your addition |
+ |
+From the command line in the source root directory: |
+ |
+``` |
+gn gen out/Default |
+ninja -C out/Default hello_world |
+out/Default/hello_world |
+``` |
+ |
+GN encourages target names for static libraries that aren't globally |
+unique. To build one of these, you can pass the label with no leading |
+"//" to ninja: |
+ |
+``` |
+ninja -C out/Default tools/gn/tutorial:hello_world |
+``` |
+ |
+### Declaring dependencies |
+ |
+Let's make a static library that has a function to say hello to random |
+people. There is a source file `hello.cc` in that directory which has a |
+function to do this. Open the `tools/gn/tutorial/BUILD.gn` file and add |
+the static library to the bottom of the existing file: |
+ |
+``` |
+static_library("hello") { |
+ sources = [ |
+ "hello.cc", |
+ ] |
+} |
+``` |
+ |
+Now let's add an executable that depends on this library: |
+ |
+``` |
+executable("say_hello") { |
+ sources = [ |
+ "say_hello.cc", |
+ ] |
+ deps = [ |
+ ":hello", |
+ ] |
+} |
+``` |
+ |
+This executable includes one source file,and depends on the previous |
+static library. The static library is referenced by its label in the |
+`deps`. You could have used the full label `//tools/gn/tutorial:hello` |
+but if you're referencing a target in the same build file, you can use |
+the shortcut `:hello`. |
+ |
+### Test the static library version |
+ |
+From the command line in the source root directory: |
+ |
+``` |
+ninja -C out/Default say_hello |
+out/Default/say_hello |
+``` |
+ |
+Note that you **didn't** need to re-run GN.GN will automatically rebuild |
+the ninja files when any build file has changed. You know this happens |
+when ninja prints `[1/1] Regenerating ninja files` at the beginning of |
+execution. |
+ |
+### Compiler settings |
+ |
+Our hello library has a new feature, the ability to say hello to two |
+people at once. This feature is controlled by defining `TWO_PEOPLE`. We |
+can add defines like so: |
+ |
+``` |
+static_library("hello") { |
+ sources = [ |
+ "hello.cc", |
+ ] |
+ defines = [ |
+ "TWO_PEOPLE", |
+ ] |
+} |
+``` |
+ |
+### Putting settings in a config |
+ |
+However, users of the library also need to know about this define, and |
+putting it in the static library target defines it only for the files |
+there. If somebody else includes `hello.h`, they won't see the new |
+definition. To see the new definition, everybody will have to define |
+`TWO_PEOPLE`. |
+ |
+GN has a concept called a "config" which encapsulates settings. Let's |
+create one that defines our preprocessor define: |
+ |
+``` |
+config("hello_config") { |
+ defines = [ |
+ "TWO_PEOPLE", |
+ ] |
+} |
+``` |
+ |
+To apply these settings to your target, you only need to add the |
+config's label to the list of configs in the target: |
+ |
+``` |
+static_library("hello") { |
+ ... |
+ configs += [ |
+ ":hello_config", |
+ ] |
+} |
+``` |
+ |
+Note that you need "+=" here instead of "=" since the build |
+configuration has a default set of configs applied to each target that |
+set up the default build stuff. You want to add to this list rather than |
+overwrite it. To see the default configs, you can use the `print` |
+function in the build file or the `desc` command-line subcommand (see |
+below for examples of both). |
+ |
+### Dependent configs |
+ |
+This nicely encapsulates our settings, but still requires everybody that |
+uses our library to set the config on themselves. It would be nice if |
+everybody that depends on our `hello` library can get this |
+automatically. Change your library definition to: |
+ |
+``` |
+static_library("hello") { |
+ sources = [ |
+ "hello.cc", |
+ ] |
+ all_dependent_configs = [ |
+ ":hello_config" |
+ ] |
+} |
+``` |
+ |
+This applies the `hello_config` to the `hello` target itself, plus all |
+targets that depend on transitively depend on the current one. Now |
+everybody that depends on us will get our settings. You can also set |
+`direct_dependent_configs` which applies only to targets that directly |
+depend on your target (not transitively). |
+ |
+Now if you compile and run, you'll see the new version with two people: |
+ |
+``` |
+> ninja -C out/Default say_hello |
+ninja: Entering directory 'out/Default' |
+[1/1] Regenerating ninja files |
+[4/4] LINK say_hello |
+> out/Default/say_hello |
+Hello, Bill and Ted. |
+``` |
+ |
+## Don't know what's going on? |
+ |
+You can run GN in verbose mode to see lots of messages about what it's |
+doing. Use `-v` for this. |
+ |
+### Print debugging |
+ |
+There is a `print` command which just writes to stdout: |
+ |
+``` |
+static_library("hello") { |
+ ... |
+ print(configs) |
+} |
+``` |
+ |
+This will print all of the configs applying to your target (including |
+the default ones). |
+ |
+### The "desc" command |
+ |
+You can run `gn desc <build_dir> <targetname>` to get information about |
+a given target: |
+ |
+``` |
+gn desc out/Default //tools/gn/tutorial:say_hello |
+``` |
+ |
+will print out lots of exciting information. You can also print just one |
+section. Lets say you wanted to know where your `TWO_PEOPLE` define |
+came from on the `say_hello` target: |
+ |
+``` |
+> gn desc out/Default //tools/gn/tutorial:say_hello defines --blame |
+...lots of other stuff omitted... |
+ From //tools/gn/tutorial:hello_config |
+ (Added by //tools/gn/tutorial/BUILD.gn:12) |
+ TWO_PEOPLE |
+``` |
+ |
+You can see that `TWO_PEOPLE` was defined by a config, and you can also |
+see the which like caused that config to be applied to your target (in |
+this case, the `all_dependent_configs` line). |
+ |
+Another particularly interesting variation: |
+ |
+``` |
+gn desc out/Default //base:base_i18n deps --tree |
+``` |
+ |
+See `gn help desc` for more. |
+ |
+### Performance |
+ |
+You can see what took a long time by running it with the --time command |
+line flag. This will output a summary of timings for various things. |
+ |
+You can also make a trace of how the build files were executed: |
+ |
+``` |
+gn --tracelog=mylog.trace |
+``` |
+ |
+and you can load the resulting file in Chrome's `about:tracing` page to |
+look at everything. |