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

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

## to use long long int as default Value, define :
BITS= 64
EXTRA_FLAGS = -DLINEAR_VALUE_IS_LONGLONG -DLINEAR_VALUE_PROTECT_MULTIPLY \
 -DLINEAR_VALUE_ASSUME_SOFTWARE_IDIV -DDEBUG_GLOBAL_EXCEPTIONS

# to use (standard) int as default Value, define :
#BITS= 32
#EXTRA_FLAGS = -DLINEAR_VALUE_IS_INT -DDEBUG_GLOBAL_EXCEPTIONS

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

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

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

###########################################################
# you shouldn't need to change anything below this line
###########################################################

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) "EXTRA_FLAGS=$(EXTRA_FLAGS)" "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

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)
$(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)
$(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)
$(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)
$(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) -o $(OBJ_DIR)/union_disjointe union_disjointe.c $(PARCHIVES)
$(OBJ_DIR)/union_convex: $(PHEADERS) $(PARCHIVES)
	$(CC) $(LDFLAGS) -o $(OBJ_DIR)/union_convex union_convex.c $(PARCHIVES)

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

$(OBJ_DIR)/testlib: testlib.c $(PARCHIVES)
	$(CC) $(CFLAGS) -o $(OBJ_DIR)/testlib testlib.c $(PARCHIVES)
$(OBJ_DIR)/polytest: polytest.c $(OBJ_DIR)/alpha.o $(PARCHIVES)
	$(CC) $(CFLAGS) -o $(OBJ_DIR)/polytest polytest.c $(OBJ_DIR)/alpha.o \
		$(PARCHIVES)
$(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
