# Makefile for GNU-make
# Fortran: INTEL ifort 13.x to 19.x // 2023 to 2025
#
# É. Canot -- CNRS --  4 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
#
#  'MEMTR=no'     [default] : no memory debug
#  'MEMTR=yes'              : keep trace of alloc/dealloc
#  'MEMTR=full'             : idem 'MEMTR=yes' + traceback
#
#  'PTRTR=no'     [default] : no pointer debug
#  'PTRTR=yes'              : keep trace of pointing '=>'
#
#  '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

F90C      = $(F90_COMP)
FPP       = fpp
CC        = $(C_COMP)
CPLUSPLUS = $(CXX_COMP)

# configurable options (architecture dependent)

# for optimization (both for ifort, icc, icpc)
# [BUG ifort: '-ipo' leads to Fatal Error]

########################################################################
# Optimisation désactivée car je suis (Nov. 2024) à la recherche d'une
# erreur à l'exécution.
# Cela ne provient ni de l'optimisation, ni des librairies SO !
# Alors ?
# -> la présence de '-g' préserve d'un certain bug ! (misalignment?)
#    (et à condition qu'il n'y ait pas d'optimisation !)
########################################################################
OPT_FLAGS = -g # -O3 -fp-model precise
export OPT_FLAGS

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

F90CACHE = "no"

# special tag : vendor / f90 abbrev
F90C_TAG = INTEL_IFC

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 '$(MEMTR)' 'yes'
  MAKE_MEMTR=MEMTR=yes
else
  ifeq '$(MEMTR)' 'full'
    MAKE_MEMTR=MEMTR=yes
    MEMTR_FULL=yes
  else
    MAKE_MEMTR=MEMTR=no
  endif
endif
ifeq '$(PTRTR)' 'yes'
  MAKE_PTRTR=PTRTR=yes
else # 'no'
  MAKE_PTRTR=PTRTR=no
endif
ifeq '$(FGL)' 'no'
  MAKE_FGL=FGL=no
else # 'no'
  MAKE_FGL=FGL=yes
endif

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

export F90C

FC = $(F90C)
export FC

FPP_OUT =

# for INTEL-ifort: '-y', '-syntax-only' and '-fsyntax-only' are
# equivalent.
MODULE_ONLY = -fsyntax-only

MOD_TO = -module # one blank at the end
export MOD_TO

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

export CC

export CPLUSPLUS

ifeq '$(MODE)' 'verbose'

  export VERB =
  export MAKE = make
  DISCARD_OUTPUT =

else # 'silent'

  export VERB =@
  export MAKE = make -s
  DISCARD_OUTPUT = 2> /dev/null

endif

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

FPP_FLAGS = -D_$(F90C_TAG) -D_SPREAD_MOD

ifeq '$(BLAS_LAPACK_VENDOR)' '"yes"'
  FPP_FLAGS += -D_HAS_MKL
endif

ifeq '$(CFG)' 'debug'

  CC_FLAGS = -g
  CPP_FLAGS =

  FPP_DEBUG_FLAGS =

  CFG_FLAGS = -g -CB -traceback -heap-arrays# -pg
  FML_LIB = lib/libfml.a
  FGL_LIB = lib/libfgl.a

else # 'optim'

  CC_FLAGS = $(OPT_FLAGS)
  CPP_FLAGS = -D_OPTIM

  FPP_FLAGS += -D_OPTIM
  FPP_DEBUG_FLAGS =

  CFG_FLAGS = $(OPT_FLAGS) -heap-arrays
  FML_LIB = lib/libfml.a lib/libfml.so
  FGL_LIB = lib/libfgl.a lib/libfgl.so

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 '$(VERB)' '@'

  CFG_FLAGS += -w
  CC_FLAGS += -w

endif

ifeq '$(MAKE_MEMTR)' 'MEMTR=yes'

  FPP_FLAGS += -D_TRACE_MEM_ALLOC

endif

ifeq '$(MEMTR_FULL)' 'yes'

  FPP_FLAGS += -D_INTEL_IFC_MEM_TRACEBACK

endif

ifeq '$(WINDOWS)' '"yes"'

  FPP_FLAGS += -D_WINDOWS
  CC_FLAGS += -D_WINDOWS

