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

Legend:
Removed from v.1.5  
changed lines
  Added in v.1.128

  ViewVC Help
Powered by ViewVC 1.1.22