#GNU Makefile for the Melkes library package
#-----------------------------------------------------------------------
# Variables.

# The following system-dependent variables must become defined.
# FC: The Fortran-90/95 compiler and linker command;
# FFLAGS: Flags for $(FC);
# BLD: The library build command, including flags.

# Obtain the system name
SYSTEM := $(shell uname)

# Test if this is a Linux environment
ifeq ($(SYSTEM),Linux)
  BLD = ar rcv
  hardware = $(shell uname -m)
  ifeq ($(hardware),alpha)
    FC = fort
    FFLAGS = -O
  else
    FC = lf95
    FFLAGS = -O
  endif
endif

# Test if this is a SunOS environment
ifeq ($(SYSTEM),SunOS)
  FC = f95
  FFLAGS = -fast
# -fast or some other such option is especially important on SunOS.
  BLD = ar rcv
endif

# Test if this is an OSF1 environment
ifeq ($(SYSTEM),OSF1)
  FC = f95
  FFLAGS = -O
  BLD = ar rcv
endif

# Test if this is an AIX environment
ifeq ($(SYSTEM),AIX)
  FC = xlf95
  FFLAGS = -O4 -D__ibm
# Must define the fpp/cpp macro __ibm for conditional compilations.
  BLD = ar rcv
endif

# Test if this is an IRIX environment
ifeq ($(SYSTEM),IRIX)
  FC = f90
  FFLAGS = -O -macro_expand
  BLD = ar rcv
endif

# Test if this is an IRIX64 environment
ifeq ($(SYSTEM),IRIX64)
  FC = f90
  FFLAGS = -O -macro_expand
  BLD = ar rcv
endif

# Test if this is a Unicos environment
ifneq ($(nil),$(findstring |sn,|$(SYSTEM)))
  FC = f90
  FFLAGS = -F -e m -DMELKES_DONT_WANT_R4
# The -F option forces macro expansion throughout the source files.
# The "-e m" option requests creation of *.mod files.
# The MELKES_DONT_WANT_R4 macro indicates not to create a 32-bit
# implementation of the library.
  BLD = bld rcv
endif

# Test if this is an HP-UX environment
ifeq ($(SYSTEM),HP-UX)
# Have not explored HP-UX
endif

# Test if this is an ..., etc., environment
# (to be added as needed)

# Set variables $(objects) and $(libraries) enumerating the targets.
objects_r4 = melkes_mode_r4.o melkes1_r4.o melkes2_r4.o \
  melkes3_r4.o melkes_test_r4.o
objects_r8 = melkes_mode_r8.o melkes1_r8.o melkes2_r8.o \
  melkes3_r8.o melkes_test_r8.o
objects_g = melkes_mode_opt.o melkes.o melkes1.o \
  melkes2.o melkes3.o melkes_test.o
ifeq ($(nil),$(findstring DONT_WANT_R4,$(FFLAGS)))
  objects = $(objects_r4) $(objects_r8) $(objects_g)
else
  objects = $(objects_r8) $(objects_g)
endif

libraries = libmelkes.a

#-----------------------------------------------------------------------
# Rules.

all : $(objects) $(libraries)
obj : $(objects)
lib : $(libraries)

.PHONY : all obj lib clean testvars
FORCE :

# module use dependencies
ifeq ($(nil),$(findstring DONT_WANT_R4,$(FFLAGS)))
  melkes_test.o : melkes_test_r4.o melkes_test_r8.o
else
  melkes_test.o : melkes_test_r8.o
endif
melkes_test_r4.o : melkes_mode_r4.o melkes_mode_opt.o melkes.o
melkes_test_r8.o : melkes_mode_r8.o melkes_mode_opt.o melkes.o
melkes.o : melkes1.o melkes2.o melkes3.o
ifeq ($(nil),$(findstring DONT_WANT_R4,$(FFLAGS)))
  melkes1.o : melkes1_r4.o melkes1_r8.o
  melkes2.o : melkes2_r4.o melkes2_r8.o
  melkes3.o : melkes3_r4.o melkes3_r8.o
