/[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.3 by cnh, Fri Aug 22 20:50:40 2003 UTC revision 1.76 by edhill, Thu Apr 8 21:32:11 2004 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='fs'
101                FS90='fs90'
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 -e Makefile  &&  mv -f Makefile Makefile.bak
126        cat <<EOF >> Makefile
127    .SUFFIXES:
128    genmake_hello.$tfs: genmake_hello.F
129            $LN genmake_hello.F genmake_hello.$tfs
130    EOF
131        $MAKE "genmake_hello."$tfs > /dev/null 2>&1
132        RETVAL=$?
133        if test "x$RETVAL" != x0 -o ! -e "genmake_hello."$tfs ; then
134            if test "x$FS" = x ; then
135                FS='fs'
136                FS90='fs9'
137                check_for_broken_Ff
138            else
139                cat <<EOF 2>&1
140    ERROR: Your file system cannot distinguish between *.F and *.f files
141      (fails the "make/ln" test) and this program cannot find a suitable
142      replacement extension.  Please try a different build environment or
143      contact the <MITgcm-support@mitgcm.org> list for help.
144    
145    EOF
146                exit -1
147                return
148            fi
149        fi
150        rm -f genmake_hello.* Makefile
151        test -e Makefile  &&  mv -f Makefile.bak Makefile
152    
153        #  If we make it here, use the extensions
154        FS=$tfs
155        FS90=$tfs9
156        return
157    }
158    
159    
160  # Guess possible config options for this host  # Guess possible config options for this host
161  find_possible_configs()  {  find_possible_configs()  {
162    
163      p_PLATFORM=`uname`"-"`uname -m`      tmp1=`uname`"_"`uname -m`
164      echo "The platform appears to be:"      tmp2=`echo $tmp1 | sed -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
165      echo "  "$p_PLATFORM      tmp3=`echo $tmp2 | sed -e 's/power macintosh/ppc/'`
166        tmp1=`echo $tmp3 | sed -e 's|x86_64|amd64|'`
167      p_LN=      tmp2=`echo $tmp1 | sed -e 's/i[3-6]86/ia32/' | sed -e 's/athlon/ia32/'`
168        tmp3=`echo $tmp2 | sed -e 's/cray sv1/craysv1/'`
169        PLATFORM=$tmp3
170        OFLIST=`(cd $ROOTDIR/tools/build_options; ls | grep "^$PLATFORM")`
171        echo "  The platform appears to be:  $PLATFORM"
172        
173      echo "test" > test      echo "test" > test
174      ln -s ./test link      ln -s ./test link
175      RETVAL=$?      RETVAL=$?
176      if test "x${RETVAL}" = x0 ; then      if test "x${RETVAL}" = x0 ; then
177          p_LN="ln -s"          LN="ln -s"
178        else
179            echo "Error: \"ln -s\" does not appear to work on this system!"
180            echo "  For help, please contact <MITgcm-support@mitgcm.org>."
181            exit 1
182      fi      fi
183      rm -f test link      rm -f test link
184    
185      p_CPP=`which cpp`      if test "x$CPP" = x ; then
186                CPP="cpp -traditional -P"
187      RETVAL=$?      fi
188      if test "x${RETVAL}" = x0 ; then  
189          p_LN="ln -s"      #  The "original" makedepend is part of the Imake system that is
190        #  most often distributed with XFree86 or with an XFree86 source
191        #  package.  As a result, many machines (eg. generic Linux) do not
192        #  have a system-default "makedepend" available.  For those
193        #  systems, we have two fall-back options:
194        #
195        #    1) a makedepend implementation shipped with the cyrus-imapd
196        #       package:  ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/
197        #
198        #    2) a known-buggy xmakedpend shell script
199        #
200        #  So the choices are, in order:
201        #
202        #    1) use the user-specified program
203        #    2) use a system-wide default
204        #    3) locally build and use the cyrus implementation
205        #    4) fall back to the buggy local xmakedpend script
206        #
207        if test "x${MAKEDEPEND}" = x ; then
208          which makedepend > /dev/null 2>&1
209          RETVAL=$?
210          if test ! "x${RETVAL}" = x0 ; then
211             echo "    a system-default makedepend was not found."
212    
213             #  Try to build the cyrus impl
214             rm -f ./genmake_cy_md
215             (
216                 cd $ROOTDIR/tools/cyrus-imapd-makedepend  \
217                     &&  ./configure > /dev/null 2>&1  \
218                     &&  make > /dev/null 2>&1  \
219                     &&  ./makedepend ifparser.c > /dev/null 2>&1  \
220                     &&  echo "true"
221             ) > ./genmake_cy_md
222             grep true ./genmake_cy_md > /dev/null 2>&1
223             RETVAL=$?
224             if test "x$RETVAL" = x0 ; then
225                 MAKEDEPEND='$(TOOLSDIR)/cyrus-imapd-makedepend/makedepend'
226             else
227                 MAKEDEPEND='$(TOOLSDIR)/xmakedepend'
228             fi
229             rm -f ./genmake_cy_md
230          fi
231      fi      fi
     rm -f test link  
232    
233      # look for possible fortran compilers      # look for possible fortran compilers
234        tmp="$MITGCM_FC $FC efc g77 f77 pgf77 pgf95 ifc f90 f95 mpif77 mpf77 mpxlf95"
235      p_FC=      p_FC=
236      for c in f77 g77 pgf77 pgf95 ifc f90 f95 mpif77 mpf77 mpxlf95 ; do      for c in $tmp ; do
237          which $c > /dev/null 2>&1          rm -f ./hello.f ./hello
238            cat >> hello.f <<EOF
239          program hello
240          do i=1,3
241            print *, 'hello world : ', i
242          enddo
243          end
244    EOF
245            $c -o hello hello.f > /dev/null 2>&1
246          RETVAL=$?          RETVAL=$?
247          if test "x${RETVAL}" = x0 ; then          if test "x${RETVAL}" = x0 ; then
248              p_FC="$p_FC $c"              p_FC="$p_FC $c"
249          fi          fi
250      done      done
251      echo "Possible FORTRAN compilers appear to be:  "      rm -f ./hello.f ./hello
252      if test "x${p_FC}" = x ; then      if test "x${p_FC}" = x ; then
253          echo "  None found!!!"          cat 1>&2 <<EOF
254      else  
255          echo "  "$p_FC  Error: No Fortran compilers were found in your path.  Please specify one using:
256      fi  
257        1) an "optfile" on (eg. "-optfile=path/to/OPTFILE"),
258        2) a command-line option (eg. "-fc NAME"), or
259        3) the MITGCM_FC environment variable.
260    
     # look for possible MPI libraries  
     mpi_libs=  
     mpi_fort=`which mpif77 2>/dev/null`  
     RETVAL=$?  
     if test "x${RETVAL}" = x0 ; then  
         cat >>test.f <<EOF  
       PROGRAM HELLO  
       DO 10, I=1,10  
       PRINT *,'Hello World'  
    10 CONTINUE  
       STOP  
       END  
261  EOF  EOF
262          eval "$mpi_fort -showme test.f > out"          exit 1
263          RETVAL=$?      else
264          if test "x${RETVAL}" = x0 ; then          echo "  The possible FORTRAN compilers found in your path are:"
265              a=`cat out`          echo "   "$p_FC
266              for i in $a ; do          if test "x$FC" = x ; then
267                  case $i in              FC=`echo $p_FC | $AWK '{print $1}'`
268                      -*)              echo "  Setting FORTRAN compiler to: "$FC
                         mpi_libs="$mpi_libs $i" ;;  
                 esac  
             done  
             echo "The MPI libs appear to be:"  
             echo "  "$mpi_libs  
269          fi          fi
         rm -f test.f out  
270      fi      fi
271    
272  }      if test "x$OPTFILE" = x ; then
273            OPTFILE=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$FC
274            if test ! -r $OPTFILE ; then
275                 echo "  I looked for the file "$OPTFILE" but did not find it"
276            fi
277        fi
278    #    echo "  The options file:  $p_OF"
279    #    echo "    appears to match so we'll use it."
280    #   for i in $p_FC ; do
281    #p_OF=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$i
282    #if test -r $p_OF ; then
283    #    OPTFILE=$p_OF
284    #    echo "  The options file:  $p_OF"
285    #    echo "    appears to match so we'll use it."
286    #    break
287    #fi
288    #   done
289        if test "x$OPTFILE" = x ; then
290            cat 1>&2 <<EOF
291    
292    Error: No options file was found in:  $ROOTDIR/tools/build_options/
293      that matches this platform ("$PLATFORM") and the compilers found in
294      your path.  Please specify an "optfile" using:
295    
296  parse_options()  {      1) the command line (eg. "-optfile=path/to/OPTFILE"), or
297        2) the MITGCM_OF environment variable.
298    
299      ac_prev=    If you need help, please contact the developers at <MITgcm-support@mitgcm.org>.
300      for ac_option in "${OPTIONS[@]}" ; do  
301    EOF
302            exit 1
303        fi
304        
305    #     # look for possible MPI libraries
306    #     mpi_libs=
307    #     mpi_fort=`which mpif77 2>/dev/null`
308    #     RETVAL=$?
309    #     if test "x${RETVAL}" = x0 ; then
310    #       cat >>test.f <<EOF
311    #       PROGRAM HELLO
312    #       DO 10, I=1,10
313    #       PRINT *,'Hello World'
314    #    10 CONTINUE
315    #       STOP
316    #       END
317    # EOF
318    #       eval "$mpi_fort -showme test.f > out"
319    #       RETVAL=$?
320    #       if test "x${RETVAL}" = x0 ; then
321    #           a=`cat out`
322    #           for i in $a ; do
323    #               case $i in
324    #                   -*)
325    #                       mpi_libs="$mpi_libs $i" ;;
326    #               esac
327    #           done
328    #           echo "The MPI libs appear to be:"
329    #           echo "  "$mpi_libs
330    #       fi
331    #       rm -f test.f out
332    #     fi
333    
         # echo "ac_option = :$ac_option:"  
           
         # If the previous option needs an argument, assign it.  
         if test -n "$ac_prev"; then  
             eval "$ac_prev=\$ac_option"  
             ac_prev=  
             continue  
         fi  
           
         ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`  
           
         case $ac_option in  
               
             -help | --help | -h | --h)  
                 usage ;;  
               
             -nooptfile | --nooptfile)  
                 OPTFILE="NONE" ;;  
             -optfile | --optfile | -of | --of)  
                 ac_prev=optfile ;;  
             -optfile=* | --optfile=* | -of=* | --of=*)  
                 OPTFILE=$ac_optarg ;;  
               
             -pdepend | --pdepend)  
                 ac_prev=pdepend ;;  
             -pdepend=* | --pdepend=*)  
                 PDEPEND=$ac_optarg ;;  
               
             -pdefault | --pdefault)  
                 ac_prev=pdefault ;;  
             -pdefault=* | --pdefault=*)  
                 PDEFAULT=$ac_optarg ;;  
               
             -makefile | -ma)  
                 ac_prev=makefile ;;  
             --makefile=* | -ma=*)  
                 MAKEFILE=$ac_optarg ;;  
               
             -platform | --platform | -pl | --pl)  
                 ac_prev=platform ;;  
             -platform=* | --platform=* | -pl=* | --pl=*)  
                 PLATFORM=$ac_optarg ;;  
   
             -rootdir | --rootdir | -rd | --rd)  
                 ac_prev=rootdir ;;  
             -rootdir=* | --rootdir=* | -rd=* | --rd=*)  
                 ROOTDIR=$ac_optarg ;;  
               
             -mods | --mods | -mo | --mo)  
                 ac_prev=mods ;;  
             -mods=* | --mods=* | -mo=* | --mo=*)  
                 MODS=$ac_optarg ;;  
               
             -disable | --disable)  
                 ac_prev=disable ;;  
             -disable=* | --disable=*)  
                 DISABLE=$ac_optarg ;;  
               
             -enable | --enable)  
                 ac_prev=enable ;;  
             -enable=* | --enable=*)  
                 ENABLE=$ac_optarg ;;  
               
             -noopt | --noopt)  
                 ac_prev=noopt ;;  
             -noopt=* | --noopt=*)  
                 NOOPT=$ac_optarg ;;  
               
 #           -cpp | --cpp)  
 #               ac_prev=cpp ;;  
 #           -cpp=* | --cpp=*)  
 #               CPP=$ac_optarg ;;  
               
             -fortran | --fortran | -fc | --fc)  
                 ac_prev=fc ;;  
             -fc=* | --fc=*)  
                 FC=$ac_optarg ;;  
               
             -ieee | --ieee)  
                 IEEE=1 ;;  
             -noieee | --noieee)  
                 IEEE=0 ;;  
               
             -mpi | --mpi)  
                 MPI=1 ;;  
             -nompi | --nompi)  
                 MPI=0 ;;  
               
             -jam | --jam)  
                 JAM=1 ;;  
             -nojam | --nojam)  
                 JAM=0 ;;  
               
             -*)  
                 echo "Error: unrecognized option: "$ac_option  
                 usage  
                 ;;  
               
             *)  
                 echo "Error: unrecognized argument: "$ac_option  
                 usage  
                 ;;  
               
         esac  
           
     done  
