VOL-4883 - Publish a new bbsim release
https://github.com/opencord/bbsim/releases/tag/untagged-6d947de2a6078a1fe175
----------------------------------------------------------------------------
o Draft bbsim release v2.96.8572 created by this patch set.
o All 6cross-compile binaries are now included.
o Change ID + commit message document the release.
o Binaries downloaded/tested using {bbr,bbsim,bbsimctl} --help
Makefile
--------
o Makefile release target is now able to cross compile all binaries:
- bbsimctl cross compiled to arm, darwin, linux and windows.
- release-{bbr, bbsim} only built *-linux-amd64
o Refactor targets into a more modular and hierarchial setup.
o Be sure to create RELEASE_DIR early on localhost so docker
container can create a volume (NFS mount) for building into.
o Display banners when building targets to improve log readability.
o Clean targets updated to remove everything generated.
o Help targets added to document indvidual target logic.
o Makefile logic heavily commented.
makefiles/release/bbr.mk
makefiles/release/bbsim.mk
makefiles/release/bbsimctl.mk
-----------------------------
o Relocate build-* and release-* target logic into named makefiles.
o Update SHELL to set -euo pipefail to detect uninit shell vars.
o Replaced shell/looping logic with true makefile target dependencies:
- shell/loop replaced with a target rule that builds one platform binary.
- Derive a list of targets release/{bbr,bbsim,bbsimctl}-{os}-{arch}
- release: depends on all buildable targets
- release rule can extract arch= and os= from target path being built.
- To simplify logic construct env vars separately into a response file.
- passed as "docker --env-file [x]" VS appending to an ever growing command line.
o Marked more targets as .PHONY so they will always build.
o Added helper target 'onf-publish' for exercising changes in the github-release script.
makefiles/include.mk
--------------------
o Single include for importing all library makefiles.
makefiles/consts.mk
-------------------
o Include fixed values, esp $(quote-single) which is now used to document
o Refactor duplication in GO_* macros into named/reused values to shorten lines.
makefiles/lint
--------------
o Moved lint::docker (hadolint target) into makefiles/lint/docker/*.mk.
o Added makefiles/lint library targets for ability to lint more sources.
makefiles/tools.mk
------------------
o Refactor DOCKER_* and GO_* macros into a named includable makefile.q
Change-Id: I8791317ba0c3f01d047f363e69f8885a03f1a1a1
diff --git a/makefiles/release/bbr.mk b/makefiles/release/bbr.mk
new file mode 100644
index 0000000..02bb0e4
--- /dev/null
+++ b/makefiles/release/bbr.mk
@@ -0,0 +1,121 @@
+# -*- 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.
+# -----------------------------------------------------------------------
+
+$(if $(DEBUG),$(warning ENTER))
+
+##-------------------##
+##---] GLOBALS [---##
+##-------------------##
+RELEASE_BBR_NAME ?= bbr
+
+# release-target-deps += release-bbr
+
+# -----------------------------
+# release/bbsimctl-darwin-amd64
+# release/bbsimctl-linux-amd64
+# release/bbsimctl-windows-amd64
+# -----------------------------
+release-bbr-deps :=\
+ $(call release-gen-deps,RELEASE_BBR_NAME,RELEASE_OS_ARCH,RELEASE_DIR)
+
+## -----------------------------------------------------------------------
+## Intent: Cross-compile bbr binaries as dependency targets
+## o target: release/bbr-linux-amd64
+## o create release/ for VOLUME mounting by docker container
+## o create a response file for passing docker env vars
+## o cross-compile: GOOS= GOARCH= go build
+## -----------------------------------------------------------------------
+tans release-bbr: $(release-bbr-deps)
+
+.PHONY: $(release-bbr-deps)
+$(release-bbr-deps):
+
+ @echo
+ @echo "** -----------------------------------------------------------------------"
+ @echo "** $(MAKE): processing target [$@]"
+ @echo "** -----------------------------------------------------------------------"
+
+ # Docker container is responsible for compiling
+ # Release target will publish from localhost:release/
+ # Binaries are built into mounted docker volume /app/release => localhost:release/
+ $(HIDE)mkdir -vp "$(RELEASE_DIR)"
+ $(HIDE)umask 000 && chmod 777 "$(RELEASE_DIR)"
+
+ # -----------------------------------------------------------------------
+ # Create a response file for passing environment vars to docker
+ # -----------------------------------------------------------------------
+ $(HIDE)$(RM) $(notdir $@).env
+ $(HIDE)echo -e '#!/bin/bash\n' \
+ 'GOOS=$(call get-hyphen-field,2,$@)\n' \
+ 'GOARCH=$(call get-hyphen-field,3,$@)\n' \
+ >> "$(notdir $@).env"
+
+ # -----------------------------------------------------------------------
+ # Compile a platform binary
+ # -----------------------------------------------------------------------
+ $(HIDE) \
+ umask 022 \
+\
+ && echo "** Building: $@" \
+ && set -x \
+ && $(call my-go-sh,$(notdir $@).env) \
+ $(quote-single) \
+ go build -mod vendor \
+ -ldflags "-w -X main.buildTime=$(shell date +%Y/%m/%d-%H:%M:%S) \
+ -X main.commitHash=$(shell git log --pretty=format:%H -n 1) \
+ -X main.gitStatus=${GIT_STATUS} \
+ -X main.version=${VERSION}" \
+ -o "$@" ./cmd/bbr \
+ $(quote-single)
+
+ # -----------------------------------------------------------------------
+ # Cleanup and display results
+ # -----------------------------------------------------------------------
+ @$(RM) $(notdir $@).env
+ $(HIDE)umask 000 && chmod 755 "$(RELEASE_DIR)"
+ $(HIDE)file "$@"
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+build-bbr: local-omci-lib-go local-protos
+ @go build -mod vendor \
+ -ldflags "-w -X main.buildTime=$(shell date +%Y/%m/%d-%H:%M:%S) \
+ -X main.commitHash=$(shell git log --pretty=format:%H -n 1) \
+ -X main.gitStatus=${GIT_STATUS} \
+ -X main.version=${VERSION}" \
+ ./cmd/bbr
+
+## -----------------------------------------------------------------------
+## Intent: Remove generated targets
+## -----------------------------------------------------------------------
+clean ::
+ $(RM) $(release-bbr-deps)
+ $(RM) *.env
+ $(RM) $(RELEASE_BBR_NAME)
+
+## -----------------------------------------------------------------------
+## Intent: Display target help#
+# -----------------------------------------------------------------------
+help ::
+ @echo
+ @echo '[bbr]'
+ @echo ' build-bbr Compile bbr on localhost'
+ @echo ' release-bbr Cross-compile bbr binary for release'
+
+$(if $(DEBUG),$(warning LEAVE))
+
+# [EOF]
diff --git a/makefiles/release/bbsim.mk b/makefiles/release/bbsim.mk
new file mode 100644
index 0000000..87b8673
--- /dev/null
+++ b/makefiles/release/bbsim.mk
@@ -0,0 +1,132 @@
+# -*- 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.
+# -----------------------------------------------------------------------
+
+$(if $(DEBUG),$(warning ENTER))
+
+##-------------------##
+##---] GLOBALS [---##
+##-------------------##
+RELEASE_BBSIM_NAME ?= bbsim
+
+# release-target-deps += release-bbsim
+
+# -----------------------------
+# release/bbsim-darwin-amd64
+# release/bbsim-linux-amd64
+# release/bbsim-windows-amd64
+# -----------------------------
+release-bbsim-deps :=\
+ $(call release-gen-deps,RELEASE_BBSIM_NAME,RELEASE_OS_ARCH,RELEASE_DIR)
+
+## -----------------------------------------------------------------------
+## Intent: Cross-compile bbsim binaries as dependency targets
+## o target: release/bbsim-linux-amd64
+## o create release/ for VOLUME mounting by docker container
+## o create a response file for passing docker env vars
+## o cross-compile: GOOS= GOARCH= go build
+## -----------------------------------------------------------------------
+release-bbsim: $(release-bbsim-deps)
+
+.PHONY: $(release-bbsim-deps)
+$(release-bbsim-deps):
+
+ @echo
+ @echo "** -----------------------------------------------------------------------"
+ @echo "** $(MAKE): processing target [$@]"
+ @echo "** -----------------------------------------------------------------------"
+
+ # Docker container is responsible for compiling
+ # Release target will publish from localhost:release/
+ # Binaries are built into mounted docker volume /app/release => localhost:release/
+ $(HIDE)mkdir -vp "$(RELEASE_DIR)"
+ $(HIDE)umask 000 && chmod 777 "$(RELEASE_DIR)"
+
+ # -----------------------------------------------------------------------
+ # Create a response file for passing environment vars to docker
+ # -----------------------------------------------------------------------
+ $(HIDE)$(RM) $(notdir $@).env
+ $(HIDE)echo -e '#!/bin/bash\n' \
+ 'GOOS=$(call get-hyphen-field,2,$@)\n' \
+ 'GOARCH=$(call get-hyphen-field,3,$@)\n' \
+ >> "$(notdir $@).env"
+
+ # -----------------------------------------------------------------------
+ # Compile a platform binary
+ # -----------------------------------------------------------------------
+ $(HIDE) \
+ umask 022 \
+\
+ && echo "** Building: $@" \
+ && set -x \
+ && $(call my-go-sh,$(notdir $@).env) \
+ $(quote-single) \
+ go build -mod vendor \
+ -ldflags "-w -X main.buildTime=$(shell date +%Y/%m/%d-%H:%M:%S) \
+ -X main.commitHash=$(shell git log --pretty=format:%H -n 1) \
+ -X main.gitStatus=${GIT_STATUS} \
+ -X main.version=${VERSION}" \
+ -o "$@" ./cmd/bbsim \
+ $(quote-single)
+
+ # -----------------------------------------------------------------------
+ # Cleanup and display results
+ # -----------------------------------------------------------------------
+ @$(RM) $(notdir $@).env
+ $(HIDE)umask 000 && chmod 755 "$(RELEASE_DIR)"
+ $(HIDE)file "$@"
+
+
+release-bbsim-x:
+ @echo "$(RELEASE_BBSIM_NAME)-linux-amd64"
+ ${GO} build -mod vendor \
+ -ldflags "-w -X main.buildTime=$(shell date +%Y/%m/%d-%H:%M:%S) \
+ -X main.commitHash=$(shell git log --pretty=format:%H -n 1) \
+ -X main.gitStatus=${GIT_STATUS} \
+ -X main.version=${VERSION}" \
+ -o "$(RELEASE_DIR)/$(RELEASE_BBSIM_NAME)-linux-amd64" ./cmd/bbsim
+
+## -----------------------------------------------------------------------
+## Intent: Build bbsimctl on localhost
+## -----------------------------------------------------------------------
+build-bbsim:
+ @go build -mod vendor \
+ -ldflags "-w -X main.buildTime=$(shell date +%Y/%m/%d-%H:%M:%S) \
+ -X main.commitHash=$(shell git log --pretty=format:%H -n 1) \
+ -X main.gitStatus=${GIT_STATUS} \
+ -X main.version=${VERSION}" \
+ ./cmd/bbsim
+
+## -----------------------------------------------------------------------
+## Intent: Remove generated targets
+## -----------------------------------------------------------------------
+clean ::
+ $(RM) $(release-bbsim-deps)
+ $(RM) *.env
+ $(RM) $(RELEASE_BBSIM_NAME)
+
+## -----------------------------------------------------------------------
+## Intent: Display target help#
+# -----------------------------------------------------------------------
+help ::
+ @echo
+ @echo '[bbsim]'
+ @echo ' build-bbsim Compile bbsim on localhost'
+ @echo ' release-bbsim Cross-compile bbsim binaries into a docker mounted filesystem'
+
+$(if $(DEBUG),$(warning LEAVE))
+
+# [EOF]
diff --git a/makefiles/release/bbsimctl.mk b/makefiles/release/bbsimctl.mk
new file mode 100644
index 0000000..550cd20
--- /dev/null
+++ b/makefiles/release/bbsimctl.mk
@@ -0,0 +1,124 @@
+# -*- 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.
+# -----------------------------------------------------------------------
+
+$(if $(DEBUG),$(warning ENTER))
+
+##-------------------##
+##---] GLOBALS [---##
+##-------------------##
+RELEASE_BBSIMCTL_NAME ?= bbsimctl
+
+bbsimctl-config := github.com/opencord/bbsim/internal/bbsimctl/config
+
+# release-target-deps += release-bbsimctl
+
+# -----------------------------
+# release/bbsimctl-darwin-amd64
+# release/bbsimctl-linux-amd64
+# release/bbsimctl-windows-amd64
+# -----------------------------
+release-bbsimctl-deps :=\
+ $(call release-gen-deps,RELEASE_BBSIMCTL_NAME,RELEASE_OS_ARCH,RELEASE_DIR)
+
+## -----------------------------------------------------------------------
+## Intent: Cross-compile bbsimctl binaries as dependency targets
+## o target: release/bbsimctl-linux-amd64
+## o create release/ for VOLUME mounting by docker container
+## o create a response file for passing docker env vars
+## o cross-compile: GOOS= GOARCH= go build
+## -----------------------------------------------------------------------
+release-bbsimctl: $(release-bbsimctl-deps)
+
+.PHONY: $(release-bbsimctl-deps)
+$(release-bbsimctl-deps):
+
+ @echo
+ @echo "** -----------------------------------------------------------------------"
+ @echo "** $(MAKE): processing target [$@]"
+ @echo "** -----------------------------------------------------------------------"
+
+ # Docker container is responsible for compiling
+ # Release target will publish from localhost:release/
+ # Binaries are built into mounted docker volume /app/release=> localhost:release/
+ $(HIDE)mkdir -vp "$(RELEASE_DIR)"
+ $(HIDE)umask 000 && chmod 777 "$(RELEASE_DIR)"
+
+ # -----------------------------------------------------------------------
+ # Create a response file for passing environment vars to docker
+ # -----------------------------------------------------------------------
+ $(HIDE)$(RM) $(notdir $@).env
+ $(HIDE)echo -e '#!/bin/bash\n' \
+ 'GOOS=$(call get-hyphen-field,2,$@)\n' \
+ 'GOARCH=$(call get-hyphen-field,3,$@)\n' \
+ >> "$(notdir $@).env"
+
+ # -----------------------------------------------------------------------
+ # Compile a platform binary
+ # -----------------------------------------------------------------------
+ $(HIDE) \
+ umask 022 \
+\
+ && echo "** Building: $@" \
+ && set -x \
+ && $(call my-go-sh,$(notdir $@).env) \
+ $(quote-single) \
+ go build -mod vendor \
+ -ldflags "-w -X $(bbsimctl-config).BuildTime=$(shell date +%Y/%m/%d-%H:%M:%S) \
+ -X $(bbsimctl-config).CommitHash=$(shell git log --pretty=format:%H -n 1) \
+ -X $(bbsimctl-config).GitStatus=${GIT_STATUS} \
+ -X $(bbsimctl-config).Version=${VERSION}" \
+ -o "$@" ./cmd/bbsimctl \
+ $(quote-single)
+
+ # -----------------------------------------------------------------------
+ # Cleanup and display results
+ # -----------------------------------------------------------------------
+ @$(RM) $(notdir $@).env
+ $(HIDE)umask 000 && chmod 755 "$(RELEASE_DIR)"
+ $(HIDE)file "$@"
+
+## -----------------------------------------------------------------------
+## Intent: Build bbsimctl on localhost
+## -----------------------------------------------------------------------
+build-bbsimctl:
+ @go build -mod vendor \
+ -ldflags "-w -X github.com/opencord/bbsim/internal/bbsimctl/config.BuildTime=$(shell date +%Y/%m/%d-%H:%M:%S) \
+ -X github.com/opencord/bbsim/internal/bbsimctl/config.CommitHash=$(shell git log --pretty=format:%H -n 1) \
+ -X github.com/opencord/bbsim/internal/bbsimctl/config.GitStatus=${GIT_STATUS} \
+ -X github.com/opencord/bbsim/internal/bbsimctl/config.Version=${VERSION}" \
+ ./cmd/bbsimctl
+
+## -----------------------------------------------------------------------
+## Intent: Remove generated targets
+## -----------------------------------------------------------------------
+clean ::
+ $(RM) $(release-bbsimctl-deps)
+ $(RM) *.env
+ $(RM) bbsimclt
+
+## -----------------------------------------------------------------------
+## Intent: Display target help#
+# -----------------------------------------------------------------------
+help ::
+ @echo
+ @echo '[bbsimctl]'
+ @echo ' build-bbsimctl Compile bbsimctl on localhost'
+ @echo ' release-bbsimctl Cross-compile bbsimctl binaries into a docker mounted filesystem'
+
+$(if $(DEBUG),$(warning LEAVE))
+
+# [EOF]
diff --git a/makefiles/release/consts.mk b/makefiles/release/consts.mk
new file mode 100644
index 0000000..ba019b6
--- /dev/null
+++ b/makefiles/release/consts.mk
@@ -0,0 +1,32 @@
+# -*- 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.
+# -----------------------------------------------------------------------
+
+$(if $(DEBUG),$(warning ENTER))
+
+# Release related items
+# Generates binaries in $RELEASE_DIR with name $RELEASE_NAME-$RELEASE_OS_ARCH
+# Inspired by: https://github.com/kubernetes/minikube/releases
+RELEASE_DIR ?= release
+RELEASE_OS_ARCH ?= linux-amd64 linux-arm64 windows-amd64 darwin-amd64
+
+RELEASE_BBR_NAME ?= bbr
+RELEASE_BBSIM_NAME ?= bbsim
+RELEASE_BBSIMCTL_NAME ?= bbsimctl
+
+$(if $(DEBUG),$(warning LEAVE))
+
+# [EOF]
diff --git a/makefiles/release/include.mk b/makefiles/release/include.mk
new file mode 100644
index 0000000..d7c6ca8
--- /dev/null
+++ b/makefiles/release/include.mk
@@ -0,0 +1,86 @@
+# -*- 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))
+
+##--------------------##
+##---] INCLUDES [---##
+##--------------------##
+include $(MAKEDIR)/release/consts.mk
+include $(MAKEDIR)/release/macros.mk
+
+## -----------------------------------------------------------------------
+## Intent: Dispaly a help section for release targets
+## -----------------------------------------------------------------------
+help::
+ @echo
+ @echo '[RELEASE]'
+ @echo ' release Creates release ready binaries for BBSimctl and BBR artifacts'
+
+##--------------------##
+##---] INCLUDES [---##
+##--------------------##
+include $(MAKEDIR)/release/bbr.mk
+include $(MAKEDIR)/release/bbsim.mk
+include $(MAKEDIR)/release/bbsimctl.mk
+
+## -----------------------------------------------------------------------
+## Intent: Cross-compile binaries for release
+## -----------------------------------------------------------------------
+release-target-deps += release-bbr
+release-target-deps += release-bbsim
+# release-deps += release-bbsimctl
+
+## -----------------------------------------------------------------------
+## Intent: Create a release from targets release-{bbr,bbsim,bbsimctl}
+## Debug: $(foreach tgt,$(release-target-deps),$(info ** release-target-deps=$(tgt)))
+## -----------------------------------------------------------------------
+.PHONY: release
+release: $(release-target-deps)
+
+## -----------------------------------------------------------------------
+## Intent: Initialize storage then build release target groups (bbr, bbsim)
+## -----------------------------------------------------------------------
+.PHONY: $(release-targetdeps)
+$(release-target-deps) : release-init-mkdir
+
+## -----------------------------------------------------------------------
+## Intent: Prepare for a clean release build
+## -----------------------------------------------------------------------
+release-init:
+ @echo
+ @echo "** -----------------------------------------------------------------------"
+ @echo "** $(MAKE): processing target [$@]"
+ @echo "** -----------------------------------------------------------------------"
+
+ @echo -e "\n** Create filesystem target for docker volume: $(RELEASE_DIR)"
+ $(RM) -r "./$(RELEASE_DIR)"
+ mkdir -vp "$(RELEASE_DIR)"
+
+## -----------------------------------------------------------------------
+## Intent: Create storage for release binaries and docker volume mount
+## -----------------------------------------------------------------------
+.PHONY: release-init
+release-init-mkdir:
+ mkdir -vp "$(RELEASE_DIR)"
+
+$(if $(DEBUG),$(warning LEAVE))
+
+# [EOF]
diff --git a/makefiles/release/macros.mk b/makefiles/release/macros.mk
new file mode 100644
index 0000000..7a63529
--- /dev/null
+++ b/makefiles/release/macros.mk
@@ -0,0 +1,102 @@
+# -*- 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.
+# -----------------------------------------------------------------------
+
+$(if $(DEBUG),$(warning ENTER))
+
+## -----------------------------------------------------------------------
+## Intent: Given a hyphen separated list of values return item [n]
+## -----------------------------------------------------------------------
+## Usage:
+## value := foo-bar-tans-fans
+## tans-val = $(call get-hyphen-field,value,3)
+## -----------------------------------------------------------------------
+get-hyphen-field = $(word $(1),$(subst -,$(space),$(notdir $(2))))
+
+## -----------------------------------------------------------------------
+## Intent: Construct a parameterized $(GO_SH) command
+## Given:
+## argv[1] Response file containing environment vars passed to docker.
+## Usage:
+## cmd = $(my-go-sh,./env-vars)
+## Debug: view arguments passed
+## make DEBUG=1
+## -----------------------------------------------------------------------
+my-go-sh=$(strip \
+ $(docker-run-app) \
+ $(is-stdin) \
+ $(if $(1),--env-file $(1)) \
+ -v gocache:/.cache \
+ $(vee-golang) \
+ $(vee-citools)-golang \
+ sh -c \
+)
+
+## -----------------------------------------------------------------------
+## Intent: Derive a list of release platform binaries by name
+## -----------------------------------------------------------------------
+## Given:
+## $1 (scalar:name) $(RELEASE_BBSIM_NAME)
+## $2 (indirect:arches) $(RELEASE_OS_ARCH)
+## -----------------------------------------------------------------------
+## Usage: deps = $(call release-gen-deps-name,tool-name,tool-arches)
+## -----------------------------------------------------------------------
+release-gen-deps-name=$(strip \
+\
+ $(if $($(1)),$(null),$(error name= is required))\
+ $(if $($(2)),$(null),$(error arches= is required))\
+\
+ $(foreach name,$($(1)),\
+ $(if $(DEBUG),$(info name=$(name)))\
+ $(foreach arches,$(2),\
+ $(if $(DEBUG),$(info arches=$(arches)))\
+ $(foreach arch,$($(arches)),\
+ $(if $(DEBUG),$(info arch=$(arch): $(name)-$(arch)))\
+ $(name)-$(arch)\
+ )\
+ ))\
+)
+
+## -----------------------------------------------------------------------
+## Intent: Derive a list of release binary dependencies
+## -----------------------------------------------------------------------
+## Returns:
+## release/bbsim-darwin-amd64
+## release/bbsim-linux-amd64
+## release/bbsim-windows-amd64
+## -----------------------------------------------------------------------
+## Usage:
+## tool-name = bbsim
+## tool-arches = darwin linux windows
+## release-dir = release
+## deps = $(call release-gen-deps,tool-name,tool-arches,release-dir)
+## $(foreach val,$(deps),$(info ** deps=$(val)))
+## -----------------------------------------------------------------------
+release-gen-deps=$(strip \
+\
+ $(if $($(1)),$(null),$(error name= is required))\
+ $(if $($(2)),$(null),$(error arches= is required))\
+ $(if $($(3)),$(null),$(error release-dir= is required))\
+\
+ $(if $(DEBUG),$(info release-dir=$(3)))\
+ $(foreach release-dir,$($(3)),\
+ $(addprefix $(release-dir)/,$(call release-gen-deps-name,$(1),$(2)))\
+ )\
+)
+
+$(if $(DEBUG),$(warning LEAVE))
+
+# [EOF]