diff options
Diffstat (limited to 'scripts/setup-android-build.sh')
| -rwxr-xr-x | scripts/setup-android-build.sh | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/scripts/setup-android-build.sh b/scripts/setup-android-build.sh new file mode 100755 index 000000000..dbb66c3d9 --- /dev/null +++ b/scripts/setup-android-build.sh @@ -0,0 +1,93 @@ +#! /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 |