334  }  }
335    
336  #  Parse the package dependency information  #  Parse the package dependency information
# Line 199  get_pdepend_list()  { Line 339  get_pdepend_list()  {
339      #  strip the comments and then convert the dependency file into      #  strip the comments and then convert the dependency file into
340      #  two arrays: PNAME, DNAME      #  two arrays: PNAME, DNAME
341      cat $1 | sed -e 's/#.*$//g' \      cat $1 | sed -e 's/#.*$//g' \
342          | 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} }' \
343          > ./.pd_tmp          > ./.pd_tmp
344      source ./.pd_tmp      . ./.pd_tmp
345      rm -f ./.pd_tmp      rm -f ./.pd_tmp
346    
347      echo -n "PNAME = "${}      printf "PNAME = "${}
348  }  }
349    
350    
351  #  Explain usage  #  Explain usage
352  usage()  {  usage()  {
353      echo  cat <<EOF
354      echo "Usage: "$0" [OPTIONS]"  
355      echo "  where [OPTIONS] can be:"  Usage: "$0" [OPTIONS]
356      echo    where [OPTIONS] can be:
357      echo "    -help | --help | -h | --h"  
358      echo "    -nooptfile | --nooptfile"      -help | --help | -h | --h
359      echo "      -optfile NAME | --optfile NAME | -of NAME | --of NAME"            Print this help message and exit.
360      echo "      -optfile=NAME | --optfile=NAME | -of=NAME | --of=NAME"  
361      echo "    -pdepend NAME | --pdepend NAME"      -nooptfile | --nooptfile
362      echo "      -pdepend=NAME | --pdepend=NAME"        -optfile NAME | --optfile NAME | -of NAME | --of NAME
363      echo "    -pdefault NAME | --pdefault NAME"        -optfile=NAME | --optfile=NAME | -of=NAME | --of=NAME
364      echo "      -pdefault=NAME | --pdefault=NAME"            Use "NAME" as the optfile.  By default, an attempt will be
365      echo "    -makefile NAME | -ma NAME"            made to find an appropriate "standard" optfile in the
366      echo "      --makefile=NAME | -ma=NAME"            tools/build_options/ directory.
367      echo "    -platform NAME | --platform NAME | -pl NAME | --pl NAME"  
368      echo "      -platform=NAME | --platform=NAME | -pl=NAME | --pl=NAME"      -pdepend NAME | --pdepend NAME
369      echo "    -rootdir NAME | --rootdir NAME | -rd NAME | --rd NAME"        -pdepend=NAME | --pdepend=NAME
370      echo "      -rootdir=NAME | --rootdir=NAME | -rd=NAME | --rd=NAME"            Get package dependency information from "NAME".
371      echo "    -mods NAME | --mods NAME | -mo NAME | --mo NAME"  
372      echo "      -mods=NAME | --mods=NAME | -mo=NAME | --mo=NAME"      -pdefault NAME | --pdefault NAME
373      echo "    -disable NAME | --disable NAME"        -pdefault=NAME | --pdefault=NAME
374      echo "      -disable=NAME | --disable=NAME"            Get the default package list from "NAME".
375      echo "    -enable NAME | --enable NAME"  
376      echo "      -enable=NAME | --enable=NAME"      -make NAME | -m NAME
377      echo "    -noopt NAME | --noopt NAME"        --make=NAME | -m=NAME
378      echo "      -noopt=NAME | --noopt=NAME"            Use "NAME" for the MAKE program. The default is "make" but
379  #    echo "    -cpp NAME | --cpp NAME"            many platforms, "gmake" is the preferred choice.
380  #    echo "      -cpp=NAME | --cpp=NAME"  
381      echo "    -fortran NAME | --fortran NAME | -fc NAME | --fc NAME"      -makefile NAME | -mf NAME
382      echo "      -fc=NAME | --fc=NAME"        --makefile=NAME | -mf=NAME
383      echo "    -[no]ieee | --[no]ieee"            Call the makefile "NAME".  The default is "Makefile".
384      echo "    -[no]mpi | --[no]mpi"  
385      echo "    -[no]jam | --[no]jam"      -makedepend NAME | -md NAME
386      echo        --makedepend=NAME | -md=NAME
387      echo "  and NAME is a string such as:"            Use "NAME" for the MAKEDEPEND program.
388      echo  
389      echo "    --enable pkg1   --enable 'pkg1 pkg2'   --enable 'pkg1 pkg2 pkg3'"      -rootdir NAME | --rootdir NAME | -rd NAME | --rd NAME
390      echo "    -mods=dir1   -mods='dir1'   -mods='dir1 dir2 dir3'"        -rootdir=NAME | --rootdir=NAME | -rd=NAME | --rd=NAME
391      echo "    -foptim='-Mvect=cachesize:512000,transform -xtypemap=real:64,double:64,integer:32'"            Specify the location of the MITgcm ROOTDIR as "NAME".
392      echo            By default, genamke will try to find the location by
393      echo "  which, depending upon your shell, may need to be single-quoted"            looking in parent directories (up to the 5th parent).
394      echo "  if it contains spaces, dashes, or other special characters."  
395        -mods NAME | --mods NAME | -mo NAME | --mo NAME
396          -mods=NAME | --mods=NAME | -mo=NAME | --mo=NAME
397              Here, "NAME" specifies a list of directories that are
398              used for additional source code.  Files found in the
399              "mods list" are given preference over files of the same
400              name found elsewhere.
401    
402        -disable NAME | --disable NAME
403          -disable=NAME | --disable=NAME
404              Here "NAME" specifies a list of packages that we don't
405              want to use.  If this violates package dependencies,
406              genamke will exit with an error message.
407    
408        -enable NAME | --enable NAME
409          -enable=NAME | --enable=NAME
410              Here "NAME" specifies a list of packages that we wish
411              to specifically enable.  If this violates package
412              dependencies, genamke will exit with an error message.
413    
414        -standarddirs NAME | --standarddirs NAME
415          -standarddirs=NAME | --standarddirs=NAME
416              Here, "NAME" specifies a list of directories to be
417              used as the "standard" code.
418    
419        -fortran NAME | --fortran NAME | -fc NAME | --fc NAME
420          -fc=NAME | --fc=NAME
421              Use "NAME" as the fortran compiler.  By default, genmake
422              will search for a working compiler by trying a list of
423              "usual suspects" such as g77, f77, etc.
424    
425        -[no]ieee | --[no]ieee
426              Do or don't use IEEE numerics.  Note that this option
427              *only* works if it is supported by the OPTFILE that
428              is being used.
429    
430        -mpi | --mpi
431              Include MPI header files and link to MPI libraries
432        -mpi=PATH | --mpi=PATH
433              Include MPI header files and link to MPI libraries using MPI_ROOT
434              set to PATH. i.e. Include files from $PATH/include, link to libraries
435              from $PATH/lib and use binaries from $PATH/bin.
436    
437        -bash NAME
438              Explicitly specify the Bourne or BASH shell to use
439    
440      While it is most often a single word, the "NAME" variables specified
441      above can in many cases be a space-delimited string such as:
442    
443        --enable pkg1   --enable 'pkg1 pkg2'   --enable 'pkg1 pkg2 pkg3'
444        -mods=dir1   -mods='dir1'   -mods='dir1 dir2 dir3'
445        -foptim='-Mvect=cachesize:512000,transform -xtypemap=real:64,double:64,integer:32'
446    
447      which, depending upon your shell, may need to be single-quoted.
448    
449      For more detailed genmake documentation, please see:
450    
451        http://mitgcm.org/devel_HOWTO/
452    
453    EOF
454    
455      exit 1      exit 1
456  }  }
457    
458  # Dump all important state  #  Build a CPP macro to automate calling C routines from FORTRAN
459  dump_state()  {  get_fortran_c_namemangling()  {
460      fname=$1      default_nm="#define FC_NAMEMANGLE(X) X ## _"
461      echo " " > $fname      
462        cat > genmake_test.c <<EOF
463    void tcall( char * string ) { tsub( string ); }
464    EOF
465        $MAKE genmake_test.o >> genmake_warnings 2>&1
466        RETVAL=$?
467        if test "x$RETVAL" != x0 ; then
468            FC_NAMEMANGLE=$default_nm
469            cat <<EOF>> genmake_errors
470    
471    WARNING: C test compile fails
472    WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
473    WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here
474    EOF
475            return 1
476        fi
477        c_tcall=`nm genmake_test.o | grep 'T ' | grep tcall | cut -d ' ' -f 3`
478        RETVAL=$?
479        if test "x$RETVAL" != x0 ; then
480            FC_NAMEMANGLE=$default_nm
481            cat <<EOF>> genmake_warnings
482    
483    WARNING: The "nm" command failed.
484    WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
485    WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here
486    EOF
487            return 1
488        fi
489        cat > genmake_tcomp.f <<EOF
490          subroutine tcall( string )
491          character*(*) string
492          call tsub( string )
493          end
494    EOF
495        $FC $FFLAGS $DEFINES -c genmake_tcomp.f >> genmake_warnings 2>&1
496        RETVAL=$?
497        if test "x$RETVAL" != x0 ; then
498            FC_NAMEMANGLE=$default_nm
499            cat <<EOF>> genmake_warnings
500    
501    WARNING: FORTRAN test compile fails -- please see "genmake_errors"
502    WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
503    WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here.
504    EOF
505            return 1
506        fi
507        f_tcall=`nm genmake_tcomp.o | grep 'T ' | grep tcall | cut -d ' ' -f 3`
508        RETVAL=$?
509        if test "x$RETVAL" != x0 ; then
510            FC_NAMEMANGLE=$default_nm
511            cat <<EOF>> genmake_warnings
512    
513    WARNING: The "nm" command failed.
514    WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
515    WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here.
516    EOF
517            return 1
518        fi
519    
520        c_a=`echo $c_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 1 | sed -e 's|Y||'`
521        f_a=`echo $f_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 1 | sed -e 's|Y||'`
522        c_b=`echo $c_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 2 | sed -e 's|Y||'`
523        f_b=`echo $f_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 2 | sed -e 's|Y||'`
524    
525        nmangle="X"
526        if test "x$c_a" != "x$f_a" ; then
527            comm="echo x$f_a | sed -e 's|x$c_a||'"
528            a=`eval $comm`
529            nmangle="$a ## $nmangle"
530        fi
531        if test "x$c_b" != "x$f_b" ; then
532            comm="echo x$f_b | sed -e 's|x$c_b||'"
533            b=`eval $comm`
534            nmangle="$nmangle ## $b"
535        fi
536    
537        FC_NAMEMANGLE="#define FC_NAMEMANGLE(X)  $nmangle"
538    
539        #  cleanup the testing files
540        rm -f genmake_tcomp.* genmake_test.*
541    }
542    
543    
544    check_HAVE_CLOC()  {
545        get_fortran_c_namemangling
546        cat <<EOF > genmake_tc_1.c
547    $FC_NAMEMANGLE
548    #include <stdio.h>
549    #include <stdlib.h>
550    #include <unistd.h>
551    #include <assert.h>
552    #include <sys/time.h>
553    void FC_NAMEMANGLE(cloc) ( double *curtim )
554    {
555     struct timeval tv1;
556     gettimeofday(&tv1 , (void *)NULL );
557     *curtim =  (double)((tv1.tv_usec)+(tv1.tv_sec)*1.E6);
558     *curtim = *curtim/1.E6;
559    }
560    EOF
561        make genmake_tc_1.o >> genmake_tc.log 2>&1
562        RET_C=$?
563        cat <<EOF > genmake_tc_2.f
564          program hello
565          Real*8 wtime
566          external cloc
567          call cloc(wtime)
568          print *," HELLO WORLD", wtime
569          end program hello
570    EOF
571        $FC $FFLAGS -o genmake_tc genmake_tc_2.f genmake_tc_1.o >> genmake_tc.log 2>&1
572        RET_F=$?
573        test -x ./genmake_tc  &&  ./genmake_tc >> genmake_tc.log 2>&1
574      RETVAL=$?      RETVAL=$?
575      if test "x${RETVAL}" = x ; then      if test "x$RETVAL" = x0 ; then
576          echo "Error: cannot write to $fname"          HAVE_CLOC=t
577          exit 1          DEFINES="$DEFINES -DHAVE_CLOC"
578        fi
579        rm -f genmake_tc*
580    }
581    
582    
583    check_netcdf_libs()  {
584        cat <<EOF > genmake_tnc.for
585          program fgennc
586    #include "netcdf.inc"
587          integer iret, ncid, xid
588          iret = nf_create('genmake_tnc.nc', NF_CLOBBER, ncid)
589          IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
590          iret = nf_def_dim(ncid, 'X', 11, xid)
591          IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
592          iret = nf_close(ncid)
593          IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
594          end
595    EOF
596        $CPP genmake_tnc.for > genmake_tnc.f  \
597            &&  $FC $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.f $LIBS >> genmake_tnc.log 2>&1
598        RET_COMPILE=$?
599        test -x ./genmake_tnc  &&  ./genmake_tnc >> genmake_tnc.log 2>&1
600        RETVAL=$?
601        if test "x$RET_COMPILE" = x0 -a "x$RETVAL" = x0 ; then
602            HAVE_NETCDF=t
603        else
604            # try again with "-lnetcdf" added to the libs
605            $CPP genmake_tnc.for > genmake_tnc.f  \
606                &&  $FC $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.f \
607                $LIBS -lnetcdf >> genmake_tnc_2.log 2>&1
608            RET_COMPILE=$?
609            test -x ./genmake_tnc  &&  ./genmake_tnc >> genmake_tnc.log 2>&1
610            RETVAL=$?
611            if test "x$RET_COMPILE" = x0 -a "x$RETVAL" = x0 ; then
612                LIBS="$LIBS -lnetcdf"
613                HAVE_NETCDF=t
614            else
615                cat genmake_tnc.log >> genmake_warnings
616            fi
617      fi      fi
618      echo "makefile "$makefile > $fname      rm -f genmake_tnc*
619  }  }
620    
621    
622  #eh3 # This is the generic configuration.  
623  #eh3 set LN         = ( 'ln -s' )  ###############################################################################
624  #eh3 set CPP        = ( '/lib/cpp -P' )  #   Sequential part of script starts here
625  #eh3 set S64        = ( '$(TOOLSDIR)/set64bitConst.sh' )  ###############################################################################
 #eh3 set KPP        = (  )  
 #eh3 set FC         = ( 'f77' )  
 #eh3 set LINK       = $FC  
 #eh3 set MAKEDEPEND = ( 'makedepend' )  
 #eh3 set INCLUDES   = ( -I. )  
 #eh3 set FFLAGS     = (  )  
 #eh3 set FOPTIM     = (  )  
 #eh3 set CFLAGS     = (  )  
 #eh3 set KFLAGS1    = (  )  
 #eh3 set KFLAGS2    = (  )  
 #eh3 set LIBS       = (  )  
 #eh3 set KPPFILES   = (  )  
 #eh3 if (! $?NOOPTFILES ) set NOOPTFILES = (  )  
 #eh3 if (! $?NOOPTFLAGS ) set NOOPTFLAGS = (  )  
