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