blob: ef7121cbf90511976492f53978d0f02e73b80e5d [file] [log] [blame]
#!/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]}")" && pwd)"
readonly ROOT_DIR="$(dirname "${SCRIPT_DIR}")"
readonly HOST_ARCH=$(uname -m)
readonly HOST_OS=$(uname | tr '[:upper:]' '[:lower:]')
readonly HOST_TRIPLE="${HOST_ARCH}-${HOST_OS}"
JOBS=`getconf _NPROCESSORS_ONLN` || {
Cannot get number of processors
exit 1
}
set -eo pipefail; [[ "${TRACE}" ]] && set -x
usage() {
printf '%s: [-c] [-v] [-V] [-A] [-H] [-p projects] [-t target] [-o outdir]\n' "$0"
printf 'Note: Passing extra arguments to make is not supported.\n'
}
make_zircon_common() {
make --no-print-directory -C "${ROOT_DIR}/zircon" \
-j ${JOBS} DEBUG_BUILDROOT=../../zircon "$@"
}
make_zircon_target() {
make_zircon_common \
BUILDROOT=${ZIRCON_BUILDROOT} TOOLS=${OUTDIR}/build-zircon/tools "$@"
}
declare ASAN="${ASAN:-false}"
declare CLEAN="${CLEAN:-false}"
declare HOST_ASAN="${HOST_ASAN:-false}"
declare OUTDIR="${OUTDIR:-${ROOT_DIR}/out}"
declare VERBOSE="${VERBOSE:-0}"
while getopts "AcHht:p:o:vV" opt; do
case "${opt}" in
A) ASAN="true" ;;
c) CLEAN="true" ;;
H) HOST_ASAN="true" ;;
h) usage ; exit 0 ;;
o) OUTDIR="${OPTARG}" ;;
t) TARGET="${OPTARG}" ;;
p) PROJECTS="${OPTARG}" ;;
v) VERBOSE="1" ;;
V) VERBOSE="2" ;;
*) usage 1>&2 ; exit 1 ;;
esac
done
if [[ "${PROJECTS}" = "" ]]; then
if [[ "${TARGET}" != "" ]]; then
PROJECTS="${TARGET}"
else
PROJECTS="x86" # Default
fi
fi
have_arm64=false
have_x86=false
for project in $PROJECTS; do
case "$project" in
*x86*) have_x86=true ;;
*) have_arm64=true ;;
esac
done
declare -a ARCHLIST
if $have_arm64; then
ARCHLIST+=(arm64)
fi
if $have_x86; then
ARCHLIST+=(x86-64)
fi
readonly -a ARCHLIST
if [[ "${#ARCHLIST[@]}" == 0 ]]; then
echo >&2 "Cannot figure out architectures from $PROJECTS"
exit 2
fi
readonly ASAN CLEAN HOST_ASAN PROJECTS OUTDIR VERBOSE
readonly ZIRCON_BUILDROOT="${OUTDIR}/build-zircon"
if [[ "${CLEAN}" = "true" ]]; then
rm -rf -- "${ZIRCON_BUILDROOT}"
fi
# These variables are picked up by make from the environment.
case "${VERBOSE}" in
1) QUIET=0 ; V=0 ;;
2) QUIET=0 ; V=1 ;;
*) QUIET=1 ; V=0 ;;
esac
export QUIET V
if [[ "${ASAN}" = "true" ]]; then
readonly ASAN_ZIRCON=true
readonly ASAN_ULIB=false
else
readonly ASAN_ZIRCON=false
readonly ASAN_ULIB=true
fi
# Build host tools.
make_zircon_common \
BUILDDIR=${OUTDIR}/build-zircon HOST_USE_ASAN="${HOST_ASAN}" tools
for ARCH in "${ARCHLIST[@]}"; do
# Build primary userland and sysroot.
make_zircon_target PROJECT="user-${ARCH}" \
BUILDDIR_SUFFIX= USE_ASAN="${ASAN_ZIRCON}" user-only
# Build alternate shared libraries (ASan).
make_zircon_target PROJECT="user-${ARCH}" \
BUILDDIR_SUFFIX=-ulib USE_ASAN="${ASAN_ULIB}" \
ENABLE_ULIB_ONLY=true ENABLE_BUILD_SYSROOT=false
done
# Build kernels.
IFS=','
for project in $PROJECTS; do
make_zircon_target PROJECT="$project" kernel-only
done
# Build bootloaders. Some Zircon projects produce no outputs for bootloader.
for project in $PROJECTS; do
make_zircon_target PROJECT="$project" bootloader
done