#
#   IP Engineering Rescue Disk
#   Copyright (C) 2017 David M. Syzdek <david@syzdek.net>.
#
#   @SYZDEK_BSD_LICENSE_START@
#
#   Redistribution and use in source and binary forms, with or without
#   modification, are permitted provided that the following conditions are
#   met:
#
#      * Redistributions of source code must retain the above copyright
#        notice, this list of conditions and the following disclaimer.
#      * Redistributions in binary form must reproduce the above copyright
#        notice, this list of conditions and the following disclaimer in the
#        documentation and/or other materials provided with the distribution.
#      * Neither the name of David M. Syzdek nor the
#        names of its contributors may be used to endorse or promote products
#        derived from this software without specific prior written permission.
#
#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
#   IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
#   THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
#   PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DAVID M. SYZDEK BE LIABLE FOR
#   ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
#   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
#   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
#   CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
#   LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
#   OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
#   SUCH DAMAGE.
#
#   @SYZDEK_BSD_LICENSE_END@
#


DISTRODIR		= src/distros
CONFIGDIR		= var/config
SCRIPTDIR		= src/scripts
SYSLINDIR		= src/syslinux


IPERD_VERSION		= $(shell git describe --long --abbrev=7 HEAD |sed -e 's/\-/./g' -e 's/^v//g')
DATE			= $(shell date +%Y-%m-%d)


BIOS_FILES		= \
			  $(SYSLINUX_CONFIGS) \
			  $(SYSLINUX_BINARIES) \
			  $(DOWNLOAD_FILES)
UEFI_FILES		= \
			  $(GRUB_CONFIGS) \
			  $(GRUB_BINARIES) \
			  $(BIOS_FILES)
CLEANFILES		= \
			  $(SYSLINUX_CONFIGS) \
			  $(SYSLINUX_BINARIES) \
			  $(SYSLINUX_INCLUDES) \
			  Makefile.config \
			  boot \
			  EFI \
			  images \
			  syslinux


do_subst = sed \
	-e "s,[@]DISTRO[@],$${DISTRO},g" \
	-e "s,[@]CODENAME[@],$${DISTRO_CODENAME},g" \
	-e "s,[@]VERSION[@],$${DISTRO_VERSION},g" \
	-e "s,[@]LABEL[@],$${DISTRO_LABEL},g" \
	-e "s,[@]ARCH[@],$${DISTRO_ARCH},g" \
        -e 's,[@]IPERD_VERSION[@],$(IPERD_VERSION),g' \
        -e 's,[@]DATE[@],$(DATE),g' \
        -e 's,[@]NETBOOT[@],$(NETBOOT),g' \
        -e 's,[@]NETBOOT_HOST[@],$(NETBOOT_HOST),g' \
        -e 's,[@]NETBOOT_PATH[@],$(NETBOOT_PATH),g' \
        -e 's,[@]NETBOOT_HTTP[@],$(NETBOOT_HTTP),g' \
        -e 's,[@]NETBOOT_HTTP_SCHEME[@],$(NETBOOT_HTTP_SCHEME),g' \
        -e 's,[@]NETBOOT_HTTP_HOST[@],$(NETBOOT_HTTP_HOST),g' \
        -e 's,[@]NETBOOT_HTTP_PATH[@],$(NETBOOT_HTTP_PATH),g' \
        -e 's,[@]NETBOOT_NFS[@],$(NETBOOT_NFS),g' \
        -e 's,[@]NETBOOT_NFS_HOST[@],$(NETBOOT_NFS_HOST),g' \
        -e 's,[@]NETBOOT_NFS_PATH[@],$(NETBOOT_NFS_PATH),g' \
        -e 's,[@]NETBOOT_TFTP[@],$(NETBOOT_TFTP),g' \
        -e 's,[@]NETBOOT_TFTP_HOST[@],$(NETBOOT_TFTP_HOST),g' \
        -e 's,[@]NETBOOT_TFTP_PATH[@],$(NETBOOT_TFTP_PATH),g' \
	$(SUBST_EXPRESSIONS)
