/[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.8 by edhill, Tue Sep 23 15:53:02 2003 UTC revision 1.151 by edhill, Wed Jun 7 22:33:00 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
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        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        1) the command line (eg. "-optfile=path/to/OPTFILE"), or
438        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      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    
475  }  }
476    
# Line 86  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 "    -make NAME | -m NAME"  
507      echo "      --make=NAME | -m=NAME"      -nooptfile | --nooptfile
508      echo "    -makefile NAME | -mf NAME"        -optfile NAME | --optfile NAME | -of NAME | --of NAME
509      echo "      --makefile=NAME | -mf=NAME"        -optfile=NAME | --optfile=NAME | -of=NAME | --of=NAME
510      echo "    -platform NAME | --platform NAME | -pl NAME | --pl NAME"            Use "NAME" as the optfile.  By default, an attempt will be
511      echo "      -platform=NAME | --platform=NAME | -pl=NAME | --pl=NAME"            made to find an appropriate "standard" optfile in the
512      echo "    -rootdir NAME | --rootdir NAME | -rd NAME | --rd NAME"            tools/build_options/ directory.
513      echo "      -rootdir=NAME | --rootdir=NAME | -rd=NAME | --rd=NAME"  
514      echo "    -mods NAME | --mods NAME | -mo NAME | --mo NAME"      -pdepend NAME | --pdepend NAME
515      echo "      -mods=NAME | --mods=NAME | -mo=NAME | --mo=NAME"        -pdepend=NAME | --pdepend=NAME
516      echo "    -disable NAME | --disable NAME"            Get package dependency information from "NAME".
517      echo "      -disable=NAME | --disable=NAME"  
518      echo "    -enable NAME | --enable NAME"      -pdefault NAME | --pdefault NAME
519      echo "      -enable=NAME | --enable=NAME"        -pdefault=NAME | --pdefault=NAME
520      echo "    -noopt NAME | --noopt NAME"            Get the default package list from "NAME".
521      echo "      -noopt=NAME | --noopt=NAME"  
522  #    echo "    -cpp NAME | --cpp NAME"      -make NAME | -m NAME
523  #    echo "      -cpp=NAME | --cpp=NAME"        --make=NAME | -m=NAME
524      echo "    -fortran NAME | --fortran NAME | -fc NAME | --fc NAME"            Use "NAME" for the MAKE program. The default is "make" but
525      echo "      -fc=NAME | --fc=NAME"            many platforms, "gmake" is the preferred choice.
526      echo "    -[no]ieee | --[no]ieee"  
527      echo "    -[no]mpi | --[no]mpi"      -makefile NAME | -mf NAME
528      echo "    -[no]jam | --[no]jam"        --makefile=NAME | -mf=NAME
529      echo            Call the makefile "NAME".  The default is "Makefile".
530      echo "  and NAME is a string such as:"  
531      echo      -makedepend NAME | -md NAME
532      echo "    --enable pkg1   --enable 'pkg1 pkg2'   --enable 'pkg1 pkg2 pkg3'"        --makedepend=NAME | -md=NAME
533      echo "    -mods=dir1   -mods='dir1'   -mods='dir1 dir2 dir3'"            Use "NAME" for the MAKEDEPEND program.
534      echo "    -foptim='-Mvect=cachesize:512000,transform -xtypemap=real:64,double:64,integer:32'"  
535      echo      -rootdir NAME | --rootdir NAME | -rd NAME | --rd NAME
536      echo "  which, depending upon your shell, may need to be single-quoted"        -rootdir=NAME | --rootdir=NAME | -rd=NAME | --rd=NAME
537      echo "  if it contains spaces, dashes, or other special characters."            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  #eh3 # This is the generic configuration.  #  Build a CPP macro to automate calling C routines from FORTRAN
639  #eh3 set LN         = ( 'ln -s' )  get_fortran_c_namemangling()  {
640  #eh3 set CPP        = ( '/lib/cpp -P' )  
641  #eh3 set S64        = ( '$(TOOLSDIR)/set64bitConst.sh' )      #echo "FC_NAMEMANGLE = \"$FC_NAMEMANGLE\""
642  #eh3 set KPP        = (  )      if test ! "x$FC_NAMEMANGLE" = x ; then
643  #eh3 set FC         = ( 'f77' )          return 0
644  #eh3 set LINK       = $FC      fi
645  #eh3 set MAKEDEPEND = ( 'makedepend' )  
646  #eh3 set INCLUDES   = ( -I. )      default_nm="#define FC_NAMEMANGLE(X) X ## _"
647  #eh3 set FFLAGS     = (  )      
648  #eh3 set FOPTIM     = (  )      cat > genmake_test.c <<EOF
649  #eh3 set CFLAGS     = (  )  void tcall( char * string ) { tsub( string ); }
650  #eh3 set KFLAGS1    = (  )  EOF
651  #eh3 set KFLAGS2    = (  )      $MAKE genmake_test.o >> genmake_warnings 2>&1
652  #eh3 set LIBS       = (  )      RETVAL=$?
653  #eh3 set KPPFILES   = (  )      if test "x$RETVAL" != x0 ; then
654  #eh3 if (! $?NOOPTFILES ) set NOOPTFILES = (  )          FC_NAMEMANGLE=$default_nm
655  #eh3 if (! $?NOOPTFLAGS ) set NOOPTFLAGS = (  )          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
705    
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    check_HAVE_CLOC()  {
731        get_fortran_c_namemangling
732        cat <<EOF > genmake_tc_1.c
733    $FC_NAMEMANGLE
734    #include <stdio.h>
735    #include <stdlib.h>
736    #include <unistd.h>
737    #include <assert.h>
738    #include <sys/time.h>
739    void FC_NAMEMANGLE(cloc) ( double *curtim )
740    {
741     struct timeval tv1;
742     gettimeofday(&tv1 , (void *)NULL );
743     *curtim =  (double)((tv1.tv_usec)+(tv1.tv_sec)*1.E6);
744     *curtim = *curtim/1.E6;
745    }
746    EOF
747        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        if test ! "x$HAVE_SIGREG" = x ; then
771            return
772        fi
773        get_fortran_c_namemangling
774        cat <<EOF > genmake_tc_1.c
775    $FC_NAMEMANGLE
776    #include <stdlib.h>
777    #include <stdio.h>
778    #include <signal.h>
779    #include <errno.h>
780    #include <ucontext.h>
781    
782    int * ip;
783    
784    static void killhandler(
785        unsigned int sn, siginfo_t  si, struct ucontext *sc )
786    {
787        *ip = *ip + 1;
788        return;
789    }
790    
791    void FC_NAMEMANGLE(sigreg) (int * aip)
792    {
793        struct sigaction s;
794        ip = aip;
795        s.sa_flags = SA_SIGINFO;
796        s.sa_sigaction = (void *)killhandler;
797        if(sigaction (SIGTERM,&s,(struct sigaction *)NULL)) {
798            printf("Sigaction returned error = %d\n", errno);
799            exit(0);
800        }
801        return;
802    }
803    EOF
804        make genmake_tc_1.o >> genmake_warnings 2>&1
805        RET_C=$?
806        cat <<EOF > genmake_tc_2.$FS
807          program hello
808          integer anint
809          common /iv/ anint
810          external sigreg
811          call sigreg(anint)
812          end
813    EOF
814        echo >> genmake_warnings
815        echo "running: check_HAVE_SIGREG()" >> genmake_warnings
816        cat genmake_tc_2.$FS >> genmake_warnings
817        COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
818        echo $COMM >> genmake_warnings
819        $COMM >> genmake_warnings 2>&1
820        RETVAL=$?
821        if test "x$RETVAL" = x0 ; then
822            HAVE_SIGREG=t
823            DEFINES="$DEFINES -DHAVE_SIGREG"
824        fi
825        rm -f genmake_tc*
826    }
827    
828    
829    check_HAVE_SETRLSTK()  {
830        if test "x$HAVE_SETRLSTK" = xt ; then
831            DEFINES="$DEFINES -DHAVE_SETRLSTK"
832            return
833        fi  
834        if test ! "x$HAVE_SETRLSTK" = x ; then
835            return
836        fi
837        get_fortran_c_namemangling
838        cat <<EOF > genmake_tc_1.c
839    $FC_NAMEMANGLE
840    #include <sys/time.h>
841    #include <sys/resource.h>
842    #include <unistd.h>
843    void FC_NAMEMANGLE(setrlstk) ()
844    {
845        struct rlimit rls;
846        rls.rlim_cur = RLIM_INFINITY;
847        rls.rlim_max = RLIM_INFINITY;
848        setrlimit(RLIMIT_STACK, &rls);
849        return;
850    }
851    EOF
852        make genmake_tc_1.o >> genmake_warnings 2>&1
853        RET_C=$?
854        cat <<EOF > genmake_tc_2.$FS
855          program hello
856          external setrlstk
857          call setrlstk()
858          end
859    EOF
860        echo >> genmake_warnings
861        echo "running: check_HAVE_SETRLSTK()" >> genmake_warnings
862        cat genmake_tc_2.$FS >> genmake_warnings
863        COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
864        echo $COMM >> genmake_warnings
865        $COMM >> genmake_warnings 2>&1
866        RETVAL=$?
867        if test "x$RETVAL" = x0 ; then
868            HAVE_SETRLSTK=t
869            DEFINES="$DEFINES -DHAVE_SETRLSTK"
870        fi
871        rm -f genmake_tc*
872    }
873    
874    
875    check_HAVE_STAT()  {
876        get_fortran_c_namemangling
877        cat <<EOF > genmake_tc_1.c
878    $FC_NAMEMANGLE
879    #include <stdio.h>
880    #include <stdlib.h>
881    #include <unistd.h>
882    #include <sys/stat.h>
883    #include <sys/types.h>
884    void FC_NAMEMANGLE(tfsize) ( int *nbyte )
885    {
886        char name[512];
887        struct stat astat;
888    
889        name[0] = 'a'; name[1] = '\0';
890        if (! stat(name, &astat))
891            *nbyte = (int)(astat.st_size);
892        else
893            *nbyte = -1;
894    }
895    EOF
896        make genmake_tc_1.o >> genmake_tc.log 2>&1
897        RET_C=$?
898        cat <<EOF > genmake_tc_2.$FS
899          program hello
900          integer nbyte
901          call tfsize(nbyte)
902          print *," HELLO WORLD", nbyte
903          end
904    EOF
905        echo >> genmake_warnings
906        echo "running: check_HAVE_STAT()" >> genmake_warnings
907        cat genmake_tc_2.$FS >> genmake_warnings
908        COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
909        echo $COMM >> genmake_warnings
910        $COMM >> genmake_tc.log 2>&1
911        RETVAL=$?
912        if test "x$RETVAL" = x0 ; then
913            HAVE_STAT=t
914            DEFINES="$DEFINES -DHAVE_STAT"
915        fi
916        rm -f genmake_tc*
917    }
918    
919    
920    check_netcdf_libs()  {
921        if test ! "x$SKIP_NETCDF_CHECK" = x ; then
922            return
923        fi
924        echo >> genmake_warnings
925        echo "running: check_netcdf_libs()" >> genmake_warnings
926        cat <<EOF > genmake_tnc.F
927          program fgennc
928    #include "netcdf.inc"
929    EOF
930        if test ! "x$MPI" = x ; then
931            echo '#include "mpif.h"' >> genmake_tnc.F
932        fi
933        cat <<EOF >> genmake_tnc.F
934          integer iret, ncid, xid
935          iret = nf_create('genmake_tnc.nc', NF_CLOBBER, ncid)
936          IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
937          iret = nf_def_dim(ncid, 'X', 11, xid)
938          IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
939          iret = nf_close(ncid)
940          IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
941          end
942    EOF
943        echo "===  genmake_tnc.F  ===" > genmake_tnc.log
944        cat genmake_tnc.F >> genmake_tnc.log
945        echo "===  genmake_tnc.F  ===" >> genmake_tnc.log
946        RET_CPP=f
947        COMM="cat genmake_tnc.F | $CPP $DEFINES $INCLUDES"
948        echo "$COMM" >> genmake_tnc.log
949        $COMM > genmake_tnc.$FS 2>/dev/null  &&  RET_CPP=t
950        if test "x$RET_CPP" = xf ; then
951            echo "  WARNING: CPP failed to pre-process the netcdf test." \
952                >> genmake_tnc.log
953            echo "    Please check that \$INCLUDES is properly set." \
954                >> genmake_tnc.log
955        fi
956        echo "$FC $FFLAGS $FOPTIM -c genmake_tnc.$FS  \ " >> genmake_tnc.log
957        echo "  &&  $LINK -o genmake_tnc.o $LIBS" >> genmake_tnc.log
958        $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1  \
959            &&  $LINK -o genmake_tnc genmake_tnc.o $LIBS >> genmake_tnc.log 2>&1
960        RET_COMPILE=$?
961        cat genmake_tnc.log >> genmake_warnings
962    
963        #EH3  Remove test program execution for machines that either disallow
964        #EH3  execution or cannot support it (eg. cross-compilers)
965        #EH3
966        #EH3 test -x ./genmake_tnc  &&  ./genmake_tnc >> genmake_tnc.log 2>&1
967        #EH3 RETVAL=$?
968        #EH3 if test "x$RET_COMPILE" = x0 -a "x$RETVAL" = x0 ; then
969    
970        if test "x$RET_COMPILE" = x0 ; then
971            HAVE_NETCDF=t
972        else
973            # try again with "-lnetcdf" added to the libs
974            echo "try again with added '-lnetcdf'" > genmake_tnc.log
975            echo "cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS \ " >> genmake_tnc.log
976            echo " &&  $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS \ " >> genmake_tnc.log
977            echo " &&  $LINK -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf" >> genmake_tnc.log
978            cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS 2>/dev/null  \
979                &&  $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1  \
980                &&  $LINK -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf >> genmake_tnc.log 2>&1
981            RET_COMPILE=$?
982            cat genmake_tnc.log >> genmake_warnings
983            if test "x$RET_COMPILE" = x0 ; then
984                LIBS="$LIBS -lnetcdf"
985                HAVE_NETCDF=t
986            fi
987        fi
988        rm -f genmake_tnc*
989    }
990    
991    
992    
993    ###############################################################################
994    #   Sequential part of script starts here
995    ###############################################################################
996    
997  #  Set defaults here  #  Set defaults here
998  COMMANDL="$0 $@"  COMMANDL="$0 $@"
# Line 170  PLATFORM= Line 1001  PLATFORM=
1001  LN=  LN=
1002  S64=  S64=
1003  KPP=  KPP=
1004  FC=  #FC=
1005    #CC=gcc
1006    #CPP=
1007  LINK=  LINK=
1008    DEFINES=
1009  PACKAGES=  PACKAGES=
1010  ENABLE=  ENABLE=
1011  DISABLE=  DISABLE=
1012  MAKEFILE=  # MAKEFILE=
1013  MAKEDEPEND=  # MAKEDEPEND=
1014  PDEPEND=  PDEPEND=
1015  DUMPSTATE=f  DUMPSTATE=t
1016  PDEFAULT=  PDEFAULT=
1017  OPTFILE=  OPTFILE=
1018  INCLUDES="-I."  INCLUDES="-I. $INCLUDES"
1019  FFLAGS=  FFLAGS=
1020  FOPTIM=  FOPTIM=
1021  CFLAGS=  CFLAGS=
1022  KFLAGS1=  KFLAGS1=
1023  KFLAGS2=  KFLAGS2=
1024    #LDADD=
1025  LIBS=  LIBS=
1026  KPPFILES=  KPPFILES=
1027  NOOPTFILES=  NOOPTFILES=
1028  NOOPTFLAGS=  NOOPTFLAGS=
1029    MPI=
1030    MPIPATH=
1031    TS=
1032    PAPIS=
1033    PCLS=
1034    FOOLAD=
1035    PAPI=
1036    PCL=
1037    HPMT=
1038    GSL=
1039    HAVE_TEST_L=
1040    
1041    # DEFINES checked by test compilation or command-line
1042    HAVE_SYSTEM=
1043    HAVE_FDATE=
1044    FC_NAMEMANGLE=
1045    HAVE_CLOC=
1046    # HAVE_SETRLSTK=
1047    HAVE_STAT=
1048    HAVE_NETCDF=
1049    HAVE_ETIME=
1050    IGNORE_TIME=
1051    
1052  MODS=  MODS=
1053  TOOLSDIR=  TOOLSDIR=
1054  SOURCEDIRS=  SOURCEDIRS=
1055  INCLUDEDIRS=  INCLUDEDIRS=
1056    STANDARDDIRS="USE_THE_DEFAULT"
1057    
1058    G2ARGS=
1059    BASH=
1060  PWD=`pwd`  PWD=`pwd`
1061  MAKE=make  test "x$MAKE" = x  &&  MAKE=make
1062  THISHOSTNAME=`hostname`  test "x$AWK" = x   &&  AWK=awk
1063    EMBED_SRC=
1064    THISHOST=`hostname`
1065  THISCWD=`pwd`  THISCWD=`pwd`
1066  THISDATE=`date`  THISDATE=`date`
1067    THISUSER=`echo $USER`
1068    THISVER=
1069  MACHINE=`uname -a`  MACHINE=`uname -a`
1070  EXECUTABLE=  EXECUTABLE=
1071  EXEHOOK=  EXEHOOK=
1072  EXEDIR=  EXEDIR=
1073    PACKAGES_CONF=
1074    IEEE=
1075    if test "x$MITGCM_IEEE" != x ; then
1076        IEEE=$MITGCM_IEEE
1077    fi
1078    FS=
1079    FS90=
1080    
1081    AUTODIFF_PKG_USED=f
1082    AD_OPTFILE=
1083    TAF=
1084    AD_TAF_FLAGS=
1085    FTL_TAF_FLAGS=
1086    SVD_TAF_FLAGS=
1087    TAF_EXTRA=
1088    TAMC=
1089    AD_TAMC_FLAGS=
1090    FTL_TAF_FLAGS=
1091    SVD_TAMC_FLAGS=
1092    TAMC_EXTRA=
1093    
1094    
1095  #  The following state can be set directly by command-line switches  #  The following state can be set directly by command-line switches
1096  gm_s1="OPTFILE PDEPEND PDEFAULT MAKEFILE PLATFORM ROOTDIR MODS DISABLE ENABLE NOOPT"  gm_s1="OPTFILE PDEPEND PDEFAULT MAKEFILE PLATFORM ROOTDIR MODS DISABLE ENABLE"
1097  gm_s2="FC IEEE MPI JAM DUMPSTATE"  gm_s2="FC CPP IEEE TS PAPIS PCLS PAPI PCL HPMT GSL MPI JAM DUMPSTATE STANDARDDIRS"
1098    
1099  #  The following state is not directly set by command-line switches  #  The following state is not directly set by command-line switches
1100  gm_s3="LN S64 KPP LINK PACKAGES MAKEDEPEND PDEPEND PDEFAULT INCLUDES FFLAGS FOPTIM "  gm_s3="LN S64 KPP LINK PACKAGES MAKEDEPEND PDEPEND PDEFAULT INCLUDES FFLAGS FOPTIM "
1101  gm_s4="CFLAGS KFLAGS1 KFLAGS2 LIBS KPPFILES NOOPTFILES NOOPTFLAGS"  gm_s4="CFLAGS KFLAGS1 KFLAGS2 LIBS KPPFILES NOOPTFILES NOOPTFLAGS"
1102  gm_s5="TOOLSDIR SOURCEDIRS INCLUDEDIRS PWD MAKE THISHOSTNAME THISDATE MACHINE"  gm_s5="TOOLSDIR SOURCEDIRS INCLUDEDIRS PWD MAKE THISHOST THISUSER THISDATE THISVER MACHINE"
1103  gm_s6="EXECUTABLE EXEHOOK EXEDIR"  gm_s6="EXECUTABLE EXEHOOK EXEDIR PACKAGES_CONF"
1104    gm_s7="HAVE_SYSTEM HAVE_FDATE FC_NAMEMANGLE HAVE_ETIME"
1105    
1106  gm_state="COMMANDL $gm_s1 $gm_s2 $gm_s3 $gm_s4 $gm_s5 $gm_s6"  #  The following are all related to adjoint/tangent-linear stuff
1107    gm_s10="AUTODIFF_PKG_USED AD_OPTFILE TAMC TAF AD_TAMC_FLAGS AD_TAF_FLAGS"
1108    gm_s11="FTL_TAMC_FLAGS FTL_TAF_FLAGS SVD_TAMC_FLAGS SVD_TAF_FLAGS"
1109    gm_s12="TAF_EXTRA TAMC_EXTRA"
1110    
1111    gm_state="COMMANDL $gm_s1 $gm_s2 $gm_s3 $gm_s4 $gm_s5 $gm_s6 $gm_s7"
1112    gm_state="$gm_state $gm_s10 $gm_s11 $gm_s12"
1113    
1114    cat <<EOF
1115    
1116    GENMAKE :
1117    
1118    A program for GENerating MAKEfiles for the MITgcm project.  For a
1119    quick list of options, use "genmake -h" or for more detail see:
1120    
1121      http://mitgcm.org/devel_HOWTO/
1122    
1123    EOF
1124    
 echo  
