blob: 1b19e1c8779dd3e715634ac54740b24941fa6bfe [file]
#!/bin/bash
# Copyright 2025 The gRPC Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
set -ex
# cd to repo root
cd "$(dirname "$0")/../.."
# Build the C++ generator. This must be done from within the sub-workspace.
(cd tools/artifact_gen && ../../tools/bazel build //:gen_upb_api_from_bazel)
# Now that the tool is built, we can move the executable to a temporary location
# to avoid issues with the nested bazel workspaces.
TMP_DIR=$(mktemp -d)
cp tools/artifact_gen/bazel-bin/gen_upb_api_from_bazel "${TMP_DIR}/"
# Clean bazel generated files from sub-workspace to avoid conflicts
rm -rf tools/artifact_gen/bazel-*
# Clean existing generated files
${TMP_DIR}/gen_upb_api_from_bazel --mode=clean $@
UPB_RULES_XML=$(mktemp)
DEPS_XML=$(mktemp)
trap "rm -f ${UPB_RULES_XML} ${DEPS_XML}; rm -rf ${TMP_DIR}" EXIT
# Query for upb rules from the main grpc workspace. This must be run from the root.
tools/bazel query --output xml --noimplicit_deps //:all > "${UPB_RULES_XML}"
# Now we can use the generator to get the list of deps.
DEPS_LIST=$(${TMP_DIR}/gen_upb_api_from_bazel \
--mode=list_deps \
--upb_rules_xml="${UPB_RULES_XML}")
# Query for all the dependencies of the upb rules. This must be run from the root.
if [[ -n "${DEPS_LIST}" ]]; then
DEPS_QUERY="deps($(echo "${DEPS_LIST}" | sed 's/ / + /g'))"
tools/bazel query --output xml --noimplicit_deps "${DEPS_QUERY}" > "${DEPS_XML}"
else
# If there are no dependencies, create an empty XML file
echo '<?xml version="1.0" encoding="UTF-8" standalone="no"?><query/>' > "${DEPS_XML}"
fi
# Get the list of upb targets to build
BUILD_TARGETS=$(${TMP_DIR}/gen_upb_api_from_bazel \
--mode=list_build_targets \
--upb_rules_xml="${UPB_RULES_XML}")
# Build the upb targets from the root.
if [[ -n "${BUILD_TARGETS}" ]]; then
tools/bazel build ${BUILD_TARGETS}
fi
# Run the C++ program to copy the generated files.
${TMP_DIR}/gen_upb_api_from_bazel \
--mode=generate_and_copy \
--upb_rules_xml="${UPB_RULES_XML}" \
--deps_xml="${DEPS_XML}" \
"$@"