# Makefile for GNU-make
# Fortran: GNU gfortran 4.8 to 13                        (with f90cache)
#
# new organisation: each *.o depends now only on *.mod files
#                   use of recursive-make
#
# É. Canot -- CNRS --  5 Dec 2025
#
# make help
#
#  'MODE=silent'  [default]: rules & compiler output are not displayed
#  'MODE=verbose'          : rules & compiler output are displayed
#
#  'CFG=optim'    [default]: optimization + public/private var.
#                            libs: static + shared
#  'CFG=debug'             : debug + profiling + check + traceback +
#                            all var. are public + static libs only
#
#  'PROF=no'      [default]: profiling not activated
#  'PROF=yes'              : enable profiling of the code
#
#  'FGL=yes'      [default]: compile the graphic part
#  'FGL=no'                : don't compile the graphic part
#
#-----------------------------------------------------------------------
# (these options must be located after the 'make' command)
#

include Makefile.config

# configurable options (architecture dependent)

# for optimization (both for gcc, g++ and gfortran)
OPT_FLAGS = -O3 -funroll-loops
export OPT_FLAGS

# path to shared libraries of GNU compilers
F90_LIB_DIR = $(GCC_LIB)

export F90_LIB_DIR

#=======================================================================
# (see at the end for a list of exported variables)

F90CACHE = "yes"
export F90CACHE

# special tag: vendor / f90 abbrev
F90C_TAG = GNU_GFC
export F90C_TAG

INSTALL_DIR := $(INSTALL_DIR)/muesli

DOCS_INSTALL_DIR := $(DOCS_INSTALL_DIR)/muesli

export CFG
export X86_64

# memorize MAKE local options
ifeq '$(CFG)' 'debug'
  MAKE_CFG=CFG=debug
else # 'optim'
  MAKE_CFG=CFG=optim
endif
ifeq '$(PROF)' 'yes'
  MAKE_PROF=PROF=yes
else # 'no'
  MAKE_PROF=PROF=no
endif
ifeq '$(FGL)' 'no'
  MAKE_FGL=FGL=no
else # 'no'
  MAKE_FGL=FGL=yes
endif

# compilers ------------------------------------------------------------

F90CACHE_EXE = f90cache

F90C = $(F90CACHE_EXE) $(F90_COMP)
export F90C

FC = $(F90C)
export FC

FPP = $(F90C) -E # a bug of many releases (from 4.5) creates some empty *.s files
                 # (cf. the clean at the end)
FPP_OUT = >

MODULE_ONLY = -fsyntax-only

MOD_TO = -J# no blank after
# MOD_TO: must be used with caution... it adds the specified path to
# the set of pathes for USE... and some confusion may arise...
# moreover, it cannot be used for parallel make ('make -j N')
#
# while a blank after the '-J' option should be possible, the official
# documentation asks to use '-Jdir' (without a blank as separator). Note
# that only recent versions of the f90cache tool (from 0.99d of Sep 2019)
# support a blank character after '-J'.

# exported for [FGL]mfplot Makefile
export MOD_TO

# OpenMP flag (specific for each compiler)
OMP_FLAG =# -fopenmp

CC = ccache $(C_COMP)
export CC

CPLUSPLUS = ccache $(CXX_COMP)
export CPLUSPLUS

ifeq '$(MODE)' 'verbose'

  export VERB =
  export MAKE = make

else # 'silent'

  export VERB =@
  export MAKE = make -s

endif

WRAPPER_FLAGS = -DUNDERSCORE
ifeq '$(X86_64)' '"yes"'
  WRAPPER_FLAGS += -D_64_BITS
endif
export WRAPPER_FLAGS

ifeq '$(CFG)' 'debug'

  CC_FLAGS = -g
  CPP_FLAGS =

  FPP_FLAGS = -D_$(F90C_TAG)

  FPP_DEBUG_FLAGS =

  CFG_FLAGS = -fno-range-check \
              -g -fbounds-check -fbacktrace

  ifeq '$(PROF)' 'yes'
    CC_FLAGS += -pg
    CFG_FLAGS += -pg
  endif

#  CFG_FLAGS += -Warray-temporaries -fcheck-array-temporaries # 4.? only

  FML_LIB = lib/libfml.a
  FGL_LIB = lib/libfgl.a

  ifeq '$(VERB)' '@'

    CFG_FLAGS += -w
    CC_FLAGS += -w

  else # 'verbose'

    CFG_FLAGS += -Wall
    CC_FLAGS += -Wall

  endif

  # static-libgfortran is required to use my show_backtrace
  ifeq '$(STATIC_LIBGFORTRAN)' '"yes"'
    LD_FLAGS = -static-libgfortran
  endif

else # 'optim'

  CC_FLAGS = -w $(OPT_FLAGS)
  CPP_FLAGS = -D_OPTIM

  FPP_FLAGS = -D_$(F90C_TAG) -D_OPTIM
  FPP_DEBUG_FLAGS =

  CFG_FLAGS = -fno-range-check -w $(OPT_FLAGS)

  FML_LIB = lib/libfml.so
  FGL_LIB = lib/libfgl.so

  LD_FLAGS =

endif

CFG_FLAGS += -ffree-line-length-none

ifeq '$(STATIC_LIBGFORTRAN)' '"yes"'
  FPP_FLAGS += -D_SHOW_BACKTRACE
else
  ifeq '$(GFORTRAN_HAS_BACKTRACE)' '"yes"'
    FPP_FLAGS += -D_STD_BACKTRACE
  endif
endif

export FPP_FLAGS

PIC_FLAGS =
ifeq '$(X86_64)' '"yes"'
  PIC_FLAGS = -fPIC
  CC_FLAGS += $(PIC_FLAGS) -D_64_BITS
  FPP_FLAGS += -D_64_BITS
  CFG_FLAGS += $(PIC_FLAGS)
endif

# The loc() intrinsic function of this compiler may take address of
# sequenced derived types:
FPP_FLAGS += -D_HAS_LOC

ifeq '$(NO_X11)' '"yes"'

  FPP_FLAGS += -D_NO_X11
  CC_FLAGS += -D_NO_X11

endif

ifeq '$(IM_CONVERT)' '"yes"'

  FPP_FLAGS += -D_HAS_IM_CONVERT

endif

ifeq '$(DARWIN)' '"yes"'

  FPP_FLAGS += -D_DARWIN
  CC_FLAGS += -D_DARWIN

endif

ifeq '$(READLINE)' '"yes"'

  FPP_FLAGS += -D_READLINE

endif

INCLUDES = -I./inc_dev

ifeq '$(HDF5)' '"yes"'

  FPP_FLAGS += -D_HDF5

  INCLUDES += -I$(HDF5_F90_DIR)

endif

# [option added on 2011-06-30, in order to check the validity
#  of numerical results among all the compilers used]
F90_FLAGS += -fno-sign-zero

F90_FLAGS = $(CFG_FLAGS) $(OMP_FLAG)

LD_FLAGS += $(OMP_FLAG)

export PIC_FLAGS
export CC_FLAGS
export CPP_FLAGS
export F90_FLAGS

# shell tools ----------------------------------------------------------

CHECK_OPTS = sh_tools/check_opts 2

CHECK_VER = sh_tools/check_ver

#=======================================================================

ifeq '$(FGL)' 'no'
all : f90cache_check check_ver check_opts compat_opts fml_core/parameters.inc \
      suitesparse arpack-2 minpack-2 ConvexHull GFT-2 ACM-2 dummy_papi \
      FML_part $(FML_LIB) dist_fml meditor
else
all : f90cache_check check_ver check_opts compat_opts fml_core/parameters.inc \
      suitesparse arpack-2 minpack-2 ConvexHull GFT-2 ACM-2 dummy_papi \
      FML_part $(FML_LIB) dist_fml meditor \
      mfplot FGL_part $(FGL_LIB) dist_fgl
endif

f90cache_check :
	@if [ -n "$${F90CACHE_DISABLE+1}" ]; then \
		echo $(ECHO_OPT) "\n  F90CACHE is disable."; \
		echo $(ECHO_OPT) "    Please use 'make -f Makefile.no_cache' instead!"; \
		echo $(ECHO_OPT) "    [or type 'unset F90CACHE_DISABLE']\n"; \
		exit 1; \
	fi

compat_opts :
ifeq '$(MAKE_CFG)' 'CFG=optim'
  ifeq '$(PROF)' 'yes'
	@echo $(ECHO_OPT) "\n   'PROF=yes'  can be activated only in debug mode!\n"
	exit 1
  endif
endif
	@rm -f make_options make_opt.inc
	@echo "make $(MAKE_CFG) $(MAKE_PROF)" > make_options
	@echo $(ECHO_OPT) "$(MAKE_CFG)\n$(MAKE_PROF)\nGCC_FAMILY_MAJOR=$(GCC_FAMILY_MAJOR)\nGCC_FAMILY_MINOR=$(GCC_FAMILY_MINOR)" > make_opt.inc

check_opts :
	@$(CHECK_OPTS) make_options $(MAKE_CFG) $(MAKE_PROF)

check_ver :
	@$(CHECK_VER) make_opt.inc $(GCC_FAMILY_MAJOR) $(GCC_FAMILY_MINOR)

fml_core/parameters.inc : fml_core/parameters.inc.in f90_compiler_version ../VERSION
	@cat fml_core/parameters.inc.in | \
		sed -e "s+MUESLI VERSION NOT DEFINED+`cat ../VERSION | head -n 1`+" | \
		sed -e "s+COMPILER VERSION NOT DEFINED+`cat f90_compiler_version | head -n 1`+" \
		> $@

howmake :
	@echo
	$(COLOR_YELLOW)
	@echo $(ECHO_OPT) " \c"
	@test -f make_options && cat make_options || \
		echo "don't know how make has been called !"
	$(COLOR_NORMAL)
	@echo

help :
	@echo
	$(COLOR_GRAY)
	@echo "  make [MODE=silent|verbose] [CFG=optim|debug] [PROF=no|yes] [FGL=yes|no] <target>"
	@echo "    -------------------------"
	@echo "    'MODE=silent'  [default]: rules & compiler output are not displayed"
	@echo "    'MODE=verbose'          : rules & compiler output are displayed"
	@echo
	@echo "    'CFG=optim'    [default]: optimization + public/private var."
	@echo "                              libs: static + shared"
	@echo "    'CFG=debug'             : debug + profiling + check + traceback +"
	@echo "                              all var. are public + static libs only"
	@echo
	@echo "    'PROF=no'      [default]: profiling not activated"
	@echo "    'PROF=yes'              : enable profiling of the code"
	@echo
	@echo "    'FGL=yes'      [default]: compile the graphic part"
	@echo "    'FGL=no'                : don't compile the graphic part"
	@echo "    -------------------------"
	@echo "    'CFG=optim', 'PROF=yes' are not compatible!"
	$(COLOR_NORMAL)
	@echo

#-----------------------------------------------------------------------
#--------------------------------- FML ---------------------------------
#-----------------------------------------------------------------------

