PROGRAM = scrod

# set to -debug, -optimize, etc, or leave blank
# run "gmake recompile" after changing CLUFLAGS
CLUFLAGS =
#PCLULIB = /mit/PCLU/lib/lib
PCLULIB = /afs/sipb/project/netbsd/lockers/PCLU/lib/lib

# PCLU libraries
LOWLEV = $(PCLULIB)/lowlev.lib
USEFUL =  $(PCLULIB)/useful.lib

SCRODOBJS = attribs.o codegen.o codehoist.o dce.o flowgraph.o folding.o \
	    avail.o propagate.o ilgen.o intergraph.o lex.o lrmachine.o \
	    optimize.o parser.o recover.o scase.o scrod.o state.o symtab.o \
	    typespec.o usertype.o 

ILOBJS = IL/argument.o IL/block.o IL/env.o IL/il.o IL/label.o IL/rvalue.o \
	 IL/lvalue.o IL/procedure.o IL/program.o IL/rhs.o IL/statement.o \
	 IL/var.o

UTILOBJS = utils/bitvec.o utils/mapping.o utils/set.o utils/array_seq.o \
	   utils/multiset.o utils/stack.o utils/utils.o

ALLOBJS = $(SCRODOBJS) $(ILOBJS) $(UTILOBJS)

# Rules for building the program from source.
.SUFFIXES: .o .clu .lib .newlib .clucc
$(PROGRAM): $(ALLOBJS)
	./link $@ $(CLUFLAGS) $^
$(SCRODOBJS): %.o: %.clu %.lib
	./compile $(CLUFLAGS) $^
.newlib.lib:
	@-cmp -s $@ $< || (echo cp $< $@; cp $< $@)
.clu.newlib:
	./spec $@ $^
.clucc.clu:
	clucc $< > /dev/null

# Utility rules.
.PHONY: clean recompile debug nodebug psfiles
clean:	
	rm -f *.o $(PROGRAM) *.lib *.newlib *.c clu.junk clucc.junk
recompile:
	rm -f *.o
	@$(MAKE) $(MFLAGS)
debug:
	sed -e 's/^CLUFLAGS\(.*\)/CLUFLAGS\1-debug/' Makefile > tmp
	mv -f tmp Makefile
	@$(MAKE) $(MFLAGS) recompile
	zwrite -c scrod -m Done Rebuilding
nodebug:
	sed -e 's/^CLUFLAGS\(.*\)-debug\(.*\)/CLUFLAGS\1\2/' Makefile > tmp
	mv -f tmp Makefile
	@$(MAKE) $(MFLAGS) recompile
	zwrite -c scrod -m Done Rebuilding
psfiles:
	latex design.tex
	dvips design.dvi -o design.ps
	enscript -2r -psource.ps optimize.clu flowgraph.equ flowgraph.clu \
		avail.equ avail.clu codehoist.clu propagate.clu \
		folding.clu dce.clu

# Equate files needed for building .newlib files.
attribs.newlib: codegen.equ IL/il.equ
avail.newlib: IL/il.equ avail.equ
codegen.newlib: IL/il.equ
codehoist.newlib: IL/il.equ flowgraph.equ avail.equ
codehoist.newlib:
dce.newlib: IL/il.equ flowgraph.equ codegen.equ
ilgen.newlib: codegen.equ IL/il.equ token.equ
intergraph.newlib: IL/il.equ
flowgraph.newlib: flowgraph.equ IL/il.equ
folding.newlib: IL/il.equ
lex.newlib: token.equ
lrmachine.newlib: token.equ
optimize.newlib: avail.equ IL/il.equ
parser.newlib:
propagate.newlib: IL/il.equ avail.equ
recover.newlib: token.equ
scase.newlib:
scrod.newlib:
state.newlib: symtab.equ
symtab.newlib: symtab.equ
typespec.newlib:
usertype.newlib:
new-avail.newlib: IL/il.equ avail.equ
new-propagate.newlib: IL/il.equ avail.equ


# Libraries and equate files needed for building object files.
attribs.o: typespec.lib IL/il.lib codegen.equ IL/il.equ
avail.o: utils/utils.lib IL/il.lib optimize.lib $(USEFUL) avail.equ IL/il.equ
codegen.o: utils/utils.lib IL/il.lib $(USEFUL) IL/il.equ
codehoist.o: IL/il.lib utils/utils.lib avail.lib $(USEFUL)
codehoist.o: IL/il.equ avail.equ flowgraph.equ
ilgen.o: IL/il.lib attribs.lib codegen.lib typespec.lib usertype.lib state.lib
ilgen.o: optimize.lib symtab.lib
ilgen.o: symtab.equ token.equ IL/il.equ codegen.equ
intergraph.o: utils/utils.lib IL/il.lib IL/il.equ
dce.o: attribs.lib flowgraph.lib IL/il.lib utils/utils.lib
dce.o: IL/il.equ flowgraph.equ codegen.equ
flowgraph.o: utils/utils.lib IL/il.lib flowgraph.equ IL/il.equ
folding.o: attribs.lib utils/utils.lib IL/il.lib $(USEFUL)
folding.o: IL/il.equ codegen.equ
lex.o: $(USEFUL) attribs.lib scase.lib token.equ
lrmachine.o: attribs.lib state.lib lex.lib scrod.lib token.equ
optimize.o: utils/utils.lib IL/il.lib flowgraph.lib codehoist.lib avail.lib
optimize.o: dce.lib folding.lib propagate.lib intergraph.lib $(USEFUL)
optimize.o: IL/il.equ avail.equ flowgraph.equ
parser.o: lrmachine.lib attribs.lib state.lib recover.lib lex.lib $(USEFUL)
propagate.o: avail.lib IL/il.lib utils/utils.lib $(USEFUL)
propagate.o: avail.equ IL/il.equ IL/statement.equ
recover.o: lrmachine.lib attribs.lib state.lib scrod.lib lex.lib parser.lib
recover.o: token.equ
scase.o:
scrod.o: scrod.clu attribs.lib state.lib ilgen.lib
state.o: typespec.lib usertype.lib symtab.lib IL/il.lib symtab.equ IL/il.equ
symtab.o: typespec.lib usertype.lib attribs.lib IL/il.lib $(USEFUL)
symtab.o: symtab.equ IL/il.equ
typespec.o: $(USEFUL) usertype.lib
usertype.o: $(USEFUL) typespec.lib
new-avail.o: utils/utils.lib IL/il.lib optimize.lib $(USEFUL) avail.equ IL/il.equ
new-propagate.o: new-avail.lib IL/il.lib utils/utils.lib $(USEFUL)
new-propagate.o: avail.equ IL/il.equ IL/statement.equ

