#  Main body of the installation makefile for the GALAHAD SLS package

#  Nick Gould, for GALAHAD productions
#  This version: 2023-05-11

#  include standard GALAHAD makefile defaults before package-specifics

include $(GALAHAD)/src/makedefs/defaults

#  ===========================================================================
#  ====================  package-dependent parts  ============================
#  ===========================================================================

#  package name

package = sls
PACKAGE = SLS

#  auxiliary packages that current package depends on (prepend with make_)

DEPENDENCIES = make_sls_deps

#  other packages that depend on package

DEPENDS = ir psls sbls cro fdc rqs trs eks

#  auxiliary packages that the C interface to the current package depends
#  on (prepend with make_ciface_)

CDEPENDENCIES = make_ciface_sls_deps

#  other C interface packages that depend on current interface package

CDEPENDS = ir_ciface sbls_ciface trs_ciface rqs_ciface

#  auxiliary packages that the python interface to the current package depends
#  on (prepend with make_pyiface_)

PYDEPENDENCIES = make_pyiface_sls_deps

#  other python interface packages that depend on current interface package

PYDEPENDS = ir_pyiface sbls_pyiface trs_pyiface rqs_pyiface

#  auxiliary packages that are needed for tests (prepend with make_)

TESTDEPS = make_lmt make_qpt

#  tests to be performed (preprend with test_)

TESTS = test_full test_cutest

#  CUTEst example for tests

CUTEST_EXAMPLE = QPBAND.SIF

#  Rutherford-Boeing example for tests

RB_EXAMPLE = bcsstk01

#  ===========================================================================
#  =================  end of package-dependent parts  ========================
#  ===========================================================================

#  include standard GALAHAD makefile definitions

include $(GALAHAD)/src/makedefs/definitions

#  include compilation and run instructions

include $(GALAHAD)/src/makedefs/instructions

#  non-standard package compilation instructions

$(package).o: $(LG)($(package)_$(PRECIS).o)

$(LG)($(package)_$(PRECIS).o): ../$(package)/$(package).F90
	@printf ' %-9s %-15s\t\t' "Compiling" "$(package)   "
	$(CP) ../$(package)/$(package).F90 $(OBJ)/$(package).F90
	cd $(OBJ); $(FORTRAN) -o $(package)_$(PRECIS).o \
                     $(FFLAGSOMP) $(package).F90 \
                || ( printf ' %-26s' "=> Disabling optimization " ; \
                   $(FORTRAN) -o $(package)_$(PRECIS).o \
                     $(FFLAGSOMPN) $(package).F90 )
	cd $(OBJ); $(ARR) $(package)_$(PRECIS).o ; \
           $(RM) $(package).F90 $(package)_$(PRECIS).o
	$(RMARFILES) $(DEPENDS)
	$(CURMARFILE) use$(package)_$(PRECIS).o
	$(RMOBFILE) in$(package)_$(PRECIS).o
	$(RMOBFILE) $(package)s.o
	$(RMOBFILE) $(package)t_$(PRECIS).o
	$(RMOBFILE) $(package)ti_$(PRECIS).o
	$(CRMARFILE) $(package)_ciface_$(PRECIS).o
	$(MVMODS)
	@printf '[ OK ]\n'

#  package C interface compilation

$(package)_ciface.o: $(LG)($(package)_$(PRECIS).o) \
                     $(CLG)($(package)_ciface_$(PRECIS).o)

$(CLG)($(package)_ciface_$(PRECIS).o): ../$(package)/C/$(package)_ciface.F90
	@printf ' %-9s %-15s\t\t' "Compiling" "$(package)_ciface"
	$(CP) ../$(package)/C/$(package)_ciface.F90 $(OBJ)/$(package)_ciface.F90
	cd $(OBJ); $(FORTRAN) -o $(package)_ciface_$(PRECIS).o \
                     $(FFLAGSS) $(package)_ciface.F90 \
            || ( printf ' %-26s' "=> Disabling optimization " ; \
           $(FORTRAN) -o $(package)_ciface_$(PRECIS).o \
             $(FFLAGSN) $(package)_ciface.F90 )
	cd $(OBJ); $(CARR) $(package)_ciface_$(PRECIS).o
	cd $(OBJ); $(RM) $(package)_ciface.F90 $(package)_ciface_$(PRECIS).o
	$(RMOBFILE) $(package)ct_$(PRECIS).o
	$(RMOBFILE) $(package)ctf_$(PRECIS).o
	$(PYRMARFILE) $(package)_pyiface.o
	$(MVMODS)
	@printf '[ OK ]\n'

#  package python interface compilation

