xref: /aosp_15_r20/kernel/tests/tools/launch_cvd.sh (revision 2f2c4c7ab4226c71756b9c31670392fdd6887c4f)
1*2f2c4c7aSAndroid Build Coastguard Worker#!/usr/bin/env bash
2*2f2c4c7aSAndroid Build Coastguard Worker# SPDX-License-Identifier: GPL-2.0
3*2f2c4c7aSAndroid Build Coastguard Worker
4*2f2c4c7aSAndroid Build Coastguard Worker# A handy tool to launch CVD with local build or remote build.
5*2f2c4c7aSAndroid Build Coastguard Worker
6*2f2c4c7aSAndroid Build Coastguard Worker# Constants
7*2f2c4c7aSAndroid Build Coastguard WorkerACLOUD_PREBUILT="prebuilts/asuite/acloud/linux-x86/acloud"
8*2f2c4c7aSAndroid Build Coastguard WorkerOPT_SKIP_PRERUNCHECK='--skip-pre-run-check'
9*2f2c4c7aSAndroid Build Coastguard WorkerPRODUCT='aosp_cf_x86_64_phone'
10*2f2c4c7aSAndroid Build Coastguard Worker# Color constants
11*2f2c4c7aSAndroid Build Coastguard Worker#BOLD="$(tput bold)" # Unused
12*2f2c4c7aSAndroid Build Coastguard WorkerEND="$(tput sgr0)"
13*2f2c4c7aSAndroid Build Coastguard WorkerGREEN="$(tput setaf 2)"
14*2f2c4c7aSAndroid Build Coastguard WorkerRED="$(tput setaf 198)"
15*2f2c4c7aSAndroid Build Coastguard WorkerYELLOW="$(tput setaf 3)"
16*2f2c4c7aSAndroid Build Coastguard Worker# BLUE="$(tput setaf 34)" # Unused
17*2f2c4c7aSAndroid Build Coastguard Worker
18*2f2c4c7aSAndroid Build Coastguard WorkerSKIP_BUILD=false
19*2f2c4c7aSAndroid Build Coastguard WorkerGCOV=false
20*2f2c4c7aSAndroid Build Coastguard WorkerDEBUG=false
21*2f2c4c7aSAndroid Build Coastguard WorkerKASAN=false
22*2f2c4c7aSAndroid Build Coastguard WorkerEXTRA_OPTIONS=()
23*2f2c4c7aSAndroid Build Coastguard Worker
24*2f2c4c7aSAndroid Build Coastguard Workerfunction print_help() {
25*2f2c4c7aSAndroid Build Coastguard Worker    echo "Usage: $0 [OPTIONS]"
26*2f2c4c7aSAndroid Build Coastguard Worker    echo ""
27*2f2c4c7aSAndroid Build Coastguard Worker    echo "This script will build images and launch a Cuttlefish device."
28*2f2c4c7aSAndroid Build Coastguard Worker    echo ""
29*2f2c4c7aSAndroid Build Coastguard Worker    echo "Available options:"
30*2f2c4c7aSAndroid Build Coastguard Worker    echo "  --skip-build          Skip the image build step. Will build by default if in repo."
31*2f2c4c7aSAndroid Build Coastguard Worker    echo "  --gcov                Launch CVD with gcov enabled kernel"
32*2f2c4c7aSAndroid Build Coastguard Worker    echo "  --debug               Launch CVD with debug enabled kernel"
33*2f2c4c7aSAndroid Build Coastguard Worker    echo "  --kasan               Launch CVD with kasan enabled kernel"
34*2f2c4c7aSAndroid Build Coastguard Worker    echo "  -pb <platform_build>, --platform-build=<platform_build>"
35*2f2c4c7aSAndroid Build Coastguard Worker    echo "                        The platform build path. Can be a local path or a remote build"
36*2f2c4c7aSAndroid Build Coastguard Worker    echo "                        as ab://<branch>/<build_target>/<build_id>."
37*2f2c4c7aSAndroid Build Coastguard Worker    echo "                        If not specified, it will use the platform build in the local"
38*2f2c4c7aSAndroid Build Coastguard Worker    echo "                        repo, or the default compatible platform build for the kernel."
39*2f2c4c7aSAndroid Build Coastguard Worker    echo "  -sb <system_build>, --system-build=<system_build>"
40*2f2c4c7aSAndroid Build Coastguard Worker    echo "                        The system build path for GSI testing. Can be a local path or"
41*2f2c4c7aSAndroid Build Coastguard Worker    echo "                        remote build as ab://<branch>/<build_target>/<build_id>."
42*2f2c4c7aSAndroid Build Coastguard Worker    echo "                        If not specified, no system build will be used."
43*2f2c4c7aSAndroid Build Coastguard Worker    echo "  -kb <kernel_build>, --kernel-build=<kernel_build>"
44*2f2c4c7aSAndroid Build Coastguard Worker    echo "                        The kernel build path. Can be a local path or a remote build"
45*2f2c4c7aSAndroid Build Coastguard Worker    echo "                        as ab://<branch>/<build_target>/<build_id>."
46*2f2c4c7aSAndroid Build Coastguard Worker    echo "                        If not specified, it will use the kernel in the local repo."
47*2f2c4c7aSAndroid Build Coastguard Worker    echo "  --acloud-bin=<acloud_bin>"
48*2f2c4c7aSAndroid Build Coastguard Worker    echo "                        The alternative alcoud binary path."
49*2f2c4c7aSAndroid Build Coastguard Worker    echo "  --cf-product=<product_type>"
50*2f2c4c7aSAndroid Build Coastguard Worker    echo "                        The alternative cuttlefish product type for local build."
51*2f2c4c7aSAndroid Build Coastguard Worker    echo "                        Will use default aosp_cf_x86_64_phone if not specified."
52*2f2c4c7aSAndroid Build Coastguard Worker    echo "  --acloud-arg=<acloud_arg>"
53*2f2c4c7aSAndroid Build Coastguard Worker    echo "                        Additional acloud command arg. Can be repeated."
54*2f2c4c7aSAndroid Build Coastguard Worker    echo "                        For example --acloud-arg=--local-instance to launch a local cvd."
55*2f2c4c7aSAndroid Build Coastguard Worker    echo "  -h, --help            Display this help message and exit"
56*2f2c4c7aSAndroid Build Coastguard Worker    echo ""
57*2f2c4c7aSAndroid Build Coastguard Worker    echo "Examples:"
58*2f2c4c7aSAndroid Build Coastguard Worker    echo "$0"
59*2f2c4c7aSAndroid Build Coastguard Worker    echo "$0 --acloud-arg=--local-instance"
60*2f2c4c7aSAndroid Build Coastguard Worker    echo "$0 -pb ab://git_main/aosp_cf_x86_64_phone-userdebug/latest"
61*2f2c4c7aSAndroid Build Coastguard Worker    echo "$0 -pb ~/aosp-main/out/target/product/vsoc_x86_64/"
62*2f2c4c7aSAndroid Build Coastguard Worker    echo "$0 -kb ~/android-mainline/out/virtual_device_x86_64/"
63*2f2c4c7aSAndroid Build Coastguard Worker    echo ""
64*2f2c4c7aSAndroid Build Coastguard Worker    exit 0
65*2f2c4c7aSAndroid Build Coastguard Worker}
66*2f2c4c7aSAndroid Build Coastguard Worker
67*2f2c4c7aSAndroid Build Coastguard Workerfunction parse_arg() {
68*2f2c4c7aSAndroid Build Coastguard Worker    while test $# -gt 0; do
69*2f2c4c7aSAndroid Build Coastguard Worker        case "$1" in
70*2f2c4c7aSAndroid Build Coastguard Worker            -h|--help)
71*2f2c4c7aSAndroid Build Coastguard Worker                print_help
72*2f2c4c7aSAndroid Build Coastguard Worker                ;;
73*2f2c4c7aSAndroid Build Coastguard Worker            --skip-build)
74*2f2c4c7aSAndroid Build Coastguard Worker                SKIP_BUILD=true
75*2f2c4c7aSAndroid Build Coastguard Worker                shift
76*2f2c4c7aSAndroid Build Coastguard Worker                ;;
77*2f2c4c7aSAndroid Build Coastguard Worker            -pb)
78*2f2c4c7aSAndroid Build Coastguard Worker                shift
79*2f2c4c7aSAndroid Build Coastguard Worker                if test $# -gt 0; then
80*2f2c4c7aSAndroid Build Coastguard Worker                    PLATFORM_BUILD=$1
81*2f2c4c7aSAndroid Build Coastguard Worker                else
82*2f2c4c7aSAndroid Build Coastguard Worker                    print_error "platform build is not specified"
83*2f2c4c7aSAndroid Build Coastguard Worker                fi
84*2f2c4c7aSAndroid Build Coastguard Worker                shift
85*2f2c4c7aSAndroid Build Coastguard Worker                ;;
86*2f2c4c7aSAndroid Build Coastguard Worker            --platform-build=*)
87*2f2c4c7aSAndroid Build Coastguard Worker                PLATFORM_BUILD=$(echo "$1" | sed -e "s/^[^=]*=//g")
88*2f2c4c7aSAndroid Build Coastguard Worker                shift
89*2f2c4c7aSAndroid Build Coastguard Worker                ;;
90*2f2c4c7aSAndroid Build Coastguard Worker            -sb)
91*2f2c4c7aSAndroid Build Coastguard Worker                shift
92*2f2c4c7aSAndroid Build Coastguard Worker                if test $# -gt 0; then
93*2f2c4c7aSAndroid Build Coastguard Worker                    SYSTEM_BUILD=$1
94*2f2c4c7aSAndroid Build Coastguard Worker                else
95*2f2c4c7aSAndroid Build Coastguard Worker                    print_error "system build is not specified"
96*2f2c4c7aSAndroid Build Coastguard Worker                fi
97*2f2c4c7aSAndroid Build Coastguard Worker                shift
98*2f2c4c7aSAndroid Build Coastguard Worker                ;;
99*2f2c4c7aSAndroid Build Coastguard Worker            --system-build=*)
100*2f2c4c7aSAndroid Build Coastguard Worker                SYSTEM_BUILD=$(echo "$1" | sed -e "s/^[^=]*=//g")
101*2f2c4c7aSAndroid Build Coastguard Worker                shift
102*2f2c4c7aSAndroid Build Coastguard Worker                ;;
103*2f2c4c7aSAndroid Build Coastguard Worker            -kb)
104*2f2c4c7aSAndroid Build Coastguard Worker                shift
105*2f2c4c7aSAndroid Build Coastguard Worker                if test $# -gt 0; then
106*2f2c4c7aSAndroid Build Coastguard Worker                    KERNEL_BUILD=$1
107*2f2c4c7aSAndroid Build Coastguard Worker                else
108*2f2c4c7aSAndroid Build Coastguard Worker                    print_error "kernel build path is not specified"
109*2f2c4c7aSAndroid Build Coastguard Worker                fi
110*2f2c4c7aSAndroid Build Coastguard Worker                shift
111*2f2c4c7aSAndroid Build Coastguard Worker                ;;
112*2f2c4c7aSAndroid Build Coastguard Worker            --kernel-build=*)
113*2f2c4c7aSAndroid Build Coastguard Worker                KERNEL_BUILD=$(echo "$1" | sed -e "s/^[^=]*=//g")
114*2f2c4c7aSAndroid Build Coastguard Worker                shift
115*2f2c4c7aSAndroid Build Coastguard Worker                ;;
116*2f2c4c7aSAndroid Build Coastguard Worker            --acloud-arg=*)
117*2f2c4c7aSAndroid Build Coastguard Worker                EXTRA_OPTIONS+=("$(echo "$1" | sed -e "s/^[^=]*=//g")") # Use array append syntax
118*2f2c4c7aSAndroid Build Coastguard Worker                shift
119*2f2c4c7aSAndroid Build Coastguard Worker                ;;
120*2f2c4c7aSAndroid Build Coastguard Worker            --acloud-bin=*)
121*2f2c4c7aSAndroid Build Coastguard Worker                ACLOUD_BIN=$(echo "$1" | sed -e "s/^[^=]*=//g")
122*2f2c4c7aSAndroid Build Coastguard Worker                shift
123*2f2c4c7aSAndroid Build Coastguard Worker                ;;
124*2f2c4c7aSAndroid Build Coastguard Worker            --cf-product=*)
125*2f2c4c7aSAndroid Build Coastguard Worker                PRODUCT=$(echo "$1" | sed -e "s/^[^=]*=//g")
126*2f2c4c7aSAndroid Build Coastguard Worker                shift
127*2f2c4c7aSAndroid Build Coastguard Worker                ;;
128*2f2c4c7aSAndroid Build Coastguard Worker            --gcov)
129*2f2c4c7aSAndroid Build Coastguard Worker                GCOV=true
130*2f2c4c7aSAndroid Build Coastguard Worker                shift
131*2f2c4c7aSAndroid Build Coastguard Worker                ;;
132*2f2c4c7aSAndroid Build Coastguard Worker            --debug)
133*2f2c4c7aSAndroid Build Coastguard Worker                DEBUG=true
134*2f2c4c7aSAndroid Build Coastguard Worker                shift
135*2f2c4c7aSAndroid Build Coastguard Worker                ;;
136*2f2c4c7aSAndroid Build Coastguard Worker            --kasan)
137*2f2c4c7aSAndroid Build Coastguard Worker                KASAN=true
138*2f2c4c7aSAndroid Build Coastguard Worker                shift
139*2f2c4c7aSAndroid Build Coastguard Worker                ;;
140*2f2c4c7aSAndroid Build Coastguard Worker            *)
141*2f2c4c7aSAndroid Build Coastguard Worker                print_error "Unsupported flag: $1" >&2
142*2f2c4c7aSAndroid Build Coastguard Worker                ;;
143*2f2c4c7aSAndroid Build Coastguard Worker        esac
144*2f2c4c7aSAndroid Build Coastguard Worker    done
145*2f2c4c7aSAndroid Build Coastguard Worker}
146*2f2c4c7aSAndroid Build Coastguard Worker
147*2f2c4c7aSAndroid Build Coastguard Workerfunction adb_checker() {
148*2f2c4c7aSAndroid Build Coastguard Worker    if ! which adb &> /dev/null; then
149*2f2c4c7aSAndroid Build Coastguard Worker        print_error "adb not found!"
150*2f2c4c7aSAndroid Build Coastguard Worker    fi
151*2f2c4c7aSAndroid Build Coastguard Worker}
152*2f2c4c7aSAndroid Build Coastguard Worker
153*2f2c4c7aSAndroid Build Coastguard Workerfunction go_to_repo_root() {
154*2f2c4c7aSAndroid Build Coastguard Worker    current_dir="$1"
155*2f2c4c7aSAndroid Build Coastguard Worker    while [ ! -d ".repo" ] && [ "$current_dir" != "/" ]; do
156*2f2c4c7aSAndroid Build Coastguard Worker        current_dir=$(dirname "$current_dir")  # Go up one directory
157*2f2c4c7aSAndroid Build Coastguard Worker        cd "$current_dir" || print_error "Failed to cd to $current_dir"
158*2f2c4c7aSAndroid Build Coastguard Worker    done
159*2f2c4c7aSAndroid Build Coastguard Worker}
160*2f2c4c7aSAndroid Build Coastguard Worker
161*2f2c4c7aSAndroid Build Coastguard Workerfunction print_info() {
162*2f2c4c7aSAndroid Build Coastguard Worker    echo "[$MY_NAME]: ${GREEN}$1${END}"
163*2f2c4c7aSAndroid Build Coastguard Worker}
164*2f2c4c7aSAndroid Build Coastguard Worker
165*2f2c4c7aSAndroid Build Coastguard Workerfunction print_warn() {
166*2f2c4c7aSAndroid Build Coastguard Worker    echo "[$MY_NAME]: ${YELLOW}$1${END}"
167*2f2c4c7aSAndroid Build Coastguard Worker}
168*2f2c4c7aSAndroid Build Coastguard Worker
169*2f2c4c7aSAndroid Build Coastguard Workerfunction print_error() {
170*2f2c4c7aSAndroid Build Coastguard Worker    echo -e "[$MY_NAME]: ${RED}$1${END}"
171*2f2c4c7aSAndroid Build Coastguard Worker    cd "$OLD_PWD" || echo "Failed to cd to $OLD_PWD"
172*2f2c4c7aSAndroid Build Coastguard Worker    exit 1
173*2f2c4c7aSAndroid Build Coastguard Worker}
174*2f2c4c7aSAndroid Build Coastguard Worker
175*2f2c4c7aSAndroid Build Coastguard Workerfunction set_platform_repo () {
176*2f2c4c7aSAndroid Build Coastguard Worker    print_warn "Build target product '${TARGET_PRODUCT}' does not match expected '$1'"
177*2f2c4c7aSAndroid Build Coastguard Worker    local lunch_cli="source build/envsetup.sh && lunch $1"
178*2f2c4c7aSAndroid Build Coastguard Worker    if [ -f "build/release/release_configs/trunk_staging.textproto" ]; then
179*2f2c4c7aSAndroid Build Coastguard Worker        lunch_cli+="-trunk_staging-userdebug"
180*2f2c4c7aSAndroid Build Coastguard Worker    else
181*2f2c4c7aSAndroid Build Coastguard Worker        lunch_cli+="-userdebug"
182*2f2c4c7aSAndroid Build Coastguard Worker    fi
183*2f2c4c7aSAndroid Build Coastguard Worker    print_info "Setup build environment with: $lunch_cli"
184*2f2c4c7aSAndroid Build Coastguard Worker    eval "$lunch_cli"
185*2f2c4c7aSAndroid Build Coastguard Worker}
186*2f2c4c7aSAndroid Build Coastguard Worker
187*2f2c4c7aSAndroid Build Coastguard Workerfunction find_repo () {
188*2f2c4c7aSAndroid Build Coastguard Worker    manifest_output=$(grep -e "superproject" -e "gs-pixel" -e "private/google-modules/soc/gs" \
189*2f2c4c7aSAndroid Build Coastguard Worker    -e "kernel/common" -e "common-modules/virtual-device" .repo/manifests/default.xml)
190*2f2c4c7aSAndroid Build Coastguard Worker    case "$manifest_output" in
191*2f2c4c7aSAndroid Build Coastguard Worker        *platform/superproject*)
192*2f2c4c7aSAndroid Build Coastguard Worker            PLATFORM_REPO_ROOT="$PWD"
193*2f2c4c7aSAndroid Build Coastguard Worker            PLATFORM_VERSION=$(grep -e "platform/superproject" .repo/manifests/default.xml | \
194*2f2c4c7aSAndroid Build Coastguard Worker            grep -oP 'revision="\K[^"]*')
195*2f2c4c7aSAndroid Build Coastguard Worker            print_info "PLATFORM_REPO_ROOT=$PLATFORM_REPO_ROOT, PLATFORM_VERSION=$PLATFORM_VERSION"
196*2f2c4c7aSAndroid Build Coastguard Worker            if [ -z "$PLATFORM_BUILD" ]; then
197*2f2c4c7aSAndroid Build Coastguard Worker                PLATFORM_BUILD="$PLATFORM_REPO_ROOT"
198*2f2c4c7aSAndroid Build Coastguard Worker            fi
199*2f2c4c7aSAndroid Build Coastguard Worker            ;;
200*2f2c4c7aSAndroid Build Coastguard Worker        *kernel/superproject*)
201*2f2c4c7aSAndroid Build Coastguard Worker            if [[ "$manifest_output" == *common-modules/virtual-device* ]]; then
202*2f2c4c7aSAndroid Build Coastguard Worker                CF_KERNEL_REPO_ROOT="$PWD"
203*2f2c4c7aSAndroid Build Coastguard Worker                CF_KERNEL_VERSION=$(grep -e "common-modules/virtual-device" \
204*2f2c4c7aSAndroid Build Coastguard Worker                .repo/manifests/default.xml | grep -oP 'revision="\K[^"]*')
205*2f2c4c7aSAndroid Build Coastguard Worker                print_info "CF_KERNEL_REPO_ROOT=$CF_KERNEL_REPO_ROOT, \
206*2f2c4c7aSAndroid Build Coastguard Worker                CF_KERNEL_VERSION=$CF_KERNEL_VERSION"
207*2f2c4c7aSAndroid Build Coastguard Worker                if [ -z "$KERNEL_BUILD" ]; then
208*2f2c4c7aSAndroid Build Coastguard Worker                    KERNEL_BUILD="$CF_KERNEL_REPO_ROOT/out/virtual_device_x86_64/dist"
209*2f2c4c7aSAndroid Build Coastguard Worker                fi
210*2f2c4c7aSAndroid Build Coastguard Worker            fi
211*2f2c4c7aSAndroid Build Coastguard Worker            ;;
212*2f2c4c7aSAndroid Build Coastguard Worker        *)
213*2f2c4c7aSAndroid Build Coastguard Worker            print_warn "Unexpected manifest output. Could not determine repository type."
214*2f2c4c7aSAndroid Build Coastguard Worker            ;;
215*2f2c4c7aSAndroid Build Coastguard Worker    esac
216*2f2c4c7aSAndroid Build Coastguard Worker}
217*2f2c4c7aSAndroid Build Coastguard Worker
218*2f2c4c7aSAndroid Build Coastguard Workerfunction rebuild_platform () {
219*2f2c4c7aSAndroid Build Coastguard Worker    build_cmd="m -j12"
220*2f2c4c7aSAndroid Build Coastguard Worker    print_warn "Flag --skip-build is not set. Rebuilt images at $PWD with: $build_cmd"
221*2f2c4c7aSAndroid Build Coastguard Worker    eval "$build_cmd"
222*2f2c4c7aSAndroid Build Coastguard Worker    exit_code=$?
223*2f2c4c7aSAndroid Build Coastguard Worker    if [ $exit_code -eq 0 ]; then
224*2f2c4c7aSAndroid Build Coastguard Worker        if [ -f "${ANDROID_PRODUCT_OUT}/system.img" ]; then
225*2f2c4c7aSAndroid Build Coastguard Worker            print_info "$build_cmd succeeded"
226*2f2c4c7aSAndroid Build Coastguard Worker        else
227*2f2c4c7aSAndroid Build Coastguard Worker            print_error "${ANDROID_PRODUCT_OUT}/system.img doesn't exist"
228*2f2c4c7aSAndroid Build Coastguard Worker        fi
229*2f2c4c7aSAndroid Build Coastguard Worker    else
230*2f2c4c7aSAndroid Build Coastguard Worker        print_warn "$build_cmd returned exit_code $exit_code or ${ANDROID_PRODUCT_OUT}/system.img is not found"
231*2f2c4c7aSAndroid Build Coastguard Worker        print_error "$build_cmd failed"
232*2f2c4c7aSAndroid Build Coastguard Worker    fi
233*2f2c4c7aSAndroid Build Coastguard Worker}
234*2f2c4c7aSAndroid Build Coastguard Worker
235*2f2c4c7aSAndroid Build Coastguard Workeradb_checker
236*2f2c4c7aSAndroid Build Coastguard Worker
237*2f2c4c7aSAndroid Build Coastguard Worker# LOCAL_REPO= $ Unused
238*2f2c4c7aSAndroid Build Coastguard Worker
239*2f2c4c7aSAndroid Build Coastguard WorkerOLD_PWD=$PWD
240*2f2c4c7aSAndroid Build Coastguard WorkerMY_NAME=$0
241*2f2c4c7aSAndroid Build Coastguard Worker
242*2f2c4c7aSAndroid Build Coastguard Workerparse_arg "$@"
243*2f2c4c7aSAndroid Build Coastguard Worker
244*2f2c4c7aSAndroid Build Coastguard WorkerFULL_COMMAND_PATH=$(dirname "$PWD/$0")
245*2f2c4c7aSAndroid Build Coastguard WorkerREPO_LIST_OUT=$(repo list 2>&1)
246*2f2c4c7aSAndroid Build Coastguard Workerif [[ "$REPO_LIST_OUT" == "error"* ]]; then
247*2f2c4c7aSAndroid Build Coastguard Worker    echo -e "[$MY_NAME]: ${RED}Current path $PWD is not in an Android repo. Change path to repo root.${END}"
248*2f2c4c7aSAndroid Build Coastguard Worker    go_to_repo_root "$FULL_COMMAND_PATH"
249*2f2c4c7aSAndroid Build Coastguard Worker    print_info "Changed path to $PWD"
250*2f2c4c7aSAndroid Build Coastguard Workerelse
251*2f2c4c7aSAndroid Build Coastguard Worker    go_to_repo_root "$PWD"
252*2f2c4c7aSAndroid Build Coastguard Workerfi
253*2f2c4c7aSAndroid Build Coastguard Worker
254*2f2c4c7aSAndroid Build Coastguard Worker# REPO_ROOT_PATH="$PWD" # unused
255*2f2c4c7aSAndroid Build Coastguard Worker
256*2f2c4c7aSAndroid Build Coastguard Workerfind_repo
257*2f2c4c7aSAndroid Build Coastguard Worker
258*2f2c4c7aSAndroid Build Coastguard Workerif [ "$SKIP_BUILD" = false ] && [ -n "$PLATFORM_BUILD" ] && [[ "$PLATFORM_BUILD" != ab://* ]] \
259*2f2c4c7aSAndroid Build Coastguard Worker&& [ -d "$PLATFORM_BUILD" ]; then
260*2f2c4c7aSAndroid Build Coastguard Worker    # Check if PLATFORM_BUILD is an Android platform repo, if yes rebuild
261*2f2c4c7aSAndroid Build Coastguard Worker    cd "$PLATFORM_BUILD" || print_error "Failed to cd to $PLATFORM_BUILD"
262*2f2c4c7aSAndroid Build Coastguard Worker    PLATFORM_REPO_LIST_OUT=$(repo list 2>&1)
263*2f2c4c7aSAndroid Build Coastguard Worker    if [[ "$PLATFORM_REPO_LIST_OUT" != "error"* ]]; then
264*2f2c4c7aSAndroid Build Coastguard Worker        go_to_repo_root "$PWD"
265*2f2c4c7aSAndroid Build Coastguard Worker        if [ -z "${TARGET_PRODUCT}" ] || [[ "${TARGET_PRODUCT}" != "$PRODUCT" ]]; then
266*2f2c4c7aSAndroid Build Coastguard Worker            set_platform_repo "$PRODUCT"
267*2f2c4c7aSAndroid Build Coastguard Worker            rebuild_platform
268*2f2c4c7aSAndroid Build Coastguard Worker            PLATFORM_BUILD=${ANDROID_PRODUCT_OUT}
269*2f2c4c7aSAndroid Build Coastguard Worker        fi
270*2f2c4c7aSAndroid Build Coastguard Worker    fi
271*2f2c4c7aSAndroid Build Coastguard Workerfi
272*2f2c4c7aSAndroid Build Coastguard Worker
273*2f2c4c7aSAndroid Build Coastguard Workerif [ "$SKIP_BUILD" = false ] && [ -n "$SYSTEM_BUILD" ] && [[ "$SYSTEM_BUILD" != ab://* ]] \
274*2f2c4c7aSAndroid Build Coastguard Worker&& [ -d "$SYSTEM_BUILD" ]; then
275*2f2c4c7aSAndroid Build Coastguard Worker    # Get GSI build
276*2f2c4c7aSAndroid Build Coastguard Worker    cd "$SYSTEM_BUILD" || print_error "Failed to cd to $SYSTEM_BUILD"
277*2f2c4c7aSAndroid Build Coastguard Worker    SYSTEM_REPO_LIST_OUT=$(repo list 2>&1)
278*2f2c4c7aSAndroid Build Coastguard Worker    if [[ "$SYSTEM_REPO_LIST_OUT" != "error"* ]]; then
279*2f2c4c7aSAndroid Build Coastguard Worker        go_to_repo_root "$PWD"
280*2f2c4c7aSAndroid Build Coastguard Worker        if [ -z "${TARGET_PRODUCT}" ] || [[ "${TARGET_PRODUCT}" != "aosp_x86_64" ]]; then
281*2f2c4c7aSAndroid Build Coastguard Worker            set_platform_repo "aosp_x86_64"
282*2f2c4c7aSAndroid Build Coastguard Worker            rebuild_platform
283*2f2c4c7aSAndroid Build Coastguard Worker            SYSTEM_BUILD="${ANDROID_PRODUCT_OUT}/system.img"
284*2f2c4c7aSAndroid Build Coastguard Worker        fi
285*2f2c4c7aSAndroid Build Coastguard Worker    fi
286*2f2c4c7aSAndroid Build Coastguard Workerfi
287*2f2c4c7aSAndroid Build Coastguard Worker
288*2f2c4c7aSAndroid Build Coastguard Workerif [ "$SKIP_BUILD" = false ] && [ -n "$KERNEL_BUILD" ] && [[ "$KERNEL_BUILD" != ab://* ]] \
289*2f2c4c7aSAndroid Build Coastguard Worker&& [ -d "$KERNEL_BUILD" ]; then
290*2f2c4c7aSAndroid Build Coastguard Worker    # Check if kernel repo is provided, if yes rebuild
291*2f2c4c7aSAndroid Build Coastguard Worker    cd "$KERNEL_BUILD" || print_error "Failed to cd to $KERNEL_BUILD"
292*2f2c4c7aSAndroid Build Coastguard Worker    KERNEL_REPO_LIST_OUT=$(repo list 2>&1)
293*2f2c4c7aSAndroid Build Coastguard Worker    if [[ "$KERNEL_REPO_LIST_OUT" != "error"* ]]; then
294*2f2c4c7aSAndroid Build Coastguard Worker        go_to_repo_root "$PWD"
295*2f2c4c7aSAndroid Build Coastguard Worker        if [ ! -f "common-modules/virtual-device/BUILD.bazel" ]; then
296*2f2c4c7aSAndroid Build Coastguard Worker            # TODO(b/365590299): Add build support to android12 and earlier kernels
297*2f2c4c7aSAndroid Build Coastguard Worker            print_error "bazel build common-modules/virtual-device is not supported in this kernel tree"
298*2f2c4c7aSAndroid Build Coastguard Worker        fi
299*2f2c4c7aSAndroid Build Coastguard Worker
300*2f2c4c7aSAndroid Build Coastguard Worker        # KERNEL_VERSION=$(grep -e "common-modules/virtual-device" .repo/manifests/default.xml | grep -oP 'revision="\K[^"]*') # unused
301*2f2c4c7aSAndroid Build Coastguard Worker
302*2f2c4c7aSAndroid Build Coastguard Worker        # Build a new kernel
303*2f2c4c7aSAndroid Build Coastguard Worker        build_cmd="tools/bazel run --config=fast"
304*2f2c4c7aSAndroid Build Coastguard Worker        if [ "$GCOV" = true ]; then
305*2f2c4c7aSAndroid Build Coastguard Worker            build_cmd+=" --gcov"
306*2f2c4c7aSAndroid Build Coastguard Worker        fi
307*2f2c4c7aSAndroid Build Coastguard Worker        if [ "$DEBUG" = true ]; then
308*2f2c4c7aSAndroid Build Coastguard Worker            build_cmd+=" --debug"
309*2f2c4c7aSAndroid Build Coastguard Worker        fi
310*2f2c4c7aSAndroid Build Coastguard Worker        if [ "$KASAN" = true ]; then
311*2f2c4c7aSAndroid Build Coastguard Worker            build_cmd+=" --kasan"
312*2f2c4c7aSAndroid Build Coastguard Worker        fi
313*2f2c4c7aSAndroid Build Coastguard Worker        build_cmd+=" //common-modules/virtual-device:virtual_device_x86_64_dist"
314*2f2c4c7aSAndroid Build Coastguard Worker        print_warn "Flag --skip-build is not set. Rebuild the kernel with: $build_cmd."
315*2f2c4c7aSAndroid Build Coastguard Worker        eval "$build_cmd"
316*2f2c4c7aSAndroid Build Coastguard Worker        exit_code=$?
317*2f2c4c7aSAndroid Build Coastguard Worker        if [ $exit_code -eq 0 ]; then
318*2f2c4c7aSAndroid Build Coastguard Worker            print_info "$build_cmd succeeded"
319*2f2c4c7aSAndroid Build Coastguard Worker        else
320*2f2c4c7aSAndroid Build Coastguard Worker            print_error "$build_cmd failed"
321*2f2c4c7aSAndroid Build Coastguard Worker        fi
322*2f2c4c7aSAndroid Build Coastguard Worker        KERNEL_BUILD="$PWD/out/virtual_device_x86_64/dist"
323*2f2c4c7aSAndroid Build Coastguard Worker    fi
324*2f2c4c7aSAndroid Build Coastguard Workerfi
325*2f2c4c7aSAndroid Build Coastguard Worker
326*2f2c4c7aSAndroid Build Coastguard Worker
327*2f2c4c7aSAndroid Build Coastguard Workerif [ -z "$ACLOUD_BIN" ] || ! [ -x "$ACLOUD_BIN" ]; then
328*2f2c4c7aSAndroid Build Coastguard Worker    output=$(which acloud 2>&1)
329*2f2c4c7aSAndroid Build Coastguard Worker    if [ -z "$output" ]; then
330*2f2c4c7aSAndroid Build Coastguard Worker        print_info "Use acloud binary from $ACLOUD_PREBUILT"
331*2f2c4c7aSAndroid Build Coastguard Worker        ACLOUD_BIN="$ACLOUD_PREBUILT"
332*2f2c4c7aSAndroid Build Coastguard Worker    else
333*2f2c4c7aSAndroid Build Coastguard Worker        print_info "Use acloud binary from $output"
334*2f2c4c7aSAndroid Build Coastguard Worker        ACLOUD_BIN="$output"
335*2f2c4c7aSAndroid Build Coastguard Worker    fi
336*2f2c4c7aSAndroid Build Coastguard Worker
337*2f2c4c7aSAndroid Build Coastguard Worker    # Check if the newly found or prebuilt ACLOUD_BIN is executable
338*2f2c4c7aSAndroid Build Coastguard Worker    if ! [ -x "$ACLOUD_BIN" ]; then
339*2f2c4c7aSAndroid Build Coastguard Worker        print_error "$ACLOUD_BIN is not executable"
340*2f2c4c7aSAndroid Build Coastguard Worker    fi
341*2f2c4c7aSAndroid Build Coastguard Workerfi
342*2f2c4c7aSAndroid Build Coastguard Worker
343*2f2c4c7aSAndroid Build Coastguard Workeracloud_cli="$ACLOUD_BIN create"
344*2f2c4c7aSAndroid Build Coastguard WorkerEXTRA_OPTIONS+=("$OPT_SKIP_PRERUNCHECK")
345*2f2c4c7aSAndroid Build Coastguard Worker
346*2f2c4c7aSAndroid Build Coastguard Worker# Add in branch if not specified
347*2f2c4c7aSAndroid Build Coastguard Worker
348*2f2c4c7aSAndroid Build Coastguard Workerif [ -z "$PLATFORM_BUILD" ]; then
349*2f2c4c7aSAndroid Build Coastguard Worker    print_warn "Platform build is not specified, will use the latest aosp-main build."
350*2f2c4c7aSAndroid Build Coastguard Worker    acloud_cli+=' --branch aosp-main'
351*2f2c4c7aSAndroid Build Coastguard Workerelif [[ "$PLATFORM_BUILD" == ab://* ]]; then
352*2f2c4c7aSAndroid Build Coastguard Worker    IFS='/' read -ra array <<< "$PLATFORM_BUILD"
353*2f2c4c7aSAndroid Build Coastguard Worker    acloud_cli+=" --branch ${array[2]}"
354*2f2c4c7aSAndroid Build Coastguard Worker
355*2f2c4c7aSAndroid Build Coastguard Worker    # Check if array[3] exists before using it
356*2f2c4c7aSAndroid Build Coastguard Worker    if [ ${#array[@]} -ge 3 ] && [ -n "${array[3]}" ]; then
357*2f2c4c7aSAndroid Build Coastguard Worker        acloud_cli+=" --build-target ${array[3]}"
358*2f2c4c7aSAndroid Build Coastguard Worker
359*2f2c4c7aSAndroid Build Coastguard Worker        # Check if array[4] exists and is not 'latest' before using it
360*2f2c4c7aSAndroid Build Coastguard Worker        if [ ${#array[@]} -ge 4 ] && [ -n "${array[4]}" ] && [ "${array[4]}" != 'latest' ]; then
361*2f2c4c7aSAndroid Build Coastguard Worker            acloud_cli+=" --build-id ${array[4]}"
362*2f2c4c7aSAndroid Build Coastguard Worker        fi
363*2f2c4c7aSAndroid Build Coastguard Worker    fi
364*2f2c4c7aSAndroid Build Coastguard Workerelse
365*2f2c4c7aSAndroid Build Coastguard Worker    acloud_cli+=" --local-image $PLATFORM_BUILD"
366*2f2c4c7aSAndroid Build Coastguard Workerfi
367*2f2c4c7aSAndroid Build Coastguard Worker
368*2f2c4c7aSAndroid Build Coastguard Workerif [ -z "$KERNEL_BUILD" ]; then
369*2f2c4c7aSAndroid Build Coastguard Worker    print_warn "Flag --kernel-build is not set, will not launch Cuttlefish with different kernel."
370*2f2c4c7aSAndroid Build Coastguard Workerelif [[ "$KERNEL_BUILD" == ab://* ]]; then
371*2f2c4c7aSAndroid Build Coastguard Worker    IFS='/' read -ra array <<< "$KERNEL_BUILD"
372*2f2c4c7aSAndroid Build Coastguard Worker    acloud_cli+=" --kernel-branch ${array[2]}"
373*2f2c4c7aSAndroid Build Coastguard Worker
374*2f2c4c7aSAndroid Build Coastguard Worker    # Check if array[3] exists before using it
375*2f2c4c7aSAndroid Build Coastguard Worker    if [ ${#array[@]} -ge 3 ] && [ -n "${array[3]}" ]; then
376*2f2c4c7aSAndroid Build Coastguard Worker        acloud_cli+=" --kernel-build-target ${array[3]}"
377*2f2c4c7aSAndroid Build Coastguard Worker
378*2f2c4c7aSAndroid Build Coastguard Worker        # Check if array[4] exists and is not 'latest' before using it
379*2f2c4c7aSAndroid Build Coastguard Worker        if [ ${#array[@]} -ge 4 ] && [ -n "${array[4]}" ] && [ "${array[4]}" != 'latest' ]; then
380*2f2c4c7aSAndroid Build Coastguard Worker            acloud_cli+=" --kernel-build-id ${array[4]}"
381*2f2c4c7aSAndroid Build Coastguard Worker        fi
382*2f2c4c7aSAndroid Build Coastguard Worker    fi
383*2f2c4c7aSAndroid Build Coastguard Workerelse
384*2f2c4c7aSAndroid Build Coastguard Worker    acloud_cli+=" --local-kernel-image $KERNEL_BUILD"
385*2f2c4c7aSAndroid Build Coastguard Workerfi
386*2f2c4c7aSAndroid Build Coastguard Worker
387*2f2c4c7aSAndroid Build Coastguard Workerif [ -z "$SYSTEM_BUILD" ]; then
388*2f2c4c7aSAndroid Build Coastguard Worker    print_warn "System build is not specified, will not launch Cuttlefish with GSI mixed build."
389*2f2c4c7aSAndroid Build Coastguard Workerelif [[ "$SYSTEM_BUILD" == ab://* ]]; then
390*2f2c4c7aSAndroid Build Coastguard Worker    IFS='/' read -ra array <<< "$SYSTEM_BUILD"
391*2f2c4c7aSAndroid Build Coastguard Worker    acloud_cli+=" --system-branch ${array[2]}"
392*2f2c4c7aSAndroid Build Coastguard Worker
393*2f2c4c7aSAndroid Build Coastguard Worker     # Check if array[3] exists before using it
394*2f2c4c7aSAndroid Build Coastguard Worker    if [ ${#array[@]} -ge 3 ] && [ -n "${array[3]}" ]; then
395*2f2c4c7aSAndroid Build Coastguard Worker        acloud_cli+=" --system-build-target ${array[3]}"
396*2f2c4c7aSAndroid Build Coastguard Worker
397*2f2c4c7aSAndroid Build Coastguard Worker        # Check if array[4] exists and is not 'latest' before using it
398*2f2c4c7aSAndroid Build Coastguard Worker        if [ ${#array[@]} -ge 4 ] && [ -n "${array[4]}" ] && [ "${array[4]}" != 'latest' ]; then
399*2f2c4c7aSAndroid Build Coastguard Worker            acloud_cli+=" --system-build-id ${array[4]}"
400*2f2c4c7aSAndroid Build Coastguard Worker        fi
401*2f2c4c7aSAndroid Build Coastguard Worker    fi
402*2f2c4c7aSAndroid Build Coastguard Workerelse
403*2f2c4c7aSAndroid Build Coastguard Worker    acloud_cli+=" --local-system-image $SYSTEM_BUILD"
404*2f2c4c7aSAndroid Build Coastguard Workerfi
405*2f2c4c7aSAndroid Build Coastguard Worker
406*2f2c4c7aSAndroid Build Coastguard Workeracloud_cli+=" ${EXTRA_OPTIONS[*]}"
407*2f2c4c7aSAndroid Build Coastguard Workerprint_info "Launch CVD with command: $acloud_cli"
408*2f2c4c7aSAndroid Build Coastguard Workereval "$acloud_cli"
409