SHELL=/bin/bash

VARIABLES_AT_MAKEFILE_START := $(.VARIABLES)

SDCCSOURCETREE:=$(shell cat sdcc_srctree.ref || echo ERROR)
SDCCBUILDTREE:=$(SDCCSOURCETREE).buildtree

ifdef PREFIX
SDCCINSTALLTREE:=$(PREFIX)
$(warning using PREFIX=$(PREFIX))
else
SDCCINSTALLTREE:=$(SDCCSOURCETREE).installtree
$(warning PREFIX not set, will install to local out-of-source tree)
endif
     
TARGETS=build_config.inc

default: $(TARGETS)

test:
	@echo -e "SDCCSOURCETREE=\\t$(SDCCSOURCETREE)"
	@echo -e "SDCCBUILDTREE=\\t$(SDCCBUILDTREE)"
	@echo -e "SDCCINSTALLTREE=\\t$(SDCCINSTALLTREE)"

# out-of-source build :-)
.build_has_source_tree_patched: z80_cpc_timings.diff sdcc_workaround_printf_optimization_bug.diff sdcc_srctree.ref
	@echo "************************************************************************"
	@echo "**************** Configuring in : $$(cat $<)"
	@echo "************************************************************************"
	( cd $(SDCCSOURCETREE) ; for PATCHNAME in $(filter %.diff, $^) ; do echo "Applying patch $${PATCHNAME}" ; patch -p1 <../$${PATCHNAME} ; done ; )
	touch "$@"
	@echo "************************************************************************"
	@echo "**************** Patch success from : $<"
	@echo "************************************************************************"

$(SDCCBUILDTREE)/.configured: .build_has_source_tree_patched
	@echo "************************************************************************"
	@echo "**************** Configuring in : $$(cat $<)"
	@echo "************************************************************************"
	./sdcc_configure.sh "$(@D)" "${SDCCINSTALLTREE}" "$(SDCCSOURCETREE)"
	touch "$@"
	@echo "************************************************************************"
	@echo "**************** Configuration success in : $$(cat $<)"
	@echo "************************************************************************"

$(SDCCBUILDTREE)/.built: $(SDCCBUILDTREE)/.configured
	@echo "************************************************************************"
	@echo "**************** Building in : $(<D)"
	@echo "************************************************************************"
	$(MAKE) -C "$(<D)"
	touch $@
	@echo "************************************************************************"
	@echo "**************** Build success in : $(<D)"
	@echo "************************************************************************"

.PHONY: install

install: $(SDCCBUILDTREE)/.built
	@echo "************************************************************************"
	@echo "**************** Installing in : $(<D)"
	@echo "************************************************************************"
	$(MAKE) -C "$(<D)" install
	@echo "************************************************************************"
	@echo "**************** Install success in : $(<D)"
	@echo "************************************************************************"

build_config.inc: install Makefile
	(set -eu ; \
	{ \
	echo "# with bash do SOURCE this file to get a working sdcc config." ; \
	cd "$(<D)" ; \
	echo "export PATH=\"\$${PATH}:$$PWD/${SDCCINSTALLTREE}/bin\"" ; \
	} >$@ ; )

clean:
	-rm -f *~
	-$(MAKE) -C $(SDCCBUILDTREE) clean
	-rm -f $(SDCCBUILDTREE)/.built

mrproper: clean
	-rm -f $(TARGETS)
	-rm -rf $(SDCCSOURCETREE) $(SDCCBUILDTREE) $(SDCCINSTALLTREE) *.ref

distclean: mrproper
	-rm -f sdcc.downloadlog.txt


########################################################################
# Debug the makefile
########################################################################
$(foreach v,                                        \
  $(sort $(filter-out $(VARIABLES_AT_MAKEFILE_START) VARIABLES_AT_MAKEFILE_START,$(.VARIABLES))), \
  $(info $(v) = $($(v))))