$(package)_pyiface.o: $(LG)($(package)_$(PRECIS).o) \
                        $(CLG)($(package)_ciface_$(PRECIS).o) \
                        $(PYLG)($(package)_pyiface.o)

$(PYLG)($(package)_pyiface.o): ../$(package)/Python/$(package)_pyiface.c
	@printf ' %-9s %-15s\t\t' "Compiling" "$(package)_pyiface"
	$(SED) -f $(CISEDS) ../$(package)/Python/$(package)_pyiface.c \
           > $(OBJ)/$(package)_pyiface.c
	cd $(OBJ); $(CC) -o $(package)_pyiface.o $(CFLAGS) \
           $(package)_pyiface.c $(PYINCLUDES) \
            || ( printf ' %-26s' "=> Disabling optimization " ; \
           $(CC) -o $(package)_pyiface.o $(CFLAGSN) $(package)_pyiface.c \
            $(PYINCLUDES) )
	cd $(OBJ); $(PYARR) $(package)_pyiface.o
	cd $(OBJ); $(RM) $(package)_pyiface.c
	$(PYRMARFILES) $(PYDEPENDS)
	cd $(OBJ); CC=$(CC) FORTRAN=$(FORTRAN) OPTIMIZATION=$(OPTIMIZATION) \
                   SHARED=$(SHARED) DLEXT=$(DLEXT) LOADALL=$(LOADALL) \
                   LOADNONE=$(LOADNONE) \
                   $(BINSHELL) $(GALAHAD)/bin/create_shared
#	export ARCH=$(VERSION) ; pip install $(GALAHAD)/bin/
	$(MKDIR) -p  $(PYSITEPACKDIR)/galahad
	cd $(OBJ) ; $(CC) $(SHARED) $(OPTIMIZATION) -pthread \
          -Wl,-O1  -Wl,-Bsymbolic-functions $(OBJ)/$(package)_pyiface.o \
          -L$(OBJ)/shared -lgalahad_py -lgalahad_c -lhsl_c \
          -lgalahad -lgalahad_cutest_dummy $(HSL) $(MKL_PARDISO) \
          $(PARDISO) $(WSMP) $(PASTIX) $(MUMPS) $(MPI) $(UMFPACK) \
          $(METIS4ND) $(METIS5ND) $(LAPACK) $(BLAS) -lgfortran \
          -o $(PYSITEPACKDIR)/galahad/$(package).$(SOABI).$(DLEXT) \
          -Wl,-rpath=$(OBJ)/shared $(MOMP)
	cd $(OBJ); $(RM) $(package)_pyiface.o
	@printf '[ OK ]\n'

#  package coverage compilation

$(package)_gcov: ../$(package)/$(package).F90
	@printf ' %-9s %-15s\t\t' "Compiling" "$(package)   "
	$(CP) ../$(package)/$(package).F90 $(package)_cov.F90
	$(FORTRAN) -o $(package)_cov.o $(FFLAGSS) $(COVERAGE) \
            $(package)_cov.F90 \
          || ( printf ' %-26s' "=> Disabling optimization " ; \
            $(FORTRAN) -o $(package)_cov.o $(FFLAGSN) $(COVERAGE) \
              $(package)_cov.F90 )
	$(CP) $(package)t.F90 $(package)t_cov.F90
	$(FORTRAN) -g $(BASIC) $(NOOPTIMIZATION) $(MODULES) $(COVERAGE) \
          $(package)t_cov.F90
	$(FORTRAN) $(NOOPTIMIZATION) $(MODULES) $(COVERAGE) \
          -o ./$(package)_cov $(package)_cov.o $(package)t_cov.o \
           -L$(OBJ) $(LIBS)
	./$(package)_gcov
	gcov ./$(package)_gcov
	$(MV) ./$(package)_cov.F90.cov ./$(package)_coverage
	$(RM) ./$(package)*cov* ./galahad_$(package)_*.mod

#  test programs for specification document

$(package)s.o: $(OBJ)/$(package)s_$(PRECIS).o

