[VOL-5051] - Triage bbsim build

[VOL-5092] - verify_bbsim_unit-test repository failures in jenkins job history.

makefiles/*
-----------
  o Merge in latest library makefiles.
  o Some legacy retained:
      tools.mk => makefiles/docker/include.mk
      makefiles/lint/docker/*.mk (replace with docker/include.mk.new)

Makefile
--------
  o Remove bogus foobar target.
  o Target docs-lint now maps to library target lint-doc8.

docs/Makefile
-------------
  o venv install now handled by makefiles/virtualenv.mk
  o Replaced inlined doc8 lint target with makefiles/lint/doc8 (lint-doc8)
  o Use std defines for SHELL= and other constants.
  o Replace separator ';' with '&&' in commands using venv (detect errors).

config.mk
---------
  o Enable lint targets for doc8, docker & json.
  o More lint checks can be enabled but cleanup is needed first.

docs/Makefile
requirements.txt
----------------
  o Identified a few python module problems documented in VOL-5092.
  o Makefile wild target(%) matching stray dependencies so hardcode sphinx targets to act on.
  o Added hyphen/success to "make docs" until VOL-5092 can be straightened out.

Change-Id: Ibe4006747ee610bfe8ac0fdbb339e5e18e6e9176
diff --git a/makefiles/bootstrap.mk b/makefiles/bootstrap.mk
new file mode 100644
index 0000000..eec469b
--- /dev/null
+++ b/makefiles/bootstrap.mk
@@ -0,0 +1,80 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Intent: Dependency-free macros used to source library makefiles
+#         and define the build environment.
+# -----------------------------------------------------------------------
+
+$(if $(DEBUG-bootstrap_mk),$(warning ENTER))
+
+##---------------------##
+##---]  CONSTANTS  [---##
+##---------------------##
+is-false = $(if $(1),true,$(null))
+is-true  = $(if $(1),$(null),true)
+
+##--------------------------##
+##---]  LIBRARY MACROS  [---##
+##--------------------------##
+is-null = $(if $(1),$(null),$(error $(1)= is undef))
+# is-null-var = $(if $($(1)),$(null),$(error $(1)= is undef))
+
+## [origin]
+## foreach: var=automatic, origin=undef
+is-null-var-orig = $(strip \
+  $(foreach varname,$(1),\
+      $(warning ** is-null-var: varname=$(varname), origin=$(origin 1), origin=$(origin var))\
+  )\
+)
+#  $(if $(1),$(call is-null-var-indirect,$($(1))),$(error $(1)= is undef)))\
+
+is-null-var-indirect = $(if $(1),$(null),$(error $(1)= is undef))
+
+# origin - undefned
+# default
+# environment
+# environment override
+# automatic
+# null(blah) ?   - true
+
+## -----------------------------------------------------------------------
+## Intent: Given an indirect var containing varname of a makefile *_ROOT
+##         parent director, derive a *_MKDIR variable and conditionally
+##         include the makefile hierarchy.
+## -----------------------------------------------------------------------
+## Given:
+##   o var containing OPT_ROOT=path
+## Return:
+##   o OPT_MKDIR=$(OPT_ROOT)/makefiles
+##   o If exists include $(OPT_MKDIR)/include.mk
+## -----------------------------------------------------------------------
+# library-include   := $(call mk-library-include,blah)
+
+mk-library-include=$(strip \
+  $(warning mk-library-include: $$1[$(1)] = [$($(1))]))\
+  $(call is-null-var,1)\
+  $(foreach var,$($(1)),\
+    $(info var=$(var) is-null=$(call is-null-var,var))\
+  $(foreach val,$$(var),\
+    $(info val=$(val))\
+    $(foreach makedir,$(subst _ROOT,_MKDIR,$(var)),\
+$(warning makedir=$(makedir))\
+)\
+)\
+)\
+)
+
+
+# $(warning makedir=$(makedir))\
+      $(if $($(makedir)),$(null),\
+        $(eval $(makedir)=$$$$($(var))/makefiles)\
+$(warning $(makedir) = $($($(makedir))))\
+$(info $$(wildcard $(val)/makefiles/include.mk) = $(wildcard $(val)/makefiles/include.mk))\
+        $(foreach mf,$(wildcard $(wildcard $(val)/makefiles/include.mk)),\
+$(warning $$(eval include $(mf)))\
+          $(eval include $(mf)))\
+))))\
+)
+
+$(if $(DEBUG-bootstrap_mk),$(warning LEAVE))
+
+# [EOF]
diff --git a/makefiles/commands/include.mk b/makefiles/commands/include.mk
new file mode 100644
index 0000000..01fa145
--- /dev/null
+++ b/makefiles/commands/include.mk
@@ -0,0 +1,36 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2022-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.
+#
+# SPDX-FileCopyrightText: 2022-2023 Open Networking Foundation (ONF) and the ONF Contributors
+# SPDX-License-Identifier: Apache-2.0
+# -----------------------------------------------------------------------
+# https://gerrit.opencord.org/plugins/gitiles/onf-make
+# ONF.makefile.version = 1.0
+# -----------------------------------------------------------------------
+
+ifndef mk-include--onf-commands
+
+$(if $(DEBUG),$(warning ENTER))
+
+include $(ONF_MAKEDIR)/commands/kail.mk
+
+$(if $(DEBUG),$(warning LEAVE))
+
+mk-include--onf-commands := true
+
+endif # mk-include--onf-make
+
+# [EOF]
diff --git a/makefiles/commands/kail.mk b/makefiles/commands/kail.mk
new file mode 100644
index 0000000..ff6691d
--- /dev/null
+++ b/makefiles/commands/kail.mk
@@ -0,0 +1,46 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2022-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.
+# -----------------------------------------------------------------------
+
+MAKEDIR ?= $(error MAKEDIR= is required)
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+help::
+	@echo "  kail            Install the kail command"
+ifdef VERBOSE
+	@echo "                  make kail KAIL_PATH="
+endif
+
+# -----------------------------------------------------------------------
+# Install the 'kail' tool if needed: https://github.com/boz/kail
+#   o WORKSPACE - jenkins aware
+#   o Default to /usr/local/bin/kail
+#       + revisit this, system directories should not be a default path.
+#       + requires sudo and potential exists for overwrite conflict.
+# -----------------------------------------------------------------------
+KAIL_PATH ?= $(if $(WORKSPACE),$(WORKSPACE)/bin,/usr/local/bin)
+kail-cmd  ?= $(KAIL_PATH)/kail
+$(kail-cmd):
+	etc/godownloader.sh -b .
+	rsync -v --checksum kail "$@"
+	$@ version
+	$(RM) kail
+
+.PHONY: kail
+kail : $(kail-cmd)
+
+# [EOF]
diff --git a/makefiles/consts.mk b/makefiles/consts.mk
index 941df38..f1f717f 100644
--- a/makefiles/consts.mk
+++ b/makefiles/consts.mk
@@ -17,6 +17,7 @@
 # SPDX-FileCopyrightText: 2022-2023 Open Networking Foundation (ONF) and the ONF Contributors
 # SPDX-License-Identifier: Apache-2.0
 # -----------------------------------------------------------------------
+# https://gerrit.opencord.org/plugins/gitiles/onf-make
 # ONF.makefile.version = 1.0
 # -----------------------------------------------------------------------
 
@@ -26,15 +27,26 @@
 export dot          :=.
 export null         :=#
 export space        := $(null) $(null)
-export quote-single := $(null)'$(null)# colorization-closing-quote(')
-export quote-double := $(null)"$(null)# colorization-closing-quote(")
+export quote-single := $(null)'$(null)#'
+export quote-double := $(null)"$(null)#"
 
 # [DEBUG] make {target} HIDE=
-HIDE        ?= @
+HIDE           ?= @
 
 env-clean      ?= /usr/bin/env --ignore-environment
-xargs-n1       := xargs -0 -t -n1 --no-run-if-empty
-xargs-n1-clean := $(env-clean) $(xargs-n1)
+
+xargs-cmd       := xargs -0 -t --no-run-if-empty
+xargs-n1        := $(xargs-cmd) -n1
+xargs-n1-clean  := $(env-clean) $(xargs-n1)
+xargs-cmd-clean := $(env-clean) $(xargs-cmd)
+
+## -----------------------------------------------------------------------
+## Intent: NOP command for targets whose dependencies do all heavy lifting
+## -----------------------------------------------------------------------
+## usage: foo bar tans
+## <tab>$(nop-command)
+## -----------------------------------------------------------------------
+nop-cmd        := :
 
 ## -----------------------------------------------------------------------
 ## Default shell:
diff --git a/makefiles/docker/include.mk b/makefiles/docker/include.mk
new file mode 100644
index 0000000..0e53629
--- /dev/null
+++ b/makefiles/docker/include.mk
@@ -0,0 +1,70 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2017-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.d
+# -----------------------------------------------------------------------
+
+$(if $(DEBUG),$(warning ENTER))
+
+VOLTHA_TOOLS_VERSION ?= 2.4.0
+
+# ---------------------------
+# Macros: command refactoring
+# ---------------------------
+docker-iam     ?= --user $$(id -u):$$(id -g)#          # override for local use
+docker-run     = docker run --rm $(docker-iam)#        # Docker command stem
+docker-run-is  = $(docker-run) $(is-stdin)             # Attach streams when interactive
+docker-run-app = $(docker-run-is) -v ${CURDIR}:/app#   # w/filesystem mount
+
+# -----------------------------------------------------------------------
+# --interactive: Attach streams when stdout (fh==0) defined
+# --tty        : Always create a pseudo-tty else jenkins:docker is silent
+# -----------------------------------------------------------------------
+is-stdin       = $(shell test -t 0 && { echo '--interactive'; })
+is-stdin       += --tty
+
+voltha-protos-v5 ?= /go/src/github.com/opencord/voltha-protos/v5
+
+# Docker volume mounts: container:/app/release <=> localhost:{pwd}/release
+vee-golang     = -v gocache-${VOLTHA_TOOLS_VERSION}:/go/pkg
+vee-citools    = voltha/voltha-ci-tools:${VOLTHA_TOOLS_VERSION}
+
+# ---------------
+# Tool Containers
+# ---------------
+docker-go-stem = $(docker-run-app) -v gocache:/.cache $(vee-golang) $(vee-citools)-golang
+
+# Usage: GO := $(call get-docker-go,./my.env.temp)
+get-docker-go = $(docker-go-stem) go
+GO            ?= $(call get-docker-go)
+
+# Usage: GO_SH := $(call get-docker-go-sh,./my.env.temp)
+get-docker-go-sh = $(docker-go-stem) $(if $(1),--env-file $(1)) sh -c
+GO_SH            ?= $(call get-docker-go-sh,./my.env.temp)
+
+# Usage: PROTOC := $(call get-docker-protoc)
+get-docker-protoc = $(docker-run-app) $(vee-citools)-protoc protoc
+PROTOC            ?= $(call get-docker-protoc)
+
+# get-docker-protoc-sh = $(strip )
+PROTOC_SH = $(docker-run-is)
+ifdef voltha-protos-v5
+   PROTOC_SH += -v ${CURDIR}:$(voltha-protos-v5)
+   PROTOC_SH += --workdir=$(voltha-protos-v5)
+endif
+PROTOC_SH += $(vee-citools)-protoc sh -c
+
+$(if $(DEBUG),$(warning LEAVE))
+
+# [EOF]
diff --git a/makefiles/etc/include.mk b/makefiles/etc/include.mk
new file mode 100644
index 0000000..10711f7
--- /dev/null
+++ b/makefiles/etc/include.mk
@@ -0,0 +1,56 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2017-2023 Open Networking Foundation
+#
+# 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.
+#
+# SPDX-FileCopyrightText: 2017-2023 Open Networking Foundation (ONF) and the ONF Contributors
+# SPDX-License-Identifier: Apache-2.0
+# -----------------------------------------------------------------------
+# Usage:
+#
+# mytarget:
+#     $(call banner-enter,target $@)
+#     @echo "Hello World"
+#     $(call banner-leave,target $@)
+# -----------------------------------------------------------------------
+
+$(if $(DEBUG),$(warning ENTER))
+
+target-banner = ** ---------------------------------------------------------------------------
+
+## -----------------------------------------------------------------------
+## Intent: Return a command line able to display a banner hilighting
+##         make target processing within a logfile.
+## -----------------------------------------------------------------------
+banner-enter=\
+    @echo -e \
+    "\n"\
+    "$(target-banner)\n"\
+    "** $(MAKE) ENTER: $(1)\n"\
+    "$(target-banner)"
+
+banner-leave=\
+    @echo -e "** $(MAKE) LEAVE: $(1)"
+
+## Usage:
+##    $(call banner,(message containing multiple tokens))
+banner=\
+    @echo -e \
+    "\n"\
+    "** $(1)\n"\
+    "$(target-banner)"\
+
+$(if $(DEBUG),$(warning LEAVE))
+
+# [EOF]
diff --git a/makefiles/etc/todo.mk b/makefiles/etc/todo.mk
new file mode 100644
index 0000000..31fc736
--- /dev/null
+++ b/makefiles/etc/todo.mk
@@ -0,0 +1,21 @@
+## -----------------------------------------------------------------------
+## Intent: Cast value into a boolean string.
+## NOTE: : Careful with line comment placement, when octolthorp is indented
+##         in a makefile return value will have whitespace appended.
+## -----------------------------------------------------------------------
+boolean = $(if $(strip $($(1))),false,true)# trailing whitespace is bad here
+
+## -----------------------------------------------------------------------
+## Intet: Negate input value for conditional use.
+##   Return success when input value is null.
+## Usage:
+##   $(info ** defined[true]  = $(call not,value))
+##   $(info ** defined[false] = $(call not,$(null)))
+##   $(if $(call not,varname),$(error varname= is not set))
+## -----------------------------------------------------------------------
+not = $(strip \
+  $(foreach true-false\
+    ,$(info true-false=$(true-false))$(strip $(call boolean,$(1)))\
+      $(subst true,$(null),$(true-false))\
+  )\
+)
diff --git a/makefiles/golang/include.mk b/makefiles/golang/include.mk
new file mode 100644
index 0000000..1ce3d7f
--- /dev/null
+++ b/makefiles/golang/include.mk
@@ -0,0 +1,26 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 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.
+# -----------------------------------------------------------------------
+# SPDX-FileCopyrightText: 2017-2023 Open Networking Foundation (ONF) and the ONF Contributors
+# SPDX-License-Identifier: Apache-2.0
+# -----------------------------------------------------------------------
+# https://gerrit.opencord.org/plugins/gitiles/onf-make
+# ONF.makefiles.include.version = 1.1
+# -----------------------------------------------------------------------
+
+include $(ONF_MAKEDIR)/golang/mod-update.mk
+
+# [EOF]
diff --git a/makefiles/golang/mod-update.mk b/makefiles/golang/mod-update.mk
new file mode 100644
index 0000000..5212a47
--- /dev/null
+++ b/makefiles/golang/mod-update.mk
@@ -0,0 +1,60 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2017-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.
+# -----------------------------------------------------------------------
+# SPDX-FileCopyrightText: 2017-2023 Open Networking Foundation (ONF) and the ONF Contributors
+# SPDX-License-Identifier: Apache-2.0
+# -----------------------------------------------------------------------
+# https://gerrit.opencord.org/plugins/gitiles/onf-make
+# ONF.makefiles.include.version = 1.1
+# -----------------------------------------------------------------------
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+## if dev-mode: make LOCAL_FIX_PERMS=1 mod-update
+.PHONY: mod-update
+mod-update: mod-tidy mod-vendor
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+.PHONY: mod-tidy
+mod-tidy :
+	$(call banner-enter,Target $@)
+	${GO} mod tidy
+	$(call banner-leave,Target $@)
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+.PHONY: mod-vendor
+mod-vendor : mod-tidy
+mod-vendor :
+	$(call banner-enter,Target $@)
+	$(if $(LOCAL_FIX_PERMS),chmod o+w $(CURDIR))
+	${GO} mod vendor
+	$(if $(LOCAL_FIX_PERMS),chmod o-w $(CURDIR))
+	$(call banner-leave,Target $@)
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+help ::
+	@echo '  mod-update             mod-tidy & mod-update'
+	@echo '  mod-tidy               go mod tidy'
+	@echo '  mod-vendor             go mod vendor'
+
+  ifdef VERBOSE
+	@echo '    LOCAL_FIX_PERMS=1    Local hack to fix docker uid/gid volume problem'
+  endif
+
+# [EOF]
diff --git a/makefiles/help/header.mk b/makefiles/help/header.mk
new file mode 100644
index 0000000..021ac0d
--- /dev/null
+++ b/makefiles/help/header.mk
@@ -0,0 +1,6 @@
+# -*- makefile -*-
+
+help :
+	@echo "Usage: make [options] [target] ..."
+	@echo "Targets:"
+	@echo "  help                        This message"
diff --git a/makefiles/help/include.mk b/makefiles/help/include.mk
new file mode 100644
index 0000000..01efdc1
--- /dev/null
+++ b/makefiles/help/include.mk
@@ -0,0 +1,114 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2017-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.
+# -----------------------------------------------------------------------
+
+##-------------------##
+##---]  GLOBALS  [---##
+##-------------------##
+.PHONY: help help-summary help-simple help-verbose
+
+##-------------------##
+##---]  TARGETS  [---##
+##-------------------##
+
+## -----------------------------------------------------------------------
+## Intent: Render topic/tool based makefile help
+## -----------------------------------------------------------------------
+## Three targets are used to render conditional makefile help
+##    help-summary      A one-line target summary for the topic
+##    help-simple       Common targets for the topic (lint-helm, build, test)
+##    help-verbose      Exhaustive display of supported targets
+## -----------------------------------------------------------------------
+## [COOKBOOK]
+##   help colon-colon   All 'help' targets are evaluated for 'make help'
+##   help-banner        Display a usage banner for help
+##   help-summary       Display all one-line topic summary help
+##     [conditonal]
+##   help-simple        Display all common topic makefile targets.
+##   help-verbose       Exhaustive display of makefile target help.
+##     VERBOSE=
+## -----------------------------------------------------------------------
+## [See Also] makefiles/gerrit/{include.mk, help.mk}
+##   help-gerrit        Summary targets can always be used to display topic help
+##   help-verbose       Exhaustive gerrit target display.
+## -----------------------------------------------------------------------
+help :: help-banner help-summary
+
+## -----------------------------------------------------------------------
+## Intent: Display a usage banner for help.  Target will be evaluated
+##         before all other help display.
+## -----------------------------------------------------------------------
+help-banner:
+	@echo "Usage: $(MAKE) [options] [target] ..."
+
+## -----------------------------------------------------------------------
+## Intent: Display extended help.
+## -----------------------------------------------------------------------
+## Question:
+##   o Help display can be long based on volume of targets.
+##   o Should a 3rd case be added to display:
+##      - help-simple (one-liner help) by default
+##      - conditional display of extended help:
+##          - help-simple or help-verbose
+##   o Current logic displays extended help by default.
+## -----------------------------------------------------------------------
+## Usage: see makefiles/targets/test.mk
+##    test-verbose += help-check#      # append help target to help-verbose
+## -----------------------------------------------------------------------
+ifdef VERBOSE
+  help-verbose += help-verbose
+  help :: $(help-verbose)
+else
+  help :: help-simple
+endif
+
+## -----------------------------------------------------------------------
+## Intent: Display context specific help for named targets.
+## -----------------------------------------------------------------------
+## [TODO] Display a list of help-* tokens for target specific content:
+##    % make help-check
+##    % make help-test
+## -----------------------------------------------------------------------
+## [TODO] Define LEVEL= or helper targets (help-lint-{level})
+##        for extended help w/o information overload
+##    [0] help               # make help
+##    [1] help-lint          # make help-verbose or (VERBOSE=1)
+##    [2] help-lint-shell    # make help-lint VERBOSE=1  (??)
+##    [2] help-lint-yaml
+## -----------------------------------------------------------------------
+help-index ::
+	@echo
+	@echo '[HELP] - An index of help context for common targets'
+	@echo '  help-index          This message'
+	$(HIDE)\
+  for name in $(sort $(help-verbose)); do\
+    echo "  $$name";\
+  done
+
+## -----------------------------------------------------------------------
+## Intent: Display simple extended target help
+## -----------------------------------------------------------------------
+help-simple :: help-index
+	@echo
+	@echo '[VIEW]'
+	@echo '  reload              Setup to auto-reload sphinx doc changes in browser'
+	@echo '  view-html           View generated documentation'
+	@echo
+	@echo '[TEST]'
+	@echo "  test                $(MAKE) lint linkcheck"
+	@echo "  test-all            $(MAKE) all-generation-targets"
+
+# [EOF]
diff --git a/makefiles/help/trailer.mk b/makefiles/help/trailer.mk
new file mode 100644
index 0000000..8fcdfa6
--- /dev/null
+++ b/makefiles/help/trailer.mk
@@ -0,0 +1,42 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2017-2023 Open Networking Foundation
+#
+# 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.
+# -----------------------------------------------------------------------
+
+# include this makefile late so text will be displayed at the end6
+
+help ::
+	@echo
+	@echo '[CLEAN]'
+	@echo '  clean               Remove generated targets'
+	@echo '  sterile             clean + remove virtual env interpreter install'
+
+help ::
+	@echo
+	@echo '[HELP]'
+	@echo '  help                Display program help'
+	@echo '  help-verbose        Display additional targets and help'
+
+## -----------------------------------------------------------------------
+# repo::voltha-docs -- patch logic not deployed everywhere.
+## -----------------------------------------------------------------------
+# help ::
+#	@echo
+#	@echo '[NOTE: python 3.10+]'
+#	@echo '  The interpreter is not yet fully supported across foreign repositories.'
+#	@echo '  While working locally, if make fails to build a target try:'
+#	@echo '      $(MAKE) $${target} NO_OTHER_REPO_DOCS=1'
+
+# [EOF]
diff --git a/makefiles/help/variables.mk b/makefiles/help/variables.mk
new file mode 100644
index 0000000..a22b179
--- /dev/null
+++ b/makefiles/help/variables.mk
@@ -0,0 +1,36 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2017-2023 Open Networking Foundation
+#
+# 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.
+# -----------------------------------------------------------------------
+
+# Include variables.mk after library makefiles have been included
+
+ifdef VERBOSE
+  help :: help-variables
+else
+  help ::
+	@echo
+	@echo '[VARIABLES] - Conditional makefile behavior'
+	@echo '  see also: help-variables'
+endif
+
+help-variables:
+	@echo
+	@echo '[VARIABLES] - Conditional makefile behavior'
+	@echo '  NO_PATCHES=           Do not apply patches to the python virtualenv'
+	@echo '  NO_OTHER_REPO_DOCS=   No foreign repos, only apply target to local sources.'
+	@echo '  VERBOSE=              Display extended help topics'
+
+# [EOF]
diff --git a/makefiles/include.mk b/makefiles/include.mk
index 1255f45..6b5283d 100644
--- a/makefiles/include.mk
+++ b/makefiles/include.mk
@@ -20,18 +20,44 @@
 
 $(if $(DEBUG),$(warning ENTER))
 
-MAKEDIR ?= $(error MAKEDIR= is required)
-
 ## -----------------------------------------------------------------------
+## Define vars based on relative import (normalize symlinks)
+## Usage: include makefiles/onf/include.mk
 ## -----------------------------------------------------------------------
-help::
-	@echo "USAGE: $(MAKE) [options] [target] ..."
-        # @echo "  test                          Sanity check chart versions"
+onf-mk-abs    ?= $(abspath $(lastword $(MAKEFILE_LIST)))
+onf-mk-top    := $(subst /include.mk,$(null),$(onf-mk-abs))
+ONF_MAKEDIR   := $(onf-mk-top)
 
-include $(MAKEDIR)/consts.mk
-include $(MAKEDIR)/commands.mk
-include $(MAKEDIR)/todo.mk
-include $(MAKEDIR)/lint/include.mk
+MAKEDIR ?= $(ONF_MAKEDIR)#                   # Two dirs needed, local and common
+
+include $(ONF_MAKEDIR)/consts.mk
+include $(ONF_MAKEDIR)/help/include.mk       # render target help
+include $(ONF_MAKEDIR)/utils/include.mk      # dependency-less helper macros
+include $(ONF_MAKEDIR)/etc/include.mk        # banner macros
+
+include $(ONF_MAKEDIR)/virtualenv.mk#        # lint-{jjb,python} depends on venv
+
+include $(ONF_MAKEDIR)/lint/include.mk
+
+# include $(ONF_MAKEDIR)/git-submodules.mk
+# include $(ONF_MAKEDIR)/gerrit/include.mk
+include $(ONF_MAKEDIR)/golang/include.mk
+
+include $(ONF_MAKEDIR)/todo.mk
+include $(ONF_MAKEDIR)/help/variables.mk
+
+##---------------------##
+##---]  ON_DEMAND  [---##
+##---------------------##
+$(if $(USE_DOCKER_MK),$(eval $(ONF_MAKEDIR)/docker/include.mk))
+
+##-------------------##
+##---]  TARGETS  [---##
+##-------------------##
+include $(ONF_MAKEDIR)/targets/clean.mk
+# include $(ONF_MAKEDIR)/targets/check.mk
+include $(ONF_MAKEDIR)/targets/sterile.mk
+# include $(ONF_MAKEDIR)/targets/test.mk
 
 $(if $(DEBUG),$(warning LEAVE))
 
diff --git a/makefiles/lint/README b/makefiles/lint/README
new file mode 100644
index 0000000..4ff0236
--- /dev/null
+++ b/makefiles/lint/README
@@ -0,0 +1 @@
+Merge and replace makefiles/lint/docker/ with repo:onf-make/makefiles/lint/docker
diff --git a/makefiles/lint/doc8/excl.mk b/makefiles/lint/doc8/excl.mk
new file mode 100644
index 0000000..deb3f63
--- /dev/null
+++ b/makefiles/lint/doc8/excl.mk
@@ -0,0 +1,47 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2017-2022 Open Networking Foundation
+#
+# 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))
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+
+## excl := $(wildcar */*/.git)
+lint-doc8-excl-raw += '$(venv-name)'
+lint-doc8-excl-raw += '*/$(venv-name)'
+$(if $(BUILDDIR),\
+  $(excl lint-doc8-excl-raw += '$(BUILDDIR)'))
+
+# YUCK! -- overhead
+#   o Submodule(s) use individual/variant virtualenv install paths.
+#   o Exclude special snowflakes to enable library makefile use.
+#   o All can use virtualenv.mk for consistent names and cleanup
+#   o [TODO] Ignore submodules, individual repos should check their sources.
+
+lint-doc8-excl-raw += '*/venv_cord'
+
+lint-doc8-excl-raw += './cord-tester'
+lint-doc8-excl-raw += './repos/cord-tester'
+
+lint-doc8-excl-raw += './bbsim/internal/bbsim/responders/sadis/dp.txt'
+lint-doc8-excl-raw += './repos/bbsim/internal/bbsim/responders/sadis/dp.txt'
+lint-doc8-excl-raw += './repos/voltha-helm-charts/voltha-infra/templates/NOTES.txt'
+lint-doc8-excl-raw += './voltha-helm-charts/voltha-infra/templates/NOTES.txt'
+
+$(if $(DEBUG),$(warning LEAVE))
+
+# [EOF]
diff --git a/makefiles/lint/doc8/include.mk b/makefiles/lint/doc8/include.mk
new file mode 100644
index 0000000..d0263af
--- /dev/null
+++ b/makefiles/lint/doc8/include.mk
@@ -0,0 +1,67 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2017-2022 Open Networking Foundation
+#
+# 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.
+# -----------------------------------------------------------------------
+
+##-------------------##
+##---]  GLOBALS  [---##
+##-------------------##
+.PHONY: lint-doc8 lint-doc8-all lint-doc8-modified
+
+have-rst-files := $(if $(strip $(RST_SOURCE)),true)
+RST_SOURCE     ?= $(error RST_SOURCE= is required)
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+ifndef NO-LINT-DOC8
+  lint-doc8-mode := $(if $(have-doc8-files),modified,all)
+  lint : lint-doc8-$(lint-doc8-mode)
+endif# NO-LINT-DOC8
+
+# Consistent targets across lint makefiles
+lint-doc8-all      : lint-doc8
+lint-doc8-modified : lint-doc8
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+include $(MAKEDIR)/lint/doc8/excl.mk
+
+ifdef lint-doc8-excl
+  lint-doc8-excl-args += $(addprefix --ignore-path$(space),$(lint-doc8-excl))
+endif
+lint-doc8-excl-args += $(addprefix --ignore-path$(space),$(lint-doc8-excl-raw))
+
+lint-doc8-args += --max-line-length 120
+
+lint-doc8: $(venv-activate-script)
+	@echo
+	@echo '** -----------------------------------------------------------------------'
+	@echo '** doc8 *.rst syntax checking'
+	@echo '** -----------------------------------------------------------------------'
+	$(activate) && doc8 --version
+	@echo
+	$(activate) && doc8 $(lint-doc8-excl-args) $(lint-doc8-args) .
+
+## -----------------------------------------------------------------------
+## Intent: Display command usage
+## -----------------------------------------------------------------------
+help::
+	@echo '  lint-doc8          Syntax check python using the doc8 command'
+  ifdef VERBOSE
+	@echo '  lint-doc8-all       doc8 checking: exhaustive'
+	@echo '  lint-doc8-modified  doc8 checking: only modified'
+  endif
+
+# [EOF]
diff --git a/makefiles/lint/groovy/README.md b/makefiles/lint/groovy/README.md
new file mode 100644
index 0000000..aa9b41a
--- /dev/null
+++ b/makefiles/lint/groovy/README.md
@@ -0,0 +1,13 @@
+# lint: groovy source
+
+# Invoke the linting tool
+% make lint-groovy
+
+# Alt checking: groovy interpreter
+
+Odd syntax errors can be detected by the groovy interpreter.
+
+% groovy path/to/{source}.groovy
+
+jjb/ pipeline scripts will eventually due to syntax problems but groovy can
+still detect problems like mismatched quotes, invalid op tokens, etc.
diff --git a/makefiles/lint/groovy/include.mk b/makefiles/lint/groovy/include.mk
new file mode 100644
index 0000000..6baf70c
--- /dev/null
+++ b/makefiles/lint/groovy/include.mk
@@ -0,0 +1,51 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2022-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.
+# -----------------------------------------------------------------------
+
+##-------------------##
+##---]  GLOBALS  [---##
+##-------------------##
+
+groovy-check      := npm-groovy-lint
+
+groovy-check-args := $(null)
+# groovy-check-args += --loglevel info
+# groovy-check-args += --ignorepattern
+# groovy-check-args += --verbose
+
+##-------------------##
+##---]  TARGETS  [---##
+##-------------------##
+ifndef NO-LINT-GROOVY
+  lint : lint-groovy
+endif
+
+## -----------------------------------------------------------------------
+## Intent: Perform a lint check on command line script sources
+## -----------------------------------------------------------------------
+lint-groovy:
+	$(groovy-check) --version
+	@echo
+	$(HIDE)$(env-clean) find . -iname '*.groovy' -print0 \
+  | $(xargs-n1) $(groovy-check) $(groovy-check-args)
+
+## -----------------------------------------------------------------------
+## Intent: Display command help
+## -----------------------------------------------------------------------
+help-summary ::
+	@echo '  lint-groovy          Syntax check groovy sources'
+
+# [EOF]
diff --git a/makefiles/lint/groovy/urls b/makefiles/lint/groovy/urls
new file mode 100644
index 0000000..aa5c5eb
--- /dev/null
+++ b/makefiles/lint/groovy/urls
@@ -0,0 +1,8 @@
+# -*- makefile -*-
+
+# Config file and exclusions
+https://www.npmjs.com/package/npm-groovy-lint#Configuration
+
+https://github.com/nvuillam/npm-groovy-lint
+
+# [EOF]
diff --git a/makefiles/lint/python.mk b/makefiles/lint/help.mk
similarity index 62%
copy from makefiles/lint/python.mk
copy to makefiles/lint/help.mk
index 86503a7..24a5aa1 100644
--- a/makefiles/lint/python.mk
+++ b/makefiles/lint/help.mk
@@ -1,6 +1,6 @@
 # -*- makefile -*-
 # -----------------------------------------------------------------------
