# Makefile for the header files of the library
#---------------------------------------------------------------------------
#
# COMMON DEFINITIONS
#
include ../Common
#
# FILES TO BE TESTED
#
objects := $(patsubst %.w,%.o,$(wildcard *.w))
dirheaders := $(objects:.o=.h)
objects := $(objects) $(patsubst %.w,%.o,$(wildcard barrier/*.w))
objects := $(objects) $(patsubst %.w,%.o,$(wildcard function/*.w))
objects := $(objects) $(patsubst %.w,%.o,$(wildcard functional/*.w))
objects := $(objects) $(patsubst %.w,%.o,$(wildcard linesearch/*.w))
objects := $(objects) $(patsubst %.w,%.o,$(wildcard searchdir/*.w))
objects := $(objects) $(patsubst %.w,%.o,$(wildcard searchdir/equality/*.w))
sources := $(objects:.o=.cc)
headers := $(objects:.o=.h)
#
# COMPILATION RULES
#
all: lib

lib: libmath.a

.PHONY: all lib clean

libmath.a: $(objects)
	@echo "Making libmath.a..."
	@$(RM) libmath.a
	@$(AR) cru libmath.a $(objects)
	@$(RANLIB) libmath.a

$(objects): %.o: %.cc

$(headers): %.h: %.w
	@echo "CTANGLE $<..."
	@$(CTANGLE) $< - $*.cc

$(sources): %.cc: %.w
	@echo "CTANGLE $<..."
	$(CTANGLE) $< - $@

private/fortran.h: ../Common private/fortran.h.in
ifeq (LAPACK,$(findstring LAPACK,$(CPPFLAGS)))
	sed s%@LAPACKDEF@%#define%g < private/fortran.h.in > private/fortran.h.aux
else
	sed s%@LAPACKDEF@%#undef%g < private/fortran.h.in > private/fortran.h.aux
endif
ifeq (UNDERSCORE,$(findstring UNDERSCORE,$(CPPFLAGS)))
	sed s%@UNDERSCOREDEF@%#define%g < private/fortran.h.aux > private/fortran.h
else
	sed s%@UNDERSCOREDEF@%#undef%g < private/fortran.h.aux > private/fortran.h
endif
	$(RM) private/fortran.h.aux

clean:
	@echo "Cleaning src directory..."
	@$(RM) *.a *~ */*~ $(headers) *.ch $(sources) $(objects)
	@$(RM) *.log *.idx *.scn *.toc *.tex *.dvi *.ps
	@$(MAKE) -s -C function clean
	@$(MAKE) -s -C barrier clean 
	@$(MAKE) -s -C searchdir clean

install: lib
	@echo "Installing libmath.a in $(libdir)..."
	@install libmath.a $(libdir)
	@echo "Installing headers in $(includedir)/math..."
	@install -d $(includedir)/math
	@$(foreach x,$(dirheaders),\
	sed -e /^$$/d -e /^#line/d -e /^\\//d < $(x) > $(includedir)/math/$(x);)
	@$(MAKE) -s -C private install
	@$(MAKE) -s -C functional install
	@$(MAKE) -s -C function install
	@$(MAKE) -s -C linesearch install
	@$(MAKE) -s -C searchdir install
	@$(MAKE) -s -C barrier install

uninstall:
	@$(MAKE) -s -C barrier uninstall
	@$(MAKE) -s -C searchdir uninstall
	@$(MAKE) -s -C linesearch uninstall
	@$(MAKE) -s -C function uninstall
	@$(MAKE) -s -C functional uninstall
	@$(MAKE) -s -C private uninstall
	@echo "Uninstalling $(includedir)/math...";
	@$(RM) -rf $(includedir)/math/*.h
	@echo "Uninstalling $(libdir)/libmath.a...";
	@$(RM) $(libdir)/libmath.a

%:
	$(MAKE) -C .. $@

functionalbase.cc: symmetric.h sparse.h
linesearchbase.cc: functionalbase.cc
functional/quadratic.cc: functionalbase.h
functional/gaxpy.cc: functionalbase.h
linesearch/bisection.cc: linesearchbase.h
searchdir/gradient.cc: searchdirbase.h
searchdir/newton.cc: searchdirbase.h
#
# Dependencies
#
algebra.cc:   math.h
cholesky.cc:  math.h symmetric.h
det.cc:       math.h lu.h
eye.cc:       math.h
fstream.cc:   math.h
lu.cc:        math.h
math.cc:      private/fortran.h
ones.cc:      math.h
qr.cc:        math.h algebra.h
sparse.cc:    
symmetric.cc: math.h

functionbase.cc:   math.h symmetric.h sparse.h
function/gaxpy.cc: math.h algebra.h functionbase.h

searchdirbase.cc:      math.h functionalbase.h
searchdir/equality.cc: math.h searchdirbase.h lu.h
searchdir/newton.cc  : math.h searchdirbase.h algebra.h lu.h cholesky.h
