CC=g++
CCOPTS=-Wall
LINK=g++
LINKOPTS= -lm

YACC=bison -dt
LEX=flex -Cea
TEMPLATE_PREPROCESSOR=./perlpp -qq

# This must coincide with the name of the proyect's root directory.
PROYECT_NAME=qmath
PROYECT_ROOT_DIR=.
# $(TMP) gets deleted when "make mrproper" terminates, so it should be
# a directory solely for this purpose.
TMP=/tmp/qmath_makefile

include evaluators/evaluators.makefile.defs

OBJ_FILES=$(EVALUATORS_OBJ_FILES)         \
          $(TMP)/qmath.o                  \
          $(TMP)/qmath.tab.o              \
          $(TMP)/lex.yy.o                 \
          $(TMP)/QMATH_Evaluator.o        \
          $(TMP)/QMATH_Evaluator_loader.o \
          $(TMP)/QMATH_Expression.o
GENERATED_FILES=qmath.tab.c               \
                qmath.tab.h               \
                lex.yy.c                  \
                QMATH_Evaluator.H         \
                QMATH_Evaluator.cc        \
                QMATH_Evaluator_loader.H  \
                QMATH_Evaluator_loader.cc
INCLUDED_FILES=QMATH_Expression.H QMATH_Evaluator.H QMATH_Evaluator_loader.H qmath.H QMATH_types.H

SUBDIRECTORIES=evaluators

all: $(TMP)
	if [ "$(SUBDIRECTORIES)"  != "" ]; then make subdirectories;  fi
	if [ "$(GENERATED_FILES)" != "" ]; then make generated_files; fi
	if [ "$(OBJ_FILES)"       != "" ]; then make obj_files;       fi
	$(LINK) $(LINKOPTS) -o $(PROYECT_NAME) $(OBJ_FILES)

obj_files: $(OBJ_FILES)

generated_files:
	for file in $(GENERATED_FILES); do if [ -f $$file ]; then chmod -f u+w $$file; fi; done
	make $(GENERATED_FILES);
	chmod -f u-w $(GENERATED_FILES)

$(TMP):
	mkdir -p $@

%.H: template.%.H
	$(TEMPLATE_PREPROCESSOR) -o $@ $<

%.cc: template.%.cc
	$(TEMPLATE_PREPROCESSOR) -o $@ $<

$(TMP)/QMATH_Evaluator_loader.o: QMATH_Evaluator_loader.cc $(INCLUDED_FILES) $(EVALUATORS_HEADER_FILES)
	$(CC) -c -o $@ $<

$(TMP)/%.o: %.cc $(INCLUDED_FILES)
	$(CC) -c -o $@ $<

$(TMP)/%.o: %.c $(INCLUDED_FILES)
	$(CC) -c -o $@ $<

%.tab.h: %.tab.c

%.tab.c: %.y $(INCLUDED_FILES)
	$(YACC) $<

lex.yy.c: qmath.lex $(INCLUDED_FILES)
	$(LEX)  $<

subdirectories:
	for directory in $(SUBDIRECTORIES); do bash -c "cd $$directory ; make; cd .."; done

clean:
	rm -f qmath
	rm -f $(OBJ_FILES)
	rm -f $(GENERATED_FILES)

mrproper:
	make clean
	if [ "$(SUBDIRECTORIES)" != "" ]; then bash -c "for directory in $(SUBDIRECTORIES); do cd \$$directory ; make mrproper ; cd ..; done"; fi
	rm -rf $(TMP)
	# Remove EMACS backup files.
	find . -iname '*~' -type f -exec rm '{}' ';'

snapshot:
	make mrproper
	bash -c "pushd .; cd $(PROYECT_ROOT_DIR)/..; tar -zcvf $(PROYECT_NAME)_`date +\"%Y%m%d_%H%M\"`.tgz $(PROYECT_NAME); popd;"