-# Copyright 2017-2022 Open Networking Foundation
+# Copyright 2021-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.
@@ -15,19 +15,17 @@
 # limitations under the License.
 # -----------------------------------------------------------------------
 
-PYTHON_FILES ?= $(error PYTHON_FILES= is required)
+help ::
 
-.PHONY: lint-python
+# -----------------------------------------------------------------------
+# -----------------------------------------------------------------------
+help-summary ::
+	@echo '  help-lint           Display lint target help'
 
-lint : lint-python
-
-lint-python: vst_venv
-	-source ./$</bin/activate \
-	    && set -u \
-	    && pylint $(PYTHON_FILES) \
-	    && flake8 --max-line-length=99 --count $(PYTHON_FILES)
-
-help::
-	@echo "  lint-python          Syntax check using pylint and flake8"
+help-simple :: help-lint
+help-lint  :
+	@echo
+	@echo "[LINT]"
+	@echo '  help-lint           Display lint target help'
 
 # [EOF]
diff --git a/makefiles/lint/include.mk b/makefiles/lint/include.mk
index d1a5a16..c2f0ca6 100644
--- a/makefiles/lint/include.mk
+++ b/makefiles/lint/include.mk
@@ -1,36 +1,30 @@
 # -*- makefile -*-
 # -----------------------------------------------------------------------
