#
# jan.kazil@noaa.gov 2015-12-07 13:55:22 -07:00
#

#
# Directories
#

SRCDIR=./src
LOGDIR=./log
OBJDIR=./obj
MODDIR=./mod
BINDIR=.

#
# Fortran compiler (set by compile script)
#

#FC=pgf95
#FC=ifort

#
# Compiler settings
#

ifeq ($(FC),pgf95)
  
  # Fortran language flags:
  COMPILER_FLAGS := -Mfree -Mextend
  
  # Optimization:
  COMPILER_FLAGS := $(COMPILER_FLAGS) -O2
  
  # Parallelization:
  COMPILER_FLAGS := $(COMPILER_FLAGS) -mp
  
  # Preprocessor flags:
  COMPILER_FLAGS := $(COMPILER_FLAGS) -Mpreprocess -DFC=1
  
  # netCDF (should be set in in the compile.sh script)
  #NETCDF=/usr/local/netCDF/netcdf-4.0-pgi
  
  # Modules:
  COMPILER_FLAGS := $(COMPILER_FLAGS) -I$(NETCDF)/include -module $(MODDIR)
  
  # Libraries:
  LIBFLAGS := -lnetcdf
  NETCDFLIBS := $(NETCDF)/lib
  
  # Linker flags
  LINKER_FLAGS = $(LIBFLAGS) -L$(NETCDFLIBS)
  
  # Debugging:
  #COMPILER_FLAGS :=$(COMPILER_FLAGS) -C -O0
  #COMPILER_FLAGS :=$(COMPILER_FLAGS) -g
  
endif

ifeq ($(FC),ifort)
  
  # Fortran language flags:
  COMPILER_FLAGS := -free -132 -align
  
  # Optimization:
  COMPILER_FLAGS := $(COMPILER_FLAGS) -O2
  
  # Parallelization:
  COMPILER_FLAGS := $(COMPILER_FLAGS) -openmp
  
  # Preprocessor flags:
  COMPILER_FLAGS := $(COMPILER_FLAGS) -fpp -DFC=2
  
  # netCDF (should be set in in the compile.sh script)
  #NETCDF=/usr/local/netCDF/netcdf-4.0-ifort
  
  # Modules:
  COMPILER_FLAGS := $(COMPILER_FLAGS) -I$(NETCDF)/include -module $(MODDIR)
  
  # Libraries:
  LIBFLAGS := -lnetcdff -lnetcdf
  NETCDFLIBS := $(NETCDF)/lib
  
  # Linker flags
  LINKER_FLAGS = $(LIBFLAGS) -L$(NETCDFLIBS)
  
  # Debugging:
  #COMPILER_FLAGS :=$(COMPILER_FLAGS) -O0
  #COMPILER_FLAGS :=$(COMPILER_FLAGS) -g -traceback -check all -fpe0 -ftrapuv 
  
endif

################################################################################
#
# Make rules
#
################################################################################

# Clear the known suffixes:
.SUFFIXES:

# Specify the known suffixes:
.SUFFIXES: .F .o .mod

# Pattern rules for the known suffixes:

$(OBJDIR)/%.o  : $(SRCDIR)/%.F
	$(FC) $(COMPILER_FLAGS) -c $(SRCDIR)/$*.F -o $(OBJDIR)/$*.o 2>> $(LOGDIR)/compiler

# A macro which constructs the list of dependencies:

define DEPENDENCIES
  $(addsuffix .o, $(addprefix $(OBJDIR)/, $(basename $(SOURCE))))
endef

# A macro for linking object files and generating an executable:

define LINKER
  $(FC) $(COMPILER_FLAGS) -o $(BINDIR)/$@ $^ $(LINKER_FLAGS) 2>> $(LOGDIR)/linker
endef

################################################################################
#
# The default target 'all':
#
################################################################################

EXECUTABLES := \
memory_leak_demo_1 \
memory_leak_demo_2

all : $(EXECUTABLES)

################################################################################
#
# memory_leak_demo_1
#
################################################################################

SOURCE = \
module_netcdf.F \
memory_leak_demo_1.F

memory_leak_demo_1 : $(DEPENDENCIES); $(LINKER)

################################################################################
#
# memory_leak_demo_2
#
################################################################################

SOURCE = \
module_netcdf.F \
memory_leak_demo_2.F

memory_leak_demo_2 : $(DEPENDENCIES); $(LINKER)

################################################################################
#
# Cleanup
#
################################################################################

# Remove the compiler and linker log files:

delog :
	rm -f $(LOGDIR)/compiler
	rm -f $(LOGDIR)/linker

# Remove the compiler and linker log files, and intermediate files:

clean :
	rm -f $(LOGDIR)/compiler
	rm -f $(LOGDIR)/linker
	rm -f $(addprefix $(OBJDIR)/,*.o)
	rm -f $(addprefix $(MODDIR)/,*.mod)
	rm -f $(EXECUTABLES)