endif

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

INCLUDES = -I./inc_dev

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

  FPP_FLAGS += -D_HDF5

  INCLUDES += -I$(HDF5_F90_DIR)

endif

# the '-assume byterecl' option is very important: RECL unit is
# 4-bytes (longword).
F90_FLAGS = -assume byterecl

# the '-assume minus0' option allows the printing of the minus sign of
# zero (F95 standard).
# [option commented out on 2011-06-30, in order to check the validity
#  of numerical results among all the compilers used]
#F90_FLAGS += -assume minus0

F90_FLAGS += $(CFG_FLAGS) $(OMP_FLAG)

export PIC_FLAGS
export CC_FLAGS
export CPP_FLAGS
export F90_FLAGS

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

CHECK_OPTS = sh_tools/check_opts 3

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

ifeq '$(FGL)' 'no'
all : check_opts compat_opts tools cmp_ifort_mod 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 : check_opts compat_opts tools cmp_ifort_mod 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

compat_opts :
ifeq '$(MAKE_FGL)' 'FGL=yes'
  ifeq '$(MAKE_MEMTR)' 'MEMTR=yes'
    ifeq '$(MAKE_CFG)' 'CFG=optim'
	@echo $(ECHO_OPT) "\n   'CFG=optim', 'FGL=yes' and 'MEMTR=yes' are not compatible!\n"
	exit 1
    endif
  endif
endif
	@echo "make $(MAKE_CFG) $(MAKE_MEMTR) $(MAKE_PTRTR)" > make_options
	@echo $(ECHO_OPT) "$(MAKE_CFG)\n$(MAKE_MEMTR)\n$(MAKE_PTRTR)" > make_opt.inc

ifeq '$(MAKE_MEMTR)' 'MEMTR=yes'
  tools : bin/replace_alloc_dealloc \
        bin/mem_debug_check       \
        bin/mem_debug_stats
	@echo $(ECHO_OPT) "\r                                                      \c"
else
  ifeq '$(PTRTR)' 'yes'
  tools : bin/pointer_trace
	@echo $(ECHO_OPT) "\r                                                      \c"
  else
  tools :
	@echo $(ECHO_OPT) "\r                                                      \c"
  endif
endif

cmp_ifort_mod: cmp_ifort_mod.F90
	@$(F90C) -D_$(F90C_TAG) -assume byterecl -o $@ $<

check_opts :
	@$(CHECK_OPTS) make_options $(MAKE_CFG) $(MAKE_MEMTR) $(MAKE_PTRTR)

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] [MEMTR=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] : optimisation + public/private"
	@echo "                               libs: static + shared"
	@echo "    'CFG=debug'              : debug + profiling + check + traceback +"
	@echo "                               all var. are public + static libs only"
	@echo
	@echo "    'FGL=yes'      [default] : compile the graphics part (+ Pgplot)"
	@echo "    'FGL=no'                 : don't compile the graphics part"
	@echo
	@echo "    'MEMTR=no'     [default] : no memory debug"
	@echo "    'MEMTR=yes'              : keep trace of alloc/dealloc"
	@echo "    'MEMTR=full'             : idem 'MEMTR=yes' + traceback"
	@echo
	@echo "    'PTRTR=no'     [default] : no pointer debug"
	@echo "    'PTRTR=yes'              : keep trace of pointing '=>'"
	@echo "    -------------------------"
	@echo "    'CFG=optim', 'FGL=yes' and 'MEMTR=yes' are not compatible!"
	$(COLOR_NORMAL)
	@echo

include Makefile.inc

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 :
	$(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)

dist_fml :
	@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
	@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

FML_OBJS += obj/print_aux.o

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

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

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)$(CC) -shared -o $@ $^ \
                     -L./lib -lfml -lmfplot

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/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/print_aux.o : C/print_aux.c
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@) : \c"
	$(VERB)$(CC) $(WRAPPER_FLAGS) $(CC_FLAGS) -c $< -o $@

# this module must be compiled without optimization
obj/mod_ieee.o : mod_ieee.F90
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@) : \c"
ifeq '$(CFG)' 'debug'
	$(VERB)./executing: $(F90C) -D_DEVLP $(FPP_FLAGS) $(INCLUDES) -g -O0 -c $< -o $@ $(MOD_TO)inc_dev