626    
627  #  Set defaults here  #  Set defaults here
628    COMMANDL="$0 $@"
629    
630  PLATFORM=  PLATFORM=
631  LN=  LN=
632  S64=  S64=
633  KPP=  KPP=
634  FC=  FC=
635    CPP=
636  LINK=  LINK=
637    DEFINES=
638  PACKAGES=  PACKAGES=
639  ENABLE=  ENABLE=
640  DISABLE=  DISABLE=
641  MAKEFILE=  MAKEFILE=
642  MAKEDEPEND=  MAKEDEPEND=
643  PDEPEND=  PDEPEND=
644    DUMPSTATE=t
645  PDEFAULT=  PDEFAULT=
646  OPTFILE=  OPTFILE=
647  INCLUDES="-I."  INCLUDES="-I."
# Line 308  FOPTIM= Line 650  FOPTIM=
650  CFLAGS=  CFLAGS=
651  KFLAGS1=  KFLAGS1=
652  KFLAGS2=  KFLAGS2=
653    #LDADD=
654  LIBS=  LIBS=
655  KPPFILES=  KPPFILES=
656  NOOPTFILES=  NOOPTFILES=
657  NOOPTFLAGS=  NOOPTFLAGS=
658    MPI=
659    MPIPATH=
660    
661    # DEFINES checked by test compilation
662    HAVE_SYSTEM=
663    HAVE_FDATE=
664    FC_NAMEMANGLE=
665    HAVE_CLOC=
666    HAVE_NETCDF=
667    
668  MODS=  MODS=
669  TOOLSDIR=  TOOLSDIR=
670  SOURCEDIRS=  SOURCEDIRS=
671  INCLUDEDIRS=  INCLUDEDIRS=
672    STANDARDDIRS="USE_THE_DEFAULT"
673    
674    G2ARGS=
675    BASH=
676  PWD=`pwd`  PWD=`pwd`
677  MAKE=make  MAKE=make
678    AWK=awk
679  THISHOSTNAME=`hostname`  THISHOSTNAME=`hostname`
680  THISCWD=`pwd`  THISCWD=`pwd`
681  THISDATE=`date`  THISDATE=`date`
682  MACHINE=`uname -a`  MACHINE=`uname -a`
683    EXECUTABLE=
684    EXEHOOK=
685    EXEDIR=
686    PACKAGES_CONF=
687    IEEE=
688    if test "x$MITGCM_IEEE" != x ; then
689        IEEE=$MITGCM_IEEE
690    fi
691    FS=
692    FS90=
693    
694    AUTODIFF_PKG_USED=f
695    AD_OPTFILE=
696    TAF=
697    AD_TAF_FLAGS=
698    FTL_TAF_FLAGS=
699    SVD_TAF_FLAGS=
700    TAF_EXTRA=
701    TAMC=
702    AD_TAMC_FLAGS=
703    FTL_TAF_FLAGS=
704    SVD_TAMC_FLAGS=
705    TAMC_EXTRA=
706    
707    
708    #  The following state can be set directly by command-line switches
709    gm_s1="OPTFILE PDEPEND PDEFAULT MAKEFILE PLATFORM ROOTDIR MODS DISABLE ENABLE"
710    gm_s2="FC CPP IEEE MPI JAM DUMPSTATE STANDARDDIRS"
711    
712    #  The following state is not directly set by command-line switches
713    gm_s3="LN S64 KPP LINK PACKAGES MAKEDEPEND PDEPEND PDEFAULT INCLUDES FFLAGS FOPTIM "
714    gm_s4="CFLAGS KFLAGS1 KFLAGS2 LIBS KPPFILES NOOPTFILES NOOPTFLAGS"
715    gm_s5="TOOLSDIR SOURCEDIRS INCLUDEDIRS PWD MAKE THISHOSTNAME THISDATE MACHINE"
716    gm_s6="EXECUTABLE EXEHOOK EXEDIR PACKAGES_CONF"
717    gm_s7="HAVE_SYSTEM HAVE_FDATE FC_NAMEMANGLE"
718    
719    #  The following are all related to adjoint/tangent-linear stuff
720    gm_s10="AUTODIFF_PKG_USED AD_OPTFILE TAMC TAF AD_TAMC_FLAGS AD_TAF_FLAGS"
721    gm_s11="FTL_TAMC_FLAGS FTL_TAF_FLAGS SVD_TAMC_FLAGS SVD_TAF_FLAGS"
722    gm_s12="TAF_EXTRA TAMC_EXTRA"
723    
724    gm_state="COMMANDL $gm_s1 $gm_s2 $gm_s3 $gm_s4 $gm_s5 $gm_s6 $gm_s7"
725    gm_state="$gm_state $gm_s10 $gm_s11 $gm_s12"
726    
727    cat <<EOF
728    
729    GENMAKE :
730    
731    A program for GENerating MAKEfiles for the MITgcm project.  For a
732    quick list of options, use "genmake -h" or for more detail see:
733    
734      http://mitgcm.org/devel_HOWTO/
735    
736    EOF
737    
 echo  
738  echo "===  Processing options files and arguments  ==="  echo "===  Processing options files and arguments  ==="
739  gm_local="./gm_local"  gm_local="genmake_local"
740  echo -n "  getting local config information:  "  for i in . $MODS ; do
741        if test -r $i/$gm_local ; then
742            . $i/$gm_local
743            break
744        fi
745    done
746    printf "  getting local config information:  "
747  if test -e $gm_local ; then  if test -e $gm_local ; then
748      echo "using $gm_local"      echo "using $gm_local"
749      source $gm_local      . $gm_local
750      # echo "DISABLE=$DISABLE"      # echo "DISABLE=$DISABLE"
751      # echo "ENABLE=$ENABLE"      # echo "ENABLE=$ENABLE"
752  else  else
# Line 349  fi Line 764  fi
764  #   n=$(( $n + 1 ))  #   n=$(( $n + 1 ))
765  #done  #done
766  #parse_options  #parse_options
   