FML_OBJS = obj/mod_mfdebug.o \
           obj/mod_mem_debug.o \
           obj/mod_mfaux.o \
           obj/iso_varying_string.o \
           obj/rational_numbers.o \
           obj/mod_prop.o \
           obj/mod_mfarray.o \
           obj/mod_physunits.o \
           obj/mod_ieee.o \
           obj/mod_core.o \
           obj/mod_sparse.o \
           obj/mod_elmat.o \
           obj/mod_fileio.o \
           obj/mod_mf_gsl.o \
           obj/mod_elfun.o \
           obj/mod_specfun.o \
           obj/mod_ops.o \
           \
           obj/gft_common.o \
           obj/gft_jmfft.o \
           obj/gft_set.o \
           obj/gft_do.o \
           obj/gft_end.o \
           obj/gft.o \
           \
           obj/minpack.o \
           \
           obj/convexhull_mod.o \
           \
           obj/mod_datafun.o \
           obj/mod_matfun.o \
           \
           obj/splines.o \
           obj/bezier.o \
           \
           obj/mod_polyfun.o \
           obj/mod_funfun.o \
           \
           obj/mod_ddebd2.o \
           obj/mod_slatec_aux.o \
           obj/mod_slatec_fun.o \
           obj/mod_slatec_solve.o \
           \
           obj/umf4_f90wrapper.o \
           obj/cholmod_f90wrapper.o \
           obj/spqr_f90wrapper.o \
           \
           obj/triangle.o \
           obj/triangle_delaunay.o \
           obj/del-tree3.o \
           obj/del-tree3_f90wrapper.o \
           \
           obj/RngStream.o \
           obj/RngStream_f90wrapper.o \
           \
           obj/set_rounding_mode.o \
           obj/fp_exceptions.o \
           \
           obj/get_term_col.o

ifeq '$(READLINE)' '"yes"'
  FML_OBJS += obj/readline_c.o
endif

ifeq '$(CFG)' 'debug'
  ifeq '$(STATIC_LIBGFORTRAN)' '"yes"'
    FML_OBJS += obj/show_backtrace.o
  endif
endif

ifeq '$(X86_64)' '"yes"'
  FML_OBJS += obj/crc32_adler.o
else
  FML_OBJS += obj/icrc32.o \
              obj/crc32.o
endif

FML_OBJS += obj/f90_gzlib.o \
            obj/zlib_f90.o

obj/mod_mfdebug.o : mod_mfdebug.F90
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(F90C) -D_DEVLP $(FPP_FLAGS) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev

obj/mod_mem_debug.o : mod_mem_debug.F90 \
                      inc_dev/mod_mfdebug.mod
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(F90C) -D_DEVLP $(FPP_FLAGS) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))

obj/mod_mfaux.o : mod_mfaux.F90 \
                  fml_core/min_max_nan.inc \
                  fml_core/quick_sort.inc \
                  fml_core/quick_sortrows.inc \
                  fml_core/tri.inc \
                  fml_core/tetra.inc \
                  fml_core/seq_def.inc \
                  inc_dev/mod_mem_debug.mod \
                  inc_dev/convexhull_mod.mod
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(F90C) -D_DEVLP $(FPP_FLAGS) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))

obj/rational_numbers.o : misc/rational_numbers/rational_numbers.F90 \
                         misc/rational_numbers/rational_config.inc
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(F90C) $(FPP_FLAGS) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev

obj/mod_prop.o : mod_prop.F90 \
                 inc_dev/mod_mfdebug.mod
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(F90C) -D_DEVLP $(FPP_FLAGS) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))

obj/mod_mfarray.o : mod_mfarray.F90 \
                    fml_core/parameters.inc \
                    fml_core/realloc.inc \
                    inc_dev/mod_mfaux.mod \
                    inc_dev/mod_prop.mod \
                    inc_dev/rational_numbers.mod
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(F90C) -D_DEVLP $(FPP_FLAGS) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))

obj/mod_physunits.o : mod_physunits.F90 \
                      fml_physunits/find_unit_name.inc \
                      inc_dev/mod_mfarray.mod
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(F90C) -D_DEVLP $(FPP_FLAGS) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))

# this module must be compiled without optimization
obj/mod_ieee.o : mod_ieee.F90 \
                 inc_dev/mod_mfdebug.mod
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
ifeq '$(CFG)' 'debug'
	$(VERB)$(F90C) -D_DEVLP $(FPP_FLAGS) $(INCLUDES) -g -O0 -fno-range-check -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))
else # 'optim'
ifeq '$(X86_64)' '"yes"'
	$(VERB)$(F90C) -D_DEVLP $(FPP_FLAGS) $(INCLUDES) -fPIC -O0 -fno-range-check -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))
else
	$(VERB)$(F90C) -D_DEVLP $(FPP_FLAGS) $(INCLUDES) -O0 -fno-range-check -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))
endif
endif

obj/mod_core.o : mod_core.F90 \
                 fml_core/mf_Out.inc \
                 fml_core/Array.inc \
                 fml_core/Assign.inc \
                 fml_core/Display.inc \
                 fml_core/DisplayColumns.inc \
                 fml_core/Display_bool.inc \
                 fml_core/Display_unit.inc \
                 fml_core/Display_mf_int_list.inc \
                 fml_core/Display_mf_int_list_vec.inc \
                 fml_core/Display_mf_real_list.inc \
                 fml_core/Display_mf_real_list_vec.inc \
                 fml_core/Display_double.inc \
                 fml_core/Display_complex.inc \
                 fml_core/Display_sparse_bool.inc \
                 fml_core/Display_sparse_double.inc \
                 fml_core/Display_sparse_complex.inc \
                 fml_core/Display_with_legend.inc \
                 fml_core/Get.inc \
                 fml_core/Set.inc \
                 fml_core/seq_def_EndIndex.inc \
                 fml_core/Hashes.inc \
                 fml_sparse/CSC_aux.inc \
                 fml_sparse/util/getelm.inc \
                 fml_sparse/util/submat.inc \
                 fml_sparse/util/setelm.inc \
                 fml_sparse/util/xtrcol.inc \
                 fml_sparse/util/nnzxtrcols.inc \
                 fml_sparse/util/xtrcols.inc \
                 fml_sparse/util/xtrrow.inc \
                 fml_sparse/util/sort.inc \
                 fml_sparse/util/chgcol.inc \
                 papi/fpapi.inc \
                 inc_dev/mod_physunits.mod \
                 inc_dev/mod_ieee.mod \
                 misc/suitesparse/umf4_f90wrapper.inc
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(F90C) -D_DEVLP $(FPP_FLAGS) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))

obj/mod_sparse.o : mod_sparse.F90 \
                   fml_sparse/Sparse.inc \
                   fml_sparse/Import.inc \
                   fml_sparse/Export.inc \
                   fml_sparse/SpEye.inc \
                   fml_sparse/SpOnes.inc \
                   fml_sparse/SpDiags.inc \
                   fml_sparse/util/amib.inc \
                   fml_sparse/util/amib1.inc \
                   fml_sparse/util/amux.inc \
                   fml_sparse/util/aplb.inc \
                   fml_sparse/util/aplb1.inc \
                   fml_sparse/util/aplib.inc \
                   fml_sparse/util/aplib1.inc \
                   fml_sparse/util/apply_bin_ops_to_sp_dble.inc \
                   fml_sparse/util/nnzaplb.inc \
                   fml_sparse/util/coo2csc.inc \
                   fml_sparse/util/coo2csc_struct_only.inc \
                   fml_sparse/util/dns2csc.inc \
                   fml_sparse/util/normcols.inc \
                   fml_sparse/util/prtmt.inc \
                   fml_sparse/util/readmt.inc \
                   fml_sparse/util/sqbanded2csc.inc \
                   fml_sparse/util/transp.inc \
                   fml_sparse/util/xmua.inc \
                   fml_sparse/util/spcut.inc \
                   fml_sparse/util/trilsol.inc \
                   fml_sparse/util/triusol.inc \
                   fml_sparse/util/sp_del_0_and_compact.inc \
                   inc_dev/mod_core.mod \
                   misc/suitesparse/spqr_f90wrapper.inc
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(F90C) -D_DEVLP $(FPP_FLAGS) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))

obj/f90_gzlib.o : misc/f90_gzlib/f90_gzlib.F90 \
                  inc_dev/mod_mfdebug.mod \
                  inc_dev/rational_numbers.mod
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(F90C) $(FPP_FLAGS) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))

obj/iso_varying_string.o : misc/iso_varying_string/iso_varying_string.F90
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(F90C) $(FPP_FLAGS) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev

obj/convexhull_mod.o : misc/ConvexHull/convexhull_mod.f90
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(F90C) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev

obj/mod_mf_gsl.o : mod_mf_gsl.F90 \
                   inc_dev/mod_ieee.mod
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(F90C) -D_DEVLP $(FPP_FLAGS) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev

obj/mod_elfun.o : mod_elfun.F90 \
                  inc_dev/mod_slatec_fun.mod \
                  inc_dev/mod_sparse.mod \
                  inc_dev/mod_mf_gsl.mod
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(F90C) -D_DEVLP $(FPP_FLAGS) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))

obj/mod_ops.o : mod_ops.F90 \
                fml_ops/Add.inc \
                fml_ops/Colon.inc \
                fml_ops/CTranspose.inc \
                fml_ops/Div.inc \
                fml_ops/Greater.inc \
                fml_ops/GreaterStrict.inc \
                fml_ops/Less.inc \
                fml_ops/LessStrict.inc \
                fml_ops/Mul.inc \
                fml_ops/Pow.inc \
                fml_ops/Sub.inc \
                fml_ops/Transpose.inc \
                fml_ops/matmul.inc \
                fml_sparse/util/nnzamub.inc \
                fml_sparse/util/amub.inc \
                fml_sparse/util/nnzatmub.inc \
                fml_sparse/util/atmub.inc \
                fml_sparse/util/colperm.inc \
                fml_sparse/util/rowperm.inc \
                fml_sparse/util/colscale.inc \
                fml_sparse/util/rowscale.inc \
                inc_dev/mod_elfun.mod
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(F90C) -D_DEVLP $(FPP_FLAGS) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))

obj/mod_elmat.o : mod_elmat.F90 \
                  fml_ops/horiz_concat.inc \
                  fml_ops/vert_concat.inc \
                  fml_sparse/util/colconcat.inc \
                  fml_sparse/util/colconcat_ip.inc \
                  fml_sparse/util/rowconcat.inc \
                  fml_sparse/util/getdia.inc \
                  fml_sparse/util/getl.inc \
                  fml_sparse/util/getu.inc \
                  fml_sparse/util/reshape.inc \
                  \
                  misc/RngStreams/RngStream_f90wrapper.inc \
                  \
                  inc_dev/mod_ops.mod

	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(F90C) -D_DEVLP $(FPP_FLAGS) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))

