/[MITgcm]/MITgcm/tools/genmake2
ViewVC logotype

Diff of /MITgcm/tools/genmake2

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph | View Patch Patch

revision 1.4 by edhill, Tue Aug 26 16:22:15 2003 UTC revision 1.149 by edhill, Thu May 11 20:28:50 2006 UTC
# Line 1  Line 1 
1  #!/bin/bash  #! /usr/bin/env bash
2  #  #
3  # $Header$  # $Header$
4  #  #
# Line 8  Line 8 
8  #   modified by aja 01/00  #   modified by aja 01/00
9  #   rewritten in bash by eh3 08/03  #   rewritten in bash by eh3 08/03
10    
11    # Search for particular CPP #cmds associated with packages
12    # usage: test_for_package_in_cpp_options CPP_file package_name
13    test_for_package_in_cpp_options() {
14        cpp_options=$1
15        pkg=$2
16        test_for_string_in_file $cpp_options "^[ ]*#define.*ALLOW_$pkg[ ]"
17        test_for_string_in_file $cpp_options "^[ ]*#undef.*ALLOW_$pkg[ ]"
18        test_for_string_in_file $cpp_options "^[ ]*#define.*DISABLE_$pkg[ ]"
19        test_for_string_in_file $cpp_options "^[ ]*#undef.*DISABLE_$pkg[ ]"
20        test_for_string_in_file $cpp_options "^[ ]*#define.*ALLOW_$pkg$"
21        test_for_string_in_file $cpp_options "^[ ]*#undef.*ALLOW_$pkg$"
22        test_for_string_in_file $cpp_options "^[ ]*#define.*DISABLE_$pkg$"
23        test_for_string_in_file $cpp_options "^[ ]*#undef.*DISABLE_$pkg$"
24    }
25    
26    # Search for particular CPP #cmds associated with MPI
27    # usage: test_for_mpi_in_cpp_eeoptions CPP_file
28    test_for_mpi_in_cpp_eeoptions() {
29        cpp_options=$1
30        test_for_string_in_file $cpp_options "^[ ]*#define.*ALLOW_USE_MPI[ ]"
31        test_for_string_in_file $cpp_options "^[ ]*#undef.*ALLOW_USE_MPI[ ]"
32        test_for_string_in_file $cpp_options "^[ ]*#define.*ALWAYS_USE_MPI[ ]"
33        test_for_string_in_file $cpp_options "^[ ]*#undef.*ALWAYS_USE_MPI[ ]"
34        test_for_string_in_file $cpp_options "^[ ]*#define.*ALLOW_USE_MPI$"
35        test_for_string_in_file $cpp_options "^[ ]*#undef.*ALLOW_USE_MPI$"
36        test_for_string_in_file $cpp_options "^[ ]*#define.*ALWAYS_USE_MPI$"
37        test_for_string_in_file $cpp_options "^[ ]*#undef.*ALWAYS_USE_MPI$"
38    }
39    
40    # Search for particular string in a file. Return 1 if detected, 0 if not
41    # usage: test_for_string_in_file file string
42    test_for_string_in_file() {
43        file=$1
44        strng=$2
45        grep -i "$strng" $file > /dev/null 2>&1
46        RETVAL=$?
47        if test "x${RETVAL}" = x0 ; then
48            printf "Error: In $file there is an illegal line: "
49            grep -i "$strng" $file
50            exit 99
51        fi
52        return 0
53    }
54    
55    # Read the $ROOTDIR/pkg/pkg_groups file and expand any references to
56    # the package list.
57    expand_pkg_groups() {
58        new_packages=
59        PKG_GROUPS=$ROOTDIR"/pkg/pkg_groups"
60        if test -r $PKG_GROUPS ; then
61            cat $PKG_GROUPS | sed -e 's/#.*$//g' | sed -e 's/:/ : /g' > ./p1.tmp
62            cat ./p1.tmp | $AWK '(NF>2 && $2==":"){ print $0 }' > ./p2.tmp
63            matched=0
64            for i in $PACKAGES ; do
65                line=`grep "^ *$i" ./p2.tmp`
66                RETVAL=$?
67                if test "x$RETVAL" = x0 ; then
68                    matched=1
69                    replace=`echo $line | $AWK '{ $1=""; $2=""; print $0 }'`
70                    echo "    replacing \"$i\" with: $replace"
71                    new_packages="$new_packages $replace"
72                else
73                    new_packages="$new_packages $i"
74                fi
75            done
76            PACKAGES=$new_packages
77            rm -f ./p[1,2].tmp
78            return $matched
79        else
80            echo "Warning: can't read package groups definition file: $PKG_GROUPS"
81        fi
82    }
83    
84    #  Check for broken environments (eg. cygwin, MacOSX w/HFS+) that
85    #  cannot distinguish [*.F/*.F90] from [*.f/*.f90] files.
86    check_for_broken_Ff()  {
87        #  Do we have defaults for $FS and/or $FS90 ?
88        tfs=f
89        tfs9=f90
90        if test "x$FS" != x ; then
91            tfs="$FS"
92        fi
93        if test "x$FS90" != x ; then
94            tfs9="$FS90"
95        fi
96    
97        #  First check the ability to create a *.F/.f pair.
98        cat <<EOF >> genmake_hello.F
99          program hello
100          write(*,*) 'hi'
101          stop
102          end
103    EOF
104        cp genmake_hello.F "genmake_hello."$tfs > /dev/null 2>&1
105        RETVAL=$?
106        if test "x$RETVAL" != x0 ; then
107            if test "x$FS" = x ; then
108                FS='for'
109                FS90='fr9'
110                check_for_broken_Ff
111            else
112                cat <<EOF 2>&1
113    ERROR: Your file system cannot distinguish between *.F and *.f files
114      (fails the "cp" test) and this program cannot find a suitable
115      replacement extension.  Please try a different build environment or
116      contact the <MITgcm-support@mitgcm.org> list for help.
117    
118    EOF
119                exit -1
120            fi
121            return
122        fi
123        rm -f genmake_hello.*
124    
125        #  Check the ability of ${MAKE} and ${LN} to use the current set
126        #  of extensions.
127        cat <<EOF >> genmake_hello.F
128          program hello
129          write(*,*) 'hi'
130          stop
131          end
132    EOF
133        test -f $MAKEFILE  &&  mv -f $MAKEFILE $MAKEFILE".tst"
134        cat <<EOF >> $MAKEFILE
135    .SUFFIXES:
136    .SUFFIXES: .$tfs .F
137    .F.$tfs:
138            $LN \$< \$@
139    EOF
140        $MAKE "genmake_hello."$tfs > /dev/null 2>&1
141        RETVAL=$?
142        if test "x$RETVAL" != x0 -o ! -f "genmake_hello."$tfs ; then
143            if test "x$FS" = x ; then
144                FS='for'
145                FS90='fr9'
146                check_for_broken_Ff
147            else
148                cat <<EOF 2>&1
149    ERROR: Your file system cannot distinguish between *.F and *.f files
150      (fails the "make/ln" test) and this program cannot find a suitable
151      replacement extension.  Please try a different build environment or
152      contact the <MITgcm-support@mitgcm.org> list for help.
153    
154    EOF
155                exit -1
156                return
157            fi
158        fi
159        rm -f genmake_hello.* $MAKEFILE
160        test -f $MAKEFILE".tst"  &&  mv -f $MAKEFILE".tst" $MAKEFILE
161    
162        #  If we make it here, use the extensions
163        FS=$tfs
164        FS90=$tfs9
165        return
166    }
167    
168    
169    look_for_makedepend()  {
170    
171        #  The "original" makedepend is part of the Imake system that is
172        #  most often distributed with XFree86 or with an XFree86 source
173        #  package.  As a result, many machines (eg. generic Linux) do not
174        #  have a system-default "makedepend" available.  For those
175        #  systems, we have two fall-back options:
176        #
177        #    1) a makedepend implementation shipped with the cyrus-imapd
178        #       package:  ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/
179        #
180        #    2) a known-buggy xmakedpend shell script
181        #
182        #  So the choices are, in order:
183        #
184        #    1) use the user-specified program
185        #    2) use a system-wide default
186        #    3) locally build and use the cyrus implementation
187        #    4) fall back to the buggy local xmakedpend script
188        #
189        if test "x${MAKEDEPEND}" = x ; then
190            which makedepend > /dev/null 2>&1
191            RV0=$?
192            test -f $MAKEFILE  &&  mv -f $MAKEFILE $MAKEFILE".tst"
193            #  echo 'MAKEFILE="'$MAKEFILE'"'
194            cat <<EOF >> $MAKEFILE
195    #   THIS IS A TEST MAKEFILE GENERATED BY "genmake2"
196    #
197    #   Some "makedepend" implementations will die if they cannot
198    #   find a Makefile -- so this file is here to gives them an
199    #   empty one to find and parse.
200    EOF
201            cat <<EOF >> genmake_tc.f
202          program test
203          write(*,*) 'test'
204          stop
205          end
206    EOF
207            makedepend genmake_tc.f > /dev/null 2>&1
208            RV1=$?
209            test -f $MAKEFILE  &&  rm -f $MAKEFILE
210            test -f $MAKEFILE".tst"  &&  mv -f $MAKEFILE".tst" $MAKEFILE
211            if test "x${RV0}${RV1}" = x00 ; then
212                MAKEDEPEND=makedepend
213            else
214                echo "    a system-default makedepend was not found."
215                
216                #  Try to build the cyrus implementation
217                build_cyrus_makedepend
218                RETVAL=$?
219                if test "x$RETVAL" != x0 ; then
220                    MAKEDEPEND='$(TOOLSDIR)/xmakedepend'
221                fi
222                rm -f ./genmake_cy_md
223            fi
224        else
225            #  echo "MAKEDEPEND=${MAKEDEPEND}"
226            echo "${MAKEDEPEND}" | grep -i cyrus > /dev/null 2>&1
227            RETVAL=$?
228            if test x"$RETVAL" = x0 ; then
229                build_cyrus_makedepend
230            fi
231        fi
232    }
233    
234    
235    build_cyrus_makedepend()  {
236        rm -f ./genmake_cy_md
237        (
238            cd $ROOTDIR/tools/cyrus-imapd-makedepend  \
239                &&  ./configure > /dev/null 2>&1  \
240                &&  make > /dev/null 2>&1
241            if test -x ./makedepend.exe ; then
242                $LN ./makedepend.exe ./makedepend
243            fi
244            ./makedepend ifparser.c > /dev/null 2>&1  \
245                &&  echo "true"
246        ) > ./genmake_cy_md
247        grep true ./genmake_cy_md > /dev/null 2>&1
248        RETVAL=$?
249        rm -f ./genmake_cy_md
250        if test "x$RETVAL" = x0 ; then
251            MAKEDEPEND='$(TOOLSDIR)/cyrus-imapd-makedepend/makedepend'
252            return 0
253        else
254            echo "WARNING: unable to build cyrus-imapd-makedepend"
255            return 1
256        fi
257    }
258    
259    
260    build_embed_encode()
261    {
262        printf "  building the embed-encode utility...  "
263        if test ! -e "$ROOTDIR/tools/embed_encode/encode_files" ; then
264            if test ! -d "$ROOTDIR/tools/embed_encode" ; then
265                echo
266                echo "    Error: can't locate \"$ROOTDIR/tools/embed_encode\""
267                echo
268                EMBED_SRC=f
269                return 1
270            fi
271            clist="cc gcc c89 $CC"
272            for ic in $clist ; do
273                comm="$ic -o encode_files encode_files.c"
274                ( cd $ROOTDIR/tools/embed_encode && $comm ) > /dev/null 2>&1
275                RETVAL=$?
276                if test "x$RETVAL" = x0 ; then
277                    echo "OK"
278                    DEFINES="$DEFINES -DHAVE_EMBED_SRC"
279                    return 0
280                fi
281            done
282            echo
283            echo "    Error: unable to build $ROOTDIR/embed_encode/encode_files"
284            echo "      so it has been disabled"
285            echo
286            EMBED_SRC=f
287            return 1
288        fi
289        echo "OK"
290        DEFINES="$DEFINES -DHAVE_EMBED_SRC"
291    }
292    
293    
294  # Guess possible config options for this host  # Guess possible config options for this host
295  find_possible_configs()  {  find_possible_configs()  {
296    
297      p_PLATFORM=`uname`"-"`uname -m`      tmp1=`uname`"_"`uname -m`
298      echo "The platform appears to be:"      tmp2=`echo $tmp1 | sed -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
299      echo "  "$p_PLATFORM      tmp3=`echo $tmp2 | sed -e 's/power macintosh/ppc/'`
300        tmp1=`echo $tmp3 | sed -e 's|x86_64|amd64|'`
301      p_LN=      tmp2=`echo $tmp1 | sed -e 's/i[3-6]86/ia32/' | sed -e 's/athlon/ia32/'`
302        tmp3=`echo $tmp2 | sed -e 's/cray sv1/craysv1/'`
303        PLATFORM=$tmp3
304        echo $PLATFORM | grep cygwin > /dev/null 2>&1  &&  PLATFORM=cygwin_ia32
305        OFLIST=`(cd $ROOTDIR/tools/build_options; ls | grep "^$PLATFORM")`
306        echo "  The platform appears to be:  $PLATFORM"
307        
308      echo "test" > test      echo "test" > test
309      ln -s ./test link      ln -s ./test link
310      RETVAL=$?      RETVAL=$?
311      if test "x${RETVAL}" = x0 ; then      if test "x${RETVAL}" = x0 ; then
312          p_LN="ln -s"          LN="ln -s"
313        else
314            echo "Error: \"ln -s\" does not appear to work on this system!"
315            echo "  For help, please contact <MITgcm-support@mitgcm.org>."
316            exit 1
317      fi      fi
318      rm -f test link      rm -f test link
319    
320      p_CPP=`which cpp`      if test "x$CPP" = x ; then
321                CPP="cpp -traditional -P"
     RETVAL=$?  
     if test "x${RETVAL}" = x0 ; then  
         p_LN="ln -s"  
322      fi      fi
     rm -f test link  
323    
324      # look for possible fortran compilers      look_for_makedepend
325      p_FC=  
326      for c in f77 g77 pgf77 pgf95 ifc f90 f95 mpif77 mpf77 mpxlf95 ; do      #================================================================
327          which $c > /dev/null 2>&1      #  look for possible C compilers
328        tmp="$MITGCM_CC $CC gcc c89 cc c99 mpicc"
329        p_CC=
330        for c in $tmp ; do
331            rm -f ./genmake_hello.c  ./genmake_hello
332            cat >> genmake_hello.c << EOF
333    #include <stdio.h>
334    int main(int argc, char **argv) {
335      printf("Hello!\n");
336      return 0;
337    }
338    EOF
339            $c -o genmake_hello genmake_hello.c > /dev/null 2>&1
340          RETVAL=$?          RETVAL=$?
341          if test "x${RETVAL}" = x0 ; then          if test "x${RETVAL}" = x0 ; then
342              p_FC="$p_FC $c"              p_CC="$p_CC $c"
343          fi          fi
344      done      done
345      echo "Possible FORTRAN compilers appear to be:  "      rm -f ./genmake_hello.c ./genmake_hello
346      if test "x${p_FC}" = x ; then      if test "x${p_CC}" = x ; then
347          echo "  None found!!!"          cat 1>&2 <<EOF
348    
349    Error: No C compilers were found in your path.  Please specify one using:
350    
351        1) an "optfile" on (eg. "-optfile=path/to/OPTFILE"),
352        2) the CC or MITGCM_CC environment variables.
353    
354    EOF
355            exit 1
356      else      else
357          echo "  "$p_FC          echo "  The possible C compilers found in your path are:"
358            echo "   "$p_CC
359            if test "x$CC" = x ; then
360                CC=`echo $p_CC | $AWK '{print $1}'`
361                echo "  Setting C compiler to: "$CC
362            fi
363      fi      fi
364    
365      # look for possible MPI libraries      #================================================================
366      mpi_libs=      #  look for possible FORTRAN compilers
367      mpi_fort=`which mpif77 2>/dev/null`      tmp="$MITGCM_FC $FC efc g77 f77 pgf77 pgf95 ifc f90 f95 mpif77 mpf77 mpxlf95 gfortran"
368      RETVAL=$?      p_FC=
369      if test "x${RETVAL}" = x0 ; then      for c in $tmp ; do
370          cat >>test.f <<EOF          rm -f ./hello.f ./hello
371        PROGRAM HELLO          cat >> hello.f <<EOF
372        DO 10, I=1,10        program hello
373        PRINT *,'Hello World'        do i=1,3
374     10 CONTINUE          print *, 'hello world : ', i
375        STOP        enddo
376        END        end
377  EOF  EOF
378          eval "$mpi_fort -showme test.f > out"          $c -o hello hello.f > /dev/null 2>&1
379          RETVAL=$?          RETVAL=$?
380          if test "x${RETVAL}" = x0 ; then          if test "x${RETVAL}" = x0 ; then
381              a=`cat out`              p_FC="$p_FC $c"
             for i in $a ; do  
                 case $i in  
                     -*)  
                         mpi_libs="$mpi_libs $i" ;;  
                 esac  
             done  
             echo "The MPI libs appear to be:"  
             echo "  "$mpi_libs  
382          fi          fi
383          rm -f test.f out      done
384        rm -f ./hello.f ./hello
385        if test "x${p_FC}" = x ; then
386            cat 1>&2 <<EOF
387    
388    Error: No Fortran compilers were found in your path.  Please specify one using:
389    
390        1) an "optfile" on (eg. "-optfile=path/to/OPTFILE"),
391        2) a command-line option (eg. "-fc NAME"), or
392        3) the FC or MITGCM_FC environment variables.
393    
394    EOF
395            exit 1
396        else
397            echo "  The possible FORTRAN compilers found in your path are:"
398            echo "   "$p_FC
399      fi      fi
400    
401  }      #  Use the first of the compilers found in the current PATH
402        #  that has a correctly-named optfile
403        if test "x$OPTFILE" = x  -a  "x$FC" = x ; then
404            for i in $p_FC ; do
405                OPTFILE=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$i
406                if test -r $OPTFILE ; then
407                    echo "  Setting OPTFILE to: "$OPTFILE
408                    break
409                fi
410            done
411        fi
412    
413  parse_options()  {      if test "x$OPTFILE" = x ; then
414            OPTFILE=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$FC
415            if test ! -r $OPTFILE ; then
416                 echo "  I looked for the file "$OPTFILE" but did not find it"
417            fi
418        fi
419    #    echo "  The options file:  $p_OF"
420    #    echo "    appears to match so we'll use it."
421    #   for i in $p_FC ; do
422    #p_OF=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$i
423    #if test -r $p_OF ; then
424    #    OPTFILE=$p_OF
425    #    echo "  The options file:  $p_OF"
426    #    echo "    appears to match so we'll use it."
427    #    break
428    #fi
429    #   done
430        if test "x$OPTFILE" = x ; then
431            cat 1>&2 <<EOF
432    
433    Error: No options file was found in:  $ROOTDIR/tools/build_options/
434      that matches this platform ("$PLATFORM") and the compilers found in
435      your path.  Please specify an "optfile" using:
436    
437      ac_prev=      1) the command line (eg. "-optfile=path/to/OPTFILE"), or
438      for ac_option in "${OPTIONS[@]}" ; do      2) the MITGCM_OF environment variable.
439    
440      If you need help, please contact the developers at <MITgcm-support@mitgcm.org>.
441    
442    EOF
443            exit 1
444        fi
445        
446    #     # look for possible MPI libraries
447    #     mpi_libs=
448    #     mpi_fort=`which mpif77 2>/dev/null`
449    #     RETVAL=$?
450    #     if test "x${RETVAL}" = x0 ; then
451    #       cat >>test.f <<EOF
452    #       PROGRAM HELLO
453    #       DO 10, I=1,10
454    #       PRINT *,'Hello World'
455    #    10 CONTINUE
456    #       STOP
457    #       END
458    # EOF
459    #       eval "$mpi_fort -showme test.f > out"
460    #       RETVAL=$?
461    #       if test "x${RETVAL}" = x0 ; then
462    #           a=`cat out`
463    #           for i in $a ; do
464    #               case $i in
465    #                   -*)
466    #                       mpi_libs="$mpi_libs $i" ;;
467    #               esac
468    #           done
469    #           echo "The MPI libs appear to be:"
470    #           echo "  "$mpi_libs
471    #       fi
472    #       rm -f test.f out
473    #     fi
474    
         # echo "ac_option = :$ac_option:"  
           
         # If the previous option needs an argument, assign it.  
         if test -n "$ac_prev"; then  
             eval "$ac_prev=\$ac_option"  
             ac_prev=  
             continue  
         fi  
           
         ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`  
           
         case $ac_option in  
               
             -help | --help | -h | --h)  
                 usage ;;  
               
             -nooptfile | --nooptfile)  
                 OPTFILE="NONE" ;;  
             -optfile | --optfile | -of | --of)  
                 ac_prev=optfile ;;  
             -optfile=* | --optfile=* | -of=* | --of=*)  
                 OPTFILE=$ac_optarg ;;  
               
             -pdepend | --pdepend)  
                 ac_prev=pdepend ;;  
             -pdepend=* | --pdepend=*)  
                 PDEPEND=$ac_optarg ;;  
               
             -pdefault | --pdefault)  
                 ac_prev=pdefault ;;  
             -pdefault=* | --pdefault=*)  
                 PDEFAULT=$ac_optarg ;;  
               
             -makefile | -ma)  
                 ac_prev=makefile ;;  
             --makefile=* | -ma=*)  
                 MAKEFILE=$ac_optarg ;;  
               
             -platform | --platform | -pl | --pl)  
                 ac_prev=platform ;;  
             -platform=* | --platform=* | -pl=* | --pl=*)  
                 PLATFORM=$ac_optarg ;;  
   
             -rootdir | --rootdir | -rd | --rd)  
                 ac_prev=rootdir ;;  
             -rootdir=* | --rootdir=* | -rd=* | --rd=*)  
                 ROOTDIR=$ac_optarg ;;  
               
             -mods | --mods | -mo | --mo)  
                 ac_prev=mods ;;  
             -mods=* | --mods=* | -mo=* | --mo=*)  
                 MODS=$ac_optarg ;;  
               
             -disable | --disable)  
                 ac_prev=disable ;;  
             -disable=* | --disable=*)  
                 DISABLE=$ac_optarg ;;  
               
             -enable | --enable)  
                 ac_prev=enable ;;  
             -enable=* | --enable=*)  
                 ENABLE=$ac_optarg ;;  
               
             -noopt | --noopt)  
                 ac_prev=noopt ;;  
             -noopt=* | --noopt=*)  
                 NOOPT=$ac_optarg ;;  
               
 #           -cpp | --cpp)  
 #               ac_prev=cpp ;;  
 #           -cpp=* | --cpp=*)  
 #               CPP=$ac_optarg ;;  
               
             -fortran | --fortran | -fc | --fc)  
                 ac_prev=fc ;;  
             -fc=* | --fc=*)  
                 FC=$ac_optarg ;;  
               
             -ieee | --ieee)  
                 IEEE=1 ;;  
             -noieee | --noieee)  
                 IEEE=0 ;;  
               
             -mpi | --mpi)  
                 MPI=1 ;;  
             -nompi | --nompi)  
                 MPI=0 ;;  
               
             -jam | --jam)  
                 JAM=1 ;;  
             -nojam | --nojam)  
                 JAM=0 ;;  
               
             -*)  
                 echo "Error: unrecognized option: "$ac_option  
                 usage  
                 ;;  
               
             *)  
                 echo "Error: unrecognized argument: "$ac_option  
                 usage  
                 ;;  
               
         esac  
           
     done  