else # 'optim'
ifeq '$(X86_64)' '"yes"'
	$(VERB)./executing: $(F90C) -D_DEVLP $(FPP_FLAGS) $(INCLUDES) -fPIC -O0 -c $< -o $@ $(MOD_TO)inc_dev
else
	$(VERB)./executing: $(F90C) -D_DEVLP $(FPP_FLAGS) $(INCLUDES) -O0 -c $< -o $@ $(MOD_TO)inc_dev
endif
endif

obj/rational_numbers.o : misc/rational_numbers/rational_numbers.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/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 \
                  obj/gft_common.o
	$(VERB)$(F90C) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev

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

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

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

obj/gft.o : misc/GFT/gft.f90 \
            obj/gft_jmfft.o \
            obj/gft_set.o \
            obj/gft_do.o \
            obj/gft_end.o
	$(VERB)$(F90C) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev

obj/minpack.o : misc/minpack/minpack.F90
	$(VERB)$(F90C) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev

obj/bezier.o : misc/bezier/bezier.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/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/f90_gzlib.o : misc/f90_gzlib/f90_gzlib.F90
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@) : \c"
	$(VERB)$(F90C) $(FPP_FLAGS) $(INCLUDES) $(F90_FLAGS) -w -c $< -o $@ $(MOD_TO)inc_dev

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/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_ddebd2.o : misc/slatec/mod_ddebd2.F90
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@) : \c"
	$(VERB)./executing: $(F90C) -Imisc/suitesparse $(FPP_FLAGS) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev

obj/mod_slatec_aux.o : misc/slatec/mod_slatec_aux.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
	@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_solve.o : misc/slatec/mod_slatec_solve.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/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/predicates.o : misc/delaunay/3d/predicates.cxx
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(CPLUSPLUS) $(CC_FLAGS) -c $< -o $@

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

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

obj/voronoi_f90wrapper.o : misc/voronoi/2d/voronoi_f90wrapper.c \
                           misc/voronoi/2d/jc_voronoi_EC.h
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@): \c"
	$(VERB)$(CC) $(WRAPPER_FLAGS) $(CPP_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 $@

include/bezier.mod : inc_dev/bezier.mod
	@cp $< $@

include/f90_gzlib.mod : inc_dev/f90_gzlib.mod
	@cp $< $@

include/iso_varying_string.mod : inc_dev/iso_varying_string.mod
	@cp $< $@

include/rational_numbers.mod : inc_dev/rational_numbers.mod
	@cp $< $@

include/splines.mod : inc_dev/splines.mod
	@cp $< $@

include/mod_ddebd2.mod : inc_dev/mod_ddebd2.mod
	@cp $< $@

include/gft_common.mod : inc_dev/gft_common.mod
	@cp $< $@

include/gft_jmfft.mod : inc_dev/gft_jmfft.mod
	@cp $< $@

include/gft_set.mod : inc_dev/gft_set.mod
	@cp $< $@

include/gft_do.mod : inc_dev/gft_do.mod
	@cp $< $@

include/gft_end.mod : inc_dev/gft_end.mod
	@cp $< $@

include/gft.mod : inc_dev/gft.mod
	@cp $< $@

include/arpack_util.mod :  inc_dev/arpack_util.mod
	@cp $< $@

include/mod_arpack.mod :  inc_dev/mod_arpack.mod
	@cp $< $@

include/convexhull_mod.mod : inc_dev/convexhull_mod.mod
	@cp $< $@

include/minpack.mod : inc_dev/minpack.mod
	@cp $< $@

include/mod_slatec_aux.mod : inc_dev/mod_slatec_aux.mod
	@cp $< $@

include/mod_slatec_fun.mod : inc_dev/mod_slatec_fun.mod
	@cp $< $@

include/mod_slatec_solve.mod : inc_dev/mod_slatec_solve.mod
	@cp $< $@



inc_dev/fml.mod : fml.F90
	$(VERB)$(F90C) $(FPP_FLAGS) $(INCLUDES) $(MODULE_ONLY) $< $(DISCARD_OUTPUT) $(MOD_TO)inc_dev

include/fgl.mod : fgl/src/fgl.F90
	$(VERB)$(F90C) $(FPP_FLAGS) $(INCLUDES) $(MODULE_ONLY) $< $(DISCARD_OUTPUT)
	@ls *.mod > /dev/null 2>&1 && mv *.mod include || :

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

include/mod_grplot.mod : inc_dev/mod_grplot.mod
	@cp $< $@

include/mod_pgplot.mod : inc_dev/mod_pgplot.mod
	@cp $< $@

# 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

# tools for special memory debug
bin/replace_alloc_dealloc :
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@) : \c"
	@(cd debug && $(MAKE) replace_alloc_dealloc)

