[VOL-1460]
Build Go stubs using the Makefile, instead of in a separate script.
New method is independent of GOPATH (which makes testing easier), and is
'go_package' aware, so any new .proto files will have directories
created and regenerated under go/
Cleaned up README.md and Makefile
Lexically sort input to protoc as --descriptor_set_out differs depending
on the order of file arguments passed to it.
Released v0.1.2
Change-Id: If9d5aabc89b4d73f3e069b01b38bd0bf8d1b3c43
diff --git a/Makefile b/Makefile
index f83e7e2..1eea24f 100644
--- a/Makefile
+++ b/Makefile
@@ -15,11 +15,22 @@
# Makefile for voltha-protos
default: test
+# set default shell options
+SHELL = bash -e -o pipefail
+
+# Function to extract the last path component from go_package line in .proto files
+define go_package_path
+$(shell grep go_package $(1) | sed -n 's/.*\/\(.*\)";/\1/p')
+endef
+
# Variables
-PROTO_FILES := $(wildcard protos/voltha_protos/*.proto)
+PROTO_FILES := $(sort $(wildcard protos/voltha_protos/*.proto))
+
PROTO_PYTHON_DEST_DIR := python/voltha_protos
PROTO_PYTHON_PB2 := $(foreach f, $(PROTO_FILES), $(patsubst protos/voltha_protos/%.proto,$(PROTO_PYTHON_DEST_DIR)/%_pb2.py,$(f)))
PROTO_PYTHON_PB2_GRPC := $(foreach f, $(PROTO_FILES), $(patsubst protos/voltha_protos/%.proto,$(PROTO_PYTHON_DEST_DIR)/%_pb2_grpc.py,$(f)))
+PROTO_GO_DEST_DIR := go
+PROTO_GO_PB:= $(foreach f, $(PROTO_FILES), $(patsubst protos/voltha_protos/%.proto,$(PROTO_GO_DEST_DIR)/$(call go_package_path,$(f))/%.pb.go,$(f)))
PROTOC_PREFIX := /usr/local
PROTOC_VERSION := "3.7.0"
@@ -30,11 +41,9 @@
PROTOC_BUILD_TMP_DIR := "/tmp/protobuf-build-$(shell uname -s | tr '[:upper:]' '[:lower:]')"
print:
- echo "Proto files: $(PROTO_FILES)"
- echo "Python PB2 files: $(PROTO_PYTHON_PB2)"
-
-# set default shell
-SHELL = bash -e -o pipefail
+ @echo "Proto files: $(PROTO_FILES)"
+ @echo "Python PB2 files: $(PROTO_PYTHON_PB2)"
+ @echo "Go PB files: $(PROTO_GO_PB)"
# Generic targets
protos: python-protos go-protos
@@ -56,30 +65,40 @@
$(PROTO_PYTHON_DEST_DIR)/%_pb2.py: protos/voltha_protos/%.proto Makefile venv_protos
source ./venv_protos/bin/activate ; set -u ;\
python -m grpc_tools.protoc \
- -I protos \
- --python_out=python \
- --grpc_python_out=python \
- --descriptor_set_out=$(PROTO_PYTHON_DEST_DIR)/$(basename $(notdir $<)).desc \
- --include_imports \
- --include_source_info \
- $<
+ -I protos \
+ --python_out=python \
+ --grpc_python_out=python \
+ --descriptor_set_out=$(PROTO_PYTHON_DEST_DIR)/$(basename $(notdir $<)).desc \
+ --include_imports \
+ --include_source_info \
+ $<
-python-build: setup.py
+python-build: setup.py python-protos
python ./setup.py sdist
python-test: tox.ini setup.py python-protos
tox
python-clean:
- rm -rf venv_protos .coverage coverage.xml nose2-results.xml dist $(PROTO_PYTHON_PB2) $(PROTO_PYTHON_PB2_GRPC) $(PROTO_PYTHON_DEST_DIR)/*.desc
find python/ -name '*.pyc' | xargs rm -f
- rm -rf python/voltha_protos.egg-info
- rm -rf .tox
- rm -rf python/__pycache__/
- rm -rf python/test/__pycache__/
+ rm -rf \
+ .coverage \
+ .tox \
+ coverage.xml \
+ dist \
+ nose2-results.xml \
+ python/__pycache__ \
+ python/test/__pycache__ \
+ python/voltha_protos.egg-info \
+ venv_protos \
+ $(PROTO_PYTHON_DEST_DIR)/*.desc \
+ $(PROTO_PYTHON_PB2) \
+ $(PROTO_PYTHON_PB2_GRPC)
# Go targets
-go-protos:
+go-protos: protoc_check_version $(PROTO_GO_PB) go/voltha.pb
+
+protoc_check_version:
ifeq ("", "$(shell which protoc)")
@echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
@echo "It looks like you don't have a version of protocol buffer tools."
@@ -88,13 +107,30 @@
@echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
exit 1
endif
- ./build_go_protos.sh protos
+
+go_temp:
+ mkdir -p go_temp
+
+$(PROTO_GO_PB): $(PROTO_FILES) go_temp
+ @echo "Creating $@"
+ cd protos && protoc \
+ --go_out=MAPS=Mgoogle/protobuf/descriptor.proto=github.com/golang/protobuf/protoc-gen-go/descriptor,plugins=grpc,paths=source_relative:../go_temp \
+ -I . voltha_protos/$$(echo $@ | sed -n 's/.*\/\(.*\).pb.go/\1.proto/p' )
+ mkdir -p $(dir $@)
+ mv go_temp/voltha_protos/$(notdir $@) $@
+
+go/voltha.pb: ${PROTO_FILES}
+ @echo "Creating $@"
+ protoc -I protos -I protos/google/api \
+ --include_imports --include_source_info \
+ --descriptor_set_out=$@ \
+ ${PROTO_FILES}
go-test:
ifneq ("libprotoc 3.7.0", "$(shell protoc --version)")
@echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
@echo "It looks like you don't have protocol buffer tools ${PROTOC_VERSION} installed."
->---@echo "To install this version, you can run:"
+ @echo "To install this version, you can run:"
@echo " make install-protoc"
@echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
exit 1
@@ -102,7 +138,7 @@
test/test-go-proto-consistency.sh
go-clean:
- echo "FIXME: Add golang cleanup"
+ rm -rf go_temp
install-protoc:
@echo "Downloading and installing protocol buffer support."
@@ -111,11 +147,11 @@
mkdir -p $(PROTOC_BUILD_TMP_DIR)
@echo "We ask for sudo credentials now so we can install at the end"; \
sudo echo "Thanks"; \
- cd $(PROTOC_BUILD_TMP_DIR); \
- wget $(PROTOC_DOWNLOAD_URI); \
- tar xzvf $(PROTOC_TARBALL); \
- cd $(PROTOC_DIR); \
- ./configure --prefix=$(PROTOC_PREFIX); \
- make; \
- sudo make install; \
- sudo ldconfig
+ cd $(PROTOC_BUILD_TMP_DIR); \
+ wget $(PROTOC_DOWNLOAD_URI); \
+ tar xzvf $(PROTOC_TARBALL); \
+ cd $(PROTOC_DIR); \
+ ./configure --prefix=$(PROTOC_PREFIX); \
+ make; \
+ sudo make install; \
+ sudo ldconfig