# -*- 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

# 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
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

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: $(PROTO_PYTHON_PB2)

## -----------------------------------------------------------------------
## -----------------------------------------------------------------------
$(PROTO_PYTHON_DEST_DIR)/%_pb2.py: \
  protos/voltha_protos/%.proto \
  Makefile \
  $(venv-activate-script)
	$(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 \
    $<

python-build: setup.py python-protos
	$(RM) -r dist/
	python ./setup.py sdist

python-test: tox.ini setup.py python-protos
	tox

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


# Go targets
go-protos: voltha.pb
	@echo "Creating *.go.pb files"
	@echo "PROTO_FILES=$(PROTO_FILES)" | tr ' ' '\n'
	${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)

voltha.pb:
	@echo "Creating $@"
	$(HIDE)${PROTOC} -I protos -I protos/google/api \
	  --include_imports --include_source_info \
	  --descriptor_set_out=$@ \
	  ${PROTO_FILES}

go-test:
	test/test-go-proto-consistency.sh
	${GO} mod verify

# Java targets
java-protos: voltha.pb
	@echo "Creating java files"
	@mkdir -p java_temp/src/main/java
	@${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)
        #TODO: generate directly to the final location
	@mkdir -p java
	cp -r java_temp/src/main/java/* java/

# Tests if the generated java classes are compilable
java-test: java-protos
	cp test/pom.xml java_temp
	cd java_temp && mvn compile

java-clean:
	$(RM) -r java
	$(RM) -r java_temp

# placeholder for library targets
lint :

# [EOF]
