xref: /aosp_15_r20/build/bazel/bin/bazel (revision 7594170e27e0732bc44b93d1440d87a54b6ffe7c)
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