|  | # Introduction | 
|  |  | 
|  | This page is about how to design a project that can build independently | 
|  | with GN but also be brought into the Chrome build. | 
|  |  | 
|  | GN is in principle no different than GYP in that there is some core | 
|  | configuration that must be the same between both the standalone build | 
|  | and the Chrome build. However, GN is much more explicit in its naming | 
|  | and configuration, so the similarities between the two builds are also | 
|  | much more explicit and there is less flexibility in how things are | 
|  | configured. | 
|  |  | 
|  | # What you need for a minimal GN build | 
|  |  | 
|  | Requirements: | 
|  |  | 
|  | * A master build config file. Chrome's is `//build/config/BUILDCONFIG.gn` | 
|  | * A separate build file for the toolchain definition. It's not a good idea | 
|  | to put these in a BUILD.gn file shared with any target definitions for | 
|  | complex reasons. Chrome's are in `//build/toolchain/<platform>/BUILD.gn`. | 
|  | * A `BUILD.gn` file in the root directory. This will be loaded after the | 
|  | build config file to start the build. | 
|  |  | 
|  | You may want a `.gn` file in the root directory. When you run GN it | 
|  | recursively looks up the directory tree until it finds this file, and it | 
|  | treats the containing directory as the "source root". This file also | 
|  | defines the location of the master build config file: | 
|  |  | 
|  | * See Chrome's `src/.gn` file. | 
|  | * Unlike Chrome, you probably don't need to define a secondary root. | 
|  | * see `gn help dotfile` for more. | 
|  |  | 
|  | Adding a `.gn` file in a repository that is pulled into Chrome means | 
|  | that then running GN in your subdirectory will configure a build for | 
|  | your subproject rather than for all of Chrome. This could be an | 
|  | advantage or a disadvantage. | 
|  |  | 
|  | If you are in a directory with such a file and you want to not use it | 
|  | (e.g., to do the full Chrome build instead), you can use the command-line | 
|  | flags `--root` and `--dotfile` to set the values you want. | 
|  |  | 
|  | If you want a completely standalone build that has nothing to do with Chrome | 
|  | and doesn't use Chrome's `//build` files, you can look at an example in | 
|  | [//tools/gn/example](../tools/gn/example). |