| #!/bin/bash |
| # |
| # Copyright 2024 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. |
| # |
| # install-protoc.sh |
| # |
| # This script installs the Protocol Buffers compiler (protoc) to the specified |
| # directory. It is used to generate code from .proto files for gRPC |
| # communication. The script downloads the protoc binary from the official GitHub |
| # repository and installs it in the system. |
| # |
| # Usage: ./install-protoc.sh INSTALL_PATH |
| # |
| # Arguments: |
| # INSTALL_PATH: The path where the protoc binary will be installed. |
| # |
| # Note: This script requires internet connectivity to download the protoc binary. |
| |
| set -eu -o pipefail |
| |
| source "$(dirname $0)/common.sh" |
| |
| # The version of protoc that will be installed. |
| PROTOC_VERSION="27.1" |
| |
| main() { |
| if [[ "$#" -ne 1 ]]; then |
| die "Usage: $0 INSTALL_PATH" |
| fi |
| |
| INSTALL_PATH="${1}" |
| |
| if [[ ! -d "${INSTALL_PATH}" ]]; then |
| die "INSTALL_PATH (${INSTALL_PATH}) does not exist." |
| fi |
| |
| echo "Installing protoc version $PROTOC_VERSION to ${INSTALL_PATH}..." |
| |
| # Detect the hardware platform. |
| case "$(uname -m)" in |
| "x86_64") ARCH="x86_64";; |
| "aarch64") ARCH="aarch_64";; |
| "arm64") ARCH="aarch_64";; |
| *) die "Install unsuccessful. Hardware platform not supported by installer: $1";; |
| esac |
| |
| # Detect the Operating System. |
| case "$(uname -s)" in |
| "Darwin") OS="osx";; |
| "Linux") OS="linux";; |
| *) die "Install unsuccessful. OS not supported by installer: $2";; |
| esac |
| |
| # Check if the protoc binary with the right version is already installed. |
| if [[ -f "${INSTALL_PATH}/bin/protoc" ]]; then |
| if [[ "$("${INSTALL_PATH}/bin/protoc" --version)" == "libprotoc ${PROTOC_VERSION}" ]]; then |
| echo "protoc version ${PROTOC_VERSION} is already installed in ${INSTALL_PATH}" |
| return |
| fi |
| fi |
| |
| DOWNLOAD_URL="https://github.com/protocolbuffers/protobuf/releases/download/v${PROTOC_VERSION}/protoc-${PROTOC_VERSION}-${OS}-${ARCH}.zip" |
| |
| # -L follows redirects. |
| # -O writes output to a file. |
| curl -LO "${DOWNLOAD_URL}" |
| |
| # Unzip the downloaded file and except readme.txt. |
| # The file structure should look like: |
| # INSTALL_PATH |
| # ├── bin |
| # │ └── protoc |
| # └── include |
| # └── other files... |
| unzip "protoc-${PROTOC_VERSION}-${OS}-${ARCH}.zip" -d "${INSTALL_PATH}" -x "readme.txt" |
| rm "protoc-${PROTOC_VERSION}-${OS}-${ARCH}.zip" |
| |
| # Make the protoc binary executable. ¯\_(ツ)_/¯ crazy, right? |
| chmod +x "${INSTALL_PATH}/bin/protoc" |
| } |
| |
| main "$@" |