475  }  }
476    
477  #  Parse the package dependency information  #  Parse the package dependency information
# Line 199  get_pdepend_list()  { Line 480  get_pdepend_list()  {
480      #  strip the comments and then convert the dependency file into      #  strip the comments and then convert the dependency file into
481      #  two arrays: PNAME, DNAME      #  two arrays: PNAME, DNAME
482      cat $1 | sed -e 's/#.*$//g' \      cat $1 | sed -e 's/#.*$//g' \
483          | awk 'BEGIN{nn=0;} (NF>0){ for(i=2;i<=NF;i++){nn++; print "PNAME["nn"]="$1"\nDNAME["nn"]="$i} }' \          | $AWK 'BEGIN{nn=0;} (NF>0){ for(i=2;i<=NF;i++){nn++; print "PNAME["nn"]="$1"\nDNAME["nn"]="$i} }' \
484          > ./.pd_tmp          > ./.pd_tmp
485      source ./.pd_tmp      . ./.pd_tmp
486      rm -f ./.pd_tmp      rm -f ./.pd_tmp
487    
488      echo -n "PNAME = "${}      printf "PNAME = "${}
489  }  }
490    
491    
492  #  Explain usage  #  Explain usage
493  usage()  {  usage()  {
494      echo  cat <<EOF
495      echo "Usage: "$0" [OPTIONS]"  
496      echo "  where [OPTIONS] can be:"  Usage: "$0" [OPTIONS]
497      echo    where [OPTIONS] can be:
498      echo "    -help | --help | -h | --h"  
499      echo "    -nooptfile | --nooptfile"      -help | --help | -h | --h
500      echo "      -optfile NAME | --optfile NAME | -of NAME | --of NAME"            Print this help message and exit.
501      echo "      -optfile=NAME | --optfile=NAME | -of=NAME | --of=NAME"  
502      echo "    -pdepend NAME | --pdepend NAME"      -adoptfile NAME | --adoptfile NAME | -adof NAME | --adof NAME
503      echo "      -pdepend=NAME | --pdepend=NAME"        -adoptfile=NAME | --adoptfile=NAME | -adof=NAME | --adof=NAME
504      echo "    -pdefault NAME | --pdefault NAME"            Use "NAME" as the adoptfile.  By default, the file at
505      echo "      -pdefault=NAME | --pdefault=NAME"            "tools/adjoint_options/adjoint_default" will be used.
506      echo "    -makefile NAME | -ma NAME"  
507      echo "      --makefile=NAME | -ma=NAME"      -nooptfile | --nooptfile
508      echo "    -platform NAME | --platform NAME | -pl NAME | --pl NAME"        -optfile NAME | --optfile NAME | -of NAME | --of NAME
509      echo "      -platform=NAME | --platform=NAME | -pl=NAME | --pl=NAME"        -optfile=NAME | --optfile=NAME | -of=NAME | --of=NAME
510      echo "    -rootdir NAME | --rootdir NAME | -rd NAME | --rd NAME"            Use "NAME" as the optfile.  By default, an attempt will be
511      echo "      -rootdir=NAME | --rootdir=NAME | -rd=NAME | --rd=NAME"            made to find an appropriate "standard" optfile in the
512      echo "    -mods NAME | --mods NAME | -mo NAME | --mo NAME"            tools/build_options/ directory.
513      echo "      -mods=NAME | --mods=NAME | -mo=NAME | --mo=NAME"  
514      echo "    -disable NAME | --disable NAME"      -pdepend NAME | --pdepend NAME
515      echo "      -disable=NAME | --disable=NAME"        -pdepend=NAME | --pdepend=NAME
516      echo "    -enable NAME | --enable NAME"            Get package dependency information from "NAME".
517      echo "      -enable=NAME | --enable=NAME"  
518      echo "    -noopt NAME | --noopt NAME"      -pdefault NAME | --pdefault NAME
519      echo "      -noopt=NAME | --noopt=NAME"        -pdefault=NAME | --pdefault=NAME
520  #    echo "    -cpp NAME | --cpp NAME"            Get the default package list from "NAME".
521  #    echo "      -cpp=NAME | --cpp=NAME"  
522      echo "    -fortran NAME | --fortran NAME | -fc NAME | --fc NAME"      -make NAME | -m NAME
523      echo "      -fc=NAME | --fc=NAME"        --make=NAME | -m=NAME
524      echo "    -[no]ieee | --[no]ieee"            Use "NAME" for the MAKE program. The default is "make" but
525      echo "    -[no]mpi | --[no]mpi"            many platforms, "gmake" is the preferred choice.
526      echo "    -[no]jam | --[no]jam"  
527      echo      -makefile NAME | -mf NAME
528      echo "  and NAME is a string such as:"        --makefile=NAME | -mf=NAME
529      echo            Call the makefile "NAME".  The default is "Makefile".
530      echo "    --enable pkg1   --enable 'pkg1 pkg2'   --enable 'pkg1 pkg2 pkg3'"  
531      echo "    -mods=dir1   -mods='dir1'   -mods='dir1 dir2 dir3'"      -makedepend NAME | -md NAME
532      echo "    -foptim='-Mvect=cachesize:512000,transform -xtypemap=real:64,double:64,integer:32'"        --makedepend=NAME | -md=NAME
533      echo            Use "NAME" for the MAKEDEPEND program.
534      echo "  which, depending upon your shell, may need to be single-quoted"  
535      echo "  if it contains spaces, dashes, or other special characters."      -rootdir NAME | --rootdir NAME | -rd NAME | --rd NAME
536          -rootdir=NAME | --rootdir=NAME | -rd=NAME | --rd=NAME
537              Specify the location of the MITgcm ROOTDIR as "NAME".
538              By default, genamke will try to find the location by
539              looking in parent directories (up to the 5th parent).
540    
541        -mods NAME | --mods NAME | -mo NAME | --mo NAME
542          -mods=NAME | --mods=NAME | -mo=NAME | --mo=NAME
543              Here, "NAME" specifies a list of directories that are
544              used for additional source code.  Files found in the
545              "mods list" are given preference over files of the same
546              name found elsewhere.
547    
548        -disable NAME | --disable NAME
549          -disable=NAME | --disable=NAME
550              Here "NAME" specifies a list of packages that we don't
551              want to use.  If this violates package dependencies,
552              genamke will exit with an error message.
553    
554        -enable NAME | --enable NAME
555          -enable=NAME | --enable=NAME
556              Here "NAME" specifies a list of packages that we wish
557              to specifically enable.  If this violates package
558              dependencies, genamke will exit with an error message.
559    
560        -standarddirs NAME | --standarddirs NAME
561          -standarddirs=NAME | --standarddirs=NAME
562              Here, "NAME" specifies a list of directories to be
563              used as the "standard" code.
564    
565        -fortran NAME | --fortran NAME | -fc NAME | --fc NAME
566          -fc=NAME | --fc=NAME
567              Use "NAME" as the fortran compiler.  By default, genmake
568              will search for a working compiler by trying a list of
569              "usual suspects" such as g77, f77, etc.
570    
571        -cc NAME | --cc NAME | -cc=NAME | --cc=NAME
572              Use "NAME" as the C compiler.  By default, genmake
573              will search for a working compiler by trying a list of
574              "usual suspects" such as gcc, c89, cc, etc.
575    
576        -[no]ieee | --[no]ieee
577              Do or don't use IEEE numerics.  Note that this option
578              *only* works if it is supported by the OPTFILE that
579              is being used.
580    
581        -ignoretime | -ignore_time | --ignoretime | --ignore_time
582              Ignore all the "wall clock" routines entirely.  This will
583              not in any way hurt the model results -- it simply means
584              that the code that checks how long the model spends in
585              various routines will give junk values.
586    
587        -ts | --ts
588              Produce timing information per timestep
589        -papis | --papis
590              Produce summary MFlop/s (and IPC) with PAPI per timestep
591        -pcls | --pcls
592              Produce summary MFlop/s etc. with PCL per timestep
593        -foolad | --foolad
594              Fool the AD code generator
595        -papi | --papi
596              Performance analysis with PAPI
597        -pcl | --pcl
598              Performance analysis with PCL
599        -hpmt | --hpmt
600              Performance analysis with the HPM Toolkit
601    
602        -gsl | --gsl
603              Use GSL to control floating point rounding and precision
604    
605        -mpi | --mpi
606              Include MPI header files and link to MPI libraries
607        -mpi=PATH | --mpi=PATH
608              Include MPI header files and link to MPI libraries using MPI_ROOT
609              set to PATH. i.e. Include files from \$PATH/include, link to libraries
610              from \$PATH/lib and use binaries from \$PATH/bin.
611    
612        -es | --es | -embed-source | --embed-source
613              Embed a tarball containing the full source code
614              (including the Makefile, etc.) used to build the
615              executable [off by default]
616    
617        -bash NAME
618              Explicitly specify the Bourne or BASH shell to use
619    
620      While it is most often a single word, the "NAME" variables specified
621      above can in many cases be a space-delimited string such as:
622    
623        --enable pkg1   --enable 'pkg1 pkg2'   --enable 'pkg1 pkg2 pkg3'
624        -mods=dir1   -mods='dir1'   -mods='dir1 dir2 dir3'
625        -foptim='-Mvect=cachesize:512000,transform -xtypemap=real:64,double:64,integer:32'
626    
627      which, depending upon your shell, may need to be single-quoted.
628    
629      For more detailed genmake documentation, please see:
630    
631        http://mitgcm.org/devel_HOWTO/
632    
633    EOF
634    
635      exit 1      exit 1
636  }  }
637    
638  # Dump all important state  #  Build a CPP macro to automate calling C routines from FORTRAN
639  dump_state()  {  get_fortran_c_namemangling()  {
640      fname=$1  
641      echo " " > $fname      #echo "FC_NAMEMANGLE = \"$FC_NAMEMANGLE\""
642        if test ! "x$FC_NAMEMANGLE" = x ; then
643            return 0
644        fi
645    
646        default_nm="#define FC_NAMEMANGLE(X) X ## _"
647        
648        cat > genmake_test.c <<EOF
649    void tcall( char * string ) { tsub( string ); }
650    EOF
651        $MAKE genmake_test.o >> genmake_warnings 2>&1
652      RETVAL=$?      RETVAL=$?
653      if test "x${RETVAL}" = x ; then      if test "x$RETVAL" != x0 ; then
654          echo "Error: cannot write to $fname"          FC_NAMEMANGLE=$default_nm
655          exit 1          cat <<EOF>> genmake_errors
656    
657    WARNING: C test compile fails
658    WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
659    WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here
660    EOF
661            return 1
662        fi
663        c_tcall=`nm genmake_test.o 2>/dev/null | grep 'T ' | grep tcall | cut -d ' ' -f 3`
664        RETVAL=$?
665        if test "x$RETVAL" != x0 ; then
666            FC_NAMEMANGLE=$default_nm
667            cat <<EOF>> genmake_warnings
668    
669    WARNING: The "nm" command failed.
670    WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
671    WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here
672    EOF
673            return 1
674        fi
675        cat > genmake_tcomp.$FS <<EOF
676          subroutine tcall( string )
677          character*(*) string
678          call tsub( string )
679          end
680    EOF
681        $FC $FFLAGS -c genmake_tcomp.$FS >> genmake_warnings 2>&1
682        RETVAL=$?
683        if test "x$RETVAL" != x0 ; then
684            FC_NAMEMANGLE=$default_nm
685            cat <<EOF>> genmake_warnings
686    
687    WARNING: FORTRAN test compile fails -- please see "genmake_errors"
688    WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
689    WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here.
690    EOF
691            return 1
692        fi
693        f_tcall=`nm genmake_tcomp.o 2>/dev/null | grep 'T ' | grep tcall | cut -d ' ' -f 3`
694        RETVAL=$?
695        if test "x$RETVAL" != x0 ; then
696            FC_NAMEMANGLE=$default_nm
697            cat <<EOF>> genmake_warnings
698    
699    WARNING: The "nm" command failed.
700    WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
701    WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here.
702    EOF
703            return 1
704      fi      fi
705      echo "makefile "$makefile > $fname  
706        c_a=`echo $c_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 1 | sed -e 's|Y||'`
707        f_a=`echo $f_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 1 | sed -e 's|Y||'`
708        c_b=`echo $c_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 2 | sed -e 's|Y||'`
709        f_b=`echo $f_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 2 | sed -e 's|Y||'`
710    
711        nmangle="X"
712        if test "x$c_a" != "x$f_a" ; then
713            comm="echo x$f_a | sed -e 's|x$c_a||'"
714            a=`eval $comm`
715            nmangle="$a ## $nmangle"
716        fi
717        if test "x$c_b" != "x$f_b" ; then
718            comm="echo x$f_b | sed -e 's|x$c_b||'"
719            b=`eval $comm`
720            nmangle="$nmangle ## $b"
721        fi
722    
723        FC_NAMEMANGLE="#define FC_NAMEMANGLE(X)  $nmangle"
724    
725        #  cleanup the testing files
726        rm -f genmake_tcomp.* genmake_test.*
727  }  }
728    
729    
730  #eh3 # This is the generic configuration.  check_HAVE_CLOC()  {
731  #eh3 set LN         = ( 'ln -s' )      get_fortran_c_namemangling
732  #eh3 set CPP        = ( '/lib/cpp -P' )      cat <<EOF > genmake_tc_1.c
733  #eh3 set S64        = ( '$(TOOLSDIR)/set64bitConst.sh' )  $FC_NAMEMANGLE
734  #eh3 set KPP        = (  )  #include <stdio.h>
735  #eh3 set FC         = ( 'f77' )  #include <stdlib.h>
736  #eh3 set LINK       = $FC  #include <unistd.h>
737  #eh3 set MAKEDEPEND = ( 'makedepend' )  #include <assert.h>
738  #eh3 set INCLUDES   = ( -I. )  #include <sys/time.h>
739  #eh3 set FFLAGS     = (  )  void FC_NAMEMANGLE(cloc) ( double *curtim )
740  #eh3 set FOPTIM     = (  )  {
741  #eh3 set CFLAGS     = (  )   struct timeval tv1;
742  #eh3 set KFLAGS1    = (  )   gettimeofday(&tv1 , (void *)NULL );
743  #eh3 set KFLAGS2    = (  )   *curtim =  (double)((tv1.tv_usec)+(tv1.tv_sec)*1.E6);
744  #eh3 set LIBS       = (  )   *curtim = *curtim/1.E6;
745  #eh3 set KPPFILES   = (  )  }
746  #eh3 if (! $?NOOPTFILES ) set NOOPTFILES = (  )  EOF
747  #eh3 if (! $?NOOPTFLAGS ) set NOOPTFLAGS = (  )      make genmake_tc_1.o >> genmake_warnings 2>&1
748        RET_C=$?
749        cat <<EOF > genmake_tc_2.$FS
750          program hello
751          REAL*8 wtime
752          external cloc
753          call cloc(wtime)
754          print *," HELLO WORLD", wtime
755          end
756    EOF
757        $FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o >> genmake_warnings 2>&1
758        RET_F=$?
759        test -x ./genmake_tc  &&  ./genmake_tc >> genmake_warnings 2>&1
760        RETVAL=$?
761        if test "x$RETVAL" = x0 ; then
762            HAVE_CLOC=t
763            DEFINES="$DEFINES -DHAVE_CLOC"
764        fi
765        rm -f genmake_tc*
766    }
767    
768    
769    check_HAVE_SIGREG()  {
770        get_fortran_c_namemangling
771        cat <<EOF > genmake_tc_1.c
772    $FC_NAMEMANGLE
773    #include <stdlib.h>
774    #include <stdio.h>
775    #include <signal.h>
776    #include <errno.h>
777    #include <ucontext.h>
778    
779    int * ip;
780    
781    static void killhandler(
782        unsigned int sn, siginfo_t  si, struct ucontext *sc )
783    {
784        *ip = *ip + 1;
785        return;
786    }
787    
788    void FC_NAMEMANGLE(sigreg) (int * aip)
789    {
790        struct sigaction s;
791        ip = aip;
792        s.sa_flags = SA_SIGINFO;
793        s.sa_sigaction = (void *)killhandler;
794        if(sigaction (SIGTERM,&s,(struct sigaction *)NULL)) {
795            printf("Sigaction returned error = %d\n", errno);
796            exit(0);
797        }
798        return;
799    }
800    EOF
801        make genmake_tc_1.o >> genmake_warnings 2>&1
802        RET_C=$?
803        cat <<EOF > genmake_tc_2.$FS
804          program hello
805          integer anint
806          common /iv/ anint
807          external sigreg
808          call sigreg(anint)
809          end
810    EOF
811        echo >> genmake_warnings
812        echo "running: check_HAVE_SIGREG()" >> genmake_warnings
813        cat genmake_tc_2.$FS >> genmake_warnings
814        COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
815        echo $COMM >> genmake_warnings
816        $COMM >> genmake_warnings 2>&1
817        RETVAL=$?
818        if test "x$RETVAL" = x0 ; then
819            HAVE_SIGREG=t
820            DEFINES="$DEFINES -DHAVE_SIGREG"
821        fi
822        rm -f genmake_tc*
823    }
824    
825    
826    check_HAVE_SETRLSTK()  {
827        get_fortran_c_namemangling
828        cat <<EOF > genmake_tc_1.c
829    $FC_NAMEMANGLE
830    #include <sys/time.h>
831    #include <sys/resource.h>
832    #include <unistd.h>
833    void FC_NAMEMANGLE(setrlstk) ()
834    {
835        struct rlimit rls;
836        rls.rlim_cur = RLIM_INFINITY;
837        rls.rlim_max = RLIM_INFINITY;
838        setrlimit(RLIMIT_STACK, &rls);
839        return;
840    }
841    EOF
842        make genmake_tc_1.o >> genmake_warnings 2>&1
843        RET_C=$?
844        cat <<EOF > genmake_tc_2.$FS
845          program hello
846          external setrlstk
847          call setrlstk()
848          end
849    EOF
850        echo >> genmake_warnings
851        echo "running: check_HAVE_SETRLSTK()" >> genmake_warnings
852        cat genmake_tc_2.$FS >> genmake_warnings
853        COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
854        echo $COMM >> genmake_warnings
855        $COMM >> genmake_warnings 2>&1
856        RETVAL=$?
857        if test "x$RETVAL" = x0 ; then
858            HAVE_SETRLSTK=t
859            DEFINES="$DEFINES -DHAVE_SETRLSTK"
860        fi
861        rm -f genmake_tc*
862    }
863    
864    
865    check_HAVE_STAT()  {
866        get_fortran_c_namemangling
867        cat <<EOF > genmake_tc_1.c
868    $FC_NAMEMANGLE
869    #include <stdio.h>
870    #include <stdlib.h>
871    #include <unistd.h>
872    #include <sys/stat.h>
873    #include <sys/types.h>
874    void FC_NAMEMANGLE(tfsize) ( int *nbyte )
875    {
876        char name[512];
877        struct stat astat;
878    
879        name[0] = 'a'; name[1] = '\0';
880        if (! stat(name, &astat))
881            *nbyte = (int)(astat.st_size);
882        else
883            *nbyte = -1;
884    }
885    EOF
886        make genmake_tc_1.o >> genmake_tc.log 2>&1
887        RET_C=$?
888        cat <<EOF > genmake_tc_2.$FS
889          program hello
890          integer nbyte
891          call tfsize(nbyte)
892          print *," HELLO WORLD", nbyte
893          end
894    EOF
895        echo >> genmake_warnings
896        echo "running: check_HAVE_STAT()" >> genmake_warnings
897        cat genmake_tc_2.$FS >> genmake_warnings
898        COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
899        echo $COMM >> genmake_warnings
900        $COMM >> genmake_tc.log 2>&1
901        RETVAL=$?
902        if test "x$RETVAL" = x0 ; then
903            HAVE_STAT=t
904            DEFINES="$DEFINES -DHAVE_STAT"
905        fi
906        rm -f genmake_tc*
907    }
908    
909    
910    check_netcdf_libs()  {
911        if test ! "x$SKIP_NETCDF_CHECK" = x ; then
912            return
913        fi
914        echo >> genmake_warnings
915        echo "running: check_netcdf_libs()" >> genmake_warnings
916        cat <<EOF > genmake_tnc.F
917          program fgennc
918    #include "netcdf.inc"
919    EOF
920        if test ! "x$MPI" = x ; then
921            echo '#include "mpif.h"' >> genmake_tnc.F
922        fi
923        cat <<EOF >> genmake_tnc.F
924          integer iret, ncid, xid
925          iret = nf_create('genmake_tnc.nc', NF_CLOBBER, ncid)
926          IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
927          iret = nf_def_dim(ncid, 'X', 11, xid)
928          IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
929          iret = nf_close(ncid)
930          IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
931          end
932    EOF
933        echo "===  genmake_tnc.F  ===" > genmake_tnc.log
934        cat genmake_tnc.F >> genmake_tnc.log
935        echo "===  genmake_tnc.F  ===" >> genmake_tnc.log
936        RET_CPP=f
937        COMM="cat genmake_tnc.F | $CPP $DEFINES $INCLUDES"
938        echo "$COMM" >> genmake_tnc.log
939        $COMM > genmake_tnc.$FS 2>/dev/null  &&  RET_CPP=t
940        if test "x$RET_CPP" = xf ; then
941            echo "  WARNING: CPP failed to pre-process the netcdf test." \
942                >> genmake_tnc.log
943            echo "    Please check that \$INCLUDES is properly set." \
944                >> genmake_tnc.log
945        fi
946        echo "$FC $FFLAGS $FOPTIM -c genmake_tnc.$FS  \ " >> genmake_tnc.log
947        echo "  &&  $LINK -o genmake_tnc.o $LIBS" >> genmake_tnc.log
948        $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1  \
949            &&  $LINK -o genmake_tnc genmake_tnc.o $LIBS >> genmake_tnc.log 2>&1
950        RET_COMPILE=$?
951        cat genmake_tnc.log >> genmake_warnings
952    
953        #EH3  Remove test program execution for machines that either disallow
954        #EH3  execution or cannot support it (eg. cross-compilers)
955        #EH3
956        #EH3 test -x ./genmake_tnc  &&  ./genmake_tnc >> genmake_tnc.log 2>&1
957        #EH3 RETVAL=$?
958        #EH3 if test "x$RET_COMPILE" = x0 -a "x$RETVAL" = x0 ; then
959    
960        if test "x$RET_COMPILE" = x0 ; then
961            HAVE_NETCDF=t
962        else
963            # try again with "-lnetcdf" added to the libs
964            echo "try again with added '-lnetcdf'" > genmake_tnc.log
965            echo "cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS \ " >> genmake_tnc.log
966            echo " &&  $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS \ " >> genmake_tnc.log
967            echo " &&  $LINK -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf" >> genmake_tnc.log
968            cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS 2>/dev/null  \
969                &&  $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1  \
970                &&  $LINK -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf >> genmake_tnc.log 2>&1
971            RET_COMPILE=$?
972            cat genmake_tnc.log >> genmake_warnings
973            if test "x$RET_COMPILE" = x0 ; then
974                LIBS="$LIBS -lnetcdf"
975                HAVE_NETCDF=t
976            fi
977        fi
978        rm -f genmake_tnc*
979    }
980    
981    
982    
983    ###############################################################################
984    #   Sequential part of script starts here
985    ###############################################################################
986    
987  #  Set defaults here  #  Set defaults here
988    COMMANDL="$0 $@"
989    
990  PLATFORM=  PLATFORM=
991  LN=  LN=
992  S64=  S64=
993  KPP=  KPP=
994  FC=  #FC=
995    #CC=gcc
996    #CPP=
997  LINK=  LINK=
998    DEFINES=
999  PACKAGES=  PACKAGES=
1000  ENABLE=  ENABLE=
1001  DISABLE=  DISABLE=
1002  MAKEFILE=  # MAKEFILE=
1003  MAKEDEPEND=  # MAKEDEPEND=
1004  PDEPEND=  PDEPEND=
1005    DUMPSTATE=t
1006  PDEFAULT=  PDEFAULT=
1007  OPTFILE=  OPTFILE=
1008  INCLUDES="-I."  INCLUDES="-I. $INCLUDES"
1009  FFLAGS=  FFLAGS=
1010  FOPTIM=  FOPTIM=
1011  CFLAGS=  CFLAGS=
1012  KFLAGS1=  KFLAGS1=
1013  KFLAGS2=  KFLAGS2=
1014    #LDADD=
1015  LIBS=  LIBS=
1016  KPPFILES=  KPPFILES=
1017  NOOPTFILES=  NOOPTFILES=
1018  NOOPTFLAGS=  NOOPTFLAGS=
1019    MPI=
1020    MPIPATH=
1021    TS=
1022    PAPIS=
1023    PCLS=
1024    FOOLAD=
1025    PAPI=
1026    PCL=
1027    HPMT=
1028    GSL=
1029    HAVE_TEST_L=
1030    
1031    # DEFINES checked by test compilation or command-line
1032    HAVE_SYSTEM=
1033    HAVE_FDATE=
1034    FC_NAMEMANGLE=
1035    HAVE_CLOC=
1036    HAVE_SETRLSTK=
1037    HAVE_STAT=
1038    HAVE_NETCDF=
1039    HAVE_ETIME=
1040    IGNORE_TIME=
1041    
1042  MODS=  MODS=
1043  TOOLSDIR=  TOOLSDIR=
1044  SOURCEDIRS=  SOURCEDIRS=
1045  INCLUDEDIRS=  INCLUDEDIRS=
1046    STANDARDDIRS="USE_THE_DEFAULT"
1047    
1048    G2ARGS=
1049    BASH=
1050  PWD=`pwd`  PWD=`pwd`
1051  MAKE=make  test "x$MAKE" = x  &&  MAKE=make
1052  THISHOSTNAME=`hostname`  test "x$AWK" = x   &&  AWK=awk
1053    EMBED_SRC=
1054    THISHOST=`hostname`
1055  THISCWD=`pwd`  THISCWD=`pwd`
1056  THISDATE=`date`  THISDATE=`date`
1057    THISUSER=`echo $USER`
1058    THISVER=
1059  MACHINE=`uname -a`  MACHINE=`uname -a`
1060    EXECUTABLE=
1061    EXEHOOK=
1062    EXEDIR=
1063    PACKAGES_CONF=
1064    IEEE=
1065    if test "x$MITGCM_IEEE" != x ; then
1066        IEEE=$MITGCM_IEEE
1067    fi
1068    FS=
1069    FS90=
1070    
1071    AUTODIFF_PKG_USED=f
1072    AD_OPTFILE=
1073    TAF=
1074    AD_TAF_FLAGS=
1075    FTL_TAF_FLAGS=
1076    SVD_TAF_FLAGS=
1077    TAF_EXTRA=
1078    TAMC=
1079    AD_TAMC_FLAGS=
1080    FTL_TAF_FLAGS=
1081    SVD_TAMC_FLAGS=
1082    TAMC_EXTRA=
1083    
1084    
1085    #  The following state can be set directly by command-line switches
1086    gm_s1="OPTFILE PDEPEND PDEFAULT MAKEFILE PLATFORM ROOTDIR MODS DISABLE ENABLE"
1087    gm_s2="FC CPP IEEE TS PAPIS PCLS PAPI PCL HPMT GSL MPI JAM DUMPSTATE STANDARDDIRS"
1088    
1089    #  The following state is not directly set by command-line switches
1090    gm_s3="LN S64 KPP LINK PACKAGES MAKEDEPEND PDEPEND PDEFAULT INCLUDES FFLAGS FOPTIM "
1091    gm_s4="CFLAGS KFLAGS1 KFLAGS2 LIBS KPPFILES NOOPTFILES NOOPTFLAGS"
1092    gm_s5="TOOLSDIR SOURCEDIRS INCLUDEDIRS PWD MAKE THISHOST THISUSER THISDATE THISVER MACHINE"
1093    gm_s6="EXECUTABLE EXEHOOK EXEDIR PACKAGES_CONF"
1094    gm_s7="HAVE_SYSTEM HAVE_FDATE FC_NAMEMANGLE HAVE_ETIME"
1095    
1096    #  The following are all related to adjoint/tangent-linear stuff
1097    gm_s10="AUTODIFF_PKG_USED AD_OPTFILE TAMC TAF AD_TAMC_FLAGS AD_TAF_FLAGS"
1098    gm_s11="FTL_TAMC_FLAGS FTL_TAF_FLAGS SVD_TAMC_FLAGS SVD_TAF_FLAGS"
1099    gm_s12="TAF_EXTRA TAMC_EXTRA"
1100    
1101    gm_state="COMMANDL $gm_s1 $gm_s2 $gm_s3 $gm_s4 $gm_s5 $gm_s6 $gm_s7"
1102    gm_state="$gm_state $gm_s10 $gm_s11 $gm_s12"
1103    
1104    cat <<EOF
1105    
1106    GENMAKE :
1107    
1108    A program for GENerating MAKEfiles for the MITgcm project.  For a
1109    quick list of options, use "genmake -h" or for more detail see:
1110    
1111      http://mitgcm.org/devel_HOWTO/
1112    
1113    EOF
1114    
 echo  