1125  echo "===  Processing options files and arguments  ==="  echo "===  Processing options files and arguments  ==="
1126  gm_local="./gm_local"  gm_local="genmake_local"
1127  echo -n "  getting local config information:  "  for i in . $MODS ; do
1128  if test -e $gm_local ; then      if test -r $i/$gm_local ; then
1129            . $i/$gm_local
1130            break
1131        fi
1132    done
1133    printf "  getting local config information:  "
1134    if test -f $gm_local ; then
1135      echo "using $gm_local"      echo "using $gm_local"
1136      source $gm_local      . $gm_local
1137      # echo "DISABLE=$DISABLE"      # echo "DISABLE=$DISABLE"
1138      # echo "ENABLE=$ENABLE"      # echo "ENABLE=$ENABLE"
1139  else  else
1140      echo "none found"      echo "none found"
1141  fi  fi
1142    
1143  #  echo "$0::$1:$2:$3:$4:$5:$6:$7:"  #echo "$0::$1:$2:$3:$4:$5:$6:$7:"
1144  #OPTIONS=  #OPTIONS=
1145  #n=0  #n=0
1146  #for i ; do  #for i ; do
# Line 244  fi Line 1151  fi
1151  #   n=$(( $n + 1 ))  #   n=$(( $n + 1 ))
1152  #done  #done
1153  #parse_options  #parse_options
   