-# Copyright 2017-2023 Open Networking Foundation
-#
-# 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.
+# Copyright 2022-2023 Open Networking Foundation (ONF) and the ONF Contributors
+# -----------------------------------------------------------------------
+# https://gerrit.opencord.org/plugins/gitiles/onf-make
+# ONF.makefile.version = 1.1
 # -----------------------------------------------------------------------
 
-help::
+$(if $(DEBUG),$(warning ENTER))
+
+help ::
 	@echo
 	@echo "[LINT]"
-	@echo "  lint                       Static code analysis/syntax checking"
-	@echo "    LOCAL_LINT=1             Enable local linting w/o docker & jenkins overhead"
 
-include $(MAKEDIR)/lint/docker/include.mk
+include $(ONF_MAKEDIR)/lint/doc8/include.mk
+include $(ONF_MAKEDIR)/lint/docker/include.mk
+include $(ONF_MAKEDIR)/lint/groovy/include.mk
+include $(ONF_MAKEDIR)/lint/jjb.mk
+include $(ONF_MAKEDIR)/lint/json.mk
+include $(ONF_MAKEDIR)/lint/license/include.mk
+include $(ONF_MAKEDIR)/lint/makefile.mk
+include $(ONF_MAKEDIR)/lint/python/include.mk
+include $(ONF_MAKEDIR)/lint/shell.mk
+include $(ONF_MAKEDIR)/lint/yaml.mk
 
