#==============================================================================
#     File   :  Makefile
#     Author :  Frank Heimes
#
#
#     This file is part of GNU PIPS,
#        version 1.02: Parallel Information Processing System
#
#     GNU PIPS is free software; you can redistribute it and/or modify
#     it under the terms of the GNU General Public License as published by
#     the Free Software Foundation; either version 2, or (at your option)
#     any later version.
#
#     GNU PIPS is distributed in the hope that it will be useful,
#     but WITHOUT ANY WARRANTY; without even the implied warranty of
#     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#     GNU General Public License for more details.
#
#     You should have received a copy of the GNU General Public License
#     along with GNU PIPS; see the file COPYING.  If not, write to
#     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
#     Boston, MA 02111-1307, USA.
#
#
#     There are two variable sections you may want to edit
#     Search for +++ to find their boundaries
#==============================================================================

#******************************************************************************
# +++ First of two variable sections: option settings

# Compiler
CC      = gcc

# Pips directory
PIPSDIR = .

# Directory of system files
SYSDIR  = /usr

# Directory of the netcdf package
NETDIR  = /usr/pd/packages/netcdf-2.3.2pl2

# Path, where the PVM-package is installed 
# (only one installation is neccessary for all users)
PVMDIR  = /usr/pd/packages/pvm3

# Root directory of PVM, that is where pvm will look for executables and libs
# Should be set in your .cshrc file. If not, 

# uncomment the next line, if you have write permission for PVMDIR
#PVM_ROOT = $(PVMDIR)

# uncomment the next line, if you don't have write permission for PVMDIR
PVM_ROOT = $(HOME)/pvm3

# Architecture type of this host
# If PVM_ARCH is not defined, run pvmgetarch and set PVM_ARCH to it's value
#PVM_ARCH = .

# Compiler switches
# for developement
CFLAGS  = -g -ansi -Wall -pedantic -finline-functions
# for shipping
#CFLAGS  = -finline-functions

# Application programs to process netcdf files
PVMBIN  = $(PVM_ROOT)/bin/$(PVM_ARCH)
FILTERS = \
          $(PVMBIN)/addVars                 \
          $(PVMBIN)/enhance                 \
          $(PVMBIN)/histogram               \
          $(PVMBIN)/mandel                  \
          $(PVMBIN)/nonMaxSuppress          \
          $(PVMBIN)/noiseRatio              \
          $(PVMBIN)/stddev                  \
          $(PVMBIN)/sumGauss                \
          $(PVMBIN)/sumGaussThr             \
          $(PVMBIN)/sumHistogram            \
          $(PVMBIN)/sumSigma                \
          $(PVMBIN)/sumSigmaThr             \
          $(PVMBIN)/sumThreshold            \
          $(PVMBIN)/sumWeightedDiff         \
          $(PVMBIN)/sumWeightedDist         \
          $(PVMBIN)/normalize

# +++ End of first variable section
#******************************************************************************

#+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
#                No need to edit in this section

# Pips directory structure
BINDIR = $(PIPSDIR)/bin
EXEDIR = $(PIPSDIR)/exe
FILDIR = $(PIPSDIR)/filters
SRCDIR = $(PIPSDIR)/src
INCDIR = $(PIPSDIR)/inc
LIBDIR = $(PIPSDIR)/lib
OBJDIR = $(PIPSDIR)/obj

# This is the current version of PIPS
VERSION = 1.02

# Where to look for included files
SYSINCDIR = $(SYSDIR)/include
NETINCDIR = $(NETDIR)/include
PVMINCDIR = $(PVMDIR)/include
INCDIRS   = -I$(INCDIR) -I$(SYSINCDIR) -I$(NETINCDIR) -I$(PVMINCDIR)

# Where to look for libraries
SYSLIBDIR = $(SYSDIR)/lib
NETLIBDIR = $(NETDIR)/lib
PVMLIBDIR = $(PVMDIR)/lib/$(PVM_ARCH)
LIBDIRS   = -L$(LIBDIR) -L$(SYSLIBDIR) -L$(NETLIBDIR) -L$(PVMLIBDIR)

# Command to build objects from c-codes
BUILDOBJ = -$(CC) -o $@ -c $? $(CFLAGS) $(INCDIRS)

# Command to archive an object file into a library
ARCHIVE  = -ar rv $(LIBDIR)/libpips.a $@

# Command to build executable from objects and libraries
BUILDEXE = -$(CC) -o $@ $(CFLAGS) $(LIBDIRS)

# Only print error messages, not commands itself
.SILENT :