1154  ac_prev=  ac_prev=
1155  for ac_option ; do  for ac_option in "$@" ; do
1156    
1157        G2ARGS="$G2ARGS \"$ac_option\""
1158    
1159      # If the previous option needs an argument, assign it.      # If the previous option needs an argument, assign it.
1160      if test -n "$ac_prev"; then      if test -n "$ac_prev"; then
# Line 269  for ac_option ; do Line 1177  for ac_option ; do
1177          -optfile=* | --optfile=* | -of=* | --of=*)          -optfile=* | --optfile=* | -of=* | --of=*)
1178              OPTFILE=$ac_optarg ;;              OPTFILE=$ac_optarg ;;
1179                    
1180            -adoptfile | --adoptfile | -adof | --adof)
1181                ac_prev=AD_OPTFILE ;;
1182            -adoptfile=* | --adoptfile=* | -adof=* | --adof=*)
1183                AD_OPTFILE=$ac_optarg ;;
1184            
1185          -pdepend | --pdepend)          -pdepend | --pdepend)
1186              ac_prev=PDEPEND ;;              ac_prev=PDEPEND ;;
1187          -pdepend=* | --pdepend=*)          -pdepend=* | --pdepend=*)
# Line 284  for ac_option ; do Line 1197  for ac_option ; do
1197          -make=* | --make=* | -m=* | --m=*)          -make=* | --make=* | -m=* | --m=*)
1198              MAKE=$ac_optarg ;;              MAKE=$ac_optarg ;;
1199                    
1200            -bash | --bash)
1201                ac_prev=BASH ;;
1202            -bash=* | --bash=*)
1203                BASH=$ac_optarg ;;
1204            
1205            -makedepend | --makedepend | -md | --md)
1206                ac_prev=MAKEDEPEND ;;
1207            -makedepend=* | --makedepend=* | -md=* | --md=*)
1208                MAKEDEPEND=$ac_optarg ;;
1209            
1210          -makefile | --makefile | -ma | --ma)          -makefile | --makefile | -ma | --ma)
1211              ac_prev=MAKEFILE ;;              ac_prev=MAKEFILE ;;
1212          -makefile=* | --makefile=* | -ma=* | --ma=*)          -makefile=* | --makefile=* | -ma=* | --ma=*)
1213              MAKEFILE=$ac_optarg ;;              MAKEFILE=$ac_optarg ;;
1214                    
1215          -platform | --platform | -pl | --pl)          -platform | --platform | -pl | --pl | -platform=* | --platform=* | -pl=* | --pl=*)
1216              ac_prev=PLATFORM ;;              echo "ERROR: The platform option has been removed.  Please specify"
1217          -platform=* | --platform=* | -pl=* | --pl=*)              echo "  the build options using the \"optfile\" mechanism."
1218              PLATFORM=$ac_optarg ;;              echo
1219                usage
1220                ;;
1221                    
1222          -rootdir | --rootdir | -rd | --rd)          -rootdir | --rootdir | -rd | --rd)
1223              ac_prev=ROOTDIR ;;              ac_prev=ROOTDIR ;;
# Line 314  for ac_option ; do Line 1239  for ac_option ; do
1239          -enable=* | --enable=*)          -enable=* | --enable=*)
1240              ENABLE=$ac_optarg ;;              ENABLE=$ac_optarg ;;
1241                    
1242          -noopt | --noopt)          -standarddirs | --standarddirs)
1243              ac_prev=NOOPT ;;              ac_prev=STANDARDDIRS ;;
1244          -noopt=* | --noopt=*)          -standarddirs=* | --standarddirs=*)
1245              NOOPT=$ac_optarg ;;              STANDARDDIRS=$ac_optarg ;;
1246            
1247  #           -cpp | --cpp)  #           -cpp | --cpp)
1248  #               ac_prev=cpp ;;  #               ac_prev=cpp ;;
1249  #           -cpp=* | --cpp=*)  #           -cpp=* | --cpp=*)
1250  #               CPP=$ac_optarg ;;  #               CPP=$ac_optarg ;;
1251                        
1252            -cc | --cc)
1253                ac_prev=CC ;;
1254            -cc=* | --cc=*)
1255                CC=$ac_optarg ;;
1256            
1257          -fortran | --fortran | -fc | --fc)          -fortran | --fortran | -fc | --fc)
1258              ac_prev=FC ;;              ac_prev=FC ;;
1259          -fc=* | --fc=*)          -fc=* | --fc=*)
1260              FC=$ac_optarg ;;              FC=$ac_optarg ;;
1261                    
1262            -fs | --fs)
1263                ac_prev=FS ;;
1264            -fs=* | --fs=*)
1265                FS=$ac_optarg ;;
1266            
1267            -fs90 | --fs90)
1268                ac_prev=FS90 ;;
1269            -fs90=* | --fs90=*)
1270                FS90=$ac_optarg ;;
1271            
1272          -ieee | --ieee)          -ieee | --ieee)
1273              IEEE=1 ;;              IEEE=true ;;
1274          -noieee | --noieee)          -noieee | --noieee)
1275              IEEE=0 ;;              IEEE= ;;
1276            
1277            -ts | --ts)
1278                TS=true ;;
1279            -papis | --papis)
1280                PAPIS=true ;;
1281            -pcls | --pcls)
1282                PCLS=true ;;
1283            -foolad | --foolad)
1284                FOOLAD=true ;;
1285            -papi | --papi)
1286                PAPI=true ;;
1287            -pcl | --pcl)
1288                PCL=true ;;
1289            -hpmt | --hpmt)
1290                HPMT=true ;;
1291    
1292            -gsl | --gsl)
1293                GSL=true ;;
1294    
1295          -mpi | --mpi)          -mpi | --mpi)
1296              MPI=1 ;;              MPI=true ;;
1297          -nompi | --nompi)          -mpi=* | --mpi=*)
1298              MPI=0 ;;              MPIPATH=$ac_optarg
1299                        MPI=true ;;
1300          -jam | --jam)          
1301              JAM=1 ;;  #       -jam | --jam)
1302          -nojam | --nojam)  #           JAM=1 ;;
1303              JAM=0 ;;  #       -nojam | --nojam)
1304    #           JAM=0 ;;
1305                    
1306          -ds | --ds)          -ds | --ds)
1307              DUMPSTATE=t ;;              DUMPSTATE=t ;;
1308                    
1309            -taf_extra | --taf_extra)
1310                ac_prev=TAF_EXTRA ;;
1311            -taf_extra=* | --taf_extra=*)
1312                TAF_EXTRA=$ac_optarg ;;
1313    
1314            -tamc_extra | --tamc_extra)
1315                ac_prev=TAMC_EXTRA ;;
1316            -tamc_extra=* | --tamc_extra=*)
1317                TAMC_EXTRA=$ac_optarg ;;
1318            
1319            -ignoretime | -ignore_time | --ignoretime | --ignore_time)
1320                IGNORE_TIME="-DIGNORE_TIME" ;;
1321    
1322            -es | --es | -embed-source | --embed-source)
1323                EMBED_SRC=t ;;
1324    
1325          -*)          -*)
1326              echo "Error: unrecognized option: "$ac_option              echo "Error: unrecognized option: "$ac_option
1327              usage              usage
# Line 361  for ac_option ; do Line 1336  for ac_option ; do
1336            
1337  done  done
1338    
1339    
1340    if test -f ./.genmakerc ; then
1341        echo
1342        echo "WARNING: genmake2 has detected a copy of the old-style \"./.genmakerc\""
1343        echo "  file.  This file format is no longer supported.  Please see:"
1344        echo
1345        echo "    http://mitgcm.org/devel_HOWTO/"
1346        echo
1347        echo "  for directions on how to setup and use the new \"genmake2\" input"
1348        echo "  files and send an email to MITgcm-support@mitgcm.org if you want help."
1349        echo
1350    fi
1351    
1352    #  Find the MITgcm ${ROOTDIR}
1353    if test "x${ROOTDIR}" = x ; then
1354        tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1355        if test "x$tmp" = "xbin" -a -d ../model -a -d ../eesup -a -d ../pkg ; then
1356            ROOTDIR=".."
1357        else
1358            for d in . .. ../.. ../../.. ../../../.. ../../../../.. ; do
1359                if [ -d "$d/model" -a -d "$d/eesupp" -a -d "$d/pkg" ]; then
1360                    ROOTDIR=$d
1361                    printf "Warning:  ROOTDIR was not specified but there appears to be"
1362                    echo " a copy of MITgcm at \"$ROOTDIR\" so we'll try it."
1363                    break
1364                fi
1365            done
1366        fi
1367    fi
1368    if test "x${ROOTDIR}" = x ; then
1369        echo "Error: Cannot determine ROOTDIR for MITgcm code."
1370        echo "  Please specify a ROOTDIR using either an options "
1371        echo "  file or a command-line option."
1372        exit 1
1373    fi
1374    if test ! -d ${ROOTDIR} ; then
1375        echo "Error: the specified ROOTDIR (\"$ROOTDIR\") does not exist!"
1376        exit 1
1377    fi
1378    
1379    #  Find the MITgcm ${THISVER}
1380    if test -f "${ROOTDIR}/doc/tag-index" ; then
1381        THISVER=`grep '^checkpoint' ${ROOTDIR}/doc/tag-index | head -1`
1382    fi
1383    
1384    if test "x$MAKEFILE" = x ; then
1385        MAKEFILE="Makefile"
1386    fi
1387    
1388  echo "  getting OPTFILE information:  "  echo "  getting OPTFILE information:  "
1389  if test "x${OPTFILE}" = x ; then  if test "x${OPTFILE}" = x ; then
1390      echo "Warning: no OPTFILE specified so we'll look for possible settings"      if test "x$MITGCM_OF" = x ; then
1391      printf "\n===  Searching for possible settings for OPTFILE  ===\n"          echo "Warning: no OPTFILE specified so we'll look for possible settings"
1392      find_possible_configs          printf "\n===  Searching for possible settings for OPTFILE  ===\n"
1393  else          find_possible_configs
     if test "x$OPTFILE" = xNONE ; then  
         echo "    OPTFILE=NONE so we'll try to use default settings"  
