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

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.90

  ViewVC Help
Powered by ViewVC 1.1.22