-ifdef LOCAL_LINT
-  # include $(MAKEDIR)/lint/json.mk              # venv dependency
-  # include $(MAKEDIR)/lint/golang/sca.mk
-  # include $(MAKEDIR)/lint/license/include.mk   # exclusions needed
-  # include $(MAKEDIR)/lint/python.mk
-  # include $(MAKEDIR)/lint/robot.mk             # venv dependency
-  # include $(MAKEDIR)/lint/shell.mk             # cleanup needed
-  # include $(MAKEDIR)/lint/yaml.mk              # venv needed -- alt: yamllint
-endif
+include $(ONF_MAKEDIR)/lint/help.mk
+
+$(if $(DEBUG),$(warning LEAVE))
 
 # [EOF]
diff --git a/makefiles/lint/include.mk.safe b/makefiles/lint/include.mk.safe
new file mode 100644
index 0000000..bf598dc
--- /dev/null
+++ b/makefiles/lint/include.mk.safe
@@ -0,0 +1,39 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2017-2023 Open Networking Foundation
+#
+# 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))
+
+help ::
+	@echo
+	@echo "[LINT]"
+
+include $(ONF_MAKEDIR)/lint/doc8/include.mk
+include $(ONF_MAKEDIR)/lint/docker/include.mk
+# include $(ONF_MAKEDIR)/lint/groovy/include.mk
+# include $(ONF_MAKEDIR)/lint/jjb.mk
+# include $(ONF_MAKEDIR)/lint/json.mk
+# include $(ONF_MAKEDIR)/lint/license/include.mk
+# include $(ONF_MAKEDIR)/lint/makefile.mk
+# include $(ONF_MAKEDIR)/lint/python/include.mk
+# include $(ONF_MAKEDIR)/lint/shell.mk
+# include $(ONF_MAKEDIR)/lint/yaml.mk
+
+include $(ONF_MAKEDIR)/lint/help.mk
+
+$(if $(DEBUG),$(warning LEAVE))
+
+# [EOF]
diff --git a/makefiles/lint/jjb.mk b/makefiles/lint/jjb.mk
new file mode 100644
index 0000000..ccfa073
--- /dev/null
+++ b/makefiles/lint/jjb.mk
@@ -0,0 +1,60 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 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.
+# -----------------------------------------------------------------------
+
+##-------------------##
+##---]  GLOBALS  [---##
+##-------------------##
+.PHONY: lint-venv
+
+##-------------------##
+##---]  TARGETS  [---##
+##-------------------##
+ifndef NO-LINT-JJB
+  lint : lint-jjb
+endif
+
+## -----------------------------------------------------------------------
+## Intent: Construct command line for linting jenkins-job-builder config
+## -----------------------------------------------------------------------
+
+ifdef DEBUG
+  lint-jjb-args += --log_level DEBUG#         # verbosity: high
+else
+  lint-jjb-args += --log_level INFO#          # verbosity: default
+endif
+lint-jjb-args += --ignore-cache
+lint-jjb-args += test#                        # command action
+lint-jjb-args += -o archives/job-configs#     # Generated jobs written here
+lint-jjb-args += --recursive
+lint-jjb-args += --config-xml#                # JJB v3.0 write to OUTPUT/jobname/config.xml
+lint-jjb-args += jjb/#                        # JJB config sources (input)
+
+lint-jjb-deps := $(null)
+lint-jjb-deps += $(venv-activate-script) 
+lint-jjb-deps += checkout-ci-management-sub-modules
+lint-jjb: $(lint-jjb-deps)
+	$(activate) && { jenkins-jobs $(lint-jjb-args); }
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+help ::
+	@echo '  lint-jjb               Validate jjb job generation'
+ifdef VERBOSE
+	@echo '    DEBUG=1                lint-jjb --log_level=DEBUG'
+endif
+
+# [EOF]
diff --git a/makefiles/lint/json.mk b/makefiles/lint/json.mk
index cc9ecfa..30c93c0 100644
--- a/makefiles/lint/json.mk
+++ b/makefiles/lint/json.mk
@@ -1,8 +1,8 @@
 # -*- makefile -*-
 # -----------------------------------------------------------------------
-# Copyright 2017-2022 Open Networking Foundation
+# Copyright 2017-2023 Open Networking Foundation (ONF) and the ONF Contributors
 #
-# Licensed under the Apache License, Version 2.0 (the "License");
+# 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
 #
@@ -15,21 +15,78 @@
 # limitations under the License.
 # -----------------------------------------------------------------------
 
-JSON_FILES ?= $(error JSON_FILES= is required)
+$(if $(DEBUG),$(warning ENTER))
 
-.PHONY: lint-json
+##-------------------##
+##---]  GLOBALS  [---##
+##-------------------##
+.PHONY: lint-json lint-json-all lint-json-modified
 
-lint : lint-json
+## -----------------------------------------------------------------------
+## Intent: Use the json command to perform syntax checking.
+##   o If UNSTABLE=1 syntax check all sources
+##   o else only check sources modified by the developer.
+## Usage:
+##   % make lint UNSTABLE=1
+##   % make lint-json-all
+## -----------------------------------------------------------------------
+ifndef NO-LINT-JSON
+  have-json-files := $(if $(strip $(JSON_FILES)),true)
+  JSON_FILES      ?= $(error JSON_FILES= required)
 
-lint-json: vst_venv
-	source ./$</bin/activate \
-	    ; set -u \
-	    ; for jsonfile in $(JSON_FILES); do \
-		echo "Validating json file: $$jsonfile" ;\
-		python -m json.tool $$jsonfile > /dev/null ;\
-	done
+  lint-json-mode := $(if $(have-json-files),modified,all)
+  lint : lint-json-$(lint-json-mode)
+endif# NO-LINT-JSON
 
