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

Legend:
Removed from v.1.20  
changed lines
  Added in v.1.157

  ViewVC Help
Powered by ViewVC 1.1.22