| #!/bin/bash |
| # Copyright 2020 The Fuchsia Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| #### CATEGORY=Build |
| ### manage Goma distributed compilation client |
| |
| ## Usage: fx goma [--browser] [--update] [--disable-http2] [--disable-local-cache] |
| ## [--local-cache-dir ABS_PATH] |
| ## |
| ## This makes sure that both initial setup tasks are complete and that |
| ## periodic maintenance actions are done. It's probably only really |
| ## necessary to run it once, but it should be harmless (and reasonably |
| ## fast) to run it again any time, such as after a `jiri update`. It's |
| ## just not a good idea to run it while you have a build running in the |
| ## background, since it may result in restarting the local Goma client |
| ## service and causing all new compilation commands to fail for a moment. |
| ## |
| ## See also `fx goma_auth` and `fx goma_ctl`. This mostly just runs those. |
| ## |
| ## The `fx goma_auth` command is usually only needed once at setup time to |
| ## run `fx goma_auth login`, which is done by `fx goma` if needed. Use `fx |
| ## goma_auth help` for details on `fx goma_auth` subcommands. If something |
| ## seems to be wrong, you can run the command `fx goma_auth logout` and |
| ## then repeat `fx goma`. |
| ## |
| ## The `fx goma_ctl` command controls the Goma client service on your local |
| ## machine. Use `fx goma_ctl help` for details. The common subcommand used |
| ## every day is `fx goma_ctl ensure_start` to make sure your local client |
| ## service is running. (`fx goma` does this for you but only after a few other |
| ## checks that might be somewhat slower than `fx goma_ctl ensure_start` alone.) |
| ## |
| ## The `--browser` switch is passed along to `fx goma_auth login` so that |
| ## it attempts to launch a browser window to perform authentication. This |
| ## may or may not work, depending on your desktop and command-line setup. |
| ## Without that switch, it will print out a URL you need to visit in your |
| ## browser to (authenticate and) copy a token to paste into a prompt. |
| ## |
| ## The `--disable-http2` switch disables the experimental HTTP2 proxy. |
| ## By default, the HTTP2 proxy is enabled to improve Goma network |
| ## performance. |
| ## |
| ## The `--disable-local-cache` switch disables the experimental local |
| ## output cache. By default, this is enabled to reduce Goma network |
| ## traffic. |
| ## |
| ## The `--local-cache-dir ABS_PATH` switch sets the cache directory for Goma. |
| ## By default it uses the `//.jiri_root/goma_cache` directory. If you have |
| ## multiple Fuchsia checkouts, it is recommended to set its value to |
| ## `${HOME}/.goma_cache` to allow cache sharing. The value needs to be an |
| ## absolute path. |
| ## |
| ## The `--kill` switch shuts down all goma related processes. |
| ## |
| ## **NOTE:** _The following features are temporary for the transition._ |
| ## |
| ## `fx goma` checks for an old Goma installation and recommends commands to |
| ## update to the current recommended style managed by `fx goma`. |
| ## |
| ## It also checks the current Fuchsia build directory's Goma configuration. |
| ## This is the only aspect of `fx goma` that refers to a build directory |
| ## (as controlled by the `--dir` switch to `fx` or the most recent `fx set` |
| ## or `fx use` command). It will report whether the build is set to use |
| ## the recommended Goma setup managed by `fx goma`. If given the |
| ## `--update` switch, it will modify the existing `args.gn` and then re-run |
| ## `fx gen` to enable Goma with the standard setup. This results in the |
| ## same configuration that a fresh `fx set` will with the `--goma` switch |
| ## (or without the switch, once `fx goma` has been done once). |
| ## |
| |
| source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/../lib/vars.sh || exit $? |
| |
| set -e |
| |
| readonly GOMA_AUTH="$PREBUILT_GOMA_DIR/goma_auth.py" |
| readonly GOMA_CTL="$PREBUILT_GOMA_DIR/goma_ctl.py" |
| readonly GOMACC="$PREBUILT_GOMA_DIR/gomacc" |
| GOMA_CACHE_DIR="${FUCHSIA_DIR}/.jiri_root/goma_cache" |
| |
| if [[ ! -x "$GOMA_AUTH" || ! -x "$GOMA_CTL" ]]; then |
| echo "*** $PREBUILT_GOMA_DIR is not current." |
| echo "*** Be sure to run \`jiri fetch-packages\` or \`jiri update\`." |
| exit 1 |
| fi |
| |
| function main { |
| local login_args=() update=false use_http2=true use_local_cache=true |
| |
| while [ $# -gt 0 ]; do |
| case "$1" in |
| --browser) |
| login_args+=("$1") |
| shift |
| ;; |
| --update) |
| update=true |
| shift |
| ;; |
| --disable-http2) |
| use_http2=false |
| shift |
| ;; |
| --disable-local-cache) |
| use_local_cache=false |
| shift |
| ;; |
| --local-cache-dir) |
| if [[ $# -lt 2 ]]; then |
| fx-command-help |
| return 1 |
| fi |
| shift |
| GOMA_CACHE_DIR="$1" |
| shift |
| ;; |
| --kill) |
| kill-goma |
| return 0 |
| ;; |
| *) |
| fx-command-help |
| return 1 |
| ;; |
| esac |
| done |
| |
| # TODO(mcgrathr): Remove these after some period when old installs are gone. |
| check |
| check-build $update |
| |
| "$GOMA_AUTH" info || "$GOMA_AUTH" login "$@" |
| if "$GOMA_CTL" status; then |
| "$GOMA_CTL" update_hook |
| return 0 |
| fi |
| goma_tmp_dir="" |
| if $use_local_cache; then |
| goma_tmp_dir="$GOMA_CACHE_DIR" |
| echo "*** Using Goma local output cache at \`$goma_tmp_dir\`" |
| echo "*** If you experience cache errors, please run: " |
| echo "*** \`fx goma --kill && fx goma --disable-local-cache\`" |
| echo "*** to restart goma without local caching." |
| echo "" |
| echo "*** If you want to change the local output cache directory, please run" |
| echo "*** \`fx goma --kill && fx goma --local-cache-dir ABS_PATH\`" |
| echo "*** to restart goma with your desired cache location." |
| echo "" |
| fi |
| if $use_http2; then |
| echo "*** Using Goma experimental HTTP2 proxy." |
| echo "*** If you experiencing instability, please run: " |
| echo "*** \`fx goma --kill && fx goma --disable-http2\`" |
| echo "*** to restart goma without HTTP2 proxy." |
| echo "" |
| fi |
| |
| GOMACTL_USE_PROXY="$use_http2" GOMA_LOCAL_OUTPUT_CACHE_DIR="$goma_tmp_dir" "$GOMA_CTL" ensure_start |
| } |
| |
| function kill-goma { |
| "$GOMA_CTL" ensure_stop |
| } |
| |
| # TODO(mcgrathr): Remove this after some period when old installs are gone. |
| function check { |
| if [[ -n "$GOMA_DIR" ]]; then |
| echo "*** Detected GOMA_DIR environment variable." |
| echo "*** Remove GOMA_DIR from the environment and run \`fx goma\` again." |
| echo "*** \`unset GOMA_DIR\` will remove it from the running shell." |
| echo "*** But check your dot files to make sure it's not set at login." |
| fi |
| |
| local goma_dir="$("$GOMA_CTL" goma_dir 2> /dev/null)" |
| if [[ -d "$goma_dir" && \ |
| "$(cd "$goma_dir" && /bin/pwd)" = "$(cd "$PREBUILT_GOMA_DIR" && /bin/pwd)" ]]; then |
| return 0 |
| fi |
| # Running goma has different directory than current one, test the versions. |
| local running_goma_version="$("$goma_dir"/compiler_proxy --version)" |
| local prebuilt_goma_version="$("$PREBUILT_GOMA_DIR"/compiler_proxy --version)" |
| if [[ "$running_goma_version" = "$prebuilt_goma_version" ]]; then |
| # Running daemon has same version string as one from prebuilt. |
| return 0 |
| fi |
| |
| echo "*** Detected a different version of Goma daemon running at $goma_dir" |
| echo "*** Recommend \`fx goma_ctl ensure_stop\` and \`fx goma\` to restart Goma daemon with current version." |
| echo "*** Goma-client should not be used when there is a version mismatch." |
| return 1 |
| } |
| |
| # TODO(mcgrathr): Remove this after some period when old installs are gone. |
| function check-build { |
| local update=$1 |
| |
| unset USE_GOMA GOMA_DIR # Just in case it's in the environment. |
| fx-config-read || return |
| |
| if [[ -z "$USE_GOMA" ]]; then |
| echo "*** Run \`fx gen\` and then try \`fx goma\` again." |
| echo "*** Or else just do a fresh \`fx set\` to get the right defaults!" |
| return 1 |
| fi |
| |
| local status=0 |
| local gen=false |
| |
| if [[ "$USE_GOMA" = true ]]; then |
| echo "$FUCHSIA_BUILD_DIR has Goma enabled." |
| elif $update; then |
| echo "*** Enabling Goma in $FUCHSIA_BUILD_DIR..." |
| sed -e /use_goma/d "$FUCHSIA_BUILD_DIR/args.gn" > "$FUCHSIA_BUILD_DIR/args.gn.new" |
| mv -f "$FUCHSIA_BUILD_DIR/args.gn.new" "$FUCHSIA_BUILD_DIR/args.gn" |
| echo "use_goma = true" >> "$FUCHSIA_BUILD_DIR/args.gn" |
| gen=true |
| else |
| echo "$FUCHSIA_BUILD_DIR has Goma disabled." |
| status=1 |
| fi |
| |
| if [[ -z "$GOMA_DIR" ]]; then |
| echo "$FUCHSIA_BUILD_DIR uses prebuilt Goma client." |
| elif $update; then |
| echo "*** $FUCHSIA_BUILD_DIR was using non-default goma_dir=\"$GOMA_DIR\"." |
| sed -i /goma_dir/d "$FUCHSIA_BUILD_DIR/args.gn" |
| echo "*** Reset to default prebuilt Goma client." |
| gen=true |
| else |
| echo "$FUCHSIA_BUILD_DIR uses non-default goma_dir=\"$GOMA_DIR\"." |
| status=1 |
| fi |
| |
| if $gen; then |
| echo "*** Running \`fx gen\` after $FUCHSIA_BUILD_DIR/args.gn updates..." |
| fx-command-run gen |
| fi |
| |
| if [[ $status -ne 0 ]]; then |
| echo "*** Run \`fx goma --update\` to reset this build to defaults." |
| echo "*** Or else just do a fresh \`fx set\` to get the right defaults!" |
| fi |
| return $status |
| } |
| |
| main "$@" |