+## -----------------------------------------------------------------------
+## Intent: exhaustive json syntax checking
+## -----------------------------------------------------------------------
+json-find-args := $(null)
+json-find-args += -name '$(venv-name)'
+lint-json-all:	
+	$(HIDE)$(MAKE) --no-print-directory lint-json-install
+
+	$(activate)\
+ && find . \( $(json-find-args) \) -prune -o -name '*.json' -print0 \
+	| $(xargs-n1) python -m json.tool > /dev/null ;\
+
+## -----------------------------------------------------------------------
+## Intent: check deps for format and python3 cleanliness
+## Note:
+##   json --py3k option no longer supported
+## -----------------------------------------------------------------------
+lint-json-modified: $(venv-activate-script)
+	$(HIDE)$(MAKE) --no-print-directory lint-json-install
+
+	$(activate)\
+ && for jsonfile in $(JSON_FILES); do \
+        echo "Validating json file: $$jsonfile" ;\
+        python -m json.tool $$jsonfile > /dev/null ;\
+    done
+
+## -----------------------------------------------------------------------
+## Intent:
+## -----------------------------------------------------------------------
+.PHONY: lint-json-install
+lint-json-install: $(venv-activate-script)
+	@echo
+	@echo "** -----------------------------------------------------------------------"
+	@echo "** json syntax checking"
+	@echo "** -----------------------------------------------------------------------"
+#	$(activate) && pip install --upgrade json.tool
+#       $(activate) && python -m json.tool --version (?-howto-?)
+	@echo
+
+## -----------------------------------------------------------------------
+## Intent: Display command usage
+## -----------------------------------------------------------------------
 help::
-	@echo "  lint-json            Syntax check json sources"
+	@echo '  lint-json          Syntax check python using the json command'
+  ifdef VERBOSE
+	@echo '  lint-json-all       json checking: exhaustive'
+	@echo '  lint-json-modified  json checking: only modified'
+  endif
+
+$(if $(DEBUG),$(warning LEAVE))
 
 # [EOF]
diff --git a/makefiles/lint/license/common.mk b/makefiles/lint/license/common.mk
new file mode 100644
index 0000000..2b42049
--- /dev/null
+++ b/makefiles/lint/license/common.mk
@@ -0,0 +1,41 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2022-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.
+# -----------------------------------------------------------------------
+
+##-------------------##
+##---]  GLOBALS  [---##
+##-------------------##
+
+##-------------------##
+##---]  TARGETS  [---##
+##-------------------##
+ifndef NO-LINT-REUSE
+  lint : lint-license
+endif
+
+## -----------------------------------------------------------------------
+## Intent: Perform a lint check on makefile sources
+## -----------------------------------------------------------------------
+lint-license:
+	reuse --root . lint
+
+## -----------------------------------------------------------------------
+## Intent: Display command help
+## -----------------------------------------------------------------------
+help-summary ::
+	@echo '  lint-reuse              License syntax checking'
+
+# [EOF]
diff --git a/makefiles/lint/license/include.mk b/makefiles/lint/license/include.mk
index aaf6e47..d34d462 100644
--- a/makefiles/lint/license/include.mk
+++ b/makefiles/lint/license/include.mk
@@ -1,6 +1,6 @@
 # -*- makefile -*-
 # -----------------------------------------------------------------------
-# Copyright 2022 Open Networking Foundation
+# Copyright 2022-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.
@@ -15,74 +15,23 @@
 # limitations under the License.
 # -----------------------------------------------------------------------
 
-# JSON_FILES ?= $(error JSON_FILES= is required)
+ifndef NO-LINT-LICENSE
 
-.PHONY: lint-license
+ifndef mk-include--onf-lint-license#       # one-time loader
 
-## -----------------------------------------------------------------------
-## -----------------------------------------------------------------------
-lint : lint-license
+$(if $(DEBUG),$(warning ENTER))
 
-lint-license-gargs += --recursive
+$(if $(USE_LINT_LICENSE)\
+  ,$(eval include $(ONF_MAKEDIR)/lint/license/voltha-system-tests/include.mk)\
+  ,$(eval include $(ONF_MAKEDIR)/lint/license/common.mk)\
+)
 
-# ignore: png, xlsx
-# will utf8 be excluded(?)
-lint-license-gargs += --binary-files=without-match
-lint-license-gargs += --files-without-match
+  mk-include--onf-lint-license := true
 
-# [TODO] license checking accepts either Copy or Apache.
-# [TODO] At least Copyright should be required (both?)
-lint-license-gargs += --extended-regexp
-lint-license-gargs += -e 'Copyright[[:space:]]+[[:digit:]]{4}'
-lint-license-gargs += -e 'Apache License'
+$(if $(DEBUG),$(warning LEAVE))
 
-# [TODO] --strict, --strict-dates
+endif # mk-include--onf-lint-license
 
-# Editor temp files
-lint-license-gargs += --exclude='*.~'
-lint-license-gargs += --exclude='*.swp'
-
-lint-license-gargs += --exclude-dir='.git'
-
-# TODO: Normalize into .venv for consistent filtering across projects.
-lint-license-gargs += --exclude-dir='vst_venv'
-lint-license-gargs += --exclude-dir='flog'
-
-lint-license-gargs += --exclude='*.json'
-lint-license-gargs += --exclude='*.md'
-lint-license-gargs += --exclude='*.out'
-lint-license-gargs += --exclude='*.pyc'
-lint-license-gargs += --exclude='*.xml'
-
-# [FILE(s)]
-lint-license-gargs += --exclude='VERSION'
-
-# [GIT]
-# lint-license-gargs += --exclude='.gitignore'
-# lint-license-gargs += --exclude='.gitreview'
-lint-license-gargs += --exclude='\.*'
-
-# [PYTHON]
-lint-license-gargs += --exclude='requirements.txt'
-
-# [WIP]
-lint-license-gargs += --exclude='patch'
-
-## -----------------------------------------------------------------------
-## -----------------------------------------------------------------------
-lint-license-new:
-	grep $(lint-license-gargs) $(dot)
-
-## -----------------------------------------------------------------------
-## Jenkins job checking logic.
-## -----------------------------------------------------------------------
-lint-license:
-	$(MAKEDIR)/lint/license/license-check.sh
-
-## -----------------------------------------------------------------------
-## -----------------------------------------------------------------------
-help ::
-	@echo "  lint-license         Verify sources contain a license block."
-	@echo "  lint-license-new     Grep driven replacement logic."
+endif # NO-LINT-LICENSE
 
 # [EOF]
