# file: doc/examples/functionlang/oneprocess/C/Makefile

# IMPORTED VARIABLES
LIBDIR=/usr/local/scorpion/lib
BINDIR=/usr/local/scorpion/bin
CC=cc
IDLC=$(BINDIR)/idlc
PC=pc
CFLAGS=-I$(INCDIR)/C
IDLCFLAGS=
PFLAGS=
CP=cp
MV=mv
RM=rm -f
LEX=lex
MAKE=make
YACC=yacc
UTILITYVARS='CC=$(CC)' 'IDLC=$(IDLC)' 'PC=$(PC)' 'CFLAGS=$(CFLAGS)' \
	      'IDLCFLAGS=$(IDLCFLAGS)' 'PFLAGS=$(PFLAGS)' 'CP=$(CP)' \
	      'MV=$(MV)' 'RM=$(RM)' 'LEX=$(LEX)' 'MAKE=$(MAKE)' \
	      'YACC=$(YACC)'
CI=ci
CO=co -l

# LOCAL VARIABLES
SRC=main.c ../../frontend/C/parser.y ../../frontend/C/lex.l \
	../../semantic/C/resolve.c ../../semantic/C/typing.c \
	../../constantfold/C/algorithm.c
OBJ=main.o parser.o lex.o resolve.o typing.o algorithm.o
TEST=../../test
LIB=$(LIBDIR)/libidl.a
SPECS=../../specs
IDLCFLAGSLOC=-I$(SPECS) -I.. -C onephasecompiler.Cdl

###############################################################

examples : funccomp
	$(RM) $(TEST)/foo.foldedposC2.aer $(TEST)/bar.foldedposC2.aer
	/bin/time funccomp < $(TEST)/foo.in > $(TEST)/foo.foldedposC2.aer
	/bin/time funccomp < $(TEST)/bar.in > $(TEST)/bar.foldedposC2.aer

funccomp : $(OBJ) onephasecompiler.h $(LIB)
	$(CC) $(CFLAGS) -o funccomp $(OBJ) onephasecompiler.o $(LIB)

main.o : main.c onephasecompiler.h
	$(CC) $(CFLAGS) -c main.c

parser.c tokens.h : ../../frontend/C/parser.y
	$(YACC) -d ../../frontend/C/parser.y
	$(MV) y.tab.c parser.c
	$(MV) y.tab.h tokens.h

parser.o : parser.c frontend.h
	$(CC) $(CFLAGS) -c parser.c

lex.o : lex.c frontend.h tokens.h
	$(CC) $(CFLAGS) -c lex.c

lex.c : ../../frontend/C/lex.l
	$(LEX) ../../frontend/C/lex.l
	$(MV) lex.yy.c lex.c

frontend.h : onephasecompiler.h
	$(RM) frontend.h
	ln onephasecompiler.h frontend.h

resolve.o : resolve.c semantic.h
	$(CC) $(CFLAGS) -c resolve.c

resolve.c : ../../semantic/C/resolve.c
	$(RM) resolve.c
	ln ../../semantic/C/resolve.c resolve.c

typing.o : typing.c semantic.h
	$(CC) $(CFLAGS) -c typing.c

typing.c : ../../semantic/C/typing.c
	$(RM) typing.c
	ln ../../semantic/C/typing.c typing.c

semantic.h : onephasecompiler.h
	$(RM) semantic.h
	ln onephasecompiler.h semantic.h

algorithm.o : algorithm.c constant_fold.h
	$(CC) $(CFLAGS) -c algorithm.c

algorithm.c : ../../constantfold/C/algorithm.c 
	$(RM) algorithm.c
	ln ../../constantfold/C/algorithm.c algorithm.c

constant_fold.h : onephasecompiler.h
	$(RM) constant_fold.h
	ln onephasecompiler.h constant_fold.h

onephasecompiler.h : onephasecompiler.idl \
		$(SPECS)/functionsem.idl $(SPECS)/functionsyntax.idl \
		$(SPECS)/pos.idl ../all.idl
	$(IDLC) $(IDLCFLAGS) $(IDLCFLAGSLOC) onephasecompiler.idl

Clean :
	$(RM) *.o onephasecompiler.c *.list *.Cdl \
		frontend.h pos.h tokens.h main.out lex.c \
		resolve.c typing.c semantic.h \
		algorithm.c constantfold.h onephasecompiler.h
