
# define this stuff if you want to compile in malloc debugging code
#
# MALLOCINCS = -I/usr/sww/include/dbmalloc
# MALLOCLIBS = /usr/sww/lib/libdbmalloc.a

# Change these to suit your taste:
#
# define KEEP_ALLOCATED_MEMORY to keep pools of objects rather than
#	constantly allocating and freeing memory (and possibly causing
#	massive fragmentation).  I recommend leaving this defined.
#
# define TRACK_BREED_TYPE to gather statistics about the methods used to
#	breed the programs in a population.  This adds a few bytes for each
#	program and takes a few cycles to compute, but isn't too intrusive
#
# define DETECT_RESULT_LEAKS to add code which finds and frees 'result'
#	objects which haven't been freed by your operators.  This adds
#	a couple of pointers to each result and takes a tiny amount of time
#	for each 'result' created or freed.  If you're lazy, go ahead and
#	define this.  If you aren't using complex operators or if you're
#	careful about freeing 'result's and are concerned about performance,
#	leave it undefined.
#
DEFINES = -DKEEP_ALLOCATED_MEMORY -DTRACK_BREED_TYPE # -DDETECT_RESULT_LEAKS
INCLUDES = -I../include $(MALLOCINCS)

CC = gcc
CDEBUGFLAGS=-g -Wall -Wshadow -Wpointer-arith -Wcast-qual -Wwrite-strings \
	-Wconversion -Wstrict-prototypes -Wmissing-prototypes # -Wcast-align
# CDEBUGFLAGS=-pg
# CDEBUGFLAGS=-O2
CFLAGS = $(CDEBUGFLAGS) $(DEFINES) $(INCLUDES)
LIBS = $(MALLOCLIBS) -lm

SRCS = pmrand.c charstring.c genlist.c objtypes.c blob.c result.c \
	resultlist.c constant.c variable.c constntsrc.c operator.c \
	operatrsrc.c object.c objectlist.c program.c interface.c population.c
OBJS = pmrand.o charstring.o genlist.o objtypes.o blob.o result.o \
	resultlist.o constant.o variable.o constntsrc.o operator.o \
	operatrsrc.o object.o objectlist.o program.o interface.o population.o
DEBUG = pmrand charstring genlist objtypes result resultlist constant \
	variable constntsrc operator operatrsrc objectlist program interface \
	population

DEPEND = makedepend

MV = mv

all: libgeppetto.a

debug: $(DEBUG)

rundebug: debug
	-for i in $(DEBUG); do \
	  echo $$i; \
	  ./$$i > /tmp/debug.out 2>&1; \
	  if [ ! -f debug/$$i.out ]; then \
	    mv /tmp/debug.out debug/$$i.out; \
	  else \
	    diff debug/$$i.out /tmp/debug.out > /tmp/diff.out 2>&1; \
	    if [ $$? -eq 0 ]; then \
	      echo "$$i OK"; \
	    else \
	      echo $$i; \
	      cat /tmp/diff.out; \
	    fi; \
	  fi; \
	done; \
	rm -f /tmp/debug.out /tmp/diff.out

libgeppetto.a: $(OBJS)
	ar ruv libgeppetto.a $(OBJS)
	ranlib libgeppetto.a

pmrand: pmrand.c ../include/pmrand.h
	$(CC) $(CFLAGS) -o pmrand -DDEBUG_PMRAND pmrand.c $(LIBS)

genlist: genlist.c ../include/genlist.h
	$(CC) $(CFLAGS) -o genlist -DDEBUG_GENERICLIST genlist.c $(LIBS)

charstring: charstring.c ../include/charstring.h
	$(CC) $(CFLAGS) -o charstring -DDEBUG_CHARSTRING charstring.c $(LIBS)

objtypes: objtypes.c ../include/objtypes.h charstring.o genlist.o
	$(CC) $(CFLAGS) -o objtypes -DDEBUG_OBJTYPES objtypes.c charstring.o \
		 genlist.o $(LIBS)

result: result.c ../include/result.h charstring.o genlist.o objtypes.o \
		blob.o resultlist.o
	$(CC) $(CFLAGS) -o result -DDEBUG_RESULT result.c charstring.o \
		genlist.o objtypes.o blob.o resultlist.o $(LIBS)

resultlist: resultlist.c ../include/resultlist.h charstring.o genlist.o \
		objtypes.o blob.o result.o
	$(CC) $(CFLAGS) -o resultlist -DDEBUG_RESULTLIST resultlist.c \
		charstring.o genlist.o objtypes.o blob.o result.o $(LIBS)

constant: constant.c ../include/constant.h charstring.o genlist.o  objtypes.o \
		blob.o result.o resultlist.o
	$(CC) $(CFLAGS) -o constant -DDEBUG_CONSTANT constant.c charstring.o \
		genlist.o objtypes.o blob.o result.o resultlist.o $(LIBS)

