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

Legend:
Removed from v.1.11.2.11  
changed lines
  Added in v.1.147

  ViewVC Help
Powered by ViewVC 1.1.22