#===================== ALL : EXECUTABLES ======================================
# Sequence of targets to build and actions to perform
all : startmessage                    \
      setupPVM                        \
      $(BINDIR)/pnm2nc                \
      $(BINDIR)/nc2pnm                \
      $(BINDIR)/ncattdef              \
      $(BINDIR)/ncprocseq             \
      $(FILTERS)                      \
      endmessage

startmessage :
	@echo ''
	@echo Building Parallel Information Processing System, Version $(VERSION) .....
	@echo ''
	-mkdir -p $(BINDIR)
	-mkdir -p $(OBJDIR)
	-mkdir -p $(LIBDIR)

setupPVM :
	-mkdir -p $(PVM_ROOT)/bin/$(PVM_ARCH)
	-ln -s $(PVMDIR)/lib $(PVM_ROOT)/lib

endmessage :
	@echo Done building PIPS, Version $(VERSION)

# End of constant section
#+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-

#******************************************************************************
# +++ Second of two variable sections: application files & dependencies

#===================== APPLICATION SECTION  ===================================

#===================== EXECUTABLES : LIBRARIES, OBJECTS  ======================
# Which executables depend on which object files and libraries

$(PVMBIN)/addVars : $(OBJDIR)/addVars.o $(OBJDIR)/ncprocess.o \
	$(LIBDIR)/libpips.a $(NETLIBDIR)/libnetcdf.a
	$(BUILDEXE) $(OBJDIR)/addVars.o $(OBJDIR)/ncprocess.o \
	-lpips -lnetcdf -lpvm3 -lm

$(PVMBIN)/enhance : $(OBJDIR)/enhance.o $(OBJDIR)/ncprocess.o \
	$(LIBDIR)/libpips.a $(NETLIBDIR)/libnetcdf.a
	$(BUILDEXE) $(OBJDIR)/enhance.o $(OBJDIR)/ncprocess.o \
	-lpips -lnetcdf -lpvm3 -lm

$(PVMBIN)/histogram : $(OBJDIR)/histogram.o $(OBJDIR)/ncprocess.o \
	$(LIBDIR)/libpips.a $(NETLIBDIR)/libnetcdf.a
	$(BUILDEXE) $(OBJDIR)/histogram.o $(OBJDIR)/ncprocess.o \
	-lpips -lnetcdf -lpvm3 -lm

$(PVMBIN)/mandel : $(OBJDIR)/mandel.o $(OBJDIR)/ncprocess.o \
	$(LIBDIR)/libpips.a $(NETLIBDIR)/libnetcdf.a
	$(BUILDEXE) $(OBJDIR)/mandel.o $(OBJDIR)/ncprocess.o \
	-lpips -lnetcdf -lpvm3 -lm

$(PVMBIN)/nonMaxSuppress : $(OBJDIR)/nonMaxSuppress.o $(OBJDIR)/ncprocess.o \
	$(LIBDIR)/libpips.a $(NETLIBDIR)/libnetcdf.a
	$(BUILDEXE) $(OBJDIR)/nonMaxSuppress.o $(OBJDIR)/ncprocess.o \
	-lpips -lnetcdf -lpvm3 -lm

$(PVMBIN)/normalize : $(OBJDIR)/normalize.o $(OBJDIR)/ncprocess.o \
	$(LIBDIR)/libpips.a $(NETLIBDIR)/libnetcdf.a
	$(BUILDEXE) $(OBJDIR)/normalize.o $(OBJDIR)/ncprocess.o \
	-lpips -lnetcdf -lpvm3 -lm

$(PVMBIN)/noiseRatio : $(OBJDIR)/noiseRatio.o $(OBJDIR)/ncprocess.o \
	$(LIBDIR)/libpips.a $(NETLIBDIR)/libnetcdf.a
	$(BUILDEXE) $(OBJDIR)/noiseRatio.o $(OBJDIR)/ncprocess.o \
	-lpips -lnetcdf -lpvm3 -lm

$(PVMBIN)/stddev : $(OBJDIR)/stddev.o $(OBJDIR)/ncprocess.o \
	$(LIBDIR)/libpips.a $(NETLIBDIR)/libnetcdf.a
	$(BUILDEXE) $(OBJDIR)/stddev.o $(OBJDIR)/ncprocess.o \
	-lpips -lnetcdf -lpvm3 -lm

$(PVMBIN)/sumGauss : $(OBJDIR)/sumGauss.o $(OBJDIR)/ncprocess.o \
	$(LIBDIR)/libpips.a $(NETLIBDIR)/libnetcdf.a
	$(BUILDEXE) $(OBJDIR)/sumGauss.o $(OBJDIR)/ncprocess.o \
	-lpips -lnetcdf -lpvm3 -lm

