Sasha Smundak | 9dd454b | 2020-01-30 18:17:52 -0800 | [diff] [blame] | 1 | #! /bin/bash |
| 2 | # |
| 3 | # Sets the current directory as Android build output directory for a |
| 4 | # given target by writing the "prefix script" to it. Commands prefixed |
| 5 | # by this script are executed in the Android build environment. E.g., |
| 6 | # running |
| 7 | # ./run <command> |
| 8 | # runs <command> as if we issued |
| 9 | # cd <source> |
| 10 | # mount --bind <build dir> out |
| 11 | # . build/envsetup.sh |
| 12 | # lunch <config> |
| 13 | # <command> |
| 14 | # exit |
| 15 | # |
| 16 | # This arrangement eliminates the need to issue envsetup/lunch commands |
| 17 | # manually, and allows to run multiple builds from the same shell. |
| 18 | # Thus, if your source tree is in ~/aosp and you are building for |
| 19 | # 'blueline' and 'cuttlefish', issuing |
| 20 | # cd /sdx/blueline && \ |
| 21 | # ~/aosp/build/soong/scripts/setup-android-build.sh aosp_blueline-userdebug |
| 22 | # cd /sdx/cuttlefish && \ |
| 23 | # ~/aosp/build/soong/scripts/setup-android-build.sh aosp_cf_arm64_phone-userdebug |
| 24 | # sets up build directories in /sdx/blueline and /sdx/cuttlefish respectively. |
| 25 | # After that, issue |
| 26 | # /sdx/blueline/run m |
| 27 | # to build blueline image, and issue |
| 28 | # /sdx/cuttlefish atest CtsSecurityBulletinHostTestCases |
| 29 | # to run CTS tests. Notice there is no need to change to a specific directory for that. |
| 30 | # |
| 31 | # Argument: |
| 32 | # * configuration (one of those shown by `lunch` command). |
| 33 | # |
| 34 | set -e |
| 35 | function die() { printf "$@"; exit 1; } |
| 36 | |
| 37 | # Find out where the source tree using the fact that we are in its |
| 38 | # build/ subdirectory. |
| 39 | [[ "$(uname)" == Linux ]] || die "This setup runs only on Linux\n" |
| 40 | declare -r mydir="${0%/*}" |
| 41 | declare -r source="${mydir%/build/soong/scripts}" |
| 42 | [[ "/${mydir}/" =~ '/build/soong/scripts/' ]] || \ |
| 43 | die "$0 should be in build/soong/scripts/ subdirectory of the source tree\n" |
| 44 | [[ ! -e .repo && ! -e .git ]] || \ |
| 45 | die "Current directory looks like source. You should be in the _target_ directory.\n" |
| 46 | # Do not override old run script. |
| 47 | if [[ -x ./run ]]; then |
| 48 | # Set variables from config=xxx and source=xxx comments in the existing script. |
| 49 | . <(sed -nr 's/^# *source=(.*)/oldsource=\1/p;s/^# *config=(.*)/oldconfig=\1/p' run) |
| 50 | die "This directory has been already set up to build Android for %s from %s.\n\ |
| 51 | Remove 'run' file if you want to set it up afresh\n" "$oldconfig" "$oldsource" |
| 52 | fi |
| 53 | |
| 54 | (($#<2)) || die "usage: %s [<config>]\n" $0 |
| 55 | |
| 56 | if (($#==1)); then |
| 57 | # Configuration is provided, emit run script. |
| 58 | declare -r config="$1" |
| 59 | declare -r target="$PWD" |
| 60 | cat >./run <<EOF |
| 61 | #! /bin/bash |
| 62 | # source=$source |
| 63 | # config=$config |
| 64 | declare -r cmd=\$(printf ' %q' "\$@") |
| 65 | "$source/prebuilts/build-tools/linux-x86/bin/nsjail"\ |
| 66 | -Mo -q -e -t 0\ |
| 67 | -EANDROID_QUIET_BUILD=true \ |
| 68 | -B / -B "$target:$source/out"\ |
| 69 | --cwd "$source"\ |
| 70 | --skip_setsid \ |
| 71 | --keep_caps\ |
| 72 | --disable_clone_newcgroup\ |
| 73 | --disable_clone_newnet\ |
| 74 | --rlimit_as soft\ |
| 75 | --rlimit_core soft\ |
| 76 | --rlimit_cpu soft\ |
| 77 | --rlimit_fsize soft\ |
| 78 | --rlimit_nofile soft\ |
| 79 | --proc_rw\ |
| 80 | --hostname $(hostname) \ |
| 81 | --\ |
| 82 | /bin/bash -i -c ". build/envsetup.sh && lunch "$config" &&\$cmd" |
| 83 | EOF |
| 84 | chmod +x ./run |
| 85 | else |
| 86 | # No configuration, show available ones. |
| 87 | printf "Please specify build target. Common values:\n" |
| 88 | (cd "$source" |
| 89 | . build/envsetup.sh |
| 90 | get_build_var COMMON_LUNCH_CHOICES | tr ' ' '\n' | pr -c4 -tT -W"$(tput cols)" |
| 91 | ) |
| 92 | exit 1 |
| 93 | fi |