variable: variable.c ../include/variable.h charstring.o genlist.o objtypes.o \
		 blob.o result.o resultlist.o
	$(CC) $(CFLAGS) -o variable -DDEBUG_VARIABLE variable.c charstring.o \
		genlist.o objtypes.o blob.o result.o resultlist.o $(LIBS)

constntsrc: constntsrc.c ../include/constntsrc.h pmrand.o charstring.o \
		genlist.o objtypes.o blob.o result.o resultlist.o constant.o
	$(CC) $(CFLAGS) -o constntsrc -DDEBUG_CONSTANTSRC constntsrc.c \
		pmrand.o charstring.o genlist.o objtypes.o blob.o result.o \
		resultlist.o constant.o $(LIBS)

operatrsrc: operatrsrc.c ../include/operatrsrc.h pmrand.o charstring.o \
		genlist.o objtypes.o blob.o result.o resultlist.o constant.o \
		variable.o constntsrc.o operator.o object.o
	$(CC) $(CFLAGS) -o operatrsrc -DDEBUG_OPERATORSRC operatrsrc.c \
		pmrand.o charstring.o genlist.o objtypes.o blob.o result.o \
		resultlist.o constant.o variable.o constntsrc.o operator.o \
		object.o $(LIBS)

objectlist: objectlist.c ../include/objectlist.h pmrand.o charstring.o \
		genlist.o objtypes.o blob.o result.o resultlist.o constant.o \
		variable.o constntsrc.o operator.o operatrsrc.o object.o
	$(CC) $(CFLAGS) -o objectlist -DDEBUG_OBJECTLIST objectlist.c \
		pmrand.o charstring.o genlist.o objtypes.o blob.o result.o \
		resultlist.o constant.o variable.o constntsrc.o operator.o \
		operatrsrc.o object.o $(LIBS)

operator: operator.c ../include/operator.h pmrand.o charstring.o genlist.o \
		objtypes.o blob.o result.o resultlist.o constant.o variable.o \
		constntsrc.o operatrsrc.o object.o objectlist.o optrivial.o
	$(CC) $(CFLAGS) -o operator -DDEBUG_OPERATOR operator.c pmrand.o \
		charstring.o genlist.o objtypes.o blob.o result.o \
		resultlist.o constant.o variable.o constntsrc.o operatrsrc.o \
		object.o objectlist.o optrivial.o $(LIBS)

program: program.c ../include/program.h pmrand.o charstring.o genlist.o \
		objtypes.o blob.o result.o resultlist.o constant.o variable.o \
		constntsrc.o operator.o operatrsrc.o object.o objectlist.o \
		optrivial.o
	$(CC) $(CFLAGS) -o program -DDEBUG_PROGRAM program.c pmrand.o \
		charstring.o genlist.o objtypes.o blob.o result.o \
		resultlist.o constant.o variable.o constntsrc.o operator.o \
		operatrsrc.o object.o objectlist.o optrivial.o $(LIBS)

interface: interface.c ../include/interface.h pmrand.o charstring.o \
		genlist.o objtypes.o blob.o result.o resultlist.o constant.o \
		variable.o constntsrc.o operator.o operatrsrc.o object.o \
		objectlist.o program.o optrivial.o
	$(CC) $(CFLAGS) -o interface -DDEBUG_INTERFACE interface.c pmrand.o \
		charstring.o genlist.o objtypes.o blob.o result.o \
		resultlist.o constant.o variable.o constntsrc.o operator.o \
		operatrsrc.o object.o objectlist.o program.o optrivial.o \
		$(LIBS)

population: population.c ../include/population.h pmrand.o charstring.o \
		genlist.o objtypes.o blob.o result.o resultlist.o constant.o \
		variable.o constntsrc.o operator.o operatrsrc.o object.o \
		objectlist.o program.o interface.o optrivial.o
	$(CC) $(CFLAGS) -o population -DDEBUG_POPULATION population.c \
		pmrand.o charstring.o genlist.o objtypes.o blob.o result.o \
		resultlist.o constant.o variable.o constntsrc.o operator.o \
		operatrsrc.o object.o objectlist.o program.o interface.o \
		optrivial.o $(LIBS)

clean:
	rm -f a.out core $(DEBUG) $(OBJS) Makefile.bak *~ optrivial.o \
		*.pure_hardlink *.pure_linkinfo *_pure_[0-9]*.o

# this 'depend' ignores system include files to increase Makefile portability
#
depend::
	$(DEPEND) -s "# DO NOT DELETE" -- $(DEFINES) $(INCLUDES) -- $(SRCS)
	sed -e '/# DO NOT DELETE/,$$ s/ \/[a-zA-Z0-9./]*//g' -e '/\.o:$$/d' \
		< Makefile > Makefile.new && mv -f Makefile.new Makefile