1115  echo "===  Processing options files and arguments  ==="  echo "===  Processing options files and arguments  ==="
1116  gm_local="./gm_local"  gm_local="genmake_local"
1117  echo -n "  getting local config information:  "  for i in . $MODS ; do
1118  if test -e $gm_local ; then      if test -r $i/$gm_local ; then
1119            . $i/$gm_local
1120            break
1121        fi
1122    done
1123    printf "  getting local config information:  "
1124    if test -f $gm_local ; then
1125      echo "using $gm_local"      echo "using $gm_local"
1126      source $gm_local      . $gm_local
1127      # echo "DISABLE=$DISABLE"      # echo "DISABLE=$DISABLE"
1128      # echo "ENABLE=$ENABLE"      # echo "ENABLE=$ENABLE"
1129  else  else
1130      echo "none found"      echo "none found"
1131  fi  fi
1132    
1133  #  echo "$0::$1:$2:$3:$4:$5:$6:$7:"  #echo "$0::$1:$2:$3:$4:$5:$6:$7:"
1134  #OPTIONS=  #OPTIONS=
1135  #n=0  #n=0
1136  #for i ; do  #for i ; do
# Line 349  fi Line 1141  fi
1141  #   n=$(( $n + 1 ))  #   n=$(( $n + 1 ))
1142  #done  #done
1143  #parse_options  #parse_options
   
