/[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.36 by edhill, Fri Nov 14 02:48:18 2003 UTC revision 1.152 by jmc, Thu Jun 15 17:11:37 2006 UTC
# Line 1  Line 1 
1  #!/bin/sh  #! /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      tmp3=`echo $tmp2 | sed -e 's/power macintosh/ppc/'`      tmp3=`echo $tmp2 | sed -e 's/power macintosh/ppc/'`
300      PLATFORM=`echo $tmp3 | sed -e 's/i[3-6]86/ia32/' | sed -e 's/athlon/ia32/'`      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 104  find_possible_configs()  { Line 321  find_possible_configs()  {
321          CPP="cpp -traditional -P"          CPP="cpp -traditional -P"
322      fi      fi
323    
324      # makedepend is not always available      look_for_makedepend
325      if test "x${MAKEDEPEND}" = x ; then  
326        which makedepend >& /dev/null      #================================================================
327        RETVAL=$?      #  look for possible C compilers
328        if test "x${RETVAL}" = x1 ; then      tmp="$MITGCM_CC $CC gcc c89 cc c99 mpicc"
329           echo "    makedepend was not found. Using xmakedpend instead."      p_CC=
330           MAKEDEPEND='$(TOOLSDIR)/xmakedepend'      for c in $tmp ; do
331        fi          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      fi
364    
365      # look for possible fortran compilers      #================================================================
366      tmp="$MITGCM_FC $FC efc g77 f77 pgf77 pgf95 ifc f90 f95 mpif77 mpf77 mpxlf95"      #  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 140  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 219  get_pdepend_list()  { Line 485  get_pdepend_list()  {
485      . ./.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  #  Build a CPP macro to automate calling C routines from FORTRAN  #  Build a CPP macro to automate calling C routines from FORTRAN
639  get_fortran_c_namemangling()  {  get_fortran_c_namemangling()  {
640    
641        #echo "FC_NAMEMANGLE = \"$FC_NAMEMANGLE\""
642        if test ! "x$FC_NAMEMANGLE" = x ; then
643            return 0
644        fi
645    
646      default_nm="#define FC_NAMEMANGLE(X) X ## _"      default_nm="#define FC_NAMEMANGLE(X) X ## _"
647            
648      cat > genmake_test.c <<EOF      cat > genmake_test.c <<EOF
649  void tcall( char * string ) { tsub( string ); }  void tcall( char * string ) { tsub( string ); }
650  EOF  EOF
651      $MAKE genmake_test.o > genmake_test.log 2>&1      $MAKE genmake_test.o >> genmake_warnings 2>&1
652      RETVAL=$?      RETVAL=$?
653      if test "x$RETVAL" != x0 ; then      if test "x$RETVAL" != x0 ; then
         cat genmake_test.log >> genmake_errors  
654          FC_NAMEMANGLE=$default_nm          FC_NAMEMANGLE=$default_nm
655          echo          cat <<EOF>> genmake_errors
656          echo "WARNING: C test compile fails -- please see \"genmake_errors\""  
657          echo "WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'"  WARNING: C test compile fails
658          echo "WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here."  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          return 1
662      fi      fi
663      c_tcall=`nm genmake_test.o | grep tcall | cut -d ' ' -f 3`      c_tcall=`nm genmake_test.o 2>/dev/null | grep 'T ' | grep tcall | cut -d ' ' -f 3`
664      RETVAL=$?      RETVAL=$?
665      if test "x$RETVAL" != x0 ; then      if test "x$RETVAL" != x0 ; then
666          FC_NAMEMANGLE=$default_nm          FC_NAMEMANGLE=$default_nm
667          echo          cat <<EOF>> genmake_warnings
668          echo "WARNING: The \"nm\" command failed."  
669          echo "WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'"  WARNING: The "nm" command failed.
670          echo "WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here."  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          return 1
674      fi      fi
675      cat > genmake_tcomp.f <<EOF      cat > genmake_tcomp.$FS <<EOF
676        subroutine tcall( string )        subroutine tcall( string )
677        character*(*) string        character*(*) string
678        call tsub( string )        call tsub( string )
679        end        end
680  EOF  EOF
681      $FC $FFLAGS $DEFINES -c genmake_tcomp.f > genmake_tcomp.log 2>&1      $FC $FFLAGS -c genmake_tcomp.$FS >> genmake_warnings 2>&1
682      RETVAL=$?      RETVAL=$?
683      if test "x$RETVAL" != x0 ; then      if test "x$RETVAL" != x0 ; then
         cat genmake_tcomp.log >> genmake_errors  
684          FC_NAMEMANGLE=$default_nm          FC_NAMEMANGLE=$default_nm
685          echo          cat <<EOF>> genmake_warnings
686          echo "WARNING: FORTRAN test compile fails -- please see \"genmake_errors\""  
687          echo "WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'"  WARNING: FORTRAN test compile fails -- please see "genmake_errors"
688          echo "WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here."  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          return 1
692      fi      fi
693      f_tcall=`nm genmake_tcomp.o | grep tcall | cut -d ' ' -f 3`      f_tcall=`nm genmake_tcomp.o 2>/dev/null | grep 'T ' | grep tcall | cut -d ' ' -f 3`
694      RETVAL=$?      RETVAL=$?
695      if test "x$RETVAL" != x0 ; then      if test "x$RETVAL" != x0 ; then
696          FC_NAMEMANGLE=$default_nm          FC_NAMEMANGLE=$default_nm
697          echo          cat <<EOF>> genmake_warnings
698          echo "WARNING: The \"nm\" command failed."  
699          echo "WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'"  WARNING: The "nm" command failed.
700          echo "WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here."  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          return 1
704      fi      fi
705    
# Line 353  EOF Line 726  EOF
726      rm -f genmake_tcomp.* genmake_test.*      rm -f genmake_tcomp.* genmake_test.*
727  }  }
728    
729    
730    check_HAVE_CLOC()  {
731        get_fortran_c_namemangling
732        cat <<EOF > genmake_tc_1.c
733    $FC_NAMEMANGLE
734    #include <stdio.h>
735    #include <stdlib.h>
736    #include <unistd.h>
737    #include <assert.h>
738    #include <sys/time.h>
739    void FC_NAMEMANGLE(cloc) ( double *curtim )
740    {
741     struct timeval tv1;
742     gettimeofday(&tv1 , (void *)NULL );
743     *curtim =  (double)((tv1.tv_usec)+(tv1.tv_sec)*1.E6);
744     *curtim = *curtim/1.E6;
745    }
746    EOF
747        make genmake_tc_1.o >> genmake_warnings 2>&1
748        RET_C=$?
749        cat <<EOF > genmake_tc_2.$FS
750          program hello
751          REAL*8 wtime
752          external cloc
753          call cloc(wtime)
754          print *," HELLO WORLD", wtime
755          end
756    EOF
757        $FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o >> genmake_warnings 2>&1
758        RET_F=$?
759        test -x ./genmake_tc  &&  ./genmake_tc >> genmake_warnings 2>&1
760        RETVAL=$?
761        if test "x$RETVAL" = x0 ; then
762            HAVE_CLOC=t
763            DEFINES="$DEFINES -DHAVE_CLOC"
764        fi
765        rm -f genmake_tc*
766    }
767    
768    
769    check_HAVE_SIGREG()  {
770        if test ! "x$HAVE_SIGREG" = x ; then
771            return
772        fi
773        get_fortran_c_namemangling
774        cat <<EOF > genmake_tc_1.c
775    $FC_NAMEMANGLE
776    #include <stdlib.h>
777    #include <stdio.h>
778    #include <signal.h>
779    #include <errno.h>
780    #include <ucontext.h>
781    
782    int * ip;
783    
784    static void killhandler(
785        unsigned int sn, siginfo_t  si, struct ucontext *sc )
786    {
787        *ip = *ip + 1;
788        return;
789    }
790    
791    void FC_NAMEMANGLE(sigreg) (int * aip)
792    {
793        struct sigaction s;
794        ip = aip;
795        s.sa_flags = SA_SIGINFO;
796        s.sa_sigaction = (void *)killhandler;
797        if(sigaction (SIGTERM,&s,(struct sigaction *)NULL)) {
798            printf("Sigaction returned error = %d\n", errno);
799            exit(0);
800        }
801        return;
802    }
803    EOF
804        make genmake_tc_1.o >> genmake_warnings 2>&1
805        RET_C=$?
806        cat <<EOF > genmake_tc_2.$FS
807          program hello
808          integer anint
809          common /iv/ anint
810          external sigreg
811          call sigreg(anint)
812          end
813    EOF
814        echo >> genmake_warnings
815        echo "running: check_HAVE_SIGREG()" >> genmake_warnings
816        cat genmake_tc_2.$FS >> genmake_warnings
817        COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
818        echo $COMM >> genmake_warnings
819        $COMM >> genmake_warnings 2>&1
820        RETVAL=$?
821        if test "x$RETVAL" = x0 ; then
822            HAVE_SIGREG=t
823            DEFINES="$DEFINES -DHAVE_SIGREG"
824        fi
825        rm -f genmake_tc*
826    }
827    
828    
829    check_HAVE_SETRLSTK()  {
830        if test "x$HAVE_SETRLSTK" = xt ; then
831            DEFINES="$DEFINES -DHAVE_SETRLSTK"
832            return
833        fi  
834        if test ! "x$HAVE_SETRLSTK" = x ; then
835            return
836        fi
837        get_fortran_c_namemangling
838        cat <<EOF > genmake_tc_1.c
839    $FC_NAMEMANGLE
840    #include <sys/time.h>
841    #include <sys/resource.h>
842    #include <unistd.h>
843    void FC_NAMEMANGLE(setrlstk) ()
844    {
845        struct rlimit rls;
846        rls.rlim_cur = RLIM_INFINITY;
847        rls.rlim_max = RLIM_INFINITY;
848        setrlimit(RLIMIT_STACK, &rls);
849        return;
850    }
851    EOF
852        make genmake_tc_1.o >> genmake_warnings 2>&1
853        RET_C=$?
854        cat <<EOF > genmake_tc_2.$FS
855          program hello
856          external setrlstk
857          call setrlstk()
858          end
859    EOF
860        echo >> genmake_warnings
861        echo "running: check_HAVE_SETRLSTK()" >> genmake_warnings
862        cat genmake_tc_2.$FS >> genmake_warnings
863        COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
864        echo $COMM >> genmake_warnings
865        $COMM >> genmake_warnings 2>&1
866        RETVAL=$?
867        if test "x$RETVAL" = x0 ; then
868            HAVE_SETRLSTK=t
869            DEFINES="$DEFINES -DHAVE_SETRLSTK"
870        fi
871        rm -f genmake_tc*
872    }
873    
874    
875    check_HAVE_STAT()  {
876        get_fortran_c_namemangling
877        cat <<EOF > genmake_tc_1.c
878    $FC_NAMEMANGLE
879    #include <stdio.h>
880    #include <stdlib.h>
881    #include <unistd.h>
882    #include <sys/stat.h>
883    #include <sys/types.h>
884    void FC_NAMEMANGLE(tfsize) ( int *nbyte )
885    {
886        char name[512];
887        struct stat astat;
888    
889        name[0] = 'a'; name[1] = '\0';
890        if (! stat(name, &astat))
891            *nbyte = (int)(astat.st_size);
892        else
893            *nbyte = -1;
894    }
895    EOF
896        make genmake_tc_1.o >> genmake_tc.log 2>&1
897        RET_C=$?
898        cat <<EOF > genmake_tc_2.$FS
899          program hello
900          integer nbyte
901          call tfsize(nbyte)
902          print *," HELLO WORLD", nbyte
903          end
904    EOF
905        echo >> genmake_warnings
906        echo "running: check_HAVE_STAT()" >> genmake_warnings
907        cat genmake_tc_2.$FS >> genmake_warnings
908        COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
909        echo $COMM >> genmake_warnings
910        $COMM >> genmake_tc.log 2>&1
911        RETVAL=$?
912        if test "x$RETVAL" = x0 ; then
913            HAVE_STAT=t
914            DEFINES="$DEFINES -DHAVE_STAT"
915        fi
916        rm -f genmake_tc*
917    }
918    
919    
920    check_netcdf_libs()  {
921        if test ! "x$SKIP_NETCDF_CHECK" = x ; then
922            return
923        fi
924        echo >> genmake_warnings
925        echo "running: check_netcdf_libs()" >> genmake_warnings
926        cat <<EOF > genmake_tnc.F
927          program fgennc
928    #include "netcdf.inc"
929    EOF
930        if test ! "x$MPI" = x ; then
931            echo '#include "mpif.h"' >> genmake_tnc.F
932        fi
933        cat <<EOF >> genmake_tnc.F
934          integer iret, ncid, xid
935          iret = nf_create('genmake_tnc.nc', NF_CLOBBER, ncid)
936          IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
937          iret = nf_def_dim(ncid, 'X', 11, xid)
938          IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
939          iret = nf_close(ncid)
940          IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
941          end
942    EOF
943        echo "===  genmake_tnc.F  ===" > genmake_tnc.log
944        cat genmake_tnc.F >> genmake_tnc.log
945        echo "===  genmake_tnc.F  ===" >> genmake_tnc.log
946        RET_CPP=f
947        COMM="cat genmake_tnc.F | $CPP $DEFINES $INCLUDES"
948        echo "$COMM" >> genmake_tnc.log
949        $COMM > genmake_tnc.$FS 2>/dev/null  &&  RET_CPP=t
950        if test "x$RET_CPP" = xf ; then
951            echo "  WARNING: CPP failed to pre-process the netcdf test." \
952                >> genmake_tnc.log
953            echo "    Please check that \$INCLUDES is properly set." \
954                >> genmake_tnc.log
955        fi
956        echo "$FC $FFLAGS $FOPTIM -c genmake_tnc.$FS  \ " >> genmake_tnc.log
957        echo "  &&  $LINK -o genmake_tnc.o $LIBS" >> genmake_tnc.log
958        $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1  \
959            &&  $LINK -o genmake_tnc genmake_tnc.o $LIBS >> genmake_tnc.log 2>&1
960        RET_COMPILE=$?
961        cat genmake_tnc.log >> genmake_warnings
962    
963        #EH3  Remove test program execution for machines that either disallow
964        #EH3  execution or cannot support it (eg. cross-compilers)
965        #EH3
966        #EH3 test -x ./genmake_tnc  &&  ./genmake_tnc >> genmake_tnc.log 2>&1
967        #EH3 RETVAL=$?
968        #EH3 if test "x$RET_COMPILE" = x0 -a "x$RETVAL" = x0 ; then
969    
970        if test "x$RET_COMPILE" = x0 ; then
971            HAVE_NETCDF=t
972        else
973            # try again with "-lnetcdf" added to the libs
974            echo "try again with added '-lnetcdf'" > genmake_tnc.log
975            echo "cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS \ " >> genmake_tnc.log
976            echo " &&  $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS \ " >> genmake_tnc.log
977            echo " &&  $LINK -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf" >> genmake_tnc.log
978            cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS 2>/dev/null  \
979                &&  $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1  \
980                &&  $LINK -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf >> genmake_tnc.log 2>&1
981            RET_COMPILE=$?
982            cat genmake_tnc.log >> genmake_warnings
983            if test "x$RET_COMPILE" = x0 ; then
984                LIBS="$LIBS -lnetcdf"
985                HAVE_NETCDF=t
986            fi
987        fi
988        rm -f genmake_tnc*
989    }
990    
991    
992    
993    ###############################################################################
994    #   Sequential part of script starts here
995    ###############################################################################
996    
997  #  Set defaults here  #  Set defaults here
998  COMMANDL="$0 $@"  COMMANDL="$0 $@"
999    
# Line 360  PLATFORM= Line 1001  PLATFORM=
1001  LN=  LN=
1002  S64=  S64=
1003  KPP=  KPP=
1004  FC=  #FC=
1005    #CC=gcc
1006    #CPP=
1007  LINK=  LINK=
 # DEFINES="-DWORDLENGTH=4"  
1008  DEFINES=  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  # DEFINES checked by test compilation or command-line
1042  HAVE_SYSTEM=  HAVE_SYSTEM=
1043  HAVE_FDATE=  HAVE_FDATE=
1044  FC_NAMEMANGLE=  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 410  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 426  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"  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_s10="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"
# Line 444  gm_s12="TAF_EXTRA TAMC_EXTRA" Line 1111  gm_s12="TAF_EXTRA TAMC_EXTRA"
1111  gm_state="COMMANDL $gm_s1 $gm_s2 $gm_s3 $gm_s4 $gm_s5 $gm_s6 $gm_s7"  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"  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
# Line 454  for i in . $MODS ; do Line 1130  for i in . $MODS ; do
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      . $gm_local      . $gm_local
1137      # echo "DISABLE=$DISABLE"      # echo "DISABLE=$DISABLE"
# Line 464  else Line 1140  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 476  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 499  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 519  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 554  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 596  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 611  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 623  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 ../eesup -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 648  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 664  if test "x$OPTFILE" != xNONE ; then Line 1401  if test "x$OPTFILE" != xNONE ; then
1401          . "$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 691  if test "x${AD_OPTFILE}" != xNONE ; then Line 1428  if test "x${AD_OPTFILE}" != xNONE ; then
1428          . "$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 704  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, S64, and LN are defined.  If not,  #====================================================================
1445  #  complain 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 716  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 738  EOF Line 1504  EOF
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
     MAKEDEPEND=makedepend  
 fi  
1508  if test "x$LN" = x ; then  if test "x$LN" = x ; then
1509      LN="ln -s"      LN="ln -s"
1510  fi  fi
# Line 756  Error: The command "ln -s" failed -- ple Line 1520  Error: The command "ln -s" failed -- ple
1520  EOF  EOF
1521      exit 1      exit 1
1522  fi  fi
1523    test -L genmake_tlink > /dev/null 2>&1
1524    RETVAL=$?
1525    if test "x$RETVAL" = x0 ; then
1526        HAVE_TEST_L=t
1527    fi
1528  rm -f genmake_test_ln genmake_tlink  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"  printf "\n===  Checking system libraries  ===\n"
1617  echo -n "  Do we have the system() command using $FC...  "  printf "  Do we have the system() command using $FC...  "
1618  cat > genmake_tcomp.f <<EOF  cat > genmake_tcomp.$FS <<EOF
1619        program hello        program hello
1620        call system('echo hi')        call system('echo hi')
1621        end        end
1622  EOF  EOF
1623  $FC $FFLAGS $DEFINES -o genmake_tcomp genmake_tcomp.f > genmake_tcomp.log 2>&1  $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1624  RETVAL=$?  RETVAL=$?
1625  if test "x$RETVAL" = x0 ; then  if test "x$RETVAL" = x0 ; then
1626      HAVE_SYSTEM=t      HAVE_SYSTEM=t
# Line 777  else Line 1632  else
1632  fi  fi
1633  rm -f genmake_tcomp*  rm -f genmake_tcomp*
1634    
1635  echo -n "  Do we have the fdate() command using $FC...  "  printf "  Do we have the fdate() command using $FC...  "
1636  cat > genmake_tcomp.f <<EOF  cat > genmake_tcomp.$FS <<EOF
1637        program hello        program hello
1638        CHARACTER(128) string        CHARACTER*(128) string
1639        string = ' '        string = ' '
1640        call fdate( string )        call fdate( string )
1641        print *, string        print *, string
1642        end        end
1643  EOF  EOF
1644  $FC $FFLAGS $DEFINES -o genmake_tcomp genmake_tcomp.f > genmake_tcomp.log 2>&1  $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1645  RETVAL=$?  RETVAL=$?
1646  if test "x$RETVAL" = x0 ; then  if test "x$RETVAL" = x0 ; then
1647      HAVE_FDATE=t      HAVE_FDATE=t
# Line 798  else Line 1653  else
1653  fi  fi
1654  rm -f genmake_tcomp*  rm -f genmake_tcomp*
1655    
1656  echo "  The name mangling convention for $FC is...  "  printf "  Do we have the etime() command using $FC...  "
1657  #FC_NAMEMANGLE="#define FC_NAMEMANGLE(X) X ## _"  cat > genmake_tcomp.$FS <<EOF
1658  if test "x$FC_NAMEMANGLE" = x ; then        program hello
1659      get_fortran_c_namemangling        REAL*4 ACTUAL, TARRAY(2)
1660  fi        EXTERNAL ETIME
1661  echo "    '$FC_NAMEMANGLE'"        REAL*4 ETIME
1662  echo "$FC_NAMEMANGLE" > FC_NAMEMANGLE.h.template        actual = etime( tarray )
1663  cmp FC_NAMEMANGLE.h FC_NAMEMANGLE.h.template > /dev/null 2>&1        print *, tarray
1664          end
1665    EOF
1666    $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1667  RETVAL=$?  RETVAL=$?
1668  if test "x$RETVAL" != x0 ; then  if test "x$RETVAL" = x0 ; then
1669      mv -f FC_NAMEMANGLE.h.template FC_NAMEMANGLE.h      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  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 850  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 870  if test -r $ROOTDIR"/eesupp/src/Makefile Line 1813  if test -r $ROOTDIR"/eesupp/src/Makefile
1813          rm -f make_eesupp.errors          rm -f make_eesupp.errors
1814      else      else
1815          echo "Error: problem encountered while building source files in eesupp:"          echo "Error: problem encountered while building source files in eesupp:"
1816          cat make_eesupp.errors          cat make_eesupp.errors 1>&2
1817          exit 1          exit 1
1818      fi      fi
1819  fi  fi
1820    
1821    #same for exch2
1822    if test -r $ROOTDIR"/pkg/exch2/Makefile" ; then
1823        echo "  Making source files in exch2 from  templates"
1824        ( cd $ROOTDIR"/pkg/exch2/" && $MAKE ) > make_exch2.errors 2>&1
1825        RETVAL=$?
1826        if test "x${RETVAL}" = x0 ; then
1827            rm -f make_exch2.errors
1828        else
1829            echo "Error: problem encountered while building source files in exch2:"
1830            cat make_exch2.errors 1>&2
1831            exit 1
1832        fi
1833    fi
1834    
1835  printf "\n===  Determining package settings  ===\n"  printf "\n===  Determining package settings  ===\n"
1836  if  test "x${PDEPEND}" = x ; then  if  test "x${PDEPEND}" = x ; then
1837      tmp=$ROOTDIR"/pkg/pkg_depend"      tmp=$ROOTDIR"/pkg/pkg_depend"
# Line 907  rm -f ./.pd_tmp Line 1864  rm -f ./.pd_tmp
1864  #  Search for default packages.  Note that a "$ROOTDIR/pkg/pkg_groups"  #  Search for default packages.  Note that a "$ROOTDIR/pkg/pkg_groups"
1865  #  file should eventually be added so that, for convenience, one can  #  file should eventually be added so that, for convenience, one can
1866  #  specify groups of packages using names like "ocean" and "atmosphere".  #  specify groups of packages using names like "ocean" and "atmosphere".
1867  echo  -n "  checking default package list:  "  echo "  checking default package list:  "
1868  if test "x${PDEFAULT}" = x ; then  if test "x${PDEFAULT}" = x ; then
1869      for i in "." $MODS ; do      for i in "." $MODS ; do
1870          if test -r $i"/packages.conf" ; then          if test -r $i"/packages.conf" ; then
# Line 920  if test "x${PDEFAULT}" = x ; then Line 1877  if test "x${PDEFAULT}" = x ; then
1877      PDEFAULT="$ROOTDIR/pkg/pkg_default"      PDEFAULT="$ROOTDIR/pkg/pkg_default"
1878  fi  fi
1879  if test "x${PDEFAULT}" = xNONE ; then  if test "x${PDEFAULT}" = xNONE ; then
1880      echo "default packages file disabled"      echo "    default packages file disabled"
1881  else  else
1882      if test ! -r $PDEFAULT ; then      if test ! -r $PDEFAULT ; then
         echo ""  
1883          echo "Warning:  can't read default packages from PDEFAULT=\"$PDEFAULT\""          echo "Warning:  can't read default packages from PDEFAULT=\"$PDEFAULT\""
1884      else      else
1885          echo "  using PDEFAULT=\"$PDEFAULT\""          echo "    using PDEFAULT=\"$PDEFAULT\""
1886          #  Strip the comments and add all the names          #  Strip the comments and add all the names
1887          def=`cat $PDEFAULT | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`          def=`cat $PDEFAULT | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
1888          RETVAL=$?          RETVAL=$?
1889          if test "x${RETVAL}" != x0 ; then          if test "x${RETVAL}" != x0 ; then
1890              echo -n "Error: can't parse default package list "              printf "Error: can't parse default package list "
1891              echo "-- please check PDEFAULT=\"$PDEFAULT\""              echo "-- please check PDEFAULT=\"$PDEFAULT\""
1892              exit 1              exit 1
1893          fi          fi
# Line 939  else Line 1895  else
1895              PACKAGES="$PACKAGES $i"              PACKAGES="$PACKAGES $i"
1896          done          done
1897          echo "    before group expansion packages are: $PACKAGES"          echo "    before group expansion packages are: $PACKAGES"
1898          expand_pkg_groups          RET=1
1899            while test $RET = 1 ; do expand_pkg_groups; RET=$?; done
1900          echo "    after group expansion packages are:  $PACKAGES"          echo "    after group expansion packages are:  $PACKAGES"
1901      fi      fi
1902  fi  fi
1903    
1904  echo "  applying DISABLE settings"  echo "  applying DISABLE settings"
1905    for i in $PACKAGES ; do
1906        echo $i >> ./.tmp_pack
1907    done
1908    for i in `grep  "-" ./.tmp_pack` ; do
1909        j=`echo $i | sed 's/[-]//'`
1910        DISABLE="$DISABLE $j"
1911    done
1912  pack=  pack=
1913  for p in $PACKAGES ; do  for p in $PACKAGES ; do
1914      addit="t"      addit="t"
# Line 961  PACKAGES="$pack" Line 1925  PACKAGES="$pack"
1925  echo "  applying ENABLE settings"  echo "  applying ENABLE settings"
1926  echo "" > ./.tmp_pack  echo "" > ./.tmp_pack
1927  PACKAGES="$PACKAGES $ENABLE"  PACKAGES="$PACKAGES $ENABLE"
1928    # Test if each explicitly referenced package exists
1929  for i in $PACKAGES ; do  for i in $PACKAGES ; do
1930      if test ! -d "$ROOTDIR/pkg/$i" ; then      j=`echo $i | sed 's/[-+]//'`
1931        if test ! -d "$ROOTDIR/pkg/$j" ; then
1932          echo "Error: can't find package $i at \"$ROOTDIR/pkg/$i\""          echo "Error: can't find package $i at \"$ROOTDIR/pkg/$i\""
1933          exit 1          exit 1
1934      fi      fi
1935      echo $i >> ./.tmp_pack      echo $i >> ./.tmp_pack
1936  done  done
 pack=`cat ./.tmp_pack | sort | uniq`  
 rm -f ./.tmp_pack  
1937  PACKAGES=  PACKAGES=
1938  for i in $pack ; do  for i in `grep -v "-" ./.tmp_pack | sort | uniq` ; do
1939      PACKAGES="$PACKAGES $i"      PACKAGES="$PACKAGES $i"
1940  done  done
1941    rm -f ./.tmp_pack
1942  echo "    packages are:  $PACKAGES"  echo "    packages are:  $PACKAGES"
1943    
1944    #  Check availability of NetCDF and then either build the MNC template
1945    #  files or delete mnc from the list of available packages.
1946    echo $PACKAGES | grep ' mnc ' > /dev/null 2>&1
1947    RETVAL=$?
1948    if test "x$RETVAL" = x0 ; then
1949        if test "x$HAVE_NETCDF" != xt ; then
1950            cat <<EOF
1951    
1952    *********************************************************************
1953    WARNING: the "mnc" package was enabled but tests failed to compile
1954      NetCDF applications.  Please check that:
1955    
1956      1) NetCDF is correctly installed for this compiler and
1957      2) the LIBS variable (within the "optfile") specifies the correct
1958           NetCDF library to link against.
1959    
1960      Due to this failure, the "mnc" package is now DISABLED.
1961    *********************************************************************
1962    
1963    EOF
1964            PACKAGES=`echo $PACKAGES | sed -e 's/mnc//g'`
1965            DISABLE="$DISABLE mnc"
1966        else
1967            ( cd $ROOTDIR"/pkg/mnc" && $MAKE testclean && $MAKE templates ) > make_mnc.errors 2>&1
1968            RETVAL=$?
1969            if test "x${RETVAL}" = x0 ; then
1970                rm -f make_mnc.errors
1971            else
1972                echo "Error: problem encountered while building source files in pkg/mnc:"
1973                cat make_mnc.errors 1>&2
1974                exit 1
1975            fi
1976        fi
1977    fi
1978    
1979  echo "  applying package dependency rules"  echo "  applying package dependency rules"
1980  ck=  ck=
1981  while test "x$ck" != xtt ; do  while test "x$ck" != xtt ; do
# Line 1040  while test "x$ck" != xtt ; do Line 2040  while test "x$ck" != xtt ; do
2040              echo "  the dependency rules for \"$dname\""              echo "  the dependency rules for \"$dname\""
2041              exit 1              exit 1
2042          fi          fi
2043          i=$(( $i + 1 ))          i=`echo "$i + 1" | bc -l`
2044            #i=$(( $i + 1 ))
2045      done      done
2046      ck=$ck"t"      ck=$ck"t"
2047  done  done
# Line 1059  for i in $PACKAGES ; do Line 2060  for i in $PACKAGES ; do
2060      fi      fi
2061  done  done
2062    
   
2063  # Create a list of #define and #undef to enable/disable packages  # Create a list of #define and #undef to enable/disable packages
2064  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  
2065  #  The following UGLY HACK sets multiple "#undef"s and it needs to go  #  The following UGLY HACK sets multiple "#undef"s and it needs to go
2066  #  away.  On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h  #  away.  On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h
2067  #  file would eventually be split up so that all package-related #define  #  file would eventually be split up so that all package-related #define
2068  #  statements could be separated and handled only by genmake.  #  statements could be separated and handled only by genmake.
2069  names=`ls -1 "$ROOTDIR/pkg"`  names=`ls -1 "$ROOTDIR/pkg"`
2070  all_pack=  all_pack=
2071    DISABLED_PACKAGES=
2072  for n in $names ; do  for n in $names ; do
2073      if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then      if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
2074          has_pack="f"          has_pack="f"
# Line 1090  for n in $names ; do Line 2079  for n in $names ; do
2079              fi              fi
2080          done          done
2081          if test "x$has_pack" = xf ; then          if test "x$has_pack" = xf ; then
2082              undef=`echo "ALLOW_$n" | $AWK '{print toupper($0)}'`              undef=`echo "ALLOW_$n" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2083              echo "#undef $undef" >> $PACKAGES_DOT_H".tmp"              DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
2084          fi          fi
2085      fi      fi
2086  done  done
2087  cat <<EOF >>$PACKAGES_DOT_H".tmp"  ENABLED_PACKAGES=
   
 C  Packages enabled by genmake:  
 EOF  
2088  for i in $PACKAGES ; do  for i in $PACKAGES ; do
2089      def=`echo "ALLOW_$i" | $AWK '{print toupper($0)}'`      def=`echo "ALLOW_$i" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2090      echo "#define $def" >> $PACKAGES_DOT_H".tmp"      ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
2091  #eh3 DEFINES="$DEFINES -D$def"  #eh3 DEFINES="$DEFINES -D$def"
2092    
2093  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!
2094      case $i in      case $i in
2095          aim_v23)          aim_v23)
2096              echo "#define   ALLOW_AIM" >> $PACKAGES_DOT_H".tmp"              ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
2097              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 :-)"  
2098              ;;              ;;
2099      esac      esac
2100  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!
2101    
2102  done  done
 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  
2103    
2104  echo "  Adding STANDARDDIRS"  echo "  Adding STANDARDDIRS"
2105  BUILDDIR=${BUILDDIR:-.}  BUILDDIR=${BUILDDIR:-.}
2106  if test "x$STANDARDDIRS" = x ; then  if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
2107      STANDARDDIRS="eesupp model"      STANDARDDIRS="eesupp model"
2108  fi  fi
2109  for d in $STANDARDDIRS ; do  if test "x$STANDARDDIRS" != x ; then
2110      adr="$ROOTDIR/$d/src"      for d in $STANDARDDIRS ; do
2111      if test ! -d $adr ; then          adr="$ROOTDIR/$d/src"
2112          echo "Error:  directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""          if test ! -d $adr ; then
2113          echo "  is correct and that you correctly specified the STANDARDDIRS option"              echo "Error:  directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2114          exit 1              echo "  is correct and that you correctly specified the STANDARDDIRS option"
2115      else              exit 1
2116          SOURCEDIRS="$SOURCEDIRS $adr"          else
2117      fi              SOURCEDIRS="$SOURCEDIRS $adr"
2118      adr="$ROOTDIR/$d/inc"          fi
2119      if test ! -d $adr ; then          adr="$ROOTDIR/$d/inc"
2120          echo "Error:  directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""          if test ! -d $adr ; then
2121          echo "  is correct and that you correctly specified the STANDARDDIRS option"              echo "Error:  directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2122          exit 1              echo "  is correct and that you correctly specified the STANDARDDIRS option"
2123      else              exit 1
2124          INCLUDEDIRS="$INCLUDEDIRS $adr"          else
2125      fi              INCLUDEDIRS="$INCLUDEDIRS $adr"
2126  done          fi
2127        done
2128    fi
2129    
2130  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"
2131  echo "    of \"#define ALLOW_PKGNAME\"-type statements:"  echo "    of \"#define \"-type statements that are no longer allowed:"
2132  CPP_OPTIONS=  CPP_OPTIONS=
2133    CPP_EEOPTIONS=
2134  spaths=". $INCLUDEDIRS"  spaths=". $INCLUDEDIRS"
2135    names=`ls -1 "$ROOTDIR/pkg"`
2136  for i in $spaths ; do  for i in $spaths ; do
2137      try="$i/CPP_OPTIONS.h"      try="$i/CPP_OPTIONS.h"
2138      #  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  
2139          echo "    found CPP_OPTIONS=\"$try\""          echo "    found CPP_OPTIONS=\"$try\""
2140          CPP_OPTIONS="$try"          CPP_OPTIONS="$try"
2141          break          # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
2142            for n in $names ; do
2143                test_for_package_in_cpp_options $CPP_OPTIONS $n
2144            done
2145        fi
2146        try="$i/CPP_EEOPTIONS.h"
2147        if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
2148            echo "    found CPP_EEOPTIONS=\"$try\""
2149            # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
2150    #**** not yet enabled ****
2151    #        test_for_mpi_in_cpp_eeoptions $try
2152    #**** not yet enabled ****
2153            CPP_EEOPTIONS="$try"
2154      fi      fi
2155  done  done
2156  if test "x$CPP_OPTIONS" = x ; then  if test "x$CPP_OPTIONS" = x ; then
2157      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"
2158      exit 1      exit 1
2159  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  
   
2160    
2161  #  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
2162  #  compiler.  #  compiler.
# Line 1193  for i in $SOURCEDIRS ; do Line 2170  for i in $SOURCEDIRS ; do
2170          cat $i/$j >> ad_files          cat $i/$j >> ad_files
2171      done      done
2172  done  done
2173    if test ! "x"$FS = "x.f" ; then
2174  cat <<EOF > adjoint_sed      cat ad_files | sed -e "s/\.f/.$FS/g" > ad_files_f
2175  s/call adopen(/call adopen ( mythid,\\      mv -f ad_files_f ad_files
2176       \&           /g  fi
 s/call adclose(/call adclose( mythid,\\  
      \&           /g  
 s/call adread(/call adread ( mythid,\\  
      \&           /g  
 s/call adwrite(/call adwrite( mythid,\\  
      \&           /g  
   
 EOF  
2177    
2178  echo  echo
2179  echo "===  Creating the Makefile  ==="  echo "===  Creating the Makefile  ==="
2180  echo "  setting INCLUDES"  echo "  setting INCLUDES"
2181  for i in $INCLUDEDIRS ; do  for i in $INCLUDEDIRS ; do
2182      if ! test -d $i ; then      if test ! -d $i ; then
 #       INCLUDES="$INCLUDES -I$i"  
 #   else  
2183          echo "Warning: can't find INCLUDEDIRS=\"$i\""          echo "Warning: can't find INCLUDEDIRS=\"$i\""
2184      fi      fi
2185  done  done
2186    
2187    if test ! "x$DIVA" = x ; then
2188        echo "  Creating the pseudo-MPI include directory"
2189        INCLUDES="-I./mpi_headers $INCLUDES"
2190        rm -rf ./mpi_headers
2191        mkdir -p ./mpi_headers
2192    
2193        if test "x$MPIINCLUDEDIR" = x ; then
2194            if test "x$MPIHOME" = x ; then
2195                MPIHOME='/usr'
2196            fi
2197            MPIINCLUDEDIR='$MPIHOME/include'
2198        fi
2199        
2200        if test -r $MPIINCLUDEDIR/mpif.h ; then
2201            for i in $MPI_HEADER_FILES; do
2202                cp -p $MPIINCLUDEDIR/$i ./mpi_headers
2203            done
2204    
2205            perl -i -pe 's/MPI_DISPLACEMENT_CURRENT=-1_8/MPI_DISPLACEMENT_CURRENT=-1/g' mpi_headers/mpif.h
2206        else
2207            echo " We cannot create a copy of mpif.h!"
2208            exit -1
2209        fi
2210    fi
2211    
2212  echo "  Determining the list of source and include files"  echo "  Determining the list of source and include files"
2213  rm -rf .links.tmp  rm -rf .links.tmp
2214  mkdir .links.tmp  mkdir .links.tmp
2215    touch .links.tmp/foo
2216    if test ! -r ".links.tmp/foo" ; then
2217        echo
2218        echo "ERROR : something is wrong with your directory permissions or"
2219        echo "   your user file-creation mask (\"umask\") since creating a"
2220        echo "   sub-dir, touch-ing a file within it, and then reading it is"
2221        echo "   not working.  Please try setting your umask to something"
2222        echo "   sane such as:"
2223        echo
2224        echo "      umask 0002"
2225        echo
2226        echo "   and please verify that you have the proper permissions for"
2227        echo "   creating sub-directories and then reading files created"
2228        echo "   within them."
2229        echo
2230        exit 1
2231    fi
2232    rm -f .links.tmp/foo
2233  echo "# This section creates symbolic links" > srclinks.tmp  echo "# This section creates symbolic links" > srclinks.tmp
2234  echo "" >> srclinks.tmp  echo "" >> srclinks.tmp
2235  echo -n 'SRCFILES = '    > srclist.inc  printf 'SRCFILES = '    > srclist.inc
2236  echo -n 'CSRCFILES = '   > csrclist.inc  printf 'CSRCFILES = '   > csrclist.inc
2237  echo -n 'F90SRCFILES = ' > f90srclist.inc  printf 'F90SRCFILES = ' > f90srclist.inc
2238  echo -n 'HEADERFILES = ' > hlist.inc  printf 'HEADERFILES = ' > hlist.inc
2239  echo -n 'AD_FLOW_FILES = ' > ad_flow_files.inc  printf 'AD_FLOW_FILES = ' > ad_flow_files.inc
2240  alldirs="$SOURCEDIRS $INCLUDEDIRS ."  alldirs="$SOURCEDIRS $INCLUDEDIRS ."
2241  for d in $alldirs ; do  for d in $alldirs ; do
2242      deplist=      deplist=
# Line 1235  for d in $alldirs ; do Line 2245  for d in $alldirs ; do
2245      for sf in $sfiles ; do      for sf in $sfiles ; do
2246          if test ! -r ".links.tmp/$sf" ; then          if test ! -r ".links.tmp/$sf" ; then
2247              if test -f "$d/$sf" ; then              if test -f "$d/$sf" ; then
2248                  extn=`echo $sf | $AWK -F '.' '{print $NF}'`                  ignore_f=f
2249                  touch .links.tmp/$sf                  case $d/$sf in
2250                  deplist="$deplist $sf"                    ./$PACKAGES_DOT_H)
2251                  case $extn in                          ignore_f=t
                     F)  
                         echo    " \\"  >> srclist.inc  
                         echo -n " $sf" >> srclist.inc  
2252                          ;;                          ;;
2253                      F90)                    ./AD_CONFIG.h)
2254                          echo    " \\"  >> f90srclist.inc                          ignore_f=t
                         echo -n " $sf" >> f90srclist.inc  
2255                          ;;                          ;;
2256                      c)                    ./FC_NAMEMANGLE.h)
2257                          echo    " \\"  >> csrclist.inc                          ignore_f=t
                         echo -n " $sf" >> csrclist.inc  
2258                          ;;                          ;;
2259                      h)                    ./BUILD_INFO.h)
2260                          echo    " \\"  >> hlist.inc                          ignore_f=t
                         echo -n " $sf" >> hlist.inc  
2261                          ;;                          ;;
2262                      flow)                    ./EMBEDDED_FILES.h)
2263                          echo    " \\"  >> ad_flow_files.inc                          ignore_f=t
                         echo -n " $sf" >> ad_flow_files.inc  
2264                          ;;                          ;;
2265                  esac                    *)
2266                            #  For the local directory *ONLY*,
2267                            #  ignore all soft-links
2268                            if test "x$HAVE_TEST_L" = xt -a "x$d" = x. -a -L $sf ; then
2269                                ignore_f=t
2270                            else
2271                                touch .links.tmp/$sf
2272                                deplist="$deplist $sf"
2273                            fi
2274                            ;;
2275                    esac
2276                    if test "x$ignore_f" = xf ; then
2277                        extn=`echo $sf | $AWK -F. '{print $NF}'`
2278                        case $extn in
2279                            F)
2280                                echo    " \\"  >> srclist.inc
2281                                printf " $sf" >> srclist.inc
2282                                ;;
2283                            F90)
2284                                echo    " \\"  >> f90srclist.inc
2285                                printf " $sf" >> f90srclist.inc
2286                                ;;
2287                            c)
2288                                echo    " \\"  >> csrclist.inc
2289                                printf " $sf" >> csrclist.inc
2290                                ;;
2291                            h)
2292                                echo    " \\"  >> hlist.inc
2293                                printf " $sf" >> hlist.inc
2294                                ;;
2295                            flow)
2296                                echo    " \\"  >> ad_flow_files.inc
2297                                printf " $sf" >> ad_flow_files.inc
2298                                ;;
2299                        esac
2300                    fi
2301              fi              fi
2302          fi          fi
2303      done      done
# Line 1277  echo "" >> f90srclist.inc Line 2315  echo "" >> f90srclist.inc
2315  echo "" >> hlist.inc  echo "" >> hlist.inc
2316  echo "" >> ad_flow_files.inc  echo "" >> ad_flow_files.inc
2317    
2318  if test -e $MAKEFILE ; then  if test -f $MAKEFILE ; then
2319      mv -f $MAKEFILE "$MAKEFILE.bak"      mv -f $MAKEFILE "$MAKEFILE.bak"
2320  fi  fi
2321  echo "  Writing makefile: $MAKEFILE"  echo "  Writing makefile: $MAKEFILE"
# Line 1286  echo "#    $MACHINE" >> $MAKEFILE Line 2324  echo "#    $MACHINE" >> $MAKEFILE
2324  echo "# This makefile was generated automatically on" >> $MAKEFILE  echo "# This makefile was generated automatically on" >> $MAKEFILE
2325  echo "#    $THISDATE" >> $MAKEFILE  echo "#    $THISDATE" >> $MAKEFILE
2326  echo "# by the command:" >> $MAKEFILE  echo "# by the command:" >> $MAKEFILE
2327  echo "#    $0 $@" >> $MAKEFILE  echo "#    $0 $G2ARGS" >> $MAKEFILE
2328  echo "# executed by:" >> $MAKEFILE  echo "# executed by:" >> $MAKEFILE
2329  echo "#    $USER@${THISHOSTNAME}:${THISCWD}" >> $MAKEFILE  echo "#    ${THISUSER}@${THISHOST}:${THISCWD}" >> $MAKEFILE
2330    
2331  EXE_AD=$EXECUTABLE"_ad"  EXE_AD=$EXECUTABLE"_ad"
2332  EXE_FTL=$EXECUTABLE"_ftl"  EXE_FTL=$EXECUTABLE"_ftl"
2333  EXE_SVD=$EXECUTABLE"_svd"  EXE_SVD=$EXECUTABLE"_svd"
2334    
2335  cat >>$MAKEFILE <<EOF  cat >>$MAKEFILE <<EOF
2336    #
2337    # OPTFILE="$OPTFILE"
2338  #  #
2339  # BUILDDIR     : Directory where object files are written  # BUILDDIR     : Directory where object files are written
2340  # SOURCEDIRS   : Directories containing the source (.F) files  # SOURCEDIRS   : Directories containing the source (.F) files
# Line 1328  EXE_AD      = ${EXE_AD} Line 2368  EXE_AD      = ${EXE_AD}
2368  EXE_FTL     = ${EXE_FTL}  EXE_FTL     = ${EXE_FTL}
2369  EXE_SVD     = ${EXE_SVD}  EXE_SVD     = ${EXE_SVD}
2370    
2371    ENABLED_PACKAGES = ${ENABLED_PACKAGES}
2372    DISABLED_PACKAGES = ${DISABLED_PACKAGES}
2373    
2374    # These files are created by Makefile
2375    SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h BUILD_INFO.h
2376  EOF  EOF
2377    
2378  #  Note: figure out some way to add Hyades JAM libraries here  if test "x$EMBED_SRC" = xt ; then
2379        echo "EMBEDDED_FILES = EMBEDDED_FILES.h" >>$MAKEFILE
2380    else
2381        echo "EMBEDDED_FILES = " >>$MAKEFILE
2382    fi
2383    
2384    #  Note: figure out some way to add Hyades JAM libraries here
2385  cat >>$MAKEFILE <<EOF  cat >>$MAKEFILE <<EOF
2386  # Unix ln (link)  # Unix ln (link)
2387  LN = ${LN}  LN = ${LN}
# Line 1345  KPP = ${KPP} Line 2395  KPP = ${KPP}
2395  FC = ${FC}  FC = ${FC}
2396  # Fortran compiler  # Fortran compiler
2397  F90C = ${F90C}  F90C = ${F90C}
2398    # C compiler
2399    CC = ${CC}
2400  # Link editor  # Link editor
2401  LINK = ${LINK}  LINK = ${LINK} ${LDADD}
2402    
2403  # Defines for CPP  # Defines for CPP
2404  DEFINES = ${DEFINES}  DEFINES = ${DEFINES}
# Line 1367  CFLAGS = ${CFLAGS} Line 2419  CFLAGS = ${CFLAGS}
2419  NOOPTFILES = ${NOOPTFILES}  NOOPTFILES = ${NOOPTFILES}
2420  NOOPTFLAGS = ${NOOPTFLAGS}  NOOPTFLAGS = ${NOOPTFLAGS}
2421  # Flags and libraries needed for linking  # Flags and libraries needed for linking
2422  LIBS = ${LIBS} \$(XLIBS)  LIBS = ${LIBS}
2423  # Name of the Mekfile  # Name of the Mekfile
2424  MAKEFILE=${MAKEFILE}  MAKEFILE=${MAKEFILE}
2425    
# Line 1378  cat csrclist.inc      >> $MAKEFILE Line 2430  cat csrclist.inc      >> $MAKEFILE
2430  cat f90srclist.inc    >> $MAKEFILE  cat f90srclist.inc    >> $MAKEFILE
2431  cat hlist.inc         >> $MAKEFILE  cat hlist.inc         >> $MAKEFILE
2432  cat ad_flow_files.inc >> $MAKEFILE  cat ad_flow_files.inc >> $MAKEFILE
2433  echo               >> $MAKEFILE  echo >> $MAKEFILE
2434  echo 'F77FILES =  $(SRCFILES:.F=.f)'                                           >> $MAKEFILE  echo 'F77FILES =  $(SRCFILES:.F=.'$FS')'      >> $MAKEFILE
2435  echo 'F90FILES =  $(F90SRCFILES:.F90=.f90)'                                    >> $MAKEFILE  echo 'F90FILES =  $(F90SRCFILES:.F90=.'$FS90')' >> $MAKEFILE
2436  echo 'OBJFILES =  $(SRCFILES:.F=.o) $(CSRCFILES:.c=.o) $(F90SRCFILES:.F90=.o)' >> $MAKEFILE  echo 'OBJFILES =  $(SRCFILES:.F=.o) $(CSRCFILES:.c=.o) $(F90SRCFILES:.F90=.o)' >> $MAKEFILE
2437    echo >> $MAKEFILE
2438    echo '.SUFFIXES:' >> $MAKEFILE
2439    echo '.SUFFIXES: .o .'$FS' .p .F .c .'$FS90' .F90' >> $MAKEFILE
2440  rm -f srclist.inc csrclist.inc hlist.inc flist.tmp clist.tmp f90srclist.inc  rm -f srclist.inc csrclist.inc hlist.inc flist.tmp clist.tmp f90srclist.inc
2441  rm -f ad_flow_files.inc  rm -f ad_flow_files.inc
2442    
2443  cat >>$MAKEFILE <<EOF  cat >>$MAKEFILE <<EOF
2444    
 .SUFFIXES:  
 .SUFFIXES: .o .f .p .F .c .F90 .f90  
   
2445  all: \$(EXECUTABLE)  all: \$(EXECUTABLE)
2446  \$(EXECUTABLE): \$(OBJFILES)  \$(EXECUTABLE): \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(OBJFILES) \$(EMBEDDED_FILES)
2447            @echo Creating \$@ ...
2448          \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)          \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
2449  depend:  depend:
2450          @make links          @make links
2451          \$(MAKEDEPEND) -o .f \$(DEFINES) \$(INCLUDES) \$(SRCFILES)          \$(MAKEDEPEND) -o .$FS \$(DEFINES) \$(INCLUDES) \$(SRCFILES)
2452          ${TOOLSDIR}/f90mkdepend >> \$(MAKEFILE)          \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
2453            -rm -f makedepend.out
2454    
2455    lib: libmitgcmuv.a
2456    
2457  links: \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES)  libmitgcmuv.a: \$(OBJFILES)
2458            ar rcv libmitgcmuv.a \$(OBJFILES)
2459    
2460    links: \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(SPECIAL_FILES)
2461    
2462  small_f: \$(F77FILES) \$(F90FILES)  small_f: \$(F77FILES) \$(F90FILES)
2463    
# Line 1408  output.txt: \$(EXECUTABLE) Line 2466  output.txt: \$(EXECUTABLE)
2466          @\$(EXECUTABLE) > \$@          @\$(EXECUTABLE) > \$@
2467    
2468  clean:  clean:
2469          -cat AD_CONFIG.template > AD_CONFIG.h          -rm -rf *.o *.$FS *.p *.$FS90 *.mod ${RMFILES} work.{pc,pcl} *.template
         -rm -rf *.o *.f *.p *.f90 *.mod ${RMFILES} work.{pc,pcl}  
2470  Clean:  Clean:
2471          @make clean          @make clean
2472          @make cleanlinks          @make cleanlinks
2473          -rm -f Makefile.bak genmake_state genmake_*optfile make.log          -rm -f \$(SPECIAL_FILES)
2474            -rm -f genmake_state genmake_*optfile genmake_warnings make.log run.log *.bak
2475  CLEAN:  CLEAN:
2476          @make Clean          @make Clean
2477          -find \$(EXEDIR) -name "*.meta" -exec rm {} \;          -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
2478          -find \$(EXEDIR) -name "*.data" -exec rm {} \;          -find \$(EXEDIR) -name "*.data" -exec rm {} \;
2479          -find \$(EXEDIR) -name "fort.*" -exec rm {} \;          -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
2480          -rm -f \$(EXECUTABLE) output.txt          -rm -f \$(EXECUTABLE) \$(EXE_AD) *.txt STD* *diagnostics.log datetime
2481            -rm -rf mnc_test_*
2482    
2483  #eh3 Makefile: makefile  #eh3 Makefile: makefile
2484  makefile:  makefile:
2485          ${0} $@          $THIS_SCRIPT $G2ARGS
2486  cleanlinks:  cleanlinks:
2487          -find . -type l -exec rm {} \;          -find . -type l -exec rm {} \;
2488    
2489  # The normal chain of rules is (  .F - .f - .o  )  # Special targets (SPECIAL_FILES) which are create by make
2490  .F.f:  ${PACKAGES_DOT_H}:
2491            @echo Creating \$@ ...
2492            @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -bPACKAGES_CONFIG_H "Disabled packages:" \$(DISABLED_PACKAGES) " " "Enabled packages:" \$(ENABLED_PACKAGES) > \$@
2493    AD_CONFIG.h:
2494            @echo Creating \$@ ...
2495            @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN -UALLOW_ECCO_OPTIMIZATION > \$@
2496    FC_NAMEMANGLE.h:
2497            @echo Creating \$@ ...
2498            echo "$FC_NAMEMANGLE" > \$@
2499    
2500    BUILD_INFO.h:
2501            @echo Creating \$@ ...
2502    EOF
2503    
2504    test ! "x$THISVER" = x  && echo "       -echo \"#define THISVER '$THISVER'\" > \$@"   >> $MAKEFILE
2505    test ! "x$THISUSER" = x && echo "       -echo \"#define THISUSER '$THISUSER'\" >> \$@" >> $MAKEFILE
2506    test ! "x$THISDATE" = x && echo "       -echo \"#define THISDATE '$THISDATE'\" >> \$@" >> $MAKEFILE
2507    test ! "x$THISHOST" = x && echo "       -echo \"#define THISHOST '$THISHOST'\" >> \$@" >> $MAKEFILE
2508    
2509    if test "x$EMBED_SRC" = xt ; then
2510        cat >>$MAKEFILE <<EOF
2511    
2512    decode_files.o : EMBEDDED_FILES.h
2513    
2514    ##  \$(F77FILES)
2515    all_fF.tar.gz : \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(F77FILES) Makefile
2516            @echo Creating \$@ ...
2517            -tar -hcf all_fF.tar \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(F77FILES) Makefile
2518            -rm -f all_fF.tar.gz
2519            -gzip all_fF.tar
2520    
2521    EMBEDDED_FILES.h : all_fF.tar.gz
2522            @echo Creating \$@ ...
2523            -\${ROOTDIR}/tools/embed_encode/encode_files EMBEDDED_FILES.h all_fF.tar.gz
2524    
2525    EOF
2526    fi
2527    
2528    cat >>$MAKEFILE <<EOF
2529    
2530    # The normal chain of rules is (  .F - .$FS - .o  )
2531    
2532    ## This nullifies any default implicit rules concerning these two file types:
2533    ## %.o : %.F
2534    
2535    .F.$FS:
2536          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2537  .f.o:  .$FS.o:
2538          \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<          \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
2539  .F90.f90:  .F90.$FS90:
2540          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2541  .f90.o:  .$FS90.o:
2542          \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<          \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
2543  .c.o:  .c.o:
2544          \$(CC) \$(CFLAGS) -c \$<          \$(CC) \$(CFLAGS) \$(DEFINES) \$(INCLUDES) -c \$<
2545    
2546  # Special exceptions that use the ( .F - .p - .f - .o ) rule-chain  # Special exceptions that use the ( .F - .p - .$FS - .o ) rule-chain
2547  .F.p:  .F.p:
2548          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2549  .p.f:  .p.$FS:
2550          \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<          \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
2551    
2552  #=========================================  #=========================================
# Line 1461  ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF Line 2565  ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF
2565  ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"  ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
2566  for i in $ad_vars ; do  for i in $ad_vars ; do
2567      name=$i      name=$i
2568      t1="t2=\$"`echo $i`      t1="t2=\$"`echo "$i"`
2569      eval $t1      eval $t1
2570      printf "%-20s = " $name >> $MAKEFILE      printf "%-20s = " $name >> $MAKEFILE
2571      echo $t2 >> $MAKEFILE      echo "$t2" | sed -e 's| \+| |g' >> $MAKEFILE
2572  done  done
2573    
2574  echo "  Add the source list for AD code generation"  echo "  Add the source list for AD code generation"
2575  echo >> $MAKEFILE  echo >> $MAKEFILE
2576  echo -n "AD_FILES = " >> $MAKEFILE  printf "AD_FILES = " >> $MAKEFILE
2577  AD_FILES=`cat ad_files`  AD_FILES=`cat ad_files`
2578  for i in $AD_FILES ; do  for i in $AD_FILES ; do
2579      echo    " \\" >> $MAKEFILE      echo    " \\" >> $MAKEFILE
2580      echo -n " $i" >> $MAKEFILE      printf " $i" >> $MAKEFILE
2581  done  done
2582  echo >> $MAKEFILE  echo >> $MAKEFILE
2583  rm -f ad_files  rm -f ad_files
# Line 1481  rm -f ad_files Line 2585  rm -f ad_files
2585  cat >>$MAKEFILE <<EOF  cat >>$MAKEFILE <<EOF
2586    
2587  # ... AD ...  # ... AD ...
2588  adall: ad_taf  adall: \$(EXE_AD)
2589  adtaf: ad_taf_output.f  adtaf: ad_taf_output.$FS
2590  adtamc: ad_tamc_output.f  adtamc: ad_tamc_output.$FS
2591    
2592  ad_input_code.f: \$(AD_FILES) \$(HEADERFILES)  ad_input_code.$FS: \$(AD_FILES) \$(HEADERFILES)
2593            @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -DALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN -UALLOW_ECCO_OPTIMIZATION > ad_config.template
2594          cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h          cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
2595            -rm -f ad_config.template
2596          @make \$(F77FILES)          @make \$(F77FILES)
2597          @make \$(AD_FLOW_FILES)          @make \$(AD_FLOW_FILES)
2598          cat \$(AD_FLOW_FILES) \$(AD_FILES) > ad_input_code.f          cat \$(AD_FLOW_FILES) \$(AD_FILES) > ad_input_code.$FS
2599    
2600  ad_taf_output.f: ad_input_code.f  ad_taf_output.$FS: ad_input_code.$FS
2601          \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f          \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2602          cat ad_input_code_ad.f | sed -f adjoint_sed > ad_taf_output.f          cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2603    
2604  ad_taf: ad_taf_output.o \$(OBJFILES)  adtafonly:
2605          \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)          \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2606            cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2607  ad_tamc_output.f: ad_input_code.f  
2608          \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.f  \${EXE_AD}: ad_taf_output.o \$(OBJFILES)
2609          cat ad_input_code_ad.f | sed -f adjoint_sed > ad_tamc_output.f          \$(LINK) -o \${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
2610    
2611    ad_tamc_output.$FS: ad_input_code.$FS
2612            \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.$FS
2613            cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.$FS
2614    
2615  ad_tamc: ad_tamc_output.o \$(OBJFILES)  ad_tamc: ad_tamc_output.o \$(OBJFILES)
2616          \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)          \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
2617    
2618    adonlyfwd:
2619            patch < \$(TOOLSDIR)/ad_taf_output.f.onlyfwd.diff
2620    
2621    adtrick:
2622            patch < \$(TOOLSDIR)/ad_taf_output.f.adtrick.diff
2623    
2624  # ... FTL ...  # ... FTL ...
2625  ftlall: ftl_taf  ftlall: ftl_taf
2626  ftltaf: ftl_taf_output.f  ftltaf: ftl_taf_output.$FS
2627  ftltamc: ftl_tamc_output.f  ftltamc: ftl_tamc_output.$FS
2628    
2629  ftl_input_code.f: \$(AD_FILES) \$(HEADERFILES)  ftl_input_code.$FS: \$(AD_FILES) \$(HEADERFILES)
2630            @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -UALLOW_ADJOINT_RUN -DALLOW_TANGENTLINEAR_RUN -UALLOW_ECCO_OPTIMIZATION > ftl_config.template
2631          cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h          cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
2632            -rm -f ftl_config.template
2633          @make \$(F77FILES)          @make \$(F77FILES)
2634          @make \$(AD_FLOW_FILES)          @make \$(AD_FLOW_FILES)
2635          cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.f          cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.$FS
2636    
2637  ftl_taf_output.f: ftl_input_code.f  ftl_taf_output.$FS: ftl_input_code.$FS
2638          \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f          \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
2639          cat ftl_input_code_ftl.f | sed -f adjoint_sed > ftl_taf_output.f          cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
2640    
2641    ftltafonly:
2642            \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
2643            cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
2644    
2645  ftl_taf: ftl_taf_output.o \$(OBJFILES)  ftl_taf: ftl_taf_output.o \$(OBJFILES)
2646          \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)          \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
2647    
2648  ftl_tamc_output.f: ftl_input_code.f  ftl_tamc_output.$FS: ftl_input_code.$FS
2649          \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.f          \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.$FS
2650          cat ftl_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
2651    
2652  ftl_tamc: ftl_tamc_output.o \$(OBJFILES)  ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
2653          \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)          \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
2654    
2655    
2656  # ... SVD ...  # ... SVD ...
2657  svd: svd_taf  svdtaf: ad_taf_output.$FS ftl_taf_output.$FS
2658  svd_taf_f: svd_taf_output.f          @echo "--->>> Only ran TAF to generate SVD code!    <<<---"
2659            @echo "--->>> Do make svdall afterwards to compile. <<<---"
2660  svd_input_code.f: \$(SRCFILES)  svdall: svd_touch svd_taf
2661          cmp svd_config.template AD_CONFIG.h || cat svd_config.template > AD_CONFIG.h  
2662          @make \$(F77FILES)  svd_taf: \$(OBJFILES)
2663          @make \$(AD_FLOW_FILES)          \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
2664          cat \$(AD_FLOW_FILES) \$(AD_FILES) > svd_input_code.f  
2665            @echo "--->>> Only COMPILE svd code! <<<---"
2666  svd_taf_output.f: svd_input_code.f          @echo "--->>> Assumes you previously <<<---"
2667          \$(TAF) \$(SVD_TAF_FLAGS) \$(TAF_EXTRA) svd_input_code.f          @echo "--->>> did make svdtaf        <<<---"
2668          cat svd_input_code_ad.f | sed -f adjoint_sed > svd_taf_output.f  
2669    svd_touch:
2670  svd_taf: svd_taf_output.o \$(OBJFILES)          @echo "--->>> Only COMPILE svd code! <<<---"
2671          \$(LINK) -o ${EXE_SVD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) svd_taf_output.o \$(LIBS)          @echo "--->>> Assumes you previously <<<---"
2672            @echo "--->>> did make svdtaf        <<<---"
2673            touch ad_taf_output.$FS ftl_taf_output.$FS
2674            \$(FC) \$(FFLAGS) \$(FOPTIM) -c ad_taf_output.$FS
2675            \$(FC) \$(FFLAGS) \$(FOPTIM) -c ftl_taf_output.$FS
2676            @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -UALLOW_ADJOINT_RUN -DALLOW_TANGENTLINEAR_RUN -UALLOW_ECCO_OPTIMIZATION > ftl_config.template
2677            cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
2678            -rm -f ftl_config.template
2679    
2680  #=========================================  #=========================================
2681    
# Line 1565  for i in $KPPFILES ; do Line 2692  for i in $KPPFILES ; do
2692      if test "x$RETVAL" != x0 ; then      if test "x$RETVAL" != x0 ; then
2693          echo "Error: unable to add file \"$i\" to the exceptions list"          echo "Error: unable to add file \"$i\" to the exceptions list"
2694      fi      fi
2695      echo "$base.f: $base.p" >> $MAKEFILE      echo "$base.$FS: $base.p" >> $MAKEFILE
2696  done  done
2697    
2698  echo "  Making list of NOOPTFILES"  echo "  Making list of NOOPTFILES"
# Line 1575  for i in $NOOPTFILES ; do Line 2702  for i in $NOOPTFILES ; do
2702      if test "x$RETVAL" != x0 ; then      if test "x$RETVAL" != x0 ; then
2703          echo "Error: unable to add file \"$i\" to the exceptions list"          echo "Error: unable to add file \"$i\" to the exceptions list"
2704      fi      fi
2705      echo "$base.o: $base.f" >> $MAKEFILE      echo "$base.o: $base.$FS" >> $MAKEFILE
2706      printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE      printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE
2707  done  done
2708    
# Line 1588  printf "\n\n# DO NOT DELETE\n" >> $MAKEF Line 2715  printf "\n\n# DO NOT DELETE\n" >> $MAKEF
2715    
2716  printf "\n===  Done  ===\n"  printf "\n===  Done  ===\n"
2717    
2718  #  Write the "template" files for the adjoint builds  # Create special header files
2719  cat >AD_CONFIG.template <<EOF  $BASH $TOOLSDIR/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -bPACKAGES_CONFIG_H "Disabled packages:" $DISABLED_PACKAGES " " "Enabled packages:" $ENABLED_PACKAGES > $PACKAGES_DOT_H".tmp"
2720  C  WARNING: This file is automatically generated by genmake2 and  if test ! -f $PACKAGES_DOT_H ; then
2721  C    used by the Makefile rules.  Please DO NOT EDIT this file      mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
2722  C    unless you are CERTAIN that you know what you are doing.  else
2723        cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H > /dev/null 2>&1
2724  #undef ALLOW_ADJOINT_RUN      RETVAL=$?
2725  #undef ALLOW_TANGENTLINEAR_RUN      if test "x$RETVAL" = x0 ; then
2726  #undef ALLOW_ECCO_OPTIMIZATION          rm -f $PACKAGES_DOT_H".tmp"
2727  EOF      else
2728  cat >ad_config.template <<EOF          mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"
2729  C  WARNING: This file is automatically generated by genmake2 and          mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
2730  C    used by the Makefile rules.  Please DO NOT EDIT this file      fi
2731  C    unless you are CERTAIN that you know what you are doing.  fi
2732    if test ! -f AD_CONFIG.h ; then
2733  #define ALLOW_ADJOINT_RUN      $BASH $TOOLSDIR/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -UALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN -UALLOW_ECCO_OPTIMIZATION > AD_CONFIG.h
2734  #undef ALLOW_TANGENTLINEAR_RUN  fi
 #undef ALLOW_ECCO_OPTIMIZATION  
 EOF  
 cat >ftl_config.template <<EOF  
 C  WARNING: This file is automatically generated by genmake2 and  
 C    used by the Makefile rules.  Please DO NOT EDIT this file  
 C    unless you are CERTAIN that you know what you are doing.  
   
 #undef ALLOW_ADJOINT_RUN  
 #define ALLOW_TANGENTLINEAR_RUN  
 #undef ALLOW_ECCO_OPTIMIZATION  
 EOF  
 cat >svd_config.template <<EOF  
 C  WARNING: This file is automatically generated by genmake2 and  
 C    used by the Makefile rules.  Please DO NOT EDIT this file  
 C    unless you are CERTAIN that you know what you are doing.  
   
 #undef ALLOW_ADJOINT_RUN  
 #undef ALLOW_TANGENTLINEAR_RUN  
 #undef ALLOW_ECCO_OPTIMIZATION  
 EOF  
 cp AD_CONFIG.template AD_CONFIG.h  
2735    
2736    
2737  #  Write the "state" for future records  #  Write the "state" for future records
2738  if test "x$DUMPSTATE" != xf ; then  if test "x$DUMPSTATE" != xf ; then
2739      echo -n "" > genmake_state      printf "" > genmake_state
2740      for i in $gm_state ; do      for i in $gm_state ; do
2741          t1="t2=\$$i"          t1="t2=\$$i"
2742          eval $t1          eval $t1

Legend:
Removed from v.1.36  
changed lines
  Added in v.1.152

  ViewVC Help
Powered by ViewVC 1.1.22