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