blob: 5cbd2b993fedc5939757cced8475c6507711ced5 [file] [log] [blame]
# -*- 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.
# -----------------------------------------------------------------------
.PHONY: test
.DEFAULT_GOAL := test
##-------------------##
##---] GLOBALS [---##
##-------------------##
TOP ?= .
MAKEDIR ?= $(TOP)/makefiles
$(if $(VERBOSE),$(eval export VERBOSE=$(VERBOSE))) # visible to include(s)
##--------------------------
## 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
# Makefile for voltha-protos
default: test
## Library linting
# NO-LINT-MAKEFILE := true # cleanup needed
NO-LINT-SHELL := true # cleanup needed
##--------------------##
##---] INCLUDES [---##
##--------------------##
include $(MAKEDIR)/include.mk
# 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 regenrated every time. Otherwise the make process assumes generated version is still valid
.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:
## ----------------------------------------------------------------------
voltha.pb: show-proto-files
$(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 $@)
# [EOF]