blob: 5e29af4318f14baf8d9d5c509f79ce754c0dc092 [file] [edit]
#!/bin/bash
# Copyright 2025 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
set -euo pipefail
PKG_DIR="$1"
DEPS_PREFIX="$2"
for dir in $(find -L "${DEPS_PREFIX}" -type d -name "bin"); do
export PATH="${dir}:${PATH}"
done
JAVA_BIN=$(find -L "${DEPS_PREFIX}" -type f -name java | head -n 1)
export JAVA_HOME
export JAVA_HOME=$(dirname "$(dirname "$(realpath "${JAVA_BIN}")")")
PROTOBUF_ARCHIVE=$(find "${DEPS_PREFIX}" -type f \( -name 'raw_source_0.zip' -o -name 'raw_source_0.tar.gz' \) | head -n 1)
EXTRACT_DIR="protobuf_src"
mkdir -p "${EXTRACT_DIR}"
if [[ "${PROTOBUF_ARCHIVE}" == *.zip ]]; then
unzip -q "${PROTOBUF_ARCHIVE}" -d "${EXTRACT_DIR}"
elif [[ "${PROTOBUF_ARCHIVE}" == *.tar.gz ]]; then
tar -xzf "${PROTOBUF_ARCHIVE}" -C "${EXTRACT_DIR}"
else
echo "ERROR: Unknown archive type for ${PROTOBUF_ARCHIVE}" >&2
exit 1
fi
PROTOBUF_SRC_DIR=$(find "${EXTRACT_DIR}" -maxdepth 3 -type f -name 'configure' -exec dirname {} \; 2>/dev/null | head -n 1)
PROTOBUF_INSTALL_DIR="${PWD}/protobuf_install"
mkdir -p "${PROTOBUF_INSTALL_DIR}"
M4_BIN=$(find -L "${DEPS_PREFIX}" -type f -name m4 | head -n 1)
if [ -n "${M4_BIN}" ]; then
export M4="${M4_BIN}"
echo "M4 explicitly set to: ${M4}"
fi
if [ -f "${PROTOBUF_SRC_DIR}/CMakeLists.txt" ]; then
PROTOBUF_BUILD_DIR="build_protobuf"
mkdir -p "${PROTOBUF_BUILD_DIR}"
(
cd "${PROTOBUF_BUILD_DIR}"
CMAKE_FLAGS=(
"-DCMAKE_INSTALL_PREFIX=${PROTOBUF_INSTALL_DIR}"
"-Dprotobuf_BUILD_TESTS=OFF"
)
cmake "${CMAKE_FLAGS[@]}" "../${PROTOBUF_SRC_DIR}"
if command -v nproc > /dev/null; then make -j"$(nproc)"; else make; fi
make install
)
else
echo "CMakeLists.txt not found. Building protobuf with autotools..."
(
cd "${PROTOBUF_SRC_DIR}"
if [ -f "./autogen.sh" ]; then ./autogen.sh; fi
unset CXX CPP CXXCPP CFLAGS CXXFLAGS LDFLAGS
if [[ "$(uname)" == "Linux" ]]; then
HOST_ARCH=""
if [[ -n "${CC:-}" && "${CC}" == *aarch64* ]]; then
HOST_ARCH="aarch64-unknown-linux-gnu"
else
HOST_ARCH="x86_64-pc-linux-gnu"
fi
echo "Configuring protobuf for host: ${HOST_ARCH}"
./configure --prefix="${PROTOBUF_INSTALL_DIR}" --build=x86_64-pc-linux-gnu --host="${HOST_ARCH}" CXXFLAGS="-fPIC" CFLAGS="-fPIC"
else
./configure --prefix="${PROTOBUF_INSTALL_DIR}" CXXFLAGS="-fPIC" CFLAGS="-fPIC"
fi
if command -v nproc > /dev/null; then make -j"$(nproc)"; else make; fi
make install
)
fi
export PATH="${PROTOBUF_INSTALL_DIR}/bin:${PATH}"
export CXXFLAGS="-I${PROTOBUF_INSTALL_DIR}/include"
if [[ "$(uname)" == "Darwin" ]]; then
export LDFLAGS="-L${PROTOBUF_INSTALL_DIR}/lib"
else
export LDFLAGS="-L${PROTOBUF_INSTALL_DIR}/lib -L${PROTOBUF_INSTALL_DIR}/lib64 -static-libgcc -static-libstdc++"
fi
cat > ./gradle.properties <<EOF
skipAndroid=true
EOF
chmod +x ./gradlew
./gradlew :grpc-compiler:build
mkdir -p "${PKG_DIR}/bin" "${PKG_DIR}/jars"
SOURCE_PLUGIN=$(find compiler/build/exe -type f -name "protoc-gen-grpc-java" 2>/dev/null | head -n 1)
DEST_PLUGIN="${PKG_DIR}/bin/protoc-gen-grpc-java"
cp "${SOURCE_PLUGIN}" "${DEST_PLUGIN}"
chmod +x "${DEST_PLUGIN}"
find . -name "*.jar" \
-not -name "*-sources.jar" \
-not -name "*-javadoc.jar" \
-path "*/build/libs/*" \
-exec cp {} "${PKG_DIR}/jars/" \;
# Copy the LICENSE file
cp LICENSE "${PKG_DIR}"
# --- Package and copy all required .proto files ---
PROTO_INCLUDE_DIR="${PKG_DIR}/include"
mkdir -p "${PROTO_INCLUDE_DIR}"
cp -r "${PROTOBUF_INSTALL_DIR}/include/google" "${PROTO_INCLUDE_DIR}/"
API_PROTO_PATH=$(find . -type f -path "*/google/api/annotations.proto" | head -n 1)
if [[ -n "${API_PROTO_PATH}" ]]; then
GOOGLE_API_DIR=$(dirname "$(dirname "$(dirname "${API_PROTO_PATH}")")")
cp -r "${GOOGLE_API_DIR}/google" "${PROTO_INCLUDE_DIR}/"
else
echo "WARNING: Could not find 'google/api/annotations.proto' in the source." >&2
fi