obj/mod_fileio.o : mod_fileio.F90 \
                   misc/rational_numbers/rational_config.inc \
                   fml_fileio/msSaveAscii.inc \
                   fml_fileio/mfLoadAscii.inc \
                   fml_fileio/msSave_mfArray.inc \
                   fml_fileio/msSave_mfTriConnect.inc \
                   fml_fileio/mfLoadTriConnect.inc \
                   fml_fileio/mfLoad.inc \
                   fml_fileio/msSaveHDF5.inc \
                   fml_fileio/mfLoadHDF5.inc \
                   fml_fileio/swap_bytes.inc \
                   fml_fileio/msSaveSparse.inc \
                   fml_fileio/mfLoadSparse.inc \
                   fml_fileio/msLoadSparse.inc \
                   fml_polyfun/mfTriConnect.inc \
                   inc_dev/mod_elmat.mod \
                   inc_dev/f90_gzlib.mod \
                   inc_dev/iso_varying_string.mod
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
ifeq '$(HDF5)' '"yes"'
	$(VERB)$(F90C) -D_DEVLP $(FPP_FLAGS) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^)) \
		--f90cache-depmod $(HDF5_F90_DIR)/hdf5.mod
else
	$(VERB)$(F90C) -D_DEVLP $(FPP_FLAGS) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))
endif

obj/gft_common.o : misc/GFT/gft_common.f90
	$(VERB)$(F90C) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev

obj/gft_jmfft.o : misc/GFT/gft_jmfft.f90 \
                  inc_dev/gft_common.mod
	$(VERB)$(F90C) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))

obj/gft_set.o : misc/GFT/gft_set.f90 \
                inc_dev/gft_jmfft.mod
	$(VERB)$(F90C) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))

obj/gft_do.o : misc/GFT/gft_do.f90 \
               inc_dev/gft_jmfft.mod
	$(VERB)$(F90C) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))

obj/gft_end.o : misc/GFT/gft_end.f90 \
                inc_dev/gft_common.mod
	$(VERB)$(F90C) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))

obj/gft.o : misc/GFT/gft.f90 \
            inc_dev/gft_jmfft.mod \
            inc_dev/gft_set.mod \
            inc_dev/gft_do.mod \
            inc_dev/gft_end.mod
	$(VERB)$(F90C) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))

obj/minpack.o : misc/minpack/minpack.F90 \
                misc/minpack/chkder.inc \
                misc/minpack/dogleg.inc \
                misc/minpack/dogleg_sp.inc \
                misc/minpack/enorm.inc \
                misc/minpack/fdjac1.inc \
                misc/minpack/fdjac2.inc \
                misc/minpack/fdjac2_funfit.inc \
                misc/minpack/full_chk_der.inc \
                misc/minpack/full_chk_der_2.inc \
                misc/minpack/hybrd.inc \
                misc/minpack/hybrj_mf.inc \
                misc/minpack/hybrj_sp.inc \
                misc/minpack/lmder_mf.inc \
                misc/minpack/lmdif_funfit.inc \
                misc/minpack/lmdif1_funfit.inc \
                misc/minpack/lmdif.inc \
                misc/minpack/lmpar.inc \
                misc/minpack/qform.inc \
                misc/minpack/qrfac.inc \
                misc/minpack/qrsolv.inc \
                misc/minpack/r1mpyq.inc \
                misc/minpack/r1updt.inc \
                inc_dev/mod_fileio.mod \
                inc_dev/mod_matfun.mod
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(F90C) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))

obj/mod_datafun.o : mod_datafun.F90 \
                    fml_datafun/Max.inc \
                    fml_datafun/Min.inc \
                    fml_datafun/fourier_cos.inc \
                    fml_datafun/fourier_sin.inc \
                    fml_datafun/fft.inc \
                    fml_datafun/ifft.inc \
                    fml_datafun/fft2.inc \
                    fml_datafun/ifft2.inc \
                    fml_datafun/gradient.inc \
                    fml_datafun/Sort.inc \
                    fml_datafun/Stats.inc \
                    fml_datafun/moments.inc \
                    fml_sparse/util/maxab.inc \
                    fml_sparse/util/maxab1.inc \
                    fml_sparse/util/minab.inc \
                    fml_sparse/util/minab1.inc \
                    fml_sparse/util/sumcols.inc \
                    fml_sparse/util/sumrows.inc \
                    inc_dev/mod_elmat.mod \
                    inc_dev/gft.mod
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(F90C) -D_DEVLP $(FPP_FLAGS) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))

obj/mod_specfun.o : mod_specfun.F90 \
                    fml_specfun/cei_double.inc \
                    fml_specfun/erf.inc \
                    inc_dev/mod_datafun.mod
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(F90C) -D_DEVLP $(FPP_FLAGS) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))

obj/mod_matfun.o : mod_matfun.F90 \
                   fml_matfun/Balance.inc \
                   fml_matfun/Chol.inc \
                   fml_matfun/CondEst.inc \
                   fml_matfun/Eig.inc \
                   fml_matfun/Funm.inc \
                   fml_matfun/Expm.inc \
                   fml_matfun/Hess.inc \
                   fml_matfun/Is_Pos_Def.inc \
                   fml_matfun/LDiv.inc \
                   fml_matfun/LDiv_aux.inc \
                   fml_matfun/Logm.inc \
                   fml_matfun/LDLT.inc \
                   fml_matfun/LU.inc \
                   fml_matfun/Norm.inc \
                   fml_matfun/NormEst.inc \
                   fml_matfun/NormEst1.inc \
                   fml_matfun/Null.inc \
                   fml_matfun/Orth.inc \
                   fml_matfun/Powm.inc \
                   fml_matfun/QR.inc \
                   fml_matfun/Rank.inc \
                   fml_matfun/RCond.inc \
                   fml_matfun/RDiv.inc \
                   fml_matfun/RDiv_aux.inc \
                   fml_matfun/Rref.inc \
                   fml_matfun/Schur.inc \
                   fml_matfun/Sqrtm.inc \
                   fml_matfun/Svd.inc \
                   \
                   fml_matfun/mat_vec.inc \
                   fml_matfun/Eigs_which.inc \
                   fml_matfun/Eigs_sigma.inc \
                   fml_matfun/SVDS.inc \
                   fml_sparse/util/norm.inc \
                   fml_sparse/util/symmpattern.inc \
                   fml_sparse/util/isdiag.inc \
                   fml_sparse/util/istril.inc \
                   fml_sparse/util/istriu.inc \
                   \
                   misc/suitesparse/cholmod_f90wrapper.inc \
                   misc/suitesparse/spqr_f90wrapper.inc \
                   \
                   inc_dev/mod_specfun.mod \
                   inc_dev/mod_arpack.mod
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(F90C) -D_DEVLP $(FPP_FLAGS) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))

obj/bezier.o : misc/bezier/bezier.F90 \
               inc_dev/mod_mfarray.mod
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(F90C) -D_DEVLP $(FPP_FLAGS) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))

obj/splines.o : misc/splines/splines.F90
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(F90C) $(FPP_FLAGS) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev

obj/mod_polyfun.o : mod_polyfun.F90 \
                    fml_core/Progress.inc \
                    fml_datafun/fourier_leg.inc \
                    fml_polyfun/mfTriConnect.inc \
                    fml_polyfun/Delaunay.inc \
                    fml_polyfun/FunFit.inc \
                    fml_polyfun/GridData.inc \
                    fml_polyfun/GridData3D.inc \
                    fml_polyfun/Interp1.inc \
                    fml_polyfun/Interp2.inc \
                    fml_polyfun/Poly.inc \
                    fml_polyfun/PolyFit.inc \
                    fml_polyfun/PolyVal.inc \
                    fml_polyfun/PPDer.inc \
                    fml_polyfun/PPVal.inc \
                    fml_polyfun/Spline.inc \
                    inc_dev/minpack.mod \
                    inc_dev/mod_matfun.mod \
                    inc_dev/bezier.mod \
                    inc_dev/splines.mod
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(F90C) -D_DEVLP $(FPP_FLAGS) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))

obj/mod_ddebd2.o : misc/slatec/mod_ddebd2.F90 \
                   inc_dev/mod_mfdebug.mod \
                   inc_dev/mod_mfaux.mod \
                   inc_dev/mod_core.mod \
                   misc/suitesparse/umf4_f90wrapper.inc
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(F90C) -Imisc/suitesparse $(FPP_FLAGS) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))

obj/mod_slatec_aux.o : misc/slatec/mod_slatec_aux.F90 \
      misc/slatec/d1mach.f90 misc/slatec/fdump.f90 misc/slatec/i1mach.f90 \
      misc/slatec/j4save.f90 misc/slatec/xercnt.f90 misc/slatec/xerhlt.f90 \
      misc/slatec/xermsg.f90 misc/slatec/xerprn.f90 misc/slatec/xersve.f90 \
      misc/slatec/xgetua.f90 misc/slatec/xsetf.f90
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(F90C) -Iinc_dev $(FPP_FLAGS) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev

obj/mod_slatec_fun.o : misc/slatec/mod_slatec_fun.F90 \
      misc/slatec/dai.f90 misc/slatec/daie.f90 \
      misc/slatec/d9aimp.f90 misc/slatec/dbi.f90 \
      misc/slatec/dbie.f90 misc/slatec/d9lgmc.f90 misc/slatec/dasyik.f90 \
      misc/slatec/dasyjy.f90 misc/slatec/dbesi.f90 misc/slatec/dbesj.f90 \
      misc/slatec/dbesk.f90 misc/slatec/dbesk0.f90 misc/slatec/dbesk1.f90 \
      misc/slatec/dbesi0.f90 misc/slatec/dbesi1.f90 misc/slatec/dbesy.f90 \
      misc/slatec/dbsi0e.f90 misc/slatec/dbsi1e.f90 misc/slatec/dbsk0e.f90 \
      misc/slatec/dbsk1e.f90 misc/slatec/dbsknu.f90 misc/slatec/dbsynu.f90 \
      misc/slatec/dcsevl.f90 misc/slatec/dgamma.f90 misc/slatec/dgamlm.f90 \
      misc/slatec/dgamln.f90 misc/slatec/djairy.f90 misc/slatec/dlngam.f90 \
      misc/slatec/dqag.f90 misc/slatec/dqag_2.f90 misc/slatec/dqag_3.f90 \
      misc/slatec/dqage.f90 misc/slatec/dqage_2.f90 misc/slatec/dqage_3.f90 \
      misc/slatec/dqags.f90 misc/slatec/dqagse.f90 misc/slatec/dqelg.f90 \
      misc/slatec/dqk15.f90 misc/slatec/dqk21.f90 misc/slatec/dqk31.f90 \
      misc/slatec/dqk41.f90 misc/slatec/dqk51.f90 misc/slatec/dqk61.f90 \
      misc/slatec/dqk15_2.f90 misc/slatec/dqk21_2.f90 misc/slatec/dqk31_2.f90 \
      misc/slatec/dqk41_2.f90 misc/slatec/dqk51_2.f90 misc/slatec/dqk61_2.f90 \
      misc/slatec/dqk15_3.f90 misc/slatec/dqk21_3.f90 misc/slatec/dqk31_3.f90 \
      misc/slatec/dqk41_3.f90 misc/slatec/dqk51_3.f90 misc/slatec/dqk61_3.f90 \
      misc/slatec/dqpsrt.f90 misc/slatec/dyairy.f90 misc/slatec/initds.f90 \
      misc/slatec/zabs.f90 misc/slatec/zacai.f90 misc/slatec/zacon.f90 \
      misc/slatec/zairy.f90 misc/slatec/zasyi.f90 misc/slatec/zbesh.f90 \
      misc/slatec/zbesi.f90 misc/slatec/zbesj.f90 misc/slatec/zbesk.f90 \
      misc/slatec/zbesy.f90 misc/slatec/zbinu.f90 misc/slatec/zbknu.f90 \
      misc/slatec/zbiry.f90 misc/slatec/zbuni.f90 misc/slatec/zbunk.f90 \
      misc/slatec/zdiv.f90 misc/slatec/zexp.f90 misc/slatec/zkscl.f90 \
      misc/slatec/zlog.f90 misc/slatec/zmlt.f90 misc/slatec/zmlri.f90 \
      misc/slatec/zrati.f90 misc/slatec/zs1s2.f90 misc/slatec/zseri.f90 \
      misc/slatec/zshch.f90 misc/slatec/zsqrt.f90 misc/slatec/zuchk.f90 \
      misc/slatec/zunhj.f90 misc/slatec/zuni1.f90 misc/slatec/zuni2.f90 \
      misc/slatec/zunik.f90 misc/slatec/zunk1.f90 misc/slatec/zunk2.f90 \
      misc/slatec/zuoik.f90 misc/slatec/zwrsk.f90 \
      \
      inc_dev/mod_slatec_aux.mod
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(F90C) -Iinc_dev $(FPP_FLAGS) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))

