Nico Weber | bbceba6 | 2018-11-17 02:21:53 +0000 | [diff] [blame] | 1 | ===================== |
| 2 | Building LLVM with GN |
| 3 | ===================== |
| 4 | |
| 5 | .. contents:: |
| 6 | :local: |
| 7 | |
| 8 | .. _Introduction: |
| 9 | |
| 10 | Introduction |
| 11 | ============ |
| 12 | |
| 13 | *Warning* The GN build is experimental and best-effort. It might not work, |
| 14 | and if you use it you're expected to feel comfortable to unbreak it if |
| 15 | necessary. LLVM's official build system is CMake, if in doubt use that. |
| 16 | If you add files, you're expected to update the CMake build but you don't need |
| 17 | to update GN build files. Reviewers should not ask authors to update GN build |
| 18 | files. Keeping the GN build files up-to-date is on the people who use the GN |
| 19 | build. |
| 20 | |
Nico Weber | bb7c776 | 2019-01-08 15:19:00 +0000 | [diff] [blame] | 21 | `GN <https://gn.googlesource.com/gn/>`_ is a metabuild system. It always |
Nico Weber | bbceba6 | 2018-11-17 02:21:53 +0000 | [diff] [blame] | 22 | creates ninja files, but it can create some IDE projects (MSVC, Xcode, ...) |
| 23 | which then shell out to ninja for the actual build. |
| 24 | |
| 25 | Its main features are that GN is very fast (it currently produces ninja files |
| 26 | for LLVM's build in 35ms on the author's laptop, compared to 66s for CMake) -- |
| 27 | a 2000x difference), and since it's so fast it doesn't aggressively cache, |
| 28 | making it possible to switch e.g. between release and debug builds in one build |
| 29 | directory. |
| 30 | |
Nico Weber | bbceba6 | 2018-11-17 02:21:53 +0000 | [diff] [blame] | 31 | The main motivation behind the GN build is that some people find it more |
| 32 | convenient for day-to-day hacking on LLVM than CMake. Distribution, building |
| 33 | just parts of LLVM, and embedding the LLVM GN build from other builds are a |
| 34 | non-goal for the GN build. |
| 35 | |
| 36 | This is a `good overview of GN <https://docs.google.com/presentation/d/15Zwb53JcncHfEwHpnG_PoIbbzQ3GQi_cpujYwbpcbZo/edit#slide=id.g119d702868_0_12>`_. |
| 37 | |
| 38 | .. _Quick start: |
| 39 | |
| 40 | Quick start |
| 41 | =========== |
| 42 | |
Nico Weber | bbceba6 | 2018-11-17 02:21:53 +0000 | [diff] [blame] | 43 | GN only works in the monorepo layout. |
| 44 | |
| 45 | #. Obtain a `gn binary <https://gn.googlesource.com/gn/#getting-started>`_. |
| 46 | |
Nico Weber | cfdd779 | 2019-01-14 18:26:55 +0000 | [diff] [blame] | 47 | #. In the root of the monorepo, run `llvm/utils/gn/gn.py gen out/gn`. |
Nico Weber | 38ab6cd | 2019-01-14 12:50:40 +0000 | [diff] [blame] | 48 | `out/gn` is the build directory, it can have any name, and you can have as |
| 49 | many as you want, each with different build settings. (The `gn.py` script |
| 50 | adds `--dotfile=llvm/utils/gn/.gn --root=.` and just runs regular `gn`; |
| 51 | you can manually pass these parameters and not use the wrapper if you |
| 52 | prefer.) |
Nico Weber | bbceba6 | 2018-11-17 02:21:53 +0000 | [diff] [blame] | 53 | |
Nico Weber | bb7c776 | 2019-01-08 15:19:00 +0000 | [diff] [blame] | 54 | #. Run e.g. `ninja -C out/gn check-lld` to build all prerequisites for and |
| 55 | run the LLD tests. |
Nico Weber | bbceba6 | 2018-11-17 02:21:53 +0000 | [diff] [blame] | 56 | |
| 57 | By default, you get a release build with assertions enabled that targets |
| 58 | the host arch. You can set various build options by editing `out/gn/args.gn`, |
| 59 | for example putting `is_debug = true` in there gives you a debug build. Run |
Nico Weber | cfdd779 | 2019-01-14 18:26:55 +0000 | [diff] [blame] | 60 | `llvm/utils/gn/gn.py args --list out/gn` to see a list of all possible |
Nico Weber | 38ab6cd | 2019-01-14 12:50:40 +0000 | [diff] [blame] | 61 | options. After touching `out/gn/args.gn`, just run ninja, it will re-invoke gn |
| 62 | before starting the build. |
Nico Weber | bbceba6 | 2018-11-17 02:21:53 +0000 | [diff] [blame] | 63 | |
| 64 | GN has extensive built-in help; try e.g. `gn help gen` to see the help |
| 65 | for the `gen` command. The full GN reference is also `available online |
| 66 | <https://gn.googlesource.com/gn/+/master/docs/reference.md>`_. |
| 67 | |
| 68 | GN has an autoformatter: `git ls-files '*.gn' '*.gni' | xargs -n 1 gn format` |
| 69 | after making GN build changes is your friend. |
| 70 | |
Nico Weber | cefe270 | 2018-11-27 05:19:17 +0000 | [diff] [blame] | 71 | To not put `BUILD.gn` into the main tree, they are all below |
| 72 | `utils/gn/secondary`. For example, the build file for `llvm/lib/Support` is in |
| 73 | `utils/gn/secondary/llvm/lib/Support`. |
Nico Weber | bbceba6 | 2018-11-17 02:21:53 +0000 | [diff] [blame] | 74 | |
Nico Weber | 218bd44 | 2018-11-29 22:25:31 +0000 | [diff] [blame] | 75 | .. _Syncing GN files from CMake files: |
| 76 | |
| 77 | Syncing GN files from CMake files |
| 78 | ================================= |
| 79 | |
| 80 | Sometimes after pulling in the latest changes, the GN build doesn't work. |
| 81 | Most of the time this is due to someone adding a file to CMakeLists.txt file. |
| 82 | Run `llvm/utils/gn/build/sync_source_lists_from_cmake.py` to print a report |
| 83 | of which files need to be added to or removed from `BUILD.gn` files to |
| 84 | match the corresponding `CMakeLists.txt`. You have to manually read the output |
| 85 | of the script and implement its suggestions. |
| 86 | |
| 87 | If new `CMakeLists.txt` files have been added, you have to manually create |
| 88 | a new corresponding `BUILD.gn` file below `llvm/utils/gn/secondary/`. |
| 89 | |
| 90 | If the dependencies in a `CMakeLists.txt` file have been changed, you have to |
| 91 | manually analyze and fix. |
| 92 | |
Nico Weber | bbceba6 | 2018-11-17 02:21:53 +0000 | [diff] [blame] | 93 | .. _Philosophy: |
| 94 | |
| 95 | Philosophy |
| 96 | ========== |
| 97 | |
| 98 | GN believes in using GN arguments to configure the build explicitly, instead |
| 99 | of implicitly figuring out what to do based on what's available on the current |
| 100 | system. |
| 101 | |
| 102 | configure is used for three classes of feature checks: |
| 103 | |
| 104 | - compiler checks. In GN, these could use exec_script to identify the host |
| 105 | compiler at GN time. For now the build has explicit toggles for compiler |
| 106 | features. (Maybe there could be a script that writes args.gn based on the |
| 107 | host compiler). It's possible we'll use exec_script() for this going forward, |
| 108 | but we'd have one exec_script call to identify compiler id and version, |
| 109 | and then base GN arg default values of compiler id and version instead of |
| 110 | doing one exec_script per feature check. |
| 111 | (In theory, the config approach means a new os / compiler just needs to tweak |
| 112 | the checks and not the code, but in practice a) new os's / compilers are rare |
| 113 | b) they will require code changes anyhow, so the configure tradeoff seems |
| 114 | not worth it.) |
| 115 | |
| 116 | - library checks. For e.g. like zlib, GN thinks it's better to say "we require |
| 117 | zlib, else we error at build time" than silently omitting features. People |
| 118 | who really don't want to install zlib can explicitly set the GN arg to turn |
| 119 | off zlib. |
| 120 | |
| 121 | - header checks (does system header X exist). These are generally not needed |
| 122 | (just keying this off the host OS works fine), but if they should become |
| 123 | necessary in the future, they should be done at build time and the few |
| 124 | targets that need to know if header X exists then depend on that build-time |
| 125 | check while everything else can build parallel with it. |
| 126 | |
| 127 | - LLVM-specific build toggles (assertions on/off, debug on/off, targets to |
| 128 | build, ...). These map cleanly to GN args (which then get copied into |
| 129 | config.h in a build step). |
| 130 | |
| 131 | For the last two points, it would be nice if LLVM didn't have a single |
| 132 | `config.h` header, but one header per toggle. That way, when e.g. |
| 133 | `llvm_enable_terminfo` is toggled, only the 3 files caring about that setting |
| 134 | would need to be rebuilt, instead of everything including `config.h`. |
| 135 | |
| 136 | GN doesn't believe in users setting arbitrary cflags from an environment |
| 137 | variable, it wants the build to be controlled by .gn files. |