SHELL = /bin/sh
RM = rm -rf
CC = gcc
CPP = g++

INCDIRS = -I include

SRCDIR = src
OBJDIR = obj
LIBDIR = lib

CFLAGS = -g \
         -Wall \
         -Wshadow \
         -Wconversion \
         -Wextra \
         -Wno-unused-parameter \
         -Wno-missing-braces \
         -Wno-unused-variable

LIBNAME = libtrick_integ.a

CPP_OBJS = ${OBJDIR}/ABM_Integrator.o \
          ${OBJDIR}/Euler_Cromer_Integrator.o\
          ${OBJDIR}/Euler_Integrator.o\
          ${OBJDIR}/Integrator.o\
          ${OBJDIR}/MM4_Integrator.o\
          ${OBJDIR}/NL2_Integrator.o\
          ${OBJDIR}/RK2_Integrator.o\
          ${OBJDIR}/RK4_Integrator.o\
          ${OBJDIR}/RKF45_Integrator.o\
          ${OBJDIR}/RKF78_Integrator.o\
          ${OBJDIR}/RKG4_Integrator.o\
          ${OBJDIR}/getIntegrator.o

C_OBJS =  ${OBJDIR}/regula_falsi.o\
          ${OBJDIR}/reset_regula_falsi.o

LIBOBJS = ${C_OBJS} ${CPP_OBJS}

.cpp.o:
	${CPP} ${CFLAGS} ${INCDIRS} -c $<
.c.o:
	${CPP} ${CFLAGS} ${INCDIRS} -c $<

all: ${LIBDIR}/${LIBNAME}

$(CPP_OBJS): ${OBJDIR}/%.o : ${SRCDIR}/%.cpp
	$(CPP) $(CFLAGS) ${INCDIRS} -c $< -o $@

$(C_OBJS): ${OBJDIR}/%.o : ${SRCDIR}/%.c
	$(CC) $(CFLAGS) ${INCDIRS} -c $< -o $@

${LIBDIR}/${LIBNAME}: ${OBJDIR} ${LIBDIR} ${LIBOBJS}
	ar -r $@ ${LIBOBJS}

${OBJDIR}:
	mkdir -p ${OBJDIR}

${LIBDIR}:
	mkdir -p ${LIBDIR}

clean:
	${RM} *~
	${RM} ${OBJDIR}

spotless: clean
	${RM} ${LIBDIR}