#  Standard CUTEst makefile definitions

#  Nick Gould, for GALAHAD production
#  This version: 2024-06-11

#  makefile shell

SHELL = /bin/$(BINSHELL)

ifeq "$(PRECIS)" "single_64"
  DPREC = -DREAL_32 -DINTEGER_64
  HSL_PRECIS = s64
else ifeq "$(PRECIS)" "quadruple_64"
  DPREC = -DINTEGER_64 -DREAL_128 $(QUADREAL)
  HSL_PRECIS = q64
else ifeq "$(PRECIS)" "double_64"
  DPREC = -DINTEGER_64
  HSL_PRECIS = d64
else ifeq "$(PRECIS)" "single"
  DPREC = -DREAL_32
  HSL_PRECIS = s
else ifeq "$(PRECIS)" "quadruple"
  DPREC = -DREAL_128 $(QUADREAL)
  HSL_PRECIS = q
else
  DPREC =
  HSL_PRECIS = d
endif

#  compiler flags

F90FLAGS = $(BASIC) $(OPTIMIZATION) $(DEBUG) $(MODULES) $(F90) $(USUAL) \
              $(DPREC) -I $(CUTEST)/include $(EXTRAINCLUDES)
F90FLAGSS = $(BASIC) $(OPTIMIZATION) $(DEBUG) $(MODULES) $(F90) $(SPECIAL) \
               $(DPREC) -I $(CUTEST)/include $(EXTRAINCLUDES)
F90FLAGSN = $(BASIC) $(NOOPTIMIZATION) $(DEBUG) $(MODULES) $(F90) \
               $(DPREC) -I $(CUTEST)/include $(EXTRAINCLUDES)
FFLAGS = $(BASIC) $(OPTIMIZATION) $(DEBUG) $(MODULES) $(F77) $(USUAL) \
            $(DPREC) -I $(CUTEST)/include $(EXTRAINCLUDES)
FFLAGSS = $(BASIC) $(OPTIMIZATION) $(DEBUG) $(MODULES) $(F77) $(SPECIAL) \
             $(DPREC) -I $(CUTEST)/include $(EXTRAINCLUDES)
FFLAGSN  = $(BASIC) $(NOOPTIMIZATION) $(DEBUG) $(MODULES) $(F77) $(USUAL) \
             $(DPREC) -I $(CUTEST)/include $(EXTRAINCLUDES)
CFLAGS = $(CCBASIC) $(CCISO) $(OPTIMIZATION) $(CCDEBUG) \
              $(DPREC) -I $(CUTEST)/include $(EXTRAINCLUDES)
CFLAGSN = $(CCBASIC) $(CCISO) $(NOOPTIMIZATION) $(CCDEBUG) \
              $(DPREC) -I $(CUTEST)/include $(EXTRAINCLUDES)
RUNFFLAGS = $(OPTIMIZATION) $(DEBUG) $(MODULES) \
              $(DPREC) -I $(CUTEST)/include $(EXTRAINCLUDES) -lstdc++
CRUNFFLAGS = $(OPTIMIZATION) $(CCDEBUG) \
              $(DPREC) -I $(CUTEST)/include $(EXTRAINCLUDES) $(CCFFLAGS)

#  names of random libraries

LC  = $(OBJ)/libcutest.a
LCS = $(OBJS)/libcutest.a
LCD = $(OBJD)/libcutest.a
LCQ = $(OBJQ)/libcutest.a
LCS64 = $(OBJS64)/libcutest.a
LCD64 = $(OBJD64)/libcutest.a
LCQ64 = $(OBJQ64)/libcutest.a

BLC  = $(OBJ)/libcutest_blas.a
BLCS = $(OBJS)/libcutest_blas.a
BLCD = $(OBJD)/libcutest_blas.a
BLCQ = $(OBJQ)/libcutest_blas.a
BLCS64 = $(OBJS64)/libcutest_blas.a
BLCD64 = $(OBJD64)/libcutest_blas.a
BLCQ64 = $(OBJQ64)/libcutest_blas.a

DLC  = $(OBJ)/libcutest_dummy.a
DLCS = $(OBJS)/libcutest_dummy.a
DLCD = $(OBJD)/libcutest_dummy.a
DLCQ = $(OBJQ)/libcutest_dummy.a
DLCS64 = $(OBJS64)/libcutest_dummy.a
DLCD64 = $(OBJD64)/libcutest_dummy.a
DLCQ64 = $(OBJQ64)/libcutest_dummy.a

LLC  = $(OBJ)/libcutest_lapack.a
LLCS = $(OBJS)/libcutest_lapack.a
LLCD = $(OBJD)/libcutest_lapack.a
LLCQ = $(OBJQ)/libcutest_lapack.a
LLCS64 = $(OBJS64)/libcutest_lapack.a
LLCD64 = $(OBJD64)/libcutest_lapack.a
LLCQ64 = $(OBJQ64)/libcutest_lapack.a

MLC  = $(OBJ)/libcutest_matlab.a
MLCS = $(OBJS)/libcutest_matlab.a
MLCD = $(OBJD)/libcutest_matlab.a
MLCS64 = $(OBJS64)/libcutest_matlab.a
MLCD64 = $(OBJD64)/libcutest_matlab.a

OLC  = $(OBJ)/libcutest_octave.a
OLCS = $(OBJS)/libcutest_octave.a
OLCD = $(OBJD)/libcutest_octave.a
OLCS64 = $(OBJS64)/libcutest_octave.a
OLCD64 = $(OBJD64)/libcutest_octave.a

#  Libraries used

#LIBS = -lcutest -lcutest_lapack -lcutest_blas
LIBS = -lcutest
PLIBS = $(LIBS) -lcutest_problem

#  Archive manipulation strings

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

BARR = $(AR) $(ARREPFLAGS) $(BLC)
BRMARFILE = $(CUTEST)/bin/rmarfile $(AR) $(GREP) $(BLC)

DARR = $(AR) $(ARREPFLAGS) $(DLC)

LARR = $(AR) $(ARREPFLAGS) $(LLC)
LRMARFILE = $(CUTEST)/bin/rmarfile $(AR) $(GREP) $(LLC)

#  strings

SUCC = precision version) compiled successfully

#  main component

$(PACKAGE) = $(OBJ)/$(package)_main.o

#  test example components

#U_TEST = $(OBJ)/u_elfun.o $(OBJ)/u_group.o $(OBJ)/u_range.o $(OBJ)/u_exter.o
#C_TEST = $(OBJ)/c_elfun.o $(OBJ)/c_group.o $(OBJ)/c_range.o $(OBJ)/c_exter.o
U_TEST = $(OBJ)/u_elfun.o $(OBJ)/u_group.o $(OBJ)/u_range.o
C_TEST = $(OBJ)/c_elfun.o $(OBJ)/c_group.o $(OBJ)/c_range.o
Q_TEST = $(OBJ)/q_elfun.o $(OBJ)/q_group.o $(OBJ)/q_range.o

#  valgrind options if needed

#VALGRIND = --tool=memcheck --leak-check=full --show-reachable=yes \
#VALGRIND = -v --tool=memcheck --leak-check=yes --show-reachable=yes \
#--track-origins=yes -s
VALGRIND = -v --tool=memcheck --leak-check=full --show-reachable=yes \
--track-origins=yes -s

#  gdb options if needed

GDB = -silent -ex run -ex bt -ex exit
