#
#    Copyright 2017 Nest Labs Inc. All Rights Reserved.
#
#    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.
#

#
#    Description:
#      This make file supports generating prebuilt architecture
#      -independent and -dependent distributions of nlbuild-autotools
#      binaries for the architeture of the current build host.
#

include ../Common.mak

#
# Build directories
#

builddir         := .
top_builddir     := ..
abs_builddir     := $(CURDIR)
abs_top_builddir := $(abspath $(top_builddir))

#
# Source directories
#

srcdir           := .
top_srcdir       := ..
abs_srcdir       := $(CURDIR)
abs_top_srcdir   := $(abspath $(top_srcdir))

# Figure out what sort of build host we are running on, stripping off
# any trailing version number information typically included on Darwin
# / Mac OS X.

host             := $(shell $(top_srcdir)/autoconf/config.guess | $(SED) -e 's/[[:digit:].]*$$//g')

distdir           = $(PACKAGE)-$(VERSION)

dist_tgz_TARGETS  = ${top_builddir}/${PACKAGE}-common-$(VERSION)$(TGZ_EXTENSION) \
                    ${top_builddir}/${PACKAGE}-${host}-$(VERSION)$(TGZ_EXTENSION)

dist_txz_TARGETS  = ${top_builddir}/${PACKAGE}-common-$(VERSION)$(TXZ_EXTENSION) \
                    ${top_builddir}/${PACKAGE}-${host}-$(VERSION)$(TXZ_EXTENSION)

dist_common_DIRS  = share include
dist_arch_DIRS    = $(host)

PACKAGE_VERSION   = $(shell $(CAT) $(top_builddir)/.local-version)

VERSION           = $(PACKAGE_VERSION)

DIST_TMPDIR      := $(shell mktemp -u -p /tmp -d tmp.$(PACKAGE)-$(VERSION)XXXXXX)
TOOLS_TMPDIR     := $(shell mktemp -u -p /tmp -d tmp.$(PACKAGE)-$(VERSION)XXXXXX)

#
# Verbosity
#
_NL_V_BUILD       = $(_NL_V_BUILD_$(V))
_NL_V_BUILD_      = $(_NL_V_BUILD_$(NL_DEFAULT_VERBOSITY))
_NL_V_BUILD_0     = @echo "  BUILD";
_NL_V_BUILD_1     = 

dist-tgz: $(dist_tgz_TARGETS)

dist-txz: $(dist_txz_TARGETS)

#
# Produce prebuilt GNU autotools binaries for the architecture of the
# current build machine and install them in this nlbuild-autotools
# package.
#
tools:
	$(call nl-remove-dir,$(TOOLS_TMPDIR))
	$(call nl-create-dir,$(TOOLS_TMPDIR))
	$(_NL_V_BUILD)${srcdir}/packages/build --arch ${host} --srcdir ${abs_srcdir}/packages --builddir "${TOOLS_TMPDIR}" --destdir "${abs_top_srcdir}/tools/host"
	$(call nl-remove-dir,$(TOOLS_TMPDIR))

#
# Produce prebuilt GNU autotools architecture-dependent and -independent
# binaries for the architecture of the current build machine and package
# them up for distribution.
#
dist toolsdist: $(DIST_TARGETS)
	$(call nl-remove-dir,$(DIST_TMPDIR))

#
# Stage the distribution files to a distribution directory
#
stage:
	$(call nl-remove-dir,$(DIST_TMPDIR))
	$(call nl-create-dir,$(DIST_TMPDIR))
	$(_NL_V_BUILD)${srcdir}/packages/build --arch ${host} --srcdir ${abs_srcdir}/packages --builddir "${DIST_TMPDIR}" --destdir "${DIST_TMPDIR}"

#
# Produce prebuilt GNU autotools architecture-independent binaries for
# the architecture of the current build machine and package them up
# for distribution in tar-gzip format.
#
${top_builddir}/${PACKAGE}-common-$(VERSION)$(TGZ_EXTENSION): stage
	$(NL_V_TGZ)$(dist_tgz_ARCHIVE) --directory ${DIST_TMPDIR} $(dist_common_DIRS) | $(dist_tgz_COMPRESS) > "$(@)"

#
# Produce prebuilt GNU autotools architecture-dependent binaries for
# the architecture of the current build machine and package them up
# for distribution in tar-gzip format.
#
${top_builddir}/${PACKAGE}-${host}-$(VERSION)$(TGZ_EXTENSION): stage
	$(NL_V_TGZ)$(dist_tgz_ARCHIVE) --directory ${DIST_TMPDIR} $(dist_arch_DIRS) | $(dist_tgz_COMPRESS) > "$(@)"

#
# Produce prebuilt GNU autotools architecture-independent binaries for
# the architecture of the current build machine and package them up
# for distribution in tar-xz format.
#
${top_builddir}/${PACKAGE}-common-$(VERSION)$(TXZ_EXTENSION): stage
	$(NL_V_TXZ)$(dist_txz_ARCHIVE) --directory ${DIST_TMPDIR} $(dist_common_DIRS) | $(dist_txz_COMPRESS) > "$(@)"

#
# Produce prebuilt GNU autotools architecture-dependent binaries for
# the architecture of the current build machine and package them up
# for distribution in tar-xz format.
#
${top_builddir}/${PACKAGE}-${host}-$(VERSION)$(TXZ_EXTENSION): stage
	$(NL_V_TXZ)$(dist_txz_ARCHIVE) --directory ${DIST_TMPDIR} $(dist_arch_DIRS) | $(dist_txz_COMPRESS) > "$(@)"

clean: clean-local
