#  Main body of the installation makefile for the SIFDECODE decode package

#  N. Gould, D. Orban and Ph. L. Toint.
#  This version: 05 XIII 2012

SHELL = /bin/$(BINSHELL)

#  compiler flags

FFLAGS    = $(BASIC) $(OPTIMIZATION) $(DEBUG) $(MODULES) $(F90) $(USUAL)
FFLAGSS   = $(BASIC) $(OPTIMIZATION) $(DEBUG) $(MODULES) $(F90) $(SPECIAL)
FFLAGSN   = $(BASIC) $(NOOPTIMIZATION) $(DEBUG) $(MODULES) $(F90)
FFLAGS77  = $(BASIC) $(OPTIMIZATION) $(DEBUG) $(MODULES) $(F77) $(USUAL)
FFLAGS77S = $(BASIC) $(OPTIMIZATION) $(DEBUG) $(MODULES) $(F77) $(SPECIAL)
RUNFFLAGS =          $(OPTIMIZATION) $(DEBUG) $(MODULES)

#  names of random libraries

LS  = $(OBJ)/libsifdecode.a
LSS = $(OBJS)/libsifdecode.a
LSD = $(OBJD)/libsifdecode.a

#  Libraries used

LIBS = -lsifdecode
PLIBS = $(LIBS)

#  Archive manipulation strings

ARR = $(AR) $(ARREPFLAGS) $(LS)
RMARFILE = $(SIFDECODE)/bin/rmarfile $(AR) $(GREP) $(LS)
RMOBFILE = $(SIFDECODE)/bin/rmobfile $(RM) $(OBJ)

#  sed scripts

#  compilation agenda

SIFDECODES = $(LSS)(sifdecode.o) $(OBJS)/sifdecode_main.o
SIFDECODED = $(LSD)(sifdecode.o) $(OBJD)/sifdecode_main.o

SUCC = precision version) compiled successfully

#  main compilations and runs

all: sifdecode

#  basic packages

sifdecode_silent: sifdecode_silent_$(PRECIS)
sifdecode_silent_single: $(SIFDECODES)
sifdecode_silent_double: $(SIFDECODED)

sifdecode: sifdecode_$(PRECIS)
	@printf ' %-21s\n' "sifdecode: tools packages ($(PRECIS) $(SUCC)"
sifdecode_single: $(SIFDECODES)
	$(RANLIB) $(LSS)
sifdecode_double: $(SIFDECODED)
	$(RANLIB) $(LSD)

# run spec-sheet example tests

test_unconstrained: test_unconstrained_$(PRECIS)

test_unconstrained_double: $(SIFDECODED) $(OBJD)/sifdecode_main.o
	echo ""
	echo " Decode unconstrained SIF file"
	cd $(SIFDECODE)/sif/ ; sifdecode ALLINITU
	echo ""
	echo " Tests for unconstrained sifdecode complete"

test_constrained_double: $(SIFDECODED) $(OBJD)/sifdecode_main.o
	echo ""
	echo " Decode unconstrained SIF file"
	cd $(SIFDECODE)/sif/ ; sifdecode ALLINITC
	echo ""
	echo " Tests for constrained sifdecode complete"

#  individual compilations

sifdecode.o: $(LS)(sifdecode.o)

$(LS)(sifdecode.o): ../decode/sifdecode.f90
	@printf ' %-9s %-15s\t\t' "Compiling" "sifdecode"
	$(SED) -f $(SEDS) ../decode/sifdecode.f90 > $(OBJ)/sifdecode.f90
	cd $(OBJ); $(FORTRAN) -o sifdecode.o $(FFLAGS) sifdecode.f90 \
                || ( printf ' %-26s' "=> Disabling optimization " ; \
                   $(FORTRAN) -o sifdecode.o $(FFLAGSN) sifdecode.f90 )
	cd $(OBJ); $(ARR) sifdecode.o; $(RM) sifdecode.f90 sifdecode.o
	$(RMOBFILE) sifdecode_main.o
	$(MVMODS)
	@printf '[ OK ]\n'

#  main programs

sifdecode_main.o: $(OBJ)/sifdecode_main.o

$(OBJ)/sifdecode_main.o: ../decode/sifdecode_main.f90
	@printf ' %-9s %-15s\t\t' "Compiling" "sifdecode_main"
	$(SED) -f $(SEDS) ../decode/sifdecode_main.f90 > \
                $(OBJ)/sifdecode_main.f90
	cd $(OBJ); $(FORTRAN) -o sifdecode_main.o $(FFLAGS) sifdecode_main.f90 \
          || ( printf ' %-26s' "=> Disabling optimization " ; \
            $(FORTRAN) -o sifdecode_main.o $(FFLAGSN) sifdecode_main.f90 )
	cd $(OBJ); $(FORTRAN) -o run_sifdecode $(RUNFFLAGS) \
          sifdecode_main.o -L$(OBJ) $(PLIBS) ; $(RM) sifdecode_main.f90
	cd $(OBJ); $(RM) sifdecode_main.f90 sifdecode_main.o
	@printf '[ OK ]\n'

#  book keeping

clean:
	@printf ' %-9s\t\t' "Cleaning"
	$(RM) $(OBJ)/*
	@printf '[ OK ]\n'

cleanall:
	@printf ' %-14s\t\t' \
          "Removing all $(PRECIS) precision object and module files"
	$(RM) $(OBJ)/* $(MOD)/*
	@printf '[ OK ]\n'
