# -*- 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} $(quote-single) ..   with $(call quoted,cmd-text)
## -----------------------------------------------------------------------
release-build :

	@echo 
	@echo "** -----------------------------------------------------------------------"
	@echo "** $(MAKE): processing target [$@]"
	@echo "** Sandbox: $(shell /bin/pwd)"
	@echo "** -----------------------------------------------------------------------"

        # [DEBUG] Yes this will take a while but where-4-art-thou-golang-in-docker-image-(?)
	@echo -e "\n** golang interpreter"
        # find '/usr/local' '/go' '/usr/bin' '/bin' -name 'go' ! -type d -ls;
        # -${GO_SH} $(quote-single) find / -name 'go' ! -type d -print $(quote-single)

	-$(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)"

	$(MAKE) docker-debug

	@echo
	@echo '** -----------------------------------------------------------------------'
	@echo '** Docker builds bins into mounted filesystem:'
	@echo '**   container:/app/relase'
	@echo '**   localhost:{pwd}/release'
	@echo '** -----------------------------------------------------------------------'
	${GO_SH} $(quote-single) \
	  echo ;\
	  echo 'Building release binaries:' ;\
	  set -e -o pipefail; \
	  set -x ; \
	  for x in ${RELEASE_OS_ARCH}; do \
	    echo ;\
	    echo "** RELEASE_OS_ARCH: Build arch is $$x"; \
	    OUT_PATH="$(RELEASE_DIR)/$(RELEASE_NAME)-$(subst -dev,_dev,$(VERSION))-$$x"; \
            echo ;\
            echo "** Building: $$OUT_PATH (ENTER)"; \
	    GOOS=$${x%-*} GOARCH=$${x#*-} go build -mod=vendor -v $(LDFLAGS) -o "$$OUT_PATH" cmd/voltctl/voltctl.go; \
            echo "** Building: $$OUT_PATH (LEAVE)"; \
	done \
$(quote-single)

	@echo
	@echo "** -----------------------------------------------------------------------"
	@echo '** Post-build, files to release'
	@echo "** -----------------------------------------------------------------------"
	-find "$(RELEASE_DIR)" ! -type d -print
	@echo

## -----------------------------------------------------------------------
## Intent: Why is go not found reported after
## -----------------------------------------------------------------------
docker-debug:

	@echo
	@echo "** -----------------------------------------------------------------------"
	@echo "** [TARGET] $@"
	@echo "** -----------------------------------------------------------------------"

	@echo
	docker images

	@echo
	docker ps --all

	@echo

## -----------------------------------------------------------------------
## -----------------------------------------------------------------------
clean ::
	$(RM) -r "./$(RELEASE_DIR)"

## -----------------------------------------------------------------------
## -----------------------------------------------------------------------
help ::
	@echo '  release-build       Cross-compile binaries into a docker mounted filesystem'

$(if $(DEBUG),$(warning LEAVE))

# [EOF]
