# Makefile PolyLib V4.02
# Vincent Loechner, march 1998.

###########################################################
# type of integer to use (see ./arithlib for details)
###########################################################

# on most systems, long long int is the 64 bits integer definition.
# if this is your case define the following :
## to use long long int as default Value, define :
BITS= 64
CFLAGS = -DLINEAR_VALUE_IS_LONGLONG -DLINEAR_VALUE_PROTECT_MULTIPLY \
 -DLINEAR_VALUE_ASSUME_SOFTWARE_IDIV

# on some systems/processors (Alpha 21164 for example) long int
# is the type for 64 bits integers
# if this is your case, define the following :
#BITS= 64
#CFLAGS = -DLINEAR_VALUE_IS_LONG -DLINEAR_VALUE_PROTECT_MULTIPLY \
# -DLINEAR_VALUE_ASSUME_SOFTWARE_IDIV

#### THE 32 BITS VERSION SEEMS TO BE BROKEN. DON'T USE THIS
#### to use (standard) int as default Value, define :
#BITS= 32
#CFLAGS = -DLINEAR_VALUE_IS_INT

## for the typechecking tests, typedef Value as char * :
## (the executables won't run, this is just a compilation test)
#BITS= chars
#CFLAGS = -DLINEAR_VALUE_IS_CHARS -DLINEAR_VALUE_PROTECT_MULTIPLY

###########################################################
ARITH_DIR = ./arithlib
EXTRA_INCLUDES = -I$(ARITH_DIR) 
LDFLAGS =

# Define these 5 lines if your GNU-MP lib is not in the standard directory
#GMPINSTALLDIR=/usr
#GMPLIB=$(GMPINSTALLDIR)/local/lib
#GMPINCLUDE=$(GMPINSTALLDIR)/local/include
#EXTRA_INCLUDES += -I$(GMPINCLUDE)
#LDFLAGS += -L$(GMPLIB)


EXTRA_LIBS =
EHRHART_MP = 
MATRIX_MP = 

# Define these 4 lines if you want to use the GNU-mp (multiple precision)
# library when there is an overflow
CFLAGS += -DGNUMP
EHRHART_MP = ehrhart_mp.c
MATRIX_MP = matrix_mp.c
EXTRA_LIBS = -lgmp


###########################################################
# Compiler stuff
###########################################################
CC = gcc
CFLAGS += -Wall -O4 -g $(EXTRA_INCLUDES)
LDFLAGS += -g
RANLIB = echo


###########################################################
# you shouldn't need to change anything below this line
###########################################################
GMPSRC = $(EHRHART_MP) $(MATRIX_MP)

OBJ_DIR = Obj.$(BITS).$(OSTYPE)

PARCHIVES = $(OBJ_DIR)/polylib.a $(OBJ_DIR)/arithmetique.a

PEXEC = \
	testlib \
	polytest \
	c2p \
	r2p \
	findv \
	pp \
	union_disjointe \
	union_convex \
	ehrhart
POLY_EXEC= $(PEXEC:%=$(OBJ_DIR)/%)


### Make Arithmetic library
all:: 
	(cd $(ARITH_DIR) ;	\
	 $(MAKE) "CFLAGS=$(CFLAGS)" "OBJ_DIR=$(OBJ_DIR)" )

### Make Polyhedron library
all:: $(OBJ_DIR)
	@-rm -f $(OBJ_DIR)/arithmetique.a
	ln $(ARITH_DIR)/$(OBJ_DIR)/arithmetique.a $(OBJ_DIR)/arithmetique.a
all:: $(OBJ_DIR)/polylib.a

### Make PolyLib executables
all:: $(POLY_EXEC)
	@echo "---------------------------------------------------"
	@echo "To run the test, type: make test and/or make 64test"
	@echo "---------------------------------------------------"

clean:
	-rm -rf $(OBJ_DIR)

cleanlibs:
	(cd $(ARITH_DIR) ; $(MAKE) "OBJ_DIR=$(OBJ_DIR)" clean)

cleanall: clean cleanlibs

distclean:
	(cd $(ARITH_DIR) ; $(MAKE) distclean)
	-rm -rf Obj.*

test:
	(cd Test ; $(MAKE) "OBJ_DIR=../$(OBJ_DIR)" )
64test:
	(cd Test ; $(MAKE) "OBJ_DIR=../$(OBJ_DIR)" 64_tests )

########################################################################
#  polylib.a
######################################################################## 
LIB_CFILES= \
	errormsg.c \
	vector.c \
	matrix.c \
	polyhedron.c \
	polyparam.c \
	ehrhart.c \
	eval_ehrhart.c \
	$(GMPSRC)

LIB_HFILES= $(LIB_CFILES:.c=.h)
LIB_OBJECTS= $(LIB_CFILES:%.c=$(OBJ_DIR)/%.o) 

PHEADERS = polylib.h types-polylib.h $(LIB_HFILES)\
	$(ARITH_DIR)/arithmetique.h

$(OBJ_DIR):
	mkdir $(OBJ_DIR)