767  ac_prev=  ac_prev=
768  for ac_option ; do  for ac_option ; do
769    
770        G2ARGS="$G2ARGS \"$ac_option\""
771    
772      # If the previous option needs an argument, assign it.      # If the previous option needs an argument, assign it.
773      if test -n "$ac_prev"; then      if test -n "$ac_prev"; then
774          eval "$ac_prev=\$ac_option"          eval "$ac_prev=\$ac_option"
# Line 370  for ac_option ; do Line 786  for ac_option ; do
786          -nooptfile | --nooptfile)          -nooptfile | --nooptfile)
787              OPTFILE="NONE" ;;              OPTFILE="NONE" ;;
788          -optfile | --optfile | -of | --of)          -optfile | --optfile | -of | --of)
789              ac_prev=optfile ;;              ac_prev=OPTFILE ;;
790          -optfile=* | --optfile=* | -of=* | --of=*)          -optfile=* | --optfile=* | -of=* | --of=*)
791              OPTFILE=$ac_optarg ;;              OPTFILE=$ac_optarg ;;
792                    
793            -adoptfile | --adoptfile | -adof | --adof)
794                ac_prev=AD_OPTFILE ;;
795            -adoptfile=* | --adoptfile=* | -adof=* | --adof=*)
796                AD_OPTFILE=$ac_optarg ;;
797            
798          -pdepend | --pdepend)          -pdepend | --pdepend)
799              ac_prev=pdepend ;;              ac_prev=PDEPEND ;;
800          -pdepend=* | --pdepend=*)          -pdepend=* | --pdepend=*)
801              PDEPEND=$ac_optarg ;;              PDEPEND=$ac_optarg ;;
802                    
803          -pdefault | --pdefault)          -pdefault | --pdefault)
804              ac_prev=pdefault ;;              ac_prev=PDEFAULT ;;
805          -pdefault=* | --pdefault=*)          -pdefault=* | --pdefault=*)
806              PDEFAULT=$ac_optarg ;;              PDEFAULT=$ac_optarg ;;
807                    
808          -makefile | -ma)          -make | --make | -m | --m)
809              ac_prev=makefile ;;              ac_prev=MAKE ;;
810          --makefile=* | -ma=*)          -make=* | --make=* | -m=* | --m=*)
811                MAKE=$ac_optarg ;;
812            
813            -bash | --bash)
814                ac_prev=BASH ;;
815            -bash=* | --bash=*)
816                BASH=$ac_optarg ;;
817            
818            -makedepend | --makedepend | -md | --md)
819                ac_prev=MAKEDEPEND ;;
820            -makedepend=* | --makedepend=* | -md=* | --md=*)
821                MAKEDEPEND=$ac_optarg ;;
822            
823            -makefile | --makefile | -ma | --ma)
824                ac_prev=MAKEFILE ;;
825            -makefile=* | --makefile=* | -ma=* | --ma=*)
826              MAKEFILE=$ac_optarg ;;              MAKEFILE=$ac_optarg ;;
827                    
828          -platform | --platform | -pl | --pl)          -platform | --platform | -pl | --pl | -platform=* | --platform=* | -pl=* | --pl=*)
829              ac_prev=platform ;;              echo "ERROR: The platform option has been removed.  Please specify"
830          -platform=* | --platform=* | -pl=* | --pl=*)              echo "  the build options using the \"optfile\" mechanism."
831              PLATFORM=$ac_optarg ;;              echo
832                usage
833                ;;
834                    
835          -rootdir | --rootdir | -rd | --rd)          -rootdir | --rootdir | -rd | --rd)
836              ac_prev=rootdir ;;              ac_prev=ROOTDIR ;;
837          -rootdir=* | --rootdir=* | -rd=* | --rd=*)          -rootdir=* | --rootdir=* | -rd=* | --rd=*)
838              ROOTDIR=$ac_optarg ;;              ROOTDIR=$ac_optarg ;;
839                    
840          -mods | --mods | -mo | --mo)          -mods | --mods | -mo | --mo)
841              ac_prev=mods ;;              ac_prev=MODS ;;
842          -mods=* | --mods=* | -mo=* | --mo=*)          -mods=* | --mods=* | -mo=* | --mo=*)
843              MODS=$ac_optarg ;;              MODS=$ac_optarg ;;
844                    
845          -disable | --disable)          -disable | --disable)
846              ac_prev=disable ;;              ac_prev=DISABLE ;;
847          -disable=* | --disable=*)          -disable=* | --disable=*)
848              DISABLE=$ac_optarg ;;              DISABLE=$ac_optarg ;;
849                    
850          -enable | --enable)          -enable | --enable)
851              ac_prev=enable ;;              ac_prev=ENABLE ;;
852          -enable=* | --enable=*)          -enable=* | --enable=*)
853              ENABLE=$ac_optarg ;;              ENABLE=$ac_optarg ;;
854                    
855          -noopt | --noopt)          -standarddirs | --standarddirs)
856              ac_prev=noopt ;;              ac_prev=STANDARDDIRS ;;
857          -noopt=* | --noopt=*)          -standarddirs=* | --standarddirs=*)
858              NOOPT=$ac_optarg ;;              STANDARDDIRS=$ac_optarg ;;
859            
860  #           -cpp | --cpp)  #           -cpp | --cpp)
861  #               ac_prev=cpp ;;  #               ac_prev=cpp ;;
862  #           -cpp=* | --cpp=*)  #           -cpp=* | --cpp=*)
863  #               CPP=$ac_optarg ;;  #               CPP=$ac_optarg ;;
864                            
865          -fortran | --fortran | -fc | --fc)          -fortran | --fortran | -fc | --fc)
866              ac_prev=fc ;;              ac_prev=FC ;;
867          -fc=* | --fc=*)          -fc=* | --fc=*)
868              FC=$ac_optarg ;;              FC=$ac_optarg ;;
869                    
870            -fs | --fs)
871                ac_prev=FS ;;
872            -fs=* | --fs=*)
873                FS=$ac_optarg ;;
874            
875            -fs90 | --fs90)
876                ac_prev=FS90 ;;
877            -fs90=* | --fs90=*)
878                FS90=$ac_optarg ;;
879            
880          -ieee | --ieee)          -ieee | --ieee)
881              IEEE=1 ;;              IEEE=true ;;
882          -noieee | --noieee)          -noieee | --noieee)
883              IEEE=0 ;;              IEEE= ;;
884            
885          -mpi | --mpi)          -mpi | --mpi)
886              MPI=1 ;;              MPI=true ;;
887          -nompi | --nompi)          -mpi=* | --mpi=*)
888              MPI=0 ;;              MPIPATH=$ac_optarg
889                        MPI=true ;;
890          -jam | --jam)          
891              JAM=1 ;;  #       -jam | --jam)
892          -nojam | --nojam)  #           JAM=1 ;;
893              JAM=0 ;;  #       -nojam | --nojam)
894            #           JAM=0 ;;
895            
896            -ds | --ds)
897                DUMPSTATE=t ;;
898            
899            -taf_extra | --taf_extra)
900                ac_prev=TAF_EXTRA ;;
901            -taf_extra=* | --taf_extra=*)
902                TAF_EXTRA=$ac_optarg ;;
903    
904            -tamc_extra | --tamc_extra)
905                ac_prev=TAMC_EXTRA ;;
906            -tamc_extra=* | --tamc_extra=*)
907                TAMC_EXTRA=$ac_optarg ;;
908    
909          -*)          -*)
910              echo "Error: unrecognized option: "$ac_option              echo "Error: unrecognized option: "$ac_option
911              usage              usage
# Line 458  for ac_option ; do Line 920  for ac_option ; do
920            
921  done  done
922    
923    if test -f ./.genmakerc ; then
924        echo
925        echo "WARNING: genmake2 has detected a copy of the old-style \"./.genmakerc\""
926        echo "  file.  This file format is no longer supported.  Please see:"
927        echo
928        echo "    http://mitgcm.org/devel_HOWTO/"
929        echo
930        echo "  for directions on how to setup and use the new \"genmake2\" input"
931        echo "  files and send an email to MITgcm-support@mitgcm.org if you want help."
932        echo
933    fi
934    
935    if test "x${ROOTDIR}" = x ; then
936        if test "${PWD##/*/}" = "bin" -a -d ../model -a -d ../eesup -a -d ../pkg ; then
937            ROOTDIR=".."
938        else
939            for d in . .. ../.. ../../.. ../../../.. ../../../../.. ; do
940                if [ -d "$d/model" -a -d "$d/eesupp" -a -d "$d/pkg" ]; then
941                    ROOTDIR=$d
942                    printf "Warning:  ROOTDIR was not specified but there appears to be"
943                    echo " a copy of MITgcm at \"$ROOTDIR\" so we'll try it."
944                    break
945                fi
946            done
947        fi
948    fi
949    if test "x${ROOTDIR}" = x ; then
950        echo "Error: Cannot determine ROOTDIR for MITgcm code."
951        echo "  Please specify a ROOTDIR using either an options "
952        echo "  file or a command-line option."
953        exit 1
954    fi
955    if test ! -d ${ROOTDIR} ; then
956        echo "Error: the specified ROOTDIR (\"$ROOTDIR\") does not exist!"
957        exit 1
958    fi
959    
960  echo "  getting OPTFILE information:  "  echo "  getting OPTFILE information:  "
961  if test "x${OPTFILE}" = x ; then  if test "x${OPTFILE}" = x ; then
962      echo "Warning: no OPTFILE specified so we'll look for possible settings"      if test "x$MITGCM_OF" = x ; then
963      printf "\n===  Searching for possible settings for OPTFILE  ===\n"          echo "Warning: no OPTFILE specified so we'll look for possible settings"
964      find_possible_configs          printf "\n===  Searching for possible settings for OPTFILE  ===\n"
965  else          find_possible_configs
     if test "x$OPTFILE" = xNONE ; then  
         echo "    OPTFILE=NONE so we'll try to use default settings"  