do_subst_fn = \
	echo "do_subst > $(@)"; \
	rm -f "$(@)"; \
	mkdir -p $$(dirname "$(@)") || exit 1; \
	${do_subst} < $${SRCFILE} > $(@) || exit 1; \
	chmod 0755 $(@); \
	touch $(@);
do_subst_dt = \
	echo "do_subst > $(@)"; \
	rm -f "$(@)"; \
	mkdir -p $$(dirname "$(@)") || exit 1; \
	${do_subst} < $${SRCFILE} > $(@) || exit 1; \
	chmod 0644 $(@); \
	touch $(@);


.PHONY: all clean configs configure distclean syslinux images deps


all:
	@echo " "
	@echo "Prepare directory:"
	@echo "   make configure"
	@echo "   make syslinux"
	@echo "   make download"
	@echo " "
	@echo "Build:"
	@echo "   make images # builds iperdboot.iso and iperdboot.img"
	@echo " "
	@echo "   make images/iperdboot.iso      # UEFI/BIOS hybrid"
	@echo "   make images/iperdboot.bios.iso # BIOS only"
	@echo "   make images/iperdboot.uefi.iso # UEFI only"
	@echo " "
	@echo "   make images/iperdboot.img     DISKSIZE=1900 # GPT/MBR hybrid"
	@echo "   make images/iperdboot.gpt.img DISKSIZE=1900 # GPT only"
	@echo "   make images/iperdboot.mbr.img DISKSIZE=1900 # MBR only"
	@echo " "
	@echo "   make thumbdrive DISK=/dev/sdb PARTTYPE=hybrid PARTSIZE=1900M"
	@echo " "


Makefile.local:
	@touch "$(@)"


var/config/iperd.conf: $(SCRIPTDIR)/configure.sh $(SCRIPTDIR)/iperd.profile
	@mkdir -p var/config
	bash ./$(SCRIPTDIR)/configure.sh deps
	@touch "$(@)"


Makefile.config: var/config/iperd.conf $(SCRIPTDIR)/genfiles.sh
	bash ./$(SCRIPTDIR)/genfiles.sh Makefile.config
	@touch "$(@)"


-include Makefile.local
NETBOOT_HOST            ?= 10.0.109.254
NETBOOT_PATH            ?= /pub/iperd/iperd-current/
NETBOOT_HTTP_SCHEME     ?= http
NETBOOT_HTTP_HOST       ?= $(NETBOOT_HOST)
NETBOOT_HTTP_PATH       ?= /httpboot
NETBOOT_HTTP            ?= $(NETBOOT_HTTP_SCHEME)://$(NETBOOT_HTTP_HOST)$(NETBOOT_HTTP_PATH)
NETBOOT_NBD_HOST        ?= $(NETBOOT_HOST)
NETBOOT_NBD_PATH        ?= $(NETBOOT_PATH)
NETBOOT_NBD             ?= nbd://$(NETBOOT_NBD_HOST)$(NETBOOT_NBD_PATH)
NETBOOT_NFS_HOST        ?= $(NETBOOT_HOST)
NETBOOT_NFS_PATH        ?= $(NETBOOT_PATH)
NETBOOT_NFS             ?= nfs://$(NETBOOT_NFS_HOST)$(NETBOOT_NFS_HOST)
NETBOOT_TFTP_HOST       ?= $(NETBOOT_HOST)
NETBOOT_TFTP_PATH       ?= /
NETBOOT_TFTP            ?= tftp://$(NETBOOT_TFTP_HOST)$(NETBOOT_TFTP_PATH)
NETBOOT                 ?= $(NETBOOT_HTTP)
-include Makefile.config
include src/syslinux/Makefile.syslinux
include src/grub/Makefile.grub


images/iperdboot.gpt.img: $(UEFI_FILES) $(SCRIPTDIR)/diskimage.sh $(SCRIPTDIR)/thumbdrive.sh
	@mkdir -p "$$(dirname "$(@)")"
	@rm -f "$(@)"
	bash ./$(SCRIPTDIR)/diskimage.sh -t gpt -s "$(DISKSIZE)" "." "$(@)"
	@touch "$(@)"


