all : sm1
########################## configuration ##############################
####  What C compiler do you use?
CC = gcc
#### Gargabe collector? If GC = nogc.c, then you need to define -DNOGC.
GC = ../gc/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

GMP_HOME = ../gmp
LIBGMP=$(GMP_HOME)/libgmp.a 
## This line is for buggy linux-gmp.
##LIBGMP = $(GMP_HOME)/libgmp.a $(GMP_HOME)/mpn/libmpn.a

SOLARISLIB =
## If you are using solaris 2.x and you need to compile sm1 with socket 
## interface (make sm1_socket), uncommnet the following line.
## SOLARISLIB = -lnsl -lsocket /usr/ucblib/libucb.a
############################ end of configuration ########################

#HEADERS = datatype.h  stackm.h lookup.h extern.h  kclass.h Makefile
HEADERS = datatype.h  stackm.h lookup.h extern.h  kclass.h 
.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 kclass.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)
msg1s.o : msgxs.h $(HEADERS)

MSG0 = msg0.o msg0p.o msg0s.o
MSG1S = msg0.o msg0p.o msg1s.o


sm1 : sm.c $(MSG0) $(kanlibS1) $(kanlibS2) $(kanlibP) $(kanlibK) $(kanlibK2) $(GC) 
	$(CC) -I$(GMP_HOME) $(CFLAGS) $(DDD) -o sm1 sm.c $(MSG0) $(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)
	../gc/if_not_there ../gc/on_sparc_sunos5 ranlib kanlib.a

sm1_socket : sm.c $(MSG1S) kanlib.a  $(GC)
	$(CC) -I$(GMP_HOME) $(CFLAGS) $(DDD) -o sm1 sm.c $(MSG1S) kanlib.a $(LIBGMP) $(GC) $(SOLARISLIB)


############ 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

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