966      else      else
967          if test -f "$OPTFILE" -a -r "$OPTFILE" ; then          OPTFILE=$MITGCM_OF
968              echo "    using OPTFILE=\"$OPTFILE\""      fi
969              source "$OPTFILE"  fi
970              RETVAL=$?  if test "x$OPTFILE" != xNONE ; then
971              if test "x$RETVAL" != x0 ; then      if test -f "$OPTFILE" -a -r "$OPTFILE" ; then
972                  echo -n "Error: failed to source OPTFILE \"$OPTFILE\""          echo "    using OPTFILE=\"$OPTFILE\""
973                  echo "--please check that variable syntax is bash-compatible"          . "$OPTFILE"
974                  exit 1          RETVAL=$?
975              fi          if test "x$RETVAL" != x0 ; then
976          else              printf "Error: failed to source OPTFILE \"$OPTFILE\""
977              echo "Error: can't read OPTFILE=\"$OPTFILE\""              echo "--please check that variable syntax is bash-compatible"
978                exit 1
979            fi
980            if test "x$DUMPSTATE" != xf ; then
981                cp -f $OPTFILE "genmake_optfile"
982            fi
983        else
984            echo "Error: can't read OPTFILE=\"$OPTFILE\""
985            exit 1
986        fi
987    fi
988    
989    #  Check for broken systems that cannot correctly distinguish *.F and *.f files
990    check_for_broken_Ff
991    
992    echo "  getting AD_OPTFILE information:  "
993    if test "x${AD_OPTFILE}" = x ; then
994        if test "x$MITGCM_AD_OF" = x ; then
995            AD_OPTFILE=$ROOTDIR/tools/adjoint_options/adjoint_default
996        else
997            AD_OPTFILE=$MITGCM_AD_OF
998        fi
999    fi
1000    if test "x${AD_OPTFILE}" != xNONE ; then
1001        if test -f "$AD_OPTFILE" -a -r "$AD_OPTFILE" ; then
1002            echo "    using AD_OPTFILE=\"$AD_OPTFILE\""
1003            . "$AD_OPTFILE"
1004            RETVAL=$?
1005            if test "x$RETVAL" != x0 ; then
1006                printf "Error: failed to source AD_OPTFILE \"$AD_OPTFILE\""
1007                echo "--please check that variable syntax is bash-compatible"
1008              exit 1              exit 1
1009          fi          fi
1010            if test "x$DUMPSTATE" != xf ; then
1011                cp -f $AD_OPTFILE "genmake_ad_optfile"
1012            fi
1013        else
1014            echo "Error: can't read AD_OPTFILE=\"$AD_OPTFILE\""
1015            exit 1
1016      fi      fi
1017  fi  fi
1018    
1019    #  Check that FC, LINK, CPP, S64, LN, and MAKE are defined.  If not,
1020    #  either set defaults or complain and abort!
1021    if test ! "x$BASH" = x ; then
1022        # add a trailing space so that it works within the Makefile syntax (see below)
1023        BASH="$BASH "
1024    fi
1025    if test "x$FC" = x ; then
1026        cat <<EOF 1>&2
1027    
1028    Error: no Fortran compiler: please specify using one of the following:
1029      1) within the options file ("FC=...") as specified by "-of=OPTFILE"
1030      2) the "-fc=XXX" command-line option
1031      3) the "./genmake_local" file
1032    EOF
1033        exit 1
1034    fi
1035    if test "x$LINK" = x ; then
1036        LINK=$FC
1037    fi
1038    if test "x$MAKE" = x ; then
1039        MAKE="make"
1040    fi
1041    if test "x$CPP" = x ; then
1042        CPP=cpp
1043    fi
1044    #EH3 === UGLY ===
1045    #  The following is an ugly little hack to check for $CPP in /lib/ and
1046    #  it should eventually be replaced with a more general function that
1047    #  searches a combo of the user's path and a list of "usual suspects"
1048    #  to find the correct location for binaries such as $CPP.
1049    for i in " " "/lib/" ; do
1050        echo "#define A a" | $i$CPP > test_cpp 2>&1 && CPP=$i$CPP
1051    done
1052    #EH3 === UGLY ===
1053    echo "#define A a" | $CPP > test_cpp 2>&1
1054    RETVAL=$?
1055    if test "x$RETVAL" != x0 ; then
1056        cat <<EOF 1>&2
1057    
1058    Error: C pre-processor "$CPP" failed the test case: please specify using:
1059    
1060      1) within the options file ("CPP=...") as specified by "-of=OPTFILE"
1061      2) the "./genmake_local" file
1062      3) with the CPP environment variable
1063    
1064    EOF
1065        exit 1
1066    else
1067        rm -f test_cpp
1068    fi
1069    if test "x$MAKEDEPEND" = x ; then
1070        MAKEDEPEND=makedepend
1071    fi
1072    if test "x$LN" = x ; then
1073        LN="ln -s"
1074    fi
1075    echo "test" > genmake_test_ln
1076    $LN genmake_test_ln genmake_tlink
1077    RETVAL=$?
1078    if test "x$RETVAL" != x0 ; then
1079        cat <<EOF 1>&2
1080    
1081    Error: The command "ln -s" failed -- please specify a working soft-link
1082      command in the optfile.
1083    
1084    EOF
1085        exit 1
1086    fi
1087    rm -f genmake_test_ln genmake_tlink
1088    
1089    if test ! "x$MPI" = x ; then
1090          echo "  Turning on MPI cpp macros"
1091          DEFINES="$DEFINES -DALLOW_USE_MPI -DALWAYS_USE_MPI"
1092    fi
1093    
1094    printf "\n===  Checking system libraries  ===\n"
1095    printf "  Do we have the system() command using $FC...  "
1096    cat > genmake_tcomp.f <<EOF
1097          program hello
1098          call system('echo hi')
1099          end
1100    EOF
1101    $FC $FFLAGS $DEFINES -o genmake_tcomp genmake_tcomp.f > genmake_tcomp.log 2>&1
1102    RETVAL=$?
1103    if test "x$RETVAL" = x0 ; then
1104        HAVE_SYSTEM=t
1105        DEFINES="$DEFINES -DHAVE_SYSTEM"
1106        echo "yes"
1107    else
1108        HAVE_SYSTEM=
1109        echo "no"
1110    fi
1111    rm -f genmake_tcomp*
1112    
1113    printf "  Do we have the fdate() command using $FC...  "
1114    cat > genmake_tcomp.f <<EOF
1115          program hello
1116          CHARACTER(128) string
1117          string = ' '
1118          call fdate( string )
1119          print *, string
1120          end
1121    EOF
1122    $FC $FFLAGS $DEFINES -o genmake_tcomp genmake_tcomp.f > genmake_tcomp.log 2>&1
1123    RETVAL=$?
1124    if test "x$RETVAL" = x0 ; then
1125        HAVE_FDATE=t
1126        DEFINES="$DEFINES -DHAVE_FDATE"
1127        echo "yes"
1128    else
1129        HAVE_FDATE=
1130        echo "no"
1131    fi
1132    rm -f genmake_tcomp*
1133    
1134    printf "  Can we call simple C routines (here, \"cloc()\") using $FC...  "
1135    check_HAVE_CLOC
1136    if test "x$HAVE_CLOC" != x ; then
1137        echo "yes"
1138    else
1139        echo "no"
1140    fi
1141    rm -f genmake_t*
1142    
1143    printf "  Can we create NetCDF-enabled binaries...  "
1144    check_netcdf_libs
1145    if test "x$HAVE_NETCDF" != x ; then
1146        echo "yes"
1147    else
1148        echo "no"
1149    fi
1150    
1151    
1152  printf "\n===  Setting defaults  ===\n"  printf "\n===  Setting defaults  ===\n"
1153  echo -n "  Adding MODS directories:  "  printf "  Adding MODS directories:  "
1154  for d in $MODS ; do  for d in $MODS ; do
1155      if test ! -d $d ; then      if test ! -d $d ; then
1156          echo          echo
1157          echo "Error: MODS directory \"$d\" not found!"          echo "Error: MODS directory \"$d\" not found!"
1158          exit 1          exit 1
1159      else      else
1160          echo -n " $d"          printf " $d"
1161          SOURCEDIRS="$SOURCEDIRS $d"          SOURCEDIRS="$SOURCEDIRS $d"
1162          INCLUDEDIRS="$INCLUDEDIRS $d"          INCLUDEDIRS="$INCLUDEDIRS $d"
1163      fi      fi
# Line 505  if test "x${PLATFORM}" = x ; then Line 1171  if test "x${PLATFORM}" = x ; then
1171      PLATFORM=$p_PLATFORM      PLATFORM=$p_PLATFORM
1172  fi  fi
1173    
 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  
   
