.PHONY: all clean realclean download checksum versions

all:

ifeq ("$(TARGET)", "")
$(error "TARGET variable is not provided")
endif

include $(TARGET:%=config/targets/%.mk)

all: $(programs:%=logs/%.all)

version download checksum : % : logs/%

clean:
	$(RM) logs/*.checksum logs/*.all logs/versions
	$(RM) -r build

realclean:
	$(RM) -r build logs downloads

###########
logs/checksum: logs/download $(file.list:%=logs/%.checksum)
	@-mkdir -p logs
	@touch $@

logs/download: $(file.list:%=logs/%.download)
	@-mkdir -p logs
	@touch $@

logs/versions:
	@-mkdir -p logs
	-mkdir -p $(INSTALL_TOP)/versions
	cp -r etc config $(INSTALL_TOP)/versions/.
	echo "$(TARGET)" > $(INSTALL_TOP)/versions/target
	@touch $@

$(programs:%=logs/%.all): logs/versions logs/checksum

# NB: curl must report errors properly instead of downloading the 404 page
$(file.list:%=logs/%.download):
	@-mkdir -p logs downloads
	@rn=$(@:logs/%.download=%); \
	cs=$$(grep -w "$$rn" etc/parts.master | sed -e 's/ .*$$//'); \
	file=$$rn-$$cs.tar.gz; \
	echo downloading $$file; \
	$(CURL) -o downloads/$$file $(FILESERVER)/$$file 2>/dev/null
	@touch $@

# NB: if curl saves 404 reply, the checksum will catch the error.
$(file.list:%=logs/%.checksum): logs/%.checksum: logs/%.download
	@-mkdir -p logs
	@rn=$(@:logs/%.checksum=%); \
	cs=$$(grep -w "$$rn" etc/parts.master | sed -e 's/ .*$$//'); \
	file=$$rn-$$cs.tar.gz; \
	grep $$file etc/parts.sums | (cd downloads; $(CHECKSUM) -c -)
	@touch $@

# include $(all.parts:%=parts/%.mk)

$(all.parts:%=logs/%.all): logs/checksum
	@-mkdir -p logs
	@$(MAKE) -f parts/$(@:logs/%.all=%.mk) \
                 TARGET="$(TARGET)" \
                 INSTALL_TOP=$(INSTALL_TOP) \
	         all
	@touch $@