bin/mem_debug_check :
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@) : \c"
	@(cd debug && $(MAKE) mem_debug_check)

bin/mem_debug_stats :
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@) : \c"
	@(cd debug && $(MAKE) mem_debug_stats)

bin/pointer_trace :
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@) : \c"
	@(cd debug && $(MAKE) pointer_trace)

#=============================== rules =================================

.SUFFIXES :
.SUFFIXES : .F90 .f90 .o .mod

ifeq '$(MAKE_MEMTR)' 'MEMTR=yes'

#---------------- MEMORY DEBUG des sources (mem trace) -----------------
tmp/%.f90 : %.F90
	$(VERB)$(FPP) -D_DEVLP $(FPP_FLAGS) $< $(FPP_OUT) $@
	@bin/replace_alloc_dealloc $@
	@mv -f tmp/replace_alloc_dealloc.f90 $@

tmp/%.f90 : fgl/src/%.F90
	$(VERB)$(FPP) -D_DEVLP $(FPP_FLAGS) -I./tmp $< $(FPP_OUT) $@
	@bin/replace_alloc_dealloc $@
	@mv -f tmp/replace_alloc_dealloc.f90 $@

obj/%.o : tmp/%.f90
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@) : \c"
	$(VERB)./executing: $(F90C) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev

else

  ifeq '$(PTRTR)' 'yes'

#---------------- POINTER DEBUG des sources (ptr trace) ----------------
tmp/%.f90 : %.F90
	$(VERB)$(FPP) -D_DEVLP $(FPP_FLAGS) $< $(FPP_OUT) $@

tmp/%.f90 : fgl/src/%.F90
	$(VERB)$(FPP) -D_DEVLP $(FPP_FLAGS) -I./tmp $< $(FPP_OUT) $@
	@bin/pointer_trace $@
	@mv -f tmp/pointer_trace_out.f90 $@

obj/%.o : tmp/%.f90
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@) : \c"
	$(VERB)./executing: $(F90C) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev

  else

#-------------------------- normal STUFF -------------------------------

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

obj/%.o : fgl/src/%.F90
	@echo $(ECHO_OPT) "\r                                                      \c"
	@echo $(ECHO_OPT) "\r  ... making $(notdir $@) : \c"
	$(VERB)./executing: $(F90C) -I./fgl/src/usr -I./tmp -D_DEVLP $(FPP_FLAGS) $(INCLUDES) $(F90_FLAGS) -c $< -o $@ $(MOD_TO)inc_dev

  endif

endif

# (bug ?): preprocessing must be done most of time separately !
include/%.mod : %.F90
	$(VERB)$(FPP) $(FPP_FLAGS) $< $(FPP_OUT) tmp/tmp.f90
	$(VERB)$(F90C) $(INCLUDES) $(MODULE_ONLY) tmp/tmp.f90 $(DISCARD_OUTPUT)
	@ls *.mod > /dev/null 2>&1 && mv *.mod include || :

# (bug ?): preprocessing must be done most of time separately !
include/%.mod : fgl/src/%.F90
	$(VERB)$(FPP) $(FPP_FLAGS) -I./tmp -I./fgl/src/usr $< $(FPP_OUT) tmp/tmp.f90
	$(VERB)$(F90C) $(INCLUDES) $(MODULE_ONLY) tmp/tmp.f90 $(DISCARD_OUTPUT)
	@ls *.mod > /dev/null 2>&1 && mv *.mod include || :