1174  if test "x${EXEDIR}" = x ; then  if test "x${EXEDIR}" = x ; then
1175      if test "${PWD##/*/}" = "bin" -a -d ../exe -a $ROOTDIR = .. ; then      if test "${PWD##/*/}" = "bin" -a -d ../exe -a $ROOTDIR = .. ; then
1176          EXEDIR=../exe          EXEDIR=../exe
# Line 546  if test "x${TOOLSDIR}" = x ; then Line 1187  if test "x${TOOLSDIR}" = x ; then
1187      TOOLSDIR="$ROOTDIR/tools"      TOOLSDIR="$ROOTDIR/tools"
1188  fi  fi
1189  if test ! -d ${TOOLSDIR} ; then  if test ! -d ${TOOLSDIR} ; then
1190      echo "Error: the specified $TOOLSDIR (\"$TOOLSDIR\") does not exist!"      echo "Error: the specified TOOLSDIR (\"$TOOLSDIR\") does not exist!"
1191      exit 1      exit 1
1192  fi  fi
1193    if test "x$S64" = x ; then
1194        S64='$(TOOLSDIR)/set64bitConst.sh'
1195    fi
1196    THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`
1197    
1198  EXECUTABLE=${EXECUTABLE:-mitgcmuv}  EXECUTABLE=${EXECUTABLE:-mitgcmuv}
1199    
# Line 557  EXECUTABLE=${EXECUTABLE:-mitgcmuv} Line 1202  EXECUTABLE=${EXECUTABLE:-mitgcmuv}
1202  #  they appear as regular source code  #  they appear as regular source code
1203  if test -r $ROOTDIR"/eesupp/src/Makefile" ; then  if test -r $ROOTDIR"/eesupp/src/Makefile" ; then
1204      echo "  Making source files in eesupp from templates"      echo "  Making source files in eesupp from templates"
1205      $MAKE -C $ROOTDIR"/eesupp/src/" > make_eesupp.errors 2>&1      ( cd $ROOTDIR"/eesupp/src/" && $MAKE ) > make_eesupp.errors 2>&1
1206      RETVAL=$?      RETVAL=$?
1207      if test "x${RETVAL}" = x0 ; then      if test "x${RETVAL}" = x0 ; then
1208          rm -f make_eesupp.errors          rm -f make_eesupp.errors
1209      else      else
1210          echo "Error: problem encountered while building source files in eesupp:"          echo "Error: problem encountered while building source files in eesupp:"
1211          cat make_eesupp.errors          cat make_eesupp.errors 1>&2
1212          exit 1          exit 1
1213      fi      fi
1214  fi  fi
1215    
1216    #same for exch2
1217    if test -r $ROOTDIR"/pkg/exch2/Makefile" ; then
1218        echo "  Making source files in exch2 from  templates"
1219        ( cd $ROOTDIR"/pkg/exch2/" && $MAKE ) > make_exch2.errors 2>&1
1220        RETVAL=$?
1221        if test "x${RETVAL}" = x0 ; then
1222            rm -f make_exch2.errors
1223        else
1224            echo "Error: problem encountered while building source files in exch2:"
1225            cat make_exch2.errors 1>&2
1226            exit 1
1227        fi
1228    fi
1229    
1230  printf "\n===  Determining package settings  ===\n"  printf "\n===  Determining package settings  ===\n"
1231  if  test "x${PDEPEND}" = x ; then  if  test "x${PDEPEND}" = x ; then
1232      tmp=$ROOTDIR"/pkg/pkg_depend"      tmp=$ROOTDIR"/pkg/pkg_depend"
# Line 587  echo "  getting package dependency info Line 1246  echo "  getting package dependency info
1246  #  Strip the comments and then convert the dependency file into  #  Strip the comments and then convert the dependency file into
1247  #  two arrays: PNAME, DNAME  #  two arrays: PNAME, DNAME
1248  cat $PDEPEND | sed -e 's/#.*$//g' \  cat $PDEPEND | sed -e 's/#.*$//g' \
1249      | 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}' \
1250      > ./.pd_tmp      > ./.pd_tmp
1251  RETVAL=$?  RETVAL=$?
1252  if test ! "x${RETVAL}" = x0 ; then  if test ! "x${RETVAL}" = x0 ; then
1253      echo "Error: unable to parse package dependencies -- please check PDEPEND=\"$PDEPEND\""      echo "Error: unable to parse package dependencies -- please check PDEPEND=\"$PDEPEND\""
1254      exit 1      exit 1
1255  fi  fi
1256  source ./.pd_tmp  . ./.pd_tmp
1257  rm -f ./.pd_tmp  rm -f ./.pd_tmp
1258    
1259  echo  -n "  checking default package list:  "  #  Search for default packages.  Note that a "$ROOTDIR/pkg/pkg_groups"
1260    #  file should eventually be added so that, for convenience, one can
1261    #  specify groups of packages using names like "ocean" and "atmosphere".
1262    echo "  checking default package list:  "
1263    if test "x${PDEFAULT}" = x ; then
1264        for i in "." $MODS ; do
1265            if test -r $i"/packages.conf" ; then
1266                    PDEFAULT=$i"/packages.conf"
1267                    break
1268            fi
1269        done
1270    fi
1271  if test "x${PDEFAULT}" = x ; then  if test "x${PDEFAULT}" = x ; then
1272      PDEFAULT="$ROOTDIR/pkg/pkg_default"      PDEFAULT="$ROOTDIR/pkg/pkg_default"
1273  fi  fi
1274  if test "x${PDEFAULT}" = xNONE ; then  if test "x${PDEFAULT}" = xNONE ; then
1275      echo "default packages file disabled"      echo "    default packages file disabled"
1276  else  else
1277      if test ! -r $PDEFAULT ; then      if test ! -r $PDEFAULT ; then
         echo ""  
1278          echo "Warning:  can't read default packages from PDEFAULT=\"$PDEFAULT\""          echo "Warning:  can't read default packages from PDEFAULT=\"$PDEFAULT\""
1279      else      else
1280          echo "  using PDEFAULT=\"$PDEFAULT\""          echo "    using PDEFAULT=\"$PDEFAULT\""
1281          #  Strip the comments and add all the names          #  Strip the comments and add all the names
1282          def=`cat $PDEFAULT | sed -e 's/#.*$//g' | awk '(NF>0){print $0}'`          def=`cat $PDEFAULT | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
1283          RETVAL=$?          RETVAL=$?
1284          if test "x${RETVAL}" != x0 ; then          if test "x${RETVAL}" != x0 ; then
1285              echo -n "Error: can't parse default package list "              printf "Error: can't parse default package list "
1286              echo "-- please check PDEFAULT=\"$PDEFAULT\""              echo "-- please check PDEFAULT=\"$PDEFAULT\""
1287              exit 1              exit 1
1288          fi          fi
1289          for i in $def ; do          for i in $def ; do
1290              PACKAGES="$PACKAGES $i"              PACKAGES="$PACKAGES $i"
1291          done          done
1292          echo "    packages are:  $PACKAGES"          echo "    before group expansion packages are: $PACKAGES"
1293            while ! expand_pkg_groups; do echo > /dev/null; done
1294            echo "    after group expansion packages are:  $PACKAGES"
1295      fi      fi
1296  fi  fi
1297    
1298  echo "  applying DISABLE settings"  echo "  applying DISABLE settings"
1299    for i in $PACKAGES ; do
1300        echo $i >> ./.tmp_pack
1301    done
1302    for i in `grep  "-" ./.tmp_pack` ; do
1303        j=`echo $i | sed 's/[-]//'`
1304        DISABLE="$DISABLE $j"
1305    done
1306  pack=  pack=
1307  for p in $PACKAGES ; do  for p in $PACKAGES ; do
1308      addit="t"      addit="t"
# Line 639  for p in $PACKAGES ; do Line 1317  for p in $PACKAGES ; do
1317  done  done
1318  PACKAGES="$pack"  PACKAGES="$pack"
1319  echo "  applying ENABLE settings"  echo "  applying ENABLE settings"
1320  rm -f ./.tmp_pack  echo "" > ./.tmp_pack
1321  PACKAGES="$PACKAGES $ENABLE"  PACKAGES="$PACKAGES $ENABLE"
1322    # Test if each explicitly referenced package exists
1323  for i in $PACKAGES ; do  for i in $PACKAGES ; do
1324      if test ! -d "$ROOTDIR/pkg/$i" ; then      j=`echo $i | sed 's/[-+]//'`
1325        if test ! -d "$ROOTDIR/pkg/$j" ; then
1326          echo "Error: can't find package $i at \"$ROOTDIR/pkg/$i\""          echo "Error: can't find package $i at \"$ROOTDIR/pkg/$i\""
1327          exit 1          exit 1
1328      fi      fi
1329      echo $i >> ./.tmp_pack      echo $i >> ./.tmp_pack
1330  done  done
 pack=`cat ./.tmp_pack | sort | uniq`  
 rm -f ./.tmp_pack  
1331  PACKAGES=  PACKAGES=
1332  for i in $pack ; do  for i in `grep -v "-" ./.tmp_pack | sort | uniq` ; do
1333      PACKAGES="$PACKAGES $i"      PACKAGES="$PACKAGES $i"
1334  done  done
1335    rm -f ./.tmp_pack
1336  echo "    packages are:  $PACKAGES"  echo "    packages are:  $PACKAGES"
1337    
1338  echo "  applying package dependency rules"  echo "  applying package dependency rules"
# Line 730  for i in $PACKAGES ; do Line 1409  for i in $PACKAGES ; do
1409      if test -d $adr ; then      if test -d $adr ; then
1410          SOURCEDIRS="$SOURCEDIRS $adr"          SOURCEDIRS="$SOURCEDIRS $adr"
1411          INCLUDEDIRS="$INCLUDEDIRS $adr"          INCLUDEDIRS="$INCLUDEDIRS $adr"
1412            if test "x$i" = xautodiff ; then
1413                AUTODIFF_PKG_USED=t
1414            fi
1415      else      else
1416          echo "Error: the directory \"$adr\" for package $i doesn't exist"          echo "Error: the directory \"$adr\" for package $i doesn't exist"
1417          exit 1          exit 1
1418      fi      fi
1419  done  done
1420    
1421  #  This is compatible with the old genmake.  The "DISABLE_*" flags  #  Build MNC templates and check for ability to build and use NetCDF
1422  #  need to be replaced by the "ALLOW_*" flags set below.  echo $PACKAGES | grep ' mnc ' > /dev/null 2>&1
1423  #  RETVAL=$?
1424  # echo -n "  Setting package-specific CPP flags:  "  if test "x$RETVAL" = x0 ; then
1425  # pkrm=( mom_fluxform mom_vecinv generic_advdiff )      ( cd $ROOTDIR"/pkg/mnc" && $MAKE templates ) > make_mnc.errors 2>&1
1426  # pkrmdef=( -DDISABLE_MOM_FLUXFORM -DDISABLE_MOM_VECINV -DDISABLE_GENERIC_ADVDIFF -DDISABLE_DEBUGMODE )      RETVAL=$?
1427  # echo -n "  "      if test "x${RETVAL}" = x0 ; then
1428  # i=0          rm -f make_mnc.errors
1429  # while test $i -lt "${#pkrm[@]}" ; do      else
1430  #     echo "$PACKAGES" | grep "${pk[$i]}" > /dev/null 2>&1          echo "Error: problem encountered while building source files in pkg/mnc:"
1431  #     RETVAL=$?          cat make_mnc.errors 1>&2
1432  #     if test "x$RETVAL" = x1 ; then          exit 1
1433  #       DEFINES="$DEFINES ${pkdef[$i]}"      fi
1434  #       echo -n " ${pkdef[$i]}"      if test "x$HAVE_NETCDF" != xt ; then
1435  #     fi          cat <<EOF
 #     i=$(( $i + 1 ))  
 # done  
 # echo  
1436    
1437  echo "  Setting package-specific CPP flags in CPP_OPTIONS.h:"  WARNING: the "mnc" package has been enabled but tests failed to
1438  CPP_OPTIONS=    compile and/or execute NetCDF applications.  Please check that:
1439  spaths="$SOURCEDIRS"  
1440  for i in $spaths ; do    1) NetCDF is installed for your compiler and
1441      try="$i/CPP_OPTIONS.h"    2) the LIBS variable (within the 'optfile") specifies the correct
1442      #  echo -n "    trying $try : "         NetCDF library to link against.
1443      if test -f $try -a -r $try ; then    
1444          echo "    found CPP_OPTIONS=\"$try\""  EOF
         CPP_OPTIONS="$try"  
         if test "x$i" != "x." ; then  
             cp -f $CPP_OPTIONS .  
         fi  
         break  
1445      fi      fi
 done  
 if test "x$CPP_OPTIONS" = x ; then  
     echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"  
     exit 1  
1446  fi  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.  
1447    
1448  C  Packages disabled by genmake:  # Create a list of #define and #undef to enable/disable packages
1449  EOF  PACKAGES_DOT_H=PACKAGES_CONFIG.h
1450  #  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
1451  #  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
1452  #  file would eventually be split up so that all package-related #define  #  file would eventually be split up so that all package-related #define
1453  #  statements could be separated and handled only by genmake.  #  statements could be separated and handled only by genmake.
1454  names=`ls -1 "$ROOTDIR/pkg"`  names=`ls -1 "$ROOTDIR/pkg"`
1455  all_pack=  all_pack=
1456    DISABLED_PACKAGES=
1457  for n in $names ; do  for n in $names ; do
1458      if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then      if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
1459          has_pack="f"          has_pack="f"
# Line 807  for n in $names ; do Line 1464  for n in $names ; do
1464              fi              fi
1465          done          done
1466          if test "x$has_pack" = xf ; then          if test "x$has_pack" = xf ; then
1467              undef=`echo "ALLOW_$n" | awk '{print toupper($0)}'`              undef=`echo "ALLOW_$n" | $AWK '{print toupper($0)}'`
1468              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!!!  
   
1469          fi          fi
1470      fi      fi
1471  done  done
1472  cat <<EOF >>CPP_OPTIONS.h.tmp  ENABLED_PACKAGES=
   
 C  Packages enabled by genmake:  
 EOF  
1473  for i in $PACKAGES ; do  for i in $PACKAGES ; do
1474      def=`echo "ALLOW_$i" | awk '{print toupper($0)}'`      def=`echo "ALLOW_$i" | $AWK '{print toupper($0)}'`
1475      echo "#define $def" >> CPP_OPTIONS.h.tmp      ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
1476    #eh3 DEFINES="$DEFINES -D$def"
1477    
1478  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!
1479      case $i in      case $i in
1480          aim_v23)          aim_v23)
1481              echo "#define   ALLOW_AIM" >> CPP_OPTIONS.h.tmp              ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
1482                echo "Warning: ALLOW_AIM is set to enable aim_v23."
1483              ;;              ;;
1484      esac      esac
1485  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!
1486    
1487  done  done
 mv -f CPP_OPTIONS.h.tmp CPP_OPTIONS.h  
