#  Main body of the installation makefile for CUTEst GEN programs

#  N. Gould, D. Orban and Ph. L. Toint.
#  This version: 3 I 2013

#  package

PACKAGE = GEN
package = gen

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)
FFLAGS7N  = $(BASIC) $(NOOPTIMIZATION) $(DEBUG) $(MODULES) $(F77) $(USUAL)
RUNFFLAGS =          $(OPTIMIZATION) $(DEBUG) $(MODULES)

CFLAGS    = $(CCBASIC) $(CCISO) $(OPTIMIZATION) $(CCDEBUG) -I$(CUTEST)/include
CFLAGSN   = $(CCBASIC) $(CCISO) $(NOOPTIMIZATION) $(CCDEBUG) -I$(CUTEST)/include
CRUNFFLAGS = $(OPTIMIZATION) $(CCDEBUG) -I$(CUTEST)/include $(CCFFLAGS)

#  names of random libraries

LC  = $(OBJ)/libcutest.a
LCS = $(OBJS)/libcutest.a
LCD = $(OBJD)/libcutest.a

BLC  = $(OBJ)/libcutest_blas.a
BLCS = $(OBJS)/libcutest_blas.a
BLCD = $(OBJD)/libcutest_blas.a

DLC  = $(OBJ)/libcutest_dummy.a
DLCS = $(OBJS)/libcutest_dummy.a
DLCD = $(OBJD)/libcutest_dummy.a

LLC  = $(OBJ)/libcutest_lapack.a
LLCS = $(OBJS)/libcutest_lapack.a
LLCD = $(OBJD)/libcutest_lapack.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)

#  compilation agenda

$(PACKAGE) = $(OBJ)/gen77.o $(OBJ)/gen90.o $(OBJ)/genc.o

GEN77 =  $(OBJ)/gen77.o  $(OBJ)/gen77_main.o
GEN90 =  $(OBJ)/gen90.o  $(OBJ)/gen90_main.o
GENC = $(OBJ)/genc.o $(OBJ)/genc_main.o

U_TEST = u_elfun.o u_group.o u_range.o
C_TEST = c_elfun.o c_group.o c_range.o

SUCC = precision version) compiled successfully

#  main compilations and runs

all: $(package)

#  basic packages

$(package): $(package)_$(PRECIS)
	@printf ' %-21s\n' "CUTEst: $(package) ($(PRECIS) $(SUCC)"
$(package)_single: $($(PACKAGE))
$(package)_double: $($(PACKAGE))

#  basic packages

test: test77 test90 tesc

test77: test77_$(PRECIS)
	@printf ' %-21s\n' "CUTEst: gen77 ($(PRECIS) $(SUCC)"
test77_single: $(GEN77)
test77_double: $(GEN77)

test90: test90_$(PRECIS)
	@printf ' %-21s\n' "CUTEst: gen90 ($(PRECIS) $(SUCC)"
test90_single: $(GEN90)
test90_double: $(GEN90)

testc: testc_$(PRECIS)
	@printf ' %-21s\n' "CUTEst: genc ($(PRECIS) $(SUCC)"
testc_single: $(GENC)
testc_double: $(GENC)

# run example tests

run_test: run_test77 run_test90 run_testc

run_test77: tools test_cutest test77
	echo " Test of unconstrained gen77"
	cd $(OBJ) ; $(FORTRAN) $(RUNFFLAGS) $(SPECIAL) -o run_test77 \
            gen77_main.o gen77.o $(U_TEST) -L$(OBJ) $(LIBS)
	ln -fs $(CUTEST)/src/test/u_OUTSDIF.d ../gen/OUTSDIF.d
	- $(OBJ)/run_test77 >& ../gen/u_test77.output
	cat ../gen/u_test77.output
	rm $(OBJ)/run_test77 ../gen/OUTSDIF.d
	echo " Test of constrained gen77"
	cd $(OBJ) ; $(FORTRAN) $(RUNFFLAGS) $(SPECIAL) -o run_test77 \
            gen77_main.o gen77.o $(C_TEST) -L$(OBJ) $(LIBS)
	ln -fs $(CUTEST)/src/test/c_OUTSDIF.d ../gen/OUTSDIF.d
	- $(OBJ)/run_test77 >& ../gen/c_test77.output
	cat ../gen/c_test77.output
	rm $(OBJ)/run_test77 ../gen/OUTSDIF.d

run_test90: tools test_cutest test90
	echo " Test of unconstrained gen90"
	cd $(OBJ) ; $(FORTRAN) $(RUNFFLAGS) $(SPECIAL) -o run_test90 \
            gen90_main.o gen90.o $(U_TEST) -L$(OBJ) $(LIBS)
	ln -fs $(CUTEST)/src/test/u_OUTSDIF.d ../gen/OUTSDIF.d
	- $(OBJ)/run_test90 >& ../gen/u_test90.output
	cat ../gen/u_test90.output
	rm $(OBJ)/run_test90 ../gen/OUTSDIF.d
	echo " Test of constrained gen90"
	cd $(OBJ) ; $(FORTRAN) $(RUNFFLAGS) $(SPECIAL) -o run_test90 \
            gen90_main.o gen90.o $(C_TEST) -L$(OBJ) $(LIBS)
	ln -fs $(CUTEST)/src/test/c_OUTSDIF.d ../gen/OUTSDIF.d
	- $(OBJ)/run_test90 >& ../gen/c_test90.output
	cat ../gen/c_test90.output
	rm $(OBJ)/run_test90 ../gen/OUTSDIF.d

