/[MITgcm]/MITgcm/tools/genmake2
ViewVC logotype

Diff of /MITgcm/tools/genmake2

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph | View Patch Patch

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

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

  ViewVC Help
Powered by ViewVC 1.1.22