images/iperdboot.img: $(UEFI_FILES) $(SCRIPTDIR)/diskimage.sh $(SCRIPTDIR)/thumbdrive.sh
	@mkdir -p "$$(dirname "$(@)")"
	@rm -f "$(@)"
	bash ./$(SCRIPTDIR)/diskimage.sh -t hybrid -s "$(DISKSIZE)" "." "$(@)"
	@touch "$(@)"


images/iperdboot.mbr.img: $(BIOS_FILES) $(SCRIPTDIR)/diskimage.sh $(SCRIPTDIR)/thumbdrive.sh
	@mkdir -p "$$(dirname "$(@)")"
	@rm -f "$(@)"
	bash ./$(SCRIPTDIR)/diskimage.sh -t mbr -s "$(DISKSIZE)" "." "$(@)"
	@touch "$(@)"


images/iperdboot.iso: $(UEFI_FILES)
	@mkdir -p $$(dirname "$(@)")
	@rm -f "$(@)"
	mkisofs \
	   -o "$(@)" \
	   -R -J -v -d -N \
	   -x '.git' \
	   -m 'images' \
	   -m 'tmp' \
	   -hide-rr-moved \
	   -no-emul-boot \
	   -boot-load-size 4 \
	   -boot-info-table \
	   -b syslinux/isolinux.bin.mod \
	   -c syslinux/isolinux.boot \
	   -eltorito-alt-boot \
	   -no-emul-boot \
	   -eltorito-platform efi \
	   -eltorito-boot EFI/BOOT/efiboot.img \
	   -V "IPEngRescueDisk" \
	   -A "IP Engineering Rescue Disk"  \
	   ./
	@if test "x$(RUN_ISOHYBRID)" == "xyes";then isohybrid -u "$(@)"; fi
	@touch "$(@)"


images/iperdboot.bios.iso: $(BIOS_FILES)
	@mkdir -p $$(dirname "$(@)")
	@rm -f "$(@)"
	mkisofs \
	   -o "$(@)" \
	   -R -J -v -d -N \
	   -x '.git' \
	   -m 'images' \
	   -m 'tmp' \
	   -hide-rr-moved \
	   -no-emul-boot \
	   -boot-load-size 4 \
	   -boot-info-table \
	   -b syslinux/isolinux.bin.mod \
	   -c syslinux/isolinux.boot \
	   -V "IPEngRescueDisk" \
	   -A "IP Engineering Rescue Disk"  \
	   ./
	@if test "x$(RUN_ISOHYBRID)" == "xyes";then isohybrid "$(@)"; fi
	@touch "$(@)"


images/iperdboot.uefi.iso: $(UEFI_FILES)
	@mkdir -p $$(dirname "$(@)")
	@rm -f "$(@)"
	mkisofs \
	   -o "$(@)" \
	   -R -J -v -d -N \
	   -x '.git' \
	   -m 'images' \
	   -m 'tmp' \
	   -hide-rr-moved \
	   -no-emul-boot \
	   -eltorito-platform efi \
	   -eltorito-boot EFI/BOOT/efiboot.img \
	   -V "IPEngRescueDisk" \
	   -A "IP Engineering Rescue Disk"  \
	   ./
	@if test "x$(RUN_ISOHYBRID)" == "xyes";then isohybrid -u "$(@)"; fi
	@touch "$(@)"


thumbdrive: $(UEFI_FILES)
	bash src/scripts/thumbdrive.sh -t "$(DISKTYPE)" -s "$(PARTSIZE)" . "$(DISK)"


images: images/iperdboot.img images/iperdboot.iso


syslinux: $(SYSLINUX_CONFIGS) $(SYSLINUX_BINARIES)


download: syslinux $(DOWNLOAD_FILES)


configure:
	@mkdir -p var/config
	bash ./$(SCRIPTDIR)/configure.sh configure
	@touch "var/config/iperd.conf"


deps: $(SYSLINUX_CONFIGS) $(GRUB_CONFIGS) Makefile.config


clean:
	rm -Rf $(CLEANFILES)


distclean: clean
	rm -Rf boot
	rm -Rf src/config
	rm -Rf tmp


# end of makefile