1144  ac_prev=  ac_prev=
1145  for ac_option ; do  for ac_option in "$@" ; do
1146    
1147        G2ARGS="$G2ARGS \"$ac_option\""
1148    
1149      # If the previous option needs an argument, assign it.      # If the previous option needs an argument, assign it.
1150      if test -n "$ac_prev"; then      if test -n "$ac_prev"; then
# Line 374  for ac_option ; do Line 1167  for ac_option ; do
1167          -optfile=* | --optfile=* | -of=* | --of=*)          -optfile=* | --optfile=* | -of=* | --of=*)
1168              OPTFILE=$ac_optarg ;;              OPTFILE=$ac_optarg ;;
1169                    
1170            -adoptfile | --adoptfile | -adof | --adof)
1171                ac_prev=AD_OPTFILE ;;
1172            -adoptfile=* | --adoptfile=* | -adof=* | --adof=*)
1173                AD_OPTFILE=$ac_optarg ;;
1174            
1175          -pdepend | --pdepend)          -pdepend | --pdepend)
1176              ac_prev=PDEPEND ;;              ac_prev=PDEPEND ;;
1177          -pdepend=* | --pdepend=*)          -pdepend=* | --pdepend=*)
# Line 384  for ac_option ; do Line 1182  for ac_option ; do
1182          -pdefault=* | --pdefault=*)          -pdefault=* | --pdefault=*)
1183              PDEFAULT=$ac_optarg ;;              PDEFAULT=$ac_optarg ;;
1184                    
1185          -makefile | -ma)          -make | --make | -m | --m)
1186                ac_prev=MAKE ;;
1187            -make=* | --make=* | -m=* | --m=*)
1188                MAKE=$ac_optarg ;;
1189            
1190            -bash | --bash)
1191                ac_prev=BASH ;;
1192            -bash=* | --bash=*)
1193                BASH=$ac_optarg ;;
1194            
1195            -makedepend | --makedepend | -md | --md)
1196                ac_prev=MAKEDEPEND ;;
1197            -makedepend=* | --makedepend=* | -md=* | --md=*)
1198                MAKEDEPEND=$ac_optarg ;;
1199            
1200            -makefile | --makefile | -ma | --ma)
1201              ac_prev=MAKEFILE ;;              ac_prev=MAKEFILE ;;
1202          --makefile=* | -ma=*)          -makefile=* | --makefile=* | -ma=* | --ma=*)
1203              MAKEFILE=$ac_optarg ;;              MAKEFILE=$ac_optarg ;;
1204                    
1205          -platform | --platform | -pl | --pl)          -platform | --platform | -pl | --pl | -platform=* | --platform=* | -pl=* | --pl=*)
1206              ac_prev=PLATFORM ;;              echo "ERROR: The platform option has been removed.  Please specify"
1207          -platform=* | --platform=* | -pl=* | --pl=*)              echo "  the build options using the \"optfile\" mechanism."
1208              PLATFORM=$ac_optarg ;;              echo
1209                usage
1210                ;;
1211                    
1212          -rootdir | --rootdir | -rd | --rd)          -rootdir | --rootdir | -rd | --rd)
1213              ac_prev=ROOTDIR ;;              ac_prev=ROOTDIR ;;
# Line 414  for ac_option ; do Line 1229  for ac_option ; do
1229          -enable=* | --enable=*)          -enable=* | --enable=*)
1230              ENABLE=$ac_optarg ;;              ENABLE=$ac_optarg ;;
1231                    
1232          -noopt | --noopt)          -standarddirs | --standarddirs)
1233              ac_prev=NOOPT ;;              ac_prev=STANDARDDIRS ;;
1234          -noopt=* | --noopt=*)          -standarddirs=* | --standarddirs=*)
1235              NOOPT=$ac_optarg ;;              STANDARDDIRS=$ac_optarg ;;
1236            
1237  #           -cpp | --cpp)  #           -cpp | --cpp)
1238  #               ac_prev=cpp ;;  #               ac_prev=cpp ;;
1239  #           -cpp=* | --cpp=*)  #           -cpp=* | --cpp=*)
1240  #               CPP=$ac_optarg ;;  #               CPP=$ac_optarg ;;
1241                        
1242            -cc | --cc)
1243                ac_prev=CC ;;
1244            -cc=* | --cc=*)
1245                CC=$ac_optarg ;;
1246            
1247          -fortran | --fortran | -fc | --fc)          -fortran | --fortran | -fc | --fc)
1248              ac_prev=FC ;;              ac_prev=FC ;;
1249          -fc=* | --fc=*)          -fc=* | --fc=*)
1250              FC=$ac_optarg ;;              FC=$ac_optarg ;;
1251                    
1252            -fs | --fs)
1253                ac_prev=FS ;;
1254            -fs=* | --fs=*)
1255                FS=$ac_optarg ;;
1256            
1257            -fs90 | --fs90)
1258                ac_prev=FS90 ;;
1259            -fs90=* | --fs90=*)
1260                FS90=$ac_optarg ;;
1261            
1262          -ieee | --ieee)          -ieee | --ieee)
1263              IEEE=1 ;;              IEEE=true ;;
1264          -noieee | --noieee)          -noieee | --noieee)
1265              IEEE=0 ;;              IEEE= ;;
1266            
1267            -ts | --ts)
1268                TS=true ;;
1269            -papis | --papis)
1270                PAPIS=true ;;
1271            -pcls | --pcls)
1272                PCLS=true ;;
1273            -foolad | --foolad)
1274                FOOLAD=true ;;
1275            -papi | --papi)
1276                PAPI=true ;;
1277            -pcl | --pcl)
1278                PCL=true ;;
1279            -hpmt | --hpmt)
1280                HPMT=true ;;
1281    
1282            -gsl | --gsl)
1283                GSL=true ;;
1284    
1285          -mpi | --mpi)          -mpi | --mpi)
1286              MPI=1 ;;              MPI=true ;;
1287          -nompi | --nompi)          -mpi=* | --mpi=*)
1288              MPI=0 ;;              MPIPATH=$ac_optarg
1289                        MPI=true ;;
1290          -jam | --jam)          
1291              JAM=1 ;;  #       -jam | --jam)
1292          -nojam | --nojam)  #           JAM=1 ;;
1293              JAM=0 ;;  #       -nojam | --nojam)
1294    #           JAM=0 ;;
1295            
1296            -ds | --ds)
1297                DUMPSTATE=t ;;
1298            
1299            -taf_extra | --taf_extra)
1300                ac_prev=TAF_EXTRA ;;
1301            -taf_extra=* | --taf_extra=*)
1302                TAF_EXTRA=$ac_optarg ;;
1303    
1304            -tamc_extra | --tamc_extra)
1305                ac_prev=TAMC_EXTRA ;;
1306            -tamc_extra=* | --tamc_extra=*)
1307                TAMC_EXTRA=$ac_optarg ;;
1308                    
1309            -ignoretime | -ignore_time | --ignoretime | --ignore_time)
1310                IGNORE_TIME="-DIGNORE_TIME" ;;
1311    
1312            -es | --es | -embed-source | --embed-source)
1313                EMBED_SRC=t ;;
1314    
1315          -*)          -*)
1316              echo "Error: unrecognized option: "$ac_option              echo "Error: unrecognized option: "$ac_option
1317              usage              usage
# Line 458  for ac_option ; do Line 1326  for ac_option ; do
1326            
1327  done  done
1328    
1329  echo "  getting OPTFILE information:  "  
1330  if test "x${OPTFILE}" = x ; then  if test -f ./.genmakerc ; then
1331      echo "Warning: no OPTFILE specified so we'll look for possible settings"      echo
1332      printf "\n===  Searching for possible settings for OPTFILE  ===\n"      echo "WARNING: genmake2 has detected a copy of the old-style \"./.genmakerc\""
1333      find_possible_configs      echo "  file.  This file format is no longer supported.  Please see:"
1334        echo
1335        echo "    http://mitgcm.org/devel_HOWTO/"
1336        echo
1337        echo "  for directions on how to setup and use the new \"genmake2\" input"
1338        echo "  files and send an email to MITgcm-support@mitgcm.org if you want help."
1339        echo
1340    fi
1341    
1342    #  Find the MITgcm ${ROOTDIR}
1343    if test "x${ROOTDIR}" = x ; then
1344        tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1345        if test "x$tmp" = "xbin" -a -d ../model -a -d ../eesup -a -d ../pkg ; then
1346            ROOTDIR=".."
1347        else
1348            for d in . .. ../.. ../../.. ../../../.. ../../../../.. ; do
1349                if [ -d "$d/model" -a -d "$d/eesupp" -a -d "$d/pkg" ]; then
1350                    ROOTDIR=$d
1351                    printf "Warning:  ROOTDIR was not specified but there appears to be"
1352                    echo " a copy of MITgcm at \"$ROOTDIR\" so we'll try it."
1353                    break
1354                fi
1355            done
1356        fi
1357    fi
1358    if test "x${ROOTDIR}" = x ; then
1359        echo "Error: Cannot determine ROOTDIR for MITgcm code."
1360        echo "  Please specify a ROOTDIR using either an options "
1361        echo "  file or a command-line option."
1362        exit 1
1363    fi
1364    if test ! -d ${ROOTDIR} ; then
1365        echo "Error: the specified ROOTDIR (\"$ROOTDIR\") does not exist!"
1366        exit 1
1367    fi
1368    
1369    #  Find the MITgcm ${THISVER}
1370    if test -f "${ROOTDIR}/doc/tag-index" ; then
1371        THISVER=`grep '^checkpoint' ${ROOTDIR}/doc/tag-index | head -1`
1372    fi
1373    
1374    if test "x$MAKEFILE" = x ; then
1375        MAKEFILE="Makefile"
1376    fi
1377    
1378    echo "  getting OPTFILE information:  "
1379    if test "x${OPTFILE}" = x ; then
1380        if test "x$MITGCM_OF" = x ; then
1381            echo "Warning: no OPTFILE specified so we'll look for possible settings"
1382            printf "\n===  Searching for possible settings for OPTFILE  ===\n"
1383            find_possible_configs
1384        else
1385            OPTFILE=$MITGCM_OF
1386        fi
1387    fi
1388    if test "x$OPTFILE" != xNONE ; then
1389        if test -f "$OPTFILE" -a -r "$OPTFILE" ; then
1390            echo "    using OPTFILE=\"$OPTFILE\""
1391            . "$OPTFILE"
1392            RETVAL=$?
1393            if test "x$RETVAL" != x0 ; then
1394                printf "Error: failed to source OPTFILE \"$OPTFILE\""
1395                echo "--please check that variable syntax is bash-compatible"
1396                exit 1
1397            fi
1398            if test "x$DUMPSTATE" != xf ; then
1399                cp -f $OPTFILE "genmake_optfile"
1400            fi
1401        else
1402            echo "Error: can't read OPTFILE=\"$OPTFILE\""
1403            exit 1
1404        fi
1405    fi
1406    
1407    echo "  getting AD_OPTFILE information:  "
1408    if test "x${AD_OPTFILE}" = x ; then
1409        if test "x$MITGCM_AD_OF" = x ; then
1410            AD_OPTFILE=$ROOTDIR/tools/adjoint_options/adjoint_default
1411        else
1412            AD_OPTFILE=$MITGCM_AD_OF
1413        fi
1414    fi
1415    if test "x${AD_OPTFILE}" != xNONE ; then
1416        if test -f "$AD_OPTFILE" -a -r "$AD_OPTFILE" ; then
1417            echo "    using AD_OPTFILE=\"$AD_OPTFILE\""
1418            . "$AD_OPTFILE"
1419            RETVAL=$?
1420            if test "x$RETVAL" != x0 ; then
1421                printf "Error: failed to source AD_OPTFILE \"$AD_OPTFILE\""
1422                echo "--please check that variable syntax is bash-compatible"
1423                exit 1
1424            fi
1425            if test "x$DUMPSTATE" != xf ; then
1426                cp -f $AD_OPTFILE "genmake_ad_optfile"
1427            fi
1428        else
1429            echo "Error: can't read AD_OPTFILE=\"$AD_OPTFILE\""
1430            exit 1
1431        fi
1432    fi
1433    
1434    #====================================================================
1435    #  Set default values if not set by the optfile
1436    #
1437    #  Check that FC, CC, LINK, CPP, S64, LN, and MAKE are defined.  If not,
1438    #  either set defaults or complain and abort!
1439    if test ! "x$BASH" = x ; then
1440        # add a trailing space so that it works within the Makefile syntax (see below)
1441        BASH="$BASH "
1442    fi
1443    if test "x$FC" = x ; then
1444        cat <<EOF 1>&2
1445    
1446    Error: no Fortran compiler: please specify using one of the following:
1447      1) within the options file ("FC=...") as specified by "-of=OPTFILE"
1448      2) the "-fc=XXX" command-line option
1449      3) the "./genmake_local" file
1450    EOF
1451        exit 1
1452    fi
1453    if test "x$CC" = x ; then
1454        CC=cc
1455    #     cat <<EOF 1>&2
1456    # Error: no C compiler: please specify using one of the following:
1457    #   1) within the options file ("CC=...") as specified by "-of=OPTFILE"
1458    #   2) the "-cc=XXX" command-line option
1459    #   3) the "./genmake_local" file
1460    # EOF
1461    #     exit 1
1462    fi
1463    if test "x$LINK" = x ; then
1464        LINK=$FC
1465    fi
1466    if test "x$MAKE" = x ; then
1467        MAKE="make"
1468    fi
1469    if test "x$CPP" = x ; then
1470        CPP=cpp
1471    fi
1472    #EH3 === UGLY ===
1473    #  The following is an ugly little hack to check for $CPP in /lib/ and
1474    #  it should eventually be replaced with a more general function that
1475    #  searches a combo of the user's path and a list of "usual suspects"
1476    #  to find the correct location for binaries such as $CPP.
1477    for i in " " "/lib/" ; do
1478        echo "#define A a" | $i$CPP > test_cpp 2>&1 && CPP=$i$CPP
1479    done
1480    #EH3 === UGLY ===
1481    echo "#define A a" | $CPP > test_cpp 2>&1
1482    RETVAL=$?
1483    if test "x$RETVAL" != x0 ; then
1484        cat <<EOF 1>&2
1485    
1486    Error: C pre-processor "$CPP" failed the test case: please specify using:
1487    
1488      1) within the options file ("CPP=...") as specified by "-of=OPTFILE"
1489      2) the "./genmake_local" file
1490      3) with the CPP environment variable
1491    
1492    EOF
1493        exit 1
1494    else
1495        rm -f test_cpp
1496    fi
1497    look_for_makedepend
1498    if test "x$LN" = x ; then
1499        LN="ln -s"
1500    fi
1501    echo "test" > genmake_test_ln
1502    $LN genmake_test_ln genmake_tlink
1503    RETVAL=$?
1504    if test "x$RETVAL" != x0 ; then
1505        cat <<EOF 1>&2
1506    
1507    Error: The command "ln -s" failed -- please specify a working soft-link
1508      command in the optfile.
1509    
1510    EOF
1511        exit 1
1512    fi
1513    test -L genmake_tlink > /dev/null 2>&1
1514    RETVAL=$?
1515    if test "x$RETVAL" = x0 ; then
1516        HAVE_TEST_L=t
1517    fi
1518    rm -f genmake_test_ln genmake_tlink
1519    
1520    #  Check for broken *.F/*.f handling and fix if possible
1521    check_for_broken_Ff
1522    
1523    if test ! "x$MPI" = x ; then
1524          echo "  Turning on MPI cpp macros"
1525          DEFINES="$DEFINES -DALLOW_USE_MPI -DALWAYS_USE_MPI"
1526    fi
1527    
1528    if test ! "x$TS" = x ; then
1529          echo "  Turning on timing per timestep"
1530          if test ! "x$FOOLAD" = x ; then
1531                DEFINES="$DEFINES -DTIME_PER_TIMESTEP_SFP"
1532          else
1533                DEFINES="$DEFINES -DTIME_PER_TIMESTEP"
1534          fi
1535    fi
1536    if test ! "x$PAPIS" = x ; then
1537          echo "  Turning on PAPI flop summary per timestep"
1538          echo "  Please make sure PAPIINC, PAPILIB are defined"
1539          if test ! "x$FOOLAD" = x ; then
1540                DEFINES="$DEFINES -DUSE_PAPI_FLOPS_SFP"
1541          else
1542                DEFINES="$DEFINES -DUSE_PAPI_FLOPS"
1543          fi
1544          INCLUDES="$INCLUDES $PAPIINC"
1545          LIBS="$LIBS $PAPILIB"
1546    fi
1547    if test ! "x$PCLS" = x ; then
1548          echo "  Turning on PCL counter summary per timestep"
1549          echo "  Please make sure PCLINC, PCLLIB are defined"
1550          if test ! "x$FOOLAD" = x ; then
1551                DEFINES="$DEFINES -DUSE_PCL_FLOPS_SFP"
1552          else
1553                DEFINES="$DEFINES -DUSE_PCL_FLOPS"
1554          fi
1555          INCLUDES="$INCLUDES $PCLINC"
1556          LIBS="$LIBS $PCLLIB"
1557    fi
1558    if test ! "x$PAPI" = x ; then
1559          if test ! "x$PAPIS" = x ; then
1560              echo "  PAPI performance analysis and flop summary per timestep cannot co-exist!"
1561              echo "  Sticking with PAPI flop summary per timestep!"
1562          else
1563              echo "  Turning on performance analysis with PAPI"
1564              echo "  Please make sure PAPIINC, PAPILIB are defined"
1565              DEFINES="$DEFINES -DUSE_PAPI"
1566              INCLUDES="$INCLUDES $PAPIINC"
1567              LIBS="$LIBS $PAPILIB"
1568          fi
1569    fi
1570    if test ! "x$PCL" = x ; then
1571          if test ! "x$PCLS" = x ; then
1572              echo "  PCL performance analysis and flop summary per timestep cannot co-exist!"
1573              echo "  Sticking with PCL flop summary per timestep!"
1574          else
1575              echo "  Turning on performance analysis with PCL"
1576              echo "  Please make sure PCLINC, PCLLIB are defined"
1577              DEFINES="$DEFINES -DUSE_PCL"
1578              INCLUDES="$INCLUDES $PCLINC"
1579              LIBS="$LIBS $PCLLIB"
1580          fi
1581    fi
1582    if test ! "x$HPMT" = x ; then
1583          if test ! "x$PAPI" = x ; then
1584              echo "  PAPI and the HPM Toolkit cannot co-exist!"
1585              echo "  Sticking with PAPI!"
1586          else if test ! "x$PCL" = x ; then
1587              echo "  PCL and the HPM Toolkit cannot co-exist!"
1588              echo "  Sticking with PCL!"
1589          else
1590              echo "  Turning on performance analysis with the HPM Toolkit"
1591              echo "  Please make sure HPMTINC, HPMTLIB are defined"
1592              DEFINES="$DEFINES -DUSE_LIBHPM"
1593              INCLUDES="$INCLUDES $HPMTINC"
1594              LIBS="$LIBS $HPMTLIB"
1595          fi
1596          fi
1597    fi
1598    if test ! "x$GSL" = x ; then
1599          echo "  Turning on use of GSL to control floating point calculations"
1600          echo "  Please make sure GSLINC, GSLLIB are defined"
1601          DEFINES="$DEFINES -DUSE_GSL_IEEE"
1602          INCLUDES="$INCLUDES $GSLINC"
1603          LIBS="$LIBS $GSLLIB"
1604    fi
1605    
1606    printf "\n===  Checking system libraries  ===\n"
1607    printf "  Do we have the system() command using $FC...  "
1608    cat > genmake_tcomp.$FS <<EOF
1609          program hello
1610          call system('echo hi')
1611          end
1612    EOF
1613    $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1614    RETVAL=$?
1615    if test "x$RETVAL" = x0 ; then
1616        HAVE_SYSTEM=t
1617        DEFINES="$DEFINES -DHAVE_SYSTEM"
1618        echo "yes"
1619  else  else
1620      if test "x$OPTFILE" = xNONE ; then      HAVE_SYSTEM=
1621          echo "    OPTFILE=NONE so we'll try to use default settings"      echo "no"
1622      else  fi
1623          if test -f "$OPTFILE" -a -r "$OPTFILE" ; then  rm -f genmake_tcomp*
1624              echo "    using OPTFILE=\"$OPTFILE\""  
1625              source "$OPTFILE"  printf "  Do we have the fdate() command using $FC...  "
1626              RETVAL=$?  cat > genmake_tcomp.$FS <<EOF
1627              if test "x$RETVAL" != x0 ; then        program hello
1628                  echo -n "Error: failed to source OPTFILE \"$OPTFILE\""        CHARACTER*(128) string
1629                  echo "--please check that variable syntax is bash-compatible"        string = ' '
1630                  exit 1        call fdate( string )
1631              fi        print *, string
1632          else        end
1633              echo "Error: can't read OPTFILE=\"$OPTFILE\""  EOF
1634              exit 1  $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1635          fi  RETVAL=$?
1636    if test "x$RETVAL" = x0 ; then
1637        HAVE_FDATE=t
1638        DEFINES="$DEFINES -DHAVE_FDATE"
1639        echo "yes"
1640    else
1641        HAVE_FDATE=
1642        echo "no"
1643    fi
1644    rm -f genmake_tcomp*
1645    
1646    printf "  Do we have the etime() command using $FC...  "
1647    cat > genmake_tcomp.$FS <<EOF
1648          program hello
1649          REAL*4 ACTUAL, TARRAY(2)
1650          EXTERNAL ETIME
1651          REAL*4 ETIME
1652          actual = etime( tarray )
1653          print *, tarray
1654          end
1655    EOF
1656    $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1657    RETVAL=$?
1658    if test "x$RETVAL" = x0 ; then
1659        HAVE_ETIME=t
1660        DEFINES="$DEFINES -DHAVE_ETIME"
1661        echo "yes"
1662    else
1663        HAVE_ETIME=
1664        echo "no"
1665    fi
1666    rm -f genmake_tcomp*
1667    
1668    printf "  Can we call simple C routines (here, \"cloc()\") using $FC...  "
1669    check_HAVE_CLOC
1670    if test "x$HAVE_CLOC" != x ; then
1671        echo "yes"
1672    else
1673        echo "no"
1674        if test "x$EMBED_SRC" = xt ; then
1675            echo "    WARNING: you requested file embedding but it has"
1676            echo "      been disabled since C code cannot be called"
1677            EMBED_SRC=
1678      fi      fi
1679  fi  fi
1680    rm -f genmake_t*
1681    
1682    printf "  Can we unlimit the stack size using $FC...  "
1683    check_HAVE_SETRLSTK
1684    if test "x$HAVE_SETRLSTK" != x ; then
1685        echo "yes"
1686    else
1687        echo "no"
1688    fi
1689    rm -f genmake_t*
1690    
1691    printf "  Can we register a signal handler using $FC...  "
1692    check_HAVE_SIGREG
1693    if test "x$HAVE_SIGREG" != x ; then
1694        echo "yes"
1695    else
1696        echo "no"
1697    fi
1698    rm -f genmake_t*
1699    
1700    printf "  Can we use stat() through C calls...  "
1701    check_HAVE_STAT
1702    if test "x$HAVE_STAT" != x ; then
1703        echo "yes"
1704    else
1705        echo "no"
1706    fi
1707    rm -f genmake_t*
1708    
1709    printf "  Can we create NetCDF-enabled binaries...  "
1710    check_netcdf_libs
1711    if test "x$HAVE_NETCDF" != x ; then
1712        echo "yes"
1713    else
1714        echo "no"
1715    fi
1716    DEFINES="$DEFINES $IGNORE_TIME"
1717    
1718    if test "x$EMBED_SRC" = xt ; then
1719        build_embed_encode
1720    fi
1721    if test "x$EMBED_SRC" = xt ; then
1722        ENABLE="$ENABLE embed_files"
1723    fi
1724    
1725    
1726  printf "\n===  Setting defaults  ===\n"  printf "\n===  Setting defaults  ===\n"
1727  echo -n "  Adding MODS directories:  "  printf "  Adding MODS directories:  "
1728  for d in $MODS ; do  for d in $MODS ; do
1729      if test ! -d $d ; then      if test ! -d $d ; then
1730          echo          echo
1731          echo "Error: MODS directory \"$d\" not found!"          echo "Error: MODS directory \"$d\" not found!"
1732          exit 1          exit 1
1733      else      else
1734          echo -n " $d"          printf " $d"
1735          SOURCEDIRS="$SOURCEDIRS $d"          SOURCEDIRS="$SOURCEDIRS $d"
1736          INCLUDEDIRS="$INCLUDEDIRS $d"          INCLUDEDIRS="$INCLUDEDIRS $d"
1737      fi      fi
1738  done  done
1739  echo  echo
1740    
 if test "x$MAKEFILE" = x ; then  
     MAKEFILE="Makefile"  
 fi  