obj/mod_slatec_solve.o : misc/slatec/mod_slatec_solve.F90 \
      misc/slatec/dcfod.f90 misc/slatec/ddaini.F90 misc/slatec/ddajac.F90 \
      misc/slatec/ddanrm.f90 misc/slatec/ddaslv.F90 misc/slatec/ddassl.F90 \
      misc/slatec/ddastp.F90 misc/slatec/ddatrp.f90 misc/slatec/ddawts.f90 \
      misc/slatec/ddeabm.f90 misc/slatec/ddebdf.f90 misc/slatec/dderkf.f90 \
      misc/slatec/ddes.F90 misc/slatec/dfehl.f90 misc/slatec/dgbfa.f90 \
      misc/slatec/dgbsl.f90 misc/slatec/dgefa.f90 misc/slatec/dgesl.f90 \
      misc/slatec/dgeco.f90 misc/slatec/dhstrt.F90 misc/slatec/dhvnrm.f90 \
      misc/slatec/dintp.f90 misc/slatec/dintyd.f90 misc/slatec/dlsod.F90 \
      misc/slatec/dpbfa.f90 misc/slatec/dpbsl.f90 misc/slatec/dpoco.f90 \
      misc/slatec/dpofa.f90 misc/slatec/dposl.f90 misc/slatec/dpjac.F90 \
      misc/slatec/drkfs.F90 misc/slatec/dslvs.f90 misc/slatec/dsteps.f90 \
      misc/slatec/dstod.F90 misc/slatec/dvnrms.f90 \
      \
      inc_dev/mod_slatec_aux.mod \
      inc_dev/mod_ddebd2.mod \
      inc_dev/minpack.mod
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(F90C) -Iinc_dev $(FPP_FLAGS) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))

obj/mod_funfun.o : mod_funfun.F90 \
                   fml_funfun/Quad.inc \
                   fml_funfun/mfOdeSolve_JacDF.inc \
                   fml_funfun/mfOdeSolve_JacUser.inc \
                   fml_funfun/mfOdeSolve_JacUserSP.inc \
                   fml_funfun/msOdeSolve_JacDF.inc \
                   fml_funfun/msOdeSolve_JacUser.inc \
                   fml_funfun/msOdeSolve_JacUserSP.inc \
                   fml_funfun/OdeSolve_aux.inc \
                   fml_funfun/mfDaeSolve_JacDF.inc \
                   fml_funfun/mfDaeSolve_JacUser.inc \
                   fml_funfun/mfDaeSolve_JacUserSP.inc \
                   fml_funfun/msDaeSolve_JacDF.inc \
                   fml_funfun/msDaeSolve_JacUser.inc \
                   fml_funfun/msDaeSolve_JacUserSP.inc \
                   fml_funfun/DaeSolve_aux.inc \
                   fml_funfun/dae_cic_dense.inc \
                   fml_funfun/dae_cic_band.inc \
                   fml_funfun/dae_cic_sparse.inc \
                   fml_funfun/fzero.inc \
                   fml_funfun/FSolve.inc \
                   fml_funfun/LsqNonLin.inc \
                   inc_dev/mod_slatec_solve.mod \
                   inc_dev/mod_matfun.mod \
                   inc_dev/mod_fileio.mod \
                   inc_dev/mod_ddebd2.mod \
                   inc_dev/minpack.mod
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(F90C) -D_DEVLP $(FPP_FLAGS) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))

obj/fml.o : fml.F90 \
            inc_dev/mod_fileio.mod \
            inc_dev/mod_polyfun.mod \
            inc_dev/mod_funfun.mod
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(F90C) -D_DEVLP $(FPP_FLAGS) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))

#-----------------------------------------------------------------------
#--------------------------------- FGL ---------------------------------
#-----------------------------------------------------------------------

FGL_OBJS = obj/fgl_aux.o \
           obj/fgl_aux_2.o \
           \
           obj/mod_win_db.o \
           obj/mod_window.o \
           obj/mod_axes.o \
           obj/mod_grobj.o \
           obj/mod_plot2d.o

obj/mod_win_db.o : fgl/src/mod_win_db.F90 \
                   inc_dev/mod_ieee.mod
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(F90C) -D_DEVLP $(FPP_FLAGS) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))

obj/mod_fgl_mem_debug.o : fgl/src/mod_fgl_mem_debug.F90 \
                          inc_dev/mod_mfdebug.mod \
                          inc_dev/mod_mem_debug.mod \
                          inc_dev/mod_win_db.mod
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(F90C) -D_DEVLP $(FPP_FLAGS) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))

obj/fgl_aux.o : fgl/src/fgl_aux.F90 \
                inc_dev/mod_fgl_mem_debug.mod \
                inc_dev/fml.mod
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(F90C) -D_DEVLP $(FPP_FLAGS) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))

obj/fgl_aux_2.o : fgl/src/fgl_aux_2.F90 \
                  fgl/src/PS_PDF/PatchQuadCore_flat.inc \
                  fgl/src/PS_PDF/PatchQuadCore_shad.inc \
                  fgl/src/PS_PDF/PatchQuadMesh_shad.inc \
                  fgl/src/PS_PDF/PatchRectCore_flat.inc \
                  fgl/src/PS_PDF/PatchTriCore_flat.inc \
                  fgl/src/PS_PDF/PatchTriCore_shad.inc \
                  fgl/src/PS_PDF/PatchTriMesh_shad.inc \
                  fgl/src/PS_PDF/X11_rect_dump.inc \
                  fgl/src/Pix_aux.inc \
                  fgl/src/pg2dproj/pg2dproj_x.inc \
                  fgl/src/pg2dproj/pg2dproj_y.inc \
                  fgl/src/pg2dproj/pg2dproj_matx.inc \
                  fgl/src/pg2dproj/pg2dproj_maty.inc \
                  fgl/src/pg2dproj/pg2dproj_aux.inc \
                  inc_dev/mod_pgplot.mod \
                  inc_dev/mod_win_db.mod \
                  inc_dev/mod_mfarray.mod \
                  inc_dev/mod_fgl_mem_debug.mod
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(F90C) -D_DEVLP $(FPP_FLAGS) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))

obj/mod_window.o : fgl/src/mod_window.F90 \
                   fgl/src/mf_win_aux.F90 \
                   fgl/src/mf_win_redraw.f90 \
                   fgl/src/usr/Arrow_draw.f90 \
                   fgl/src/usr/Bar_draw.f90 \
                   fgl/src/usr/Contour_draw.f90 \
                   fgl/src/usr/ContourF_draw.f90 \
                   fgl/src/usr/ErrorBar_draw.f90 \
                   fgl/src/usr/Image_draw.f90 \
                   fgl/src/usr/Patch_draw.f90 \
                   fgl/src/usr/Pcolor_draw.f90 \
                   fgl/src/usr/Plot_draw.f90 \
                   fgl/src/usr/PlotCubicBezier_draw.f90 \
                   fgl/src/usr/PlotHist_draw.f90 \
                   fgl/src/usr/PlotQuadrBezier_draw.f90 \
                   fgl/src/usr/Quiver_draw.f90 \
                   fgl/src/usr/Spy_draw.f90 \
                   fgl/src/usr/Streamline_draw.f90 \
                   fgl/src/usr/Text_draw.f90 \
                   fgl/src/usr/TriContour_draw.f90 \
                   fgl/src/usr/TriContourF_draw.f90 \
                   fgl/src/usr/TriFill_draw.f90 \
                   fgl/src/usr/TriMesh_draw.f90 \
                   fgl/src/usr/TriPcolor_draw.f90 \
                   fgl/src/usr/TriQuiver_draw.f90 \
                   fgl/src/usr/PlotPLdomain_draw.f90 \
                   fgl/src/usr/Legend_aux.f90 \
                   fgl/src/usr/Close.f90 \
                   fgl/src/usr/ExitFgl.f90 \
                   fgl/src/usr/Figure.f90 \
                   fgl/src/usr/InitFgl.f90 \
                   fgl/src/usr/SetBackgroundColor.f90 \
                   fgl/src/usr/GetX11Device.f90 \
                   fgl/src/usr/SetX11Device.F90 \
                   inc_dev/fgl_aux.mod \
                   inc_dev/fgl_aux_2.mod \
                   inc_dev/mod_pgplot.mod
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(F90C) -I./fgl/src/usr -D_DEVLP $(FPP_FLAGS) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))

obj/mod_axes.o : fgl/src/mod_axes.F90 \
                 fgl/src/usr/Axis.f90 \
                 fgl/src/usr/AxisFontSize.f90 \
                 fgl/src/usr/AxisLabelFormat.f90 \
                 fgl/src/usr/AxisLineWidth.f90 \
                 fgl/src/usr/CharInPixels.f90 \
                 fgl/src/usr/Cla.f90 \
                 fgl/src/usr/Clf.f90 \
                 fgl/src/usr/ColorAxis.f90 \
                 fgl/src/usr/ColorBar.f90 \
                 fgl/src/usr/ColorMap.f90 \
                 fgl/src/usr/ColorMapSize.f90 \
                 fgl/src/usr/DrawBox.f90 \
                 fgl/src/usr/DrawGrid.f90 \
                 fgl/src/usr/GetModKeys.f90 \
                 fgl/src/usr/DefineCustomCursors.f90 \
                 fgl/src/usr/GetX11Pixmap.f90 \
                 fgl/src/usr/Ginput.f90 \
                 fgl/src/usr/GinputRect.f90 \
                 fgl/src/usr/GinputCustom.f90 \
                 fgl/src/usr/Grid.f90 \
                 fgl/src/usr/Hold.f90 \
                 fgl/src/usr/LabelFontSize.f90 \
                 fgl/src/usr/TitleFontSize.f90 \
                 fgl/src/usr/Legend.F90 \
                 fgl/src/usr/Print.f90 \
                 fgl/src/usr/Print_aux.F90 \
                 fgl/src/usr/RedrawFigure.f90 \
                 fgl/src/usr/RemoveClipBox.f90 \
                 fgl/src/usr/ResizeWindow.f90 \
                 fgl/src/usr/SetClipBox.f90 \
                 fgl/src/usr/SetWinProp.f90 \
                 fgl/src/usr/Title.F90 \
                 fgl/src/usr/XLabel.F90 \
                 fgl/src/usr/YLabel.F90 \
                 tmp/mfLegend.f90            tmp/msLegend.f90 \
                 tmp/mfTitle.f90             tmp/msTitle.f90 \
                 tmp/mfXLabel.f90            tmp/msXLabel.f90 \
                 tmp/mfYLabel.f90            tmp/msYLabel.f90 \
                 \
                 inc_dev/mod_window.mod
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(F90C) -I./fgl/src/usr -I./tmp -D_DEVLP $(FPP_FLAGS) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))