1394      else      else
1395          if test -f "$OPTFILE" -a -r "$OPTFILE" ; then          OPTFILE=$MITGCM_OF
1396              echo "    using OPTFILE=\"$OPTFILE\""      fi
1397              source "$OPTFILE"  fi
1398              RETVAL=$?  if test "x$OPTFILE" != xNONE ; then
1399              if test "x$RETVAL" != x0 ; then      if test -f "$OPTFILE" -a -r "$OPTFILE" ; then
1400                  echo -n "Error: failed to source OPTFILE \"$OPTFILE\""          echo "    using OPTFILE=\"$OPTFILE\""
1401                  echo "--please check that variable syntax is bash-compatible"          . "$OPTFILE"
1402                  exit 1          RETVAL=$?
1403              fi          if test "x$RETVAL" != x0 ; then
1404              if test "x$DUMPSTATE" != xf ; then              printf "Error: failed to source OPTFILE \"$OPTFILE\""
1405                  cp -f $OPTFILE "gm_optfile"              echo "--please check that variable syntax is bash-compatible"
1406              fi              exit 1
1407          else          fi
1408              echo "Error: can't read OPTFILE=\"$OPTFILE\""          if test "x$DUMPSTATE" != xf ; then
1409                cp -f $OPTFILE "genmake_optfile"
1410            fi
1411        else
1412            echo "Error: can't read OPTFILE=\"$OPTFILE\""
1413            exit 1
1414        fi
1415    fi
1416    
1417    echo "  getting AD_OPTFILE information:  "
1418    if test "x${AD_OPTFILE}" = x ; then
1419        if test "x$MITGCM_AD_OF" = x ; then
1420            AD_OPTFILE=$ROOTDIR/tools/adjoint_options/adjoint_default
1421        else
1422            AD_OPTFILE=$MITGCM_AD_OF
1423        fi
1424    fi
1425    if test "x${AD_OPTFILE}" != xNONE ; then
1426        if test -f "$AD_OPTFILE" -a -r "$AD_OPTFILE" ; then
1427            echo "    using AD_OPTFILE=\"$AD_OPTFILE\""
1428            . "$AD_OPTFILE"
1429            RETVAL=$?
1430            if test "x$RETVAL" != x0 ; then
1431                printf "Error: failed to source AD_OPTFILE \"$AD_OPTFILE\""
1432                echo "--please check that variable syntax is bash-compatible"
1433              exit 1              exit 1
1434          fi          fi
1435            if test "x$DUMPSTATE" != xf ; then
1436                cp -f $AD_OPTFILE "genmake_ad_optfile"
1437            fi
1438        else
1439            echo "Error: can't read AD_OPTFILE=\"$AD_OPTFILE\""
1440            exit 1
1441      fi      fi
1442  fi  fi
1443    
1444  #  Check that FC, LINK, CPP, and S64 are defined.  If not, complain  #====================================================================
1445  #  and abort!  #  Set default values if not set by the optfile
1446    #
1447    #  Check that FC, CC, LINK, CPP, S64, LN, and MAKE are defined.  If not,
1448    #  either set defaults or complain and abort!
1449    if test ! "x$BASH" = x ; then
1450        # add a trailing space so that it works within the Makefile syntax (see below)
1451        BASH="$BASH "
1452    fi
1453  if test "x$FC" = x ; then  if test "x$FC" = x ; then
1454      cat <<EOF 1>&2      cat <<EOF 1>&2
1455    
1456  Error: no Fortran compiler: please specify using one of the following:  Error: no Fortran compiler: please specify using one of the following:
1457    1) within the options file ("FC=...") as specified by "-of=OPTFILE"    1) within the options file ("FC=...") as specified by "-of=OPTFILE"
1458    2) the "-fc=XXX" command-line option    2) the "-fc=XXX" command-line option
1459    3) the "./gm_local" file    3) the "./genmake_local" file
1460  EOF  EOF
1461      exit 1      exit 1
1462  fi  fi
1463    if test "x$CC" = x ; then
1464        CC=cc
1465    #     cat <<EOF 1>&2
1466    # Error: no C compiler: please specify using one of the following:
1467    #   1) within the options file ("CC=...") as specified by "-of=OPTFILE"
1468    #   2) the "-cc=XXX" command-line option
1469    #   3) the "./genmake_local" file
1470    # EOF
1471    #     exit 1
1472    fi
1473  if test "x$LINK" = x ; then  if test "x$LINK" = x ; then
1474      LINK=$FC      LINK=$FC
1475  fi  fi
1476    if test "x$MAKE" = x ; then
1477        MAKE="make"
1478    fi
1479  if test "x$CPP" = x ; then  if test "x$CPP" = x ; then
1480        CPP=cpp
1481    fi
1482    #EH3 === UGLY ===
1483    #  The following is an ugly little hack to check for $CPP in /lib/ and
1484    #  it should eventually be replaced with a more general function that
1485    #  searches a combo of the user's path and a list of "usual suspects"
1486    #  to find the correct location for binaries such as $CPP.
1487    for i in " " "/lib/" ; do
1488        echo "#define A a" | $i$CPP > test_cpp 2>&1 && CPP=$i$CPP
1489    done
1490    #EH3 === UGLY ===
1491    echo "#define A a" | $CPP > test_cpp 2>&1
1492    RETVAL=$?
1493    if test "x$RETVAL" != x0 ; then
1494      cat <<EOF 1>&2      cat <<EOF 1>&2
1495    
1496  Error: no C pre-processor: please specify using one of the following:  Error: C pre-processor "$CPP" failed the test case: please specify using:
1497    
1498    1) within the options file ("CPP=...") as specified by "-of=OPTFILE"    1) within the options file ("CPP=...") as specified by "-of=OPTFILE"
1499    2) the "./gm_local" file    2) the "./genmake_local" file
1500      3) with the CPP environment variable
1501    
1502  EOF  EOF
1503      exit 1      exit 1
1504    else
1505        rm -f test_cpp
1506  fi  fi
1507  if test "x$S64" = x ; then  look_for_makedepend
1508    if test "x$LN" = x ; then
1509        LN="ln -s"
1510    fi
1511    echo "test" > genmake_test_ln
1512    $LN genmake_test_ln genmake_tlink
1513    RETVAL=$?
1514    if test "x$RETVAL" != x0 ; then
1515      cat <<EOF 1>&2      cat <<EOF 1>&2
1516    
1517  Error: no C pre-processor: please specify using one of the following:  Error: The command "ln -s" failed -- please specify a working soft-link
1518    1) within the options file ("S64=...") as specified by "-of=OPTFILE"    command in the optfile.
1519    2) the "./gm_local" file  
1520  EOF  EOF
1521      exit 1      exit 1
1522  fi  fi
1523    test -L genmake_tlink > /dev/null 2>&1
1524    RETVAL=$?
1525    if test "x$RETVAL" = x0 ; then
1526        HAVE_TEST_L=t
1527    fi
1528    rm -f genmake_test_ln genmake_tlink
1529    
1530    #  Check for broken *.F/*.f handling and fix if possible
1531    check_for_broken_Ff
1532    
1533    if test ! "x$MPI" = x ; then
1534          echo "  Turning on MPI cpp macros"
1535          DEFINES="$DEFINES -DALLOW_USE_MPI -DALWAYS_USE_MPI"
1536    fi
1537    
1538    if test ! "x$TS" = x ; then
1539          echo "  Turning on timing per timestep"
1540          if test ! "x$FOOLAD" = x ; then
1541                DEFINES="$DEFINES -DTIME_PER_TIMESTEP_SFP"
1542          else
1543                DEFINES="$DEFINES -DTIME_PER_TIMESTEP"
1544          fi
1545    fi
1546    if test ! "x$PAPIS" = x ; then
1547          echo "  Turning on PAPI flop summary per timestep"
1548          echo "  Please make sure PAPIINC, PAPILIB are defined"
1549          if test ! "x$FOOLAD" = x ; then
1550                DEFINES="$DEFINES -DUSE_PAPI_FLOPS_SFP"
1551          else
1552                DEFINES="$DEFINES -DUSE_PAPI_FLOPS"
1553          fi
1554          INCLUDES="$INCLUDES $PAPIINC"
1555          LIBS="$LIBS $PAPILIB"
1556    fi
1557    if test ! "x$PCLS" = x ; then
1558          echo "  Turning on PCL counter summary per timestep"
1559          echo "  Please make sure PCLINC, PCLLIB are defined"
1560          if test ! "x$FOOLAD" = x ; then
1561                DEFINES="$DEFINES -DUSE_PCL_FLOPS_SFP"
1562          else
1563                DEFINES="$DEFINES -DUSE_PCL_FLOPS"
1564          fi
1565          INCLUDES="$INCLUDES $PCLINC"
1566          LIBS="$LIBS $PCLLIB"
1567    fi
1568    if test ! "x$PAPI" = x ; then
1569          if test ! "x$PAPIS" = x ; then
1570              echo "  PAPI performance analysis and flop summary per timestep cannot co-exist!"
1571              echo "  Sticking with PAPI flop summary per timestep!"
1572          else
1573              echo "  Turning on performance analysis with PAPI"
1574              echo "  Please make sure PAPIINC, PAPILIB are defined"
1575              DEFINES="$DEFINES -DUSE_PAPI"
1576              INCLUDES="$INCLUDES $PAPIINC"
1577              LIBS="$LIBS $PAPILIB"
1578          fi
1579    fi
1580    if test ! "x$PCL" = x ; then
1581          if test ! "x$PCLS" = x ; then
1582              echo "  PCL performance analysis and flop summary per timestep cannot co-exist!"
1583              echo "  Sticking with PCL flop summary per timestep!"
1584          else
1585              echo "  Turning on performance analysis with PCL"
1586              echo "  Please make sure PCLINC, PCLLIB are defined"
1587              DEFINES="$DEFINES -DUSE_PCL"
1588              INCLUDES="$INCLUDES $PCLINC"
1589              LIBS="$LIBS $PCLLIB"
1590          fi
1591    fi
1592    if test ! "x$HPMT" = x ; then
1593          if test ! "x$PAPI" = x ; then
1594              echo "  PAPI and the HPM Toolkit cannot co-exist!"
1595              echo "  Sticking with PAPI!"
1596          else if test ! "x$PCL" = x ; then
1597              echo "  PCL and the HPM Toolkit cannot co-exist!"
1598              echo "  Sticking with PCL!"
1599          else
1600              echo "  Turning on performance analysis with the HPM Toolkit"
1601              echo "  Please make sure HPMTINC, HPMTLIB are defined"
1602              DEFINES="$DEFINES -DUSE_LIBHPM"
1603              INCLUDES="$INCLUDES $HPMTINC"
1604              LIBS="$LIBS $HPMTLIB"
1605          fi
1606          fi
1607    fi
1608    if test ! "x$GSL" = x ; then
1609          echo "  Turning on use of GSL to control floating point calculations"
1610          echo "  Please make sure GSLINC, GSLLIB are defined"
1611          DEFINES="$DEFINES -DUSE_GSL_IEEE"
1612          INCLUDES="$INCLUDES $GSLINC"
1613          LIBS="$LIBS $GSLLIB"
1614    fi
1615    
1616    printf "\n===  Checking system libraries  ===\n"
1617    printf "  Do we have the system() command using $FC...  "
1618    cat > genmake_tcomp.$FS <<EOF
1619          program hello
1620          call system('echo hi')
1621          end
1622    EOF
1623    $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1624    RETVAL=$?
1625    if test "x$RETVAL" = x0 ; then
1626        HAVE_SYSTEM=t
1627        DEFINES="$DEFINES -DHAVE_SYSTEM"
1628        echo "yes"
1629    else
1630        HAVE_SYSTEM=
1631        echo "no"
1632    fi
1633    rm -f genmake_tcomp*
1634    
1635    printf "  Do we have the fdate() command using $FC...  "
1636    cat > genmake_tcomp.$FS <<EOF
1637          program hello
1638          CHARACTER*(128) string
1639          string = ' '
1640          call fdate( string )
1641          print *, string
1642          end
1643    EOF
1644    $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1645    RETVAL=$?
1646    if test "x$RETVAL" = x0 ; then
1647        HAVE_FDATE=t
1648        DEFINES="$DEFINES -DHAVE_FDATE"
1649        echo "yes"
1650    else
1651        HAVE_FDATE=
1652        echo "no"
1653    fi
1654    rm -f genmake_tcomp*
1655    
1656    printf "  Do we have the etime() command using $FC...  "
1657    cat > genmake_tcomp.$FS <<EOF
1658          program hello
1659          REAL*4 ACTUAL, TARRAY(2)
1660          EXTERNAL ETIME
1661          REAL*4 ETIME
1662          actual = etime( tarray )
1663          print *, tarray
1664          end
1665    EOF
1666    $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1667    RETVAL=$?
1668    if test "x$RETVAL" = x0 ; then
1669        HAVE_ETIME=t
1670        DEFINES="$DEFINES -DHAVE_ETIME"
1671        echo "yes"
1672    else
1673        HAVE_ETIME=
1674        echo "no"
1675    fi
1676    rm -f genmake_tcomp*
1677    
1678    printf "  Can we call simple C routines (here, \"cloc()\") using $FC...  "
1679    check_HAVE_CLOC
1680    if test "x$HAVE_CLOC" != x ; then
1681        echo "yes"
1682    else
1683        echo "no"
1684        if test "x$EMBED_SRC" = xt ; then
1685            echo "    WARNING: you requested file embedding but it has"
1686            echo "      been disabled since C code cannot be called"
1687            EMBED_SRC=
1688        fi
1689    fi
1690    rm -f genmake_t*
1691    
1692    printf "  Can we unlimit the stack size using $FC...  "
1693    check_HAVE_SETRLSTK
1694    if test "x$HAVE_SETRLSTK" = xt ; then
1695        echo "yes"
1696    else
1697        echo "no"
1698    fi
1699    rm -f genmake_t*
1700    
1701    printf "  Can we register a signal handler using $FC...  "
1702    check_HAVE_SIGREG
1703    if test "x$HAVE_SIGREG" = xt ; then
1704        echo "yes"
1705    else
1706        echo "no"
1707    fi
1708    rm -f genmake_t*
1709    
1710    printf "  Can we use stat() through C calls...  "
1711    check_HAVE_STAT
1712    if test "x$HAVE_STAT" != x ; then
1713        echo "yes"
1714    else
1715        echo "no"
1716    fi
1717    rm -f genmake_t*
1718    
1719    printf "  Can we create NetCDF-enabled binaries...  "
1720    check_netcdf_libs
1721    if test "x$HAVE_NETCDF" != x ; then
1722        echo "yes"
1723    else
1724        echo "no"
1725    fi
1726    DEFINES="$DEFINES $IGNORE_TIME"
1727    
1728    if test "x$EMBED_SRC" = xt ; then
1729        build_embed_encode
1730    fi
1731    if test "x$EMBED_SRC" = xt ; then
1732        ENABLE="$ENABLE embed_files"
1733    fi
1734    
1735    
1736  printf "\n===  Setting defaults  ===\n"  printf "\n===  Setting defaults  ===\n"
1737  echo -n "  Adding MODS directories:  "  printf "  Adding MODS directories:  "
1738  for d in $MODS ; do  for d in $MODS ; do
1739      if test ! -d $d ; then      if test ! -d $d ; then
1740          echo          echo
1741          echo "Error: MODS directory \"$d\" not found!"          echo "Error: MODS directory \"$d\" not found!"
1742          exit 1          exit 1
1743      else      else
1744          echo -n " $d"          printf " $d"
1745          SOURCEDIRS="$SOURCEDIRS $d"          SOURCEDIRS="$SOURCEDIRS $d"
1746          INCLUDEDIRS="$INCLUDEDIRS $d"          INCLUDEDIRS="$INCLUDEDIRS $d"
1747      fi      fi
1748  done  done
1749  echo  echo
1750    
 if test "x$MAKEFILE" = x ; then  
     MAKEFILE="Makefile"  
 fi  