1741  if test "x${PLATFORM}" = x ; then  if test "x${PLATFORM}" = x ; then
1742      PLATFORM=$p_PLATFORM      PLATFORM=$p_PLATFORM
1743  fi  fi
1744    
 if test "x${ROOTDIR}" = x ; then  
     if test "${PWD##/*/}" = "bin" -a -d ../model -a -d ../eesup -a -d ../pkg ; then  
         ROOTDIR=".."  
     else  
         for d in . .. ../.. ../../.. ../../../.. ../../../../.. ; do  
             if [ -d "$d/model" -a -d "$d/eesupp" -a -d "$d/pkg" ]; then  
                 ROOTDIR=$d  
                 echo -n "Warning:  ROOTDIR was not specified but there appears to be"  
                 echo " a copy of MITgcm at \"$ROOTDIR\" so we'll try it."  
                 break  
             fi  
         done  
     fi  
 fi  
 if test "x${ROOTDIR}" = x ; then  
     echo "Error: Cannot determine ROOTDIR for MITgcm code."  
     echo "  Please specify a ROOTDIR using either an options "  
     echo "  file or a command-line option."  
     exit 1  
 fi  
 if test ! -d ${ROOTDIR} ; then  
     echo "Error: the specified ROOTDIR (\"$ROOTDIR\") does not exist!"  
     exit 1  
 fi  
   