else
  melkes1.o : melkes1_r8.o
  melkes2.o : melkes2_r8.o
  melkes3.o : melkes3_r8.o
endif
melkes1_r4.o : melkes_mode_r4.o melkes_mode_opt.o
melkes2_r4.o : melkes_mode_r4.o melkes_mode_opt.o
melkes3_r4.o : melkes_mode_r4.o melkes_mode_opt.o
melkes1_r8.o : melkes_mode_r8.o melkes_mode_opt.o
melkes2_r8.o : melkes_mode_r8.o melkes_mode_opt.o
melkes3_r8.o : melkes_mode_r8.o melkes_mode_opt.o

#source code dependencies
melkes_test_r4.o melkes_test_r8.o : \
  melkes1_test.f90 melkes1_time.f90 melkes1_tfun.f90 \
  melkes2_test.f90 melkes2_time.f90 melkes2_tfun.f90 \
  melkes3_test.f90 melkes3_time.f90 melkes3_tfun.f90 \
  melkes_test_dx.f90 melkes_test_setx.f90 \
  melkes_test_out0.f90 melkes_test_out1.f90
melkes1_r4.o melkes1_r8.o : \
  melkes1_evalf.f90 melkes1_evalf_d1.f90 melkes1_evalf_d2.f90 \
  melkes1_evalf_d3.f90 melkes1_evalf_d4.f90 \
  melkes1_evalg.f90 melkes1_evalg_d1.f90 melkes1_evalg_d2.f90 \
  melkes1_evalg_d3.f90 melkes1_evalg_d4.f90 \
  melkes1_evalh.f90 melkes1_evalh_d1.f90 melkes1_evalh_d2.f90 \
  melkes1_evalh_d3.f90 melkes1_evalh_d4.f90
melkes2_r4.o melkes2_r8.o : \
  melkes2_coef.f90 melkes2_coef_d1.f90 melkes2_coef_d2.f90 \
  melkes2_coef_d3.f90 melkes2_coef_d4.f90 \
  melkes2_evalf.f90 melkes2_evalf_d1.f90 melkes2_evalf_d2.f90 \
  melkes2_evalf_d3.f90 melkes2_evalf_d4.f90 \
  melkes2_evalg.f90 melkes2_evalg_d1.f90 melkes2_evalg_d2.f90 \
  melkes2_evalg_d3.f90 melkes2_evalg_d4.f90 \
  melkes2_evalh.f90 melkes2_evalh_d1.f90 melkes2_evalh_d2.f90 \
  melkes2_evalh_d3.f90 melkes2_evalh_d4.f90
melkes3_r4.o melkes3_r8.o : \
  melkes3_coef.f90 melkes3_coef_d1.f90 melkes3_coef_d2.f90 \
  melkes3_evalf.f90 melkes3_evalf_d1.f90 melkes3_evalf_d2.f90 \
  melkes3_evalf_d3.f90 melkes3_evalf_d4.f90 \
  melkes3_evalg.f90 melkes3_evalg_d1.f90 melkes3_evalg_d2.f90 \
  melkes3_evalg_d3.f90 melkes3_evalg_d4.f90 \
  melkes3_evalh.f90 melkes3_evalh_d1.f90 melkes3_evalh_d2.f90 \
  melkes3_evalh_d3.f90 melkes3_evalh_d4.f90

# Pattern rule to create the modules
$(objects) : %.o : %.F90
	$(FC) -c $(FFLAGS) $<

# Rules to create the libraries
libmelkes.a : $(objects)
	$(BLD) $(@F) $(objects)

# target 'clean' cleans up the directory.
clean : FORCE
	rm -f *.mod *.o *.l *.a *~

# target testvars is present only for testing purposes.
testvars : FORCE
	@echo system: $(SYSTEM)
	@echo compile: $(FC) $(FFLAGS)
	@echo build: $(BLD)
	@echo objects $(objects)
	@echo libraries $(libraries)