1751  if test "x${PLATFORM}" = x ; then  if test "x${PLATFORM}" = x ; then
1752      PLATFORM=$p_PLATFORM      PLATFORM=$p_PLATFORM
1753  fi  fi
1754    
 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  
   
1755  if test "x${EXEDIR}" = x ; then  if test "x${EXEDIR}" = x ; then
1756      if test "${PWD##/*/}" = "bin" -a -d ../exe -a $ROOTDIR = .. ; then      tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1757        if test "x$tmp" = "xbin" -a -d ../exe -a $ROOTDIR = .. ; then
1758          EXEDIR=../exe          EXEDIR=../exe
1759      else      else
1760          EXEDIR=.          EXEDIR=.
# Line 487  if test "x${TOOLSDIR}" = x ; then Line 1769  if test "x${TOOLSDIR}" = x ; then
1769      TOOLSDIR="$ROOTDIR/tools"      TOOLSDIR="$ROOTDIR/tools"
1770  fi  fi
1771  if test ! -d ${TOOLSDIR} ; then  if test ! -d ${TOOLSDIR} ; then
1772      echo "Error: the specified $TOOLSDIR (\"$TOOLSDIR\") does not exist!"      echo "Error: the specified TOOLSDIR (\"$TOOLSDIR\") does not exist!"
1773      exit 1      exit 1
1774  fi  fi
1775    if test "x$S64" = x ; then
1776        echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.sh > /dev/null 2>&1
1777        RETVAL=$?
1778        if test "x${RETVAL}" = x0 ; then
1779            S64='$(TOOLSDIR)/set64bitConst.sh'
1780        else
1781            echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.csh > /dev/null 2>&1
1782            RETVAL=$?
1783            if test "x${RETVAL}" = x0 ; then
1784                S64='$(TOOLSDIR)/set64bitConst.csh'
1785            else
1786                cat <<EOF
1787    
1788    ERROR: neither of the two default scripts:
1789    
1790        ${TOOLSDIR}/set64bitConst.sh
1791        ${TOOLSDIR}/set64bitConst.csh
1792    
1793      are working so please check paths or specify (with \$S64) a
1794      working version of this script.
1795    
1796    EOF
1797                exit 1
1798            fi
1799        fi
1800    fi
1801    THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`
1802    
1803  EXECUTABLE=${EXECUTABLE:-mitgcmuv}  EXECUTABLE=${EXECUTABLE:-mitgcmuv}
1804    
# Line 498  EXECUTABLE=${EXECUTABLE:-mitgcmuv} Line 1807  EXECUTABLE=${EXECUTABLE:-mitgcmuv}
1807  #  they appear as regular source code  #  they appear as regular source code
1808  if test -r $ROOTDIR"/eesupp/src/Makefile" ; then  if test -r $ROOTDIR"/eesupp/src/Makefile" ; then
1809      echo "  Making source files in eesupp from templates"      echo "  Making source files in eesupp from templates"
1810      $MAKE -C $ROOTDIR"/eesupp/src/" > make_eesupp.errors 2>&1      ( cd $ROOTDIR"/eesupp/src/" && $MAKE ) > make_eesupp.errors 2>&1
1811      RETVAL=$?      RETVAL=$?
1812      if test "x${RETVAL}" = x0 ; then      if test "x${RETVAL}" = x0 ; then
1813          rm -f make_eesupp.errors          rm -f make_eesupp.errors
1814      else      else
1815          echo "Error: problem encountered while building source files in eesupp:"          echo "Error: problem encountered while building source files in eesupp:"
1816          cat make_eesupp.errors          cat make_eesupp.errors 1>&2
1817          exit 1          exit 1
1818      fi      fi
1819  fi  fi
1820    
1821    #same for exch2
1822    if test -r $ROOTDIR"/pkg/exch2/Makefile" ; then
1823        echo "  Making source files in exch2 from  templates"
1824        ( cd $ROOTDIR"/pkg/exch2/" && $MAKE ) > make_exch2.errors 2>&1
1825        RETVAL=$?
1826        if test "x${RETVAL}" = x0 ; then
1827            rm -f make_exch2.errors
1828        else
1829            echo "Error: problem encountered while building source files in exch2:"
1830            cat make_exch2.errors 1>&2
1831            exit 1
1832        fi
1833    fi
1834    
1835  printf "\n===  Determining package settings  ===\n"  printf "\n===  Determining package settings  ===\n"
1836  if  test "x${PDEPEND}" = x ; then  if  test "x${PDEPEND}" = x ; then
1837      tmp=$ROOTDIR"/pkg/pkg_depend"      tmp=$ROOTDIR"/pkg/pkg_depend"
# Line 528  echo "  getting package dependency info Line 1851  echo "  getting package dependency info
1851  #  Strip the comments and then convert the dependency file into  #  Strip the comments and then convert the dependency file into
1852  #  two arrays: PNAME, DNAME  #  two arrays: PNAME, DNAME
1853  cat $PDEPEND | sed -e 's/#.*$//g' \  cat $PDEPEND | sed -e 's/#.*$//g' \
1854      | 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}' \
1855      > ./.pd_tmp      > ./.pd_tmp
1856  RETVAL=$?  RETVAL=$?
1857  if test ! "x${RETVAL}" = x0 ; then  if test ! "x${RETVAL}" = x0 ; then
1858      echo "Error: unable to parse package dependencies -- please check PDEPEND=\"$PDEPEND\""      echo "Error: unable to parse package dependencies -- please check PDEPEND=\"$PDEPEND\""
1859      exit 1      exit 1
1860  fi  fi
1861  source ./.pd_tmp  . ./.pd_tmp
1862  rm -f ./.pd_tmp  rm -f ./.pd_tmp
1863    
1864  echo  -n "  checking default package list:  "  #  Search for default packages.  Note that a "$ROOTDIR/pkg/pkg_groups"
1865    #  file should eventually be added so that, for convenience, one can
1866    #  specify groups of packages using names like "ocean" and "atmosphere".
1867    echo "  checking default package list:  "
1868    if test "x${PDEFAULT}" = x ; then
1869        for i in "." $MODS ; do
1870            if test -r $i"/packages.conf" ; then
1871                    PDEFAULT=$i"/packages.conf"
1872                    break
1873            fi
1874        done
1875    fi
1876  if test "x${PDEFAULT}" = x ; then  if test "x${PDEFAULT}" = x ; then
1877      PDEFAULT="$ROOTDIR/pkg/pkg_default"      PDEFAULT="$ROOTDIR/pkg/pkg_default"
1878  fi  fi
1879  if test "x${PDEFAULT}" = xNONE ; then  if test "x${PDEFAULT}" = xNONE ; then
1880      echo "default packages file disabled"      echo "    default packages file disabled"
1881  else  else
1882      if test ! -r $PDEFAULT ; then      if test ! -r $PDEFAULT ; then
         echo ""  
1883          echo "Warning:  can't read default packages from PDEFAULT=\"$PDEFAULT\""          echo "Warning:  can't read default packages from PDEFAULT=\"$PDEFAULT\""
1884      else      else
1885          echo "  using PDEFAULT=\"$PDEFAULT\""          echo "    using PDEFAULT=\"$PDEFAULT\""
1886          #  Strip the comments and add all the names          #  Strip the comments and add all the names
1887          def=`cat $PDEFAULT | sed -e 's/#.*$//g' | awk '(NF>0){print $0}'`          def=`cat $PDEFAULT | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
1888          RETVAL=$?          RETVAL=$?
1889          if test "x${RETVAL}" != x0 ; then          if test "x${RETVAL}" != x0 ; then
1890              echo -n "Error: can't parse default package list "              printf "Error: can't parse default package list "
1891              echo "-- please check PDEFAULT=\"$PDEFAULT\""              echo "-- please check PDEFAULT=\"$PDEFAULT\""
1892              exit 1              exit 1
1893          fi          fi
1894          for i in $def ; do          for i in $def ; do
1895              PACKAGES="$PACKAGES $i"              PACKAGES="$PACKAGES $i"
1896          done          done
1897          echo "    packages are:  $PACKAGES"          echo "    before group expansion packages are: $PACKAGES"
1898            RET=1
1899            while test $RET = 1 ; do expand_pkg_groups; RET=$?; done
1900            echo "    after group expansion packages are:  $PACKAGES"
1901      fi      fi
1902  fi  fi
1903    
1904  echo "  applying DISABLE settings"  echo "  applying DISABLE settings"
1905    for i in $PACKAGES ; do
1906        echo $i >> ./.tmp_pack
1907    done
1908    for i in `grep  "-" ./.tmp_pack` ; do
1909        j=`echo $i | sed 's/[-]//'`
1910        DISABLE="$DISABLE $j"
1911    done
1912  pack=  pack=
1913  for p in $PACKAGES ; do  for p in $PACKAGES ; do
1914      addit="t"      addit="t"
# Line 580  for p in $PACKAGES ; do Line 1923  for p in $PACKAGES ; do
1923  done  done
1924  PACKAGES="$pack"  PACKAGES="$pack"
1925  echo "  applying ENABLE settings"  echo "  applying ENABLE settings"
1926  rm -f ./.tmp_pack  echo "" > ./.tmp_pack
1927  PACKAGES="$PACKAGES $ENABLE"  PACKAGES="$PACKAGES $ENABLE"
1928    # Test if each explicitly referenced package exists
1929  for i in $PACKAGES ; do  for i in $PACKAGES ; do
1930      if test ! -d "$ROOTDIR/pkg/$i" ; then      j=`echo $i | sed 's/[-+]//'`
1931        if test ! -d "$ROOTDIR/pkg/$j" ; then
1932          echo "Error: can't find package $i at \"$ROOTDIR/pkg/$i\""          echo "Error: can't find package $i at \"$ROOTDIR/pkg/$i\""
1933          exit 1          exit 1
1934      fi      fi
1935      echo $i >> ./.tmp_pack      echo $i >> ./.tmp_pack
1936  done  done
 pack=`cat ./.tmp_pack | sort | uniq`  
 rm -f ./.tmp_pack  