1745  if test "x${EXEDIR}" = x ; then  if test "x${EXEDIR}" = x ; then
1746      if test "${PWD##/*/}" = "bin" -a -d ../exe -a $ROOTDIR = .. ; then      tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1747        if test "x$tmp" = "xbin" -a -d ../exe -a $ROOTDIR = .. ; then
1748          EXEDIR=../exe          EXEDIR=../exe
1749      else      else
1750          EXEDIR=.          EXEDIR=.
# Line 546  if test "x${TOOLSDIR}" = x ; then Line 1759  if test "x${TOOLSDIR}" = x ; then
1759      TOOLSDIR="$ROOTDIR/tools"      TOOLSDIR="$ROOTDIR/tools"
1760  fi  fi
1761  if test ! -d ${TOOLSDIR} ; then  if test ! -d ${TOOLSDIR} ; then
1762      echo "Error: the specified $TOOLSDIR (\"$TOOLSDIR\") does not exist!"      echo "Error: the specified TOOLSDIR (\"$TOOLSDIR\") does not exist!"
1763      exit 1      exit 1
1764  fi  fi
1765    if test "x$S64" = x ; then
1766        echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.sh > /dev/null 2>&1
1767        RETVAL=$?
1768        if test "x${RETVAL}" = x0 ; then
1769            S64='$(TOOLSDIR)/set64bitConst.sh'
1770        else
1771            echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.csh > /dev/null 2>&1
1772            RETVAL=$?
1773            if test "x${RETVAL}" = x0 ; then
1774                S64='$(TOOLSDIR)/set64bitConst.csh'
1775            else
1776                cat <<EOF
1777    
1778    ERROR: neither of the two default scripts:
1779    
1780        ${TOOLSDIR}/set64bitConst.sh
1781        ${TOOLSDIR}/set64bitConst.csh
1782    
1783      are working so please check paths or specify (with \$S64) a
1784      working version of this script.
1785    
1786    EOF
1787                exit 1
1788            fi
1789        fi
1790    fi
1791    THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`
1792    
1793  EXECUTABLE=${EXECUTABLE:-mitgcmuv}  EXECUTABLE=${EXECUTABLE:-mitgcmuv}
1794    
# Line 557  EXECUTABLE=${EXECUTABLE:-mitgcmuv} Line 1797  EXECUTABLE=${EXECUTABLE:-mitgcmuv}
1797  #  they appear as regular source code  #  they appear as regular source code
1798  if test -r $ROOTDIR"/eesupp/src/Makefile" ; then  if test -r $ROOTDIR"/eesupp/src/Makefile" ; then
1799      echo "  Making source files in eesupp from templates"      echo "  Making source files in eesupp from templates"
1800      $MAKE -C $ROOTDIR"/eesupp/src/" > make_eesupp.errors 2>&1      ( cd $ROOTDIR"/eesupp/src/" && $MAKE ) > make_eesupp.errors 2>&1
1801      RETVAL=$?      RETVAL=$?
1802      if test "x${RETVAL}" = x0 ; then      if test "x${RETVAL}" = x0 ; then
1803          rm -f make_eesupp.errors          rm -f make_eesupp.errors
1804      else      else
1805          echo "Error: problem encountered while building source files in eesupp:"          echo "Error: problem encountered while building source files in eesupp:"
1806          cat make_eesupp.errors          cat make_eesupp.errors 1>&2
1807          exit 1          exit 1
1808      fi      fi
1809  fi  fi
1810    
1811    #same for exch2
1812    if test -r $ROOTDIR"/pkg/exch2/Makefile" ; then
1813        echo "  Making source files in exch2 from  templates"
1814        ( cd $ROOTDIR"/pkg/exch2/" && $MAKE ) > make_exch2.errors 2>&1
1815        RETVAL=$?
1816        if test "x${RETVAL}" = x0 ; then
1817            rm -f make_exch2.errors
1818        else
1819            echo "Error: problem encountered while building source files in exch2:"
1820            cat make_exch2.errors 1>&2
1821            exit 1
1822        fi
1823    fi
1824    
1825  printf "\n===  Determining package settings  ===\n"  printf "\n===  Determining package settings  ===\n"
1826  if  test "x${PDEPEND}" = x ; then  if  test "x${PDEPEND}" = x ; then
1827      tmp=$ROOTDIR"/pkg/pkg_depend"      tmp=$ROOTDIR"/pkg/pkg_depend"
# Line 587  echo "  getting package dependency info Line 1841  echo "  getting package dependency info
1841  #  Strip the comments and then convert the dependency file into  #  Strip the comments and then convert the dependency file into
1842  #  two arrays: PNAME, DNAME  #  two arrays: PNAME, DNAME
1843  cat $PDEPEND | sed -e 's/#.*$//g' \  cat $PDEPEND | sed -e 's/#.*$//g' \
1844      | awk 'BEGIN{nn=-1;} (NF>0){ for(i=2;i<=NF;i++){nn++; print "PNAME_"nn"="$1"\nDNAME_"nn"="$i}} END{print "nname="nn}' \      | $AWK 'BEGIN{nn=-1;} (NF>0){ for(i=2;i<=NF;i++){nn++; print "PNAME_"nn"="$1"\nDNAME_"nn"="$i}} END{print "nname="nn}' \
1845      > ./.pd_tmp      > ./.pd_tmp
1846  RETVAL=$?  RETVAL=$?
1847  if test ! "x${RETVAL}" = x0 ; then  if test ! "x${RETVAL}" = x0 ; then
1848      echo "Error: unable to parse package dependencies -- please check PDEPEND=\"$PDEPEND\""      echo "Error: unable to parse package dependencies -- please check PDEPEND=\"$PDEPEND\""
1849      exit 1      exit 1
1850  fi  fi
1851  source ./.pd_tmp  . ./.pd_tmp
1852  rm -f ./.pd_tmp  rm -f ./.pd_tmp
1853    
1854  echo  -n "  checking default package list:  "  #  Search for default packages.  Note that a "$ROOTDIR/pkg/pkg_groups"
1855    #  file should eventually be added so that, for convenience, one can
1856    #  specify groups of packages using names like "ocean" and "atmosphere".
1857    echo "  checking default package list:  "
1858    if test "x${PDEFAULT}" = x ; then
1859        for i in "." $MODS ; do
1860            if test -r $i"/packages.conf" ; then
1861                    PDEFAULT=$i"/packages.conf"
1862                    break
1863            fi
1864        done
1865    fi
1866  if test "x${PDEFAULT}" = x ; then  if test "x${PDEFAULT}" = x ; then
1867      PDEFAULT="$ROOTDIR/pkg/pkg_default"      PDEFAULT="$ROOTDIR/pkg/pkg_default"
1868  fi  fi
1869  if test "x${PDEFAULT}" = xNONE ; then  if test "x${PDEFAULT}" = xNONE ; then
1870      echo "default packages file disabled"      echo "    default packages file disabled"
1871  else  else
1872      if test ! -r $PDEFAULT ; then      if test ! -r $PDEFAULT ; then
         echo ""  
1873          echo "Warning:  can't read default packages from PDEFAULT=\"$PDEFAULT\""          echo "Warning:  can't read default packages from PDEFAULT=\"$PDEFAULT\""
1874      else      else
1875          echo "  using PDEFAULT=\"$PDEFAULT\""          echo "    using PDEFAULT=\"$PDEFAULT\""
1876          #  Strip the comments and add all the names          #  Strip the comments and add all the names
1877          def=`cat $PDEFAULT | sed -e 's/#.*$//g' | awk '(NF>0){print $0}'`          def=`cat $PDEFAULT | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
1878          RETVAL=$?          RETVAL=$?
1879          if test "x${RETVAL}" != x0 ; then          if test "x${RETVAL}" != x0 ; then
1880              echo -n "Error: can't parse default package list "              printf "Error: can't parse default package list "
1881              echo "-- please check PDEFAULT=\"$PDEFAULT\""              echo "-- please check PDEFAULT=\"$PDEFAULT\""
1882              exit 1              exit 1
1883          fi          fi
1884          for i in $def ; do          for i in $def ; do
1885              PACKAGES="$PACKAGES $i"              PACKAGES="$PACKAGES $i"
1886          done          done
1887          echo "    packages are:  $PACKAGES"          echo "    before group expansion packages are: $PACKAGES"
1888            RET=1
1889            while test $RET = 1 ; do expand_pkg_groups; RET=$?; done
1890            echo "    after group expansion packages are:  $PACKAGES"
1891      fi      fi
1892  fi  fi
1893    
1894  echo "  applying DISABLE settings"  echo "  applying DISABLE settings"
1895    for i in $PACKAGES ; do
1896        echo $i >> ./.tmp_pack
1897    done
1898    for i in `grep  "-" ./.tmp_pack` ; do
1899        j=`echo $i | sed 's/[-]//'`
1900        DISABLE="$DISABLE $j"
1901    done
1902  pack=  pack=
1903  for p in $PACKAGES ; do  for p in $PACKAGES ; do
1904      addit="t"      addit="t"
# Line 639  for p in $PACKAGES ; do Line 1913  for p in $PACKAGES ; do
1913  done  done
1914  PACKAGES="$pack"  PACKAGES="$pack"
1915  echo "  applying ENABLE settings"  echo "  applying ENABLE settings"
1916  rm -f ./.tmp_pack  echo "" > ./.tmp_pack
1917  PACKAGES="$PACKAGES $ENABLE"  PACKAGES="$PACKAGES $ENABLE"
1918    # Test if each explicitly referenced package exists
1919  for i in $PACKAGES ; do  for i in $PACKAGES ; do
1920      if test ! -d "$ROOTDIR/pkg/$i" ; then      j=`echo $i | sed 's/[-+]//'`
1921        if test ! -d "$ROOTDIR/pkg/$j" ; then
1922          echo "Error: can't find package $i at \"$ROOTDIR/pkg/$i\""          echo "Error: can't find package $i at \"$ROOTDIR/pkg/$i\""
1923          exit 1          exit 1
1924      fi      fi
1925      echo $i >> ./.tmp_pack      echo $i >> ./.tmp_pack
1926  done  done
 pack=`cat ./.tmp_pack | sort | uniq`  
 rm -f ./.tmp_pack  
1927  PACKAGES=  PACKAGES=
1928  for i in $pack ; do  for i in `grep -v "-" ./.tmp_pack | sort | uniq` ; do
1929      PACKAGES="$PACKAGES $i"      PACKAGES="$PACKAGES $i"
1930  done  done
1931    rm -f ./.tmp_pack
1932  echo "    packages are:  $PACKAGES"  echo "    packages are:  $PACKAGES"
1933    
1934    #  Check availability of NetCDF and then either build the MNC template
1935    #  files or delete mnc from the list of available packages.
1936    echo $PACKAGES | grep ' mnc ' > /dev/null 2>&1
1937    RETVAL=$?
1938    if test "x$RETVAL" = x0 ; then
1939        if test "x$HAVE_NETCDF" != xt ; then
1940            cat <<EOF
1941    
1942    *********************************************************************
1943    WARNING: the "mnc" package was enabled but tests failed to compile
1944      NetCDF applications.  Please check that:
1945    
1946      1) NetCDF is correctly installed for this compiler and
1947      2) the LIBS variable (within the "optfile") specifies the correct
1948           NetCDF library to link against.
1949    
1950      Due to this failure, the "mnc" package is now DISABLED.
1951    *********************************************************************
1952    
1953    EOF
1954            PACKAGES=`echo $PACKAGES | sed -e 's/mnc//g'`
1955            DISABLE="$DISABLE mnc"
1956        else
1957            ( cd $ROOTDIR"/pkg/mnc" && $MAKE testclean && $MAKE templates ) > make_mnc.errors 2>&1
1958            RETVAL=$?
1959            if test "x${RETVAL}" = x0 ; then
1960                rm -f make_mnc.errors
1961            else
1962                echo "Error: problem encountered while building source files in pkg/mnc:"
1963                cat make_mnc.errors 1>&2
1964                exit 1
1965            fi
1966        fi
1967    fi
1968    
1969  echo "  applying package dependency rules"  echo "  applying package dependency rules"
1970  ck=  ck=
1971  while test "x$ck" != xtt ; do  while test "x$ck" != xtt ; do
# Line 720  while test "x$ck" != xtt ; do Line 2030  while test "x$ck" != xtt ; do
2030              echo "  the dependency rules for \"$dname\""              echo "  the dependency rules for \"$dname\""
2031              exit 1              exit 1
2032          fi          fi
2033          i=$(( $i + 1 ))          i=`echo "$i + 1" | bc -l`
2034            #i=$(( $i + 1 ))
2035      done      done
2036      ck=$ck"t"      ck=$ck"t"
2037  done  done
# Line 730  for i in $PACKAGES ; do Line 2041  for i in $PACKAGES ; do
2041      if test -d $adr ; then      if test -d $adr ; then
2042          SOURCEDIRS="$SOURCEDIRS $adr"          SOURCEDIRS="$SOURCEDIRS $adr"
2043          INCLUDEDIRS="$INCLUDEDIRS $adr"          INCLUDEDIRS="$INCLUDEDIRS $adr"
2044            if test "x$i" = xautodiff ; then
2045                AUTODIFF_PKG_USED=t
2046            fi
2047      else      else
2048          echo "Error: the directory \"$adr\" for package $i doesn't exist"          echo "Error: the directory \"$adr\" for package $i doesn't exist"
2049          exit 1          exit 1
2050      fi      fi
2051  done  done
2052    
2053  #  This is compatible with the old genmake.  The "DISABLE_*" flags  # Create a list of #define and #undef to enable/disable packages
2054  #  need to be replaced by the "ALLOW_*" flags set below.  PACKAGES_DOT_H=PACKAGES_CONFIG.h
 #  
 # echo -n "  Setting package-specific CPP flags:  "  
 # pkrm=( mom_fluxform mom_vecinv generic_advdiff )  
 # pkrmdef=( -DDISABLE_MOM_FLUXFORM -DDISABLE_MOM_VECINV -DDISABLE_GENERIC_ADVDIFF -DDISABLE_DEBUGMODE )  
 # echo -n "  "  
 # i=0  
 # while test $i -lt "${#pkrm[@]}" ; do  
 #     echo "$PACKAGES" | grep "${pk[$i]}" > /dev/null 2>&1  
 #     RETVAL=$?  
 #     if test "x$RETVAL" = x1 ; then  
 #       DEFINES="$DEFINES ${pkdef[$i]}"  
 #       echo -n " ${pkdef[$i]}"  
 #     fi  
 #     i=$(( $i + 1 ))  
 # done  
 # echo  
   
 echo "  Setting package-specific CPP flags in CPP_OPTIONS.h:"  
 CPP_OPTIONS=  
 spaths="$SOURCEDIRS"  
 for i in $spaths ; do  
     try="$i/CPP_OPTIONS.h"  
     #  echo -n "    trying $try : "  
     if test -f $try -a -r $try ; then  
         echo "    found CPP_OPTIONS=\"$try\""  
         CPP_OPTIONS="$try"  
         if test "x$i" != "x." ; then  
             cp -f $CPP_OPTIONS .  
         fi  
         break  
     fi  
 done  
 if test "x$CPP_OPTIONS" = x ; then  
     echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"  
     exit 1  
 fi  
 if test -e CPP_OPTIONS.h ; then  
     if test ! -e CPP_OPTIONS.h.bak ; then  
         cp -f CPP_OPTIONS.h CPP_OPTIONS.h.bak  
     fi  
     cat CPP_OPTIONS.h \  
         | awk 'BEGIN{p=1;} ($1=="C===" && $2=="GENMAKE"){p=0;} {if (p==1) print $0}' \  
         > CPP_OPTIONS.h.tmp  
 fi  
 cat <<EOF >>CPP_OPTIONS.h.tmp  
 C=== GENMAKE v2 ===  
 C  The following defines have been set by GENMAKE, so please edit  
 C  them only if you know what you're doing.  In general, you should  
 C  add or remove packages by re-running genmake with different  
 C  "-enable" and/or "-disable" options.  
   
 C  Packages disabled by genmake:  
 EOF  
2055  #  The following UGLY HACK sets multiple "#undef"s and it needs to go  #  The following UGLY HACK sets multiple "#undef"s and it needs to go
2056  #  away.  On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h  #  away.  On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h
2057  #  file would eventually be split up so that all package-related #define  #  file would eventually be split up so that all package-related #define
2058  #  statements could be separated and handled only by genmake.  #  statements could be separated and handled only by genmake.
2059  names=`ls -1 "$ROOTDIR/pkg"`  names=`ls -1 "$ROOTDIR/pkg"`
2060  all_pack=  all_pack=
2061    DISABLED_PACKAGES=
2062  for n in $names ; do  for n in $names ; do
2063      if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then      if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
2064          has_pack="f"          has_pack="f"
# Line 807  for n in $names ; do Line 2069  for n in $names ; do
2069              fi              fi
2070          done          done
2071          if test "x$has_pack" = xf ; then          if test "x$has_pack" = xf ; then
2072              undef=`echo "ALLOW_$n" | awk '{print toupper($0)}'`              undef=`echo "ALLOW_$n" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2073              echo "#undef $undef" >> CPP_OPTIONS.h.tmp              DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
   
 #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!  
             case $n in  
                 mom_fluxform)  
                     DEFINES="$DEFINES -DDISABLE_MOM_FLUXFORM"  
                     ;;  
                 mom_vecinv)  
                     DEFINES="$DEFINES -DDISABLE_MOM_VECINV"  
                     ;;  
                 generic_advdiff)  
                     DEFINES="$DEFINES -DDISABLE_GENERIC_ADVDIFF"  
                     ;;  
                 debug)  
                     DEFINES="$DEFINES -DDISABLE_DEBUGMODE"  
                     ;;  
             esac  
 #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!  
   
2074          fi          fi
2075      fi      fi
2076  done  done
2077  cat <<EOF >>CPP_OPTIONS.h.tmp  ENABLED_PACKAGES=
   
 C  Packages enabled by genmake:  
 EOF  
2078  for i in $PACKAGES ; do  for i in $PACKAGES ; do
2079      def=`echo "ALLOW_$i" | awk '{print toupper($0)}'`      def=`echo "ALLOW_$i" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2080      echo "#define $def" >> CPP_OPTIONS.h.tmp      ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
2081    #eh3 DEFINES="$DEFINES -D$def"
2082    
2083  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!
2084      case $i in      case $i in
2085          aim_v23)          aim_v23)
2086              echo "#define   ALLOW_AIM" >> CPP_OPTIONS.h.tmp              ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
2087                echo "Warning: ALLOW_AIM is set to enable aim_v23."
2088              ;;              ;;
2089      esac      esac
2090  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!
2091    
2092  done  done
 mv -f CPP_OPTIONS.h.tmp CPP_OPTIONS.h  
