# makefile for hecke project
# Author:        William Stein
# Last Modified: March 2003 by A. F. Brown.

# HECKE_HOME=/c/builds/hecke
LIDIADIR = /usr/local/lib
# GMPDIR = /c/builds/gmp-4.1.2
# NTLDIR = /c/builds/ntl-5.3.1

CC = g++ 
GFLAG=-g
LIDIALIB=LiDIA
LIBFLAGS =  -L. -lhecke -L${LIDIADIR} -l${LIDIALIB} -lntl -lgmp
# LIBFLAGS =  -L. -lhecke -L$(LIDIADIR)/library/.libs -lLiDIA -L$(NTLDIR)/src -lntl -L$(GMPDIR)/.libs -lgmp

INCFLAGS = -I/usr/local/include/NTL -I/usr/local/include/LiDIA
#INCFLAGS = -I$(LIDIADIR)/include -I$(LIDIADIR)/src/linear_algebra/include -I$(LIDIADIR)/src/base/include -I$(LIDIADIR)/src/number_fields/include -I$(LIDIADIR)/src/finite_fields/include -I$(LIDIADIR)/src/portability -I$(NTLDIR)/include -I$(GMPDIR)

# Note: I have not had much luck using shared libraries on either Mac OS X or Linux.
# LiDIA seems to be the main problem.
CFLAGS = ${GFLAG} -DDEBUG -DINST_FFIELD -DINST_BIGRATIONAL -DINST_ALGNUM -DINST_CHARMOD -DINST_INTMOD $(INCFLAGS) -fno-exceptions

#CFLAGS = -DDEBUG -DINST_FFIELD -DINST_BIGRATIONAL -DINST_ALGNUM -DINST_CHARMOD -DINST_INTMOD $(INCFLAGS)
#CFLAGS = ${GFLAG} -static -DDEBUG -DINST_FFIELD -DINST_BIGRATIONAL -DINST_ALGNUM -DINST_CHARMOD -DINST_INTMOD $(INCFLAGS) -fguiding-decls

#CFLAGS = ${GFLAG} -O -DDEBUG -DINST_BIGRATIONAL $(INCFLAGS) -fguiding-decls
#CFLAGS = ${GFLAG} -static -DDEBUG -DINST_BIGRATIONAL $(INCFLAGS) -fguiding-decls

TEMPLATES = array.cc vector.cc matrix.cc sparsematrix.cc sparse.cc lines.cc list.cc intmod.cc charmod.cc array.h vector.h matrix.h sparsematrix.h sparse.h lines.h list.h intmod.h charmod.h

OBJS = motive.o h1nchi.o msymbols.o character.o charpoly.o cusps.o system.o fields.o display.o arith.o intmod.o charmod.o modformulas.o methodofgraphs.o modularcalc.o tables.o h1nchiz.o  inst.o my_ntl.o

libhecke.a: $(TEMPLATES) $(OBJS)
	ar r libhecke.a $(OBJS)
	@if [ -x /usr/bin/ranlib ] ; then ranlib libhecke.a; fi

heckenew: hecke.o $(TEMPLATES) libhecke.a
	$(CC) $(CFLAGS) -o heckenew hecke.o $(LIBFLAGS)

hecke: heckenew
	@if [ -f hecke ] ; then rm hecke; fi
	mv heckenew hecke

example: example.o $(TEMPLATES) libhecke.a
	$(CC) $(CFLAGS) -o example example.o $(LIBFLAGS)

myhecke: myhecke.o $(TEMPLATES) libhecke.a
	$(CC) $(CFLAGS) -o myhecke myhecke.o $(LIBFLAGS)

Endo: Endo.o $(TEMPLATES) libhecke.a
	$(CC) $(CFLAGS) -o Endo Endo.o $(LIBFLAGS)

Tau: Tau.o $(TEMPLATES) libhecke.a
	$(CC) $(CFLAGS) -o Tau Tau.o $(LIBFLAGS)

FindNonOrd: FindNonOrd.o $(TEMPLATES) libhecke.a
	$(CC) $(CFLAGS) -o FindNonOrd FindNonOrd.o $(LIBFLAGS)

DoHeckeDisc: DoHeckeDisc.o $(TEMPLATES) libhecke.a
	$(CC) $(CFLAGS) -o DoHeckeDisc DoHeckeDisc.o $(LIBFLAGS)

test: test.o $(TEMPLATES) libhecke.a
	$(CC) $(CFLAGS) -o test test.o $(LIBFLAGS)

# these may be insufficient.
motive.o: motive.h 
modularcalc.o: modularcalc.cc modularcalc.h 
h1nchiz.o: h1nchi.h h1nchiz.h
arith.o: arith.cc arith.h
character.o: character.cc character.h
charpoly.o: charpoly.cc charpoly.h
cusps.o: cusps.cc cusps.h character.h
display.o: display.cc display.h
fields.o: fields.cc fields.h 
h1nchi.o: h1nchi.cc h1nchi.h character.h 
inst.o: inst.cc $(TEMPLATES)
modformulas.o: modformulas.cc modformulas.h
methodofgraphs.o: methodofgraphs.cc
msymbols.o: msymbols.cc msymbols.h 
system.o: system.cc system.h
hecke.o: methodofgraphs.h h1nchi.h modformulas.h
tables.o: tables.cc tables.h

clean: 
	rm *.o

#template for compiling *.cc -> *.o :
.cc.o:
	$(CC) $(CFLAGS) -c $< 

# building PVM related programs
PVMDIR		= $(HOME)/pvm3
BDIR		= $(PVMDIR)/bin
EXDIR		= $(BDIR)/$(PVM_ARCH)
PVM_CFLAGS	= ${GFLAG} -I/usr/share/pvm3/include -DSYSVSIGNAL -DNOWAIT3 -DRSHCOMMAND=\"/usr/bin/rsh\" -DNEEDENDIAN -DFDSETNOTSTRUCT -DHASERRORVARS 
PVM_LFLAGS	= -L/usr/share/pvm3/lib/LINUX  -lpvm3 

pvm.o:	pvm.cc 
	$(CC) $(PVM_CFLAGS) -c pvm.cc 

pvm_ex: pvm_ex.cc pvm.o
	$(CC) $(PVM_CFLAGS) -o $@ pvm_ex.cc pvm.o $(PVM_LFLAGS) 
	mv $@ $(EXDIR)

pvmtables: pvmtables.cc pvm.o vector.h vector.cc $(TEMPLATES) $(OBJS) 
	$(CC) $(CFLAGS) $(PVM_CFLAGS) -o $@ pvmtables.cc pvm.o $(LIBFLAGS) $(PVM_LFLAGS) 
	mv $@ $(EXDIR)
