##################################################
# Variables
##################################################

# compilers
CC  = gcc
CXX = g++

OPT_FLAGS       = -O3 -funroll-loops -funroll-all-loops -ffast-math
#MARCH_OPT_FLAGS = -march=opteron -mtune=opteron -msse -msse2
MARCH_OPT_FLAGS = -msse -msse2
C_COMPAT_FLAGS  = -std=gnu99
DEBUG_FLAGS     = -g
CPPFLAGS        = -fPIC -Wall ${DEBUG_FLAGS} ${OPT_FLAGS} ${MARCHOPT_FLAGS}
CFLAGS          = $(C_COMPAT_FLAGS) -I. -I../src
CXXFLAGS        = -I. -I../src
LDFLAGS         =

#
# (NOTICE) Please edit the path of libSBML accordingly
#
LIBSBML_INCLUDE = /usr/include
LIBSBML_LIB     = /usr/lib64


LIBSSA_TARGET = libssa.so.0
LIBSSA_SONAME = libssa.so.0
LIBSSA_SFILE  = libssa.so
LIBSSA_SRC    = libssa.c
LIBSSA_HEAD   = libssa.h
#LIBSSA_SRC    = ../src/libssa.c
#LIBSSA_HEAD   = ../src/libssa.h
LIBSSA_OBJ    = $(LIBSSA_SRC:.c=.o)

LIBSSA_SBML_TARGET = libssa-sbml.so.0
LIBSSA_SBML_SONAME = libssa-sbml.so.0
LIBSSA_SBML_SFILE  = libssa-sbml.so
LIBSSA_SBML_SRC    = SBMLDtoSSAPConverter.cpp \
                     SBMLSSASolver.cpp \
                     SSAPtoSBMLDConverter.cpp \
                     SSASolverLauncher.cpp \
                     SSALibUtil.cpp \
                     ASTNodeCalculator.cpp
LIBSSA_SBML_HEAD   = SBMLDtoSSAPConverter.h \
                     SBMLSSASolver.h \
                     SSAPtoSBMLDConverter.h \
                     SSASolverLauncher.h \
                     SSALibUtil.h \
                     ASTNodeCalculator.cpp \
                     ASTNodeCalculator.h \
                     common.h
LIBSSA_SBML_OBJ    = $(LIBSSA_SBML_SRC:.cpp=.o)
LIBSSA_SBML_CFLAGS  = -I ${LIBSBML_INCLUDE}
LIBSSA_SBML_LDFLAGS = -Wl,-rpath,. -L. -L${LIBSBML_LIB} -lssa -lsbml 

SOLVER_PROG         = ssaSBMLSolver
SOLVER_PROG_SRC     = example/ssaSBMLSolver.cpp
SOLVER_PROG_CFLAGS  = -I ./src
SOLVER_PROG_LDFLAGS = -Wl,-rpath,. -L. -lssa-sbml

CREATE_PSSP_PROG         = createPSSP
CREATE_PSSP_PROG_SRC     = example/createCaDrivenPSSP.cpp
CREATE_PSSP_PROG_CFLAGS  = -I ${LIBSBML_INCLUDE}
CREATE_PSSP_PROG_LDFLAGS = -Wl,-rpath,${LIBSBML_LIB} -L${LIBSBML_LIB} -lsbml

vpath %.h   src ../src
vpath %.cpp src ../src
vpath %.c   ../src

##################################################
# Rules
##################################################

all: ssasbml sample
ssasbml: $(LIBSSA_SBML_TARGET) 
sample: $(SOLVER_PROG) ${CREATE_PSSP_PROG} j-sbml j-debug


$(LIBSSA_SBML_TARGET): $(LIBSSA_TARGET) $(LIBSSA_SBML_OBJ)
	$(CC) $(CPPFLAGS) $(CXXFLAGS) $(LIBSSA_SBML_CFLAGS) -Wl,-soname,$(LIBSSA_SBML_SONAME) \
	-shared -o $@ $(LIBSSA_SBML_OBJ) $(LIBSSA_SBML_LDFLAGS)
	if [ ! -e $(LIBSSA_SBML_SFILE) ]; then \
		ln -s $@ $(LIBSSA_SBML_SFILE); \
	fi

$(LIBSSA_TARGET): $(LIBSSA_OBJ)
	$(CC) $(CPPFLAGS) $(CFLAGS) -Wl,-soname,$(LIBSSA_SONAME) -shared -o $@ $< $(LDFLAGS)
	if [ ! -e $(LIBSSA_SFILE) ]; then \
		ln -s $@ $(LIBSSA_SFILE); \
	fi

$(SOLVER_PROG): $(LIBSSA_SBML_TARGET) $(SOLVER_PROG_SRC)
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) $(SOLVER_PROG_CFLAGS) -o $@ $(SOLVER_PROG_SRC) $(SOLVER_PROG_LDFLAGS)

${CREATE_PSSP_PROG}: ${CREATE_PSSP_PROG_SRC}
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) ${CREATE_PSSP_PROG_CFLAGS} -o $@ $< ${CREATE_PSSP_PROG_LDFLAGS}

j-sbml: example/j-sbml.cpp
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) $(SOLVER_PROG_CFLAGS) -o $@ $< $(SOLVER_PROG_LDFLAGS)

j-debug: example/j-debug.cpp
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) $(SOLVER_PROG_CFLAGS) -o $@ $< $(SOLVER_PROG_LDFLAGS)

.c.o: 
	$(CC) $(CPPFLAGS) $(CFLAGS) -c $<

.cpp.o: 
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $<

clean:
	rm -f $(LIBSSA_TARGET) $(LIBSSA_OBJ) $(LIBSSA_SBML_TARGET) $(LIBSSA_SBML_OBJ) \
	$(LIBSSA_SFILE) $(LIBSSA_SBML_SFILE) $(SOLVER_PROG) $(CREATE_PSSP_PROG) j-sbml j-debug 