$(PVMBIN)/sumGaussThr : $(OBJDIR)/sumGaussThr.o $(OBJDIR)/ncprocess.o \
	$(LIBDIR)/libpips.a $(NETLIBDIR)/libnetcdf.a
	$(BUILDEXE) $(OBJDIR)/sumGaussThr.o $(OBJDIR)/ncprocess.o \
	-lpips -lnetcdf -lpvm3 -lm

$(PVMBIN)/sumHistogram : $(OBJDIR)/sumHistogram.o $(OBJDIR)/ncprocess.o \
	$(LIBDIR)/libpips.a $(NETLIBDIR)/libnetcdf.a
	$(BUILDEXE) $(OBJDIR)/sumHistogram.o $(OBJDIR)/ncprocess.o \
	-lpips -lnetcdf -lpvm3 -lm

$(PVMBIN)/sumThreshold : $(OBJDIR)/sumThreshold.o $(OBJDIR)/ncprocess.o \
	$(LIBDIR)/libpips.a $(NETLIBDIR)/libnetcdf.a
	$(BUILDEXE) $(OBJDIR)/sumThreshold.o $(OBJDIR)/ncprocess.o \
	-lpips -lnetcdf -lpvm3 -lm

$(PVMBIN)/sumWeightedDiff : $(OBJDIR)/sumWeightedDiff.o $(OBJDIR)/ncprocess.o \
	$(LIBDIR)/libpips.a $(NETLIBDIR)/libnetcdf.a
	$(BUILDEXE) $(OBJDIR)/sumWeightedDiff.o $(OBJDIR)/ncprocess.o \
	-lpips -lnetcdf -lpvm3 -lm

$(PVMBIN)/sumWeightedDist : $(OBJDIR)/sumWeightedDist.o $(OBJDIR)/ncprocess.o \
	$(LIBDIR)/libpips.a $(NETLIBDIR)/libnetcdf.a
	$(BUILDEXE) $(OBJDIR)/sumWeightedDist.o $(OBJDIR)/ncprocess.o \
	-lpips -lnetcdf -lpvm3 -lm

$(PVMBIN)/sumSigma : $(OBJDIR)/sumSigma.o $(OBJDIR)/ncprocess.o \
	$(LIBDIR)/libpips.a $(NETLIBDIR)/libnetcdf.a
	$(BUILDEXE) $(OBJDIR)/sumSigma.o $(OBJDIR)/ncprocess.o \
	-lpips -lnetcdf -lpvm3 -lm

$(PVMBIN)/sumSigmaThr : $(OBJDIR)/sumSigmaThr.o $(OBJDIR)/ncprocess.o \
	$(LIBDIR)/libpips.a $(NETLIBDIR)/libnetcdf.a
	$(BUILDEXE) $(OBJDIR)/sumSigmaThr.o $(OBJDIR)/ncprocess.o \
	-lpips -lnetcdf -lpvm3 -lm

#===================== OBJECTS : SOURCES ======================================
# Which objects depend on which source code files

$(OBJDIR)/addVars.o : $(FILDIR)/addVars.c
	$(BUILDOBJ)

$(OBJDIR)/enhance.o : $(FILDIR)/enhance.c
	$(BUILDOBJ)

$(OBJDIR)/histogram.o : $(FILDIR)/histogram.c
	$(BUILDOBJ)

$(OBJDIR)/mandel.o : $(FILDIR)/mandel.c
	$(BUILDOBJ)

$(OBJDIR)/nonMaxSuppress.o : $(FILDIR)/nonMaxSuppress.c
	$(BUILDOBJ)

$(OBJDIR)/normalize.o : $(FILDIR)/normalize.c
	$(BUILDOBJ)

$(OBJDIR)/noiseRatio.o : $(FILDIR)/noiseRatio.c
	$(BUILDOBJ)

$(OBJDIR)/stddev.o : $(FILDIR)/stddev.c
	$(BUILDOBJ)

$(OBJDIR)/sumGauss.o : $(FILDIR)/sumGauss.c
	$(BUILDOBJ)

$(OBJDIR)/sumGaussThr.o : $(FILDIR)/sumGaussThr.c
	$(BUILDOBJ)

$(OBJDIR)/sumHistogram.o : $(FILDIR)/sumHistogram.c
	$(BUILDOBJ)

$(OBJDIR)/sumThreshold.o : $(FILDIR)/sumThreshold.c
	$(BUILDOBJ)

$(OBJDIR)/sumWeightedDiff.o : $(FILDIR)/sumWeightedDiff.c
	$(BUILDOBJ)

