stems=TrivialClass Effects Factorial ArrayAccess LinearSearch Stck Fib LinkedList Sum BinarySearch  Primes TestEq BinaryTree QuickSort Euler Graph While Newton ShortCutAnd
fail=ArrayBounds

## these register settings are standard
# gcc=gcc -fcall-saved-ebx \
#         -fcall-saved-edi \
#         -fcall-saved-esi \
#         -fcall-used-eax \
#         -fcall-used-ecx \
#         -fcall-used-edx 

# generate debug info 
gcc=gcc # -g 

butlastline=head --lines=-1

.PRECIOUS : %.blk.intm %.raw.s %.s %.bin %.class %.bin.out

all : $(foreach stem,$(stems),$(stem)_ok)

# all-out : $(foreach stem,$(stems),$(stem).out) $(foreach stem,$(stems),$(stem).intm.out) $(foreach stem,$(stems),$(stem).386.out)

# individual tests

graph  : Graph.tmp
	risc386 Graph.raw.s

bins  : BinarySearch.tmp
	risc386 BinarySearch.raw.s

array : ArrayAccess.tmp
	risc386 ArrayAccess.raw.s

while : While.tmp
	risc386 While.raw.s

triv : TrivialClass.tmp
	risc386 TrivialClass.raw.s

# Graph viz.

%.ps : %.dot
	dot -T ps -o $@ $<

# test suite

# %.tmp : %.blk.intm %.raw.s
# 	run $*.blk.intm | $(butlastline) | cmp $*.intm.out -
# 	risc386 $*.raw.s 2> /dev/null    | cmp $*.386.out  -
# 	touch $@


%_ok : %.java.out %.blk.intm %.intm.out %.raw.s %.386.out %.s %.bin mjc risc386 %.spill.out %.bin.out
	touch $@

%.bin.out : %.bin %.java.out
	$< > $@ 2> /dev/null
	cmp $@ $*.java.out

%.intm.out : %.blk.intm %.java.out
	run $< | $(butlastline) > $@
	echo "Messages:" > $*.result_java
	cat $*.java.out >> $*.result_java
	head --lines=-1 $@ | cut -d " " -f 2 > $*.result_intm 
	cmp $*.result_intm $*.result_java
	rm $*.result_intm $*.result_java

%.spill.out : %.s %.java.out
	risc386 $< > $@ 2> /dev/null 
	cmp $@ $*.java.out

%.386.out : %.raw.s %.java.out
	risc386 $< > $@ 2> /dev/null 
	cmp $@ $*.java.out

%.java.out : %.class
	java $* > $@

%.s %.raw.s %.blk.intm : %.java mjc muHwI risc386
	mjc $<

%.class : %.java
	javac $<

# Executables

%.bin : runtime.c %.s
	$(gcc) -o $@ $^ 

clean :
	-rm *.tmp *.out *.result_java *.result_intm *_ok *.bin

# EOF