| #!/usr/bin/env bash |
| # Copyright 2016 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. |
| |
| readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" |
| readonly ROOT_DIR="$(dirname "${SCRIPT_DIR}")" |
| |
| set -eo pipefail; [[ "${TRACE}" ]] && set -x |
| |
| usage() { |
| echo "$0 <options> [<gn_build_arg>=<value> ...] [<ninja_arg> ...]" |
| echo "" |
| echo "Options:" |
| echo " -c: Clean before building" |
| echo " -g: Run GN but not Ninja" |
| echo " -G: Run Ninja but not GN (Ninja will re-run GN as needed)" |
| echo " -v: Level 1 verbosity" |
| echo " -V: Level 2 verbosity" |
| echo " -A: Build with ASan" |
| echo " -H: Build host tools with ASan" |
| echo " -n: Just print build commands to STDOUT." |
| echo " -T: Only build tools; do not build Zircon." |
| echo " -j N: Passed along to ninja (number of parallel jobs)" |
| echo " -l N: Passed along to ninja (maximum load average)" |
| echo " -t <target>: Architecture (GN style) to build, instead of all" |
| echo " -o <outdir>: Directory in which to put the build-zircon directory." |
| echo "" |
| echo 'Additional arguments containing `=` will be used as GN build arguments.' |
| echo "Other additional arguments will be passed as extra Ninja arguments." |
| echo "e.g., $0 use_goma=true core-tests-x64" |
| echo "" |
| echo 'Note that -A and -H translate into a `variants=...` build argument.' |
| echo "You can't use those switches and also use such a build argument." |
| echo "Note that if GN no build arguments (nor -c) are specified and the file" |
| echo "<outdir>/build-zircon/args.gn already exists, it will be reused." |
| echo "For nontrivial configuration changes, edit the args.gn file by hand" |
| echo "either from scratch or after a run of this script with switches;" |
| echo "then run this script with neither build arguments nor -A or -H." |
| } |
| |
| readonly GN="${ROOT_DIR}/zircon/prebuilt/downloads/gn" |
| readonly NINJA="${ROOT_DIR}/zircon/prebuilt/downloads/ninja" |
| |
| declare ASAN="false" |
| declare CLEAN="false" |
| declare DRY_RUN="false" |
| declare HOST_ASAN="false" |
| declare TOOLS_ONLY="false" |
| declare OUTDIR="${ROOT_DIR}/out" |
| declare VERBOSE="0" |
| declare -a ARCHLIST=(arm64 x64) |
| declare JOBS=0 |
| declare LOADAVG=0 |
| declare RUN_GN="true" |
| declare RUN_NINJA="true" |
| |
| while getopts "AcgGHhl:nj:t:Tp:o:vV" opt; do |
| case "${opt}" in |
| A) ASAN="true" ;; |
| c) CLEAN="true" ;; |
| g) RUN_NINJA="false" ;; |
| G) RUN_GN="false" ;; |
| H) HOST_ASAN="true" ;; |
| h) usage ; exit 0 ;; |
| n) DRY_RUN="true" ;; |
| j) JOBS="${OPTARG}" ;; |
| l) LOADAVG="${OPTARG}" ;; |
| o) OUTDIR="${OPTARG}" ;; |
| t) ARCHLIST=("${OPTARG}") ;; |
| T) TOOLS_ONLY="true" ;; |
| v) VERBOSE="1" ;; |
| V) VERBOSE="2" ;; |
| *) usage 1>&2 ; exit 1 ;; |
| esac |
| done |
| shift $(($OPTIND - 1)) |
| |
| readonly ASAN CLEAN DRY_RUN HOST_ASAN PROJECTS OUTDIR VERBOSE |
| readonly ZIRCON_BUILDROOT="${OUTDIR}/build-zircon" |
| readonly -a ARCHLIST |
| |
| if [[ "${CLEAN}" = "true" ]]; then |
| rm -rf -- "${ZIRCON_BUILDROOT}" |
| fi |
| |
| GN_CMD=("$GN" gen "$ZIRCON_BUILDROOT" --root="${ROOT_DIR}/zircon") |
| NINJA_CMD=("$NINJA" -C "$ZIRCON_BUILDROOT") |
| VARIANTS=() |
| GN_ARGS=() |
| |
| if $ASAN; then |
| VARIANTS+=(asan) |
| fi |
| if $HOST_ASAN; then |
| VARIANTS+=(host_asan) |
| fi |
| if [ ${#VARIANTS[@]} -gt 0 ]; then |
| VARIANTS_ARG='variants = [' |
| for variant in "${VARIANTS[@]}"; do |
| VARIANTS_ARG+="\"${variant}\", " |
| done |
| VARIANTS_ARG+=']' |
| GN_ARGS+=("$VARIANTS_ARG") |
| fi |
| |
| if [[ $VERBOSE -lt 1 ]]; then |
| GN_CMD+=(-q) |
| # Ninja doesn't have a --quiet switch. |
| fi |
| if [[ $VERBOSE -ge 2 ]]; then |
| NINJA_CMD+=(-v) |
| fi |
| |
| if $DRY_RUN; then |
| NINJA_CMD+=(-n) |
| fi |
| |
| if [[ "$JOBS" != 0 ]]; then |
| NINJA_CMD+=(-j "$JOBS") |
| fi |
| |
| if $TOOLS_ONLY; then |
| NINJA_CMD+=(tools) |
| else |
| NINJA_CMD+=(legacy-host_tests) |
| for arch in "${ARCHLIST[@]}"; do |
| NINJA_CMD+=("manifest-$arch") |
| done |
| fi |
| |
| for arg in "$@"; do |
| # TODO(BLD-325): Special case for argument used by bot recipes. |
| # Remove this after infra transitions. |
| if [[ "$arg" == GOMACC=* ]]; then |
| goma_dir="$(dirname "${arg#GOMACC=}")" |
| GN_ARGS+=(use_goma=true "goma_dir=\"$goma_dir\"") |
| elif [[ "$arg" == *=* ]]; then |
| GN_ARGS+=("$arg") |
| elif $RUN_NINJA; then |
| NINJA_CMD+=("$arg") |
| else |
| echo >&2 "Extra Ninja arguments given when -g says not to run Ninja" |
| exit 2 |
| fi |
| done |
| |
| if [[ ${#GN_ARGS[@]} -gt 0 ]]; then |
| if ! $RUN_GN; then |
| echo >&2 "GN build arguments specified when -G says not to run GN" |
| echo >&2 "Consider editting $ZIRCON_BUILDROOT/args.gn by hand instead." |
| exit 2 |
| fi |
| GN_CMD+=("--args=${GN_ARGS[*]}") |
| elif $RUN_GN && [[ $VERBOSE -gt 0 && -r "$ZIRCON_BUILDROOT/args.gn" ]]; then |
| echo >&2 "Reusing existing $ZIRCON_BUILDROOT/args.gn file." |
| fi |
| |
| run_cmd() { |
| if [[ $VERBOSE -gt 0 ]]; then |
| (set -x; "$@") |
| else |
| "$@" |
| fi |
| } |
| |
| if ! $RUN_GN && ! $RUN_NINJA; then |
| echo >&2 "Doing nothing since -g and -G say not to." |
| exit 0 |
| fi |
| |
| ! $RUN_GN || run_cmd "${GN_CMD[@]}" |
| ! $RUN_NINJA || run_cmd "${NINJA_CMD[@]}" |