1488    
1489  echo "  Adding STANDARDDIRS"  echo "  Adding STANDARDDIRS"
1490  BUILDDIR=${BUILDDIR:-.}  BUILDDIR=${BUILDDIR:-.}
1491  STANDARDDIRS=${STANDARDDIRS:-"eesupp model"}  if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
1492  for d in $STANDARDDIRS ; do      STANDARDDIRS="eesupp model"
1493      adr="$ROOTDIR/$d/src"  fi
1494      if test ! -d $adr ; then  if test "x$STANDARDDIRS" != x ; then
1495          echo "Error:  directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""      for d in $STANDARDDIRS ; do
1496          echo "  is correct and that you correctly specified the STANDARDDIRS option"          adr="$ROOTDIR/$d/src"
1497          exit 1          if test ! -d $adr ; then
1498      else              echo "Error:  directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1499          SOURCEDIRS="$SOURCEDIRS $adr"              echo "  is correct and that you correctly specified the STANDARDDIRS option"
1500      fi              exit 1
1501      adr="$ROOTDIR/$d/inc"          else
1502      if test ! -d $adr ; then              SOURCEDIRS="$SOURCEDIRS $adr"
1503          echo "Error:  directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""          fi
1504          echo "  is correct and that you correctly specified the STANDARDDIRS option"          adr="$ROOTDIR/$d/inc"
1505          exit 1          if test ! -d $adr ; then
1506      else              echo "Error:  directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1507          INCLUDEDIRS="$INCLUDEDIRS $adr"              echo "  is correct and that you correctly specified the STANDARDDIRS option"
1508                exit 1
1509            else
1510                INCLUDEDIRS="$INCLUDEDIRS $adr"
1511            fi
1512        done
1513    fi
1514    
1515    echo "  Searching for *OPTIONS.h files in order to warn about the presence"
1516    echo "    of \"#define \"-type statements that are no longer allowed:"
1517    CPP_OPTIONS=
1518    CPP_EEOPTIONS=
1519    spaths=". $INCLUDEDIRS"
1520    names=`ls -1 "$ROOTDIR/pkg"`
1521    for i in $spaths ; do
1522        try="$i/CPP_OPTIONS.h"
1523        if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
1524            echo "    found CPP_OPTIONS=\"$try\""
1525            CPP_OPTIONS="$try"
1526            # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
1527            for n in $names ; do
1528                test_for_package_in_cpp_options $CPP_OPTIONS $n
1529            done
1530        fi
1531        try="$i/CPP_EEOPTIONS.h"
1532        if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
1533            echo "    found CPP_EEOPTIONS=\"$try\""
1534            # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
1535    #**** not yet enabled ****
1536    #        test_for_mpi_in_cpp_eeoptions $try
1537    #**** not yet enabled ****
1538            CPP_EEOPTIONS="$try"
1539      fi      fi
1540  done  done
1541    if test "x$CPP_OPTIONS" = x ; then
1542        echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
1543        exit 1
1544    fi
1545    
1546    #  Here, we build the list of files to be "run through" the adjoint
1547    #  compiler.
1548    if test -f ./ad_files ; then
1549        rm -f ./ad_files
1550    fi
1551    echo "  Creating the list of files for the adjoint compiler."
1552    for i in $SOURCEDIRS ; do
1553        list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
1554        for j in $list_files ; do
1555            cat $i/$j >> ad_files
1556        done
1557    done
1558    
1559    
1560  echo  echo
1561  echo "===  Creating the Makefile  ==="  echo "===  Creating the Makefile  ==="
1562  echo "  setting INCLUDES"  echo "  setting INCLUDES"
1563  for i in $INCLUDEDIRS ; do  for i in $INCLUDEDIRS ; do
1564      if test -d $i ; then      if ! test -d $i ; then
1565          INCLUDES="$INCLUDES -I$i"  #       INCLUDES="$INCLUDES -I$i"
1566      else  #   else
1567          echo "Warning: can't find INCLUDEDIRS=\"$i\""          echo "Warning: can't find INCLUDEDIRS=\"$i\""
1568      fi      fi
1569  done  done
# Line 888  rm -rf .links.tmp Line 1573  rm -rf .links.tmp
1573  mkdir .links.tmp  mkdir .links.tmp
1574  echo "# This section creates symbolic links" > srclinks.tmp  echo "# This section creates symbolic links" > srclinks.tmp
1575  echo "" >> srclinks.tmp  echo "" >> srclinks.tmp
1576  echo -n 'SRCFILES = '    > srclist.inc  printf 'SRCFILES = '    > srclist.inc
1577  echo -n 'CSRCFILES = '   > csrclist.inc  printf 'CSRCFILES = '   > csrclist.inc
1578  echo -n 'F90SRCFILES = ' > f90srclist.inc  printf 'F90SRCFILES = ' > f90srclist.inc
1579  echo -n 'HEADERFILES = ' > hlist.inc  printf 'HEADERFILES = ' > hlist.inc
1580  alldirs=". $SOURCEDIRS $INCLUDEDIRS"  printf 'AD_FLOW_FILES = ' > ad_flow_files.inc
1581    alldirs="$SOURCEDIRS $INCLUDEDIRS ."
1582  for d in $alldirs ; do  for d in $alldirs ; do
1583      deplist=      deplist=
1584      sfiles=`( cd $d; echo *.[h,c,F] )`      sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
1585      sfiles=`( echo $sfiles; cd $d; echo *.F90 )`      sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
1586      for sf in $sfiles ; do      for sf in $sfiles ; do
1587          if test ! -r ".links.tmp/$sf" ; then          if test ! -r ".links.tmp/$sf" ; then
1588              if test -f "$d/$sf" ; then              if test -f "$d/$sf" ; then
1589                  extn=`echo $sf | awk -F '.' '{print $NF}'`                  case $d/$sf in
1590                  touch .links.tmp/$sf                    ./$PACKAGES_DOT_H)
1591                  deplist="$deplist $sf"                          ;;
1592                      ./AD_CONFIG.h)
1593                            ;;
1594                      ./FC_NAMEMANGLE.h)
1595                            ;;
1596                      *)
1597                            touch .links.tmp/$sf
1598                            deplist="$deplist $sf"
1599                            ;;
1600                    esac
1601                    extn=`echo $sf | $AWK -F '.' '{print $NF}'`
1602                  case $extn in                  case $extn in
1603                      F)                      F)
1604                          echo    " \\"  >> srclist.inc                          echo    " \\"  >> srclist.inc
1605                          echo -n " $sf" >> srclist.inc                          printf " $sf" >> srclist.inc
1606                          ;;                          ;;
1607                      F90)                      F90)
1608                          echo    " \\"  >> f90srclist.inc                          echo    " \\"  >> f90srclist.inc
1609                          echo -n " $sf" >> f90srclist.inc                          printf " $sf" >> f90srclist.inc
1610                          ;;                          ;;
1611                      c)                      c)
1612                          echo    " \\"  >> csrclist.inc                          echo    " \\"  >> csrclist.inc
1613                          echo -n " $sf" >> csrclist.inc                          printf " $sf" >> csrclist.inc
1614                          ;;                          ;;
1615                      h)                      h)
1616                          echo    " \\"  >> hlist.inc                          echo    " \\"  >> hlist.inc
1617                          echo -n " $sf" >> hlist.inc                          printf " $sf" >> hlist.inc
1618                            ;;
1619                        flow)
1620                            echo    " \\"  >> ad_flow_files.inc
1621                            printf " $sf" >> ad_flow_files.inc
1622                          ;;                          ;;
1623                  esac                  esac
1624              fi              fi
# Line 936  echo "" >> srclist.inc Line 1636  echo "" >> srclist.inc
1636  echo "" >> csrclist.inc  echo "" >> csrclist.inc
1637  echo "" >> f90srclist.inc  echo "" >> f90srclist.inc
1638  echo "" >> hlist.inc  echo "" >> hlist.inc
1639    echo "" >> ad_flow_files.inc
1640    
1641  if test -e $MAKEFILE ; then  if test -e $MAKEFILE ; then
1642      mv -f $MAKEFILE "$MAKEFILE.bak"      mv -f $MAKEFILE "$MAKEFILE.bak"
# Line 946  echo "#    $MACHINE" >> $MAKEFILE Line 1647  echo "#    $MACHINE" >> $MAKEFILE
1647  echo "# This makefile was generated automatically on" >> $MAKEFILE  echo "# This makefile was generated automatically on" >> $MAKEFILE
1648  echo "#    $THISDATE" >> $MAKEFILE  echo "#    $THISDATE" >> $MAKEFILE
1649  echo "# by the command:" >> $MAKEFILE  echo "# by the command:" >> $MAKEFILE
1650  echo "#    $0 $@" >> $MAKEFILE  echo "#    $0 $G2ARGS" >> $MAKEFILE
1651  echo "# executed by:" >> $MAKEFILE  echo "# executed by:" >> $MAKEFILE
1652  echo "#    $USER@${THISHOSTNAME}:${THISCWD}" >> $MAKEFILE  echo "#    $USER@${THISHOSTNAME}:${THISCWD}" >> $MAKEFILE
1653    
1654    EXE_AD=$EXECUTABLE"_ad"
1655    EXE_FTL=$EXECUTABLE"_ftl"
1656    EXE_SVD=$EXECUTABLE"_svd"
1657    
1658  cat >>$MAKEFILE <<EOF  cat >>$MAKEFILE <<EOF
1659    #
1660    # OPTFILE="$OPTFILE"
1661  #  #
1662  # BUILDDIR     : Directory where object files are written  # BUILDDIR     : Directory where object files are written
1663  # SOURCEDIRS   : Directories containing the source (.F) files  # SOURCEDIRS   : Directories containing the source (.F) files
# Line 977  EXEDIR      = ${EXEDIR} Line 1685  EXEDIR      = ${EXEDIR}
1685  EXECUTABLE  = \$(EXEDIR)/${EXECUTABLE}  EXECUTABLE  = \$(EXEDIR)/${EXECUTABLE}
1686  TOOLSDIR    = ${TOOLSDIR}  TOOLSDIR    = ${TOOLSDIR}
1687    
1688    #eh3  new defines for the adjoint work
1689    AUTODIFF    = ${ROOTDIR}/pkg/autodiff
1690    EXE_AD      = ${EXE_AD}
1691    EXE_FTL     = ${EXE_FTL}
1692    EXE_SVD     = ${EXE_SVD}
1693    
1694    ENABLED_PACKAGES = ${ENABLED_PACKAGES}
1695    DISABLED_PACKAGES = ${DISABLED_PACKAGES}
1696    
1697    # These files are created by Makefile
1698    SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h
1699    
1700  EOF  EOF
1701    
1702  #  Note: figure out some way to add Hyades JAM libraries here  #  Note: figure out some way to add Hyades JAM libraries here
# Line 995  FC = ${FC} Line 1715  FC = ${FC}
1715  # Fortran compiler  # Fortran compiler
1716  F90C = ${F90C}  F90C = ${F90C}
1717  # Link editor  # Link editor
1718  LINK = ${LINK}  LINK = ${LINK} ${LDADD}
1719    
1720  # Defines for CPP  # Defines for CPP
1721  DEFINES = ${DEFINES}  DEFINES = ${DEFINES}
# Line 1022  MAKEFILE=${MAKEFILE} Line 1742  MAKEFILE=${MAKEFILE}
1742    
1743  EOF  EOF
1744    
1745  cat srclist.inc    >> $MAKEFILE  cat srclist.inc       >> $MAKEFILE
1746  cat csrclist.inc   >> $MAKEFILE  cat csrclist.inc      >> $MAKEFILE
1747  cat f90srclist.inc >> $MAKEFILE  cat f90srclist.inc    >> $MAKEFILE
1748  cat hlist.inc      >> $MAKEFILE  cat hlist.inc         >> $MAKEFILE
1749  echo 'F77FILES =  $(SRCFILES:.F=.f)'                                           >> $MAKEFILE  cat ad_flow_files.inc >> $MAKEFILE
1750  echo 'F90FILES =  $(F90SRCFILES:.F90=.f90)'                                    >> $MAKEFILE  echo >> $MAKEFILE
1751    echo 'F77FILES =  $(SRCFILES:.F=.'$FS')'      >> $MAKEFILE
1752    echo 'F90FILES =  $(F90SRCFILES:.F=.'$FS90')' >> $MAKEFILE
1753  echo 'OBJFILES =  $(SRCFILES:.F=.o) $(CSRCFILES:.c=.o) $(F90SRCFILES:.F90=.o)' >> $MAKEFILE  echo 'OBJFILES =  $(SRCFILES:.F=.o) $(CSRCFILES:.c=.o) $(F90SRCFILES:.F90=.o)' >> $MAKEFILE
1754    echo >> $MAKEFILE
1755    echo '.SUFFIXES:' >> $MAKEFILE
1756    echo '.SUFFIXES: .o .F .p .'$FS' .c .F90 .'$FS90 >> $MAKEFILE
1757  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
1758    rm -f ad_flow_files.inc
1759    
1760  cat >>$MAKEFILE <<EOF  cat >>$MAKEFILE <<EOF
1761    
 .SUFFIXES:  
 .SUFFIXES: .o .f .p .F .c .F90 .f90  
   