$(OBJ_DIR)/polylib.a: $(LIB_OBJECTS)
	ar r $(OBJ_DIR)/polylib.a $(LIB_OBJECTS)
# ranlib is not necessary in modern systems
	$(RANLIB) $(OBJ_DIR)/polylib.a

$(LIB_OBJECTS): $(PHEADERS) $(LIB_CFILES)
	$(CC) -c $(CFLAGS) $(*:$(OBJ_DIR)/%=%.c) -o $*.o

#$(LIB_HFILES): $(LIB_CFILES)
#	-mv -f $@ $@.old
#	cextract +a +w72 $(EXTRA_INCLUDES) -H_$*_H_ -o $@ $(@:.h=.c)


########################################################################
# executables
########################################################################

# constraints2polyhedron
$(OBJ_DIR)/c2p: $(OBJ_DIR)/c2p.o $(PARCHIVES)
	$(CC) $(LDFLAGS) -o $(OBJ_DIR)/c2p $(OBJ_DIR)/c2p.o \
		$(PARCHIVES) $(EXTRA_LIBS)
$(OBJ_DIR)/c2p.o: c2p.c $(PHEADERS)
	$(CC) -c $(CFLAGS) c2p.c -o $(OBJ_DIR)/c2p.o

# rays2polyhedron
$(OBJ_DIR)/r2p: $(OBJ_DIR)/r2p.o $(PARCHIVES)
	$(CC) $(LDFLAGS) -o $(OBJ_DIR)/r2p $(OBJ_DIR)/r2p.o \
		$(PARCHIVES) $(EXTRA_LIBS)
$(OBJ_DIR)/r2p.o: r2p.c $(PHEADERS)
	$(CC) -c $(CFLAGS) r2p.c -o $(OBJ_DIR)/r2p.o

# find vertices
$(OBJ_DIR)/findv: $(OBJ_DIR)/findv.o $(PARCHIVES)
	$(CC) $(LDFLAGS) -o $(OBJ_DIR)/findv $(OBJ_DIR)/findv.o \
		$(PARCHIVES) $(EXTRA_LIBS)
$(OBJ_DIR)/findv.o: findv.c $(PHEADERS)
	$(CC) -c $(CFLAGS) findv.c -o $(OBJ_DIR)/findv.o

# find validity domains+vertices
$(OBJ_DIR)/pp: $(OBJ_DIR)/pp.o $(PARCHIVES)
	$(CC) $(LDFLAGS) -o $(OBJ_DIR)/pp $(OBJ_DIR)/pp.o $(PARCHIVES) $(EXTRA_LIBS)
$(OBJ_DIR)/pp.o: pp.c $(PHEADERS)
	$(CC) -c $(CFLAGS) pp.c -o $(OBJ_DIR)/pp.o

# misc : disjoint and convex union of polyhedra (cf. sources)
$(OBJ_DIR)/union_disjointe: $(PHEADERS) $(PARCHIVES)
	$(CC) $(LDFLAGS) $(CFLAGS) -o $(OBJ_DIR)/union_disjointe union_disjointe.c \
		$(PARCHIVES) $(EXTRA_LIBS)
$(OBJ_DIR)/union_convex: $(PHEADERS) $(PARCHIVES)
	$(CC) $(LDFLAGS) $(CFLAGS) -o $(OBJ_DIR)/union_convex union_convex.c \
		$(PARCHIVES) $(EXTRA_LIBS)

# computes vertices, validity domains and ehrhart polynomial
$(OBJ_DIR)/ehrhart: ehrhart.c $(PARCHIVES)
	$(CC) $(LDFLAGS) $(CFLAGS) -DEMAIN -DEP_EVALUATION \
		-o $(OBJ_DIR)/ehrhart $(EHRHART_MP) ehrhart.c $(PARCHIVES) $(EXTRA_LIBS)

$(OBJ_DIR)/testlib: testlib.c $(PARCHIVES)
	$(CC) $(LDFLAGS) $(CFLAGS) -o $(OBJ_DIR)/testlib testlib.c \
		$(PARCHIVES) $(EXTRA_LIBS)
$(OBJ_DIR)/polytest: polytest.c $(OBJ_DIR)/alpha.o $(PARCHIVES)
	$(CC) $(LDFLAGS) $(CFLAGS) -o $(OBJ_DIR)/polytest polytest.c \
		$(OBJ_DIR)/alpha.o $(PARCHIVES) $(EXTRA_LIBS)
$(OBJ_DIR)/alpha.o: alpha.c $(PARCHIVES)
	$(CC) -c $(CFLAGS) alpha.c -o $(OBJ_DIR)/alpha.o


########################################################################
# unused
########################################################################

installshar:
	shar * >../lib.shar

installtar:
	rm -f ../polylib.tar
	tar cvf ../polylib.tar *
	rm -f ../polylib.tar.gz
	gzip ../polylib.tar
	rm -f ../polylib.uu
	uuencode ../polylib.tar.gz polylib.tar.gz >../polylib.uu