# special rule to avoid recompiling (recursive-make)
inc_dev/%.mod : obj/%.o
	@if [ ! -f $@ ]; then \
      rm $< ; \
      $(MAKE) -f Makefile $< ; \
    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'
  LAPACK_LIBS_SUBS = -L$(LAPACK_DIR) -llapack $(LD_OPT)
  BLAS_LIBS_SUBS = -L$(BLAS_DIR) -lblas $(LD_OPT)
  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
    X11_LIBS_SUBS = -L$(X11_DIR) -lfreetype -lfontconfig -lXrender -lX11
  endif
else # 'optim'
  LAPACK_LIBS_SUBS = -Wl,-rpath,$(LAPACK_DIR) $(LAPACK_DIR)/liblapack.so
  BLAS_LIBS_SUBS = -Wl,-rpath,$(BLAS_DIR) $(BLAS_DIR)/libblas.so
  ifeq '$(HDF5)' '"yes"'
    HDF5_LIBS_SUBS = -Wl,-rpath,$(HDF5_F90_DIR) $(HDF5_F90_DIR)/libhdf5_fortran.so -Wl,-rpath,$(HDF5_1_6) $(HDF5_1_6)/libhdf5.so
    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) $(INSTALL_DIR)/libfml.so
    MUESLI_STAT_LIBS_SUBS = $(INSTALL_DIR)/libfml.a
  else # FML + FGL -- optim
    MUESLI_LIBS_SUBS = -Wl,-rpath,$(INSTALL_DIR) $(INSTALL_DIR)/libfgl.so $(INSTALL_DIR)/libfml.so $(INSTALL_DIR)/libmfplot.so
    MUESLI_STAT_LIBS_SUBS = $(INSTALL_DIR)/libfgl.a $(INSTALL_DIR)/libfml.a $(INSTALL_DIR)/libmfplot.a
    X11_LIBS_SUBS = -L$(X11_DIR) -lfreetype -lfontconfig -lXrender -lX11
  endif
endif

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

ifeq '$(BLAS_LAPACK_VENDOR)' '"yes"'
  # keep the protected double quote: this will be necessary during the
  # substitution in making 'muesli-config'.
  BLAS_LIB_CONFIG = \"MKL (Intel Math Kernel Library)\"
  LAPACK_LIB_CONFIG = \"MKL (Intel Math Kernel Library)\"
  BLAS_LAPACK_LIBS = -qmkl
  BLAS_LAPACK_STAT_LIBS = -qmkl
else
  BLAS_LIB_CONFIG = $(BLAS_DIR)/libblas.so
  LAPACK_LIB_CONFIG = $(LAPACK_DIR)/liblapack.so
  BLAS_LAPACK_LIBS = $(LAPACK_LIBS_SUBS) $(BLAS_LIBS_SUBS) $(ADD_LIB)
  BLAS_LAPACK_STAT_LIBS = $(LAPACK_DIR)/liblapack.a $(BLAS_DIR)/libblas.a $(ADD_LIB)
endif

ZLIB_LIBS_SUBS = -L$(ZLIB_DIR) -lz

ifeq '$(CFG)' 'debug'
  ifeq '$(NEED_LRT)' '"yes"'
    RT_LIB_SUBS = -lrt
  else
    RT_LIB_SUBS =
  endif
else
  RT_LIB_SUBS =
endif

muesli-config : muesli-config.in check_opts ../VERSION
	@cat $< | sed -e "s+@PREFIX@+$(INSTALL_DIR)+" \
		| sed -e "s+@F90C@+$(F90C)+" \
		| 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@+$(BLAS_LAPACK_LIBS)+" \
		| sed -e "s+@BLAS_LAPACK_STAT@+$(BLAS_LAPACK_STAT_LIBS)+" \
		| 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@+-lpthread+" \
		| sed -e "s+@RT_LIB@+$(RT_LIB_SUBS)+" \
		| sed -e "s=@LIBSTDC++@=-lstdc++=" \
		| sed -e "s+@LD_FLAGS@+$(OMP_FLAG)+" \
		| sed -e "s+@PAPI_LIBS@+$(PAPI_LIBS)+" \
		| sed -e "s+@F90_LIB@+-lsvml+" \
		| sed -e "s+@FGL@+$(FGL)+" \
		| sed -e "s+@TERMCAP@+$(TERMCAP_LIB)+" \
		| sed -e "s+@BUILD_OPTIONS@+$(MAKE_CFG)+" \
		| sed -e "s+@MUESLI_VERSION@+`cat ../VERSION`+" > $@
	@chmod a+x $@

