AXIOM_LOCAL_LISP_sources = initial-env.lisp
AXIOM_LOCAL_LISP = ../lisp/base-lisp$(EXEEXT)
PROCLAIMS=(load "$(srcdir)/boot-proclaims.lisp")

boot_objects = initial-env.$(FASLEXT) $(boot_sources:.boot=.$(FASLEXT))

boot_SOURCES = \
	initial-env.lisp.pamphlet \
	$(addsuffix .pamphlet, $(boot_sources))

pamphlets = Makefile.pamphlet $(boot_SOURCES)
boot_sources = tokens.boot includer.boot scanner.boot \
	pile.boot ast.boot parser.boot  translator.boot

boot_clisp = $(boot_sources:.boot=.clisp)
boot_data = $(boot_sources:.boot=.data)
boot_fn = $(boot_sources:.boot=.fn)
boot_cached_clisp = $(boot_sources:.boot=.clisp)

COMPILE_LISP = \
	$(axiom_build_document) --tag=lisp --mode=compile --output=$@

BOOT_TO_LISP = \
	$(axiom_build_document) --tag=boot --mode=translate \
	--use=./prev-stage/bootsys $<

subdir = src/boot/
 
.PHONY: all-ax all-boot
all: all-ax all-boot

all-ax all-boot: stamp

stamp: $(axiom_build_bindir)/bootsys$(EXEEXT)
	@rm -f stamp
	$(STAMP) $@

$(axiom_build_bindir)/bootsys$(EXEEXT): stage2/bootsys$(EXEEXT)
	$(mkinstalldirs) $(axiom_build_bindir)
	$(INSTALL_PROGRAM) stage2/bootsys$(EXEEXT) $(axiom_build_bindir)

.PRECIOUS: stage0/%.clisp
.PRECIOUS: stage0/%.$(FASLEXT)

stage0_boot_clisp = $(addprefix stage0/, $(boot_clisp))

stage0_boot_objects = $(addprefix stage0/, $(boot_objects))

stage0/stamp: stage0/bootsys$(EXEEXT)
	@rm -f $@
	@$(STAMP) $@

stage0/bootsys$(EXEEXT): $(stage0_boot_objects)
	$(AXIOM_LOCAL_LISP) -- --make --main="|AxiomCore|::|topLevel|"\
		 --output=$@ --load-directory=stage0 \
		$(stage0_boot_objects)


.PRECIOUS: %/.started
%/.started:
	$(mkinstalldirs) $*
	$(STAMP) $@

$(stage0_boot_objects): $(AXIOM_LOCAL_LISP)

stage0/%.$(FASLEXT): stage0/%.clisp
	$(AXIOM_LOCAL_LISP) -- --compile \
		--load-directory=stage0 --output=$@ $<

stage0/%.clisp: $(srcdir)/%.boot.pamphlet stage0/.started
	$(axiom_build_document) --tangle=$*.clisp --output=$@ $<

%/initial-env.$(FASLEXT): initial-env.lisp %/.started
	$(AXIOM_LOCAL_LISP) -- --compile --output=$@ $<

.PRECIOUS: stage1/%.$(FASLEXT)
.PRECIOUS: stage1/%.clisp

stage1/stamp: stage1/bootsys$(EXEEXT)
	rm -f $@
	$(STAMP) $@

stage1/bootsys$(EXEEXT): $(addprefix stage1/, $(boot_objects))
	$(AXIOM_LOCAL_LISP) -- --make --main="|AxiomCore|::|topLevel|" \
		 --output=$@ --load-directory=stage1 \
		$(addprefix stage1/, $(boot_objects))

stage1/%.$(FASLEXT): stage1/%.clisp
	$(AXIOM_LOCAL_LISP) -- --compile \
		--load-directory=stage1 $<

stage1/%.clisp: %.boot stage0/stamp stage1/.started
	stage0/bootsys -- --translate --output=$@ $<

.PRECIOUS: stage2/%.$(FASLEXT)
.PRECIOUS: stage2/%.clisp

stage2/stamp: stage2/bootsys$(EXEEXT)
	@echo Building stage 2
	$(STAMP) $@

stage2/bootsys$(EXEEXT): $(addprefix stage2/, $(boot_objects))
	$(AXIOM_LOCAL_LISP) -- --make --main="|AxiomCore|::|topLevel|" \
		--output=$@ --load-directory=stage2 \
		$(addprefix stage2/, $(boot_objects))

stage2/%.$(FASLEXT): stage2/%.clisp
	$(AXIOM_LOCAL_LISP) -- --compile \
		--load-directory=stage2 $<

stage2/%.clisp: %.boot stage1/stamp stage2/.started
	stage1/bootsys -- --translate --output=$@ $<

## Dependency for various modules.  
## FIXME: This should be automatically extracted from the
## Boot source file at packaging time.

%/tokens.($FASLEXT): %/initial-env.$(FASLEXT)

%/includer.$(FASLEXT): %/tokens.$(FASLEXT)

%/scanner.$(FASLEXT): %/tokens.$(FASLEXT) %/includer.$(FASLEXT)

%/pile.$(FASLEXT): %/scanner.$(FASLEXT) %/includer.$(FASLEXT)

%/ast.$(FASLEXT): %/includer.$(FASLEXT)

%/parser.$(FASLEXT): %/ast.$(FASLEXT) %/scanner.$(FASLEXT) %/includer.$(FASLEXT)

%/translator.$(FASLEXT): %/parser.$(FASLEXT) %/ast.$(FASLEXT) \
		%/pile.$(FASLEXT) %/scanner.$(FASLEXT) \
		%/includer.$(FASLEXT)

.PRECIOUS: %.boot
%.boot: $(srcdir)/%.boot.pamphlet
	$(axiom_build_document) --tangle $< 
.PRECIOUS: %.boot

%.boot: $(srcdir)/%.boot.pamphlet
	$(axiom_build_document) --tangle $<
.PRECIOUS: %.lisp

initial-env.lisp: initial-env.lisp.pamphlet
	$(axiom_build_document) --tangle $<

mostlyclean-local:
	@rm -f $(AXIOM_LOCAL_LISP)
	@rm -f $(axiom_build_bindir)/bootsys$(EXEEXT)
	@rm -rf prev-stage
	@rm -rf stage0 stage1 stage2
	@rm -f *.data *.fn
	@rm -f stamp

clean-local: mostlyclean-local
	@rm -f $(boot_sources)
	@rm -f *.clisp *.lisp

distclean-local: clean-local