| #!/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 |
| |