SHELL =	/bin/sh

OSYS = ../scheme
NSYS = ../scheme
OOBJ = O
NOBJ = O

T = $(NOBJ)

#SCMC  =	time $(OSYS) -b $(OOBJ)/compiler.scb -- -p $T/primv.tab
SCMC  =	PRIMVTAB=$T/primv.tab time $(OSYS) -b $(OOBJ)/compiler.scb --

ALL   =	$T/aux.sca $T/hack.sca $T/sa.sca $T/varset.sca \
	$T/cg.sca $T/lgi.sca $T/scc.sca $T/error.sca $T/macro.sca \
	$T/set.sca $T/foldint.sca $T/opt.sca $T/tfgen.sca \
	$T/driver.sca $T/names.sca $T/pmac.sca $T/optutil.sca $T/lvar.sca \
	$T/fv.sca $T/clos.sca $T/ltrc.sca $T/eff.sca $T/primv.sca \
	$T/envs.sca $T/soft.sca $T/inspect.sca \
	$T/show.sca $T/be.sca $T/boot.sca $T/rts.sca $T/integ.sca

ALLSCA = $(ALL) $T/mk-repl.sca $T/mk-compiler.sca \
	 $T/mk-boot-loader.sca $T/boot-loader.sca

AUX   =	aux.scs aux.scm
HACK  =	ee.scs lgi.scs hack.scs hack.scm
SA    =	ee.scs lgi.scs error.scs sa.scs sa.scm
VARSET=	ee.scs lgi.scs set.scs varset.scs varset.scm
CG    =	ee.scs lgi.scs varset.scs error.scs aux.scs \
	lv.scs primv.scs hack.scs cg.scs cg.scm
LGI   =	ee.scs lgi.scs lgi.scm
SCC   =	scc.scs scc.scm
ERROR =	names.scs show.scs error.scs error.scm
MACRO =	ee.scs den.scs lgi.scs error.scs tfgen.scs \
	aux.scs names.scs envs.scs macro.scs macro.scm
SET   =	set.scs set.scm
FOLDINT=ee.scs lgi.scs aux.scs error.scs \
	foldint.scs foldint.scm
OPT   =	ee.scs lgi.scs error.scs varset.scs \
	aux.scs foldint.scs lv.scs optutil.scs hack.scs \
	fv.scs eff.scs opt.scs opt.scm
BE    =	sa.scs opt.scs ltrc.scs clos.scs lvar.scs \
	cg.scs integ.scs be.scs be.scm
TFGEN =	be.scs tfgen.scs tfgen.scm
DRIVER=	macro.scs sa.scs opt.scs cg.scs error.scs \
	lvar.scs hack.scs clos.scs ltrc.scs inspect.scs \
	soft.scs boot.scs rts.scs integ.scs driver.scm
NAMES =	names.scs names.scm
PMAC  =	names.scs error.scs pmac.scs pmac.scm
LVAR  =	ee.scs optutil.scs lv.scs varset.scs error.scs \
	lvar.scs lvar.scm
OPTUTIL=ee.scs error.scs optutil.scs optutil.scm
CLOS  =	ee.scs lgi.scs aux.scs varset.scs fv.scs \
	optutil.scs clos.scs clos.scm
FV    = ee.scs varset.scs optutil.scs error.scs \
	fv.scs fv.scm
LTRC  =	ee.scs lgi.scs varset.scs fv.scs aux.scs \
	optutil.scs eff.scs scc.scs error.scs \
	ltrc.scs ltrc.scm
EFF   =	ee.scs lgi.scs aux.scs optutil.scs error.scs \
	eff.scs eff.scm
ENVS  =	ee.scs den.scs lgi.scs pmac.scs primv.scs \
	aux.scs names.scs soft.scs envs.scs envs.scm
PRIMV =	aux.scs primv.scs primv.scm
SOFT  =	soft.scs soft.scm
INSPECT=show.scs primv.scs inspect.scs inspect.scm
PRETTY=	pretty.scs pretty.scm
SHOW  =	show.scs show.scm
BOOT  = macro.scs be.scs soft.scs boot.scs boot.scm
INTEG =	ee.scs lgi.scs optutil.scs soft.scs integ.scs integ.scm
RTS   =	rts.scs rts.scm

all:	$(ALL) $T/boot-loader.sca
	@echo All done.

boot:	$T/compiler.scb $T/repl.scb $T/mk-boot-loader.scb
	@echo Bootstrapped.

loader:	$T/boot-loader.scb
	@echo New bootloader ready.

run:
	$(NSYS) -b $T/repl.scb

$T/compiler.scb: $(ALL) $T/mk-comp.sca $T/primv.tab ../format.time
	-mv $T/compiler.scb $T/compiler.scb.old
	PRIMVTAB=$T/primv.tab TARGET=$T/compiler.scb \
		$(NSYS) -b $T/boot-loader.scb \
			$(ALL) $T/mk-comp.sca