REDIST_FML = include/bezier.mod \
             include/fml.mod \
             include/mod_core.mod \
             include/mod_datafun.mod \
             include/mod_elfun.mod \
             include/mod_elmat.mod \
             include/mod_fileio.mod \
             include/mod_funfun.mod \
             include/mod_ieee.mod \
             include/mod_matfun.mod \
             include/mod_mem_debug.mod \
             include/mod_mfarray.mod \
             include/mod_mfaux.mod \
             include/mod_mfdebug.mod \
             include/mod_ops.mod \
             include/mod_physunits.mod \
             include/mod_polyfun.mod \
             include/mod_prop.mod \
             include/mod_sparse.mod \
             include/mod_specfun.mod \
             include/rational_numbers.mod \
             include/splines.mod \
             include/mod_arpack.mod \
             include/arpack_util.mod

REDIST_FGL = include/fgl.mod \
             include/mod_axes.mod \
             include/mod_grobj.mod \
             include/mod_plot2d.mod \
             include/mod_window.mod \
             include/mod_grplot.mod \
             include/mod_pgplot.mod

install : uninstall muesli-config f90_compiler_version ../VERSION
	@test -d $(INSTALL_DIR) || mkdir -p $(INSTALL_DIR)
ifneq '$(FGL)' 'no'
	@ls $(REDIST_FGL) > /dev/null 2>&1  && \
       cp $(REDIST_FGL) $(INSTALL_DIR) || :
endif
	@ls $(REDIST_FML) > /dev/null 2>&1  && \
		(cp $(REDIST_FML) $(INSTALL_DIR); \
		echo ""; \
		echo "  → module files installed") || :
	@ls lib/* > /dev/null 2>&1  && (cp lib/* $(INSTALL_DIR); \
		echo "  → libraries installed") || :
ifneq '$(FGL)' 'no'
	@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 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"
ifeq '$(MAKE_MEMTR)' 'MEMTR=yes'
	@rm -f $(MUESLI_CONFIG_DIR)/mem_debug_check $(MUESLI_CONFIG_DIR)/mem_debug_stats
	@cp -f bin/mem_debug_check bin/mem_debug_stats $(MUESLI_CONFIG_DIR)
	@echo "  → 'mem_debug' tools installed"
endif
	@test -d $(DOCS_INSTALL_DIR) || mkdir -p $(DOCS_INSTALL_DIR)
	@ls ../copyright > /dev/null && cp ../copyright $(DOCS_INSTALL_DIR)
	@cd ../docs && ls muesli_ref_manual.pdf muesli_user_guide.pdf > /dev/null \
                    && cp muesli_ref_manual.pdf muesli_user_guide.pdf $(DOCS_INSTALL_DIR)
	@echo "  → documentation installed"
	@echo ""


f90_compiler_version :
	@$(F90C) --version | head -n 1 > f90_compiler_version

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

clean :
	rm -f *.mod *.o obj/* inc_dev/* *.out tmp/*  make_options *.i90
	echo "" > make_opt.inc
ifeq '$(MAKE_FGL)' 'FGL=yes'
	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/fgl && $(MAKE) clean
	-cd sh_tools && $(MAKE) clean

distclean : clean
	rm -f include/* lib/* ../src/*.tags .depend
	-cd fgl/mfplot && $(MAKE) distclean
	-cd misc/suitesparse && $(MAKE) distclean
	-cd misc/arpack && $(MAKE) distclean
	-cd misc/ACM && $(MAKE) distclean
	-cd tests && $(MAKE) distclean
	-cd tests/fgl && $(MAKE) distclean
	-cd tests/fgl/pcolor && $(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)
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
	-cd sh_tools && $(MAKE) distclean
	rm -f muesli-config f90_compiler_version fml_core/parameters.inc
	rm -f cmp_ifort_mod

#-----------------------------------------------------------------------
# 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
#-----------------------------------------------------------------------