1762  all: \$(EXECUTABLE)  all: \$(EXECUTABLE)
1763  \$(EXECUTABLE): \$(OBJFILES)  \$(EXECUTABLE): \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(OBJFILES)
1764            @echo Creating \$@ ...
1765          \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)          \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
1766  depend:  depend:
1767          @make links          @make links
1768          \$(MAKEDEPEND) -o .f \$(DEFINES) \$(INCLUDES) \$(SRCFILES)          \$(MAKEDEPEND) -o .$FS \$(DEFINES) \$(INCLUDES) \$(SRCFILES)
1769          ../../../tools/f90mkdepend >> \$(MAKEFILE)          \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
1770            -rm -f makedepend.out
1771    
1772  links: \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES)  links: \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(SPECIAL_FILES)
1773    
1774  small_f: \$(F77FILES) \$(F90FILES)  small_f: \$(F77FILES) \$(F90FILES)
1775    
# Line 1054  output.txt: \$(EXECUTABLE) Line 1778  output.txt: \$(EXECUTABLE)
1778          @\$(EXECUTABLE) > \$@          @\$(EXECUTABLE) > \$@
1779    
1780  clean:  clean:
1781          -rm -rf *.o *.f *.p *.f90 *.mod ${RMFILES} work.{pc,pcl}          -rm -rf *.o *.$FS *.p *.$FS90 *.mod ${RMFILES} work.{pc,pcl} *.template
1782  Clean:  Clean:
1783          @make clean          @make clean
1784          @make cleanlinks          @make cleanlinks
1785          -rm -f Makefile.bak          -rm -f \$(SPECIAL_FILES)
1786            -rm -f genmake_state genmake_*optfile genmake_warnings make.log run.log *.bak
1787  CLEAN:  CLEAN:
1788          @make Clean          @make Clean
1789          -find \$(EXEDIR) -name "*.meta" -exec rm {} \;          -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
1790          -find \$(EXEDIR) -name "*.data" -exec rm {} \;          -find \$(EXEDIR) -name "*.data" -exec rm {} \;
1791          -find \$(EXEDIR) -name "fort.*" -exec rm {} \;          -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
1792          -rm -f \$(EXECUTABLE)          -rm -f \$(EXECUTABLE) output.txt
1793    
1794    #eh3 Makefile: makefile
1795  makefile:  makefile:
1796          ${0} $@          $THIS_SCRIPT $G2ARGS
1797  cleanlinks:  cleanlinks:
1798          -find . -type l -exec rm {} \;          -find . -type l -exec rm {} \;
1799    
1800  # The normal chain of rules is (  .F - .f - .o  )  # Special targets ($SPECIAL_FILES) which are create by make
1801  .F.f:  ${PACKAGES_DOT_H}:
1802            @echo Creating \$@ ...
1803            @$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) > \$@
1804    AD_CONFIG.h:
1805            @echo Creating \$@ ...
1806            @$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 > \$@
1807    FC_NAMEMANGLE.h:
1808            @echo Creating \$@ ...
1809            echo "$FC_NAMEMANGLE" > \$@
1810    
1811    # The normal chain of rules is (  .F - .$FS - .o  )
1812    
1813    %.o : %.F
1814    
1815    .F.$FS:
1816          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1817  .f.o:  .$FS.o:
1818          \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<          \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
1819  .F90.f90:  .F90.$FS90:
1820          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1821  .f90.o:  .$FS90.o:
1822          \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<          \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
1823  .c.o:  .c.o:
1824          \$(CC) \$(CFLAGS) -c \$<          \$(CC) \$(CFLAGS) -c \$<
1825    
1826  # Special exceptions that use the ( .F - .p - .f - .o ) rule-chain  # Special exceptions that use the ( .F - .p - .$FS - .o ) rule-chain
1827  .F.p:  .F.p:
1828          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1829  .p.f:  .p.$FS:
1830          \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<          \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
1831    
1832    #=========================================
1833    #===  Automatic Differentiation Rules  ===
1834    
1835    TAMC           = ${TAMC}
1836    TAF            = ${TAF}
1837    
1838    TAF_EXTRA      = ${TAF_EXTRA}
1839    TAMC_EXTRA     = ${TAMC_EXTRA}
1840    
1841    EOF
1842    
1843    ad_vars="AD_TAMC_FLAGS AD_TAF_FLAGS"
1844    ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF_FLAGS"
1845    ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
1846    for i in $ad_vars ; do
1847        name=$i
1848        t1="t2=\$"`echo $i`
1849        eval $t1
1850        printf "%-20s = " $name >> $MAKEFILE
1851        echo $t2 >> $MAKEFILE
1852    done
1853    
1854    echo "  Add the source list for AD code generation"
1855    echo >> $MAKEFILE
1856    printf "AD_FILES = " >> $MAKEFILE
1857    AD_FILES=`cat ad_files`
1858    for i in $AD_FILES ; do
1859        echo    " \\" >> $MAKEFILE
1860        printf " $i" >> $MAKEFILE
1861    done
1862    echo >> $MAKEFILE
1863    rm -f ad_files
1864    
1865    cat >>$MAKEFILE <<EOF
1866    
1867    # ... AD ...
1868    adall: ad_taf
1869    adtaf: ad_taf_output.f
1870    adtamc: ad_tamc_output.f
1871    
1872    ad_input_code.f: \$(AD_FILES) \$(HEADERFILES)
1873            @$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
1874            cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
1875            -rm -f ad_config.template
1876            @make \$(F77FILES)
1877            @make \$(AD_FLOW_FILES)
1878            cat \$(AD_FLOW_FILES) \$(AD_FILES) > ad_input_code.f
1879    
1880    ad_taf_output.f: ad_input_code.f
1881            \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f
1882            cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f
1883    
1884    adtafonly:
1885            \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f
1886            cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f
1887    
1888    ad_taf: ad_taf_output.o \$(OBJFILES)
1889            \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
1890    
1891    ad_tamc_output.f: ad_input_code.f
1892            \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.f
1893            cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.f
1894    
1895    ad_tamc: ad_tamc_output.o \$(OBJFILES)
1896            \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
1897    
1898    
1899    # ... FTL ...
1900    ftlall: ftl_taf
1901    ftltaf: ftl_taf_output.f
1902    ftltamc: ftl_tamc_output.f
1903    
1904    ftl_input_code.f: \$(AD_FILES) \$(HEADERFILES)
1905            @$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
1906            cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
1907            -rm -f ftl_config.template
1908            @make \$(F77FILES)
1909            @make \$(AD_FLOW_FILES)
1910            cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.f
1911    
1912    ftl_taf_output.f: ftl_input_code.f
1913            \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f
1914            cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f
1915    
1916    ftltafonly:
1917            \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f
1918            cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f
1919    
1920    ftl_taf: ftl_taf_output.o \$(OBJFILES)
1921            \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
1922    
1923    ftl_tamc_output.f: ftl_input_code.f
1924            \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.f
1925            cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.f
1926    
1927    ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
1928            \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
1929    
1930    
1931    # ... SVD ...
1932    svdtaf: ad_taf_output.f ftl_taf_output.f
1933    svdall: svd_taf
1934    
1935    svd_taf: ad_taf_output.o ftl_taf_output.o \$(OBJFILES)
1936            \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
1937    
1938    
1939    #=========================================
1940    
1941  EOF  EOF
1942    
1943    if test "x$EXEHOOK" != x ; then
1944        printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE
1945    fi
1946    
1947  echo "  Making list of \"exceptions\" that need \".p\" files"  echo "  Making list of \"exceptions\" that need \".p\" files"
1948  for i in $KPPFILES ; do  for i in $KPPFILES ; do
1949      base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`      base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
# Line 1098  for i in $KPPFILES ; do Line 1951  for i in $KPPFILES ; do
1951      if test "x$RETVAL" != x0 ; then      if test "x$RETVAL" != x0 ; then
1952          echo "Error: unable to add file \"$i\" to the exceptions list"          echo "Error: unable to add file \"$i\" to the exceptions list"
1953      fi      fi
1954      echo "$base.f: $base.p" >> $MAKEFILE      echo "$base.$FS: $base.p" >> $MAKEFILE
1955  done  done
1956    
1957  echo "  Making list of NOOPTFILES"  echo "  Making list of NOOPTFILES"
# Line 1108  for i in $NOOPTFILES ; do Line 1961  for i in $NOOPTFILES ; do
1961      if test "x$RETVAL" != x0 ; then      if test "x$RETVAL" != x0 ; then
1962          echo "Error: unable to add file \"$i\" to the exceptions list"          echo "Error: unable to add file \"$i\" to the exceptions list"
1963      fi      fi
1964      echo "$base.o: $base.f" >> $MAKEFILE      echo "$base.o: $base.$FS" >> $MAKEFILE
1965      printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE      printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE
1966  done  done
1967    
# Line 1120  echo "  Adding makedepend marker" Line 1973  echo "  Adding makedepend marker"
1973  printf "\n\n# DO NOT DELETE\n" >> $MAKEFILE  printf "\n\n# DO NOT DELETE\n" >> $MAKEFILE
1974    
1975  printf "\n===  Done  ===\n"  printf "\n===  Done  ===\n"
1976    
1977    # Create special header files
1978    $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"
1979    if test ! -f $PACKAGES_DOT_H ; then
1980        mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
1981    else
1982        cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H > /dev/null 2>&1
1983        RETVAL=$?
1984        if test "x$RETVAL" = x0 ; then
1985            rm -f $PACKAGES_DOT_H".tmp"
1986        else
1987            mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"
1988            mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
1989        fi
1990    fi
1991    if test ! -f AD_CONFIG.h ; then
1992        $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
1993    fi
1994    
1995    
1996    #  Write the "state" for future records
1997    if test "x$DUMPSTATE" != xf ; then
1998        printf "" > genmake_state
1999        for i in $gm_state ; do
2000            t1="t2=\$$i"
2001            eval $t1
2002            echo "$i='$t2'" >> genmake_state
2003        done
2004    fi

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.76

  ViewVC Help
Powered by ViewVC 1.1.22