blob: a581ebae2c51d742152fbdffc65f5e56425409e6 [file] [log] [blame] [view]
Petr Hosek567ac712018-05-30 15:55:16 -07001# GN
2
Scott Grahamab123de2018-06-08 15:53:07 -07003GN is a meta-build system that generates build files for
Brett Wilsonfc2f07a2019-09-03 12:06:18 -07004[Ninja](https://ninja-build.org).
5
6Related resources:
7
Shezan Baige0c476f2021-06-08 05:08:15 -04008 * Documentation in [docs/](https://gn.googlesource.com/gn/+/main/docs/). In
Venkatesh Srinivasa38ba1c2020-04-02 11:29:47 -04009 particular [GN Quick Start
Shezan Baige0c476f2021-06-08 05:08:15 -040010 guide](https://gn.googlesource.com/gn/+/main/docs/quick_start.md)
11 and the [reference](https://gn.googlesource.com/gn/+/main/docs/reference.md)
Brett Wilson2a181332020-03-20 13:38:18 -070012 (the latter is all builtin help converted to a single file).
Brett Wilsonfc2f07a2019-09-03 12:06:18 -070013 * An introductory [presentation](https://docs.google.com/presentation/d/15Zwb53JcncHfEwHpnG_PoIbbzQ3GQi_cpujYwbpcbZo/edit?usp=sharing).
14 * The [mailing list](https://groups.google.com/a/chromium.org/forum/#!forum/gn-dev).
Scott Grahamab123de2018-06-08 15:53:07 -070015
Brett Wilson5f30bbf2021-01-25 16:07:26 -080016## What GN is for
17
18GN is currently used as the build system for Chromium, Fuchsia, and related
19projects. Some strengths of GN are:
20
21 * It is designed for large projects and large teams. It scales efficiently to
22 many thousands of build files and tens of thousands of source files.
23
24 * It has a readable, clean syntax. Once a build is set-up, it is generally
25 easy for people with no backround in GN to make basic edits to the build.
26
27 * It is designed for multi-platform projects. It can cleanly express many
28 complicated build variants across different platforms. A single build
29 invocation can target multiple platforms.
30
31 * It supports multiple parallel output directories, each with their own
32 configuration. This allows a developer to maintain builds targeting debug,
33 release, or different platforms in parallel without forced rebuilds when
34 switching.
35
36 * It has a focus on correctness. GN checks for the correct dependencies,
37 inputs, and outputs to the extent possible, and has a number of tools to
38 allow developers to ensure the build evolves as desired (for example, `gn
39 check`, `testonly`, `assert_no_deps`).
40
41 * It has comprehensive build-in help available from the command-line.
42
43Although small projects successfully use GN, the focus on large projects has
44some disadvanages:
45
46 * GN has the goal of being minimally expressive. Although it can be quite
47 flexible, a design goal is to direct members of a large team (who may not
48 have much knowledge about the build) down an easy-to-understand, well-lit
49 path. This isn't necessarily the correct trade-off for smaller projects.
50
51 * The minimal build configuration is relatively heavyweight. There are several
52 files required and the exact way all compilers are linkers are run must be
53 specified in the configuration (see "Examples" below). There is no default
54 compiler configuration.
55
56 * It is not easily composable. GN is designed to compile a single large
57 project with relatively uniform settings and rules. Projects like Chromium
58 do bring together multiple repositories from multiple teams, but the
59 projects must agree on some conventions in the build files to allow this to
60 work.
61
Brett Wilsond7cf6232021-02-02 17:09:07 -080062 * GN is designed with the expectation that the developers building a project
63 want to compile an identical configuration. So while builds can integrate
Brett Wilson5f30bbf2021-01-25 16:07:26 -080064 with the user's environment like the CXX and CFLAGS variables if they want,
65 this is not the default and most project's builds do not do this. The result
66 is that many GN projects do not integrate well with other systems like
67 ebuild.
68
69 * There is no simple release scheme (see "Versioning and distribution" below).
70 Projects are expected to manage the version of GN they require. Getting an
71 appropriate GN binary can be a hurdle for new contributors to a project.
72 Since it is relatively uncommon, it can be more difficult to find
73 information and examples.
74
75GN can generate Ninja build files for C, C++, Rust, Objective C, and Swift
76source on most popular platforms. Other languages can be compiled using the
Brett Wilsond7cf6232021-02-02 17:09:07 -080077general "action" rules which are executed by Python or another scripting
78language (Google does this to compile Java and Go). But because this is not as
79clean, generally GN is only used when the bulk of the build is in one of the
80main built-in languages.
Brett Wilson5f30bbf2021-01-25 16:07:26 -080081
Brett Wilson4c0c60e2019-07-08 15:18:40 -070082## Getting a binary
Scott Grahamab123de2018-06-08 15:53:07 -070083
Petr Hosek1beb0502018-10-24 18:58:39 -070084You can download the latest version of GN binary for
85[Linux](https://chrome-infra-packages.appspot.com/dl/gn/gn/linux-amd64/+/latest),
86[macOS](https://chrome-infra-packages.appspot.com/dl/gn/gn/mac-amd64/+/latest) and
Brett Wilson5f30bbf2021-01-25 16:07:26 -080087[Windows](https://chrome-infra-packages.appspot.com/dl/gn/gn/windows-amd64/+/latest)
88from Google's build infrastructure (see "Versioning and distribution" below for
89how this is expected to work).
Petr Hosek1beb0502018-10-24 18:58:39 -070090
Brett Wilson5f30bbf2021-01-25 16:07:26 -080091Alternatively, you can build GN from source with a C++17 compiler:
Petr Hosek1beb0502018-10-24 18:58:39 -070092
Scott Graham4a2a0682018-06-11 09:28:19 -070093 git clone https://gn.googlesource.com/gn
94 cd gn
Scott Graham74e0a4c2018-06-12 16:01:49 -070095 python build/gen.py
Scott Graham4a2a0682018-06-11 09:28:19 -070096 ninja -C out
Andrew Grieve77d64a32018-09-06 23:19:01 -040097 # To run tests:
98 out/gn_unittests
Scott Graham0c5d9362018-06-26 21:12:17 -070099
100On Windows, it is expected that `cl.exe`, `link.exe`, and `lib.exe` can be found
101in `PATH`, so you'll want to run from a Visual Studio command prompt, or
102similar.
103
Gaby Baghdadi45aa8422021-05-12 12:37:08 -0400104On Linux, Mac and z/OS, the default compiler is `clang++`, a recent version is
Scott Graham0c5d9362018-06-26 21:12:17 -0700105expected to be found in `PATH`. This can be overridden by setting `CC`, `CXX`,
106and `AR`.
107
Gaby Baghdadi45aa8422021-05-12 12:37:08 -0400108On z/OS, building GN requires [ZOSLIB](https://github.com/ibmruntimes/zoslib) to be
109installed, as described at that URL. When building with `build/gen.py`, use the option
110`--zoslib-dir` to specify the path to [ZOSLIB](https://github.com/ibmruntimes/zoslib):
111
112 cd gn
113 python build/gen.py --zoslib-dir /path/to/zoslib
114
115By default, if you don't specify `--zoslib-dir`, `gn/build/gen.py` expects to find
116`zoslib` directory under `gn/third_party/`.
117
Brett Wilson4c0c60e2019-07-08 15:18:40 -0700118## Examples
119
120There is a simple example in [examples/simple_build](examples/simple_build)
121directory that is a good place to get started with the minimal configuration.
122
Wayne Piekarskib0e61462019-11-08 15:55:17 -0800123To build and run the simple example with the default gcc compiler:
124
125 cd examples/simple_build
126 ../../out/gn gen -C out
127 ninja -C out
128 ./out/hello
129
Brett Wilson4c0c60e2019-07-08 15:18:40 -0700130For a maximal configuration see the Chromium setup:
131 * [.gn](https://cs.chromium.org/chromium/src/.gn)
132 * [BUILDCONFIG.gn](https://cs.chromium.org/chromium/src/build/config/BUILDCONFIG.gn)
133 * [Toolchain setup](https://cs.chromium.org/chromium/src/build/toolchain/)
134 * [Compiler setup](https://cs.chromium.org/chromium/src/build/config/compiler/BUILD.gn)
135
136and the Fuchsia setup:
Shezan Baige0c476f2021-06-08 05:08:15 -0400137 * [.gn](https://fuchsia.googlesource.com/fuchsia/+/refs/heads/main/.gn)
138 * [BUILDCONFIG.gn](https://fuchsia.googlesource.com/fuchsia/+/refs/heads/main/build/config/BUILDCONFIG.gn)
139 * [Toolchain setup](https://fuchsia.googlesource.com/fuchsia/+/refs/heads/main/build/toolchain/)
140 * [Compiler setup](https://fuchsia.googlesource.com/fuchsia/+/refs/heads/main/build/config/BUILD.gn)
Brett Wilson4c0c60e2019-07-08 15:18:40 -0700141
Daniel Bratellf73698e2018-10-19 16:00:05 +0200142## Reporting bugs
143
144If you find a bug, you can see if it is known or report it in the [bug
145database](https://bugs.chromium.org/p/gn/issues/list).
146
Scott Graham0c5d9362018-06-26 21:12:17 -0700147## Sending patches
148
149GN uses [Gerrit](https://www.gerritcodereview.com/) for code review. The short
150version of how to patch is:
151
Erik Chenc4b86552018-08-22 16:30:36 -0700152 Register at https://gn-review.googlesource.com.
153
Scott Graham0c5d9362018-06-26 21:12:17 -0700154 ... edit code ...
155 ninja -C out && out/gn_unittests
156
157Then, to upload a change for review:
158
159 git commit
Shezan Baige0c476f2021-06-08 05:08:15 -0400160 git push origin HEAD:refs/for/main
Scott Graham0c5d9362018-06-26 21:12:17 -0700161
Brett Wilsone67b81b2020-01-03 07:56:19 -0800162The first time you do this you'll get an error from the server about a missing
163change-ID. Follow the directions in the error message to install the change-ID
164hook and run `git commit --amend` to apply the hook to the current commit.
165
Scott Graham0c5d9362018-06-26 21:12:17 -0700166When revising a change, use:
167
168 git commit --amend
Shezan Baige0c476f2021-06-08 05:08:15 -0400169 git push origin HEAD:refs/for/main
Scott Graham0c5d9362018-06-26 21:12:17 -0700170
171which will add the new changes to the existing code review, rather than creating
172a new one.
173
Dirk Prankecad6b532018-07-23 14:02:13 -0700174We ask that all contributors
175[sign Google's Contributor License Agreement](https://cla.developers.google.com/)
176(either individual or corporate as appropriate, select 'any other Google
177project').
178
179## Community
180
Brett Wilson4c0c60e2019-07-08 15:18:40 -0700181You may ask questions and follow along with GN's development on Chromium's
Dirk Prankecad6b532018-07-23 14:02:13 -0700182[gn-dev@](https://groups.google.com/a/chromium.org/forum/#!forum/gn-dev)
183Google Group.
Brett Wilson5f30bbf2021-01-25 16:07:26 -0800184
185## Versioning and distribution
186
Brett Wilsond7cf6232021-02-02 17:09:07 -0800187Most open-source projects are designed to use the developer's computer's current
188toolchain such as compiler, linker, and build tool. But the large
189centrally controlled projects that GN is designed for typically want a more
190hermetic environment. They will ensure that developers are using a specific
Ted Pudlik07e2e1b2021-09-10 13:18:14 -0700191compatible toolchain that is versioned with the code.
Brett Wilson5f30bbf2021-01-25 16:07:26 -0800192
193As a result, GN expects that the project choose the appropriate version of GN
194that will work with each version of the project. There is no "current stable
195version" of GN that is expected to work for all projects.
196
Ted Pudlik07e2e1b2021-09-10 13:18:14 -0700197As a result, the GN developers do not maintain any packages in any of the
Brett Wilson5f30bbf2021-01-25 16:07:26 -0800198various packaging systems (Debian, RedHat, HomeBrew, etc.). Some of these
199systems to have GN packages, but they are maintained by third parties and you
Ted Pudlik07e2e1b2021-09-10 13:18:14 -0700200should use them at your own risk. Instead, we recommend you refer your checkout
Brett Wilson5f30bbf2021-01-25 16:07:26 -0800201tooling to download binaries for a specific hash from [Google's build
202infrastructure](https://chrome-infra-packages.appspot.com/p/gn/gn) or compile
203your own.
204
205GN does not guarantee the backwards-compatibility of new versions and has no
Shezan Baige0c476f2021-06-08 05:08:15 -0400206branches or versioning scheme beyond the sequence of commits to the main git
Brett Wilson5f30bbf2021-01-25 16:07:26 -0800207branch (which is expected to be stable).
208
209In practice, however, GN is very backwards-compatible. The core functionality
210has been stable for many years and there is enough GN code at Google alone to
211make non-backwards-compatible changes very difficult, even if they were
212desirable.
213
214There have been discussions about adding a versioning scheme with some
215guarantees about backwards-compatibility, but nothing has yet been implemented.