include ./Makefile.def
include ./Makefile.object

.SILENT:

DIRS: $(OBJDIR) $(BINDIR) $(LIBDIR)

$(OBJDIR): 
	@mkdir -p $(OBJDIR);
	@mkdir -p $(PDFGUICLASSDIR);

$(BINDIR): 
	@mkdir -p $(BINDIR);

$(LIBDIR): 
	@mkdir -p $(LIBDIR);

$(MATLABOBJDIR):
	@mkdir -p $(MATLABOBJDIR);

$(MATHOBJDIR):
	@mkdir -p $(MATHOBJDIR);

standard: DIRS C Fortran agent server tools tester
all: standard matlab pdfgui

###########
## AGENT ##
###########

agent: DIRS $(BINDIR)/agent $(INFOSERVER)

$(BINDIR)/agent: $(AGENTOBJ) $(NWSUTILOBJ)
	@echo Building program $@
	$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $(AGENTOBJ) $(NWSUTILOBJ) $(NWSLIBS) $(LIBS) \
       $(AUTH_LIBS) $(IBPLIB)

infoserver: $(BINDIR)/infoserver

$(BINDIR)/infoserver: $(INFOSERVEROBJ)
	@echo Building program $@ of $(INFOSERVEROBJ)
	$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $(INFOSERVEROBJ) $(LIBS)

############
## SERVER ##
############

server: DIRS $(BINDIR)/code_generator services $(BINDIR)/server

$(BINDIR)/code_generator: $(CODEGENERATOROBJ)
	@echo Building program $@
	$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $(CODEGENERATOROBJ) $(LIBS) $(IBPLIB)

services: $(NETSOLVE_ROOT)/src/Makefile.numerical
	@$(MAKE) -f ./Makefile.numerical

$(NETSOLVE_ROOT)/src/Makefile.numerical: $(NETSOLVE_ROOT)/server_config \
               $(BINDIR)/code_generator $(NETSOLVE_ROOT)/problems
	$(BINDIR)/code_generator

$(BINDIR)/server: $(NETSOLVE_ROOT)/src/Server/problem_init.c \
                $(SERVEROBJ) $(NWSUTILOBJ)
	@echo Building program $@
	$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $(SERVEROBJ) $(NWSUTILOBJ) $(NWSLIBS) \
          $(LIBS) $(AUTH_LIBS) $(IBPLIB)

######################
## CLIENT LIBRARIES ##
######################

#=============#
# C Libraries #
#=============#
C: DIRS $(LIBDIR)/libnetsolve.a $(BINDIR)/netsolveproxy

$(LIBDIR)/libnetsolve.a:$(CCLIENTOBJ) $(IBPOBJS_STUB)
	@echo Building library $@
	$(AR) $(ARFLAGS) $@ $(CCLIENTOBJ) $(IBPOBJS)
	$(RANLIB) $@

#===================#
# Fortran Libraries #
#===================#
#Fortran: $(LIBDIR)/libfnetsolve.a $(BINDIR)/netsolveproxy $(BINDIR)/globusproxy
Fortran: DIRS $(LIBDIR)/libfnetsolve.a $(BINDIR)/netsolveproxy

$(LIBDIR)/libfnetsolve.a:$(FORTRANCLIENTOBJ) $(IBPOBJS_STUB)
	@echo Building library $@
	$(AR) $(ARFLAGS) $@ $(FORTRANCLIENTOBJ) $(IBPOBJS)
	$(RANLIB) $@

IBPOBJS_STUB:
	@echo Extracting IBP object files
	$(AR) x $(IBPLIB) $(IBPOBJS)

#===================#
# Matlab Libraries #
#===================#
#matlab:	 $(BINDIR)/netsolveproxy $(BINDIR)/globusproxy
#matlab:	 $(BINDIR)/netsolveproxy
#cd Matlab; $(MAKE) matlab

matlab: DIRS $(BINDIR)/netsolveproxy $(MATLABOBJDIR) \
        $(BINDIR)/netsolve$(MEXEXT) \
        $(BINDIR)/netsolve_err$(MEXEXT) \
        $(BINDIR)/netsolve_errmsg$(MEXEXT) \
        $(BINDIR)/netsolve_nb$(MEXEXT)

$(BINDIR)/netsolve_errmsg$(MEXEXT): $(MATLABERRMSGOBJ)
	@echo Building Matlab external function $@ ; \
    cd $(MATLABOBJDIR); \
    $(MEX) $(NS_MEXFLAGS) $(NETSOLVE_ROOT)/src/Matlab/dummy.c \
      -output $(BINDIR)/netsolve_errmsg $(MATLABERRMSGOBJ)

