Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit db84575f authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Script to set up android build directory"

parents b708108b 9dd454b3
Loading
Loading
Loading
Loading
+93 −0
Original line number Diff line number Diff line
#! /bin/bash
#
# Sets the current directory as Android build output directory for a
# given target by writing the "prefix script" to it. Commands prefixed
# by this script are executed in the Android build environment. E.g.,
# running
#   ./run <command>
# runs <command> as if we issued
#   cd <source>
#   mount --bind <build dir> out
#   . build/envsetup.sh
#   lunch <config>
#   <command>
#   exit
#
# This arrangement eliminates the need to issue envsetup/lunch commands
# manually, and allows to run multiple builds from the same shell.
# Thus, if your source tree is in ~/aosp and you are building for
# 'blueline' and 'cuttlefish', issuing
#   cd /sdx/blueline && \
#      ~/aosp/build/soong/scripts/setup-android-build.sh aosp_blueline-userdebug
#   cd /sdx/cuttlefish && \
#      ~/aosp/build/soong/scripts/setup-android-build.sh aosp_cf_arm64_phone-userdebug
# sets up build directories in /sdx/blueline and /sdx/cuttlefish respectively.
# After that, issue
#   /sdx/blueline/run m
# to build blueline image, and issue
#   /sdx/cuttlefish atest CtsSecurityBulletinHostTestCases
# to run CTS tests. Notice there is no need to change to a specific directory for that.
#
# Argument:
# * configuration (one of those shown by `lunch` command).
#
set -e
function die() { printf "$@"; exit 1; }

# Find out where the source tree using the fact that we are in its
# build/ subdirectory.
[[ "$(uname)" == Linux ]] || die "This setup runs only on Linux\n"
declare -r mydir="${0%/*}"
declare -r source="${mydir%/build/soong/scripts}"
[[ "/${mydir}/" =~ '/build/soong/scripts/' ]] || \
  die "$0 should be in build/soong/scripts/ subdirectory of the source tree\n"
[[ ! -e .repo && ! -e .git ]] || \
  die "Current directory looks like source. You should be in the _target_ directory.\n"
# Do not override old run script.
if [[ -x ./run ]]; then
  # Set variables from config=xxx and source=xxx comments in the existing script.
  . <(sed -nr 's/^# *source=(.*)/oldsource=\1/p;s/^# *config=(.*)/oldconfig=\1/p' run)
  die "This directory has been already set up to build Android for %s from %s.\n\
Remove 'run' file if you want to set it up afresh\n" "$oldconfig" "$oldsource"
fi

(($#<2)) || die "usage: %s [<config>]\n" $0

if (($#==1)); then
  # Configuration is provided, emit run script.
  declare -r config="$1"
  declare -r target="$PWD"
  cat >./run <<EOF
#! /bin/bash
# source=$source
# config=$config
declare -r cmd=\$(printf ' %q' "\$@")
"$source/prebuilts/build-tools/linux-x86/bin/nsjail"\
 -Mo -q -e -t 0\
 -EANDROID_QUIET_BUILD=true \
 -B / -B "$target:$source/out"\
 --cwd "$source"\
 --skip_setsid \
 --keep_caps\
 --disable_clone_newcgroup\
 --disable_clone_newnet\
 --rlimit_as soft\
 --rlimit_core soft\
 --rlimit_cpu soft\
 --rlimit_fsize soft\
 --rlimit_nofile soft\
 --proc_rw\
 --hostname $(hostname) \
 --\
 /bin/bash -i -c ". build/envsetup.sh && lunch "$config" &&\$cmd"
EOF
  chmod +x ./run
else
  # No configuration, show available ones.
  printf "Please specify build target. Common values:\n"
  (cd "$source"
   . build/envsetup.sh
   get_build_var COMMON_LUNCH_CHOICES | tr ' ' '\n' | pr -c4 -tT -W"$(tput cols)"
  )
  exit 1
fi