2093    
2094  echo "  Adding STANDARDDIRS"  echo "  Adding STANDARDDIRS"
2095  BUILDDIR=${BUILDDIR:-.}  BUILDDIR=${BUILDDIR:-.}
2096  STANDARDDIRS=${STANDARDDIRS:-"eesupp model"}  if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
2097  for d in $STANDARDDIRS ; do      STANDARDDIRS="eesupp model"
2098      adr="$ROOTDIR/$d/src"  fi
2099      if test ! -d $adr ; then  if test "x$STANDARDDIRS" != x ; then
2100          echo "Error:  directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""      for d in $STANDARDDIRS ; do
2101          echo "  is correct and that you correctly specified the STANDARDDIRS option"          adr="$ROOTDIR/$d/src"
2102          exit 1          if test ! -d $adr ; then
2103      else              echo "Error:  directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2104          SOURCEDIRS="$SOURCEDIRS $adr"              echo "  is correct and that you correctly specified the STANDARDDIRS option"
2105      fi              exit 1
2106      adr="$ROOTDIR/$d/inc"          else
2107      if test ! -d $adr ; then              SOURCEDIRS="$SOURCEDIRS $adr"
2108          echo "Error:  directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""          fi
2109          echo "  is correct and that you correctly specified the STANDARDDIRS option"          adr="$ROOTDIR/$d/inc"
2110          exit 1          if test ! -d $adr ; then
2111      else              echo "Error:  directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2112          INCLUDEDIRS="$INCLUDEDIRS $adr"              echo "  is correct and that you correctly specified the STANDARDDIRS option"
2113                exit 1
2114            else
2115                INCLUDEDIRS="$INCLUDEDIRS $adr"
2116            fi
2117        done
2118    fi
2119    
2120    echo "  Searching for *OPTIONS.h files in order to warn about the presence"
2121    echo "    of \"#define \"-type statements that are no longer allowed:"
2122    CPP_OPTIONS=
2123    CPP_EEOPTIONS=
2124    spaths=". $INCLUDEDIRS"
2125    names=`ls -1 "$ROOTDIR/pkg"`
2126    for i in $spaths ; do
2127        try="$i/CPP_OPTIONS.h"
2128        if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
2129            echo "    found CPP_OPTIONS=\"$try\""
2130            CPP_OPTIONS="$try"
2131            # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
2132            for n in $names ; do
2133                test_for_package_in_cpp_options $CPP_OPTIONS $n
2134            done
2135        fi
2136        try="$i/CPP_EEOPTIONS.h"
2137        if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
2138            echo "    found CPP_EEOPTIONS=\"$try\""
2139            # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
2140    #**** not yet enabled ****
2141    #        test_for_mpi_in_cpp_eeoptions $try
2142    #**** not yet enabled ****
2143            CPP_EEOPTIONS="$try"
2144      fi      fi
2145  done  done
2146    if test "x$CPP_OPTIONS" = x ; then
2147        echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
2148        exit 1
2149    fi
2150    
2151    #  Here, we build the list of files to be "run through" the adjoint
2152    #  compiler.
2153    if test -f ./ad_files ; then
2154        rm -f ./ad_files
2155    fi
2156    echo "  Creating the list of files for the adjoint compiler."
2157    for i in $SOURCEDIRS ; do
2158        list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
2159        for j in $list_files ; do
2160            cat $i/$j >> ad_files
2161        done
2162    done
2163    if test ! "x"$FS = "x.f" ; then
2164        cat ad_files | sed -e "s/\.f/.$FS/g" > ad_files_f
2165        mv -f ad_files_f ad_files
2166    fi
2167    
2168  echo  echo
2169  echo "===  Creating the Makefile  ==="  echo "===  Creating the Makefile  ==="
2170  echo "  setting INCLUDES"  echo "  setting INCLUDES"
2171  for i in $INCLUDEDIRS ; do  for i in $INCLUDEDIRS ; do
2172      if test -d $i ; then      if test ! -d $i ; then
         INCLUDES="$INCLUDES -I$i"  
     else  
2173          echo "Warning: can't find INCLUDEDIRS=\"$i\""          echo "Warning: can't find INCLUDEDIRS=\"$i\""
2174      fi      fi
2175  done  done
2176    
2177    if test ! "x$DIVA" = x ; then
2178        echo "  Creating the pseudo-MPI include directory"
2179        INCLUDES="-I./mpi_headers $INCLUDES"
2180        rm -rf ./mpi_headers
2181        mkdir -p ./mpi_headers
2182    
2183        if test "x$MPIINCLUDEDIR" = x ; then
2184            if test "x$MPIHOME" = x ; then
2185                MPIHOME='/usr'
2186            fi
2187            MPIINCLUDEDIR='$MPIHOME/include'
2188        fi
2189        
2190        if test -r $MPIINCLUDEDIR/mpif.h ; then
2191            for i in $MPI_HEADER_FILES; do
2192                cp -p $MPIINCLUDEDIR/$i ./mpi_headers
2193            done
2194    
2195            perl -i -pe 's/MPI_DISPLACEMENT_CURRENT=-1_8/MPI_DISPLACEMENT_CURRENT=-1/g' mpi_headers/mpif.h
2196        else
2197            echo " We cannot create a copy of mpif.h!"
2198            exit -1
2199        fi
2200    fi
2201    
2202  echo "  Determining the list of source and include files"  echo "  Determining the list of source and include files"
2203  rm -rf .links.tmp  rm -rf .links.tmp
2204  mkdir .links.tmp  mkdir .links.tmp
2205    touch .links.tmp/foo
2206    if test ! -r ".links.tmp/foo" ; then
2207        echo
2208        echo "ERROR : something is wrong with your directory permissions or"
2209        echo "   your user file-creation mask (\"umask\") since creating a"
2210        echo "   sub-dir, touch-ing a file within it, and then reading it is"
2211        echo "   not working.  Please try setting your umask to something"
2212        echo "   sane such as:"
2213        echo
2214        echo "      umask 0002"
2215        echo
2216        echo "   and please verify that you have the proper permissions for"
2217        echo "   creating sub-directories and then reading files created"
2218        echo "   within them."
2219        echo
2220        exit 1
2221    fi
2222    rm -f .links.tmp/foo
2223  echo "# This section creates symbolic links" > srclinks.tmp  echo "# This section creates symbolic links" > srclinks.tmp
2224  echo "" >> srclinks.tmp  echo "" >> srclinks.tmp
2225  echo -n 'SRCFILES = '    > srclist.inc  printf 'SRCFILES = '    > srclist.inc
2226  echo -n 'CSRCFILES = '   > csrclist.inc  printf 'CSRCFILES = '   > csrclist.inc
2227  echo -n 'F90SRCFILES = ' > f90srclist.inc  printf 'F90SRCFILES = ' > f90srclist.inc
2228  echo -n 'HEADERFILES = ' > hlist.inc  printf 'HEADERFILES = ' > hlist.inc
2229  alldirs=". $SOURCEDIRS $INCLUDEDIRS"  printf 'AD_FLOW_FILES = ' > ad_flow_files.inc
2230    alldirs="$SOURCEDIRS $INCLUDEDIRS ."
2231  for d in $alldirs ; do  for d in $alldirs ; do
2232      deplist=      deplist=
2233      sfiles=`( cd $d; echo *.[h,c,F] )`      sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
2234      sfiles=`( echo $sfiles; cd $d; echo *.F90 )`      sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
2235      for sf in $sfiles ; do      for sf in $sfiles ; do
2236          if test ! -r ".links.tmp/$sf" ; then          if test ! -r ".links.tmp/$sf" ; then
2237              if test -f "$d/$sf" ; then              if test -f "$d/$sf" ; then
2238                  extn=`echo $sf | awk -F '.' '{print $NF}'`                  ignore_f=f
2239                  touch .links.tmp/$sf                  case $d/$sf in
2240                  deplist="$deplist $sf"                    ./$PACKAGES_DOT_H)
2241                  case $extn in                          ignore_f=t
2242                      F)                          ;;
2243                          echo    " \\"  >> srclist.inc                    ./AD_CONFIG.h)
2244                          echo -n " $sf" >> srclist.inc                          ignore_f=t
2245                            ;;
2246                      ./FC_NAMEMANGLE.h)
2247                            ignore_f=t
2248                          ;;                          ;;
2249                      F90)                    ./BUILD_INFO.h)
2250                          echo    " \\"  >> f90srclist.inc                          ignore_f=t
                         echo -n " $sf" >> f90srclist.inc  
2251                          ;;                          ;;
2252                      c)                    ./EMBEDDED_FILES.h)
2253                          echo    " \\"  >> csrclist.inc                          ignore_f=t
                         echo -n " $sf" >> csrclist.inc  
2254                          ;;                          ;;
2255                      h)                    *)
2256                          echo    " \\"  >> hlist.inc                          #  For the local directory *ONLY*,
2257                          echo -n " $sf" >> hlist.inc                          #  ignore all soft-links
2258                            if test "x$HAVE_TEST_L" = xt -a "x$d" = x. -a -L $sf ; then
2259                                ignore_f=t
2260                            else
2261                                touch .links.tmp/$sf
2262                                deplist="$deplist $sf"
2263                            fi
2264                          ;;                          ;;
2265                  esac                  esac
2266                    if test "x$ignore_f" = xf ; then
2267                        extn=`echo $sf | $AWK -F. '{print $NF}'`
2268                        case $extn in
2269                            F)
2270                                echo    " \\"  >> srclist.inc
2271                                printf " $sf" >> srclist.inc
2272                                ;;
2273                            F90)
2274                                echo    " \\"  >> f90srclist.inc
2275                                printf " $sf" >> f90srclist.inc
2276                                ;;
2277                            c)
2278                                echo    " \\"  >> csrclist.inc
2279                                printf " $sf" >> csrclist.inc
2280                                ;;
2281                            h)
2282                                echo    " \\"  >> hlist.inc
2283                                printf " $sf" >> hlist.inc
2284                                ;;
2285                            flow)
2286                                echo    " \\"  >> ad_flow_files.inc
2287                                printf " $sf" >> ad_flow_files.inc
2288                                ;;
2289                        esac
2290                    fi
2291              fi              fi
2292          fi          fi
2293      done      done
# Line 936  echo "" >> srclist.inc Line 2303  echo "" >> srclist.inc
2303  echo "" >> csrclist.inc  echo "" >> csrclist.inc
2304  echo "" >> f90srclist.inc  echo "" >> f90srclist.inc
2305  echo "" >> hlist.inc  echo "" >> hlist.inc
2306    echo "" >> ad_flow_files.inc
2307    
2308  if test -e $MAKEFILE ; then  if test -f $MAKEFILE ; then
2309      mv -f $MAKEFILE "$MAKEFILE.bak"      mv -f $MAKEFILE "$MAKEFILE.bak"
2310  fi  fi
2311  echo "  Writing makefile: $MAKEFILE"  echo "  Writing makefile: $MAKEFILE"
# Line 946  echo "#    $MACHINE" >> $MAKEFILE Line 2314  echo "#    $MACHINE" >> $MAKEFILE
2314  echo "# This makefile was generated automatically on" >> $MAKEFILE  echo "# This makefile was generated automatically on" >> $MAKEFILE
2315  echo "#    $THISDATE" >> $MAKEFILE  echo "#    $THISDATE" >> $MAKEFILE
2316  echo "# by the command:" >> $MAKEFILE  echo "# by the command:" >> $MAKEFILE
2317  echo "#    $0 $@" >> $MAKEFILE  echo "#    $0 $G2ARGS" >> $MAKEFILE
2318  echo "# executed by:" >> $MAKEFILE  echo "# executed by:" >> $MAKEFILE
2319  echo "#    $USER@${THISHOSTNAME}:${THISCWD}" >> $MAKEFILE  echo "#    ${THISUSER}@${THISHOST}:${THISCWD}" >> $MAKEFILE
2320    
2321    EXE_AD=$EXECUTABLE"_ad"
2322    EXE_FTL=$EXECUTABLE"_ftl"
2323    EXE_SVD=$EXECUTABLE"_svd"
2324    
2325  cat >>$MAKEFILE <<EOF  cat >>$MAKEFILE <<EOF
2326    #
2327    # OPTFILE="$OPTFILE"
2328  #  #
2329  # BUILDDIR     : Directory where object files are written  # BUILDDIR     : Directory where object files are written
2330  # SOURCEDIRS   : Directories containing the source (.F) files  # SOURCEDIRS   : Directories containing the source (.F) files
# Line 977  EXEDIR      = ${EXEDIR} Line 2352  EXEDIR      = ${EXEDIR}
2352  EXECUTABLE  = \$(EXEDIR)/${EXECUTABLE}  EXECUTABLE  = \$(EXEDIR)/${EXECUTABLE}
2353  TOOLSDIR    = ${TOOLSDIR}  TOOLSDIR    = ${TOOLSDIR}
2354    
2355    #eh3  new defines for the adjoint work
2356    AUTODIFF    = ${ROOTDIR}/pkg/autodiff
2357    EXE_AD      = ${EXE_AD}
2358    EXE_FTL     = ${EXE_FTL}
2359    EXE_SVD     = ${EXE_SVD}
2360    
2361    ENABLED_PACKAGES = ${ENABLED_PACKAGES}
2362    DISABLED_PACKAGES = ${DISABLED_PACKAGES}
2363    
2364    # These files are created by Makefile
2365    SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h BUILD_INFO.h
2366  EOF  EOF
2367    
2368  #  Note: figure out some way to add Hyades JAM libraries here  if test "x$EMBED_SRC" = xt ; then
2369        echo "EMBEDDED_FILES = EMBEDDED_FILES.h" >>$MAKEFILE
2370    else
2371        echo "EMBEDDED_FILES = " >>$MAKEFILE
2372    fi
2373    
2374    #  Note: figure out some way to add Hyades JAM libraries here
2375  cat >>$MAKEFILE <<EOF  cat >>$MAKEFILE <<EOF
2376  # Unix ln (link)  # Unix ln (link)
2377  LN = ${LN}  LN = ${LN}
# Line 994  KPP = ${KPP} Line 2385  KPP = ${KPP}
2385  FC = ${FC}  FC = ${FC}
2386  # Fortran compiler  # Fortran compiler
2387  F90C = ${F90C}  F90C = ${F90C}
2388    # C compiler
2389    CC = ${CC}
2390  # Link editor  # Link editor
2391  LINK = ${LINK}  LINK = ${LINK} ${LDADD}
2392    
2393  # Defines for CPP  # Defines for CPP
2394  DEFINES = ${DEFINES}  DEFINES = ${DEFINES}
# Line 1016  CFLAGS = ${CFLAGS} Line 2409  CFLAGS = ${CFLAGS}
2409  NOOPTFILES = ${NOOPTFILES}  NOOPTFILES = ${NOOPTFILES}
2410  NOOPTFLAGS = ${NOOPTFLAGS}  NOOPTFLAGS = ${NOOPTFLAGS}
2411  # Flags and libraries needed for linking  # Flags and libraries needed for linking
2412  LIBS = ${LIBS} \$(XLIBS)  LIBS = ${LIBS}
2413  # Name of the Mekfile  # Name of the Mekfile
2414  MAKEFILE=${MAKEFILE}  MAKEFILE=${MAKEFILE}
2415    
2416  EOF  EOF
2417    
2418  cat srclist.inc    >> $MAKEFILE  cat srclist.inc       >> $MAKEFILE
2419  cat csrclist.inc   >> $MAKEFILE  cat csrclist.inc      >> $MAKEFILE
2420  cat f90srclist.inc >> $MAKEFILE  cat f90srclist.inc    >> $MAKEFILE
2421  cat hlist.inc      >> $MAKEFILE  cat hlist.inc         >> $MAKEFILE
2422  echo 'F77FILES =  $(SRCFILES:.F=.f)'                                           >> $MAKEFILE  cat ad_flow_files.inc >> $MAKEFILE
2423  echo 'F90FILES =  $(F90SRCFILES:.F90=.f90)'                                    >> $MAKEFILE  echo >> $MAKEFILE
2424    echo 'F77FILES =  $(SRCFILES:.F=.'$FS')'      >> $MAKEFILE
2425    echo 'F90FILES =  $(F90SRCFILES:.F90=.'$FS90')' >> $MAKEFILE
2426  echo 'OBJFILES =  $(SRCFILES:.F=.o) $(CSRCFILES:.c=.o) $(F90SRCFILES:.F90=.o)' >> $MAKEFILE  echo 'OBJFILES =  $(SRCFILES:.F=.o) $(CSRCFILES:.c=.o) $(F90SRCFILES:.F90=.o)' >> $MAKEFILE
2427    echo >> $MAKEFILE
2428    echo '.SUFFIXES:' >> $MAKEFILE
2429    echo '.SUFFIXES: .o .'$FS' .p .F .c .'$FS90' .F90' >> $MAKEFILE
2430  rm -f srclist.inc csrclist.inc hlist.inc flist.tmp clist.tmp f90srclist.inc  rm -f srclist.inc csrclist.inc hlist.inc flist.tmp clist.tmp f90srclist.inc
2431    rm -f ad_flow_files.inc
2432    
2433  cat >>$MAKEFILE <<EOF  cat >>$MAKEFILE <<EOF
2434    
 .SUFFIXES:  
 .SUFFIXES: .o .f .p .F .c .F90 .f90  
   
