# -*- makefile -*-
# -----------------------------------------------------------------------
# Copyright 2023-2024 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.
# -----------------------------------------------------------------------
# https://gerrit.opencord.org/plugins/gitiles/onf-make
# ONF.makefiles.include.version = 1.1
# ONF.confg.mk                  = 1.5
# -----------------------------------------------------------------------

--repo-name-- := ci-management
--repo-name-- ?= $(error --repo-name--= is required)

##--------------------------------##
##---]  Disable lint targets  [---##
##--------------------------------##
# NO-LINT-DOC8      := true
# NO-LINT-GOLANG    := true
NO-LINT-GROOVY      := true#               # Note[1]
# NO-LINT-JJB       := true#               # Note[2]
# NO-LINT-JSON      := true#               # Note[1]
NO-LINT-MAKEFILE    := true#               # Note[1]
NO-LINT-REUSE       := true                # License check
NO-LINT-ROBOT       := true
NO-LINT-SHELL       := true#               # Note[1]
# NO-LINT-TOX       := true#               # Note[1]
NO-LINT-YAML        := true#               # Note[1]

# NO-LINT-FLAKE8    := true#               # Note[1]
NO-LINT-PYTHON      := true#               # Note[1]
# NO-LINT-PYLINT    := true#               # Note[1]

# Note[1] - A boatload of source to cleanup prior to enable.
# Note[2] - No sources available

##---------------------------------##
##---] Conditional make logic  [---##
##---------------------------------##
# USE-ONF-DOCKER-MK      := true
# USE-ONF-GERRIT-MK      := true
# USE-ONF-GIT-MK         := true
USE-ONF-JJB-MK           := true
# USE-VOLTHA-RELEASE-MK  := true

##----------------------##
##---]  Debug Mode  [---##
##----------------------##
# export DEBUG           := 1      # makefile debug
# export DISTUTILS_DEBUG := 1      # verbose: pip
# export DOCKER_DEBUG    := 1      # verbose: docker
# export VERBOSE         := 1      # makefile debug

##-----------------------------------##
##---]  JJB/Jenkins Job Builder  [---##
##-----------------------------------##
JJB_VERSION   ?= 3.2.0             # lint-from: jjb/ci-management/ci-management.yaml
JOBCONFIG_DIR ?= job-configs

##---------------------------------##
##---]  Filesystem exclusions  [---##
##---------------------------------##
onf-excl-dirs := $(null)        # make clean: dirs=
onf-excl-dirs += .venv#         # $(venv-name)
onf-excl-dirs += vendor#        # golang / voltha*-go
onf-excl-dirs += patches#       # voltha docs - python upgrade
onf-excl-dirs += .tox           # also a python dependency

ifeq ($(--repo-name--),voltha-docs)
  lint-doc8-excl += '_build'
endif

onf-excl-dirs ?= $(error onf-excl-dirs= is required)

##-----------------------------##
##---]  Feature Detection  [---##
##-----------------------------##
# [TODO] include makefiles/features/include.mk
# [TODO] All logic below can migrate there.

$(if $(filter %ci-management,$(--repo-name--)),\
  $(eval --REPO-IS-CI-MANAGEMENT-- := true)\
)
$(if $(filter %voltha-docs,$(--repo-name--)),\
  $(eval --REPO-IS-VOLTHA-DOCS-- := true)\
)

# create makefiles/config/byrepo/{--repo-name--}.mk for one-off snowflakes ?
# $(if $(wildcard docker),$(eval USE-ONF-DOCKER-MK := true))

##-------------------------##
##---]  Derived Flags  [---##
##-------------------------##
ifdef --REPO-IS-CI-MANAGEMENT--
  USE-ONF-JJB := true

  onf-excl-dirs += global-jjb
  onf-excl-dirs += lf-ansible
  onf-excl-dirs += packer
endif

ifdef --REPO-IS-VOLTHA-DOCS--
  onf-excl-dirs += _build
  onf-excl-dirs += repos
endif

ifdef NO-LINT-PYTHON
  NO-LINT-FLAKE8 := true
  NO-LINT-PYLINT := true
endif

ifndef USE-ONF-JJB
  NO-LINT-JJB := true
endif

onf-excl-dirs := $(sort $(strip $(onf-excl-dirs)))

# --------------------------------------------------------------------
# Repository specific values
# --------------------------------------------------------------------
sterile-dirs += archives

# submodules
# sterile-dirs += global-jjb
# sterile-dirs += lf-ansible
# sterile-dirs += packer

# [TODO]#
#  --------------------------------------------------------------------
#   o two distinct makefiles/ directories are needed, one for onf-make
#   o second for repository specific makefile configs and logic.
#   o Two independent vars specify path:
#       ONF_MAKEDIR = library makefiles
#       MAKEDIR     = repository specific content
#   o Conditional repository testing above can crush down all the
#     "if-this-repository-is-X-do-Y' logic above intoL
#     include $(MAKEDIR)/config.mk   # repo:$(--repo-name--)
#  --------------------------------------------------------------------

# [EOF]
