blob: 68d29d568d6f405c06f7549ea38cc582f394da9e [file] [log] [blame]
#!/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 "$@"