2435  all: \$(EXECUTABLE)  all: \$(EXECUTABLE)
2436  \$(EXECUTABLE): \$(OBJFILES)  \$(EXECUTABLE): \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(OBJFILES) \$(EMBEDDED_FILES)
2437            @echo Creating \$@ ...
2438          \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)          \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
2439  depend:  depend:
2440          @make links          @make links
2441          \$(MAKEDEPEND) -o .f \$(DEFINES) \$(INCLUDES) \$(SRCFILES)          \$(MAKEDEPEND) -o .$FS \$(DEFINES) \$(INCLUDES) \$(SRCFILES)
2442          ../../../tools/f90mkdepend >> \$(MAKEFILE)          \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
2443            -rm -f makedepend.out
2444    
2445    lib: libmitgcmuv.a
2446    
2447  links: \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES)  libmitgcmuv.a: \$(OBJFILES)
2448            ar rcv libmitgcmuv.a \$(OBJFILES)
2449    
2450    links: \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(SPECIAL_FILES)
2451    
2452  small_f: \$(F77FILES) \$(F90FILES)  small_f: \$(F77FILES) \$(F90FILES)
2453    
# Line 1054  output.txt: \$(EXECUTABLE) Line 2456  output.txt: \$(EXECUTABLE)
2456          @\$(EXECUTABLE) > \$@          @\$(EXECUTABLE) > \$@
2457    
2458  clean:  clean:
2459          -rm -rf *.o *.f *.p *.f90 *.mod ${RMFILES} work.{pc,pcl}          -rm -rf *.o *.$FS *.p *.$FS90 *.mod ${RMFILES} work.{pc,pcl} *.template
2460  Clean:  Clean:
2461          @make clean          @make clean
2462          @make cleanlinks          @make cleanlinks
2463          -rm -f Makefile.bak          -rm -f \$(SPECIAL_FILES)
2464            -rm -f genmake_state genmake_*optfile genmake_warnings make.log run.log *.bak
2465  CLEAN:  CLEAN:
2466          @make Clean          @make Clean
2467          -find \$(EXEDIR) -name "*.meta" -exec rm {} \;          -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
2468          -find \$(EXEDIR) -name "*.data" -exec rm {} \;          -find \$(EXEDIR) -name "*.data" -exec rm {} \;
2469          -find \$(EXEDIR) -name "fort.*" -exec rm {} \;          -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
2470          -rm -f \$(EXECUTABLE)          -rm -f \$(EXECUTABLE) *.txt STD* *diagnostics.log datetime
2471            -rm -rf mnc_test_*
2472    
2473    #eh3 Makefile: makefile
2474  makefile:  makefile:
2475          ${0} $@          $THIS_SCRIPT $G2ARGS
2476  cleanlinks:  cleanlinks:
2477          -find . -type l -exec rm {} \;          -find . -type l -exec rm {} \;
2478    
2479  # The normal chain of rules is (  .F - .f - .o  )  # Special targets (SPECIAL_FILES) which are create by make
2480  .F.f:  ${PACKAGES_DOT_H}:
2481            @echo Creating \$@ ...
2482            @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -bPACKAGES_CONFIG_H "Disabled packages:" \$(DISABLED_PACKAGES) " " "Enabled packages:" \$(ENABLED_PACKAGES) > \$@
2483    AD_CONFIG.h:
2484            @echo Creating \$@ ...
2485            @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN -UALLOW_ECCO_OPTIMIZATION > \$@
2486    FC_NAMEMANGLE.h:
2487            @echo Creating \$@ ...
2488            echo "$FC_NAMEMANGLE" > \$@
2489    
2490    BUILD_INFO.h:
2491            @echo Creating \$@ ...
2492    EOF
2493    
2494    test ! "x$THISVER" = x  && echo "       -echo \"#define THISVER '$THISVER'\" > \$@"   >> $MAKEFILE
2495    test ! "x$THISUSER" = x && echo "       -echo \"#define THISUSER '$THISUSER'\" >> \$@" >> $MAKEFILE
2496    test ! "x$THISDATE" = x && echo "       -echo \"#define THISDATE '$THISDATE'\" >> \$@" >> $MAKEFILE
2497    test ! "x$THISHOST" = x && echo "       -echo \"#define THISHOST '$THISHOST'\" >> \$@" >> $MAKEFILE
2498    
2499    if test "x$EMBED_SRC" = xt ; then
2500        cat >>$MAKEFILE <<EOF
2501    
2502    decode_files.o : EMBEDDED_FILES.h
2503    
2504    ##  \$(F77FILES)
2505    all_fF.tar.gz : \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(F77FILES) Makefile
2506            @echo Creating \$@ ...
2507            -tar -hcf all_fF.tar \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(F77FILES) Makefile
2508            -rm -f all_fF.tar.gz
2509            -gzip all_fF.tar
2510    
2511    EMBEDDED_FILES.h : all_fF.tar.gz
2512            @echo Creating \$@ ...
2513            -\${ROOTDIR}/tools/embed_encode/encode_files EMBEDDED_FILES.h all_fF.tar.gz
2514    
2515    EOF
2516    fi
2517    
2518    cat >>$MAKEFILE <<EOF
2519    
2520    # The normal chain of rules is (  .F - .$FS - .o  )
2521    
2522    ## This nullifies any default implicit rules concerning these two file types:
2523    ## %.o : %.F
2524    
2525    .F.$FS:
2526          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2527  .f.o:  .$FS.o:
2528          \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<          \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
2529  .F90.f90:  .F90.$FS90:
2530          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2531  .f90.o:  .$FS90.o:
2532          \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<          \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
2533  .c.o:  .c.o:
2534          \$(CC) \$(CFLAGS) -c \$<          \$(CC) \$(CFLAGS) \$(DEFINES) \$(INCLUDES) -c \$<
2535    
2536  # Special exceptions that use the ( .F - .p - .f - .o ) rule-chain  # Special exceptions that use the ( .F - .p - .$FS - .o ) rule-chain
2537  .F.p:  .F.p:
2538          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2539  .p.f:  .p.$FS:
2540          \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<          \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
2541    
2542    #=========================================
2543    #===  Automatic Differentiation Rules  ===
2544    
2545    TAMC           = ${TAMC}
2546    TAF            = ${TAF}
2547    
2548    TAF_EXTRA      = ${TAF_EXTRA}
2549    TAMC_EXTRA     = ${TAMC_EXTRA}
2550    
2551    EOF
2552    
2553    ad_vars="AD_TAMC_FLAGS AD_TAF_FLAGS"
2554    ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF_FLAGS"
2555    ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
2556    for i in $ad_vars ; do
2557        name=$i
2558        t1="t2=\$"`echo $i`
2559        eval $t1
2560        printf "%-20s = " $name >> $MAKEFILE
2561        echo $t2 >> $MAKEFILE
2562    done
2563    
2564    echo "  Add the source list for AD code generation"
2565    echo >> $MAKEFILE
2566    printf "AD_FILES = " >> $MAKEFILE
2567    AD_FILES=`cat ad_files`
2568    for i in $AD_FILES ; do
2569        echo    " \\" >> $MAKEFILE
2570        printf " $i" >> $MAKEFILE
2571    done
2572    echo >> $MAKEFILE
2573    rm -f ad_files
2574    
2575    cat >>$MAKEFILE <<EOF
2576    
2577    # ... AD ...
2578    adall: ad_taf
2579    adtaf: ad_taf_output.$FS
2580    adtamc: ad_tamc_output.$FS
2581    
2582    ad_input_code.$FS: \$(AD_FILES) \$(HEADERFILES)
2583            @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -DALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN -UALLOW_ECCO_OPTIMIZATION > ad_config.template
2584            cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
2585            -rm -f ad_config.template
2586            @make \$(F77FILES)
2587            @make \$(AD_FLOW_FILES)
2588            cat \$(AD_FLOW_FILES) \$(AD_FILES) > ad_input_code.$FS
2589    
2590    ad_taf_output.$FS: ad_input_code.$FS
2591            \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2592            cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2593    
2594    adtafonly:
2595            \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2596            cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2597    
2598    ad_taf: ad_taf_output.o \$(OBJFILES)
2599            \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
2600    
2601    ad_tamc_output.$FS: ad_input_code.$FS
2602            \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.$FS
2603            cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.$FS
2604    
2605    ad_tamc: ad_tamc_output.o \$(OBJFILES)
2606            \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
2607    
2608    adonlyfwd:
2609            patch < \$(TOOLSDIR)/ad_taf_output.f.onlyfwd.diff
2610    
2611    adtrick:
2612            patch < \$(TOOLSDIR)/ad_taf_output.f.adtrick.diff
2613    
2614    # ... FTL ...
2615    ftlall: ftl_taf
2616    ftltaf: ftl_taf_output.$FS
2617    ftltamc: ftl_tamc_output.$FS
2618    
2619    ftl_input_code.$FS: \$(AD_FILES) \$(HEADERFILES)
2620            @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -UALLOW_ADJOINT_RUN -DALLOW_TANGENTLINEAR_RUN -UALLOW_ECCO_OPTIMIZATION > ftl_config.template
2621            cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
2622            -rm -f ftl_config.template
2623            @make \$(F77FILES)
2624            @make \$(AD_FLOW_FILES)
2625            cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.$FS
2626    
2627    ftl_taf_output.$FS: ftl_input_code.$FS
2628            \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
2629            cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
2630    
2631    ftltafonly:
2632            \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
2633            cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
2634    
2635    ftl_taf: ftl_taf_output.o \$(OBJFILES)
2636            \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
2637    
2638    ftl_tamc_output.$FS: ftl_input_code.$FS
2639            \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.$FS
2640            cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.$FS
2641    
2642    ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
2643            \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
2644    
2645    
2646    # ... SVD ...
2647    svdtaf: ad_taf_output.$FS ftl_taf_output.$FS
2648            @echo "--->>> Only ran TAF to generate SVD code!    <<<---"
2649            @echo "--->>> Do make svdall afterwards to compile. <<<---"
2650    svdall: svd_touch svd_taf
2651    
2652    svd_taf: \$(OBJFILES)
2653            \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
2654    
2655            @echo "--->>> Only COMPILE svd code! <<<---"
2656            @echo "--->>> Assumes you previously <<<---"
2657            @echo "--->>> did make svdtaf        <<<---"
2658    
2659    svd_touch:
2660            @echo "--->>> Only COMPILE svd code! <<<---"
2661            @echo "--->>> Assumes you previously <<<---"
2662            @echo "--->>> did make svdtaf        <<<---"
2663            touch ad_taf_output.$FS ftl_taf_output.$FS
2664            \$(FC) \$(FFLAGS) \$(FOPTIM) -c ad_taf_output.$FS
2665            \$(FC) \$(FFLAGS) \$(FOPTIM) -c ftl_taf_output.$FS
2666            @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -UALLOW_ADJOINT_RUN -DALLOW_TANGENTLINEAR_RUN -UALLOW_ECCO_OPTIMIZATION > ftl_config.template
2667            cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
2668            -rm -f ftl_config.template
2669    
2670    #=========================================
2671    
2672  EOF  EOF
2673    
2674    if test "x$EXEHOOK" != x ; then
2675        printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE
2676    fi
2677    
2678  echo "  Making list of \"exceptions\" that need \".p\" files"  echo "  Making list of \"exceptions\" that need \".p\" files"
2679  for i in $KPPFILES ; do  for i in $KPPFILES ; do
2680      base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`      base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
# Line 1098  for i in $KPPFILES ; do Line 2682  for i in $KPPFILES ; do
2682      if test "x$RETVAL" != x0 ; then      if test "x$RETVAL" != x0 ; then
2683          echo "Error: unable to add file \"$i\" to the exceptions list"          echo "Error: unable to add file \"$i\" to the exceptions list"
2684      fi      fi
2685      echo "$base.f: $base.p" >> $MAKEFILE      echo "$base.$FS: $base.p" >> $MAKEFILE
2686  done  done
2687    
2688  echo "  Making list of NOOPTFILES"  echo "  Making list of NOOPTFILES"
# Line 1108  for i in $NOOPTFILES ; do Line 2692  for i in $NOOPTFILES ; do
2692      if test "x$RETVAL" != x0 ; then      if test "x$RETVAL" != x0 ; then
2693          echo "Error: unable to add file \"$i\" to the exceptions list"          echo "Error: unable to add file \"$i\" to the exceptions list"
2694      fi      fi
2695      echo "$base.o: $base.f" >> $MAKEFILE      echo "$base.o: $base.$FS" >> $MAKEFILE
2696      printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE      printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE
2697  done  done
2698    
# Line 1120  echo "  Adding makedepend marker" Line 2704  echo "  Adding makedepend marker"
2704  printf "\n\n# DO NOT DELETE\n" >> $MAKEFILE  printf "\n\n# DO NOT DELETE\n" >> $MAKEFILE
2705    
2706  printf "\n===  Done  ===\n"  printf "\n===  Done  ===\n"
2707    
2708    # Create special header files
2709    $BASH $TOOLSDIR/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -bPACKAGES_CONFIG_H "Disabled packages:" $DISABLED_PACKAGES " " "Enabled packages:" $ENABLED_PACKAGES > $PACKAGES_DOT_H".tmp"
2710    if test ! -f $PACKAGES_DOT_H ; then
2711        mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
2712    else
2713        cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H > /dev/null 2>&1
2714        RETVAL=$?
2715        if test "x$RETVAL" = x0 ; then
2716            rm -f $PACKAGES_DOT_H".tmp"
2717        else
2718            mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"
2719            mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
2720        fi
2721    fi
2722    if test ! -f AD_CONFIG.h ; then
2723        $BASH $TOOLSDIR/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -UALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN -UALLOW_ECCO_OPTIMIZATION > AD_CONFIG.h
2724    fi
2725    
2726    
2727    #  Write the "state" for future records
2728    if test "x$DUMPSTATE" != xf ; then
2729        printf "" > genmake_state
2730        for i in $gm_state ; do
2731            t1="t2=\$$i"
2732            eval $t1
2733            echo "$i='$t2'" >> genmake_state
2734        done
2735    fi

Legend:
Removed from v.1.4  
changed lines
  Added in v.1.149

  ViewVC Help
Powered by ViewVC 1.1.22