diff --git a/makefiles/lint/license/reuse.mk b/makefiles/lint/license/reuse.mk
new file mode 100644
index 0000000..5572bef
--- /dev/null
+++ b/makefiles/lint/license/reuse.mk
@@ -0,0 +1,41 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2022-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.
+# -----------------------------------------------------------------------
+
+##-------------------##
+##---]  GLOBALS  [---##
+##-------------------##
+
+##-------------------##
+##---]  TARGETS  [---##
+##-------------------##
+ifndef NO-LINT-REUSE
+  lint : lint-license
+endif
+
+## -----------------------------------------------------------------------
+## Intent: Perform a lint check on makefile sources
+## -----------------------------------------------------------------------
+lint-license:
+	reuse --root . lint
+
+## -----------------------------------------------------------------------
+## Intent: Display command help
+## -----------------------------------------------------------------------
+help-summary ::
+	@echo '  lint-reuse              License syntax checking"
+
+# [EOF]
diff --git a/makefiles/lint/license/voltha-system-tests/include.mk b/makefiles/lint/license/voltha-system-tests/include.mk
new file mode 100644
index 0000000..b457f58
--- /dev/null
+++ b/makefiles/lint/license/voltha-system-tests/include.mk
@@ -0,0 +1,80 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2022-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: lint-license
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+lint : lint-license
+
+lint-license-gargs += --recursive
+
+# ignore: png, xlsx
+# will utf8 be excluded(?)
+lint-license-gargs += --binary-files=without-match
+lint-license-gargs += --files-without-match
+
+# [TODO] license checking accepts either Copy or Apache.
+# [TODO] At least Copyright should be required (both?)
+lint-license-gargs += --extended-regexp
+lint-license-gargs += -e 'Copyright[[:space:]]+[[:digit:]]{4}'
+lint-license-gargs += -e 'Apache License'
+
+# [TODO] --strict, --strict-dates
+
+# TODO: Normalize into .venv for consistent filtering across projects.
+lint-license-gargs += --exclude-dir='.git'
+lint-license-gargs += --exclude-dir='$(venv-name)'
+lint-license-gargs += --exclude-dir='flog'
+
+lint-license-gargs += --exclude='*.json'
+lint-license-gargs += --exclude='*.md'
+lint-license-gargs += --exclude='*.pyc'
+lint-license-gargs += --exclude='*.xml'
+
+# [FILE(s)]
+lint-license-gargs += --exclude='VERSION'
+
+# [GIT]
+# lint-license-gargs += --exclude='.gitignore'
+# lint-license-gargs += --exclude='.gitreview'
+lint-license-gargs += --exclude='\.*'
+
+# [PYTHON]
+lint-license-gargs += --exclude='requirements.txt'
+
+# [WIP]
+lint-license-gargs += --exclude='patch'
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+lint-license-new:
+	grep $(lint-license-gargs) $(dot)
+
+## -----------------------------------------------------------------------
+## Jenkins job checking logic.
+## -----------------------------------------------------------------------
+lint-license:
+	$(MAKEDIR)/lint/license/license-check.sh
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+help::
+	@echo "  lint-license         Verify sources contain a license block."
+	@echo "  lint-license-new     Grep driven replacement logic."
+
+# [EOF]
diff --git a/makefiles/lint/license/voltha-system-tests/license-check.sh b/makefiles/lint/license/voltha-system-tests/license-check.sh
new file mode 100755
index 0000000..92aa363
--- /dev/null
+++ b/makefiles/lint/license/voltha-system-tests/license-check.sh
@@ -0,0 +1,159 @@
+#!/usr/bin/env bash
+
+# -----------------------------------------------------------------------
+# Copyright 2022-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.
+# -----------------------------------------------------------------------
+
+# licensecheck.sh
+# checks for copyright/license headers on files
+# excludes filename extensions where this check isn't pertinent
+
+# --strict
+# --strict-dates
+#    see https://github...
+
+## ---------------------------------------------------------------------------
+## find: warning: ‘-name’ matches against basenames only, but the given pattern
+## contains a directory separator (‘/’), thus the expression will evaluate to
+## false all the time.  Did you mean ‘-wholename’?
+##
+## [TODO] find and fix plugin script, change --name to --path:
+##    find ! -name "*/docs/*" 
+## ---------------------------------------------------------------------------
+## [TODO] see license/include.mk, grep -L will ignore binaries so no need to
+## explicitly filter images, spreadsheets, etc.  Files containing utf-8 are
+## the only question mark.
+## ---------------------------------------------------------------------------
+
+set +e -u -o pipefail
+fail_licensecheck=0
+
+declare -a gargs=()
+gargs+=('--extended-regexp')
+
+# Evil regex -- scripts detecting pattern are excluded from checking.
+gargs+=('-e' 'Apache License')
+
+# Good regex -- no false positives.
+gargs+=('-e' 'Copyright[[:space:]]+[[:digit:]]{4}')
+
+while IFS= read -r -d '' path
+do
+    if ! grep -q "${gargs[@]}" "${path}";
+    then
+	echo "ERROR: $path does not contain License Header"
+	fail_licensecheck=1
+    fi
+done < <(find . -name ".git" -prune -o -type f \
+  ! -iname "*.png" \
+  ! -name "*.asc" \
+  ! -name "*.bat" \
+  ! -name "*.bin" \
+  ! -name "*.cert" \
+  ! -name "*.cfg" \
+  ! -name "*.cnf" \
+  ! -name "*.conf" \
+  ! -name "*.cql" \
+  ! -name "*.crt" \
+  ! -name "*.csar" \
+  ! -name "*.csr" \
+  ! -name "*.csv" \
+  ! -name "*.ctmpl" \
+  ! -name "*.curl" \
+  ! -name "*.db" \
+  ! -name "*.der" \
+  ! -name "*.desc" \
+  ! -name "*.diff" \
+  ! -name "*.dnsmasq" \
+  ! -name "*.do" \
+  ! -name "*.docx" \
+  ! -name "*.eot" \
+  ! -name "*.gif" \
+  ! -name "*.gpg" \
+  ! -name "*.graffle" \
+  ! -name "*.ico" \
+  ! -name "*.iml" \
+  ! -name "*.in" \
+  ! -name "*.inc" \
+  ! -name "*.install" \
+  ! -name "*.j2" \
+  ! -name "*.jar" \
+  ! -name "*.jks" \
+  ! -name "*.jpg" \
+  ! -name "*.json" \
+  ! -name "*.jsonld" \
+  ! -name "*.JSON" \
+  ! -name "*.key" \
+  ! -name "*.list" \
+  ! -name "*.local" \
+  ! -path "*.lock" \
+  ! -name "*.log" \
+  ! -name "*.mak" \
+  ! -name "*.md" \
+  ! -name "*.MF" \
+  ! -name "*.oar" \
+  ! -name "*.p12" \
+  ! -name "*.patch" \
+  ! -name "*.pb.go" \
+  ! -name "*.pb.gw.go" \
+  ! -name "*.pdf" \
+  ! -name "*.pcap" \
+  ! -name "*.pem" \
+  ! -name "*.properties" \
+  ! -name "*.proto" \
+  ! -name "*.protoset" \
+  ! -name "*.pyc" \
+  ! -name "*.repo" \
+  ! -name "*.robot" \
+  ! -name "*.rst" \
+  ! -name "*.rules" \
+  ! -name "*.service" \
+  ! -name "*.svg" \
+  ! -name "*.swp" \
+  ! -name "*.tar" \
+  ! -name "*.tar.gz" \
+  ! -name "*.toml" \
+  ! -name "*.ttf" \
+  ! -name "*.txt" \
+  ! -name "*.woff" \
+  ! -name "*.xproto" \
+  ! -name "*.xtarget" \
+  ! -name "*ignore" \
+  ! -name "*rc" \
+  ! -name "*_pb2.py" \
+  ! -name "*_pb2_grpc.py" \
+  ! -name "Dockerfile" \
+  ! -name "Dockerfile.*" \
+  ! -name "go.mod" \
+  ! -name "go.sum" \
+  ! -name "README" \
+  ! -path "*/vendor/*" \
+  ! -path "*conf*" \
+  ! -path "*git*" \
+  ! -path "*swagger*" \
+  ! -path "*.drawio" \
+  ! -name "*.pb.h" \
+  ! -name "*.pb.cc" \
+  ! -path "*/docs/*" \
+  ! -name 'output.xml' \ 
+  ! -path "*/.venv/*" \
+  ! -name '*#*' \
+  ! -path '*scripts/flog/*' \
+  ! -name '*~' \
+  ! -name 'VERSION' \
+  ! -name 'patch' \
+  -print0 )
+
+exit ${fail_licensecheck}
diff --git a/makefiles/lint/python.mk b/makefiles/lint/license/voltha-system-tests/license-helper.sh
old mode 100644
new mode 100755
similarity index 63%
copy from makefiles/lint/python.mk
copy to makefiles/lint/license/voltha-system-tests/license-helper.sh
index 86503a7..0f690e4
--- a/makefiles/lint/python.mk
+++ b/makefiles/lint/license/voltha-system-tests/license-helper.sh
@@ -1,6 +1,6 @@
-# -*- makefile -*-
+#!/bin/bash
 # -----------------------------------------------------------------------
-# Copyright 2017-2022 Open Networking Foundation
+# Copyright 2022-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.
@@ -15,19 +15,17 @@
 # limitations under the License.
 # -----------------------------------------------------------------------
 
-PYTHON_FILES ?= $(error PYTHON_FILES= is required)
+declare -i status=$#
 
