| #! /bin/sh |
| # Copyright 2016 The Bazel Authors. All rights reserved. |
| # |
| # 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. |
| |
| # List of environment variables that must be defined as input. |
| # |
| # We use environment variables instead of positional arguments or flags for |
| # clarity in the caller .bzl file and for simplicity of processing. There is no |
| # need to implement a full-blown argument parser for this simple script. |
| INPUT_VARS="JAR OUTPUT PREPROCESSOR PROTO_COMPILER SOURCE" |
| |
| # Now set defaults for optional input variables. |
| : "${PREPROCESSOR:=cat}" |
| |
| # Basename of the script for error reporting purposes. |
| PROGRAM_NAME="${0##*/}" |
| |
| # A timestamp to mark all generated files with to get deterministic JAR outputs. |
| TIMESTAMP=198001010000 |
| |
| # Prints an error and exits. |
| # |
| # Args: |
| # ...: list(str). Parts of the message to print; all of them are joined |
| # with a single space in between. |
| err() { |
| echo "${PROGRAM_NAME}: ${*}" 1>&2 |
| exit 1 |
| } |
| |
| # Entry point. |
| main() { |
| [ ${#} -eq 0 ] || err "No arguments allowed; set the following environment" \ |
| "variables for configuration instead: ${INPUT_VARS}" |
| for var in ${INPUT_VARS}; do |
| local value |
| eval "value=\"\$${var}\"" |
| [ -n "${value}" ] || err "Input environment variable ${var} is not set" |
| done |
| |
| rm -f "${OUTPUT}" |
| |
| local proto_output="${OUTPUT}.proto_output" |
| rm -rf "${proto_output}" |
| mkdir -p "${proto_output}" |
| |
| # Apply desired preprocessing to the input proto file. For this to work, we |
| # must maintain the name of the original .proto file or else the generated |
| # classes in the JAR file would have an invalid name. |
| local processed_dir="${OUTPUT}.preprocessed" |
| rm -rf "${processed_dir}" |
| mkdir -p "${processed_dir}" |
| local processed_source="${processed_dir}/$(basename "${SOURCE}")" |
| "${PREPROCESSOR}" <"${SOURCE}" >"${processed_source}" \ |
| || err "Preprocessor ${PREPROCESSOR} failed" |
| |
| if [ -n "${GRPC_JAVA_PLUGIN}" ]; then |
| "${PROTO_COMPILER}" --plugin=protoc-gen-grpc="${GRPC_JAVA_PLUGIN}" \ |
| --grpc_out="${proto_output}" --java_out="${proto_output}" "${processed_source}" \ |
| || err "proto_compiler failed" |
| else |
| "${PROTO_COMPILER}" --java_out="${proto_output}" "${processed_source}" \ |
| || err "proto_compiler failed" |
| fi |
| find "${proto_output}" -exec touch -t "${TIMESTAMP}" '{}' \; \ |
| || err "Failed to reset timestamps" |
| "${JAR}" cMf "${OUTPUT}.tmp" -C "${proto_output}" . \ |
| || err "jar failed" |
| mv "${OUTPUT}.tmp" "${OUTPUT}" |
| } |
| |
| main "${@}" |