| #!/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 "$@" |