YACC=bison -y
YFLAGS= -v
LEX=flex -l
CC=gcc
WARNINGS=-Wall
#CFLAGS=-g
CFLAGS=-O3
CPP=gcc -E -

SRCS=assign.c ctl.c config.c dep.c dimacs.c graph.c idx.c list.c main.c \
pp.c prop.c prove.c smv.c stack.c util.c var.c varset.c lex.yy.c y.tab.c

OBJS=assign.o ctl.o config.o dep.o dimacs.o graph.o idx.o list.o main.o \
pp.o prop.o prove.o smv.o stack.o util.o var.o varset.o lex.yy.o y.tab.o

.c.o:
	$(CC) $(CFLAGS) $(WARNINGS) -c $*.c

all: bmc genqueue genpermute genqueueyz genbarrel gendme1

bmc: $(OBJS)
	$(CC) $(CFLAGS) $(WARNINGS) -o $@ $(OBJS) $(LIBS)

genqueue: genqueue.c
	gcc -Wall -g -o $@ genqueue.c

genpermute: genpermute.c
	gcc -Wall -g -o $@ genpermute.c

genqueueyz: genqueueyz.c
	gcc -Wall -g -o $@ genqueueyz.c

genbarrel: genbarrel.c
	gcc -Wall -g -o $@ genbarrel.c

gendme1: gendme1.cc
	gcc -Wall -g -o $@ gendme1.cc $(LIBS)

y.tab.c: parser.y config.h
	@@answer="`( \
	  echo '#include "config.h"'; \
	  echo '#ifdef DEBUG'; \
	  echo 'YEAH'; \
	  echo '#endif'; \
	) | $(CPP) | fgrep YEAH`"; \
	if [ ! x"$$answer" = x ]; then flags="-t"; fi; \
	echo "$(YACC) $(YFLAGS) $$flags -d parser.y"; \
	$(YACC) $(YFLAGS) $$flags -d parser.y

lex.yy.c: scanner.l
	$(LEX) scanner.l

# avoid warning messsages with -Wall
y.tab.o: y.tab.c
	$(CC) $(CFLAGS) -W -c $*.c
lex.yy.o: y.tab.c lex.yy.c
	$(CC) $(CFLAGS) -W -c $*.c

depend: $(SRCS)
	makedepend $(SRCS)

tags: $(SRCS)
	ctags $(SRCS)

clean:
	rm -f $(OBJS) y.tab.h y.tab.c lex.yy.c y.output
	rm -f bmc genqueue genpermute genqueueyz sortcex genbarrel geneq
	rm -f gendme1

realclean: clean
	for dir in . test; \
	do \
	  pwd=`pwd`; \
	  cd $$dir; \
	  rm -f core *.bak *~ ccmalloc.log .smv-pid .pure; \
	  cd $$pwd; \
	done
	makedepend
	rm -f Makefile.bak tags

.PHONY: all clean realclean depend
# DO NOT DELETE
