#Set local paths and env
export MAKEFLAGS=-s
export LIB_DIR=$(GM2_GARFIELD_LIB)
export OBJ_DIR=$(GM2_GARFIELD_OBJ)
export BIN_DIR=$(GM2_GARFIELD_BIN)
export INC_DIR=$(GM2_GARFIELD_INC)

# Check whether linux or mac (OSTYPE set in setup.sh)
ifeq ($(OSTYPE),Darwin)
COMPILE_ONLY=-S
OS_FLAG=
endif
ifeq ($(OSTYPE),linux)
COMPILE_ONLY=-c
OS_FLAG=-DOS_LINUX
endif
ifeq ($(OSTYPE),linux64)
COMPILE_ONLY=-c
OS_FLAG=-DOS_LINUX
endif

#Set up basic compilation properties
export GCC = gcc
export CPP = g++ 
export LDD = g++
export AR=ar
export CPPSTD = -std=c++0x
export CPP_OPTS = -g $(CPPSTD) -I$(INC_DIR) 
CPP_OPTS += $(COMPILE_ONLY) -Wno-deprecated -fPIC $(OS_FLAG) -Dextname
export LDD_OPTS = 

#Set up ROOT
CPP_OPTS += $(shell $(ROOTSYS)/bin/root-config --cflags)
LDD_OPTS += -g $(shell $(ROOTSYS)/bin/root-config --ldflags)
export ROOTLIBS=$(shell $(ROOTSYS)/bin/root-config --libs)

#Set up GARFIELD
ROOTLIBS += -lGeom -lgfortran -lm
CPP_OPTS += -I$(GARFIELD_HOME)/Include -I$(GARFIELD_HOME)/Heed
export GARFIELDLIBS=-L$(GARFIELD_HOME)/Library -lGarfield

#Set up tracker DAQ code (using some of the same common classes)
CPP_OPTS += -I$(GM2_TRACKER_DAQ_INC)

#Set up paths for locally built library
LOCALLIBS=-L$(LIB_DIR) -lgm2-garfield

#Define variables containing all libs
export LIBS = $(LOCALLIBS) $(ROOTLIBS) $(GARFIELDROOTLIBS) $(GARFIELDLIBS)

all: dirs lib bin

clean :
	echo "<**Clean**>"
	rm -rf $(OBJ_DIR)/*.o
	rm -rf $(LIB_DIR)/*.so
	rm -rf $(BIN_DIR)/*.exe

dirs :
	echo "<**Creating directories**>"
	if [ ! -e $(OBJ_DIR) ] ; then \
		mkdir -p $(OBJ_DIR) ;\
	fi      
	if [ ! -e $(LIB_DIR) ] ; then \
		mkdir -p $(LIB_DIR) ;\
	fi      
	if [ ! -e $(BIN_DIR) ] ; then \
		mkdir -p $(BIN_DIR) ;\
	fi

#------------------------------
# Library
#

$(OBJ_DIR)/GarfieldStrawModel.o : GarfieldStrawModel.cc $(GM2_GARFIELD_INC)/GarfieldStrawModel.hh
	echo "<**Compiling**> GarfieldStrawModel.cc"
	$(CPP) $(CPP_OPTS) -o $(OBJ_DIR)/GarfieldStrawModel.o GarfieldStrawModel.cc

$(OBJ_DIR)/RootManager.o : $(GM2_TRACKER_DAQ_SRC)/general/RootManager.cc $(GM2_TRACKER_DAQ_INC)/general/RootManager.hh
	echo "<**Compiling**> RootManager.cc"
	$(CPP) $(CPP_OPTS) -o $(OBJ_DIR)/RootManager.o $(GM2_TRACKER_DAQ_SRC)/general/RootManager.cc

OBJECTS = $(OBJ_DIR)/GarfieldStrawModel.o $(OBJ_DIR)/RootManager.o

lib : dirs $(OBJECTS)
	echo "<***Building Library**>" $(notdir $(LIB_DIR)/libgm2-garfield.so)
	$(CPP) -shared -o $(LIB_DIR)/libgm2-garfield.so $(OBJECTS)


#------------------------------
# Executables
#

bin: lib $(BIN_DIR)/RunGarfieldStrawModel.exe 

$(BIN_DIR)/%.exe : %.cc 
	echo "<**Compiling**>" $(<)
	$(CPP) $(CPP_OPTS) -o $(OBJ_DIR)/$(<:.cc=.o) $(<)
	echo "<**Linking**>"  $(patsubst %.cc, %.exe, $(<))
	$(LDD) $(LDD_OPTS) -o $(BIN_DIR)/$(<:.cc=.exe) $(OBJ_DIR)/$(<:.cc=.o) $(LIBS)