-.PHONY: lint-python
+while [ $# -gt 0 ]; do
+    arg="$1"; shift
+    echo "ERROR: Detected missing license header: ${arg}"
+done
 
-lint : lint-python
+if [ $status -ne 0 ]; then
+    exit 1
+fi
 
-lint-python: vst_venv
-	-source ./$</bin/activate \
-	    && set -u \
-	    && pylint $(PYTHON_FILES) \
-	    && flake8 --max-line-length=99 --count $(PYTHON_FILES)
-
-help::
-	@echo "  lint-python          Syntax check using pylint and flake8"
+/bin/true # set $?
 
 # [EOF]
diff --git a/makefiles/lint/makefile.mk b/makefiles/lint/makefile.mk
new file mode 100644
index 0000000..27206e0
--- /dev/null
+++ b/makefiles/lint/makefile.mk
@@ -0,0 +1,65 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2017-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.
+# -----------------------------------------------------------------------
+
+##-------------------##
+##---]  GLOBALS  [---##
+##-------------------##
+xargs-n1-local := $(subst -t,$(null),$(xargs-n1))#   inhibit cmd display
+
+# Gather sources to check
+# TODO: implement deps, only check modified files
+make-check-find := find . -name 'vendor' -prune
+make-check-find += -o \( -iname makefile -o -name '*.mk' \)
+make-check-find += -type f -print0
+
+make-check      := $(MAKE)
+
+make-check-args += --dry-run
+make-check-args += --keep-going
+make-check-args += --warn-undefined-variables
+make-check-args += --no-print-directory
+
+# Quiet internal undef vars
+make-check-args += DEBUG=
+
+##-------------------##
+##---]  TARGETS  [---##
+##-------------------##
+ifndef NO-LINT-MAKEFILE
+  lint : lint-make
+endif
+
+## -----------------------------------------------------------------------
+## Intent: Perform a lint check on makefile sources
+## -----------------------------------------------------------------------
+lint-make-ignore += JSON_FILES=
+lint-make-ignore += YAML_FILES=
+lint-make:
+	@echo
+	@echo "** -----------------------------------------------------------------------"
+	@echo "** Makefile syntax checking"
+	@echo "** -----------------------------------------------------------------------"
+	$(HIDE)$(env-clean) $(make-check-find) \
+	    | $(xargs-n1-local) $(make-check) $(make-check-args) $(lint-make-ignore)
+
+## -----------------------------------------------------------------------
+## Intent: Display command help
+## -----------------------------------------------------------------------
+help-summary ::
+	@echo '  lint-make           Syntax check [Mm]akefile and *.mk'
+
+# [EOF]
diff --git a/makefiles/lint/python.mk b/makefiles/lint/python/flake8
similarity index 93%
rename from makefiles/lint/python.mk
rename to makefiles/lint/python/flake8
index 86503a7..1492829 100644
--- a/makefiles/lint/python.mk
+++ b/makefiles/lint/python/flake8
@@ -25,7 +25,7 @@
 	-source ./$</bin/activate \
 	    && set -u \
 	    && pylint $(PYTHON_FILES) \
-	    && flake8 --max-line-length=99 --count $(PYTHON_FILES)
+	    && flake8 --max-line-length=99 --count $(PYTHON_FILE)S
 
 help::
 	@echo "  lint-python          Syntax check using pylint and flake8"
diff --git a/makefiles/lint/python/flake8.mk b/makefiles/lint/python/flake8.mk
new file mode 100644
index 0000000..4d7ba93
--- /dev/null
+++ b/makefiles/lint/python/flake8.mk
@@ -0,0 +1,49 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2022-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.
+# -----------------------------------------------------------------------
+
+##-------------------##
+##---]  GLOBALS  [---##
+##-------------------##
+
+# Gather sources to check
+# TODO: implement deps, only check modified files
+python-check-find := find . -name '*venv*' -prune\
+  -o \( -name '*.py' \)\
+  -type f -print0
+
+##-------------------##
+##---]  TARGETS  [---##
+##-------------------##
+ifndef NO-LINT-PYTHON-FLAKE8
+  lint        : lint-python-flake8
+  lint-python : lint-python-flake8
+endif
+
+## -----------------------------------------------------------------------
+## Intent: Perform a lint check on makefile sources
+## -----------------------------------------------------------------------
+lint-python-flake8:
+	$(HIDE)$(env-clean) $(python-check-find) \
+	    | $(xargs-n1) flake8 --max-line-length=99 --count
+
+## -----------------------------------------------------------------------
+## Intent: Display command help
+## -----------------------------------------------------------------------
+help-summary ::
+	@echo '  lint-python-flake8  Syntax check python sources (*.py)'
+
+# [EOF]
diff --git a/makefiles/lint/python/include.mk b/makefiles/lint/python/include.mk
new file mode 100644
index 0000000..0392822
--- /dev/null
+++ b/makefiles/lint/python/include.mk
@@ -0,0 +1,45 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2022-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.
+# -----------------------------------------------------------------------
+
+ifndef mk-include--onf-lint-python#       # one-time loader
+
+$(if $(DEBUG),$(warning ENTER))
+
+## -----------------------------------------------------------------------
+## Intent: Display early so lint targets are grouped
+## -----------------------------------------------------------------------
+help ::
+#	@echo
+#	@echo '[PYTHON]'
+	@echo '  lint-python         Syntax check python sources (*.py)'
+#	@echo '  help-lint-python-flake8'
+#	@echo '  help-lint-python-pylint'
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+  ifndef NO-LINT-PYTHON
+    include $(ONF_MAKEDIR)/lint/python/flake8.mk
+    include $(ONF_MAKEDIR)/lint/python/pylint.mk
+  endif
+
+  mk-include--onf-lint-python := true
+
+$(if $(DEBUG),$(warning LEAVE))
+
+endif # mk-include--onf-lint-license
+
+# [EOF]
diff --git a/makefiles/lint/python/pylint.mk b/makefiles/lint/python/pylint.mk
new file mode 100644
index 0000000..85c7afd
--- /dev/null
+++ b/makefiles/lint/python/pylint.mk
@@ -0,0 +1,54 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2022-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.
+# -----------------------------------------------------------------------
+
+##-------------------##
+##---]  GLOBALS  [---##
+##-------------------##
+
+# Gather sources to check
+# TODO: implement deps, only check modified files
+python-check-find := find . -name '*venv*' -prune\
+  -o \( -name '*.py' \)\
+  -type f -print0
+
+# python-check    := $(env-clean) pylint
+python-check    := pylint
+
+# python-check-args += --dry-run
+
+##-------------------##
+##---]  TARGETS  [---##
+##-------------------##
+ifndef NO-LINT-PYTHON
+  lint        : lint-python-pylint
+  lint-python : lint-python-pylint
+endif
+
+## -----------------------------------------------------------------------
+## Intent: Perform a lint check on makefile sources
+## -----------------------------------------------------------------------
+lint-python-pylint:
+	$(HIDE)$(env-clean) $(python-check-find) \
+	    | $(xargs-n1) $(python-check) $(python-check-args)
+
+## -----------------------------------------------------------------------
+## Intent: Display command help
+## -----------------------------------------------------------------------
+help-summary ::
+	@echo '  lint-python-pylint  Syntax check python sources (*.py)'
+
+# [EOF]
diff --git a/makefiles/lint/robot.mk b/makefiles/lint/robot.mk
index 9808602..369dfa8 100644
--- a/makefiles/lint/robot.mk
+++ b/makefiles/lint/robot.mk
@@ -30,10 +30,8 @@
 
 lint : lint-robot
 
-lint-robot: vst_venv
-	source ./$</bin/activate \
-	    && set -u \
-	    && rflint $(LINT_ARGS) $(ROBOT_FILES)
+lint-robot: $(venv-activate-script)
+	$(activate) && rflint $(LINT_ARGS) $(ROBOT_FILES)
 
 help::
 	@echo "  lint-robot           Syntax check robot sources using rflint"
diff --git a/makefiles/lint/shell.mk b/makefiles/lint/shell.mk
index da92921..704038c 100644
--- a/makefiles/lint/shell.mk
+++ b/makefiles/lint/shell.mk
@@ -1,6 +1,6 @@
 # -*- makefile -*-
 # -----------------------------------------------------------------------
-# Copyright 2017-2022 Open Networking Foundation
+# Copyright 2022-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.
@@ -14,20 +14,52 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # -----------------------------------------------------------------------
+# https://gerrit.opencord.org/plugins/gitiles/onf-make
+# ONF.makefile.version = 1.0
+# -----------------------------------------------------------------------
 
-JSON_FILES ?= $(error JSON_FILES= is required)
+##-------------------##
+##---]  GLOBALS  [---##
+##-------------------##
 
-.PHONY: lint-shell
+# Gather sources to check
+# TODO: implement deps, only check modified files
+shell-check-find := find .
+# vendor scripts but they really should be lintable
+shell-check-find += -name 'vendor' -prune
+shell-check-find += -o \( -name '*.sh' \)
+shell-check-find += -type f -print0
 
-lint : lint-shell
+# shell-check    := $(env-clean) pylint
+shell-check      := shellcheck
 
+shell-check-args += --check-sourced
+shell-check-args += --external-sources
+
+##-------------------##
+##---]  TARGETS  [---##
+##-------------------##
+ifndef NO-LINT-SHELL
+  lint : lint-shell
+endif
+
+## -----------------------------------------------------------------------
+## Intent: Perform a lint check on command line script sources
+## -----------------------------------------------------------------------
 lint-shell:
-	shellcheck --version
-	find . \( -name 'staging' -o -name 'vst_venv' \) -prune \
-	    -o -name '*.sh' ! -name 'activate.sh' -print0 \
-	| xargs -0 -n1 shellcheck
+	$(shell-check) -V
+	@echo
+	$(HIDE)$(env-clean) $(shell-check-find) \
+	    | $(xargs-n1) $(shell-check) $(shell-check-args)
 
-help::
-	@echo "  lint-shell           Syntax check bash,bourne,etc sources"
+## -----------------------------------------------------------------------
+## Intent: Display command help
+## -----------------------------------------------------------------------
+help-summary ::
+	@echo '  lint-shell          Syntax check shell sources'
+
+# [SEE ALSO]
+# -----------------------------------------------------------------------
+#   o https://www.shellcheck.net/wiki/Directive
 
 # [EOF]
diff --git a/makefiles/lint/yaml.mk b/makefiles/lint/yaml.mk
index c9cb392..8672daa 100644
--- a/makefiles/lint/yaml.mk
+++ b/makefiles/lint/yaml.mk
@@ -1,8 +1,8 @@
 # -*- makefile -*-
 # -----------------------------------------------------------------------
-# Copyright 2017-2022 Open Networking Foundation
+# Copyright 2017-2023 Open Networking Foundation (ONF) and the ONF Contributors
 #
-# Licensed under the Apache License, Version 2.0 (the "License");
+# 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
 #
@@ -15,18 +15,71 @@
 # limitations under the License.
 # -----------------------------------------------------------------------
 
-YAML_FILES ?= $(error YAML_FILES= is required)
+$(if $(DEBUG),$(warning ENTER))
 
-.PHONY: lint-yaml
+##-------------------##
+##---]  GLOBALS  [---##
+##-------------------##
+.PHONY: lint-yaml lint-yaml-all lint-yaml-modified
 
-lint : lint-yaml
+## -----------------------------------------------------------------------
+## Intent: Use the yaml command to perform syntax checking.
+##   o If UNSTABLE=1 syntax check all sources
+##   o else only check sources modified by the developer.
+## Usage:
+##   % make lint UNSTABLE=1
+##   % make lint-yaml-all
+## -----------------------------------------------------------------------
 
-lint-yaml: vst_venv
-	source ./$</bin/activate \
-	    ; set -u \
-	    ; yamllint -s $(YAML_FILES)
+ifndef NO-LINT-YAML
+  have-yaml-files := $(if $(strip $(YAML_FILES)),true)
+  YAML_FILES      ?= $(error YAML_FILES= is required)
 
+  lint-yaml-mode := $(if $(have-yaml-files),modified,all)
+  lint-yaml : lint-yaml-$(lint-yaml-mode)
+
+  lint : lint-yaml#     # Enable as a default lint target
+endif# NO-LINT-YAML
+
+## -----------------------------------------------------------------------
+## Intent: exhaustive yaml syntax checking
+## -----------------------------------------------------------------------
+lint-yaml-all:
+	$(HIDE)$(MAKE) --no-print-directory lint-yaml-install
+
+	find . \( -iname '*.yaml' -o -iname '*.yml' \) -print0 \
+	    | $(xargs-n1-clean) yamllint --strict
+
+## -----------------------------------------------------------------------
+## Intent: check deps for format and python3 cleanliness
+## Note:
+##   yaml --py3k option no longer supported
+## -----------------------------------------------------------------------
+lint-yaml-modified:
+	$(HIDE)$(MAKE) --no-print-directory lint-yaml-install
+	yamllint -s $(YAML_FILES)
+
+## -----------------------------------------------------------------------
+## Intent:
+## -----------------------------------------------------------------------
+lint-yaml-install:
+	@echo
+	@echo "** -----------------------------------------------------------------------"
+	@echo "** yaml syntax checking"
+	@echo "** -----------------------------------------------------------------------"
+	yamllint --version
+	@echo
+
+## -----------------------------------------------------------------------
+## Intent: Display command usage
+## -----------------------------------------------------------------------
 help::
-	@echo "  lint-yaml            Syntax check yaml source using yamllint"
+	@echo '  lint-yaml          Syntax check python using the yaml command'
+  ifdef VERBOSE
+	@echo '  lint-yaml-all       yaml checking: exhaustive'
+	@echo '  lint-yaml-modified  yaml checking: only locally modified'
+  endif
+
+$(if $(DEBUG),$(warning LEAVE))
 
 # [EOF]
diff --git a/makefiles/nop b/makefiles/nop
deleted file mode 100644
index ba2b114..0000000
--- a/makefiles/nop
+++ /dev/null
@@ -1 +0,0 @@
-Thu Apr 13 10:18:26 AM EDT 2023
diff --git a/makefiles/release/bbr.mk b/makefiles/release/bbr.mk
index 02bb0e4..79ae03b 100644
--- a/makefiles/release/bbr.mk
+++ b/makefiles/release/bbr.mk
@@ -39,10 +39,10 @@
 ##   o create a response file for passing docker env vars
 ##   o cross-compile: GOOS= GOARCH= go build
 ## -----------------------------------------------------------------------
-tans release-bbr: $(release-bbr-deps)
+release-bbr: $(release-bbr-deps)
 
 .PHONY: $(release-bbr-deps)
-$(release-bbr-deps):
+tans $(release-bbr-deps):
 
 	@echo
 	@echo "** -----------------------------------------------------------------------"
diff --git a/makefiles/targets/check.mk b/makefiles/targets/check.mk
new file mode 100644
index 0000000..aa1b0d0
--- /dev/null
+++ b/makefiles/targets/check.mk
@@ -0,0 +1,38 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2022-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.
+#
+# SPDX-FileCopyrightText: 2022-2023 Open Networking Foundation (ONF) and the ONF Contributors
+# SPDX-License-Identifier: Apache-2.0
+# -----------------------------------------------------------------------
+
+$(if $(DEBUG),$(warning ENTER))
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+.PHONY: check
+check : lint lint-yaml lint-jjb
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+help-verbose += help-check
+help-check ::
+	@echo
+	@echo '[MAKE: check]'
+	@echo '  check               pre-commit checking, with extra targets (default:NO, jenkins:FAIL)'
+
+$(if $(DEBUG),$(warning LEAVE))
+
+# [EOF]
diff --git a/makefiles/targets/clean.mk b/makefiles/targets/clean.mk
new file mode 100644
index 0000000..f787e5c
--- /dev/null
+++ b/makefiles/targets/clean.mk
@@ -0,0 +1,40 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2022-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.
+#
+# SPDX-FileCopyrightText: 2022-2023 Open Networking Foundation (ONF) and the ONF Contributors
+# SPDX-License-Identifier: Apache-2.0
+# -----------------------------------------------------------------------
+
+$(if $(DEBUG),$(warning ENTER))
+
+## -----------------------------------------------------------------------
+## Intent: Remove makefile generated content
+## -----------------------------------------------------------------------
+.PHONY: clean
+clean ::
+	$(RM) -r $(JOBCONFIG_DIR)
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+help-verbose += help-clean
+help-clean ::
+	@echo
+	@echo '[MAKE: clean]'
+	@echo '  clean               Remove makefile generated content'
+
+$(if $(DEBUG),$(warning LEAVE))
+
+# [EOF]
diff --git a/makefiles/targets/sterile.mk b/makefiles/targets/sterile.mk
new file mode 100644
index 0000000..c661f53
--- /dev/null
+++ b/makefiles/targets/sterile.mk
@@ -0,0 +1,45 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2022-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.
+#
+# SPDX-FileCopyrightText: 2022-2023 Open Networking Foundation (ONF) and the ONF Contributors
+# SPDX-License-Identifier: Apache-2.0
+# -----------------------------------------------------------------------
+
+$(if $(DEBUG),$(warning ENTER))
+
+## -----------------------------------------------------------------------
+## Intent: Revert sandbox into a pristine checkout stage
+## -----------------------------------------------------------------------
+##   Note: Sterile target behavior differs from clean around handling of
+##         persistent content.  For ex removal of a python virtualenv adds
+##         extra overhead to development iteration:
+##           make clean   - preserve a virtual env
+##           make sterile - force reinstallation
+## -----------------------------------------------------------------------
+.PHONY: sterile
+sterile :: clean
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+help-verbose += help-sterile
+help-sterile ::
+	@echo
+	@echo '[MAKE: sterile]'
+	@echo '  sterile             make clean, also remove persistent content (~venv)'
+
+$(if $(DEBUG),$(warning LEAVE))
+
+# [EOF]
diff --git a/makefiles/targets/test.mk b/makefiles/targets/test.mk
new file mode 100644
index 0000000..2f68086
--- /dev/null
+++ b/makefiles/targets/test.mk
@@ -0,0 +1,41 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2022-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.
+#
+# SPDX-FileCopyrightText: 2022-2023 Open Networking Foundation (ONF) and the ONF Contributors
+# SPDX-License-Identifier: Apache-2.0
+# -----------------------------------------------------------------------
+
+$(if $(DEBUG),$(warning ENTER))
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+.PHONY: test
+test: $(venv-activate-script) $(JOBCONFIG_DIR)
+	$(activate) \
+	&& pipdeptree \
+	&& jenkins-jobs -l DEBUG test --recursive --config-xml -o "$(JOBCONFIG_DIR)" jjb/ ;
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+help-verbose += help-test
+help-test ::
+	@echo
+	@echo '[MAKE: test]'
+	@echo '  test                Perform testing that a jenkins job pull request will invoke'
+
+$(if $(DEBUG),$(warning LEAVE))
+
+# [EOF]
diff --git a/makefiles/targets/tox.mk b/makefiles/targets/tox.mk
new file mode 100644
index 0000000..44da921
--- /dev/null
+++ b/makefiles/targets/tox.mk
@@ -0,0 +1,41 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2022-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.
+#
+# SPDX-FileCopyrightText: 2022-2023 Open Networking Foundation (ONF) and the ONF Contributors
+# SPDX-License-Identifier: Apache-2.0
+# -----------------------------------------------------------------------
+
+$(if $(DEBUG),$(warning ENTER))
+
+## -----------------------------------------------------------------------
+## Intent: Sanity check incoming JJB config changes.
+##   Todo: Depend on makefiles/lint/jjb.mk :: lint-jjb
+## -----------------------------------------------------------------------
+# lint : lint-jjb
+lint-tox: lint-jjb
+	tox -e py310
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+help-verbose += help-tox
+help-tox ::
+	@echo
+	@echo '[MAKE: tox]'
+	@echo '  lint-tox            Python unit testing, sanity check incoming JJB changes.'
+
+$(if $(DEBUG),$(warning LEAVE))
+
+# [EOF]
diff --git a/makefiles/todo.mk b/makefiles/todo.mk
index 19e2272..8b3c658 100644
--- a/makefiles/todo.mk
+++ b/makefiles/todo.mk
@@ -28,6 +28,10 @@
 todo ::
 	@echo
 	@echo "[TODO: bbsim]"
+	@echo '  update makefiles to the latest from repo:onf-make'
+	@echo '  merge hadolint targets into onf-make if not fully supported yet'
+	@echo '  merge makefiles/tools.mk into makefiles/docker'
+	@echo '  merge and replace makefiles/lint/docker/*.mk with latest repo:onf-make/'
 
 $(if $(DEBUG),$(warning LEAVE))
 
diff --git a/makefiles/lint/python.mk b/makefiles/utils/include.mk
similarity index 65%
copy from makefiles/lint/python.mk
copy to makefiles/utils/include.mk
index 86503a7..5a7678f 100644
--- a/makefiles/lint/python.mk
+++ b/makefiles/utils/include.mk
@@ -1,6 +1,6 @@
 # -*- makefile -*-
 # -----------------------------------------------------------------------
-# Copyright 2017-2022 Open Networking Foundation
+# Copyright 2022-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.
@@ -13,21 +13,17 @@
 # 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.
+#
+# SPDX-FileCopyrightText: 2022-2023 Open Networking Foundation (ONF) and the ONF Contributors
+# SPDX-License-Identifier: Apache-2.0
 # -----------------------------------------------------------------------
 
-PYTHON_FILES ?= $(error PYTHON_FILES= is required)
+$(if $(DEBUG),$(warning ENTER))
 
-.PHONY: lint-python
+# usage: $(call if-not,false,5)
+if-not = $(info 1=$(1), 2=$(2), 3=$(3))\
+  $(if $(1),$(null),$(2))
 
-lint : lint-python
-
-lint-python: vst_venv
-	-source ./$</bin/activate \
-	    && set -u \
-	    && pylint $(PYTHON_FILES) \
-	    && flake8 --max-line-length=99 --count $(PYTHON_FILES)
-
-help::
-	@echo "  lint-python          Syntax check using pylint and flake8"
+$(if $(DEBUG),$(warning LEAVE))
 
 # [EOF]
diff --git a/makefiles/utils/test/makefile b/makefiles/utils/test/makefile
new file mode 100644
index 0000000..a148cfa
--- /dev/null
+++ b/makefiles/utils/test/makefile
@@ -0,0 +1,9 @@
+# -*- makefile -*-
+
+include ../include.mk
+
+all:
+
+test ::
+	@echo "Testing if-not"
+	@echo $(call if-not,$(null),true,false)
diff --git a/makefiles/virtualenv.mk b/makefiles/virtualenv.mk
new file mode 100644
index 0000000..a8e792d
--- /dev/null
+++ b/makefiles/virtualenv.mk
@@ -0,0 +1,97 @@
+# -*- makefile -*-
+## -----------------------------------------------------------------------
+# Copyright 2017-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.
+# -----------------------------------------------------------------------
+# https://gerrit.opencord.org/plugins/gitiles/onf-make
+# ONF.makefile.version = 1.2
+# -----------------------------------------------------------------------
+
+$(if $(DEBUG),$(warning ENTER))
+
+##-------------------##
+##---]  GLOBALS  [---##
+##-------------------##
+.PHONY: venv
+
+##------------------##
+##---]  LOCALS  [---##
+##------------------##
+venv-name             ?= .venv#                            # default install directory
+venv-abs-path         := $(PWD)/$(venv-name)
+venv-activate-bin     := $(venv-name)/bin
+venv-activate-script  := $(venv-activate-bin)/activate#    # dependency
+
+# Intent: activate= is a macro for accessing the virtualenv activation script#
+#  Usage: $(activate) && python
+activate             ?= set +u && source $(venv-activate-script) && set -u
+
+## -----------------------------------------------------------------------
+## Intent: Activate script path dependency
+## Usage:
+##    o place on the right side of colon as a target dependency
+##    o When the script does not exist install the virtual env and display.
+## ----------------------------------------------------------------------
+$(venv-activate-script):
+	@echo
+	@echo "============================="
+	@echo "Installing python virtual env"
+	@echo "============================="
+	virtualenv -p python3 $(venv-name)
+	$(activate) && python -m pip install --upgrade pip
+	$(activate) && pip install --upgrade setuptools
+	$(activate) && [[ -r requirements.txt ]] \
+	    && { python -m pip install -r requirements.txt; } \
+	    || { /bin/true; }
+
+	$(activate) && python --version
+
+## -----------------------------------------------------------------------
+## Intent: Explicit named installer target w/o dependencies.
+##         Makefile targets should depend on venv-activate-script.
+## -----------------------------------------------------------------------
+venv-activate-patched := $(venv-activate-script).patched
+venv-activate-patched : $(venv-activate-patched)
+$(venv-activate-patched) : $(venv-activate-script)
+	$(call banner-enter,Target $@)
+	$(onf-mk-top)/../patches/python_310_migration.sh --venv "$(venv-name)" 'apply'
+	touch $@
+	$(call banner-leave,Target $@)
+
+## -----------------------------------------------------------------------
+## Intent: Explicit named installer target w/o dependencies.
+##         Makefile targets should depend on venv-activate-script.
+## -----------------------------------------------------------------------
+venv: $(venv-activate-script)
+
+## -----------------------------------------------------------------------
+## Intent: Revert installation to a clean checkout
+## -----------------------------------------------------------------------
+sterile :: clean
+	$(RM) -r "$(venv-abs-path)"
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+help ::
+	@echo
+	@echo '[VIRTUAL ENV]'
+	@echo '  venv                Create a python virtual environment'
+	@echo '    venv-name=        Subdir name for virtualenv install'
+	@echo '  venv-activate-script         make macro name'
+	@echo '      $$(target) dependency    install python virtualenv'
+	@echo '      source $$(macro) && cmd  configure env and run cmd'
+
+$(if $(DEBUG),$(warning LEAVE))
+
+# [EOF]