| #!/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" | |
| readonly PYTHON_CMD="$PREBUILT_PYTHON3_DIR/bin/python3.8" | |
| if [[ -z "$GOMA_LOCAL_OUTPUT_CACHE_DIR" ]]; then | |
| GOMA_CACHE_DIR="${FUCHSIA_DIR}/.jiri_root/goma_cache" | |
| else | |
| # inherit the local cache dir from the environment if already set | |
| GOMA_CACHE_DIR="$GOMA_LOCAL_OUTPUT_CACHE_DIR" | |
| fi | |
| 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 | |
| "$PYTHON_CMD" "$GOMA_AUTH" info || "$PYTHON_CMD" "$GOMA_AUTH" login "$@" | |
| if "$PYTHON_CMD" "$GOMA_CTL" status; then | |
| "$PYTHON_CMD" "$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" "$PYTHON_CMD" "$GOMA_CTL" ensure_start | |
| } | |
| function kill-goma { | |
| "$PYTHON_CMD" "$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="$("$PYTHON_CMD" "$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 "$@" |