1937  PACKAGES=  PACKAGES=
1938  for i in $pack ; do  for i in `grep -v "-" ./.tmp_pack | sort | uniq` ; do
1939      PACKAGES="$PACKAGES $i"      PACKAGES="$PACKAGES $i"
1940  done  done
1941    rm -f ./.tmp_pack
1942  echo "    packages are:  $PACKAGES"  echo "    packages are:  $PACKAGES"
1943    
1944    #  Check availability of NetCDF and then either build the MNC template
1945    #  files or delete mnc from the list of available packages.
1946    echo $PACKAGES | grep ' mnc ' > /dev/null 2>&1
1947    RETVAL=$?
1948    if test "x$RETVAL" = x0 ; then
1949        if test "x$HAVE_NETCDF" != xt ; then
1950            cat <<EOF
1951    
1952    *********************************************************************
1953    WARNING: the "mnc" package was enabled but tests failed to compile
1954      NetCDF applications.  Please check that:
1955    
1956      1) NetCDF is correctly installed for this compiler and
1957      2) the LIBS variable (within the "optfile") specifies the correct
1958           NetCDF library to link against.
1959    
1960      Due to this failure, the "mnc" package is now DISABLED.
1961    *********************************************************************
1962    
1963    EOF
1964            PACKAGES=`echo $PACKAGES | sed -e 's/mnc//g'`
1965            DISABLE="$DISABLE mnc"
1966        else
1967            ( cd $ROOTDIR"/pkg/mnc" && $MAKE testclean && $MAKE templates ) > make_mnc.errors 2>&1
1968            RETVAL=$?
1969            if test "x${RETVAL}" = x0 ; then
1970                rm -f make_mnc.errors
1971            else
1972                echo "Error: problem encountered while building source files in pkg/mnc:"
1973                cat make_mnc.errors 1>&2
1974                exit 1
1975            fi
1976        fi
1977    fi
1978    
1979  echo "  applying package dependency rules"  echo "  applying package dependency rules"
1980  ck=  ck=
1981  while test "x$ck" != xtt ; do  while test "x$ck" != xtt ; do
# Line 661  while test "x$ck" != xtt ; do Line 2040  while test "x$ck" != xtt ; do
2040              echo "  the dependency rules for \"$dname\""              echo "  the dependency rules for \"$dname\""
2041              exit 1              exit 1
2042          fi          fi
2043          i=$(( $i + 1 ))          i=`echo "$i + 1" | bc -l`
2044            #i=$(( $i + 1 ))
2045      done      done
2046      ck=$ck"t"      ck=$ck"t"
2047  done  done
# Line 671  for i in $PACKAGES ; do Line 2051  for i in $PACKAGES ; do
2051      if test -d $adr ; then      if test -d $adr ; then
2052          SOURCEDIRS="$SOURCEDIRS $adr"          SOURCEDIRS="$SOURCEDIRS $adr"
2053          INCLUDEDIRS="$INCLUDEDIRS $adr"          INCLUDEDIRS="$INCLUDEDIRS $adr"
2054            if test "x$i" = xautodiff ; then
2055                AUTODIFF_PKG_USED=t
2056            fi
2057      else      else
2058          echo "Error: the directory \"$adr\" for package $i doesn't exist"          echo "Error: the directory \"$adr\" for package $i doesn't exist"
2059          exit 1          exit 1
2060      fi      fi
2061  done  done
2062    
2063  #  This is compatible with the old genmake.  The "DISABLE_*" flags  # Create a list of #define and #undef to enable/disable packages
2064  #  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  
2065  #  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
2066  #  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
2067  #  file would eventually be split up so that all package-related #define  #  file would eventually be split up so that all package-related #define
2068  #  statements could be separated and handled only by genmake.  #  statements could be separated and handled only by genmake.
2069  names=`ls -1 "$ROOTDIR/pkg"`  names=`ls -1 "$ROOTDIR/pkg"`
2070  all_pack=  all_pack=
2071    DISABLED_PACKAGES=
2072  for n in $names ; do  for n in $names ; do
2073      if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then      if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
2074          has_pack="f"          has_pack="f"
# Line 748  for n in $names ; do Line 2079  for n in $names ; do
2079              fi              fi
2080          done          done
2081          if test "x$has_pack" = xf ; then          if test "x$has_pack" = xf ; then
2082              undef=`echo "ALLOW_$n" | awk '{print toupper($0)}'`              undef=`echo "ALLOW_$n" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2083              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!!!  
   
2084          fi          fi
2085      fi      fi
2086  done  done
2087  cat <<EOF >>CPP_OPTIONS.h.tmp  ENABLED_PACKAGES=
   
 C  Packages enabled by genmake:  
 EOF  
2088  for i in $PACKAGES ; do  for i in $PACKAGES ; do
2089      def=`echo "ALLOW_$i" | awk '{print toupper($0)}'`      def=`echo "ALLOW_$i" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2090      echo "#define $def" >> CPP_OPTIONS.h.tmp      ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
2091    #eh3 DEFINES="$DEFINES -D$def"
2092    
2093  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!
2094      case $i in      case $i in
2095          aim_v23)          aim_v23)
2096              echo "#define   ALLOW_AIM" >> CPP_OPTIONS.h.tmp              ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
2097                echo "Warning: ALLOW_AIM is set to enable aim_v23."
2098              ;;              ;;
2099      esac      esac
2100  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!
2101    
2102  done  done
 mv -f CPP_OPTIONS.h.tmp CPP_OPTIONS.h  
2103    
2104  echo "  Adding STANDARDDIRS"  echo "  Adding STANDARDDIRS"
2105  BUILDDIR=${BUILDDIR:-.}  BUILDDIR=${BUILDDIR:-.}
2106  STANDARDDIRS=${STANDARDDIRS:-"eesupp model"}  if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
2107  for d in $STANDARDDIRS ; do      STANDARDDIRS="eesupp model"
2108      adr="$ROOTDIR/$d/src"  fi
2109      if test ! -d $adr ; then  if test "x$STANDARDDIRS" != x ; then
2110          echo "Error:  directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""      for d in $STANDARDDIRS ; do
2111          echo "  is correct and that you correctly specified the STANDARDDIRS option"          adr="$ROOTDIR/$d/src"
2112          exit 1          if test ! -d $adr ; then
2113      else              echo "Error:  directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2114          SOURCEDIRS="$SOURCEDIRS $adr"              echo "  is correct and that you correctly specified the STANDARDDIRS option"
2115      fi              exit 1
2116      adr="$ROOTDIR/$d/inc"          else
2117      if test ! -d $adr ; then              SOURCEDIRS="$SOURCEDIRS $adr"
2118          echo "Error:  directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""          fi
2119          echo "  is correct and that you correctly specified the STANDARDDIRS option"          adr="$ROOTDIR/$d/inc"
2120          exit 1          if test ! -d $adr ; then
2121      else              echo "Error:  directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2122          INCLUDEDIRS="$INCLUDEDIRS $adr"              echo "  is correct and that you correctly specified the STANDARDDIRS option"
2123                exit 1
2124            else
2125                INCLUDEDIRS="$INCLUDEDIRS $adr"
2126            fi
2127        done
2128    fi
2129    
2130    echo "  Searching for *OPTIONS.h files in order to warn about the presence"
2131    echo "    of \"#define \"-type statements that are no longer allowed:"
2132    CPP_OPTIONS=
2133    CPP_EEOPTIONS=
2134    spaths=". $INCLUDEDIRS"
2135    names=`ls -1 "$ROOTDIR/pkg"`
2136    for i in $spaths ; do
2137        try="$i/CPP_OPTIONS.h"
2138        if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
2139            echo "    found CPP_OPTIONS=\"$try\""
2140            CPP_OPTIONS="$try"
2141            # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
2142            for n in $names ; do
2143                test_for_package_in_cpp_options $CPP_OPTIONS $n
2144            done
2145        fi
2146        try="$i/CPP_EEOPTIONS.h"
2147        if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
2148            echo "    found CPP_EEOPTIONS=\"$try\""
2149            # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
2150    #**** not yet enabled ****
2151    #        test_for_mpi_in_cpp_eeoptions $try
2152    #**** not yet enabled ****
2153            CPP_EEOPTIONS="$try"
2154      fi      fi
2155  done  done
2156    if test "x$CPP_OPTIONS" = x ; then
2157        echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
2158        exit 1
2159    fi
2160    
2161    #  Here, we build the list of files to be "run through" the adjoint
2162    #  compiler.
2163    if test -f ./ad_files ; then
2164        rm -f ./ad_files
2165    fi
2166    echo "  Creating the list of files for the adjoint compiler."
2167    for i in $SOURCEDIRS ; do
2168        list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
2169        for j in $list_files ; do
2170            cat $i/$j >> ad_files
2171        done
2172    done
2173    if test ! "x"$FS = "x.f" ; then
2174        cat ad_files | sed -e "s/\.f/.$FS/g" > ad_files_f
2175        mv -f ad_files_f ad_files
2176    fi
2177    
2178  echo  echo
2179  echo "===  Creating the Makefile  ==="  echo "===  Creating the Makefile  ==="
2180  echo "  setting INCLUDES"  echo "  setting INCLUDES"
2181  for i in $INCLUDEDIRS ; do  for i in $INCLUDEDIRS ; do
2182      if test -d $i ; then      if test ! -d $i ; then
         INCLUDES="$INCLUDES -I$i"  
     else  
2183          echo "Warning: can't find INCLUDEDIRS=\"$i\""          echo "Warning: can't find INCLUDEDIRS=\"$i\""
2184      fi      fi
2185  done  done
2186    
2187    if test ! "x$DIVA" = x ; then
2188        echo "  Creating the pseudo-MPI include directory"
2189        INCLUDES="-I./mpi_headers $INCLUDES"
2190        rm -rf ./mpi_headers
2191        mkdir -p ./mpi_headers
2192    
2193        if test "x$MPIINCLUDEDIR" = x ; then
2194            if test "x$MPIHOME" = x ; then
2195                MPIHOME='/usr'
2196            fi
2197            MPIINCLUDEDIR='$MPIHOME/include'
2198        fi
2199        
2200        if test -r $MPIINCLUDEDIR/mpif.h ; then
2201            for i in $MPI_HEADER_FILES; do
2202                cp -p $MPIINCLUDEDIR/$i ./mpi_headers
2203            done
2204    
2205            perl -i -pe 's/MPI_DISPLACEMENT_CURRENT=-1_8/MPI_DISPLACEMENT_CURRENT=-1/g' mpi_headers/mpif.h
2206        else
2207            echo " We cannot create a copy of mpif.h!"
2208            exit -1
2209        fi
2210    fi
2211    
2212  echo "  Determining the list of source and include files"  echo "  Determining the list of source and include files"
2213  rm -rf .links.tmp  rm -rf .links.tmp
2214  mkdir .links.tmp  mkdir .links.tmp
2215    touch .links.tmp/foo
2216    if test ! -r ".links.tmp/foo" ; then
2217        echo
2218        echo "ERROR : something is wrong with your directory permissions or"
2219        echo "   your user file-creation mask (\"umask\") since creating a"
2220        echo "   sub-dir, touch-ing a file within it, and then reading it is"
2221        echo "   not working.  Please try setting your umask to something"
2222        echo "   sane such as:"
2223        echo
2224        echo "      umask 0002"
2225        echo
2226        echo "   and please verify that you have the proper permissions for"
2227        echo "   creating sub-directories and then reading files created"
2228        echo "   within them."
2229        echo
2230        exit 1
2231    fi
2232    rm -f .links.tmp/foo
2233  echo "# This section creates symbolic links" > srclinks.tmp  echo "# This section creates symbolic links" > srclinks.tmp
2234  echo "" >> srclinks.tmp  echo "" >> srclinks.tmp
2235  echo -n 'SRCFILES = '    > srclist.inc  printf 'SRCFILES = '    > srclist.inc
2236  echo -n 'CSRCFILES = '   > csrclist.inc  printf 'CSRCFILES = '   > csrclist.inc
2237  echo -n 'F90SRCFILES = ' > f90srclist.inc  printf 'F90SRCFILES = ' > f90srclist.inc
2238  echo -n 'HEADERFILES = ' > hlist.inc  printf 'HEADERFILES = ' > hlist.inc
2239  alldirs=". $SOURCEDIRS $INCLUDEDIRS"  printf 'AD_FLOW_FILES = ' > ad_flow_files.inc
2240    alldirs="$SOURCEDIRS $INCLUDEDIRS ."
2241  for d in $alldirs ; do  for d in $alldirs ; do
2242      deplist=      deplist=
2243      sfiles=`( cd $d; echo *.[h,c,F] )`      sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
2244      sfiles=`( echo $sfiles; cd $d; echo *.F90 )`      sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
2245      for sf in $sfiles ; do      for sf in $sfiles ; do
2246          if test ! -r ".links.tmp/$sf" ; then          if test ! -r ".links.tmp/$sf" ; then
2247              if test -f "$d/$sf" ; then              if test -f "$d/$sf" ; then
2248                  extn=`echo $sf | awk -F '.' '{print $NF}'`                  ignore_f=f
2249                  touch .links.tmp/$sf                  case $d/$sf in
2250                  deplist="$deplist $sf"                    ./$PACKAGES_DOT_H)
2251                  case $extn in                          ignore_f=t
                     F)  
                         echo    " \\"  >> srclist.inc  
                         echo -n " $sf" >> srclist.inc  