run_testc: tools test_cutest testc
	echo " Test of unconstrained genc"
	cd $(OBJ) ; $(CC) -o run_testc \
            genc_main.o genc.o $(U_TEST) -L$(OBJ) $(LIBS) $(CRUNFFLAGS)
	ln -fs $(CUTEST)/src/test/u_OUTSDIF.d ../gen/OUTSDIF.d
	- $(OBJ)/run_testc >& ../gen/u_testc.output
	cat ../gen/u_testc.output
	rm $(OBJ)/run_testc ../gen/OUTSDIF.d
	echo " Test of constrained genc"
	echo " $(CRUNFFLAGS)"
	cd $(OBJ) ; $(CC) -o run_testc \
            genc_main.o genc.o $(C_TEST) -L$(OBJ) $(LIBS) $(CRUNFFLAGS)
	ln -fs $(CUTEST)/src/test/c_OUTSDIF.d ../gen/OUTSDIF.d
	- $(OBJ)/run_testc >& ../gen/c_testc.output
	cat ../gen/c_testc.output
	rm $(OBJ)/run_testc ../gen/OUTSDIF.d

test_cutest:
	( cd ../test ; $(MAKE) -f $(CUTEST)/makefiles/$(VERSION) \
                     test_cutest PRECIS=$(PRECIS) PWD=$(PWD)/../test )
test_cutest_unconstrained:
	( cd ../test ; $(MAKE) -f $(CUTEST)/makefiles/$(VERSION) \
            test_cutest_unconstrained PRECIS=$(PRECIS) PWD=$(PWD)/../test )
test_cutest_constrained:
	( cd ../test ; $(MAKE) -f $(CUTEST)/makefiles/$(VERSION) \
            test_cutest_constrained PRECIS=$(PRECIS) PWD=$(PWD)/../test )
tools:
	( cd ../tools ; $(MAKE) -f $(CUTEST)/makefiles/$(VERSION) \
                     cutest PRECIS=$(PRECIS) PWD=$(PWD)/../tools )
utools:
	( cd ../tools ; $(MAKE) -f $(CUTEST)/makefiles/$(VERSION) \
                     cutest_unconstrained PRECIS=$(PRECIS) PWD=$(PWD)/../tools )
ctools:
	( cd ../tools ; $(MAKE) -f $(CUTEST)/makefiles/$(VERSION) \
                     cutest_constrained PRECIS=$(PRECIS) PWD=$(PWD)/../tools )

#  individual compilations

$(OBJ)/gen77.o: ../gen/gen77.f
	@printf ' %-9s %-15s\t\t' "Compiling" "gen77"
	$(SED) -f $(SEDS) ../gen/gen77.f > $(OBJ)/gen77.f
	cd $(OBJ); $(FORTRAN) -o gen77.o $(FFLAGS77) gen77.f \
                || ( printf ' %-26s' "=> Disabling optimization " ; \
                   $(FORTRAN) -o gen77.o $(FFLAGS77N) gen77.f )
	$(RM) $(OBJ)/gen77.f
	@printf '[ OK ]\n'

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

$(OBJ)/genc.o: ../gen/genc.c
	@printf ' %-9s %-15s\t\t' "Compiling" "genc"
	$(SED) -f $(SEDS) ../gen/genc.c > $(OBJ)/genc.c
	cd $(OBJ); $(CC) -o genc.o $(CFLAGS) genc.c \
                || ( printf ' %-26s' "=> Disabling optimization " ; \
                   $(CC) -o genc.o $(CFLAGSN) genc.c )
	$(RM) $(OBJ)/genc.c
	@printf '[ OK ]\n'

#  CUTEst interface main programs

$(OBJ)/gen77_main.o: ../gen/gen77_main.f
	@printf ' %-9s %-15s\t\t' "Compiling" "gen77_main"
	$(SED) -f $(SEDS) ../gen/gen77_main.f > $(OBJ)/gen77_main.f
	cd $(OBJ); $(FORTRAN) -o gen77_main.o $(FFLAGS77) gen77_main.f \
                || ( printf ' %-26s' "=> Disabling optimization " ; \
                   $(FORTRAN) -o gen77_main.o $(FFLAGS77N) gen77_main.f )
	$(RM) $(OBJ)/gen77_main.f
	@printf '[ OK ]\n'

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

$(OBJ)/genc_main.o: ../gen/genc_main.c
	@printf ' %-9s %-15s\t\t' "Compiling" "genc_main"
	$(SED) -f $(SEDS) ../gen/genc_main.c > $(OBJ)/genc_main.c
	cd $(OBJ); $(CC) -o genc_main.o $(CFLAGS) genc_main.c \
                || ( printf ' %-26s' "=> Disabling optimization " ; \
                   $(CC) -o genc_main.o $(CFLAGSN) genc_main.c )
	$(RM) $(OBJ)/genc_main.c
	@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'

