EXE                 = ../bin/nomad
LIB                 = ../lib/nomad.a
COMPILATOR          = g++
COMPILATOR_OPTIONS  = -ansi -Wall -DGCC_X
LIBS                = -lm
INCLUDE             = -I.
COMPILE             = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c
OBJS_LIB            = Mads.o Double.o Point.o Parameters.o Parameter_Entries.o Parameter_Entry.o Eval_Point.o Cache.o Barrier.o Evaluator.o Evaluator_Control.o Multi_Obj_Evaluator.o Stats.o Clock.o utils.o Exception.o Cache_Point.o Cache_File_Point.o Signature.o Priority_Eval_Point.o Direction.o Directions.o Mesh.o Random_Pickup.o Variable_Group.o Phase_One_Evaluator.o
OBJS                = nomad.o $(OBJS_LIB)

$(EXE): $(OBJS)
	$(COMPILATOR) -o $(EXE) $(OBJS) $(LIBS) $(COMPILATOR_OPTIONS)

mpi: COMPILATOR_OPTIONS += -DUSE_MPI -O3
mpi: COMPILATOR          = mpic++
mpi: clean $(OBJS)
	@echo "   building the MPI release version..."
	@echo "   exe file : "$(EXE)
	@$(COMPILATOR) -o  $(EXE) $(OBJS) $(LIBS) $(COMPILATOR_OPTIONS)
	@strip  $(EXE)

release: COMPILATOR_OPTIONS += -O3
release: clean $(OBJS)
	@echo "   building the release version (no MPI) ..."
	@echo "   exe file : "$(EXE)
	@$(COMPILATOR) -o  $(EXE) $(OBJS) $(LIBS) $(COMPILATOR_OPTIONS)
	@strip  $(EXE)

debug: COMPILATOR_OPTIONS += -g -DDEBUG
debug: clean $(OBJS)
	@echo "   building the debug version (no MPI) ..."
	@echo "   exe file : "$(EXE)
	$(COMPILATOR) -o  $(EXE) $(OBJS) $(LIBS) $(COMPILATOR_OPTIONS)

lib: COMPILATOR_OPTIONS += -O3
lib: clean $(OBJS)
	@echo "   building the RELEASE lib..."
	@echo "   lib file : "$(LIB)
	@ar -r $(LIB) $(OBJS_LIB)
	@ranlib $(LIB)

libmpi: COMPILATOR_OPTIONS += -O3 -DUSE_MPI
libmpi: COMPILATOR          = mpic++
libmpi: LIB                 = nomad_mpi.a
libmpi: clean $(OBJS)
	@echo "   building the MPI lib..."
	@echo "   lib file : "$(LIB)
	@ar -r $(LIB) $(OBJS_LIB)
	@ranlib $(LIB)

nomad.o: nomad.cpp Mads.o
	$(COMPILE) nomad.cpp

Mads.o: Mads.cpp Mads.hpp Evaluator_Control.o
	$(COMPILE) Mads.cpp

Variable_Group.o: Variable_Group.cpp Variable_Group.hpp Directions.o
	$(COMPILE) Variable_Group.cpp

Evaluator_Control.o: Evaluator_Control.cpp Evaluator_Control.hpp Phase_One_Evaluator.o Barrier.o Stats.o Priority_Eval_Point.o
	$(COMPILE) Evaluator_Control.cpp

Phase_One_Evaluator.o: Phase_One_Evaluator.cpp Phase_One_Evaluator.hpp Multi_Obj_Evaluator.o
	$(COMPILE) Phase_One_Evaluator.cpp

Multi_Obj_Evaluator.o: Multi_Obj_Evaluator.cpp Multi_Obj_Evaluator.hpp Evaluator.o
	$(COMPILE) Multi_Obj_Evaluator.cpp

Barrier.o: Barrier.cpp Barrier.hpp Filter_Point.hpp Set_Element.hpp Eval_Point.o Cache.o
	$(COMPILE) Barrier.cpp

Stats.o: Stats.cpp Stats.hpp Clock.o Double.o
	$(COMPILE) Stats.cpp

Cache_Point.o: Cache_Point.cpp Cache_Point.hpp Eval_Point.o Set_Element.hpp
	$(COMPILE) Cache_Point.cpp

Cache.o: Cache.cpp Cache.hpp Cache_Point.o Clock.o Cache_File_Point.o
	$(COMPILE) Cache.cpp

Cache_File_Point.o: Cache_File_Point.cpp Cache_File_Point.hpp Exception.o Uncopyable.hpp
	$(COMPILE) Cache_File_Point.cpp

Priority_Eval_Point.o: Priority_Eval_Point.cpp Priority_Eval_Point.hpp Eval_Point.o Set_Element.hpp
	$(COMPILE) Priority_Eval_Point.cpp

Clock.o: Clock.cpp Clock.hpp Uncopyable.hpp
	$(COMPILE) Clock.cpp

Evaluator.o: Evaluator.cpp Evaluator.hpp Eval_Point.o
	$(COMPILE) Evaluator.cpp

Eval_Point.o: Eval_Point.cpp Eval_Point.hpp Signature.o
	$(COMPILE) Eval_Point.cpp

Signature.o: Signature.cpp Signature.hpp Parameters.o
	$(COMPILE) Signature.cpp

Direction.o: Direction.cpp Direction.hpp Point.o
	$(COMPILE) Direction.cpp

Directions.o: Directions.cpp Directions.hpp Direction.o Mesh.o Random_Pickup.o
	$(COMPILE) Directions.cpp

Random_Pickup.o: Random_Pickup.cpp Random_Pickup.hpp Uncopyable.hpp
	$(COMPILE) Random_Pickup.cpp

Mesh.o: Mesh.cpp Mesh.hpp Point.o Uncopyable.hpp
	$(COMPILE) Mesh.cpp

Parameter_Entries.o: Parameter_Entries.cpp Parameter_Entries.hpp Parameter_Entry.o
	$(COMPILE) Parameter_Entries.cpp

Parameter_Entry.o: Parameter_Entry.hpp Parameter_Entry.cpp Uncopyable.hpp utils.o
	$(COMPILE) Parameter_Entry.cpp

Parameters.o: Parameters.cpp Parameters.hpp Parameter_Entries.o Variable_Group.o
	$(COMPILE) Parameters.cpp

Double.o: Double.cpp Double.hpp Exception.o
	$(COMPILE) Double.cpp

Point.o: Point.cpp Point.hpp Double.o
	$(COMPILE) Point.cpp

utils.o: utils.cpp utils.hpp defines.hpp
	$(COMPILE) utils.cpp

Exception.o: Exception.cpp Exception.hpp utils.o
	$(COMPILE) Exception.cpp

clean:
	@echo "cleaning obj files"
	@rm -f $(OBJS)

del:
	@echo "cleaning trash files"
	@rm -f core *~
	@echo "cleaning obj files"
	@rm -f $(OBJS)
	@echo "cleaning exe file"
	@rm -f $(EXE)
	@echo "cleaning lib files"
	@rm -f *.a
