TOP = .
include $(TOP)/aux/make.config

BOOT_OPT_FLAGS = -O2
SUBDIRS = lib tools compiler

.PHONY: all $(SUBDIRS)
all: $(SUBDIRS)

$(SUBDIRS): boot/gontc
	$(MAKE) -C $@

boot/gontc:
	$(MAKE) -C boot
	
$(TOP)/aux/make.config: $(TOP)/aux/make.config.in configure
	sh configure

.PHONY: boot bootstrap cycle clean stage stage-md5 clean0 stage-clean check
.PHONY: boot-clean world

world boot: bootstrap

cycle: boot-clean bootstrap

bootstrap: stages compare check
	@echo
	@echo "				Testing OK."
	@echo

s1:
	$(MAKE) STAGE=stage1/ PREV_STAGE=stage0/ stage

stages:
	$(MAKE) STAGE=stage0/ PREV_STAGE=boot/ stage
	$(MAKE) STAGE=stage1/ PREV_STAGE=stage0/ stage \
		OPTFLAGS="$(BOOT_OPT_FLAGS)" 
	$(MAKE) STAGE=stage2/ PREV_STAGE=stage1/ stage \
		OPTFLAGS="$(BOOT_OPT_FLAGS)" 

stage: boot/gontc $(SUBDIRS) stage-md5
	@echo
	@echo "---------> $(STAGE) done <--------"
	@echo

stage-md5:
	set -e; dir=`pwd`; \
	for f in compiler lib/* tools/* ; do \
		cd $$dir; \
		test -d $$f/$(STAGE) || continue; \
		cd $$f/$(STAGE); \
		find -name '*.xg[ioa]' -o -name '*.ksi' | \
			sort | xargs md5sum | sed -e "s|  *| $$f:|"; \
	done > $(subst /,,$(STAGE)).md5
	
compare:
	if [ "`md5sum < stage1.md5`" != "`md5sum < stage2.md5`" ] ; then \
		diff -u stage1.md5 stage2.md5 ; \
		echo 2>&1 "Bootstrap comparison failure" ; \
		false ; \
	fi
	
stage-clean:
	test "$(STAGE)" != ""
	rm -rf $(STAGE)
	rm -rf compiler/$(STAGE)
	rm -rf {lib,tools}/*/$(STAGE)
	rm -f $(subst /,,$(STAGE)).md5

boot-clean:
	$(MAKE) STAGE=stage1/ stage-clean
	$(MAKE) STAGE=stage2/ stage-clean
	
clean0:
	$(MAKE) STAGE=stage0/ stage-clean

clean: clean0 boot-clean
	set -e; for f in $(SUBDIRS) work boot doc ; do \
		$(MAKE) -C $$f clean ; \
	done
	rm -f aux/make.config config.log compiler/config.g

check:
	$(MAKE) -C t/ PREFIX="../stage2/"

VER := $(shell cat VERSION)
DISTDIR := gont-$(VER)

dist:
	$(MAKE) sub-dist VER=$(shell cat VERSION)

r: r-dist

r-dist:
	svn up
	$(MAKE) r-dist-sub

r-dist-sub:
	$(MAKE) sub-dist VER=$(shell echo \
		`cat VERSION`-r`svn info | sed -n 's/Revision: //p'`)
	
sub-dist: changelogs
	$(MAKE) -C doc all
	rm -rf $(DISTDIR)
	mkdir $(DISTDIR)
	ls -d * | grep -v $(DISTDIR) | \
		xargs tar cf - | \
		(cd $(DISTDIR) && tar xf -)
	$(MAKE) -C $(DISTDIR)/boot copy
	$(MAKE) -C $(DISTDIR) clean
	rm -f $(DISTDIR)/compiler/parser.output
	rm -rf $(DISTDIR)/doc
	tar cf - doc | (cd $(DISTDIR) && tar xf -)
	find $(DISTDIR) -name CVS -o -name .svn -o -name '*.tar.gz' \
		-o -name '*.tar.bz2' | \
		xargs rm -rf
	$(MAKE) -C $(DISTDIR)/doc clean-aux
	chmod +x $(DISTDIR)/configure
	rm -f $(DISTDIR)/*.{ksi,xgo}
	$(MAKE) -C $(DISTDIR)/work nuke
	tar cf - $(DISTDIR) | bzip2 --best > $(DISTDIR).tar.bz2
	rm -rf $(DISTDIR)

FORCE:

ChangeLog: FORCE
	update-svn-changelog -x '^(lib|compiler)/'
	
compiler/ChangeLog: FORCE
	cd compiler; update-svn-changelog

lib/ChangeLog: FORCE
	cd lib; update-svn-changelog

changelogs: ChangeLog compiler/ChangeLog lib/ChangeLog

cl: changelogs

stage2/lib/std.xga stage2/gontc:
	@echo
	@echo "You first need to do a ,,make bootstrap'' in order to"
	@echo ",,make install''"
	@echo
	@false
	
install: stage2/lib/std.xga stage2/gontc
	install -d $(DESTDIR)$(LIBDIR)/lib
	install -m 644 stage2/lib/* $(DESTDIR)$(LIBDIR)/lib
	install -d $(DESTDIR)$(BINDIR)
	install -m 755 stage2/{gontc,gontyacc} $(DESTDIR)$(BINDIR)
	install -d $(DESTDIR)$(MANDIR)/man1
	install -m 644 doc/gontc.1 $(DESTDIR)$(MANDIR)/man1
	install -d $(DESTDIR)$(INCLUDEDIR)
	install -m 644 lib/gont/*.h $(DESTDIR)$(INCLUDEDIR)
