.SUFFIXES: .clu .o .equ .lib .clucc

##########################################################
# How to use this !@#$% makefile? 
#   make -f <name of makefile> 
# or if the name of makefile is makefile
#  make 
#
# How to add an .equ files
#   1. Move/Link .equ files to the directory where makefile is
#   2. Append the variable EQU with the .equ files
#
# How to add .clu files
#   1. Move/Link .clu files to the directory where makefile is
#   2. Append to the variable CLU with the file name (ex: attribs.clu)
#   3. Add the dependencies for the object file of the source file
#	ex: attrib.clu
#       add: 
#	  attribs.o: attribs.clu attribs.lib attribs.equ atype_list.lib atype.lib
#	a) Note that to the left of the colons is the object file
#	b) Note that to the right of the colons are the equate files
#	   and the LIB files ONLY.
#	c) Note that all object files depends on their lib and source files.
#	   ex: attribs.o depends on attribs.lib & attribs.clu
#
# Known annoyance:
#   1. At compilation time for each file, all lib files and equate 
#	files are merged.
#   2. When creating spec, don't worry about seeing somehing being
#	undefined if the dependencies for the file are correct.
#   3. When compiling, you should worry about seeing something undefined.
# 	It could mean you don't have the correct dependencies.
#

PROJECT = thing
#OPTIMIZE = -optimize
OPTIMIZE = -debug
LIBDIR = /mit/PCLU/decmipslib/lib
PCLU = NPCLU

#CLU = superattribs.clu compiler_state.clu l2.clu lex.clu lrmachine.clu lrpanic.clu parse_startup.clu set.clu token.clu ascii.clu lrmachine2.clu scope.clu symtab.clu l_actions.clu reg_alloc1.clu codegen-kom.clu program.clu env.clu block.clu procedure.clu variable.clu label.clu statement.clu signature.clu expr.clu reference.clu misc.clu codegen.clu resolve.clu cg_acc.clu global-flatten.clu fstream.clu il.clu utils.clu graph.clu

CLU = one.clu two.clu three.clu

#EQU = nonterm.equ state.equ token.equ il.equ register.equ stack_slot.equ global_slot.equ cg_error.equ system_call.equ

OBJECTS = $(CLU:.clu=.o)

LIBS = -use $(CLU:.clu=.lib)

$(PROJECT): $(CLU:.clu=.lib) $(OBJECTS)
	@echo Linking $(PROJECT) ...
	@echo ======================
	$(PCLU) $(OPTIMIZE) -link $@ $(OBJECTS)
	@echo ======================
	@echo Finish linking $(PROJECT).
	@echo

.clu.o: 
	@echo Compiling $< ...
	@echo ======================
	$(PCLU) $(OPTIMIZE) $(LIBS) $(EQU) -compile $< 
	@echo ======================
	@echo Finish compiling $< ...
	@echo

.clu.lib:
	@echo Creating spec for $< ...
	@echo ======================
	$(PCLU) -create new-$*.lib -spec $< $(EQU)
	@echo -n Comparing $*.lib with new-$*.lib:
	@-if cmp -s $*.lib new-$*.lib ; then echo interfaces not changed, removing new-$*.lib ; rm new-$*.lib; else echo interfaces changed ; mv new-$*.lib $*.lib; fi

	@echo ======================
	@echo Finish creating spec for $< ...
	@echo

clean:
	mv *.o obj
	mv *.lib obj

unclean:
	mv obj/*.* .

# dependencies

# Eric's Files
##################
ascii.o: ascii.clu ascii.lib
l2.o: l2.clu l2.lib superattribs.lib l_actions.lib superattribs.lib
l_actions.o: l_actions.clu l_actions.lib superattribs.lib fstream.lib


# James' files
#################
lex.o: lex.clu lex.lib token.lib ascii.lib token.equ state.equ 

scope.o: scope.clu scope.lib

symtab.o: symtab.clu symtab.lib scope.lib superattribs.lib

cg_acc.o: cg_acc.clu cg_acc.lib register.equ codegen-kom.lib

codegen.o: codegen.clu codegen.lib codegen-kom.lib resolve.lib cg_acc.lib env.lib variable.lib il.equ misc.lib label.lib expr.lib block.lib reference.lib register.equ stack_slot.equ cg_error.equ system_call.equ 

resolve.o: resolve.clu resolve.lib cg_acc.lib env.lib variable.lib il.equ misc.lib label.lib expr.lib block.lib reference.lib register.equ stack_slot.equ cg_error.equ system_call.equ codegen-kom.lib


# Geoff's files
#################
parse_startup.o: parse_startup.clu parse_startup.lib lrmachine.lib lrmachine2.lib lex.lib lrpanic.lib compiler_state.lib fstream.lib superattribs.lib codegen.lib reg_alloc1.lib

set.o: set.clu set.lib

program.o: program.clu program.lib block.lib procedure.lib fstream.lib il.equ il.lib

env.o: env.clu env.lib variable.lib fstream.lib fstream.lib il.equ il.lib

block.o: block.clu block.lib label.lib statement.lib fstream.lib il.lib global-flatten.lib il.equ

procedure.o: procedure.clu procedure.lib signature.lib label.lib env.lib block.lib fstream.lib il.lib il.equ

variable.o: variable.clu variable.lib fstream.lib il.lib il.equ

label.o: label.clu label.lib fstream.lib il.lib utils.lib il.equ

statement.o: statement.clu statement.lib block.lib expr.lib reference.lib fstream.lib il.lib il.equ

signature.o: signature.lib signature.clu variable.lib fstream.lib il.equ

expr.o: expr.clu expr.lib variable.lib reference.lib fstream.lib il.lib global-flatten.lib il.equ

reference.o: reference.clu reference.lib fstream.lib il.lib variable.lib

global-flatten.o: global-flatten.clu global-flatten.lib program.lib env.lib block.lib procedure.lib variable.lib label.lib statement.lib signature.lib expr.lib reference.lib

fstream.o: fstream.clu fstream.lib il.lib fstream.lib

il.o: il.clu il.lib

utils.o: utils.clu utils.lib

#attinfo.o: attinfo.clu attinfo.lib

# kom's files
#################

superattribs.o: superattribs.clu superattribs.lib variable.lib block.lib statement.lib expr.lib program.lib reference.lib procedure.lib variable.lib label.lib signature.lib compiler_state.lib env.lib

compiler_state.o: compiler_state.clu compiler_state.lib scope.lib symtab.lib

lrmachine.o: lrmachine.clu lrmachine.lib superattribs.lib compiler_state.lib lex.lib token.lib token.equ 

lrmachine2.o: lrmachine2.clu lrmachine2.lib lrmachine.lib

lrpanic.o: lrpanic.clu lrpanic.lib token.equ nonterm.equ compiler_state.lib lex.lib lrmachine.lib set.lib token.lib superattribs.lib lrmachine2.lib

token.o: token.clu token.lib superattribs.lib token.equ 

reg_alloc1.o: reg_alloc1.clu reg_alloc1.lib signature.lib program.lib misc.lib expr.lib statement.lib il.equ register.equ  procedure.lib variable.lib env.lib stack_slot.equ register.equ global_slot.equ 

misc.o: misc.clu misc.lib

codegen-kom.o: codegen-kom.clu codegen-kom.lib resolve.lib cg_acc.lib codegen.lib env.lib variable.lib il.equ misc.lib label.lib expr.lib block.lib reference.lib register.equ stack_slot.equ cg_error.equ system_call.equ 

graph.o: graph.clu graph.lib misc.lib