$(BINDIR)/netsolve_err$(MEXEXT): $(MATLABERROBJ)
	@echo Building Matlab external function $@ ; \
    cd $(MATLABOBJDIR); \
    $(MEX) $(NS_MEXFLAGS) $(NETSOLVE_ROOT)/src/Matlab/dummy.c \
      -output $(BINDIR)/netsolve_err $(MATLABERROBJ)

$(BINDIR)/netsolve$(MEXEXT): $(MATLABOBJ) $(MATLABINITOBJ) $(AUTH_LIBS)
	@echo Building Matlab external function $@ ; \
    cd $(MATLABOBJDIR); \
    $(MEX) $(NS_MEXFLAGS) $(NETSOLVE_ROOT)/src/Matlab/dummy.c \
      -output $(BINDIR)/netsolve $(MATLABOBJ) $(MATLABINITOBJ)

$(BINDIR)/netsolve_nb$(MEXEXT): $(MATLABNBOBJ) $(MATLABINITOBJ) $(AUTH_LIBS)
	@echo Building Matlab external function $@ ; \
    cd $(MATLABOBJDIR); \
    $(MEX) $(NS_MEXFLAGS) $(NETSOLVE_ROOT)/src/Matlab/dummy.c \
      -output $(BINDIR)/netsolve_nb $(MATLABNBOBJ) $(MATLABINITOBJ)

#=======================#
# Mathematica Libraries #
#=======================#
#mathematica: $(BINDIR)/netsolveproxy $(BINDIR)/globusproxy
#mathematica: $(BINDIR)/netsolveproxy
#cd Mathematica; $(MAKE) mathematica

mathematica: DIRS  $(BINDIR)/netsolveproxy $(BINDIR) $(MATHOBJDIR) $(NSMATH_BINDIR)/NS_math

$(NSMATH_BINDIR)/NS_math:       $(NSMATH_OBJS) $(MATHCLIENTOBJS)
	@echo "*** Linking " $@ "..."
	$(CC) $(NSMATH_OBJS) $(MATHCLIENTOBJS) $(NSMATH_LIBPATH) $(NSMATH_LIBS) -lnsl -o $@

#=========#
# Proxies #
#=========#
$(BINDIR)/netsolveproxy: $(PROXYOBJ) $(NSPROXYOBJ)
	@echo Building program $@
	$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $(PROXYOBJ) $(NSPROXYOBJ) $(LIBS) \
                $(AUTH_LIBS) $(IBPLIB)

$(BINDIR)/globusproxy: $(PROXYOBJ) $(GLOBUSPROXYOBJ)
	@echo Building program $@
	$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $(PROXYOBJ) $(GLOBUSPROXYOBJ) $(LDAP_LIBS) \
           $(LDAP_LDFLAGS) $(G_LDFLAGS) $(G_LIBS) $(LIBS) $(IBPLIB)

###################
## TEST PROGRAMS ##
###################
tester:	DIRS C Fortran $(BINDIR)/C_test \
        $(BINDIR)/F_test $(BINDIR)/farm_test $(BINDIR)/sequence_test \
        $(BINDIR)/ibp_test
	cp $(NETSOLVE_ROOT)/src/Testing/Test $(BINDIR)

$(BINDIR)/C_test: $(CTESTOBJ) $(LIBDIR)/libnetsolve.a
	@echo Building program $@
	$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $(CTESTOBJ) $(LIBDIR)/libnetsolve.a $(LIBS) \
                $(AUTH_LIBS)
	cp $(NETSOLVE_ROOT)/src/Testing/upf.f $(BINDIR)
	cp $(NETSOLVE_ROOT)/src/Testing/toto.f $(BINDIR)

$(BINDIR)/F_test: $(FTESTOBJ) $(LIBDIR)/libfnetsolve.a
	@echo Building program $@
	$(FC) $(LDFLAGS) $(FFLAGS) -o $@ $(FTESTOBJ) $(LIBDIR)/libfnetsolve.a $(LIBS) \
                $(AUTH_LIBS)
	cp $(NETSOLVE_ROOT)/src/Testing/upf.f $(BINDIR)
	cp $(NETSOLVE_ROOT)/src/Testing/toto.f $(BINDIR)

$(BINDIR)/farm_test: $(FARMTESTOBJ) $(LIBDIR)/libnetsolve.a
	@echo Building program $@
	$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $(FARMTESTOBJ) $(LIBDIR)/libnetsolve.a $(LIBS) \
                $(AUTH_LIBS)

