| # -*- makefile -*- |
| # ----------------------------------------------------------------------- |
| # Copyright 2019-2023 Open Networking Foundation (ONF) and the ONF Contributors |
| # |
| # 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. |
| # ----------------------------------------------------------------------- |
| |
| $(if $(DEBUG),$(warning ENTER)) |
| |
| .PHONY: test |
| .DEFAULT_GOAL := test |
| MAKECMDGOALS ?= test |
| |
| ##-------------------## |
| ##---] GLOBALS [---## |
| ##-------------------## |
| $(if $(findstring joey,$(USER)),\ |
| $(eval USE_LF_MK := 1)) # special snowflake |
| |
| ##--------------------## |
| ##---] INCLUDES [---## |
| ##--------------------## |
| ifdef USE_LF_MK |
| include lf/include.mk |
| else |
| include lf/transition.mk |
| include $(legacy-mk)/include.mk |
| endif # ifdef USE_LF_MK |
| |
| |
| ##-------------------------- |
| ## Enable setup.py debugging |
| ##-------------------------- |
| # https://docs.python.org/3/distutils/setupscript.html#debugging-the-setup-script |
| # export DISTUTILS_DEBUG := 1 # verbose: pip |
| export DOCKER_DEBUG := 1 # verbose: docker |
| |
| # 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 |
| |
| # ----------------------------------------------------------------------- |
| # Function to extract the last path component from package line in .proto files |
| # % grep 'package' will match: |
| # o package <name> ; |
| # o option java_package='<dot-pkg-fqdn> |
| # ----------------------------------------------------------------------- |
| # RETURN: protos/voltha_protos/common.proto => common |
| # ----------------------------------------------------------------------- |
| define java_package_path |
| $(shell grep package $(1) | sed -n 's/.*\/\(.*\)";/\1/p') |
| endef |
| |
| # Variables |
| 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))) |
| PROTO_JAVA_DEST_DIR := java |
| PROTO_JAVA_PB := $(foreach f, $(PROTO_FILES), $(patsubst protos/voltha_protos/%.proto,$(PROTO_JAVA_DEST_DIR)/$(call java_package_path,$(f))/%.pb.java,$(f))) |
| |
| # ----------------------------------------------------------------------- |
| # Force pb file to be regenerated every time. Otherwise the make process |
| # assumes generated version is still valid. |
| # ----------------------------------------------------------------------- |
| # [TODO] |
| # - Revisit: fix target to be dependency driven. |
| # - When source not modified make "voltha.pb" behavior always a NOP |
| # ----------------------------------------------------------------------- |
| .PHONY: voltha.pb |
| |
| ##----------------## |
| ##---] DEPS [---## |
| ##----------------## |
| infra-deps := $(null) |
| infra-deps += Makefile |
| infra-deps += $(venv-activate-script) |
| |
| ## ----------------------------------------------------------------------- |
| ## ----------------------------------------------------------------------- |
| print: |
| @echo "Proto files: $(PROTO_FILES)" |
| @echo "Python PB2 files: $(PROTO_PYTHON_PB2)" |
| @echo "Go PB files: $(PROTO_GO_PB)" |
| @echo "JAVA PB files: $(PROTO_JAVA_PB)" |
| |
| # Generic targets |
| protos: python-protos go-protos java-protos |
| |
| build: protos python-build go-protos java-protos |
| |
| test: python-test go-test java-test |
| |
| clean :: python-clean java-clean go-clean |
| |
| sterile :: clean |
| |
| ## ----------------------------------------------------------------------- |
| ## Python targets |
| ## ----------------------------------------------------------------------- |
| python-protos: $(infra-deps) $(PROTO_PYTHON_PB2) |
| |
| ## ----------------------------------------------------------------------- |
| ## ----------------------------------------------------------------------- |
| $(PROTO_PYTHON_DEST_DIR)/%_pb2.py: \ |
| protos/voltha_protos/%.proto \ |
| Makefile \ |
| $(venv-activate-script) |
| |
| @echo |
| @echo "** -----------------------------------------------------------------------" |
| @echo "** $(MAKE): processing target [$@]" |
| @echo "** -----------------------------------------------------------------------" |
| |
| $(activate) && 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 \ |
| $< |
| |
| ## ----------------------------------------------------------------------- |
| ## Intent: |
| ## ----------------------------------------------------------------------- |
| show: |
| $(call banner-enter,target $@) |
| @echo |
| $(call banner-leave,target $@) |
| |
| ## ----------------------------------------------------------------------- |
| ## Intent: |
| ## ----------------------------------------------------------------------- |
| python-build: setup.py python-protos |
| |
| $(call banner-enter,target $@) |
| |
| $(RM) -r dist/ |
| python ./setup.py sdist |
| |
| $(call banner-leave,target $@) |
| |
| ## ----------------------------------------------------------------------- |
| ## Intent: Invoke tox to install a python interpreter then run tests. |
| ## ----------------------------------------------------------------------- |
| ## See Also: |
| ## o https://tox.wiki/en/latest/cli_interface.html#tox-verbosity |
| ## every -v increases, every -q decreases verbosity level, |
| ## default WARNING (level:2) |
| ## map 0=CRITICAL|1=ERROR|2=WARNING|3=INFO|4=DEBUG|5=NOTSET |
| ## ----------------------------------------------------------------------- |
| python-test: tox.ini setup.py python-protos |
| $(call banner-enter,target $@) |
| |
| $(activate) && python --version |
| tox -vvv |
| |
| $(call banner-leave,target $@) |
| |
| ## ----------------------------------------------------------------------- |
| ## Intent: |
| ## ----------------------------------------------------------------------- |
| python-clean: |
| find python -name '__pycache__' -type d -print0 \ |
| | xargs -0 --no-run-if-empty $(RM) -r |
| find python -name '*.pyc' -type f -print0 \ |
| | xargs -0 --no-run-if-empty $(RM) |
| $(RM) -r \ |
| .coverage \ |
| .tox \ |
| coverage.xml \ |
| dist \ |
| nose2-results.xml \ |
| python/__pycache__ \ |
| python/test/__pycache__ \ |
| python/voltha_protos.egg-info \ |
| "$(venv-abs-path)" \ |
| $(PROTO_PYTHON_DEST_DIR)/*.desc \ |
| $(PROTO_PYTHON_PB2) \ |
| $(PROTO_PYTHON_PB2_GRPC) |
| |
| ## ----------------------------------------------------------------------- |
| ## Intent: Revert go to a clean state. |
| ## o TODO - go/ directory should not be placed under revision control. |
| ## o Build should retrieve versioned sources from a central repo. |
| ## ----------------------------------------------------------------------- |
| go-clean: |
| $(RM) -r go/* |
| $(HIDE)$(MAKE) repair |
| |
| ## ----------------------------------------------------------------------- |
| ## Intent: Recover from a fatal failed build state: |
| ## o build removes go/ while regenerating prototypes. |
| ## o chicken-n-egg: make becomes fatal when go/ is removed and proten fails. |
| ## ----------------------------------------------------------------------- |
| repair: |
| /usr/bin/env git checkout go |
| |
| ## ----------------------------------------------------------------------- |
| ## Intent: Go targets |
| ## ----------------------------------------------------------------------- |
| go-protos: voltha.pb |
| |
| $(call banner-enter,target $@) |
| @echo "** Creating *.go.pb files" |
| |
| $(if $(LOCAL_FIX_PERMS),chmod -R o+w $(PROTO_GO_DEST_DIR)) |
| |
| ${PROTOC_SH} $(quote-double)\ |
| set -e -o pipefail; \ |
| for x in ${PROTO_FILES}; do \ |
| echo \$$x; \ |
| protoc --go_out=plugins=grpc:/go/src -I protos \$$x; \ |
| done\ |
| $(quote-double) |
| |
| $(if $(LOCAL_FIX_PERMS),chmod -R o-w $(PROTO_GO_DEST_DIR)) |
| |
| $(call banner-leave,target $@) |
| |
| ## ----------------------------------------------------------------------- |
| ## Intent: Regenerate voltha.pb |
| ## ---------------------------------------------------------------------- |
| voltha-pb += show-proto-files |
| voltha-pb += docker-debug-joey |
| |
| voltha.pb: $(voltha-pb) |
| $(call banner-enter,target $@) |
| |
| ${PROTOC} \ |
| -I protos \ |
| -I protos/google/api \ |
| --include_imports \ |
| --include_source_info \ |
| --descriptor_set_out=$@ \ |
| ${PROTO_FILES} |
| |
| $(call banner-leave,target $@) |
| |
| ## ----------------------------------------------------------------------- |
| ## Intent: |
| ## ----------------------------------------------------------------------- |
| go-test: |
| $(call banner-enter,target $@) |
| |
| test/test-go-proto-consistency.sh |
| ${GO} mod verify |
| |
| $(call banner-leave,target $@) |
| |
| ## ----------------------------------------------------------------------- |
| ## Intent: Java targets |
| ## ----------------------------------------------------------------------- |
| |
| java-protos-dirs += java_temp/src/main/java |
| java-protos-dirs += java_temp/src/main/java/org |
| # local docker problem |
| java-protos-dirs += java_temp/src/main/java/org/opencord/voltha/adapter |
| java-protos-dirs += java_temp/src/main/java/org/opencord/voltha/adapter_service |
| |
| mkdir-args += -vp |
| |
| java-protos: voltha.pb |
| |
| $(call banner-enter,target $@) |
| |
| mkdir $(mkdir-args) $(java-protos-dirs) |
| |
| $(docker-sh) $(quote-double) find $(java-protos-dirs) -print0 \ |
| | xargs -0 -n1 /bin/ls -ld $(quote-double) |
| |
| $(if $(LOCAL_FIX_PERMS),chmod -R o+w java_temp) |
| @${PROTOC_SH} $(quote-double) \ |
| set -e -o pipefail; \ |
| for x in ${PROTO_FILES}; do \ |
| echo \$$x; \ |
| protoc --java_out=java_temp/src/main/java -I protos \$$x; \ |
| done\ |
| $(quote-double) |
| $(if $(LOCAL_FIX_PERMS),chmod -R o-w java_temp) |
| |
| # Move files into place after all prototypes have generated. |
| # TODO: Remove the extra step, use makefile deps and |
| # generate in-place as needed. |
| @mkdir -p java |
| rsync -r --checksum java_temp/src/main/java/. java/. |
| |
| $(call banner-leave,target $@) |
| |
| ## ----------------------------------------------------------------------- |
| ## Intent: Tests if the generated java classes are compilable |
| ## ----------------------------------------------------------------------- |
| java-test: java-protos |
| cp test/pom.xml java_temp |
| cd java_temp && mvn compile |
| |
| ## ----------------------------------------------------------------------- |
| ## Intent: Custodial service |
| ## ----------------------------------------------------------------------- |
| java-clean: |
| $(RM) -r java |
| $(RM) -r java_temp |
| |
| ## ----------------------------------------------------------------------- |
| ## Intent: Placeholder for library targets |
| ## ----------------------------------------------------------------------- |
| lint : |
| |
| ## ----------------------------------------------------------------------- |
| ## Intent: Make sterile is unrecoverable due to handling of java_temp |
| ## ----------------------------------------------------------------------- |
| protos-clean: |
| $(MAKE) sterile |
| $(MAKE) build |
| $(MAKE) protos |
| $(MAKE) test |
| |
| ## ----------------------------------------------------------------------- |
| ## Intent: Display/debug targets |
| ## ----------------------------------------------------------------------- |
| .PHONY: show-proto-files |
| show-proto-files: |
| |
| $(call banner-enter,Target $@) |
| @echo -e "PROTO_FILES:\n$(PROTO_FILES)" | tr ' ' '\n' |
| $(call banner-leave,Target $@) |
| |
| ## ----------------------------------------------------------------------- |
| ## Intent: Debug mode |
| ## - New image not logging ssh connections while job is running (?!?) |
| ## - We should be on label=voltha-1804-micro. |
| ## - Let(s) see what the reality is while checking configs. |
| ## ----------------------------------------------------------------------- |
| .PHONY: docker-debug-joey |
| docker-debug-joey: |
| |
| $(call banner-enter,Target $@) |
| ip --brief addr |
| $(call banner-leave,Target $@) |
| |
| # [EOF] |