VOL-4905 - Deploy new voltctl version.

makefile/consts.mk
------------------
  o Import current library contsants makefile for additional defines.

Makefile
makefiles/release/include.mk
makefiles/release/release-build.mk
----------------------------------
  o Use std set -euo pipefail, -u missing, fix undef vars as needed.
  o Modularize, relocate release-* target logic into a named makefile.
  o Minor clenaups helped docker volume mount for /app/release => localhost:{cwd}/release.
  o Replace GO_SH inlined quoting with macro $(quote-single).
    - Syntax did not play well with editor colorization.
    - Magic trailing command quote appended to line continuation were ugly problems.
    - todo: replace with $GO_SH $(call quoted,command-text-line-continuation)

Change-Id: I4338d3f895cf45b508a705051c92df938be71296
diff --git a/makefiles/consts.mk b/makefiles/consts.mk
index 8d8270d..5f04e23 100644
--- a/makefiles/consts.mk
+++ b/makefiles/consts.mk
@@ -1,6 +1,6 @@
 # -*- makefile -*-
 # -----------------------------------------------------------------------
-# Copyright 2022 Open Networking Foundation (ONF) and the ONF Contributors
+# 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,18 +14,41 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-# SPDX-FileCopyrightText: 2022 Open Networking Foundation (ONF) and the ONF Contributors
+# SPDX-FileCopyrightText: 2022-2023 Open Networking Foundation (ONF) and the ONF Contributors
 # SPDX-License-Identifier: Apache-2.0
 # -----------------------------------------------------------------------
+# ONF.makefile.version = 1.0
+# -----------------------------------------------------------------------
 
-null        :=#
-space       := $(null) $(null)
-dot         ?= .
+$(if $(DEBUG),$(warning ENTER))
 
+# include makefiles/constants.mk
+export dot          :=.
+export null         :=#
+export space        := $(null) $(null)
+export quote-single := $(null)"$(null)# colorization-closing-quote(")
+export quote-double := $(null)'$(null)# colorization-closing-quote(')
+
+# [DEBUG] make {target} HIDE=
 HIDE        ?= @
-# SHELL       := bash -e -o pipefail
 
-env-clean   = /usr/bin/env --ignore-environment
+env-clean      ?= /usr/bin/env --ignore-environment
+xargs-n1       := xargs -0 -t -n1 --no-run-if-empty
+xargs-n1-clean := $(env-clean) $(xargs-n1)
 
+## -----------------------------------------------------------------------
+## Default shell:
+##   o set -e            enable error checking
+##   o set -u            report undefined errors
+##   o set -o pipefail   propogate shell pipeline failures.
+## -----------------------------------------------------------------------
+SHELL ?= /bin/bash
+have-shell-bash := $(filter bash,$(subst /,$(space),$(SHELL)))
+$(if $(have-shell-bash),$(null),\
+  $(eval export SHELL := bash -euo pipefail))
+
+export SHELL ?= bash -euo pipefail
+
+$(if $(DEBUG),$(warning LEAVE))
 
 # [EOF]
diff --git a/makefiles/release/include.mk b/makefiles/release/include.mk
new file mode 100644
index 0000000..4ee1f1a
--- /dev/null
+++ b/makefiles/release/include.mk
@@ -0,0 +1,38 @@
+# -*- 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
+# -----------------------------------------------------------------------
+
+$(if $(DEBUG),$(warning ENTER))
+
+## -----------------------------------------------------------------------
+## Intent: Dispaly a help section for release targets
+## -----------------------------------------------------------------------
+help::
+	@echo
+	@echo '[RELEASE]'
+	@echo "  release             Build then publish binaries to github/release"
+
+##--------------------##
+##---]  INCLUDES  [---##
+##--------------------##
+include $(MAKEDIR)/release/release-build.mk
+
+$(if $(DEBUG),$(warning LEAVE))
+
+# [EOF]
diff --git a/makefiles/release/release-build.mk b/makefiles/release/release-build.mk
new file mode 100644
index 0000000..4a2bd3f
--- /dev/null
+++ b/makefiles/release/release-build.mk
@@ -0,0 +1,72 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2019-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))
+
+## -----------------------------------------------------------------------
+## Intent:
+##   o Generate volctl binaries in a docker container container
+##   o Copy container:/apps/release to localhost:{pwd}/release
+## -----------------------------------------------------------------------
+## [TODO] Replace ${GO_SH} $(single-quote) ..   with $(call quoted,cmd-text)
+## -----------------------------------------------------------------------
+release-build :
+
+	@echo 
+	@echo "** -----------------------------------------------------------------------"
+	@echo "** $(MAKE): processing target [$@]"
+	@echo "** Sandbox: $(shell /bin/pwd)"
+	@echo "** -----------------------------------------------------------------------"
+
+	@echo -e "\n** golang attributes"
+	$(HIDE)${GO_SH} $(call quoted,which$(space)-a$(space)go)
+	$(HIDE)${GO_SH} $(call quoted,go$(space)version)
+
+	@echo -e "\n** Create filesystem target for docker volume: $(RELEASE_DIR)"
+	$(RM) -r "./$(RELEASE_DIR)"
+	mkdir -vp "$(RELEASE_DIR)"
+
+	@echo
+	@echo '** Docker builds bins into mounted filesystem:'
+	@echo '**   container:/app/relase'
+	@echo '**   localhost:{pwd}/release'
+	@${GO_SH} $(single-quote) \
+	  set -e -o pipefail; \
+	  for x in ${RELEASE_OS_ARCH}; do \
+	    OUT_PATH="$(RELEASE_DIR)/$(RELEASE_NAME)-$(subst -dev,_dev,$(VERSION))-$$x"; \
+	    echo "$$OUT_PATH"; \
+	    GOOS=$${x%-*} GOARCH=$${x#*-} go build -mod=vendor -v $(LDFLAGS) -o "$$OUT_PATH" cmd/voltctl/voltctl.go; \
+	done \
+$(single-quote)
+
+	@echo
+	@echo '** Post-build, files to release'
+	$(HIDE)find "$(RELEASE_DIR)" ! -type d -print
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+clean ::
+	$(RM) -r "./$(RELEASE_DIR)"
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+help ::
+	@echo '  release-build       Cross-compile binaries into a docker mounted filesystem'
+
+$(if $(DEBUG),$(warning LEAVE))
+
+# [EOF]