$(OBJDIR)/sumWeightedDist.o : $(FILDIR)/sumWeightedDist.c
	$(BUILDOBJ)

$(OBJDIR)/sumSigma.o : $(FILDIR)/sumSigma.c
	$(BUILDOBJ)

$(OBJDIR)/sumSigmaThr.o : $(FILDIR)/sumSigmaThr.c
	$(BUILDOBJ)

# +++ End of second variable section
#******************************************************************************



#+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
#                No need to edit below this line
#+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-

#===================== EXECUTABLES : LIBRARIES, OBJECTS  ======================
# Which executables depend on which object files and libraries
$(BINDIR)/pnm2nc : $(OBJDIR)/pnm2nc.o \
	$(LIBDIR)/libpips.a $(NETLIBDIR)/libnetcdf.a
	$(BUILDEXE) $(OBJDIR)/pnm2nc.o -lpips -lnetcdf

$(BINDIR)/nc2pnm : $(OBJDIR)/nc2pnm.o \
	$(LIBDIR)/libpips.a $(NETLIBDIR)/libnetcdf.a
	$(BUILDEXE) $(OBJDIR)/nc2pnm.o -lpips -lnetcdf

$(BINDIR)/ncattdef : $(OBJDIR)/ncattdef.o \
	$(LIBDIR)/libpips.a $(NETLIBDIR)/libnetcdf.a
	$(BUILDEXE) $(OBJDIR)/ncattdef.o -lpips -lnetcdf

$(BINDIR)/ncprocseq : $(OBJDIR)/ncprocseq.o \
	$(LIBDIR)/libpips.a $(NETLIBDIR)/libnetcdf.a
	$(BUILDEXE) $(OBJDIR)/ncprocseq.o -lpips -lnetcdf

#===================== LIBRARIES : OBJECTS ====================================
# Which libraries depend on which object files
LIBOBJECTS = $(OBJDIR)/pipsAddPnm.o           \
             $(OBJDIR)/pipsAwaitChildData.o   \
             $(OBJDIR)/pipsChangeAtts.o       \
             $(OBJDIR)/pipsDataPerJob.o       \
             $(OBJDIR)/pipsExtPnm.o           \
             $(OBJDIR)/pipsHistory.o          \
             $(OBJDIR)/pipsJobAvailable.o     \
             $(OBJDIR)/pipsNewFlagArray.o     \
             $(OBJDIR)/pipsMinMax.o           \
             $(OBJDIR)/pipsPrintError.o       \
             $(OBJDIR)/pipsPrintPerformance.o \
             $(OBJDIR)/pipsReadAttDef.o       \
             $(OBJDIR)/pipsReadPnmHeader.o    \
             $(OBJDIR)/pipsReadPnmValue.o     \
             $(OBJDIR)/pipsSelectNewJob.o     \
             $(OBJDIR)/pipsStrapp.o           \
             $(OBJDIR)/pipsVarDef.o           \
             $(OBJDIR)/pipsVarInq.o           \
             $(OBJDIR)/pipsTaskManager.o      \
             $(OBJDIR)/pipsWritePnmHeader.o   \
             $(OBJDIR)/pipsWritePnmValue.o

$(LIBDIR)/libpips.a: $(LIBOBJECTS)
	-ranlib $@

#===================== OBJECTS : SOURCES ======================================
# Which objects depend on which source code files
#--------------------- OBJECTS for EXECUTABLES --------------------------------
$(OBJDIR)/pnm2nc.o : $(EXEDIR)/pnm2nc.c
	$(BUILDOBJ)

$(OBJDIR)/nc2pnm.o : $(EXEDIR)/nc2pnm.c
	$(BUILDOBJ)

$(OBJDIR)/ncattdef.o : $(EXEDIR)/ncattdef.c
	$(BUILDOBJ)

$(OBJDIR)/ncprocseq.o : $(EXEDIR)/ncprocseq.c
	$(BUILDOBJ)

$(OBJDIR)/ncprocess.o : $(EXEDIR)/ncprocess.c
	$(BUILDOBJ)

#--------------------- OBJECTS for LIBRARIES ----------------------------------
$(OBJDIR)/pipsAddPnm.o : $(SRCDIR)/pipsAddPnm.c
	$(BUILDOBJ)
	$(ARCHIVE)

$(OBJDIR)/pipsAwaitChildData.o : $(SRCDIR)/pipsAwaitChildData.c
	$(BUILDOBJ)
	$(ARCHIVE)

$(OBJDIR)/pipsChangeAtts.o : $(SRCDIR)/pipsChangeAtts.c
	$(BUILDOBJ)
	$(ARCHIVE)

