Date: 2007-05-24T04:55:22+00:00

    CFLAGS    =
    FFLAGS    =
    SOURCEC   =
    SOURCEF   =
    SOURCEH   = petsc.h petscdef.h petsclog.h petscvec.h petscsnes.h petscda.h petscdraw.h petscmat.h \
                petscksp.h petscpc.h petscviewer.h petscis.h petscao.h petscmg.h \
                petscsys.h petscts.h petscis.h90 petscvec.h90 petscmat.h90 petscda.h90
    OBJSC     =
    OBJSF     =
    LIBBASE   = libpetscvec
    DIRS      =
    MANSEC    = Sys
    LOCDIR    = include/finclude/
    NOADIC    = true

    include ${PETSC_DIR}/bmake/common/base
    include ${PETSC_DIR}/bmake/common/test

    .SUFFIXES:
    .SUFFIXES: .mod .inc .use

    # don't remake moddeps, makefile
    moddeps:
            touch moddeps
    makefile:
            touch makefile

    # remake all
    forceall: clean_all all

    # remake anly if we havn't allinone.h
    all: makemodules allinone.h tidy_up

    # clean all
    clean_all: tidy_up
            rm -f *.mod

    # leave only final files
    tidy_up:
            rm -f ipath __tmp *.xinc *.f90.h *.f90 *.use *.inc modorder makefile.tmp allinone.h *.o *.f90

    makefile.tmp: moddeps
            cp makefile makefile.tmp;\
            cat moddeps|grep -v '^ *#'|grep ':'|\
            sed 's/^ *\([^ ]*\)\(.*\)/\1\2 \1.f90.h/' >> makefile.tmp;\
            MODS=`cat moddeps|grep -v '^ *#'|grep ':'|sed 's/^ *\([^ ]*\).*/\1 /'`;\
            echo modules : $$MODS >> makefile.tmp

    makemodules: makefile.tmp
            if [ ! -e allinone.h ]; then\
              rm -f modorder;\
              make -f makefile.tmp modules;\
            fi

    allinone.h: modorder
            LAST=`tail -n 1 modorder`;if [ -e $$LAST.xinc ]; then cat $$LAST.xinc >>allinone.h;fi;\

    # ---------------------------------- for "modules" target

    # rule to make *.mod and *.xinc - cpp directives only file
    # can not use %.mod rule as make is too clever :-(
    %.f90.h : %.use %.inc
            echo "$*" >>modorder
            # create source
            echo "      module $*" >$*.f90.h
            cat $*.use >>$*.f90.h
            cat $*.inc >>$*.f90.h
            echo "      end module $*" >>$*.f90.h
            ${CPP} ${FCPPFLAGS} $*.f90.h |grep -v "^ *#" >$*.f90
            ${FC} -c ${FC_FLAGS} ${FFLAGS} $*.f90
            # leave just preprocessor's directives in *.xinc
            cat $*.inc|grep "^ *#">$*.xinc

    %.use : moddeps
            echo "USE: $*"
            cat moddeps|grep "^ *$*[ :]"|sed 's/^[^:]*: *//'|sed 's/  */\n/g'|\
            grep -v '^ *$$'|sed 's/^/      use /' >$*.use

    # find header file and all what it includes, merge it together, prepend by
    # previous *.xinc
    %.inc : ipath
            # search and copy header files
            for dir in `cat ipath`;\
            do if [ -e "$${dir}/${RPATH}/$*.h" ];\
              then cat "$${dir}/${RPATH}/$*.h" >$*.xinc;\
                if [ -e "$${dir}/${RPATH}/$*.h90" ];\
                  then cat "$${dir}/${RPATH}/$*.h90" >>$*.xinc;\
                fi;\
                break;\
              fi;\
            done;\
            # make *.inc for all included headers and insert them
            INCLUDED=`cat $*.xinc|grep "^ *#include"|sed 's/^[^"<]*["<]\([^">]*\).*/\1 /'`;\
            for i in $$INCLUDED;\
            do name="$${i##*/}";rpath="$${i%$$name}";\
              make -f makefile.tmp RPATH=$$rpath "$${name%.h}.inc";\
              cat $*.xinc|sed "\%^ *#include *[\"<]$$i%r $${name%.h}.inc">__tmp;\
              mv -f __tmp $*.xinc;\
            done
            # insert *.xinc of previous modules
            rm -f $*.inc;touch $*.inc;\
            if [ -e modorder ]; then LAST=`tail -n 1 modorder`;fi;\
            if [ -e $$LAST.xinc ]; then cat $$LAST.xinc >>$*.inc;fi;\
            cat $*.xinc|grep -v "^ *#include" >>$*.inc;\

    ipath:
            echo "-I/usr/include ${PETSC_DIR}/bmake/${PETSC_ARCH} ${PETSC_DIR}/include/finclude ${PETSC_DIR}/include ${PETSC_DIR} ${PACKAGES_INCLUDES}  "|sed 's/-I//g' > ipath