NAME=gotools_implicitization_0.9
LIBNAME=lib$(NAME)
OPTIMISED=true
DYNLINK=false
SYSINSTALL=false
SYS_INCLUDE_DIR = /usr/local/include # reasonable default 
SYS_LIB_DIR = /usr/local/lib         # reasonable default

#set variables

CAPPS		:=$(wildcard app/*.C)
CAPPOBJS	:=$(basename $(CAPPS))
CAPPLIBOBJS	:=$(addprefix lib/, $(addsuffix .o, $(notdir $(CAPPOBJS))))
CSRCS		:=$(wildcard src/*.[cC]) $(wildcard src/*.cpp)
COBJS           :=$(addprefix lib/, $(addsuffix .o, $(notdir \
			$(basename $(CSRCS)))))
CDEPFILES	:=$(addprefix dep/, $(addsuffix .d, $(notdir \
			$(basename $(CSRCS)) $(basename $(CAPPS)))))
CINCLUDES       +=-Iinclude -I../gotools_core/include -I../newmat
CC               = g++
CDEFS           =-DNDEBUG -DSGI
CFLAGS		=
CLIBS		= -lgotools_core_1.0 -lnewmat

LD		=$(CC)
LDOPTS		=-Llib -L../gotools_core/lib -L../newmat

# conditional modifications

ifeq "$(OPTIMISED)" "true"
CFLAGS          += -O2
endif
ifeq "$(DYNLINK)" "true"
CFLAGS          += -fPIC
LIBNAME         :=$(addsuffix .so, $(LIBNAME))
else 
LIBNAME         :=$(addsuffix .a, $(LIBNAME))
endif

# combining flags, options, etc.

COPTS		=$(CFLAGS) $(CINCLUDES) $(CDEFS)

# list of rules

.PHONY: 	varcheck depend Makefile install clean examples

examples:	$(CAPPOBJS)

app/example_%:	lib/example_%.o
		$(LD) $(LDOPTS) -o$@ $< -l$(NAME) $(CLIBS)

lib/example_%.o:	app/example_%.C
			$(CC) $(COPTS) -o$@ -c $<

#$(CAPPOBJS):	$(CAPPLIBOBJS)
#		$(LD) $(LDOPTS) -o$@ lib/$(@F).o -l$(NAME) $(CLIBS)

#$(CAPPLIBOBJS):	$(CAPPS)
#		$(CC) $(COPTS) -o$@ -c $<

$(CAPPS):	install

install: 	lib/$(LIBNAME)
ifeq "$(SYSINSTALL)" "true"
		cp lib/$(LIBNAME) $(SYS_LIB_DIR)
		-@mkdir $(SYS_INCLUDE_DIR)/Go
		cp include/* $(SYS_INCLUDE_DIR)/Go
		/sbin/ldconfig
		@echo Installation complete.
else
		#No system installation step.
endif

lib/$(LIBNAME):	$(COBJS)
ifeq "$(DYNLINK)" "true"
		$(CC) -olib/$(LIBNAME) -shared $^
else
		ar -rv lib/$(LIBNAME) $^ 
endif

lib/%.o: 	src/%.C
		@if [ ! -d lib ]; then mkdir -p lib; fi
		$(CC) $(COPTS) -o$@ -c src/$*.C

lib/%.o: 	src/%.c
		@if [ ! -d lib ]; then mkdir -p lib; fi
		$(CC) $(COPTS) -o$@ -c src/$*.c

lib/%.o: 	src/%.cpp
		@if [ ! -d lib ]; then mkdir -p lib; fi
		$(CC) $(COPTS) -o$@ -c src/$*.cpp

# rules for generating dependencies

depend: 	$(CDEPFILES)

Makefile: 	depend

dep/%.d: 	app/%.C
		@if [ ! -d dep ]; then mkdir -p dep; fi
		g++ -MM -MG $(CINCLUDES) $(CDEFS) -USGI -UMICROSOFT $< | \
		sed 's/$*\.o/lib\/& dep\/$(@F)/' > $@

dep/%.d: 	src/%.C
		@if [ ! -d dep ]; then mkdir -p dep; fi
		g++ -MM -MG $(CINCLUDES) $(CDEFS) -USGI -UMICROSOFT $< | \
		sed 's/$*\.o/lib\/& dep\/$(@F)/' > $@

dep/%.d: 	src/%.c
		@if [ ! -d dep ]; then mkdir -p dep; fi
		g++ -MM -MG $(CINCLUDES) $(CDEFS) -USGI -UMICROSOFT $< | \
		sed 's/$*\.o/lib\/& dep\/$(@F)/' > $@

dep/%.d: 	src/%.cpp
		@if [ ! -d dep ]; then mkdir -p dep; fi
		g++ -MM -MG $(CINCLUDES) $(CDEFS) -USGI -UMICROSOFT $< | \
		sed 's/$*\.o/lib\/& dep\/$(@F)/' > $@

# including dependencies

ifneq "$(foreach file, $(CDEPFILES), $(wildcard $(file)))" ""
  include $(foreach file, $(CDEPFILES), $(wildcard $(file)))
endif

varcheck:
	@echo CAPPS = $(CAPPS)
	@echo CAPPOBJS = $(CAPPOBJS)
	@echo CAPPLIBOBJS = $(CAPPLIBOBJS)
	@echo CSRCS = $(CSRCS)
	@echo COBJS = $(COBJS)
	@echo CDEPFILES = $(CDEPFILES)

clean:
	rm -rf lib
	rm -rf dep
	rm -f $(CAPPOBJS)
