CC		= gcc
CFLAGS	= -std=c99 -pedantic-errors -Wall -Winline
PROG	= dbtdd
CSRCS	= dbtdd.c my_hash.c my_opcache.c my_io_dimacs.c tdd_io_dimacs.c ssort2.c my_tdd.c tdd_gen.c tdd_min.c

MYFLAGS	= -DSELECT_MYTDD
MYFLAGS	+= -DMISC_LOG -DTIME_LOG	# provide basic information on program behavior and various settings in stdout.
#MYFLAGS	+= -DRECDEPTH_GUARD			# prevent recursive function calls from stack overflow. 
#MYFLAGS	+= -DSIZE_LOG				# output intermediate decision diagram sizes as files.
#MYFLAGS	+= -DOPCACHE_LOG -DUT_LOG	# provide detailed log of uniquetable and operation cache in stdout.


# uncomment the following line if you use GSL library for random number generation.
#RANDTYPE = GSL

ifeq ($(RANDTYPE),GSL)
MYFLAGS += -DSELECT_GSL
RAND_LIB = -lgsl -lgslcblas
endif

# uncomment the following line if you use bdd instead of dtdd.
DDTYPE = BDD

ifeq ($(DDTYPE),BDD)
MYFLAGS += -DUSE_BDD -DSELECT_CUDD		

CUDD_DIR  = cudd-2.5.0
CUDD_INCLUDE = -I$(CUDD_DIR)/include
CUDD_LIB = $(CUDD_DIR)/dddmp/libdddmp.a $(CUDD_DIR)/cudd/libcudd.a $(CUDD_DIR)/mtr/libmtr.a \
	    $(CUDD_DIR)/st/libst.a $(CUDD_DIR)/util/libutil.a $(CUDD_DIR)/epd/libepd.a

INCLUDE		= $(CUDD_INCLUDE) 
LIB			= $(CUDD_LIB) $(RAND_LIB) -lm

CSRCS		+= bdd_gen.c bdd_min.c dnf2bdd.c

else
INCLUDE		=
LIB			= $(RAND_LIB) -lm
CSRCS		+=
endif

COBJS		= $(addsuffix .o, $(basename $(CSRCS)))
DEPENDS		= $(COBJS:.o=.d)

.PHONY: clean depend
.c.o:
	$(CC) $(CFLAGS) $(MYFLAGS) $(INCLUDE) -c $<
all: $(PROG) 
$(PROG): $(COBJS)
	$(CC) $(CFLAGS) $(MYFLAGS) -DNDEBUG -O3 -o $@ $(COBJS) $(LIB)
$(PROG)_debug: $(COBJS)
	$(CC) $(CFLAGS) $(MYFLAGS) -DMY_DEBUG -ggdb -o $@ $(COBJS) $(LIB)
clean:
	@rm -f $(PROG) $(PROG)_debug *.o *.d

%.d: %.c
	@$(CC) -MM  $< > $@.$$$$;\
	sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@;\
	rm -f $@.$$$$

-include $(DEPENDS)

