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