obj/mod_grobj.o : fgl/src/mod_grobj.F90 \
                  fgl/src/usr/Animation.f90 \
                  fgl/src/usr/ShowNow.f90 \
                  fgl/src/usr/AttributesManagement.f90 \
                  fgl/src/usr/BBuf.f90 \
                  fgl/src/usr/EBuf.f90 \
                  fgl/src/usr/GetWinId.f90 \
                  fgl/src/usr/MoveLegend.f90 \
                  fgl/src/usr/PanAndZoom.f90 \
                  fgl/src/usr/Pan.f90 \
                  fgl/src/usr/RemoveGrObj.f90 \
                  fgl/src/usr/SetGBuffer.f90 \
                  fgl/src/usr/GetAllGrObj.f90 \
                  fgl/src/usr/GetTypeGrObj.f90 \
                  fgl/src/usr/SelectTypeGrObj.f90 \
                  fgl/src/usr/SetGrObj.f90 \
                  fgl/src/usr/SetGrObj_aux.f90 \
                  fgl/src/usr/SetPdfOC.f90 \
                  fgl/src/usr/Zoom.f90 \
                  fgl/src/usr/MoveGrObj.f90 \
                  fgl/src/usr/MoveGrObj_aux.f90 \
                  inc_dev/mod_axes.mod
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(F90C) -I./fgl/src/usr -D_DEVLP $(FPP_FLAGS) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))

obj/mod_plot2d.o : fgl/src/mod_plot2d.F90 \
                   fgl/src/usr/Bar.F90 \
                   fgl/src/usr/Bar_aux.f90 \
                   fgl/src/usr/Contour_aux.f90 \
                   fgl/src/usr/ContourF_aux.f90 \
                   fgl/src/usr/CumulHist.f90 \
                   fgl/src/usr/ErrorBar.F90 \
                   fgl/src/usr/ErrorBar_aux.f90 \
                   fgl/src/usr/Image_aux.f90 \
                   fgl/src/usr/ImRead.F90 \
                   fgl/src/usr/ImRead_aux.f90 \
                   fgl/src/usr/ImRead_aux2.F90 \
                   fgl/src/usr/ImWrite.F90 \
                   fgl/src/usr/ImWrite_aux.f90 \
                   fgl/src/usr/ImWrite_aux2.F90 \
                   fgl/src/usr/Patch_aux.f90 \
                   fgl/src/usr/Pcolor_aux.f90 \
                   fgl/src/usr/Quiver_aux.f90 \
                   fgl/src/usr/Plot_aux.f90 \
                   fgl/src/usr/PlotCubicBezier_aux.f90 \
                   fgl/src/usr/PlotCubicSpline_aux.f90 \
                   fgl/src/usr/PlotQuadrBezier_aux.f90 \
                   fgl/src/usr/Shading.f90 \
                   fgl/src/usr/Spy_aux.f90 \
                   fgl/src/usr/Streamline_aux.f90 \
                   fgl/mfplot/src/TriStream/TriStream.inc \
                   fgl/src/usr/Text_aux.f90 \
                   fgl/src/usr/TriContour_aux.f90 \
                   fgl/src/usr/TriContourF_aux.f90 \
                   fgl/src/usr/TriContourF_aux2.f90 \
                   fgl/src/usr/TriFill_aux.f90 \
                   fgl/src/usr/TriMesh_aux.f90 \
                   fgl/src/usr/TriPcolor_aux.f90 \
                   fgl/src/usr/TriQuiver_aux.f90 \
                   fgl/src/usr/PlotPLdomain_aux.f90 \
                   tmp/mfArrow.f90           tmp/msArrow.f90 \
                   tmp/mfBar.f90             tmp/msBar.f90 \
                   tmp/mfContour.f90         tmp/msContour.f90 \
                   tmp/mfContourF.f90        tmp/msContourF.f90 \
                   tmp/mfErrorBar.f90        tmp/msErrorBar.f90 \
                   tmp/mfImage.f90           tmp/msImage.f90 \
                   tmp/mfPatch.f90           tmp/msPatch.f90 \
                   tmp/mfPcolor.f90          tmp/msPcolor.f90 \
                   tmp/mfQuiver.f90          tmp/msQuiver.f90 \
                   tmp/mfPlot.f90            tmp/msPlot.f90 \
                   tmp/mfPlotCubicBezier.f90 tmp/msPlotCubicBezier.f90 \
                   tmp/mfPlotCubicSpline.f90 tmp/msPlotCubicSpline.f90 \
                   tmp/mfPlotHist.f90        tmp/msPlotHist.f90 \
                   tmp/mfPlotQuadrBezier.f90 tmp/msPlotQuadrBezier.f90 \
                   tmp/mfSpy.f90             tmp/msSpy.f90 \
                   tmp/mfStreamline.f90      tmp/msStreamline.f90 \
                   tmp/mfText.f90            tmp/msText.f90 \
                   tmp/mfTriContour.f90      tmp/msTriContour.f90 \
                   tmp/mfTriContourF.f90     tmp/msTriContourF.f90 \
                   tmp/mfTriFill.f90         tmp/msTriFill.f90 \
                   tmp/mfTriMesh.f90         tmp/msTriMesh.f90 \
                   tmp/mfTriPcolor.f90       tmp/msTriPcolor.f90 \
                   tmp/mfTriQuiver.f90       tmp/msTriQuiver.f90 \
                   tmp/mfTriStreamline.f90   tmp/msTriStreamline.f90 \
                   tmp/mfPlotPLdomain.f90    tmp/msPlotPLdomain.f90 \
                   \
                   inc_dev/mod_grobj.mod
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(F90C) -I./fgl/src/usr -I./tmp -D_DEVLP $(FPP_FLAGS) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))

#---------------------------- preprocessing ----------------------------

tmp/mf%.f90 : fgl/src/usr/%.F90
	@$(FPP) $(FPP_DEBUG_FLAGS) -D_MF_FUNC $(FPP_FLAGS) $< $(FPP_OUT) $@

tmp/ms%.f90 : fgl/src/usr/%.F90
	@$(FPP) $(FPP_DEBUG_FLAGS) -D_MF_SUBR $(FPP_FLAGS) $< $(FPP_OUT) $@

#-----------------------------------------------------------------------
#-----------------------------------------------------------------------
#-----------------------------------------------------------------------

ifeq '$(COLORED_TERM)' '"yes"'
  # escape sequence to active colors in the terminal
  COLOR_NORMAL =@echo $(ECHO_OPT) -n "\033[0m"
  COLOR_RED    =@echo $(ECHO_OPT) -n "\033[1;31m"
  COLOR_PURPLE =@echo $(ECHO_OPT) -n "\033[1;35m"
  COLOR_GRAY   =@echo $(ECHO_OPT) -n "\033[0;37m"
  COLOR_YELLOW =@echo $(ECHO_OPT) -n "\033[1;33m"
endif

suitesparse :
	@echo
	$(COLOR_RED)
	@echo "                      ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓"
	@echo "                      ┃       num. lib. subparts       ┃"
	@echo "                      ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛"
	$(COLOR_NORMAL)
	@echo
	$(VERB)(cd misc/suitesparse && $(MAKE))

arpack-2 :
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making Arpack: \c"
	$(VERB)(cd misc/arpack && $(MAKE))

minpack-2 :
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making Minpack: \c"

ConvexHull :
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making ConvexHull: \c"

GFT-2 :
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making GFT: \c"

ACM-2 :
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making ACM: \c"
	$(VERB)(cd misc/ACM && $(MAKE))
	@echo $(ECHO_OPT) "\r                                                      \c"
	$(COLOR_PURPLE)
	@echo $(ECHO_OPT) "\r  → done"
	$(COLOR_NORMAL)

mfplot : obj/mod_mfaux.o
	$(COLOR_RED)
	@echo "                      ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓"
	@echo "                      ┃         MFPLOT subpart         ┃"
	@echo "                      ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛"
	$(COLOR_NORMAL)
	@echo
	@echo $(ECHO_OPT) "\r  ... making MFPLOT: \c"
	$(VERB)(cd fgl/mfplot && $(MAKE))
	@echo $(ECHO_OPT) "\r                                                      \c"
	$(COLOR_PURPLE)
	@echo $(ECHO_OPT) "\r  → done"
	$(COLOR_NORMAL)

# debugging purpose in tests/ : access to all vars.
dist_fml : inc_dev/fml.mod
	@echo $(ECHO_OPT) "\r                                                      \c"
	$(COLOR_PURPLE)
	@echo $(ECHO_OPT) "\r  → done"
	$(COLOR_NORMAL)
	@echo

ifeq '$(CFG)' 'debug'
FGL_OBJS += obj/mod_fgl_mem_debug.o
endif

# debugging purpose in tests/ : access to all vars.
dist_fgl : inc_dev/fgl.mod
	@rm -f tmp/tmp.F90
	@echo $(ECHO_OPT) "\r                                                      \c"
	$(COLOR_PURPLE)
	@echo $(ECHO_OPT) "\r  → done"
	$(COLOR_NORMAL)
	@echo

FML_part :
	@echo
	$(COLOR_RED)
	@echo "                      ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓"
	@echo "                      ┃            FML part            ┃"
	@echo "                      ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛"
	$(COLOR_NORMAL)
	@echo

dummy_papi : obj/dummy_papi.o

obj/dummy_papi.o : papi/dummy_papi.F90
	$(VERB)$(F90C) $(FPP_FLAGS) $(F90_FLAGS) -c $< -o $@

