blob: c37f702b1c1712e7f2a6273e3c34277d3291da5f [file] [log] [blame] [view]
# Goma client
*Goma* is a distributed compiler service for open-source project such as
Chromium and Android. It's some kind of replacement of distcc+ccache.
NOTE: currently the Goma backend is not available for non googlers.
We're working so that chromium developers can use it. Stay tuned.
[TOC]
## How Goma works
Goma hooks a compile request, and sends it to a backend compile server.
If you have plenty of backend servers, a lot of compile can be processed in
parallel, for example, -j100, -j500 or -j1000.
Also, the Goma backend caches the compile result. If the same compile request
comes, the cached result is returned from the Goma cache server.
## How to build
Goma client can be built on Linux, Mac, and Win.
### Prerequisite
1. Use 64bit platform (Linux, Mac or Win).
1. Install [depot\_tools](http://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools_tutorial.html#_setting_up).
1. Install dependencies.
* On Mac, install Xcode.
* On Windows, install Visual Studio 2017. Community edition is OK.
### Checkout source
```shell
$ gclient config https://chromium.googlesource.com/infra/goma/client
$ gclient sync
$ cd client
```
We assume the Goma client code is checked out to `${GOMA_SRC}`. You can set this
in your environment, but do not `export` it as it will make `gomacc` complain.
If you want to develop goma client, make goma client source unmanaged by
gclient. Open `.gclient` file, and check `"managed"` value.
If it's `True`, changed it to `False`. Otherwise, gclient will manage
your repository, so your checkout can be unintentionally changed with
`gclient sync`.
Move to `client` directory (which is under git repo),
and configure git repository with your username and emails.
```shell
$ cd client
$ git config user.email 'foo@example.com'
$ git config user.name 'Your Name'
```
### Build
```shell
$ cd "${GOMA_SRC}/client"
$ gclient sync
$ gn gen --args='is_debug=false' out/Release
$ ninja -C out/Release
```
#### Several important gn args
The build option can be modified with gn args.
```
is_debug=true/false
Do debug build if true.
dcheck_always_on=true/false
Enable DCHECK always (even in release build).
is_asan=true/false
Use ASan build (with clang).
use_link_time_optimization=true/false
Currently working only on Win. If true, /LTCG is enable.
use_lld=true/false
Use lld for link (it will be fast)
```
### Run unittest
```shell
$ cd "${GOMA_SRC}/client"
$ ./build/run_unittest.py --target=Release --build-dir=out
```
### Coding style
Follow Google code style.
- [C++](https://google.github.io/styleguide/cppguide.html)
- [Python](https://github.com/google/styleguide/blob/gh-pages/pyguide.md)
For C++11 features, we prefer to follow chromium guideline:
http://chromium-cpp.appspot.com/
## How to use
### For Chromium/Android development
Goma can be integrated with Chromium/Android development easily.
1. Build goma client
2. Start compiler\_proxy
```
$ "${GOMA_SRC}/client/out/Release/goma_ctl.py" start
```
#### For Chromium
In Chromium src, specify the following args in `gn args`
```
use_goma = true
goma_dir = "${GOMA_SRC}/client/out/Release" (Replace ${GOMA_SRC} to your checkout)
```
Then build like the following:
```
$ cd /path/to/chromium/src/out/Release
$ ninja -j100 chrome
```
More details are avairable in chromium's build instructions.
* [docs/linux\_build\_instructions.md](https://chromium.googlesource.com/chromium/src/+/master/docs/linux_build_instructions.md)
* [docs/windows\_build\_instructions.md](https://chromium.googlesource.com/chromium/src/+/master/docs/windows_build_instructions.md)
* [docs/mac\_build\_instructions.md](https://chromium.googlesource.com/chromium/src/+/master/docs/mac_build_instructions.md)
#### For Android
```shell
$ source build/envsetup.sh
$ lunch aosp_arm-eng
$ GOMA_DIR="${GOMA_SRC}/client/out/Release" USE_GOMA=true make -j4
```
Here, `-j4` is not related to Goma parallelism. Android internally sets
`-j500` (or `-j` with `NINJA_REMOTE_NUM_JOBS` environment variable) for Goma.
### For general development
1. Build Goma client
2. Start `compiler_proxy`
```shell
$ ./goma_ctl.py ensure_start
```
3. Change your build script so that `gomacc` is prepended to compiler command.
For example:
```shell
$ gomacc clang++ -c foo.cc
```
4. Build your product with `make -j100`, `ninja -j100` or larger -j.
Check http://localhost:8088 to see compiler\_proxy is actually working.
* You can use [autoninja](https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/master/autoninja) in depot_tools instead of specifying gomacc manually.