#!/bin/bash
# Copyright 2019 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
### set up a build directory

## usage: fx set PRODUCT.BOARD [--with GNLABEL1,GNLABEL2,...]
##               [--release] [--args ARG] [--variant VARIANT]
##               [--with-test GNLABEL1,GNLABEL2,...]
##
## where PRODUCT is an entry from `//products` or `//vendor/*/products` and
## BOARD is an entry from `//boards` or `//vendor/*/boards`. Use the
## `fx list-products` and `fx list-boards` commands to see a list of
## possible products and boards (respectively). See the README.md in those
## directories for a description of the various options.
##
## Use `fx --dir BUILD_DIR set` to specify the build directory. If it begins with
## `//` or `out/` then it's taken as relative to FUCHSIA_DIR. Otherwise it should
## be an absolute path or a path relative to the current working directory that
## winds up in `FUCHSIA_DIR/out`. It defaults to `out/default`.
##
## This command stores the location of the build directory in the //.fx-build-dir
## file, which causes subsequent `fx` commands to use that build directory. Use
## `fx use` to switch build directories.
##
## This is a wrapper around running `gn gen --check=system BUILD_DIR --args ...`.
## If GN fails with an error, `fx set` does not change anything.
##
## optional arguments:
##   --args                Additional argument to pass to gn.  If the --args
##                         argument is given multiple times, all the specified
##                         arguments are passed to gn.
##                         N.B. Arguments must be expressed using GN's syntax.
##                         In particular this means that for strings they must
##                         be quoted with double-quotes, and the quoting must
##                         survive, for example, the shell. Thus when passing
##                         an argument that takes a string, pass it with
##                         something like --args=foo='"bar"'. E.g.,
##                         bash$ fx set core.x64 --args=foo='"bar"'
##                         More complicated arguments, e.g., lists, require
##                         their own special syntax. See GN documentation
##                         for the syntax of each kind of argument.
##   --ccache|--no-ccache  Whether to use ccache during the build. Ccache attempts
##                         to make builds faster by caching build artifacts.
##                         Defaults to detecting whether the CCACHE_DIR environment
##                         variable is set to a directory.
##   --fuzz-with           Pass a sanitizer name, e.g. "--fuzz-with asan" to
##                         enable ALL supporting fuzzers.  Use --variant for
##                         individual fuzzers, e.g. "--variant asan-fuzzer/foo".
##   --rbe-mode            Use a preset RBE configuration.
##                         Valid options: auto, off, workstation, cloudtop,
##                         legacy_default, remote_cache_only, low_bandwidth.
##                         'auto' chooses one of the other options for you.
##                         See also build/toolchain/rbe_modes.gni for details.
##                         Default: auto
##   --cxx-rbe             If set, use reclient (RBE) to remotely compile and
##                         cache C++ targets.
##                         This overrides the C++ setting in --rbe-mode.
##                         Default: enabled on linux-x64, disabled elsewhere.
##   --link-rbe            If set, use reclient (RBE) to remotely link and
##                         cache C++ targets.
##                         This overrides the linking setting in --rbe-mode.
##                         Default: disabled
##   --rust-rbe            If set, use the remote backend (RBE) service for
##                         building and caching Rust targets.
##                         This overrides the Rust setting in --rbe-mode.
##                         Default: disabled
##   --bazel-rbe           If set, allow bazel to build remotely on RBE.
##                         This overrides the Bazel setting in --rbe-mode.
##                         Default: disabled
##   --ide                 Pass --ide=VALUE to gn when generating to create project
##                         files usable with that IDE. Useful values include "vs"
##                         for Visual Studio or "xcode" for Xcode.
##   --json-ide-script     Pass --json-ide-script=python_script to gn which runs
##                         the given python script after the JSON project file is
##                         generated when using --ide json. The path to the project
##                         file is given as the first argument to the script.
##                         The script may be a path or a gn label.
##   --netboot             Ensure that a network ramboot image is always built.
##   --compilation-mode    Sets the `compilation_mode` to the specified value.
##                         Valid values are "release", "balanced", and "debug".
##                         Defaults to "balanced".
##   --release             Shortcut for `--compilation-mode release`.
##   --balanced            Shortcut for `--compilation-mode balanced`, which is
##                         less optimized than `"release"`, but still has some
##                         optimizations enabled.
##   --debug               Shortcut for `--compilation-mode debug`.
##   --variant             Selects which runtime variant to use (e.g., asan) by
##                         passing a `select_variant=[VARIANT*,...]` argument
##                         to gn that collects all the --variant arguments in
##                         order. Variants are normal builds in most respects,
##                         but allow users to test different runtime settings
##                         for either the whole build or for a specific target.
##                         This can be specified by passing the variant name
##                         to this argument (e.g. `--variant asan`) for the
##                         former, or the variant name and the target name
##                         separated by a slash (e.g. `--variant asan/my_test`)
##                         for the latter.
##   --with GNLABEL        Labels of additional packages to include in the
##                         'universe' set of available packages. These packages
##                         can be run ephemerally. Multiple labels can be
##                         provided delimited by commas or the --with argument
##                         can be provided multiple times.
##   --with-test  GNLABEL  Labels of additional tests to include in the build.
##                         When run by 'fx test', these tests are ephemeral. To
##                         add host tests, either use '--with-host' qualify the
##                         the label with the host toolchain, or add a group
##                         which depends on the host tests in the host
##                         toolchain.  Multiple labels can be provided delimited
##                         by commas or the '--with-test' argument can be
##                         provided multiple times.
##   --with-host GNLABEL   Labels of additional host-only targets to be
##                         produced by the build. Multiple labels can be
##                         provided delimited by commas or the --with-host
##                         argument can be provided multiple times.
##   --cargo-toml-gen      Enable generation of Cargo.toml files.
##   --include-clippy[=true|false]  Run clippy as part of `fx build` (defaults to `true`)
##   --fint-params-path    Used to specify a path to a fint parameters file, as
##                         selected by `fx repro`. If set, no other flags that
##                         influence the build configuration should be set.
##   --dev                 Always recompile fx-set from source.
##   --assembly-override   Pairs of ASSEMBLY_TARGET=OVERRIDE_TARGET labels to use
##                         to define the developer assembly overrides targets to
##                         use with the given assembly target.  Can be provided
##                         multiple times with different ASSEMBLY_TARGET labels.
##                         if the 'ASSEMBLY_TARGET=' portion is omitted, the
##                         "main" assembly for the product will be assumed.
##   --main-pb             Build label for the main product bundle to work with.
##                         Useful for multi-product builds.
##   --no-change-env       Configure the build graph without modifying global .fx-build-dir
##                         or out/default symlinks. Keep environment pristine.
##
## Example:
##
##   $ fx set core.x64 --with-test //bundles/tests
##   -> build directory: out/core.x64
##      board: //boards/x64.gni
##      product: //products/core.gni
##      developer_test_labels: //bundles/tests (all test packages)