lib/libfml.a : $(FML_OBJS)
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)rm -f $@
	$(VERB)ar cr $@ $(FML_OBJS) misc/suitesparse/obj/*.o \
		misc/arpack/obj/*.o misc/ACM/obj/*.o obj/dummy_papi.o

LDOPT_FML_SO = -lz -lrt \
	-lreadline -lhistory \
	-Wl,-rpath,$(LAPACK_DIR) -L$(LAPACK_DIR) -llapack \
	-Wl,-rpath,$(BLAS_DIR) -L$(BLAS_DIR) -lblas

ifeq '$(F90_LIB_DIR)' ''
  LDOPT_FML_SO += -lstdc++
else
  LDOPT_FML_SO += -Wl,-rpath,$(F90_LIB_DIR) -L$(F90_LIB_DIR) -lstdc++ -lgfortran
endif

lib/libfml.so : $(FML_OBJS)
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(C_COMP) -shared -o $@ $(FML_OBJS) misc/suitesparse/obj/*.o \
		misc/arpack/obj/*.o misc/ACM/obj/*.o obj/dummy_papi.o \
		$(LDOPT_FML_SO)

inc_dev/fml.mod : fml.F90 \
                  inc_dev/mod_fileio.mod \
                  inc_dev/mod_funfun.mod \
                  inc_dev/mod_polyfun.mod
	$(VERB)$(F90C) $(FPP_FLAGS) $(INCLUDES) $(MODULE_ONLY) $< $(MOD_TO)inc_dev

FGL_part :
	@echo
	$(COLOR_RED)
	@echo "                      ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓"
	@echo "                      ┃            FGL part            ┃"
	@echo "                      ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛"
	$(COLOR_NORMAL)
	@echo

lib/libfgl.a : $(FGL_OBJS)
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)rm -f $@
	$(VERB)ar cr $@ $^

lib/libfgl.so : $(FGL_OBJS)
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(C_COMP) -shared -o $@ $^ \
		-L./lib -lfml -lmfplot -Wl,-rpath,"\$$ORIGIN"

inc_dev/fgl.mod : fgl/src/fgl.F90 \
                  inc_dev/mod_plot2d.mod
	$(VERB)$(F90C) $(FPP_FLAGS) $(INCLUDES) $(MODULE_ONLY) $< $(MOD_TO)inc_dev

#----------------------------- C stuffs --------------------------------

obj/get_term_col.o : C/get_term_col.c
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(CC) $(WRAPPER_FLAGS) $(CC_FLAGS) -c $< -o $@

obj/show_backtrace.o : show_backtrace.c
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(CC) $(CC_FLAGS) -c $< -o $@

obj/set_rounding_mode.o : C/set_rounding_mode.c
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(CC) $(WRAPPER_FLAGS) $(CC_FLAGS) -c $< -o $@

obj/fp_exceptions.o : C/fp_exceptions.c
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(CC) $(WRAPPER_FLAGS) $(CC_FLAGS) -c $< -o $@

obj/zlib_f90.o : misc/f90_gzlib/zlib_f90.c
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(CC) $(WRAPPER_FLAGS) -I$(ZLIB_INCL) $(CC_FLAGS) -c $< -o $@

obj/RngStream.o : misc/RngStreams/RngStream.c
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(CC) $(CC_FLAGS) -c $< -o $@

obj/RngStream_f90wrapper.o : misc/RngStreams/RngStream_f90wrapper.c
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(CC) $(WRAPPER_FLAGS) $(CC_FLAGS) -c $< -o $@

obj/umf4_f90wrapper.o : misc/suitesparse/umf4_f90wrapper.c
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(CC) $(WRAPPER_FLAGS) $(CC_FLAGS) \
		-Imisc/suitesparse/AMD/Include \
		-Imisc/suitesparse/UMFPACK/Include \
		-Imisc/suitesparse/SuiteSparse_config \
		-c $< -o $@

obj/amd_f90wrapper.o : misc/suitesparse/amd_f90wrapper.c
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(CC) $(WRAPPER_FLAGS) $(CC_FLAGS) \
		-Imisc/suitesparse/AMD/Include \
		-Imisc/suitesparse/SuiteSparse_config \
		-c $< -o $@

obj/cholmod_f90wrapper.o : misc/suitesparse/cholmod_f90wrapper.c
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(CC) $(WRAPPER_FLAGS) $(CC_FLAGS) \
		-Imisc/suitesparse/CHOLMOD/Include \
		-Imisc/suitesparse/SuiteSparse_config \
		-c $< -o $@

obj/spqr_f90wrapper.o : misc/suitesparse/spqr_f90wrapper.cpp
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(CPLUSPLUS) $(WRAPPER_FLAGS) $(CC_FLAGS) \
		-Imisc/suitesparse/SuiteSparse_config \
		-Imisc/suitesparse/CHOLMOD/Include \
		-Imisc/suitesparse/SPQR/Include \
		-c $< -o $@

obj/triangle.o : misc/delaunay/2d/triangle.c
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(CC) -DTRILIBRARY $(CC_FLAGS) -c $< -o $@

obj/triangle_delaunay.o : misc/delaunay/2d/triangle_delaunay.c
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(CC) $(WRAPPER_FLAGS) $(CPP_FLAGS) $(CC_FLAGS) -c $< -o $@

obj/del-tree3.o : misc/delaunay/3d/del-tree3.cpp
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(CPLUSPLUS) $(CC_FLAGS) -c $< -o $@

obj/del-tree3_f90wrapper.o : misc/delaunay/3d/del-tree3_f90wrapper.cpp
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(CPLUSPLUS) $(WRAPPER_FLAGS) $(CC_FLAGS) -c $< -o $@

obj/crc32.o : misc/crc32/crc32.s
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(CC) $(CC_FLAGS) -c $< -o $@

obj/icrc32.o : misc/crc32/icrc32.c
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(CC) $(WRAPPER_FLAGS) $(CC_FLAGS) -c $< -o $@

obj/crc32_adler.o : misc/crc32/crc32_adler.c
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(CC) $(WRAPPER_FLAGS) $(CC_FLAGS) -c $< -o $@

obj/readline_c.o : misc/f90readline/readline_c.c
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(CC) $(WRAPPER_FLAGS) $(CC_FLAGS) -c $< -o $@

inc_dev/mod_pgplot.mod : mfplot

#------------------------ distribution include -------------------------

dist_fml : include/fml.mod

# special behavior of the GNU Fortran compiler: the final module file
# 'fml.mod' includes explicitely some 'used' modules.
include/fml.mod : fml.F90 \
                  include/mod_fileio.mod \
                  include/mod_funfun.mod \
                  include/mod_polyfun.mod
	$(VERB)$(F90C) -w $(FPP_FLAGS) -I./include $(MODULE_ONLY) $< \
	  $(MOD_TO)include

include/mod_fileio.mod : mod_fileio.F90 \
                  include/mod_elmat.mod \
                  include/mod_mfarray.mod \
                  include/mod_core.mod
	cp inc_dev/iso_varying_string.mod include/
	cp inc_dev/f90_gzlib.mod include/ 2> /dev/null || :
	cp inc_dev/hdf5.mod include/ 2> /dev/null || :
	$(VERB)$(F90C) -w $(FPP_FLAGS) -I./include $(MODULE_ONLY) $< \
	  $(MOD_TO)include

include/mod_elmat.mod : mod_elmat.F90 \
                  include/mod_ops.mod \
                  include/mod_mfarray.mod \
                  include/mod_core.mod
	$(VERB)$(F90C) -w $(FPP_FLAGS) -I./include $(MODULE_ONLY) $< \
	  $(MOD_TO)include

include/mod_ops.mod : mod_ops.F90 \
                  include/mod_elfun.mod \
                  include/mod_mfarray.mod \
                  include/mod_physunits.mod
	$(VERB)$(F90C) -w $(FPP_FLAGS) -I./include $(MODULE_ONLY) $< \
	  $(MOD_TO)include

include/mod_elfun.mod : mod_elfun.F90 \
                  include/mod_sparse.mod \
                  include/mod_mfarray.mod \
                  include/mod_core.mod
	cp inc_dev/mod_mf_gsl.mod include/
	cp inc_dev/mod_slatec_fun.mod include/
	$(VERB)$(F90C) -w $(FPP_FLAGS) -I./include $(MODULE_ONLY) $< \
	  $(MOD_TO)include

include/mod_sparse.mod : mod_sparse.F90 \
                  include/mod_core.mod \
                  include/mod_mfarray.mod
	$(VERB)$(F90C) -w $(FPP_FLAGS) -I./include $(MODULE_ONLY) $< \
	  $(MOD_TO)include

include/mod_core.mod : mod_core.F90 \
                  include/mod_physunits.mod \
                  include/mod_mfarray.mod
	cp inc_dev/mod_ieee.mod include/
	cp inc_dev/mod_mfdebug.mod include/
	$(VERB)$(F90C) -w $(FPP_FLAGS) -I./include $(MODULE_ONLY) $< \
	  $(MOD_TO)include

include/mod_physunits.mod : mod_physunits.F90 \
                  include/mod_mfarray.mod
	$(VERB)$(F90C) -w $(FPP_FLAGS) -I./include $(MODULE_ONLY) $< \
	  $(MOD_TO)include

include/mod_mfarray.mod : mod_mfarray.F90
	cp inc_dev/rational_numbers.mod include/
	cp inc_dev/mod_prop.mod include/
	cp inc_dev/mod_mfaux.mod include/
	$(VERB)$(F90C) -w $(FPP_FLAGS) -I./include $(MODULE_ONLY) $< \
	  $(MOD_TO)include

include/mod_funfun.mod : mod_funfun.F90 \
                  include/mod_matfun.mod \
                  include/mod_fileio.mod \
                  include/mod_mfarray.mod \
                  include/mod_core.mod
	cp inc_dev/mod_slatec_solve.mod include/
	cp inc_dev/mod_ddebd2.mod include/
	cp inc_dev/minpack.mod include/
	$(VERB)$(F90C) -w $(FPP_FLAGS) -I./include $(MODULE_ONLY) $< \
	  $(MOD_TO)include

include/mod_matfun.mod : mod_matfun.F90 \
                  include/mod_specfun.mod \
                  include/mod_mfarray.mod \
                  include/mod_core.mod
	cp inc_dev/mod_arpack.mod include/
	$(VERB)$(F90C) -w $(FPP_FLAGS) -I./include $(MODULE_ONLY) $< \
	  $(MOD_TO)include

include/mod_specfun.mod : mod_specfun.F90 \
                  include/mod_datafun.mod \
                  include/mod_mfarray.mod \
                  include/mod_core.mod
	$(VERB)$(F90C) -w $(FPP_FLAGS) -I./include $(MODULE_ONLY) $< \
	  $(MOD_TO)include

include/mod_datafun.mod : mod_datafun.F90 \
                  include/mod_elmat.mod \
                  include/mod_mfarray.mod \
                  include/mod_core.mod
	cp inc_dev/gft.mod include/
	$(VERB)$(F90C) -w $(FPP_FLAGS) -I./include $(MODULE_ONLY) $< \
	  $(MOD_TO)include

include/mod_polyfun.mod : mod_polyfun.F90 \
                  include/mod_matfun.mod \
                  include/mod_fileio.mod \
                  include/mod_mfarray.mod \
                  include/mod_core.mod
	cp inc_dev/splines.mod include/
	cp inc_dev/bezier.mod include/
	$(VERB)$(F90C) -w $(FPP_FLAGS) -I./include $(MODULE_ONLY) $< \
	  $(MOD_TO)include




dist_fgl : include/fgl.mod

# special behavior of the GNU Fortran compiler: the final module file
# 'fgl.mod' includes explicitely some 'used' modules.
include/fgl.mod : fgl/src/fgl.F90 \
                  inc_dev/mod_plot2d.mod
	$(VERB)$(F90C) -w $(FPP_FLAGS) $(INCLUDES) $(MODULE_ONLY) $< \
		$(patsubst %,--f90cache-depmod %,$(filter %.mod, $^))
	@mv fgl.mod include/

#-----------------------------------------------------------------------

# meditor (graphical tool to edit matrices) uses only gcc and Qt lib.
.PHONY : meditor

ifeq '$(QT4_QMAKE)' '"yes"'
meditor : meditor/meditor.pro
	$(COLOR_RED)
	@echo "                      ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓"
	@echo "                      ┃           misc tools           ┃"
	@echo "                      ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛"
	$(COLOR_NORMAL)
	@echo
	@(cd meditor && $(QT4DIR)/bin/qmake && $(MAKE))
	@echo $(ECHO_OPT) "\r                                                      \c"
	$(COLOR_PURPLE)
	@echo $(ECHO_OPT) "\r  → done"
	$(COLOR_NORMAL)
	@echo
endif

#============= no direct automatic rules when using cache ==============
#                   (except for recursive make)

# special rule to avoid recompiling (recursive-make)
inc_dev/%.mod : obj/%.o
	@if [ ! -f $@ ]; then \
		rm $< ; \
		$(MAKE) $< ; \
	fi

#=======================================================================

ifeq '$(PAPI)' '"yes"'
  PAPI_LIBS = $(PAPI_DIR)/libpapi.a
else # linux kernel not patched with PERFCTR, or PAPI not installed
  # in this case, dummy_papi.o is integrated in libfml
  PAPI_LIBS =
endif

ifeq '$(NEED_TERMCAP)' '"yes"'
  TERMCAP_LIB = -ltermcap
else # recent READLINE library doesn't include TERMCAP
  TERMCAP_LIB =
endif

ifeq '$(CFG)' 'debug'
  ifeq '$(HDF5)' '"yes"'
    HDF5_LIBS_SUBS = $(HDF5_F90_DIR)/libhdf5_fortran.a -L$(HDF5_1_6) -lhdf5
    HDF5_STAT_LIBS_SUBS = $(HDF5_F90_DIR)/libhdf5_fortran.a $(HDF5_1_6)/libhdf5.a
  endif
  ifeq '$(FGL)' 'no' # FML -- debug
    MUESLI_LIBS_SUBS = -L$(INSTALL_DIR) -lfml
    MUESLI_STAT_LIBS_SUBS = $(INSTALL_DIR)/libfml.a
  else # FML + FGL -- debug
    MUESLI_LIBS_SUBS = -L$(INSTALL_DIR) -lfgl -lfml -lmfplot
    MUESLI_STAT_LIBS_SUBS = $(INSTALL_DIR)/libfgl.a $(INSTALL_DIR)/libfml.a $(INSTALL_DIR)/libmfplot.a
  endif
  ifeq '$(PROF)' 'yes'
    MUESLI_LIBS_SUBS += -pg
    MUESLI_STAT_LIBS_SUBS += -pg
  endif
else # 'optim'
  ifeq '$(HDF5)' '"yes"'
    HDF5_LIBS_SUBS = -Wl,-rpath,$(HDF5_F90_DIR) -L$(HDF5_F90_DIR) -lhdf5_fortran -Wl,-rpath,$(HDF5_1_6) -L$(HDF5_1_6) -lhdf5
    HDF5_STAT_LIBS_SUBS = $(HDF5_F90_DIR)/libhdf5_fortran.a $(HDF5_1_6)/libhdf5.a
  endif
  ifeq '$(FGL)' 'no' # FML -- optim
    MUESLI_LIBS_SUBS = -Wl,-rpath,$(INSTALL_DIR) -L$(INSTALL_DIR) -lfml
    MUESLI_STAT_LIBS_SUBS = $(INSTALL_DIR)/libfml.a
  else # FML + FGL -- optim
    # mfplot already linked in the shared version of libfgl
    MUESLI_LIBS_SUBS = -Wl,-rpath,$(INSTALL_DIR) -L$(INSTALL_DIR) -lfgl -lfml
    MUESLI_STAT_LIBS_SUBS = $(INSTALL_DIR)/libfgl.a $(INSTALL_DIR)/libfml.a $(INSTALL_DIR)/libmfplot.a
  endif
endif

ifeq '$(CFG)' 'debug'
  ifneq '$(FGL)' 'no' # FML + FGL
    ifeq '$(X11_DIR)' '/usr/lib'
      X11_LIBS_SUBS = -lfreetype -lfontconfig -lXrender -lX11
    else ifeq '$(X11_DIR)' '/usr/lib/x86_64-linux-gnu'
      X11_LIBS_SUBS = -lfreetype -lfontconfig -lXrender -lX11
    else
      X11_LIBS_SUBS = -L$(X11_DIR) -lfreetype -lfontconfig -lXrender -lX11
    endif
  endif
else # 'optim'
  # X11 libraries already linked in the shared version of libfml
  X11_LIBS_SUBS =
endif

ifeq '$(CFG)' 'debug'
  ifeq '$(LAPACK_DIR)' '$(BLAS_DIR)'
    ifeq '$(LAPACK_DIR)' '/usr/lib'
      LAPACK_LIBS_SUBS = -llapack -lblas
    else ifeq '$(LAPACK_DIR)' '/usr/lib/x86_64-linux-gnu'
      LAPACK_LIBS_SUBS = -llapack -lblas
    else
      LAPACK_LIBS_SUBS = -Wl,-rpath,$(LAPACK_DIR) -L$(LAPACK_DIR) -llapack -lblas
    endif
    BLAS_LIBS_SUBS =
  else
    ifeq '$(LAPACK_DIR)' '/usr/lib'
      LAPACK_LIBS_SUBS = -llapack
    else ifeq '$(LAPACK_DIR)' '/usr/lib/x86_64-linux-gnu'
      LAPACK_LIBS_SUBS = -llapack
    else
      LAPACK_LIBS_SUBS = -Wl,-rpath,$(LAPACK_DIR) -L$(LAPACK_DIR) -llapack
    endif
    ifeq '$(BLAS_DIR)' '/usr/lib'
      BLAS_LIBS_SUBS = -lblas
    else ifeq '$(BLAS_DIR)' '/usr/lib/x86_64-linux-gnu'
      BLAS_LIBS_SUBS = -lblas
    else
      BLAS_LIBS_SUBS = -Wl,-rpath,$(BLAS_DIR) -L$(BLAS_DIR) -lblas
    endif
  endif
else # 'optim'
  # Blas and Lapack already linked in the shared version of libfml
  LAPACK_LIBS_SUBS =
  BLAS_LIBS_SUBS =
endif

ifeq '$(F90_LIB_DIR)' ''
  F90_LIB_SUBS =
else # not empty
  F90_LIB_SUBS = -Wl,-rpath,$(F90_LIB_DIR) -L$(F90_LIB_DIR) -lgfortran
endif

ifeq '$(HDF5_F90_DIR)' ''
  # avoids "-I" in f90flags which may leads to error
  HDF5_F90_DIR =.
endif

# only for information
BLAS_LIB_CONFIG = $(BLAS_DIR)
LAPACK_LIB_CONFIG = $(LAPACK_DIR)

ifeq '$(CFG)' 'debug'
  ifeq '$(ZLIB_DIR)' '/usr/lib'
    ZLIB_LIBS_SUBS = -lz
  else ifeq '$(ZLIB_DIR)' '/usr/lib/x86_64-linux-gnu'
    ZLIB_LIBS_SUBS = -lz
  else
    ZLIB_LIBS_SUBS = -L$(ZLIB_DIR) -lz
  endif
else # 'optim'
  # Zlib already linked in the shared version of libfml
  ZLIB_LIBS_SUBS =
endif

ifeq '$(CFG)' 'debug'
  ifeq '$(READLINE)' '"yes"'
    ifeq '$(DARWIN)' '"yes"'
      READLINE_LIB += -lreadline
    else
      READLINE_LIB += -lreadline -lhistory
    endif
  endif
else # 'optim'
  # Readline and history already linked in the shared version of libfml
  READLINE_LIB =
endif

ifeq '$(CFG)' 'debug'
  ifeq '$(NEED_LRT)' '"yes"'
    ifeq '$(DARWIN)' '"no"'
      RT_LIB_SUBS += -lrt
    endif
  endif
else # 'optim'
  # RT lib already linked in the shared version of libfml
  RT_LIB_SUBS =
endif

ifeq '$(CFG)' 'debug'
  PTHREAD_LIB = -lpthread
else # 'optim'
  # Pthread lib already linked in the shared version of libfml
  PTHREAD_LIB =
endif

ifeq '$(CFG)' 'debug'
  LIBSTDCPP_SUBS = -lstdc++
else # 'optim'
  # Stdc++ lib already linked in the shared version of libfml
  LIBSTDCPP_SUBS =
endif

ifeq '$(FGL)' 'no'
  STATIC_LIBS = lib/libfml.a
  DYN_LIBS = lib/libfml.so
else
  STATIC_LIBS = lib/libfml.a lib/libmfplot.a lib/libfgl.a
  DYN_LIBS = lib/libfml.so lib/libmfplot.so lib/libfgl.so
endif

muesli-config : muesli-config.in check_opts ../VERSION
	@cat $< | sed -e "s+@PREFIX@+$(INSTALL_DIR)+" \
		| sed -e "s+@F90C@+$(F90_COMP)+" \
		| sed -e "s+@PP_FLAG@+-D_$(F90C_TAG)+" \
		| sed -e "s+@F90FLAGS@+$(F90_FLAGS)+" \
		| sed -e "s+@MOD_INC_FLAG@+-I+" \
		| sed -e "s+@HDF5@+$(HDF5_F90_DIR)+" \
		| sed -e "s+@HDF5_LIBS@+$(HDF5_LIBS_SUBS)+" \
		| sed -e "s+@HDF5_STAT_LIBS@+$(HDF5_STAT_LIBS_SUBS)+" \
		| sed -e "s+@MUESLI_LIBS@+$(MUESLI_LIBS_SUBS)+" \
		| sed -e "s+@MUESLI_STAT_LIBS@+$(MUESLI_STAT_LIBS_SUBS)+" \
		| sed -e "s+@BLAS_LAPACK@+$(LAPACK_LIBS_SUBS) $(BLAS_LIBS_SUBS) $(ADD_LIB)+" \
		| sed -e "s+@BLAS_LAPACK_STAT@+$(LAPACK_DIR)/liblapack.a $(BLAS_DIR)/libblas.a $(ADD_LIB)+" \
		| sed -e "s+@BLAS_LIB@+$(BLAS_LIB_CONFIG)+" \
		| sed -e "s+@LAPACK_LIB@+$(LAPACK_LIB_CONFIG)+" \
		| sed -e "s+@X11_LIBS@+$(X11_LIBS_SUBS)+" \
		| sed -e "s+@ZLIB_LIBS@+$(ZLIB_LIBS_SUBS)+" \
		| sed -e "s+@READLINE_LIB@+$(READLINE_LIB)+" \
		| sed -e "s+@PTHREAD_LIB@+$(PTHREAD_LIB)+" \
		| sed -e "s+@RT_LIB@+$(RT_LIB_SUBS)+" \
		| sed -e "s=@LIBSTDC++@=$(LIBSTDCPP_SUBS)=" \
		| sed -e "s+@LD_FLAGS@+$(LD_FLAGS)+" \
		| sed -e "s+@PAPI_LIBS@+$(PAPI_LIBS)+" \
		| sed -e "s+@F90_LIB@+$(F90_LIB_SUBS)+" \
		| sed -e "s+@TERMCAP@+$(TERMCAP_LIB)+" \
		| sed -e "s+@BUILD_OPTIONS@+$(MAKE_CFG)+" \
		| sed -e "s+@MUESLI_VERSION@+`cat ../VERSION`+" > $@
	@ls $(STATIC_LIBS) $(DYN_LIBS) > /dev/null 2>&1 && \
		(sed -i -e '53s/echo .*/echo "mixed (CFG=optim for shared libs; CFG=debug for archived libs)"/' $@) || :
	@ls $(STATIC_LIBS) > /dev/null 2>&1 || \
		(sed -i -e '68,71d' $@; sed -i -e '29d' $@)
	@# strip multiple spaces inside echo command
	@sed -i -e '/echo/s/ \+/ /g' $@
	@chmod a+x $@