$(BINDIR)/sequence_test: $(SEQUENCETESTOBJ) $(LIBDIR)/libnetsolve.a
	@echo Building program $@
	$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $(SEQUENCETESTOBJ) $(LIBDIR)/libnetsolve.a \
                $(LIBS) $(AUTH_LIBS)

$(BINDIR)/ibp_test: $(NETSOLVE_ROOT)/src/Testing/ibp_test.c
	@echo Building program $@
	$(CC) $(LDFLAGS) $(NS_CFLAGS) -o $@  $(NETSOLVE_ROOT)/src/Testing/ibp_test.c \
                $(LIBS) $(LIBDIR)/libnetsolve.a $(AUTH_LIBS)

#===================#
# Regression Testing #
#===================#
TESTS = dgemm dgemmseq

regress: C $(TESTS)
	@for i in $(TESTS); do $(BINDIR)/test_$$i; done
	@echo "-------------------------------------------"
	@echo " TEST TIMINGS (secs):"
	@for i in $(TESTS); do \
        echo "( $$i ):"; \
        cat test_$$i.time; \
        done
	@echo "-------------------------------------------"
	@echo " TEST RESULTS:"
	@for i in $(TESTS); do \
        if ! grep -q FAIL test_$$i.result; \
          then echo "test_$$i: ALL OK"; \
        else echo "test_$$i: TEST HAD FAILURE(s)";\
          cat test_$$i.result; \
        fi; \
        done
	@echo "-------------------------------------------"

dgemm: $(BINDIR)/test_dgemm
dgemmseq: $(BINDIR)/test_dgemmseq

$(BINDIR)/test_dgemm: $(OBJDIR)/test_dgemm.o $(RTESTLIBS) 
	@echo Building program $@ ...
	$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $(OBJDIR)/test_dgemm.o $(NS_CFLAGS) \
             $(RTESTLIBS) $(LIBDIR)/libnetsolve.a $(LIBS) \
                $(AUTH_LIBS)

   
$(BINDIR)/test_dgemmseq: $(OBJDIR)/test_dgemmseq.o $(RTESTLIBS)
	@echo Building program $@ ...
	$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $(NS_CFLAGS) $(OBJDIR)/test_dgemmseq.o \
             $(RTESTLIBS) $(LIBDIR)/libnetsolve.a $(LIBS) \
                $(AUTH_LIBS)

####################
## NetSolve TOOLS ##
####################
tools: DIRS $(BINDIR)/netsolveproxy $(BINDIR)/NS_config $(BINDIR)/NS_killagent \
      $(BINDIR)/NS_killserver $(BINDIR)/NS_problems \
      $(BINDIR)/NS_probdesc $(BINDIR)/NS_killall

$(BINDIR)/NS_killall:
	@echo Building Shell Script $@
	@-/bin/rm -f $@
	@echo $(BINDIR)/NS_config \$$1 \| > $@
	@echo grep SERVER \| awk \'{print \$$2}\' \| >> $@
	@echo sed -e "\"s%^%$(BINDIR)/NS_killserver \$$1 %\"" \| sh >> $@
	@echo >> $@
	@echo $(BINDIR)/NS_config \$$1 \|  >> $@
	@echo grep AGENT \| awk \'{print \$$2}\' \| >> $@
	@echo sed -e "\"s%^%$(BINDIR)/NS_killagent %\"" \| sh >> $@
	chmod 755 $@

$(BINDIR)/NS_config: $(NSCONFOBJ)
	@echo Building program $@
	$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $(NSCONFOBJ) $(LIBS) \
                $(AUTH_LIBS) $(IBPLIB)

$(BINDIR)/NS_killagent: $(NSKILLAGENTOBJ)
	@echo Building program $@
	$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $(NSKILLAGENTOBJ) $(LIBS) \
                $(AUTH_LIBS) $(IBPLIB)

$(BINDIR)/NS_killserver: $(NSKILLSERVEROBJ)
	@echo Building program $@
	$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $(NSKILLSERVEROBJ) $(LIBS) \
                $(AUTH_LIBS) $(IBPLIB)

$(BINDIR)/NS_problems: $(NSPROBLEMSOBJ)
	@echo Building program $@
	$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $(NSPROBLEMSOBJ) $(LIBS) \
                $(AUTH_LIBS) $(IBPLIB)

$(BINDIR)/NS_probdesc: $(NSPROBLEMDESCOBJ)
	@echo Building program $@
	$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $(NSPROBLEMDESCOBJ) $(LIBS) \
                $(AUTH_LIBS) $(IBPLIB)