###########################################################################
# dependencies generated by makedepend
#
# DO NOT DELETE

pmrand.o: ../include/pmrand.h ../include/compiler.h
charstring.o: ../include/charstring.h
charstring.o: ../include/compiler.h ../include/proto.h
genlist.o: ../include/genlist.h ../include/compiler.h
genlist.o: ../include/proto.h
objtypes.o: ../include/objtypes.h ../include/compiler.h
objtypes.o: ../include/charstring.h ../include/genlist.h
objtypes.o: ../include/proto.h
blob.o: ../include/blob.h ../include/compiler.h
blob.o: ../include/charstring.h ../include/objtypes.h ../include/object.h
blob.o: ../include/result.h ../include/resultlist.h ../include/genlist.h
result.o: ../include/result.h
result.o: ../include/compiler.h ../include/objtypes.h ../include/charstring.h
result.o: ../include/resultlist.h ../include/genlist.h
result.o: ../include/blob.h ../include/proto.h
resultlist.o: ../include/resultlist.h ../include/compiler.h
resultlist.o: ../include/genlist.h ../include/charstring.h
resultlist.o: ../include/result.h ../include/objtypes.h
resultlist.o: ../include/blob.h ../include/proto.h
constant.o: ../include/constant.h ../include/compiler.h ../include/objtypes.h
constant.o: ../include/charstring.h ../include/result.h
constant.o: ../include/resultlist.h ../include/genlist.h ../include/blob.h
constant.o: ../include/proto.h
variable.o: ../include/variable.h
variable.o: ../include/compiler.h ../include/objtypes.h
variable.o: ../include/charstring.h ../include/blob.h ../include/result.h
variable.o: ../include/resultlist.h ../include/genlist.h ../include/proto.h
constntsrc.o: ../include/pmrand.h
constntsrc.o: ../include/compiler.h ../include/constntsrc.h
constntsrc.o: ../include/objtypes.h ../include/charstring.h
constntsrc.o: ../include/constant.h ../include/result.h
constntsrc.o: ../include/resultlist.h ../include/genlist.h ../include/blob.h
constntsrc.o: ../include/proto.h
operator.o: ../include/object.h
operator.o: ../include/compiler.h ../include/objtypes.h
operator.o: ../include/charstring.h ../include/result.h
operator.o: ../include/resultlist.h ../include/genlist.h ../include/blob.h
operator.o: ../include/operatrsrc.h ../include/operator.h ../include/proto.h
operatrsrc.o: ../include/operator.h
operatrsrc.o: ../include/compiler.h ../include/charstring.h
operatrsrc.o: ../include/object.h ../include/objtypes.h ../include/result.h
operatrsrc.o: ../include/resultlist.h ../include/genlist.h ../include/blob.h
operatrsrc.o: ../include/operatrsrc.h ../include/proto.h
object.o: ../include/constant.h ../include/compiler.h
object.o: ../include/objtypes.h ../include/charstring.h ../include/result.h
object.o: ../include/resultlist.h ../include/genlist.h ../include/blob.h
object.o: ../include/variable.h ../include/operator.h ../include/object.h
object.o: ../include/constntsrc.h ../include/operatrsrc.h ../include/proto.h
objectlist.o: ../include/variable.h
objectlist.o: ../include/compiler.h ../include/objtypes.h
objectlist.o: ../include/charstring.h ../include/blob.h
objectlist.o: ../include/result.h ../include/resultlist.h
objectlist.o: ../include/genlist.h ../include/operatrsrc.h
objectlist.o: ../include/object.h ../include/operator.h
objectlist.o: ../include/objectlist.h ../include/proto.h
program.o: ../include/pmrand.h ../include/compiler.h ../include/constant.h
program.o: ../include/objtypes.h ../include/charstring.h
program.o: ../include/result.h ../include/resultlist.h ../include/genlist.h
program.o: ../include/blob.h ../include/objectlist.h ../include/object.h
program.o: ../include/operator.h ../include/operatrsrc.h ../include/program.h
program.o: ../include/proto.h
interface.o: ../include/interface.h
interface.o: ../include/objectlist.h ../include/compiler.h
interface.o: ../include/genlist.h ../include/charstring.h
interface.o: ../include/object.h ../include/objtypes.h
interface.o: ../include/result.h ../include/resultlist.h ../include/blob.h
interface.o: ../include/program.h ../include/proto.h
population.o: ../include/pmrand.h ../include/compiler.h ../include/program.h
population.o: ../include/object.h ../include/objtypes.h
population.o: ../include/charstring.h ../include/result.h
population.o: ../include/resultlist.h ../include/genlist.h ../include/blob.h
population.o: ../include/objectlist.h ../include/population.h
population.o: ../include/interface.h ../include/proto.h