$(OBJ)/$(package)s_$(PRECIS).o: ../$(package)/$(package)s.f90
	@printf ' %-9s %-15s\t\t' "Compiling" "$(package)s  "
	$(SED) -f $(SEDS) \
           ../$(package)/$(package)s.f90 > $(OBJ)/$(package)s.f90
	cd $(OBJ) ; $(FORTRAN) -o $(package)s_$(PRECIS).o \
                      $(FFLAGS) $(package)s.f90
	rm $(OBJ)/*.f90
	@printf '[ OK ]\n'

$(package)s2.o: $(OBJ)/$(package)s2_$(PRECIS).o

$(OBJ)/$(package)s2_$(PRECIS).o: ../$(package)/$(package)s2.f90
	@printf ' %-9s %-15s\t\t' "Compiling" "$(package)s  "
	$(SED) -f $(SEDS) \
           ../$(package)/$(package)s2.f90 > $(OBJ)/$(package)s2.f90
	cd $(OBJ) ; $(FORTRAN) -o $(package)s2_$(PRECIS).o \
                      $(FFLAGS) $(package)s2.f90
	rm $(OBJ)/*.f90
	@printf '[ OK ]\n'

#  test programs for C specification document

$(package)cs.o: $(OBJ)/$(package)cs_$(PRECIS).o

$(OBJ)/$(package)cs_$(PRECIS).o: ../$(package)/C/$(package)s.c
	@printf ' %-9s %-15s\t\t' "Compiling" "$(package)cs  "
	$(SED) -f $(CSEDS) \
           ../$(package)/C/$(package)s.c > $(OBJ)/$(package)cs.c
	cd $(OBJ) ; $(CC) -o $(package)cs_$(PRECIS).o $(CFLAGS) \
                      $(package)cs.c -I $(GALAHAD)/include -I $(OBJ)
	rm $(OBJ)/*.c
	@printf '[ OK ]\n'

$(package)cs2.o: $(OBJ)/$(package)cs2_$(PRECIS).o

$(OBJ)/$(package)cs2_$(PRECIS).o: ../$(package)/C/$(package)s2.c
	@printf ' %-9s %-15s\t\t' "Compiling" "$(package)cs2  "
	$(SED) -f $(CSEDS) \
           ../$(package)/C/$(package)s2.c > $(OBJ)/$(package)cs2.c
	cd $(OBJ) ; $(CC) -o $(package)cs2_$(PRECIS).o $(CFLAGS) \
                      $(package)cs2.c -I $(GALAHAD)/include -I $(OBJ)
	rm $(OBJ)/*.c
	@printf '[ OK ]\n'

$(package)cs3.o: $(OBJ)/$(package)cs3_$(PRECIS).o

$(OBJ)/$(package)cs3_$(PRECIS).o: ../$(package)/C/$(package)s3.c
	@printf ' %-9s %-15s\t\t' "Compiling" "$(package)cs3  "
	$(SED) -f $(CSEDS) \
           ../$(package)/C/$(package)s3.c > $(OBJ)/$(package)cs3.c
	cd $(OBJ) ; $(CC) -o $(package)cs3_$(PRECIS).o $(CFLAGS) \
                      $(package)cs3.c -I $(GALAHAD)/include -I $(OBJ)
	rm $(OBJ)/*.c
	@printf '[ OK ]\n'

$(package)cs4.o: $(OBJ)/$(package)cs4_$(PRECIS).o

$(OBJ)/$(package)cs4_$(PRECIS).o: ../$(package)/C/$(package)s4.c
	@printf ' %-9s %-15s\t\t' "Compiling" "$(package)cs4  "
	$(SED) -f $(CSEDS) \
           ../$(package)/C/$(package)s4.c > $(OBJ)/$(package)cs4.c
	cd $(OBJ) ; $(CC) -o $(package)cs4_$(PRECIS).o $(CFLAGS) \
                      $(package)cs4.c -I $(GALAHAD)/include -I $(OBJ)
	rm $(OBJ)/*.c
	@printf '[ OK ]\n'

#  comprehensive test programs

$(package)t.o: $(OBJ)/$(package)t_$(PRECIS).o

$(OBJ)/$(package)t_$(PRECIS).o: ../$(package)/$(package)t.F90
	@printf ' %-9s %-15s\t\t' "Compiling" "$(package)t  "
	$(CP) ../$(package)/$(package)t.F90 $(OBJ)/$(package)t.F90
	cd $(OBJ) ; $(FORTRAN) -o $(package)t_$(PRECIS).o \
           $(FFLAGSS) $(package)t.F90
	rm $(OBJ)/*.F90
	@printf '[ OK ]\n'

$(package)ti.o: $(OBJ)/$(package)ti_$(PRECIS).o

$(OBJ)/$(package)ti_$(PRECIS).o: ../$(package)/$(package)ti.F90
	@printf ' %-9s %-15s\t\t' "Compiling" "$(package)ti  "
	$(CP) ../$(package)/$(package)ti.F90 $(OBJ)/$(package)ti.F90
	cd $(OBJ) ; $(FORTRAN) -o $(package)ti_$(PRECIS).o \
           $(FFLAGSS) $(package)ti.F90
	rm $(OBJ)/*.F90
	@printf '[ OK ]\n'

#  comprehensive test programs for C interfaces

$(package)ct.o: $(OBJ)/$(package)ct_$(PRECIS).o

$(OBJ)/$(package)ct_$(PRECIS).o: ../$(package)/C/$(package)t.c
	@printf ' %-9s %-15s\t\t' "Compiling" "$(package)ct  "
	$(CP) ../$(package)/C/$(package)t.c $(OBJ)/$(package)ct.c
	cd $(OBJ) ; $(CC) -o $(package)ct_$(PRECIS).o \
                      $(CFLAGS) $(package)ct.c -I $(GALAHAD)/include -I $(OBJ)
	rm $(OBJ)/*.c
	@printf '[ OK ]\n'

$(package)ct2.o: $(OBJ)/$(package)ct2_$(PRECIS).o

$(OBJ)/$(package)ct2_$(PRECIS).o: ../$(package)/C/$(package)t2.c
	@printf ' %-9s %-15s\t\t' "Compiling" "$(package)ct2  "
	$(CP) ../$(package)/C/$(package)t2.c $(OBJ)/$(package)ct2.c
	cd $(OBJ) ; $(CC) -o $(package)ct2_$(PRECIS).o \
                      $(CFLAGS) $(package)ct2.c -I $(GALAHAD)/include -I $(OBJ)
	rm $(OBJ)/*.c
	@printf '[ OK ]\n'

$(package)cti.o: $(OBJ)/$(package)cti_$(PRECIS).o

$(OBJ)/$(package)cti_$(PRECIS).o: ../$(package)/C/$(package)ti.c
	@printf ' %-9s %-15s\t\t' "Compiling" "$(package)cti  "
	$(CP) ../$(package)/C/$(package)ti.c $(OBJ)/$(package)cti.c
	cd $(OBJ) ; $(CC) -o $(package)cti_$(PRECIS).o $(CFLAGS) \
                     $(package)cti.c -I $(GALAHAD)/include -I $(OBJ)
	rm $(OBJ)/*.c
	@printf '[ OK ]\n'

$(package)ctf.o: $(OBJ)/$(package)ctf_$(PRECIS).o

$(OBJ)/$(package)ctf_$(PRECIS).o: ../$(package)/C/$(package)tf.c
	@printf ' %-9s %-15s\t\t' "Compiling" "$(package)ctf  "
	$(CP) ../$(package)/C/$(package)tf.c $(OBJ)/$(package)ctf.c
	cd $(OBJ) ; $(CC) -o $(package)ctf_$(PRECIS).o $(CFLAGS) \
                      $(package)ctf.c -I $(GALAHAD)/include -I $(OBJ)
	rm $(OBJ)/*.c
	@printf '[ OK ]\n'

#  CUTEst/AMPL interfaces

use$(package).o: $(CULG)(use$(package)_$(PRECIS).o)

$(CULG)(use$(package)_$(PRECIS).o): ../$(package)/use$(package).F90
	@printf ' %-9s %-15s\t\t' "Compiling" "use$(package)   "
	$(CP) ../$(package)/use$(package).F90 $(OBJ)/use$(package).F90
	cd $(OBJ); \
          $(FORTRAN) -o use$(package)_$(PRECIS).o \
             $(FFLAGSOMP) use$(package).F90 \
                || ( printf ' %-26s' "=> Disabling optimization " ; \
                   $(FORTRAN) -o use$(package)_$(PRECIS).o \
                     $(FFLAGSN) use$(package).F90 )
	cd $(OBJ); $(CUARR) use$(package)_$(PRECIS).o ; \
                     $(RM) use$(package).F90 use$(package)_$(PRECIS).o
	$(RMOBFILE) run$(package)_sif_$(PRECIS).o
	$(MVMODS)
	@printf '[ OK ]\n'

#  Rutherford-Boeing interfaces

run$(package)_rb.o: $(OBJ)/run$(package)_rb_$(PRECIS).o

$(OBJ)/run$(package)_rb_$(PRECIS).o: ../$(package)/run$(package)_rb.F90
	@printf ' %-9s %-15s\t\t' "Compiling" "run$(package)_rb"
	$(CP) ../$(package)/run$(package)_rb.F90 $(OBJ)/run$(package)_rb.F90
	cd $(OBJ); $(FORTRAN) -o run$(package)_rb_$(PRECIS).o \
                     $(FFLAGSS) run$(package)_rb.F90
	rm $(OBJ)/run$(package)_rb.F90
	@printf '[ OK ]\n'

#  include required package intermediaries

include $(GALAHAD)/src/makedefs/intermediaries