$T/repl.scb: $(ALL) $T/mk-repl.sca $T/primv.tab ../format.time
	-mv $T/repl.scb $T/repl.scb.old
	PRIMVTAB=$T/primv.tab TARGET=$T/repl.scb \
		$(NSYS) -b $T/boot-loader.scb \
			$(ALL) $T/mk-repl.sca

$T/primv.tab:	../mkpvtab
	../mkpvtab >$T/primv.tab

../mkpvtab:
	(cd ..; $(MAKE) mkpvtab)

$(ALLSCA):	$T/primv.tab

$T/aux.sca:	$(AUX)
	$(SCMC)	$(AUX) >$T/aux.sca

$T/hack.sca:	$(HACK)
	$(SCMC)	$(HACK) >$T/hack.sca

$T/sa.sca:	$(SA)
	$(SCMC)	$(SA) >$T/sa.sca

$T/varset.sca:	$(VARSET)
	$(SCMC) $(VARSET) >$T/varset.sca

$T/cg.sca:	$(CG)
	$(SCMC) $(CG) >$T/cg.sca

$T/lgi.sca:	$(LGI)
	$(SCMC) $(LGI) >$T/lgi.sca

$T/scc.sca:	$(SCC)
	$(SCMC) $(SCC) >$T/scc.sca

$T/error.sca:	$(ERROR)
	$(SCMC) $(ERROR) >$T/error.sca

$T/macro.sca:	$(MACRO)
	$(SCMC) $(MACRO) >$T/macro.sca

$T/set.sca:	$(SET)
	$(SCMC) $(SET) >$T/set.sca

$T/foldint.sca:	$(FOLDINT)
	$(SCMC) $(FOLDINT) >$T/foldint.sca

$T/opt.sca:	$(OPT)
	$(SCMC) $(OPT) >$T/opt.sca

$T/tfgen.sca:	$(TFGEN)
	$(SCMC) $(TFGEN) >$T/tfgen.sca

$T/driver.sca:	$(DRIVER)
	$(SCMC) $(DRIVER) >$T/driver.sca

$T/names.sca:	$(NAMES)
	$(SCMC) $(NAMES) >$T/names.sca

$T/pmac.sca:	$(PMAC)
	$(SCMC) $(PMAC) >$T/pmac.sca

$T/lvar.sca:	$(LVAR)
	$(SCMC) $(LVAR) >$T/lvar.sca

$T/optutil.sca:	$(OPTUTIL)
	$(SCMC) $(OPTUTIL) >$T/optutil.sca

$T/clos.sca:	$(CLOS)
	$(SCMC) $(CLOS) >$T/clos.sca

$T/fv.sca:	$(FV)
	$(SCMC) $(FV) >$T/fv.sca

$T/ltrc.sca:	$(LTRC)
	$(SCMC) $(LTRC) >$T/ltrc.sca

$T/eff.sca:	$(EFF)
	$(SCMC) $(EFF) >$T/eff.sca

$T/envs.sca:	$(ENVS)
	$(SCMC) $(ENVS) >$T/envs.sca

$T/primv.sca:	$(PRIMV)
	$(SCMC) $(PRIMV) >$T/primv.sca

$T/soft.sca:	$(SOFT)
	$(SCMC) $(SOFT) >$T/soft.sca

$T/inspect.sca:	$(INSPECT)
	$(SCMC) $(INSPECT) >$T/inspect.sca

$T/pretty.sca:	$(PRETTY)
	$(SCMC) $(PRETTY) >$T/pretty.sca

$T/show.sca:	$(SHOW)
	$(SCMC) $(SHOW) >$T/show.sca

$T/be.sca:	$(BE)
	$(SCMC) $(BE) >$T/be.sca

$T/boot.sca:	$(BOOT)
	$(SCMC) $(BOOT) >$T/boot.sca

$T/integ.sca:	$(INTEG)
	$(SCMC) $(INTEG) >$T/integ.sca

$T/rts.sca:	$(RTS)
	$(SCMC) $(RTS) >$T/rts.sca

$T/mk-repl.sca:	mk-repl.scm
	$(SCMC) mk-repl.scm >$T/mk-repl.sca

$T/mk-comp.sca:	mk-comp.scm
	$(SCMC) mk-comp.scm >$T/mk-comp.sca

$T/mk-boot-loader.sca:	mk-boot-loader.scm
	$(SCMC) mk-boot-loader.scm >$T/mk-boot-loader.sca

$T/mk-boot-loader.scb:	$(ALL) $T/mk-boot-loader.sca
	TARGET=$T/mk-boot-loader.scb $(NSYS) -b $T/boot-loader.scb \
		$(ALL) $T/mk-boot-loader.sca

$T/boot-loader.sca:	$(OOBJ)/mk-boot-loader.scb boot-loader.scm $T/primv.tab
	$(OSYS) -b $(OOBJ)/mk-boot-loader.scb \
		boot-loader.scm $T/boot-loader.sca $T/primv.tab

$T/boot-loader.scb:	$T/boot-loader.sca ../format.time
	$(NSYS) -b - -a $T/boot-loader.sca -d $T/boot-loader.scb

bootloader:
	$(NSYS) -b - -a $T/boot-loader.sca -d $T/boot-loader.scb