$(OBJDIR)/pipsDataPerJob.o : $(SRCDIR)/pipsDataPerJob.c
	$(BUILDOBJ)
	$(ARCHIVE)

$(OBJDIR)/pipsExtPnm.o : $(SRCDIR)/pipsExtPnm.c
	$(BUILDOBJ)
	$(ARCHIVE)

$(OBJDIR)/pipsHistory.o : $(SRCDIR)/pipsHistory.c
	$(BUILDOBJ)
	$(ARCHIVE)

$(OBJDIR)/pipsJobAvailable.o : $(SRCDIR)/pipsJobAvailable.c
	$(BUILDOBJ)
	$(ARCHIVE)

$(OBJDIR)/pipsNewFlagArray.o : $(SRCDIR)/pipsNewFlagArray.c
	$(BUILDOBJ)
	$(ARCHIVE)

$(OBJDIR)/pipsMinMax.o : $(SRCDIR)/pipsMinMax.c
	$(BUILDOBJ)
	$(ARCHIVE)

$(OBJDIR)/pipsPrintError.o : $(SRCDIR)/pipsPrintError.c
	$(BUILDOBJ)
	$(ARCHIVE)

$(OBJDIR)/pipsPrintPerformance.o : $(SRCDIR)/pipsPrintPerformance.c
	$(BUILDOBJ)
	$(ARCHIVE)

$(OBJDIR)/pipsReadAttDef.o : $(SRCDIR)/pipsReadAttDef.c
	$(BUILDOBJ)
	$(ARCHIVE)

$(OBJDIR)/pipsReadPnmHeader.o : $(SRCDIR)/pipsReadPnmHeader.c
	$(BUILDOBJ)
	$(ARCHIVE)

$(OBJDIR)/pipsReadPnmValue.o : $(SRCDIR)/pipsReadPnmValue.c
	$(BUILDOBJ)
	$(ARCHIVE)

$(OBJDIR)/pipsSelectNewJob.o : $(SRCDIR)/pipsSelectNewJob.c
	$(BUILDOBJ)
	$(ARCHIVE)

$(OBJDIR)/pipsStrapp.o : $(SRCDIR)/pipsStrapp.c
	$(BUILDOBJ)
	$(ARCHIVE)

$(OBJDIR)/pipsTaskManager.o : $(SRCDIR)/pipsTaskManager.c
	$(BUILDOBJ)
	$(ARCHIVE)

$(OBJDIR)/pipsVarDef.o : $(SRCDIR)/pipsVarDef.c
	$(BUILDOBJ)
	$(ARCHIVE)

$(OBJDIR)/pipsVarInq.o : $(SRCDIR)/pipsVarInq.c
	$(BUILDOBJ)
	$(ARCHIVE)

$(OBJDIR)/pipsWritePnmHeader.o : $(SRCDIR)/pipsWritePnmHeader.c
	$(BUILDOBJ)
	$(ARCHIVE)

$(OBJDIR)/pipsWritePnmValue.o : $(SRCDIR)/pipsWritePnmValue.c
	$(BUILDOBJ)
	$(ARCHIVE)

#==============================================================================
# House keeping and archiving functions

cleanAll : cleanBak cleanBin

cleanBak :
	@echo 'Removing all pips-backup files ...'
	-find $(PIPSDIR) -name '*~*' -print -exec /bin/rm -fr {} \;
	@echo 'Done removing backup files'

cleanBin :
	@echo 'Removing all pips-binary files ...'
	-/bin/rm $(OBJDIR)/*.o
	-/bin/rm $(LIBDIR)/*.a
	-/bin/rm $(BINDIR)/*
	-/bin/rm $(FILTERS)
	@echo 'Done removing binary files'

tar :
	@echo 'Packing all pips-files in tar-file ...'
	(cd $(PIPSDIR)/.. ; tar -cvf - pips | gzip -c > pips-$(VERSION).tar.gz)
	@echo 'Done packing files'

backup:
	@echo 'Backing up all pips-source and documentation files ...'
	(cd $(PIPSDIR)/.. ; tar -cvf pips-$(VERSION).tar \
     `find pips/* -type f -print | grep -v '~' | grep -v 'bin/'`; \
    gzip pips-$(VERSION).tar; \
	mv pips-$(VERSION).tar.gz Backup.tar.gz)
	@echo 'Done backing up files'

manifest:
	@echo 'Creating directory list file ...'
	(cd $(PIPSDIR); find * -type f -print > MANIFEST)
	@echo 'Done creating directory list file'