############
## PDFGUI ##
############
pdfgui: DIRS $(BINDIR)/NS_pdfgui

$(BINDIR)/NS_pdfgui: $(PDGUIOBJ)
	@echo Building $@
	@/bin/rm -f $@
	@echo "#! /bin/sh" > $@
	@echo "java -classpath $(PDFGUICLASSDIR):$(NETSOLVE_ROOT)/src/PDF_GUI/classes XMLPDGUI" >> $@
	@chmod 755 $@

###################
## MISCELLANEOUS ##
###################

#==============#
# MCell Driver #
#==============#
mcell: DIRS $(BINDIR)/mcelldriver

$(BINDIR)/mcelldriver: $(MCELLDRIVEROBJ) C
	@echo Building program $@
	$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $(MCELLDRIVEROBJ) $(LIBDIR)/libnetsolve.a \
                $(LIBS) $(AUTH_LIBS)

#===============#
# Window Client #
#===============#
win32:
	@$(MAKE) -f Makefile.win32

#========================#
# Sparse Solver Wrappers #
#========================#
wrappers: wrappers-clean
	( cd $(NETSOLVE_ROOT)/src/SampleNumericalSoftware/ITPACK; $(MAKE) )
	( cd $(NETSOLVE_ROOT)/src/SampleNumericalSoftware/MA28; $(MAKE) )
	( cd $(NETSOLVE_ROOT)/src/SampleNumericalSoftware/SparseSolvers/sparse; $(MAKE) "NETSOLVE_ROOT=${NETSOLVE_ROOT}" libfiles )
#( cd $(NETSOLVE_ROOT)/src/SampleNumericalSoftware/SparseSolvers/eigen; $(MAKE) "NETSOLVE_ROOT=${NETSOLVE_ROOT}" libfiles )

####################################
## CLEANUP and DISTRIBUTION STUFF ##
####################################
clean: 
	- $(MAKE) wrappers-clean
	- rm -rf $(OBJDIR) $(LIBDIR) $(BINDIR) .depend \
          Makefile.numerical Makefile.num_libs \
          $(NETSOLVE_ROOT)/src/Server/numerical-*.c \
          $(NETSOLVE_ROOT)/src/Server/problem_init.c
	- rm -f $(IBPOBJS)

configclean:
	-rm -rf $(NETSOLVE_ROOT)/config.* \
            $(NETSOLVE_ROOT)/confdefs.h \
            $(NETSOLVE_ROOT)/Makefile \
            $(NETSOLVE_ROOT)/conf/*.inc

CLEAN: wrappers-clean
	 -rm -rf ../obj ../bin ../lib .depend \
          Makefile.numerical Makefile.num_libs \
          $(NETSOLVE_ROOT)/src/Server/numerical-*.c \
          $(NETSOLVE_ROOT)/src/Server/problem_init.c; \
          cd $(NETSOLVE_ROOT)/src/Testing; $(MAKE) clean
	/bin/rm -f $(IBPOBJS)

wrappers-clean:
	( cd $(NETSOLVE_ROOT)/src/SampleNumericalSoftware/SparseSolvers; $(MAKE) "NETSOLVE_ROOT=${NETSOLVE_ROOT}" clean )
	( cd $(NETSOLVE_ROOT)/src/SampleNumericalSoftware/SparseSolvers/sparse/lib; $(MAKE) "NETSOLVE_ROOT=${NETSOLVE_ROOT}" deletelibs )
	( cd $(NETSOLVE_ROOT)/src/SampleNumericalSoftware/SparseSolvers/eigen/lib; $(MAKE) "NETSOLVE_ROOT=${NETSOLVE_ROOT}" deletelibs )

dist:
	-@tmpdir=/tmp &&\
	 packname=NetSolve-$(NETSOLVE_VERSION) &&\
	 echo "Doing a cvs export to $$tmpdir/$$packname ..." &&\
     cd $$tmpdir && \
     cvs export -r netsolve-1-4 -d $$packname NetSolve && \
     echo Cleaning up non-distributable stuff ... &&\
	 /bin/rm -rf $$tmpdir/$$packname/src/cgi-src &&\
	 echo "Preparing a compressed tar file ($$packname.tgz) ..." &&\
	 tar cf - $$packname | gzip -9c > $(HOME)/$$packname.tgz &&\
	 echo "$(HOME)/$$packname.tgz has been successfully created:" &&\
     cd $(HOME) ; ls -l $$packname.tgz && \
	 echo Cleaning tmp directory ... &&\
	 /bin/rm -rf $$tmpdir/$$packname
