blob: 8bdfd2d6f33a45e48b5e1d33cfca271cc8fbbfe5 [file] [log] [blame]
#!/bin/bash
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you 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.
set -e
read -r -d '\0' LICENSE << EOM
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you 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.
\0
EOM
if [[ -z "$(which protoc)" ]]; then
echo "protoc not found on path"
exit 1
fi
SCRIPT_DIR="$( realpath "$( dirname "${BASH_SOURCE[0]}" )" )"
if [[ -z $SCRIPT_DIR ]]; then
echo "unable to resolve path to script"
exit 1
fi
SDK_PATH="$( realpath "$(dirname $SCRIPT_DIR)/.." )"
if [[ -z "$SDK_PATH" ]]; then
echo "unable to resolve path to project root"
exit 1
fi
PROJECT_ROOT="$(realpath "$(dirname $SCRIPT_DIR)/../..")"
if [[ -z "$PROJECT_ROOT" ]]; then
echo "unable to resolve path to project root"
exit 1
fi
if [[ -z "$(which go)" ]]; then
echo "go runtime missing"
exit 1
fi
if [[ -z "$GOBIN" ]]; then
export GOBIN="$(go env GOPATH)/bin"
fi
export PATH="$PATH:$GOBIN"
GEN_DIR=$PWD
# NB: Keep these two versions in sync with those defined in
# the go.mod.
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@ebf6a4b
go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.27.1
function insert_license_header() {
local depth="$1"
# protoc-gen-go-grpc does not yet output comments from the original
# proto file so we need to manually add the license header.
while IFS= read -d $'\0' -r file ; do
tmp_file=$(mktemp)
echo "$LICENSE" > $tmp_file
cat $file >> $tmp_file
mv $tmp_file $file
done < <(find $GEN_DIR $depth -iname "*grpc.pb.go" -print0)
}
function gen_go_sdk_protos() {
LIBRARY_PATH="${PWD##${SDK_PATH}/}"
PROTOS="$LIBRARY_PATH/*.proto"
cd "$SDK_PATH"
# TODO: make this more data driven.
PKG_MAP=Mbeam_fn_api.proto=github.com/apache/beam/sdks/go/pkg/beam/model/fnexecution_v1
declare -a TO_INC=(
"."
"$PROJECT_ROOT/model/job-management/src/main/proto/"
"$PROJECT_ROOT/model/pipeline/src/main/proto/"
"$PROJECT_ROOT/model/fn-execution/src/main/proto/"
)
declare -a INCLUDES=()
for package in "${TO_INC[@]}"
do
INCLUDES+=("-I${package}")
done
protoc \
"${INCLUDES[@]}" \
--go_opt=module=github.com/apache/beam/sdks/v2 \
--go-grpc_opt=module=github.com/apache/beam/sdks/v2 \
--go_out=$PKG_MAP:. \
--go-grpc_out=. \
$PROTOS
insert_license_header '-d 1'
}
function gen_beam_model_protos() {
cd "$PROJECT_ROOT"
declare -a TO_GEN=(
'model/job-management/src/main/proto/org/apache/beam/model/job_management/v1/*.proto'
'model/pipeline/src/main/proto/org/apache/beam/model/pipeline/v1/*.proto'
'model/fn-execution/src/main/proto/org/apache/beam/model/fn_execution/v1/*.proto'
)
declare -a INCLUDES=()
for package in "${TO_GEN[@]}"
do
INCLUDES+=("-I${package%/org*}")
done
for package in "${TO_GEN[@]}"
do
protoc \
"${INCLUDES[@]}" \
--go_opt=module=github.com/apache/beam/sdks/v2 \
--go-grpc_opt=module=github.com/apache/beam/sdks/v2 \
--go_out="$PROJECT_ROOT/sdks" \
--go-grpc_out="$PROJECT_ROOT/sdks" \
$package
done
insert_license_header
}
if [[ $1 == "model" ]]; then
gen_beam_model_protos
else
gen_go_sdk_protos
fi