# shellcheck source=/dev/null
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh || exit $?

set -e

function main {
  fx-standard-switches "$@"

  # Check if the --dev flag is set. If it is, then we'll always build fx-set
  # from source.
  local dev=false
  for arg; do
    shift
    if [ "$arg" = --dev ]; then
      dev=true
      continue
    fi
    # Include every arg besides --dev in the args we pass to fx-set.
    set -- "$@" "$arg"
  done

  if [[ "$(uname)" == [Dd]arwin ]]; then
    fx-error "Building Fuchsia on macOS is not supported."
    fx-error "Please see http://go/local-platform-support-prd for details."
    exit 1
  fi

  # Cache the compiled executable for later invocations.
  readonly exe_path="${FX_CACHE_DIR}/fx-set"
  readonly revision_file="${FX_CACHE_DIR}/fx-set-revision"
  local current_revision
  current_revision="$(git --no-optional-locks -C "$FUCHSIA_DIR" rev-parse HEAD)"

  # Determine whether we need to rebuild the fx-set executable. We'll only
  # rebuild if the --dev flag is set, or if the cached version of fx-set was
  # built at a revision other than the current revision. We determine that by
  # storing the current HEAD of fuchsia.git in a cached version file whenever
  # we build fx-set, and then we rebuild if the current HEAD differs from the
  # revision referenced in the cached file.
  local should_rebuild=true
  if ! $dev && [ -f "$exe_path" ] && [ -f "$revision_file" ]; then
    local fx_set_revision
    fx_set_revision="$(head -n 1 "$revision_file")"
    if [ "$fx_set_revision" = "$current_revision" ]; then
      should_rebuild=false
    fi
  fi

  if $should_rebuild; then
    # Build in a temporary directory where we can arrange the module.
    #
    # Avoid "TMPDIR" since Go looks at that environment variable.
    BUILD_DIR=$(mktemp -d)
    trap 'rm -rf $BUILD_DIR' EXIT
    pushd "$BUILD_DIR" >/dev/null
    for target in go.{mod,sum} vendor; do
      ln -s "$FUCHSIA_DIR"/third_party/golibs/"${target}" .
    done
    # fx-set's only local imports (direct and transitive) are from //tools. We
    # can symlink more top-level directories as necessary if fx-set ever needs
    # to import their code.
    ln -s "$FUCHSIA_DIR"/tools .
    # - GOPROXY=off enforces that we only use vendored dependencies and don't
    #   download anything.
    # - GO111MODULE=on ensures that we use modules for the build even if the
    #   user has GO111MODULE=off in their local environment.
    # - -buildvcs=false disables inclusion of version control information in the
    #   resulting binary. It's not needed, and including it requires `go build`
    #   to query for git status, which takes time and can trigger git garbage
    #   collection that messes with ninja build convergence.
    # - GOCACHE="${FX_CACHE_DIR}/gocache" makes sure this script won't write
    #   outside of Fuchsia dir when bootstrapping.
    if ! CGO_ENABLED=0 GOPROXY=off GO111MODULE=on GOCACHE="${FX_CACHE_DIR}/gocache" fx-command-run go build -buildvcs=false -o "$exe_path" ./tools/build/fx-set/cmd; then
      if ! $dev; then # If running in dev mode, compilation failures are expected.
        fx-error "Failed to build fx set."
      fi
      return 1
    fi
    popd >/dev/null

    # Record the current HEAD *after* building fx-set so that we always try
    # to rebuild on subsequent attempts if compilation fails the first time.
    echo "$current_revision" >"$revision_file"
  fi

  # If --dir is used, FUCHSIA_BUILD_DIR will not be empty, and _FX_BUILD_DIR
  # must be set to its value before calling $exe_path, see https://fxbug.dev/413713238
  if [[ -n "$FUCHSIA_BUILD_DIR" ]]; then
    export _FX_BUILD_DIR="${FUCHSIA_BUILD_DIR}"
  fi
  "$exe_path" "$@"
  status="$?"

  # Check for RBE requirements if enabled.
  # Could be interactive if credentials need to be refreshed.
  fx-command-run rbe preflight

  return "$status"
}

main "$@"
