diff --git a/tools/codegen/core/gen_load_balancing_proto.sh b/tools/codegen/core/gen_nano_proto.sh similarity index 78% rename from tools/codegen/core/gen_load_balancing_proto.sh rename to tools/codegen/core/gen_nano_proto.sh index 339da0a7339..e2d2f672e93 100755 --- a/tools/codegen/core/gen_load_balancing_proto.sh +++ b/tools/codegen/core/gen_nano_proto.sh @@ -31,8 +31,16 @@ # # Example usage: -# tools/codegen/core/gen_load_balancing_proto.sh \ +# tools/codegen/core/gen_nano_proto.sh \ # src/proto/grpc/lb/v0/load_balancer.proto +# $PWD/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0 +# +# Exit statuses: +# 1: Incorrect number of arguments +# 2: Input proto file (1st argument) doesn't exist or is not a regular file. +# 3: Options file for nanopb not found in same dir as the input proto file. +# 4: Output dir not an absolute path. +# 5: Couldn't create output directory (2nd argument). read -r -d '' COPYRIGHT <<'EOF' /* @@ -75,34 +83,37 @@ COPYRIGHT_FILE=$(mktemp) echo "${COPYRIGHT//$CURRENT_YEAR}" > $COPYRIGHT_FILE set -ex -if [ $# -eq 0 ]; then - echo "Usage: $0 [output dir]" +if [ $# -lt 2 ] || [ $# -gt 3 ]; then + echo "Usage: $0 [grpc path]" exit 1 fi -readonly GRPC_ROOT=$PWD - -OUTPUT_DIR="$GRPC_ROOT/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0" -if [ $# -eq 2 ]; then - mkdir -p "$2" - if [ $? != 0 ]; then - echo "Error creating output directory $2" - exit 2 - fi - OUTPUT_DIR="$2" -fi - +readonly GRPC_ROOT="$PWD" +readonly INPUT_PROTO="$1" +readonly OUTPUT_DIR="$2" +readonly GRPC_OUTPUT_DIR="${3:-$OUTPUT_DIR}" readonly EXPECTED_OPTIONS_FILE_PATH="${1%.*}.options" -if [[ ! -f "$1" ]]; then - echo "Input proto file '$1' doesn't exist." - exit 3 +if [[ ! -f "$INPUT_PROTO" ]]; then + echo "Input proto file '$INPUT_PROTO' doesn't exist." + exit 2 fi if [[ ! -f "${EXPECTED_OPTIONS_FILE_PATH}" ]]; then echo "Expected nanopb options file '${EXPECTED_OPTIONS_FILE_PATH}' missing" + exit 3 +fi + +if [[ "${OUTPUT_DIR:0:1}" != '/' ]]; then + echo "The output directory must be an absolute path. Got '$OUTPUT_DIR'" exit 4 fi +mkdir -p "$OUTPUT_DIR" +if [ $? != 0 ]; then + echo "Error creating output directory $OUTPUT_DIR" + exit 5 +fi + readonly VENV_DIR=$(mktemp -d) readonly VENV_NAME="nanopb-$(date '+%Y%m%d_%H%M%S_%N')" pushd $VENV_DIR @@ -114,16 +125,16 @@ popd # ideally we'd update this as a template to ensure that pip install protobuf==3.0.0b2 -pushd "$(dirname $1)" > /dev/null +pushd "$(dirname $INPUT_PROTO)" > /dev/null protoc \ --plugin=protoc-gen-nanopb="$GRPC_ROOT/third_party/nanopb/generator/protoc-gen-nanopb" \ --nanopb_out='-T -L#include\ \"third_party/nanopb/pb.h\"'":$OUTPUT_DIR" \ -"$(basename $1)" +"$(basename $INPUT_PROTO)" -readonly PROTO_BASENAME=$(basename $1 .proto) -sed -i "s:$PROTO_BASENAME.pb.h:src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0/$PROTO_BASENAME.pb.h:g" \ - "$OUTPUT_DIR/$PROTO_BASENAME.pb.c" +readonly PROTO_BASENAME=$(basename $INPUT_PROTO .proto) +sed -i "s:$PROTO_BASENAME.pb.h:${GRPC_OUTPUT_DIR}/$PROTO_BASENAME.pb.h:g" \ + "$OUTPUT_DIR/$PROTO_BASENAME.pb.c" # prepend copyright TMPFILE=$(mktemp) diff --git a/tools/distrib/check_nanopb_output.sh b/tools/distrib/check_nanopb_output.sh index 4f68e4c596f..92cb8ecbb49 100755 --- a/tools/distrib/check_nanopb_output.sh +++ b/tools/distrib/check_nanopb_output.sh @@ -31,36 +31,42 @@ set -ex readonly NANOPB_TMP_OUTPUT="$(mktemp -d)" +readonly PROTOBUF_INSTALL_PREFIX="$(mktemp -d)" # install protoc version 3 pushd third_party/protobuf ./autogen.sh -./configure +./configure --prefix="$PROTOBUF_INSTALL_PREFIX" make make install -ldconfig +#ldconfig popd -if [ ! -x "/usr/local/bin/protoc" ]; then - echo "Error: protoc not found in path" +readonly PROTOC_BIN_PATH="$PROTOBUF_INSTALL_PREFIX/bin" +if [ ! -x "$PROTOBUF_INSTALL_PREFIX/bin/protoc" ]; then + echo "Error: protoc not found in temp install dir '$PROTOBUF_INSTALL_PREFIX'" exit 1 fi -readonly PROTOC_PATH='/usr/local/bin' + # stack up and change to nanopb's proto generator directory pushd third_party/nanopb/generator/proto -PATH="$PROTOC_PATH:$PATH" make - +export PATH="$PROTOC_BIN_PATH:$PATH" +make # back to the root directory popd - +# +# Checks for load_balancer.proto +# +readonly LOAD_BALANCER_GRPC_OUTPUT_PATH='src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0' # nanopb-compile the proto to a temp location -PATH="$PROTOC_PATH:$PATH" ./tools/codegen/core/gen_load_balancing_proto.sh \ +./tools/codegen/core/gen_nano_proto.sh \ src/proto/grpc/lb/v0/load_balancer.proto \ - $NANOPB_TMP_OUTPUT + "$NANOPB_TMP_OUTPUT" \ + "$LOAD_BALANCER_GRPC_OUTPUT_PATH" # compare outputs to checked compiled code if ! diff -r $NANOPB_TMP_OUTPUT src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0; then - echo "Outputs differ: $NANOPB_TMP_OUTPUT vs src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0" + echo "Outputs differ: $NANOPB_TMP_OUTPUT vs $LOAD_BALANCER_GRPC_OUTPUT_PATH" exit 2 fi