# installation prefix; executables are installed in $(PREFIX)/bin
PREFIX = $(HOME)

# test for ccache
CCACHE = $(shell which ccache 2>/dev/null)

ifneq ($(CCACHE),)
CC = ccache gcc
FC = gfortran
else
CC = gcc
FC = gfortran
endif

# test for architecture
UNAME = $(shell uname)

ifeq ($(UNAME),Linux)
CFLAGS = -O3
LIBFLAGS = -lgsl -lgslcblas -lm
FFLAGS = -O3
else
ifeq ($(UNAME),Darwin)

# Test if gsl and getopt are installed via darwin ports or fink
FINK_DIR = /sw
DARWIN_DIR = /opt/local

ifeq ($(wildcard $(FINK_DIR)/include/gsl/gsl_sys.h), )
ifeq ($(wildcard $(DARWIN_DIR)/include/gsl/gsl_sys.h), )
$(error "Cannot find GSL headers!")
else
GSL_INCLUDE = $(DARWIN_DIR)/include
GSL_LIB = $(DARWIN_DIR)/lib
endif
else
GSL_INCLUDE = $(FINK_DIR)/include
GSL_LIB = $(FINK_DIR)/lib
endif
ifeq ($(wildcard $(FINK_DIR)/include/gnugetopt/getopt.h), )
ifeq ($(wildcard $(DARWIN_DIR)/include/gnugetopt/getopt.h), )
$(error "Cannot find GNU getopt headers!")
else
GETOPT_INCLUDE = $(DARWIN_DIR)/include/gnugetopt
GETOPT_LIB = $(DARWIN_DIR)/lib
endif
else
GETOPT_INCLUDE = $(FINK_DIR)/include/gnugetopt
GETOPT_LIB = $(FINK_DIR)/lib
endif

CFLAGS = -O3 -m32 -I$(GETOPT_INCLUDE) -I$(GSL_INCLUDE) -L$(GETOPT_LIB) -L$(GSL_LIB)
LIBFLAGS = -lgsl -lgslcblas -lgnugetopt -lm
FFLAGS = -O3 -m32

else
CFLAGS = -O3
LIBFLAGS = -lgsl -lgslcblas -lm
FFLAGS = -O3
endif
endif

# the core fewbody objects
FEWBODY_OBJS = ./fewbody-0.26/fewbody.o ./fewbody-0.26/fewbody_classify.o ./fewbody-0.26/fewbody_coll.o ./fewbody-0.26/fewbody_hier.o \
	./fewbody-0.26/fewbody_int.o ./fewbody-0.26/fewbody_io.o ./fewbody-0.26/fewbody_isolate.o ./fewbody-0.26/fewbody_ks.o \
	./fewbody-0.26/fewbody_nonks.o ./fewbody-0.26/fewbody_scat.o ./fewbody-0.26/fewbody_utils.o ./fewbody-0.26/fewbody_ui.o 

FEWBODY_DIR = fewbody-0.26

M_CC = gcc
M_CFLAGS = -O2 -lm
M_DEPS = sinbin.h interactor.h

# my core objects
M_OBJ = singl.o numericalFunctions.o myUtils.o SDSSModel.o galacticPotential.o binaryDynamics.o

all: interactor

%.o: %.c $(M_DEPS)
		$(M_CC) -x c -c -o $@ $< $(M_CFLAGS)

interactor: interactor.o  $(M_OBJ) ST_link_FB.o $(FEWBODY_OBJS)
	gcc -o $@ $^ $(M_CFLAGS) $(LIBFLAGS)

interactor.o: interactor.c interactor.h sinbin.h
	$(M_CC) -x c -c -o $@ $< $(M_CFLAGS)

ST_link_FB.o: ST_link_FB.c ST_link_FB.h ./fewbody-0.26/fewbody.h
	$(CC) $(CFLAGS) -c $< -o $@

.PHONY: clean TARGET 

clean: 
	rm -f $(M_OBJ) interactor.o ST_link_FB.o
