#! /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