2252                          ;;                          ;;
2253                      F90)                    ./AD_CONFIG.h)
2254                          echo    " \\"  >> f90srclist.inc                          ignore_f=t
                         echo -n " $sf" >> f90srclist.inc  
2255                          ;;                          ;;
2256                      c)                    ./FC_NAMEMANGLE.h)
2257                          echo    " \\"  >> csrclist.inc                          ignore_f=t
                         echo -n " $sf" >> csrclist.inc  
2258                          ;;                          ;;
2259                      h)                    ./BUILD_INFO.h)
2260                          echo    " \\"  >> hlist.inc                          ignore_f=t
                         echo -n " $sf" >> hlist.inc  
2261                          ;;                          ;;
2262                  esac                    ./EMBEDDED_FILES.h)
2263                            ignore_f=t
2264                            ;;
2265                      *)
2266                            #  For the local directory *ONLY*,
2267                            #  ignore all soft-links
2268                            if test "x$HAVE_TEST_L" = xt -a "x$d" = x. -a -L $sf ; then
2269                                ignore_f=t
2270                            else
2271                                touch .links.tmp/$sf
2272                                deplist="$deplist $sf"
2273                            fi
2274                            ;;
2275                    esac
2276                    if test "x$ignore_f" = xf ; then
2277                        extn=`echo $sf | $AWK -F. '{print $NF}'`
2278                        case $extn in
2279                            F)
2280                                echo    " \\"  >> srclist.inc
2281                                printf " $sf" >> srclist.inc
2282                                ;;
2283                            F90)
2284                                echo    " \\"  >> f90srclist.inc
2285                                printf " $sf" >> f90srclist.inc
2286                                ;;
2287                            c)
2288                                echo    " \\"  >> csrclist.inc
2289                                printf " $sf" >> csrclist.inc
2290                                ;;
2291                            h)
2292                                echo    " \\"  >> hlist.inc
2293                                printf " $sf" >> hlist.inc
2294                                ;;
2295                            flow)
2296                                echo    " \\"  >> ad_flow_files.inc
2297                                printf " $sf" >> ad_flow_files.inc
2298                                ;;
2299                        esac
2300                    fi
2301              fi              fi
2302          fi          fi
2303      done      done
# Line 877  echo "" >> srclist.inc Line 2313  echo "" >> srclist.inc
2313  echo "" >> csrclist.inc  echo "" >> csrclist.inc
2314  echo "" >> f90srclist.inc  echo "" >> f90srclist.inc
2315  echo "" >> hlist.inc  echo "" >> hlist.inc
2316    echo "" >> ad_flow_files.inc
2317    
2318  if test -e $MAKEFILE ; then  if test -f $MAKEFILE ; then
2319      mv -f $MAKEFILE "$MAKEFILE.bak"      mv -f $MAKEFILE "$MAKEFILE.bak"
2320  fi  fi
2321  echo "  Writing makefile: $MAKEFILE"  echo "  Writing makefile: $MAKEFILE"
# Line 887  echo "#    $MACHINE" >> $MAKEFILE Line 2324  echo "#    $MACHINE" >> $MAKEFILE
2324  echo "# This makefile was generated automatically on" >> $MAKEFILE  echo "# This makefile was generated automatically on" >> $MAKEFILE
2325  echo "#    $THISDATE" >> $MAKEFILE  echo "#    $THISDATE" >> $MAKEFILE
2326  echo "# by the command:" >> $MAKEFILE  echo "# by the command:" >> $MAKEFILE
2327  echo "#    $0 $@" >> $MAKEFILE  echo "#    $0 $G2ARGS" >> $MAKEFILE
2328  echo "# executed by:" >> $MAKEFILE  echo "# executed by:" >> $MAKEFILE
2329  echo "#    $USER@${THISHOSTNAME}:${THISCWD}" >> $MAKEFILE  echo "#    ${THISUSER}@${THISHOST}:${THISCWD}" >> $MAKEFILE
2330    
2331    EXE_AD=$EXECUTABLE"_ad"
2332    EXE_FTL=$EXECUTABLE"_ftl"
2333    EXE_SVD=$EXECUTABLE"_svd"
2334    
2335  cat >>$MAKEFILE <<EOF  cat >>$MAKEFILE <<EOF
2336    #
2337    # OPTFILE="$OPTFILE"
2338  #  #
2339  # BUILDDIR     : Directory where object files are written  # BUILDDIR     : Directory where object files are written
2340  # SOURCEDIRS   : Directories containing the source (.F) files  # SOURCEDIRS   : Directories containing the source (.F) files
# Line 918  EXEDIR      = ${EXEDIR} Line 2362  EXEDIR      = ${EXEDIR}
2362  EXECUTABLE  = \$(EXEDIR)/${EXECUTABLE}  EXECUTABLE  = \$(EXEDIR)/${EXECUTABLE}
2363  TOOLSDIR    = ${TOOLSDIR}  TOOLSDIR    = ${TOOLSDIR}
2364    
2365    #eh3  new defines for the adjoint work
2366    AUTODIFF    = ${ROOTDIR}/pkg/autodiff
2367    EXE_AD      = ${EXE_AD}
2368    EXE_FTL     = ${EXE_FTL}
2369    EXE_SVD     = ${EXE_SVD}
2370    
2371    ENABLED_PACKAGES = ${ENABLED_PACKAGES}
2372    DISABLED_PACKAGES = ${DISABLED_PACKAGES}
2373    
2374    # These files are created by Makefile
2375    SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h BUILD_INFO.h
2376  EOF  EOF
2377    
2378  #  Note: figure out some way to add Hyades JAM libraries here  if test "x$EMBED_SRC" = xt ; then
2379        echo "EMBEDDED_FILES = EMBEDDED_FILES.h" >>$MAKEFILE
2380    else
2381        echo "EMBEDDED_FILES = " >>$MAKEFILE
2382    fi
2383    
2384    #  Note: figure out some way to add Hyades JAM libraries here
2385  cat >>$MAKEFILE <<EOF  cat >>$MAKEFILE <<EOF
2386  # Unix ln (link)  # Unix ln (link)
2387  LN = ${LN}  LN = ${LN}
# Line 935  KPP = ${KPP} Line 2395  KPP = ${KPP}
2395  FC = ${FC}  FC = ${FC}
2396  # Fortran compiler  # Fortran compiler
2397  F90C = ${F90C}  F90C = ${F90C}
2398    # C compiler
2399    CC = ${CC}
2400  # Link editor  # Link editor
2401  LINK = ${LINK}  LINK = ${LINK} ${LDADD}
2402    
2403  # Defines for CPP  # Defines for CPP
2404  DEFINES = ${DEFINES}  DEFINES = ${DEFINES}
# Line 957  CFLAGS = ${CFLAGS} Line 2419  CFLAGS = ${CFLAGS}
2419  NOOPTFILES = ${NOOPTFILES}  NOOPTFILES = ${NOOPTFILES}
2420  NOOPTFLAGS = ${NOOPTFLAGS}  NOOPTFLAGS = ${NOOPTFLAGS}
2421  # Flags and libraries needed for linking  # Flags and libraries needed for linking
2422  LIBS = ${LIBS} \$(XLIBS)  LIBS = ${LIBS}
2423  # Name of the Mekfile  # Name of the Mekfile
2424  MAKEFILE=${MAKEFILE}  MAKEFILE=${MAKEFILE}
2425    
2426  EOF  EOF
2427    
2428  cat srclist.inc    >> $MAKEFILE  cat srclist.inc       >> $MAKEFILE
2429  cat csrclist.inc   >> $MAKEFILE  cat csrclist.inc      >> $MAKEFILE
2430  cat f90srclist.inc >> $MAKEFILE  cat f90srclist.inc    >> $MAKEFILE
2431  cat hlist.inc      >> $MAKEFILE  cat hlist.inc         >> $MAKEFILE
2432  echo 'F77FILES =  $(SRCFILES:.F=.f)'                                           >> $MAKEFILE  cat ad_flow_files.inc >> $MAKEFILE
2433  echo 'F90FILES =  $(F90SRCFILES:.F90=.f90)'                                    >> $MAKEFILE  echo >> $MAKEFILE
2434    echo 'F77FILES =  $(SRCFILES:.F=.'$FS')'      >> $MAKEFILE
2435    echo 'F90FILES =  $(F90SRCFILES:.F90=.'$FS90')' >> $MAKEFILE
2436  echo 'OBJFILES =  $(SRCFILES:.F=.o) $(CSRCFILES:.c=.o) $(F90SRCFILES:.F90=.o)' >> $MAKEFILE  echo 'OBJFILES =  $(SRCFILES:.F=.o) $(CSRCFILES:.c=.o) $(F90SRCFILES:.F90=.o)' >> $MAKEFILE
2437    echo >> $MAKEFILE
2438    echo '.SUFFIXES:' >> $MAKEFILE
2439    echo '.SUFFIXES: .o .'$FS' .p .F .c .'$FS90' .F90' >> $MAKEFILE
2440  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
2441    rm -f ad_flow_files.inc
2442    
2443  cat >>$MAKEFILE <<EOF  cat >>$MAKEFILE <<EOF
2444    
 .SUFFIXES:  
 .SUFFIXES: .o .f .p .F .c .F90 .f90  
   
