all : sm1
########################## configuration ##############################
####  What C compiler do you use?
CC = gcc
#### Gargabe collector? If GC = nogc.c, then you need to define -DNOGC.
GC = ../gc3.2/gc.a
#GC = nogc.c
#### -D options
DDD =
#DDD = -DNOGC

#### Optimization level etc.
#CFLAGS = 
#### option  for dbx
CFLAGS = -O
#### optimizer which seems not to be  reliable at level 2,3 and 4.
#CFLAGS = -O
#### profiler to output mon.out
#CFLAGS = -O
############################ end of configuration ########################
GMP_HOME = ../gmp
LIBGMP = $(GMP_HOME)/libgmp.a
HEADERS = datatype.h  stackm.h lookup.h extern.h  Makefile
.c.o :
	$(CC) -I$(GMP_HOME) $(CFLAGS) $(DDD) -c  $<

kanlibP = kanExport0.o kanExport1.o
kanlibS1 = stackmachine.o 
kanlibS2 = scanner.o scanner2.o list.o global.o usage.o option.o
kanlibK = matrix.o poly4.o replace.o poly3.o poly.o output.o coeff.o order.o switch.o poly2.o parser.o parserpass0.o rat.o ext.o
kanlibK2 = gradedset.o red.o gb.o gbGM.o syz0.o redm.o

######
redm.o : extern2.h gradedset.h $(HEADERS)
syz0.o : extern2.h gradedset.h $(HEADERS)
gbGM.o : extern2.h gradedset.h $(HEADERS)
gb.o : extern2.h gradedset.h $(HEADERS)
red.o : extern2.h gradedset.h $(HEADERS)
gradedset.o : extern2.h gradedset.h $(HEADERS)

########
matrix.o : extern2.h matrix.h $(HEADERS)
poly4.o : extern2.h matrix.h $(HEADERS)
replace3.o : extern2.h $(HEADERS)
poly3.o : extern2.h $(HEADERS)
parserpass0.o : extern2.h $(HEADERS)
parser.o : extern2.h $(HEADERS)
poly2.o : extern2.h $(HEADERS)
switch.o : extern2.h $(HEADERS) gradedset.h
order.o : extern2.h $(HEADERS)
coeff.o : extern2.h $(HEADERS)
output.o : extern2.h $(HEADERS)
poly.o : extern2.h $(HEADERS)
rat.o : extern2.h $(HEADERS)
ext.o : extern2.h $(HEADERS)

sm1 : sm.c msg0.o msg0p.o $(kanlibS1) $(kanlibS2) $(kanlibP) $(kanlibK) $(kanlibK2) $(GC) 
	$(CC) -I$(GMP_HOME) $(CFLAGS) $(DDD) -o sm1 sm.c msg0.o msg0p.o $(kanlibS1) $(kanlibS2) $(kanlibP) $(kanlibK) $(kanlibK2) $(LIBGMP) $(GC)

$(kanlibP) : $(HEADERS) extern2.h gradedset.h
$(kanlibS1) : $(HEADERS) smacro.h 
$(kanlibS2) : $(HEADERS)

kanlib.a : $(kanlibS1) $(kanlibS2) $(kanlibP) $(kanlibK) $(kanlibK2) 
	ar ru kanlib.a $(kanlibS1) $(kanlibS2) $(kanlibP) $(kanlibK) $(kanlibK2)
	ranlib kanlib.a


############ smacro.h  and lookup.h
smacro.h : smacro.sm1 dr.sm1 module1.sm1 usage.sm1 mm
	touch smacro.h
	/bin/rm smacro.h
	cat smacro.sm1 dr.sm1 module1.sm1 usage.sm1 | mm >smacro.h

lookup.h : stackm.h mklookup
	touch lookup.h
	/bin/rm lookup.h
	mklookup >lookup.h

mm : mm.c
	$(CC) -o mm mm.c
mklookup : mklookup.c
	$(CC) -I$(GMP_HOME) -o mklookup mklookup.c




clean :
	rm -f mklookup mm  core sm1 lookup.h smacro.h *.o *~ *.a mon.out sm1.nogc kanlib.a
