1*7594170eSAndroid Build Coastguard Worker#!/bin/bash 2*7594170eSAndroid Build Coastguard Worker 3*7594170eSAndroid Build Coastguard Worker# Copyright (C) 2022 The Android Open Source Project 4*7594170eSAndroid Build Coastguard Worker# 5*7594170eSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 6*7594170eSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 7*7594170eSAndroid Build Coastguard Worker# You may obtain a copy of the License at 8*7594170eSAndroid Build Coastguard Worker# 9*7594170eSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 10*7594170eSAndroid Build Coastguard Worker# 11*7594170eSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 12*7594170eSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 13*7594170eSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*7594170eSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 15*7594170eSAndroid Build Coastguard Worker# limitations under the License. 16*7594170eSAndroid Build Coastguard Worker 17*7594170eSAndroid Build Coastguard Workerset -eo pipefail 18*7594170eSAndroid Build Coastguard Worker 19*7594170eSAndroid Build Coastguard Workersource $(cd $(dirname $BASH_SOURCE) &> /dev/null && pwd)/../../make/shell_utils.sh 20*7594170eSAndroid Build Coastguard Workerrequire_top 21*7594170eSAndroid Build Coastguard Worker 22*7594170eSAndroid Build Coastguard Worker 23*7594170eSAndroid Build Coastguard WorkerABSOLUTE_OUT_DIR="$(getoutdir)" 24*7594170eSAndroid Build Coastguard Worker# Store all bazel-related metadata files in this subdir of OUT_DIR. 25*7594170eSAndroid Build Coastguard WorkerBAZEL_METADATA_OUT="${ABSOLUTE_OUT_DIR}/bazel" 26*7594170eSAndroid Build Coastguard Workermkdir -p "${BAZEL_METADATA_OUT}" 27*7594170eSAndroid Build Coastguard Worker 28*7594170eSAndroid Build Coastguard Workercase $(uname -s) in 29*7594170eSAndroid Build Coastguard Worker Darwin) 30*7594170eSAndroid Build Coastguard Worker ANDROID_BAZEL_PATH="${TOP}/prebuilts/bazel/darwin-x86_64/bazel" 31*7594170eSAndroid Build Coastguard Worker ANDROID_BAZELRC_NAME="darwin.bazelrc" 32*7594170eSAndroid Build Coastguard Worker ANDROID_BAZEL_JDK_PATH="${TOP}/prebuilts/jdk/jdk21/darwin-x86" 33*7594170eSAndroid Build Coastguard Worker 34*7594170eSAndroid Build Coastguard Worker # Lock down PATH in action execution environment, thereby removing 35*7594170eSAndroid Build Coastguard Worker # Bazel's default /bin, /usr/bin, /usr/local/bin and ensuring 36*7594170eSAndroid Build Coastguard Worker # hermeticity from the system. 37*7594170eSAndroid Build Coastguard Worker # 38*7594170eSAndroid Build Coastguard Worker # The new PATH components are: 39*7594170eSAndroid Build Coastguard Worker # 40*7594170eSAndroid Build Coastguard Worker # - prebuilts/build-tools/path: contains checked-in tools that can be 41*7594170eSAndroid Build Coastguard Worker # used as executables in actions. 42*7594170eSAndroid Build Coastguard Worker # 43*7594170eSAndroid Build Coastguard Worker # - out/.path: a special directory created by path_interposer with 44*7594170eSAndroid Build Coastguard Worker # config from ui/build/paths/config.go for allowlisting specific 45*7594170eSAndroid Build Coastguard Worker # binaries not in prebuilts/build-tools/path, but on the host system. 46*7594170eSAndroid Build Coastguard Worker # If one runs Bazel without soong_ui, then this directory wouldn't 47*7594170eSAndroid Build Coastguard Worker # exist, making standalone Bazel execution's PATH variable stricter than 48*7594170eSAndroid Build Coastguard Worker # Bazel execution within soong_ui. 49*7594170eSAndroid Build Coastguard Worker RESTRICTED_PATH="${TOP}/prebuilts/build-tools/path/darwin-x86:${ABSOLUTE_OUT_DIR}/.path" 50*7594170eSAndroid Build Coastguard Worker ;; 51*7594170eSAndroid Build Coastguard Worker Linux) 52*7594170eSAndroid Build Coastguard Worker ANDROID_BAZEL_PATH="${TOP}/prebuilts/bazel/linux-x86_64/bazel" 53*7594170eSAndroid Build Coastguard Worker ANDROID_BAZELISK_PATH="${TOP}/prebuilts/bazel/linux-x86_64/dev_tools/bazelisk/bazelisk" 54*7594170eSAndroid Build Coastguard Worker ANDROID_BAZELRC_NAME="linux.bazelrc" 55*7594170eSAndroid Build Coastguard Worker ANDROID_BAZEL_JDK_PATH="${TOP}/prebuilts/jdk/jdk21/linux-x86" 56*7594170eSAndroid Build Coastguard Worker RESTRICTED_PATH="${TOP}/prebuilts/build-tools/path/linux-x86:${ABSOLUTE_OUT_DIR}/.path" 57*7594170eSAndroid Build Coastguard Worker ;; 58*7594170eSAndroid Build Coastguard Worker *) 59*7594170eSAndroid Build Coastguard Worker >&2 echo "Bazel is supported on Linux and Darwin only. Your OS is not supported for Bazel usage, based on 'uname -s': $(uname -s)" 60*7594170eSAndroid Build Coastguard Worker exit 1 61*7594170eSAndroid Build Coastguard Worker ;; 62*7594170eSAndroid Build Coastguard Workeresac 63*7594170eSAndroid Build Coastguard Worker 64*7594170eSAndroid Build Coastguard Workerfunction verify_soong_outputs_exist() { 65*7594170eSAndroid Build Coastguard Worker local to_check="${ABSOLUTE_OUT_DIR}/.path" 66*7594170eSAndroid Build Coastguard Worker local no_soong=0 67*7594170eSAndroid Build Coastguard Worker if [[ ! -d "${to_check}" ]]; then 68*7594170eSAndroid Build Coastguard Worker no_soong=1 69*7594170eSAndroid Build Coastguard Worker fi 70*7594170eSAndroid Build Coastguard Worker 71*7594170eSAndroid Build Coastguard Worker local bazel_configs=( 72*7594170eSAndroid Build Coastguard Worker "bp2build" 73*7594170eSAndroid Build Coastguard Worker "queryview" 74*7594170eSAndroid Build Coastguard Worker ) 75*7594170eSAndroid Build Coastguard Worker local valid_bazel_config=0 76*7594170eSAndroid Build Coastguard Worker for c in "${bazel_configs[@]}" 77*7594170eSAndroid Build Coastguard Worker do 78*7594170eSAndroid Build Coastguard Worker if [[ -d "${ABSOLUTE_OUT_DIR}/soong/""${c}" ]]; then 79*7594170eSAndroid Build Coastguard Worker valid_bazel_config=1 80*7594170eSAndroid Build Coastguard Worker fi 81*7594170eSAndroid Build Coastguard Worker done 82*7594170eSAndroid Build Coastguard Worker 83*7594170eSAndroid Build Coastguard Worker if [[ "${no_soong}" -eq "1" || "${valid_bazel_config}" -eq "0" ]]; then 84*7594170eSAndroid Build Coastguard Worker >&2 echo "Error: missing generated Bazel files. Have you run bp2build or queryview?" 85*7594170eSAndroid Build Coastguard Worker >&2 echo "Run bp2build with the command: m bp2build" 86*7594170eSAndroid Build Coastguard Worker >&2 echo "Run queryview with the command: m queryview" 87*7594170eSAndroid Build Coastguard Worker >&2 echo "Alternatively, for non-queryview applications, invoke Bazel using 'b' with the command: source envsetup.sh; b query/build/test <targets>" 88*7594170eSAndroid Build Coastguard Worker exit 1 89*7594170eSAndroid Build Coastguard Worker fi 90*7594170eSAndroid Build Coastguard Worker} 91*7594170eSAndroid Build Coastguard Worker 92*7594170eSAndroid Build Coastguard Workerfunction create_bazelrc() { 93*7594170eSAndroid Build Coastguard Worker cat > "${BAZEL_METADATA_OUT}/generated.bazelrc" <<EOF 94*7594170eSAndroid Build Coastguard Worker# This file is generated by build/bazel/bin/bazel. Do not edit manually. 95*7594170eSAndroid Build Coastguard Workerbuild --action_env=PATH=${RESTRICTED_PATH} 96*7594170eSAndroid Build Coastguard Worker 97*7594170eSAndroid Build Coastguard Worker# The --package_path option needs to be added to several different 98*7594170eSAndroid Build Coastguard Worker# bazel subcommands, because they don't inherit from each other, and 99*7594170eSAndroid Build Coastguard Worker# if we put it on "common", then it would break other commands like 100*7594170eSAndroid Build Coastguard Worker# shutdown that don't support --package_path. In addition, we have 101*7594170eSAndroid Build Coastguard Worker# to set at least one option on the "common" target so that bazel 102*7594170eSAndroid Build Coastguard Worker# won't complain that bp2build doesn't exist when using 103*7594170eSAndroid Build Coastguard Worker# --config=bp2build. We'll use --noannounce_rc for that, because 104*7594170eSAndroid Build Coastguard Worker# --noannounce_rc is the default. 105*7594170eSAndroid Build Coastguard Worker 106*7594170eSAndroid Build Coastguard Worker 107*7594170eSAndroid Build Coastguard Worker# Run bazel query from the workspace, without cd'ing into \$OUT_DIR/soong/queryview 108*7594170eSAndroid Build Coastguard Workercommon:queryview --noannounce_rc 109*7594170eSAndroid Build Coastguard Workerbuild:queryview --package_path=${ABSOLUTE_OUT_DIR}/soong/queryview 110*7594170eSAndroid Build Coastguard Workerfetch:queryview --package_path=${ABSOLUTE_OUT_DIR}/soong/queryview 111*7594170eSAndroid Build Coastguard Workermod:queryview --package_path=${ABSOLUTE_OUT_DIR}/soong/queryview 112*7594170eSAndroid Build Coastguard Workerquery:queryview --package_path=${ABSOLUTE_OUT_DIR}/soong/queryview 113*7594170eSAndroid Build Coastguard Workersync:queryview --package_path=${ABSOLUTE_OUT_DIR}/soong/queryview 114*7594170eSAndroid Build Coastguard Worker 115*7594170eSAndroid Build Coastguard Worker# Run bazel build from the workspace, without cd'ing into \$OUT_DIR/soong/workspace 116*7594170eSAndroid Build Coastguard Workercommon:bp2build --noannounce_rc 117*7594170eSAndroid Build Coastguard Workerbuild:bp2build --package_path=${ABSOLUTE_OUT_DIR}/soong/workspace 118*7594170eSAndroid Build Coastguard Workerfetch:bp2build --package_path=${ABSOLUTE_OUT_DIR}/soong/workspace 119*7594170eSAndroid Build Coastguard Workermod:bp2build --package_path=${ABSOLUTE_OUT_DIR}/soong/workspace 120*7594170eSAndroid Build Coastguard Workerquery:bp2build --package_path=${ABSOLUTE_OUT_DIR}/soong/workspace 121*7594170eSAndroid Build Coastguard Workersync:bp2build --package_path=${ABSOLUTE_OUT_DIR}/soong/workspace 122*7594170eSAndroid Build Coastguard Worker 123*7594170eSAndroid Build Coastguard WorkerEOF 124*7594170eSAndroid Build Coastguard Worker} 125*7594170eSAndroid Build Coastguard Worker 126*7594170eSAndroid Build Coastguard Worker# Return 1 if STANDALONE_BAZEL is truthy 127*7594170eSAndroid Build Coastguard Workerfunction is_standalone_bazel() { 128*7594170eSAndroid Build Coastguard Worker [[ ${STANDALONE_BAZEL} =~ ^(true|TRUE|1)$ ]] 129*7594170eSAndroid Build Coastguard Worker} 130*7594170eSAndroid Build Coastguard Worker 131*7594170eSAndroid Build Coastguard Workercase "x${ANDROID_BAZELRC_PATH}" in 132*7594170eSAndroid Build Coastguard Worker x) 133*7594170eSAndroid Build Coastguard Worker # Path not provided, use default. 134*7594170eSAndroid Build Coastguard Worker if is_standalone_bazel; then 135*7594170eSAndroid Build Coastguard Worker # Standalone bazel uses the empty /dev/null bazelrc 136*7594170eSAndroid Build Coastguard Worker # This is necessary since some configs in common.bazelrc depend on soong_injection 137*7594170eSAndroid Build Coastguard Worker ANDROID_BAZELRC_PATH=/dev/null 138*7594170eSAndroid Build Coastguard Worker else 139*7594170eSAndroid Build Coastguard Worker ANDROID_BAZELRC_PATH="${TOP}/build/bazel" 140*7594170eSAndroid Build Coastguard Worker fi 141*7594170eSAndroid Build Coastguard Worker ;; 142*7594170eSAndroid Build Coastguard Worker x/*) 143*7594170eSAndroid Build Coastguard Worker # Absolute path, take it as-is. 144*7594170eSAndroid Build Coastguard Worker ANDROID_BAZELRC_PATH="${ANDROID_BAZELRC_PATH}" 145*7594170eSAndroid Build Coastguard Worker ;; 146*7594170eSAndroid Build Coastguard Worker x*) 147*7594170eSAndroid Build Coastguard Worker # Relative path, consider it relative to TOP. 148*7594170eSAndroid Build Coastguard Worker ANDROID_BAZELRC_PATH="${TOP}/${ANDROID_BAZELRC_PATH}" 149*7594170eSAndroid Build Coastguard Worker ;; 150*7594170eSAndroid Build Coastguard Workeresac 151*7594170eSAndroid Build Coastguard Worker 152*7594170eSAndroid Build Coastguard Workerif [ -d "${ANDROID_BAZELRC_PATH}" ]; then 153*7594170eSAndroid Build Coastguard Worker # If we're given a directory, find the correct bazelrc file there. 154*7594170eSAndroid Build Coastguard Worker ANDROID_BAZELRC_PATH="${ANDROID_BAZELRC_PATH}/${ANDROID_BAZELRC_NAME}" 155*7594170eSAndroid Build Coastguard Workerfi 156*7594170eSAndroid Build Coastguard Worker 157*7594170eSAndroid Build Coastguard WorkerADDITIONAL_FLAGS=() 158*7594170eSAndroid Build Coastguard Worker 159*7594170eSAndroid Build Coastguard Workerif [[ -z ${USE_BAZEL_VERSION+x} ]]; then 160*7594170eSAndroid Build Coastguard Worker if [ -n "$ANDROID_BAZEL_PATH" -a -f "$ANDROID_BAZEL_PATH" ]; then 161*7594170eSAndroid Build Coastguard Worker export ANDROID_BAZEL_PATH 162*7594170eSAndroid Build Coastguard Worker else 163*7594170eSAndroid Build Coastguard Worker >&2 echo "Couldn't locate Bazel binary" 164*7594170eSAndroid Build Coastguard Worker exit 1 165*7594170eSAndroid Build Coastguard Worker fi 166*7594170eSAndroid Build Coastguard Workerelse 167*7594170eSAndroid Build Coastguard Worker echo -e "\033[1m\033[33mUSING BAZELISK:\033[0m Using Bazelisk because of env var: USE_BAZEL_VERSION=${USE_BAZEL_VERSION}" >&2 168*7594170eSAndroid Build Coastguard Worker ANDROID_BAZEL_PATH=$ANDROID_BAZELISK_PATH 169*7594170eSAndroid Build Coastguard Worker export ANDROID_BAZEL_PATH 170*7594170eSAndroid Build Coastguard Worker # TODO(b/283971340): Pass BAZELISK_NOJDK=1 when this works with bazelisk. 171*7594170eSAndroid Build Coastguard Workerfi 172*7594170eSAndroid Build Coastguard Worker 173*7594170eSAndroid Build Coastguard Workerif [ "$ANDROID_BAZELRC_PATH" == "/dev/null" ] || [ -n "$ANDROID_BAZELRC_PATH" -a -f "$ANDROID_BAZELRC_PATH" ]; then 174*7594170eSAndroid Build Coastguard Worker export ANDROID_BAZELRC_PATH 175*7594170eSAndroid Build Coastguard Workerelse 176*7594170eSAndroid Build Coastguard Worker >&2 echo "Couldn't locate bazelrc file for Bazel" 177*7594170eSAndroid Build Coastguard Worker exit 1 178*7594170eSAndroid Build Coastguard Workerfi 179*7594170eSAndroid Build Coastguard Worker 180*7594170eSAndroid Build Coastguard Workerif [ -n "$ANDROID_BAZEL_JDK_PATH" -a -d "$ANDROID_BAZEL_JDK_PATH" ]; then 181*7594170eSAndroid Build Coastguard Worker export ANDROID_BAZEL_JDK_PATH 182*7594170eSAndroid Build Coastguard Workerelse 183*7594170eSAndroid Build Coastguard Worker >&2 echo "Couldn't locate JDK to use for Bazel" 184*7594170eSAndroid Build Coastguard Worker exit 1 185*7594170eSAndroid Build Coastguard Workerfi 186*7594170eSAndroid Build Coastguard Worker 187*7594170eSAndroid Build Coastguard Worker# In order to be able to load JNI libraries, this directory needs to exist 188*7594170eSAndroid Build Coastguard Workermkdir -p "${BAZEL_METADATA_OUT}/javatmp" 189*7594170eSAndroid Build Coastguard Worker 190*7594170eSAndroid Build Coastguard Worker# Output a deps file. Soong will read these as dependencies for mixed builds 191*7594170eSAndroid Build Coastguard WorkerMIXED_BUILDS_DOTD="${BAZEL_METADATA_OUT}/bazel.list" 192*7594170eSAndroid Build Coastguard Workertouch "${MIXED_BUILDS_DOTD}" 193*7594170eSAndroid Build Coastguard Workerecho $ANDROID_BAZEL_PATH > "${MIXED_BUILDS_DOTD}" 194*7594170eSAndroid Build Coastguard Workerecho $ANDROID_BAZELRC_PATH >> "${MIXED_BUILDS_DOTD}" 195*7594170eSAndroid Build Coastguard Workerecho $ANDROID_BAZEL_JDK_PATH >> "${MIXED_BUILDS_DOTD}" 196*7594170eSAndroid Build Coastguard Worker 197*7594170eSAndroid Build Coastguard Worker 198*7594170eSAndroid Build Coastguard Workerif is_standalone_bazel; then 199*7594170eSAndroid Build Coastguard Worker # STANDALONE_BAZEL is set. 200*7594170eSAndroid Build Coastguard Worker >&2 echo "WARNING: Using Bazel in standalone mode. This mode is not integrated with Soong and Make, and is not supported" 201*7594170eSAndroid Build Coastguard Worker >&2 echo "for Android Platform builds. Use this mode at your own risk." 202*7594170eSAndroid Build Coastguard Worker >&2 echo 203*7594170eSAndroid Build Coastguard Workerelse 204*7594170eSAndroid Build Coastguard Worker # Generate a bazelrc with dynamic content, like the absolute path to PATH variable values. 205*7594170eSAndroid Build Coastguard Worker create_bazelrc 206*7594170eSAndroid Build Coastguard Worker # Check that the Bazel synthetic workspace and other required inputs exist before handing over control to Bazel. 207*7594170eSAndroid Build Coastguard Worker verify_soong_outputs_exist 208*7594170eSAndroid Build Coastguard Worker ADDITIONAL_FLAGS+=("--bazelrc=${BAZEL_METADATA_OUT}/generated.bazelrc") 209*7594170eSAndroid Build Coastguard Worker 210*7594170eSAndroid Build Coastguard Worker # These bazelrc files are only available when bp2build has been run. 211*7594170eSAndroid Build Coastguard Worker # Standalone bazel and queryview don't run bp2build. 212*7594170eSAndroid Build Coastguard Worker if [[ -f "${ABSOLUTE_OUT_DIR}/soong/soong_injection/product_config_platforms/common.bazelrc" ]]; then 213*7594170eSAndroid Build Coastguard Worker ADDITIONAL_FLAGS+=("--bazelrc=${ABSOLUTE_OUT_DIR}/soong/soong_injection/product_config_platforms/common.bazelrc") 214*7594170eSAndroid Build Coastguard Worker case $(uname -s) in 215*7594170eSAndroid Build Coastguard Worker Darwin) 216*7594170eSAndroid Build Coastguard Worker ADDITIONAL_FLAGS+=("--bazelrc=${ABSOLUTE_OUT_DIR}/soong/soong_injection/product_config_platforms/darwin.bazelrc") 217*7594170eSAndroid Build Coastguard Worker ;; 218*7594170eSAndroid Build Coastguard Worker Linux) 219*7594170eSAndroid Build Coastguard Worker ADDITIONAL_FLAGS+=("--bazelrc=${ABSOLUTE_OUT_DIR}/soong/soong_injection/product_config_platforms/linux.bazelrc") 220*7594170eSAndroid Build Coastguard Worker ;; 221*7594170eSAndroid Build Coastguard Worker *) 222*7594170eSAndroid Build Coastguard Worker >&2 echo "Bazel is supported on Linux and Darwin only. Your OS is not supported for Bazel usage, based on 'uname -s': $(uname -s)" 223*7594170eSAndroid Build Coastguard Worker exit 1 224*7594170eSAndroid Build Coastguard Worker ;; 225*7594170eSAndroid Build Coastguard Worker esac 226*7594170eSAndroid Build Coastguard Worker fi 227*7594170eSAndroid Build Coastguard Workerfi 228*7594170eSAndroid Build Coastguard Worker 229*7594170eSAndroid Build Coastguard Worker# Change the PATH variable for the bazel invocation to include RESTRICTED_PATH. 230*7594170eSAndroid Build Coastguard Worker# This only affects the workspace_status_marker script environment and 231*7594170eSAndroid Build Coastguard Worker# the bazel run environment, and works around a bug for Bazelisk where Bazelisk 232*7594170eSAndroid Build Coastguard Worker# behaves differently if no PATH is present. 233*7594170eSAndroid Build Coastguard WorkerBAZEL_PATH=$PATH:${RESTRICTED_PATH} 234*7594170eSAndroid Build Coastguard Worker 235*7594170eSAndroid Build Coastguard Worker# TODO(b/240354506): Re-enable hsperfdata file creation without causing SIGBUS errors 236*7594170eSAndroid Build Coastguard WorkerPATH="${BAZEL_PATH}" JAVA_HOME="${ANDROID_BAZEL_JDK_PATH}" \ 237*7594170eSAndroid Build Coastguard Worker "${ANDROID_BAZEL_PATH}" \ 238*7594170eSAndroid Build Coastguard Worker --server_javabase="${ANDROID_BAZEL_JDK_PATH}" \ 239*7594170eSAndroid Build Coastguard Worker --output_user_root="${BAZEL_METADATA_OUT}/output_user_root" \ 240*7594170eSAndroid Build Coastguard Worker --host_jvm_args=-Djava.io.tmpdir="${BAZEL_METADATA_OUT}/javatmp" \ 241*7594170eSAndroid Build Coastguard Worker --nohome_rc --nosystem_rc \ 242*7594170eSAndroid Build Coastguard Worker --bazelrc="${ANDROID_BAZELRC_PATH}" \ 243*7594170eSAndroid Build Coastguard Worker "${ADDITIONAL_FLAGS[@]}" \ 244*7594170eSAndroid Build Coastguard Worker "$@" 245