2445  all: \$(EXECUTABLE)  all: \$(EXECUTABLE)
2446  \$(EXECUTABLE): \$(OBJFILES)  \$(EXECUTABLE): \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(OBJFILES) \$(EMBEDDED_FILES)
2447            @echo Creating \$@ ...
2448          \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)          \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
2449  depend:  depend:
2450          @make links          @make links
2451          \$(MAKEDEPEND) -o .f \$(DEFINES) \$(INCLUDES) \$(SRCFILES)          \$(MAKEDEPEND) -o .$FS \$(DEFINES) \$(INCLUDES) \$(SRCFILES)
2452          ${TOOLSDIR}/f90mkdepend >> \$(MAKEFILE)          \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
2453            -rm -f makedepend.out
2454    
2455    lib: libmitgcmuv.a
2456    
2457  links: \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES)  libmitgcmuv.a: \$(OBJFILES)
2458            ar rcv libmitgcmuv.a \$(OBJFILES)
2459    
2460    links: \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(SPECIAL_FILES)
2461    
2462  small_f: \$(F77FILES) \$(F90FILES)  small_f: \$(F77FILES) \$(F90FILES)
2463    
# Line 995  output.txt: \$(EXECUTABLE) Line 2466  output.txt: \$(EXECUTABLE)
2466          @\$(EXECUTABLE) > \$@          @\$(EXECUTABLE) > \$@
2467    
2468  clean:  clean:
2469          -rm -rf *.o *.f *.p *.f90 *.mod ${RMFILES} work.{pc,pcl}          -rm -rf *.o *.$FS *.p *.$FS90 *.mod ${RMFILES} work.{pc,pcl} *.template
2470  Clean:  Clean:
2471          @make clean          @make clean
2472          @make cleanlinks          @make cleanlinks
2473          -rm -f Makefile.bak          -rm -f \$(SPECIAL_FILES)
2474            -rm -f genmake_state genmake_*optfile genmake_warnings make.log run.log *.bak
2475  CLEAN:  CLEAN:
2476          @make Clean          @make Clean
2477          -find \$(EXEDIR) -name "*.meta" -exec rm {} \;          -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
2478          -find \$(EXEDIR) -name "*.data" -exec rm {} \;          -find \$(EXEDIR) -name "*.data" -exec rm {} \;
2479          -find \$(EXEDIR) -name "fort.*" -exec rm {} \;          -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
2480          -rm -f \$(EXECUTABLE)          -rm -f \$(EXECUTABLE) *.txt STD* *diagnostics.log datetime
2481            -rm -rf mnc_test_*
2482    
2483    #eh3 Makefile: makefile
2484  makefile:  makefile:
2485          ${0} $@          $THIS_SCRIPT $G2ARGS
2486  cleanlinks:  cleanlinks:
2487          -find . -type l -exec rm {} \;          -find . -type l -exec rm {} \;
2488    
2489  # The normal chain of rules is (  .F - .f - .o  )  # Special targets (SPECIAL_FILES) which are create by make
2490  .F.f:  ${PACKAGES_DOT_H}:
2491            @echo Creating \$@ ...
2492            @$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) > \$@
2493    AD_CONFIG.h:
2494            @echo Creating \$@ ...
2495            @$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 > \$@
2496    FC_NAMEMANGLE.h:
2497            @echo Creating \$@ ...
2498            echo "$FC_NAMEMANGLE" > \$@
2499    
2500    BUILD_INFO.h:
2501            @echo Creating \$@ ...
2502    EOF
2503    
2504    test ! "x$THISVER" = x  && echo "       -echo \"#define THISVER '$THISVER'\" > \$@"   >> $MAKEFILE
2505    test ! "x$THISUSER" = x && echo "       -echo \"#define THISUSER '$THISUSER'\" >> \$@" >> $MAKEFILE
2506    test ! "x$THISDATE" = x && echo "       -echo \"#define THISDATE '$THISDATE'\" >> \$@" >> $MAKEFILE
2507    test ! "x$THISHOST" = x && echo "       -echo \"#define THISHOST '$THISHOST'\" >> \$@" >> $MAKEFILE
2508    
2509    if test "x$EMBED_SRC" = xt ; then
2510        cat >>$MAKEFILE <<EOF
2511    
2512    decode_files.o : EMBEDDED_FILES.h
2513    
2514    ##  \$(F77FILES)
2515    all_fF.tar.gz : \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(F77FILES) Makefile
2516            @echo Creating \$@ ...
2517            -tar -hcf all_fF.tar \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(F77FILES) Makefile
2518            -rm -f all_fF.tar.gz
2519            -gzip all_fF.tar
2520    
2521    EMBEDDED_FILES.h : all_fF.tar.gz
2522            @echo Creating \$@ ...
2523            -\${ROOTDIR}/tools/embed_encode/encode_files EMBEDDED_FILES.h all_fF.tar.gz
2524    
2525    EOF
2526    fi
2527    
2528    cat >>$MAKEFILE <<EOF
2529    
2530    # The normal chain of rules is (  .F - .$FS - .o  )
2531    
2532    ## This nullifies any default implicit rules concerning these two file types:
2533    ## %.o : %.F
2534    
2535    .F.$FS:
2536          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2537  .f.o:  .$FS.o:
2538          \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<          \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
2539  .F90.f90:  .F90.$FS90:
2540          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2541  .f90.o:  .$FS90.o:
2542          \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<          \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
2543  .c.o:  .c.o:
2544          \$(CC) \$(CFLAGS) -c \$<          \$(CC) \$(CFLAGS) \$(DEFINES) \$(INCLUDES) -c \$<
2545    
2546  # Special exceptions that use the ( .F - .p - .f - .o ) rule-chain  # Special exceptions that use the ( .F - .p - .$FS - .o ) rule-chain
2547  .F.p:  .F.p:
2548          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2549  .p.f:  .p.$FS:
2550          \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<          \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
2551    
2552    #=========================================
2553    #===  Automatic Differentiation Rules  ===
2554    
2555    TAMC           = ${TAMC}
2556    TAF            = ${TAF}
2557    
2558    TAF_EXTRA      = ${TAF_EXTRA}
2559    TAMC_EXTRA     = ${TAMC_EXTRA}
2560    
2561    EOF
2562    
2563    ad_vars="AD_TAMC_FLAGS AD_TAF_FLAGS"
2564    ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF_FLAGS"
2565    ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
2566    for i in $ad_vars ; do
2567        name=$i
2568        t1="t2=\$"`echo "$i"`
2569        eval $t1
2570        printf "%-20s = " $name >> $MAKEFILE
2571        echo "$t2" | sed -e 's| \+| |g' >> $MAKEFILE
2572    done
2573    
2574    echo "  Add the source list for AD code generation"
2575    echo >> $MAKEFILE
2576    printf "AD_FILES = " >> $MAKEFILE
2577    AD_FILES=`cat ad_files`
2578    for i in $AD_FILES ; do
2579        echo    " \\" >> $MAKEFILE
2580        printf " $i" >> $MAKEFILE
2581    done
2582    echo >> $MAKEFILE
2583    rm -f ad_files
2584    
2585    cat >>$MAKEFILE <<EOF
2586    
2587    # ... AD ...
2588    adall: ad_taf
2589    adtaf: ad_taf_output.$FS
2590    adtamc: ad_tamc_output.$FS
2591    
2592    ad_input_code.$FS: \$(AD_FILES) \$(HEADERFILES)
2593            @$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
2594            cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
2595            -rm -f ad_config.template
2596            @make \$(F77FILES)
2597            @make \$(AD_FLOW_FILES)
2598            cat \$(AD_FLOW_FILES) \$(AD_FILES) > ad_input_code.$FS
2599    
2600    ad_taf_output.$FS: ad_input_code.$FS
2601            \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2602            cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2603    
2604    adtafonly:
2605            \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2606            cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2607    
2608    ad_taf: ad_taf_output.o \$(OBJFILES)
2609            \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
2610    
2611    ad_tamc_output.$FS: ad_input_code.$FS
2612            \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.$FS
2613            cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.$FS
2614    
2615    ad_tamc: ad_tamc_output.o \$(OBJFILES)
2616            \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
2617    
2618    adonlyfwd:
2619            patch < \$(TOOLSDIR)/ad_taf_output.f.onlyfwd.diff
2620    
2621    adtrick:
2622            patch < \$(TOOLSDIR)/ad_taf_output.f.adtrick.diff
2623    
2624    # ... FTL ...
2625    ftlall: ftl_taf
2626    ftltaf: ftl_taf_output.$FS
2627    ftltamc: ftl_tamc_output.$FS
2628    
2629    ftl_input_code.$FS: \$(AD_FILES) \$(HEADERFILES)
2630            @$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
2631            cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
2632            -rm -f ftl_config.template
2633            @make \$(F77FILES)
2634            @make \$(AD_FLOW_FILES)
2635            cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.$FS
2636    
2637    ftl_taf_output.$FS: ftl_input_code.$FS
2638            \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
2639            cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
2640    
2641    ftltafonly:
2642            \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
2643            cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
2644    
2645    ftl_taf: ftl_taf_output.o \$(OBJFILES)
2646            \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
2647    
2648    ftl_tamc_output.$FS: ftl_input_code.$FS
2649            \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.$FS
2650            cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.$FS
2651    
2652    ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
2653            \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
2654    
2655    
2656    # ... SVD ...
2657    svdtaf: ad_taf_output.$FS ftl_taf_output.$FS
2658            @echo "--->>> Only ran TAF to generate SVD code!    <<<---"
2659            @echo "--->>> Do make svdall afterwards to compile. <<<---"
2660    svdall: svd_touch svd_taf
2661    
2662    svd_taf: \$(OBJFILES)
2663            \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
2664    
2665            @echo "--->>> Only COMPILE svd code! <<<---"
2666            @echo "--->>> Assumes you previously <<<---"
2667            @echo "--->>> did make svdtaf        <<<---"
2668    
2669    svd_touch:
2670            @echo "--->>> Only COMPILE svd code! <<<---"
2671            @echo "--->>> Assumes you previously <<<---"
2672            @echo "--->>> did make svdtaf        <<<---"
2673            touch ad_taf_output.$FS ftl_taf_output.$FS
2674            \$(FC) \$(FFLAGS) \$(FOPTIM) -c ad_taf_output.$FS
2675            \$(FC) \$(FFLAGS) \$(FOPTIM) -c ftl_taf_output.$FS
2676            @$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
2677            cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
2678            -rm -f ftl_config.template
2679    
2680    #=========================================
2681    
2682  EOF  EOF
2683    
2684  if test "x$EXEHOOK" != x ; then  if test "x$EXEHOOK" != x ; then
# Line 1043  for i in $KPPFILES ; do Line 2692  for i in $KPPFILES ; 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.f: $base.p" >> $MAKEFILE      echo "$base.$FS: $base.p" >> $MAKEFILE
2696  done  done
2697    
2698  echo "  Making list of NOOPTFILES"  echo "  Making list of NOOPTFILES"
# Line 1053  for i in $NOOPTFILES ; do Line 2702  for i in $NOOPTFILES ; do
2702      if test "x$RETVAL" != x0 ; then      if test "x$RETVAL" != x0 ; then
2703          echo "Error: unable to add file \"$i\" to the exceptions list"          echo "Error: unable to add file \"$i\" to the exceptions list"
2704      fi      fi
2705      echo "$base.o: $base.f" >> $MAKEFILE      echo "$base.o: $base.$FS" >> $MAKEFILE
2706      printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE      printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE
2707  done  done
2708    
# Line 1066  printf "\n\n# DO NOT DELETE\n" >> $MAKEF Line 2715  printf "\n\n# DO NOT DELETE\n" >> $MAKEF
2715    
2716  printf "\n===  Done  ===\n"  printf "\n===  Done  ===\n"
2717    
2718    # Create special header files
2719    $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"
2720    if test ! -f $PACKAGES_DOT_H ; then
2721        mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
2722    else
2723        cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H > /dev/null 2>&1
2724        RETVAL=$?
2725        if test "x$RETVAL" = x0 ; then
2726            rm -f $PACKAGES_DOT_H".tmp"
2727        else
2728            mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"
2729            mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
2730        fi
2731    fi
2732    if test ! -f AD_CONFIG.h ; then
2733        $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
2734    fi
2735    
2736    
2737  #  Write the "state" for future records  #  Write the "state" for future records
2738  if test "x$DUMPSTATE" != xf ; then  if test "x$DUMPSTATE" != xf ; then
2739      echo -n "" > gm_state      printf "" > genmake_state
2740      for i in $gm_state ; do      for i in $gm_state ; do
2741          t1="t2=\$$i"          t1="t2=\$$i"
2742          eval $t1          eval $t1
2743          echo "$i='$t2'" >> gm_state          echo "$i='$t2'" >> genmake_state
2744      done      done
2745  fi  fi

Legend:
Removed from v.1.8  
changed lines
  Added in v.1.151

  ViewVC Help
Powered by ViewVC 1.1.22