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

Legend:
Removed from v.1.10  
changed lines
  Added in v.1.138

  ViewVC Help
Powered by ViewVC 1.1.22