install : uninstall muesli-config f90_compiler_version ../VERSION
	@test -d $(INSTALL_DIR) || mkdir -p $(INSTALL_DIR)
	@ls include/*.mod > /dev/null 2>&1 && \
		(cp include/fml.mod $(INSTALL_DIR); \
		echo ""; \
		echo "  → module files installed") || :
	@ls lib/* > /dev/null 2>&1 && (cp lib/* $(INSTALL_DIR); \
		echo "  → libraries installed") || :
	@ls $(INSTALL_DIR)/*.so > /dev/null 2>&1 && \
		strip --strip-unneeded --strip-debug $(INSTALL_DIR)/*.so || :
ifneq '$(FGL)' 'no'
	@cp include/fgl.mod $(INSTALL_DIR)
	@cp ../src/fgl/mfplot/rgb.txt $(INSTALL_DIR)
	@cp -R ../src/fgl/mfplot/src/drivers/PDFLibXObj $(INSTALL_DIR)
	@rm -f $(INSTALL_DIR)/PDFLibXObj/*.png
	@rm -f $(INSTALL_DIR)/PDFLibXObj/ToDo
	@mkdir -p $(INSTALL_DIR)/fontconfig
	@cp -R ../src/fgl/mfplot/fontconfig/fonts $(INSTALL_DIR)/fontconfig
	@rm -f $(INSTALL_DIR)/fontconfig/fonts/ISOLatin1.list
	@rm -f $(INSTALL_DIR)/fontconfig/fonts/symbol8859.info
	@mkdir -p $(INSTALL_DIR)/fontconfig/cache
	@cat ../src/fgl/mfplot/fontconfig/fonts.conf.in \
	  | sed -e "s+@FONTS_DIR@+$(INSTALL_DIR)+" \
	  > $(INSTALL_DIR)/fontconfig/fonts.conf
endif
	@echo $(ECHO_OPT) "library source path:\n`pwd`" > $(INSTALL_DIR)/libmuesli.info
	@echo $(ECHO_OPT) "\nlibrary installation path:\n$(INSTALL_DIR)" >> $(INSTALL_DIR)/libmuesli.info
	@echo $(ECHO_OPT) "\nlibrary documentation path:\n$(DOCS_INSTALL_DIR)" >> $(INSTALL_DIR)/libmuesli.info
	@echo $(ECHO_OPT) "\nlibrary release:\n`cat ../VERSION`" >> $(INSTALL_DIR)/libmuesli.info
	@echo $(ECHO_OPT) "\nbuild date:" >> $(INSTALL_DIR)/libmuesli.info
	@date >> $(INSTALL_DIR)/libmuesli.info
	@echo $(ECHO_OPT) "\ncompiler version:" >> $(INSTALL_DIR)/libmuesli.info
	@ls f90_compiler_version > /dev/null 2>&1  && \
		(cat f90_compiler_version >> $(INSTALL_DIR)/libmuesli.info) || :
	@echo $(ECHO_OPT) "\nmake options:" >> $(INSTALL_DIR)/libmuesli.info
	@ls $(STATIC_LIBS) $(DYN_LIBS) > /dev/null 2>&1 && \
		echo "mixed (CFG=optim for shared libs; CFG=debug for archived libs)" >> $(INSTALL_DIR)/libmuesli.info || \
		(ls make_options > /dev/null 2>&1  && (cat make_options >> $(INSTALL_DIR)/libmuesli.info) || :)
	@test -d $(MUESLI_CONFIG_DIR) || mkdir -p $(MUESLI_CONFIG_DIR)
ifeq '$(QT4_QMAKE)' '"yes"'
	@(cd meditor && test -f meditor && cp meditor $(MUESLI_CONFIG_DIR) && \
		echo "  → 'meditor' installed")
endif
	@test -f muesli-config && cp muesli-config $(MUESLI_CONFIG_DIR)
	@mkdir -p $(MAN_INSTALL_DIR)/man1
	@cp ../docs/man/muesli-config.1 $(MAN_INSTALL_DIR)/man1
	@echo "  → man installed"
	@echo ""

.PHONY : docs

docs :
	@echo
	$(COLOR_RED)
	@echo "                      ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓"
	@echo "                      ┃         documentation          ┃"
	@echo "                      ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛"
	$(COLOR_NORMAL)
	@echo
	@cd docs/latex && $(MAKE) > /dev/null 2>&1
	@echo $(ECHO_OPT) "\r                                                      \c"
	$(COLOR_PURPLE)
	@echo $(ECHO_OPT) "\r  → done"
	$(COLOR_NORMAL)
	@echo

docs-install :
	@echo
	@test -d $(DOCS_INSTALL_DIR) || mkdir -p $(DOCS_INSTALL_DIR)
	@ls ../copyright > /dev/null && cp ../copyright $(DOCS_INSTALL_DIR)
	@cd docs/latex && ls *.pdf > /dev/null && (cp *.pdf $(DOCS_INSTALL_DIR); \
	echo "  → documentation installed") || :
	@echo

f90_compiler_version :
	@$(F90_COMP) --version | head -n 2 > $@

uninstall :
	@test -d $(INSTALL_DIR) && (cd $(INSTALL_DIR) && \
		rm -f -R *.mod *.a *.so *.la \
		grfont.dat rgb.txt \
		fontconfig/ PDFLibXObj/) || :
	@rm -f $(MUESLI_CONFIG_DIR)/meditor
	@rm -f $(MUESLI_CONFIG_DIR)/muesli-config
#	@rm -f $(DOCS_INSTALL_DIR)/*.pdf

FMLclean :
	rm -f $(FML_LIB)
	rm -f inc_dev/fml.mod \
		inc_dev/mod_core.mod \
		inc_dev/mod_datafun.mod \
		inc_dev/mod_elfun.mod \
		inc_dev/mod_elmat.mod \
		inc_dev/mod_fileio.mod \
		inc_dev/mod_matfun.mod \
		inc_dev/mod_mem_debug.mod \
		inc_dev/mod_mfarray.mod \
		inc_dev/mod_mfaux.mod \
		inc_dev/mod_mfdebug.mod \
		inc_dev/mod_ops.mod \
		inc_dev/mod_physunits.mod \
		inc_dev/mod_polyfun.mod \
		inc_dev/mod_sparse.mod \
		inc_dev/mod_specfun.mod \
		inc_dev/mod_funfun.mod
	rm -f include/fml.mod

FGLclean :
	rm -f $(FGL_LIB)
	rm -f inc_dev/fgl.mod \
		inc_dev/mod_plot2d.mod \
		inc_dev/mod_grobj.mod \
		inc_dev/mod_axes.mod \
		inc_dev/mod_window.mod \
		inc_dev/fgl_aux_2.mod \
		inc_dev/fgl_aux.mod \
		inc_dev/mod_fgl_mem_debug.mod \
		inc_dev/mod_pgplot.mod \
		inc_dev/mod_grplot.mod
	rm -f include/fgl.mod

clean :
	rm -f *.mod *.o obj/* inc_dev/* *.out tmp/* make_options make_opt.inc \
		*.gcov
	touch make_opt.inc
# bug of f90cache for some GCC versions (4.5 and 4.6)
# (following .s created files cannot be removed from f90cache)
	rm -f ../src/misc/arpack/src/*.s
	rm -f ../src/misc/bezier/*.s
	rm -f ../src/misc/f90_gzlib/*.s
	rm -f ../src/misc/iso_varying_string/*.s
	rm -f ../src/misc/minpack/*.s
	rm -f ../src/misc/rational_numbers/*.s
	rm -f ../src/misc/slatec/*.s
	rm -f ../src/misc/splines/*.s
	rm -f ../src/papi/*.s
	rm -f *.s
ifeq '$(MAKE_FGL)' 'FGL=yes'
	rm -f ../src/fgl/src/usr/*.s
	rm -f ../src/fgl/src/*.s
	rm -f fgl/mfplot/*.s
	rm -f fgl/mfplot/fontconfig/cache/*
endif
	-cd fgl/mfplot && $(MAKE) clean
	-cd misc/ACM && $(MAKE) clean
	-cd misc/arpack && $(MAKE) clean
	-cd misc/suitesparse && $(MAKE) clean
	-cd tests && $(MAKE) clean
	-cd tests/muesli-config && \
		rm -f *.o # Don't call make ('muesli-config' perhaps not yet available)
	-cd tests/trap_errors && $(MAKE) clean
	-cd tests/trap_errors/FPE && $(MAKE) clean
	-cd tests/fgl && $(MAKE) clean
	-cd mex && $(MAKE) clean
	-cd debug && $(MAKE) clean
	-cd sh_tools && $(MAKE) clean

distclean : clean
	rm -f include/* lib/* .depend
	-cd fgl/mfplot && $(MAKE) distclean
	-cd misc/arpack && $(MAKE) distclean
	-cd tests && $(MAKE) distclean
	-cd tests/muesli-config && \
		rm -f test_muesli_config_fml test_muesli_config_fgl # Don't call make ('muesli-config' perhaps not yet available)
	-cd tests/trap_errors && $(MAKE) distclean
	-cd tests/trap_errors/FPE && $(MAKE) distclean
	-cd tests/fgl && $(MAKE) distclean
	-cd tests/fgl/pcolor && $(MAKE) distclean
	-cd mex && $(MAKE) distclean
	-cd debug && $(MAKE) distclean
ifeq '$(QT4_QMAKE)' '"yes"'
	-cd meditor && test -f Makefile && $(MAKE) distclean && \
		rm -f Makefile || :
else
	-cd meditor && test -f Makefile && \
		rm -f Makefile moc_meditor.cpp *.o meditor || :
endif
	rm -f muesli-config f90_compiler_version fml_core/parameters.inc

#-----------------------------------------------------------------------
# List of exported variables:                (COLOR_* are discarded)
#   MAKE
#   F90CACHE
#   VERB
#   X86_64
#   CFG
#   F90C_TAG
#   F90C
#   FC
#   PIC_FLAGS
#   F90_FLAGS
#   MOD_TO
#   FPP_FLAGS
#   CC
#   CC_FLAGS
#   CPP_FLAGS
#   CPLUSPLUS
#   WRAPPER_FLAGS
#   OPT_FLAGS
#   F90_LIB_DIR
#-----------------------------------------------------------------------
