/[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.39 by edhill, Fri Nov 14 19:01:36 2003 UTC revision 1.90 by edhill, Tue Jul 27 20:59:19 2004 UTC
# Line 1  Line 1 
1  #!/bin/sh  #! /usr/bin/env bash
2  #  #
3  # $Header$  # $Header$
4  #  #
# Line 13  Line 13 
13  test_for_package_in_cpp_options() {  test_for_package_in_cpp_options() {
14      cpp_options=$1      cpp_options=$1
15      pkg=$2      pkg=$2
16      grep -i "#define.*ALLOW_$pkg" $cpp_options > /dev/null 2>&1      test_for_string_in_file $cpp_options "^[ ]*#define.*ALLOW_$pkg" || exit 99
17      RETVAL=$?      test_for_string_in_file $cpp_options "^[ ]*#undef.*ALLOW_$pkg" || exit 99
18      if test "x${RETVAL}" = x0 ; then      test_for_string_in_file $cpp_options "^[ ]*#define.*DISABLE_$pkg" || exit 99
19          echo "Error: In $cpp_options there is an illegal line: #define ALLOW_$pkg"      test_for_string_in_file $cpp_options "^[ ]*#undef.*DISABLE_$pkg" || exit 99
20          exit 99  }
21      fi  
22      grep -i "#undef.*ALLOW_$pkg" $cpp_options > /dev/null 2>&1  # Search for particular CPP #cmds associated with MPI
23      RETVAL=$?  # usage: test_for_mpi_in_cpp_eeoptions CPP_file
24      if test "x${RETVAL}" = x0 ; then  test_for_mpi_in_cpp_eeoptions() {
25          echo "Error: In $cpp_options there is an illegal line: #undef ALLOW_$pkg"      cpp_options=$1
26          exit 99      test_for_string_in_file $cpp_options "^[ ]*#define.*ALLOW_USE_MPI" || exit 99
27      fi      test_for_string_in_file $cpp_options "^[ ]*#undef.*ALLOW_USE_MPI" || exit 99
28      grep -i "#define.*DISABLE_$pkg" $cpp_options > /dev/null 2>&1      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=$?      RETVAL=$?
39      if test "x${RETVAL}" = x0 ; then      if test "x${RETVAL}" = x0 ; then
40          echo "Error: In $cpp_options there is an illegal line: #define DISABLE_$pkg"          printf "Error: In $file there is an illegal line: "
41          exit 99          grep -i "$strng" $file
42            return 1
43      fi      fi
44      grep -i "#undef.*DISABLE_$pkg" $cpp_options > /dev/null 2>&1      return 0
     RETVAL=$?  
     if test "x${RETVAL}" = x0 ; then  
         echo "Error: In $cpp_options there is an illegal line: #undef DISABLE_$pkg"  
         exit 99  
    fi  
45  }  }
46    
47  # Read the $ROOTDIR/pkg/pkg_groups file and expand any references to  # Read the $ROOTDIR/pkg/pkg_groups file and expand any references to
# Line 62  expand_pkg_groups() { Line 67  expand_pkg_groups() {
67          done          done
68          PACKAGES=$new_packages          PACKAGES=$new_packages
69          rm -f ./p[1,2].tmp          rm -f ./p[1,2].tmp
70            return $matched
71      else      else
72          echo "Warning: can't read package groups definition file: $PKG_GROUPS"          echo "Warning: can't read package groups definition file: $PKG_GROUPS"
73      fi      fi
74  }  }
75    
76    #  Check for broken environments (eg. cygwin, MacOSX w/HFS+) that
77    #  cannot distinguish [*.F/*.F90] from [*.f/*.f90] files.
78    check_for_broken_Ff()  {
79        #  Do we have defaults for $FS and/or $FS90 ?
80        tfs=f
81        tfs9=f90
82        if test "x$FS" != x ; then
83            tfs="$FS"
84        fi
85        if test "x$FS90" != x ; then
86            tfs9="$FS90"
87        fi
88    
89        #  First check the ability to create a *.F/.f pair.
90        cat <<EOF >> genmake_hello.F
91          program hello
92          write(*,*) 'hi'
93          stop
94          end
95    EOF
96        cp genmake_hello.F "genmake_hello."$tfs > /dev/null 2>&1
97        RETVAL=$?
98        if test "x$RETVAL" != x0 ; then
99            if test "x$FS" = x ; then
100                FS='for'
101                FS90='fr9'
102                check_for_broken_Ff
103            else
104                cat <<EOF 2>&1
105    ERROR: Your file system cannot distinguish between *.F and *.f files
106      (fails the "cp" test) and this program cannot find a suitable
107      replacement extension.  Please try a different build environment or
108      contact the <MITgcm-support@mitgcm.org> list for help.
109    
110    EOF
111                exit -1
112            fi
113            return
114        fi
115        rm -f genmake_hello.*
116    
117        #  Check the ability of ${MAKE} and ${LN} to use the current set
118        #  of extensions.
119        cat <<EOF >> genmake_hello.F
120          program hello
121          write(*,*) 'hi'
122          stop
123          end
124    EOF
125        test -f Makefile  &&  mv -f Makefile Makefile.bak
126        cat <<EOF >> Makefile
127    %.$tfs : %.F
128    .SUFFIXES:
129    genmake_hello.$tfs: genmake_hello.F
130            $LN genmake_hello.F genmake_hello.$tfs
131    EOF
132        $MAKE "genmake_hello."$tfs > /dev/null 2>&1
133        RETVAL=$?
134        if test "x$RETVAL" != x0 -o ! -f "genmake_hello."$tfs ; then
135            if test "x$FS" = x ; then
136                FS='for'
137                FS90='fr9'
138                check_for_broken_Ff
139            else
140                cat <<EOF 2>&1
141    ERROR: Your file system cannot distinguish between *.F and *.f files
142      (fails the "make/ln" test) and this program cannot find a suitable
143      replacement extension.  Please try a different build environment or
144      contact the <MITgcm-support@mitgcm.org> list for help.
145    
146    EOF
147                exit -1
148                return
149            fi
150        fi
151        rm -f genmake_hello.* Makefile
152        test -f Makefile  &&  mv -f Makefile.bak Makefile
153    
154        #  If we make it here, use the extensions
155        FS=$tfs
156        FS90=$tfs9
157        return
158    }
159    
160    
161    look_for_makedepend()  {
162    
163        #  The "original" makedepend is part of the Imake system that is
164        #  most often distributed with XFree86 or with an XFree86 source
165        #  package.  As a result, many machines (eg. generic Linux) do not
166        #  have a system-default "makedepend" available.  For those
167        #  systems, we have two fall-back options:
168        #
169        #    1) a makedepend implementation shipped with the cyrus-imapd
170        #       package:  ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/
171        #
172        #    2) a known-buggy xmakedpend shell script
173        #
174        #  So the choices are, in order:
175        #
176        #    1) use the user-specified program
177        #    2) use a system-wide default
178        #    3) locally build and use the cyrus implementation
179        #    4) fall back to the buggy local xmakedpend script
180        #
181        if test "x${MAKEDEPEND}" = x ; then
182            which makedepend > /dev/null 2>&1
183            RV0=$?
184            cat <<EOF >> genmake_tc.f
185          program test
186          write(*,*) 'test'
187          stop
188          end
189    EOF
190            makedepend genmake_tc.f > /dev/null 2>&1
191            RV1=$?
192            if test "x${RV0}${RV1}" = x00 ; then
193                MAKEDEPEND=makedepend
194            else
195                echo "    a system-default makedepend was not found."
196                
197                #  Try to build the cyrus implementation
198                build_cyrus_makedepend
199                RETVAL=$?
200                if test "x$RETVAL" != x0 ; then
201                    MAKEDEPEND='$(TOOLSDIR)/xmakedepend'
202                fi
203                rm -f ./genmake_cy_md
204            fi
205        else
206            #  echo "MAKEDEPEND=${MAKEDEPEND}"
207            echo "${MAKEDEPEND}" | grep -i cyrus > /dev/null 2>&1
208            RETVAL=$?
209            if test x"$RETVAL" = x0 ; then
210                build_cyrus_makedepend
211            fi
212        fi
213    }
214    
215    
216    build_cyrus_makedepend()  {
217        rm -f ./genmake_cy_md
218        (
219            cd $ROOTDIR/tools/cyrus-imapd-makedepend  \
220                &&  ./configure > /dev/null 2>&1  \
221                &&  make > /dev/null 2>&1
222            if test -x ./makedepend.exe ; then
223                $LN ./makedepend.exe ./makedepend
224            fi
225            ./makedepend ifparser.c > /dev/null 2>&1  \
226                &&  echo "true"
227        ) > ./genmake_cy_md
228        grep true ./genmake_cy_md > /dev/null 2>&1
229        RETVAL=$?
230        rm -f ./genmake_cy_md
231        if test "x$RETVAL" = x0 ; then
232            MAKEDEPEND='$(TOOLSDIR)/cyrus-imapd-makedepend/makedepend'
233            return 0
234        else
235            echo "WARNING: unable to build cyrus-imapd-makedepend"
236            return 1
237        fi
238    }
239    
240  # Guess possible config options for this host  # Guess possible config options for this host
241  find_possible_configs()  {  find_possible_configs()  {
242    
243      tmp1=`uname`"_"`uname -m`      tmp1=`uname`"_"`uname -m`
244      tmp2=`echo $tmp1 | sed -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`      tmp2=`echo $tmp1 | sed -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
245      tmp3=`echo $tmp2 | sed -e 's/power macintosh/ppc/'`      tmp3=`echo $tmp2 | sed -e 's/power macintosh/ppc/'`
246      PLATFORM=`echo $tmp3 | sed -e 's/i[3-6]86/ia32/' | sed -e 's/athlon/ia32/'`      tmp1=`echo $tmp3 | sed -e 's|x86_64|amd64|'`
247        tmp2=`echo $tmp1 | sed -e 's/i[3-6]86/ia32/' | sed -e 's/athlon/ia32/'`
248        tmp3=`echo $tmp2 | sed -e 's/cray sv1/craysv1/'`
249        PLATFORM=$tmp3
250        echo $PLATFORM | grep cygwin > /dev/null 2>&1  &&  PLATFORM=cygwin_ia32
251      OFLIST=`(cd $ROOTDIR/tools/build_options; ls | grep "^$PLATFORM")`      OFLIST=`(cd $ROOTDIR/tools/build_options; ls | grep "^$PLATFORM")`
252      echo "  The platform appears to be:  $PLATFORM"      echo "  The platform appears to be:  $PLATFORM"
 #     if test "x$OFLIST" = x ; then  
 #       echo "  No pre-defined options files were found matching this platform"  
 #       echo "  but examples for other platforms can be found in:"  
 #       echo "    $ROOTDIR/tools/build_options"  
 #     else  
 #       echo "  Options files (located in $ROOTDIR/tools/build_options) that"  
 #       echo "  may work with this machine are:"  
 #       for i in $OFLIST ; do  
 #           echo "    $i"  
 #       done  
 #     fi  
253            
254      echo "test" > test      echo "test" > test
255      ln -s ./test link      ln -s ./test link
# Line 104  find_possible_configs()  { Line 267  find_possible_configs()  {
267          CPP="cpp -traditional -P"          CPP="cpp -traditional -P"
268      fi      fi
269    
270      # makedepend is not always available      look_for_makedepend
     if test "x${MAKEDEPEND}" = x ; then  
       which makedepend >& /dev/null  
       RETVAL=$?  
       if test "x${RETVAL}" = x1 ; then  
          echo "    makedepend was not found. Using xmakedpend instead."  
          MAKEDEPEND='$(TOOLSDIR)/xmakedepend'  
       fi  
     fi  
271    
272      # look for possible fortran compilers      # look for possible fortran compilers
273      tmp="$MITGCM_FC $FC efc g77 f77 pgf77 pgf95 ifc f90 f95 mpif77 mpf77 mpxlf95"      tmp="$MITGCM_FC $FC efc g77 f77 pgf77 pgf95 ifc f90 f95 mpif77 mpf77 mpxlf95"
# Line 149  EOF Line 304  EOF
304          echo "   "$p_FC          echo "   "$p_FC
305          if test "x$FC" = x ; then          if test "x$FC" = x ; then
306              FC=`echo $p_FC | $AWK '{print $1}'`              FC=`echo $p_FC | $AWK '{print $1}'`
307                echo "  Setting FORTRAN compiler to: "$FC
308          fi          fi
309      fi      fi
310    
311      for i in $p_FC ; do      if test "x$OPTFILE" = x ; then
312          p_OF=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$i          OPTFILE=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$FC
313          if test -r $p_OF ; then          if test ! -r $OPTFILE ; then
314              OPTFILE=$p_OF               echo "  I looked for the file "$OPTFILE" but did not find it"
315              echo "  The options file:  $p_OF"          fi
316              echo "    appears to match so we'll use it."      fi
317              break  #    echo "  The options file:  $p_OF"
318          fi  #    echo "    appears to match so we'll use it."
319      done  #   for i in $p_FC ; do
320    #p_OF=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$i
321    #if test -r $p_OF ; then
322    #    OPTFILE=$p_OF
323    #    echo "  The options file:  $p_OF"
324    #    echo "    appears to match so we'll use it."
325    #    break
326    #fi
327    #   done
328      if test "x$OPTFILE" = x ; then      if test "x$OPTFILE" = x ; then
329          cat 1>&2 <<EOF          cat 1>&2 <<EOF
330    
# Line 219  get_pdepend_list()  { Line 383  get_pdepend_list()  {
383      . ./.pd_tmp      . ./.pd_tmp
384      rm -f ./.pd_tmp      rm -f ./.pd_tmp
385    
386      echo -n "PNAME = "${}      printf "PNAME = "${}
387  }  }
388    
389    
390  #  Explain usage  #  Explain usage
391  usage()  {  usage()  {
392      echo  cat <<EOF
393      echo "Usage: "$0" [OPTIONS]"  
394      echo "  where [OPTIONS] can be:"  Usage: "$0" [OPTIONS]
395      echo    where [OPTIONS] can be:
396      echo "    -help | --help | -h | --h"  
397      echo "    -nooptfile | --nooptfile"      -help | --help | -h | --h
398      echo "      -optfile NAME | --optfile NAME | -of NAME | --of NAME"            Print this help message and exit.
399      echo "      -optfile=NAME | --optfile=NAME | -of=NAME | --of=NAME"  
400      echo "    -pdepend NAME | --pdepend NAME"      -adoptfile NAME | --adoptfile NAME | -adof NAME | --adof NAME
401      echo "      -pdepend=NAME | --pdepend=NAME"        -adoptfile=NAME | --adoptfile=NAME | -adof=NAME | --adof=NAME
402      echo "    -pdefault NAME | --pdefault NAME"            Use "NAME" as the adoptfile.  By default, the file at
403      echo "      -pdefault=NAME | --pdefault=NAME"            "tools/adjoint_options/adjoint_default" will be used.
404      echo "    -make NAME | -m NAME"  
405      echo "      --make=NAME | -m=NAME"      -nooptfile | --nooptfile
406      echo "    -makefile NAME | -mf NAME"        -optfile NAME | --optfile NAME | -of NAME | --of NAME
407      echo "      --makefile=NAME | -mf=NAME"        -optfile=NAME | --optfile=NAME | -of=NAME | --of=NAME
408      echo "    -platform NAME | --platform NAME | -pl NAME | --pl NAME"            Use "NAME" as the optfile.  By default, an attempt will be
409      echo "      -platform=NAME | --platform=NAME | -pl=NAME | --pl=NAME"            made to find an appropriate "standard" optfile in the
410      echo "    -rootdir NAME | --rootdir NAME | -rd NAME | --rd NAME"            tools/build_options/ directory.
411      echo "      -rootdir=NAME | --rootdir=NAME | -rd=NAME | --rd=NAME"  
412      echo "    -mods NAME | --mods NAME | -mo NAME | --mo NAME"      -pdepend NAME | --pdepend NAME
413      echo "      -mods=NAME | --mods=NAME | -mo=NAME | --mo=NAME"        -pdepend=NAME | --pdepend=NAME
414      echo "    -disable NAME | --disable NAME"            Get package dependency information from "NAME".
415      echo "      -disable=NAME | --disable=NAME"  
416      echo "    -enable NAME | --enable NAME"      -pdefault NAME | --pdefault NAME
417      echo "      -enable=NAME | --enable=NAME"        -pdefault=NAME | --pdefault=NAME
418      echo "    -standarddirs NAME | --standarddirs NAME"            Get the default package list from "NAME".
419      echo "      -standarddirs=NAME | --standarddirs=NAME"  
420      echo "    -noopt NAME | --noopt NAME"      -make NAME | -m NAME
421      echo "      -noopt=NAME | --noopt=NAME"        --make=NAME | -m=NAME
422  #    echo "    -cpp NAME | --cpp NAME"            Use "NAME" for the MAKE program. The default is "make" but
423  #    echo "      -cpp=NAME | --cpp=NAME"            many platforms, "gmake" is the preferred choice.
424      echo "    -fortran NAME | --fortran NAME | -fc NAME | --fc NAME"  
425      echo "      -fc=NAME | --fc=NAME"      -makefile NAME | -mf NAME
426      echo "    -[no]ieee | --[no]ieee"        --makefile=NAME | -mf=NAME
427      echo "    -[no]mpi | --[no]mpi"            Call the makefile "NAME".  The default is "Makefile".
428      echo "    -[no]jam | --[no]jam"  
429      echo      -makedepend NAME | -md NAME
430      echo "  and NAME is a string such as:"        --makedepend=NAME | -md=NAME
431      echo            Use "NAME" for the MAKEDEPEND program.
432      echo "    --enable pkg1   --enable 'pkg1 pkg2'   --enable 'pkg1 pkg2 pkg3'"  
433      echo "    -mods=dir1   -mods='dir1'   -mods='dir1 dir2 dir3'"      -rootdir NAME | --rootdir NAME | -rd NAME | --rd NAME
434      echo "    -foptim='-Mvect=cachesize:512000,transform -xtypemap=real:64,double:64,integer:32'"        -rootdir=NAME | --rootdir=NAME | -rd=NAME | --rd=NAME
435      echo            Specify the location of the MITgcm ROOTDIR as "NAME".
436      echo "  which, depending upon your shell, may need to be single-quoted"            By default, genamke will try to find the location by
437      echo "  if it contains spaces, dashes, or other special characters."            looking in parent directories (up to the 5th parent).
438    
439        -mods NAME | --mods NAME | -mo NAME | --mo NAME
440          -mods=NAME | --mods=NAME | -mo=NAME | --mo=NAME
441              Here, "NAME" specifies a list of directories that are
442              used for additional source code.  Files found in the
443              "mods list" are given preference over files of the same
444              name found elsewhere.
445    
446        -disable NAME | --disable NAME
447          -disable=NAME | --disable=NAME
448              Here "NAME" specifies a list of packages that we don't
449              want to use.  If this violates package dependencies,
450              genamke will exit with an error message.
451    
452        -enable NAME | --enable NAME
453          -enable=NAME | --enable=NAME
454              Here "NAME" specifies a list of packages that we wish
455              to specifically enable.  If this violates package
456              dependencies, genamke will exit with an error message.
457    
458        -standarddirs NAME | --standarddirs NAME
459          -standarddirs=NAME | --standarddirs=NAME
460              Here, "NAME" specifies a list of directories to be
461              used as the "standard" code.
462    
463        -fortran NAME | --fortran NAME | -fc NAME | --fc NAME
464          -fc=NAME | --fc=NAME
465              Use "NAME" as the fortran compiler.  By default, genmake
466              will search for a working compiler by trying a list of
467              "usual suspects" such as g77, f77, etc.
468    
469        -[no]ieee | --[no]ieee
470              Do or don't use IEEE numerics.  Note that this option
471              *only* works if it is supported by the OPTFILE that
472              is being used.
473    
474        -mpi | --mpi
475              Include MPI header files and link to MPI libraries
476        -mpi=PATH | --mpi=PATH
477              Include MPI header files and link to MPI libraries using MPI_ROOT
478              set to PATH. i.e. Include files from $PATH/include, link to libraries
479              from $PATH/lib and use binaries from $PATH/bin.
480    
481        -bash NAME
482              Explicitly specify the Bourne or BASH shell to use
483    
484      While it is most often a single word, the "NAME" variables specified
485      above can in many cases be a space-delimited string such as:
486    
487        --enable pkg1   --enable 'pkg1 pkg2'   --enable 'pkg1 pkg2 pkg3'
488        -mods=dir1   -mods='dir1'   -mods='dir1 dir2 dir3'
489        -foptim='-Mvect=cachesize:512000,transform -xtypemap=real:64,double:64,integer:32'
490    
491      which, depending upon your shell, may need to be single-quoted.
492    
493      For more detailed genmake documentation, please see:
494    
495        http://mitgcm.org/devel_HOWTO/
496    
497    EOF
498    
499      exit 1      exit 1
500  }  }
501    
502  #  Build a CPP macro to automate calling C routines from FORTRAN  #  Build a CPP macro to automate calling C routines from FORTRAN
503  get_fortran_c_namemangling()  {  get_fortran_c_namemangling()  {
504    
505        #echo "FC_NAMEMANGLE = \"$FC_NAMEMANGLE\""
506        if test ! "x$FC_NAMEMANGLE" = x ; then
507            return 0
508        fi
509    
510      default_nm="#define FC_NAMEMANGLE(X) X ## _"      default_nm="#define FC_NAMEMANGLE(X) X ## _"
511            
512      cat > genmake_test.c <<EOF      cat > genmake_test.c <<EOF
# Line 293  WARNING: Please contact <MITgcm-support@ Line 524  WARNING: Please contact <MITgcm-support@
524  EOF  EOF
525          return 1          return 1
526      fi      fi
527      c_tcall=`nm genmake_test.o | grep tcall | cut -d ' ' -f 3`      c_tcall=`nm genmake_test.o | grep 'T ' | grep tcall | cut -d ' ' -f 3`
528      RETVAL=$?      RETVAL=$?
529      if test "x$RETVAL" != x0 ; then      if test "x$RETVAL" != x0 ; then
530          FC_NAMEMANGLE=$default_nm          FC_NAMEMANGLE=$default_nm
# Line 323  WARNING: Please contact <MITgcm-support@ Line 554  WARNING: Please contact <MITgcm-support@
554  EOF  EOF
555          return 1          return 1
556      fi      fi
557      f_tcall=`nm genmake_tcomp.o | grep tcall | cut -d ' ' -f 3`      f_tcall=`nm genmake_tcomp.o | grep 'T ' | grep tcall | cut -d ' ' -f 3`
558      RETVAL=$?      RETVAL=$?
559      if test "x$RETVAL" != x0 ; then      if test "x$RETVAL" != x0 ; then
560          FC_NAMEMANGLE=$default_nm          FC_NAMEMANGLE=$default_nm
# Line 399  EOF Line 630  EOF
630  }  }
631    
632    
633    check_netcdf_libs()  {
634        cat <<EOF > genmake_tnc.for
635          program fgennc
636    #include "netcdf.inc"
637          integer iret, ncid, xid
638          iret = nf_create('genmake_tnc.nc', NF_CLOBBER, ncid)
639          IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
640          iret = nf_def_dim(ncid, 'X', 11, xid)
641          IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
642          iret = nf_close(ncid)
643          IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
644          end
645    EOF
646        #echo "$CPP $DEFINES $INCLUDES"
647        $CPP $DEFINES $INCLUDES genmake_tnc.for > genmake_tnc.f  \
648            &&  $FC $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.f $LIBS >> genmake_tnc.log 2>&1
649        RET_COMPILE=$?
650        test -x ./genmake_tnc  &&  ./genmake_tnc >> genmake_tnc.log 2>&1
651        RETVAL=$?
652        if test "x$RET_COMPILE" = x0 -a "x$RETVAL" = x0 ; then
653            HAVE_NETCDF=t
654        else
655            # try again with "-lnetcdf" added to the libs
656            $CPP $DEFINES $INCLUDES genmake_tnc.for > genmake_tnc.f  \
657                &&  $FC $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.f \
658                $LIBS -lnetcdf >> genmake_tnc_2.log 2>&1
659            RET_COMPILE=$?
660            test -x ./genmake_tnc  &&  ./genmake_tnc >> genmake_tnc.log 2>&1
661            RETVAL=$?
662            if test "x$RET_COMPILE" = x0 -a "x$RETVAL" = x0 ; then
663                LIBS="$LIBS -lnetcdf"
664                HAVE_NETCDF=t
665            else
666                cat genmake_tnc.log >> genmake_warnings
667            fi
668        fi
669        rm -f genmake_tnc*
670    }
671    
672    
673    
674    ###############################################################################
675    #   Sequential part of script starts here
676    ###############################################################################
677    
678  #  Set defaults here  #  Set defaults here
679  COMMANDL="$0 $@"  COMMANDL="$0 $@"
680    
# Line 407  LN= Line 683  LN=
683  S64=  S64=
684  KPP=  KPP=
685  FC=  FC=
686    CPP=
687  LINK=  LINK=
 # DEFINES="-DWORDLENGTH=4"  
688  DEFINES=  DEFINES=
689  PACKAGES=  PACKAGES=
690  ENABLE=  ENABLE=
691  DISABLE=  DISABLE=
692  MAKEFILE=  MAKEFILE=
693  MAKEDEPEND=  #MAKEDEPEND=
694  PDEPEND=  PDEPEND=
695  DUMPSTATE=t  DUMPSTATE=t
696  PDEFAULT=  PDEFAULT=
# Line 425  FOPTIM= Line 701  FOPTIM=
701  CFLAGS=  CFLAGS=
702  KFLAGS1=  KFLAGS1=
703  KFLAGS2=  KFLAGS2=
704    #LDADD=
705  LIBS=  LIBS=
706  KPPFILES=  KPPFILES=
707  NOOPTFILES=  NOOPTFILES=
708  NOOPTFLAGS=  NOOPTFLAGS=
709    MPI=
710    MPIPATH=
711    
712  # DEFINES checked by test compilation  # DEFINES checked by test compilation
713  HAVE_SYSTEM=  HAVE_SYSTEM=
714  HAVE_FDATE=  HAVE_FDATE=
715  FC_NAMEMANGLE=  FC_NAMEMANGLE=
716  HAVE_CLOC=  HAVE_CLOC=
717    HAVE_NETCDF=
718    HAVE_ETIME=
719    
720  MODS=  MODS=
721  TOOLSDIR=  TOOLSDIR=
722  SOURCEDIRS=  SOURCEDIRS=
723  INCLUDEDIRS=  INCLUDEDIRS=
724  STANDARDDIRS=  STANDARDDIRS="USE_THE_DEFAULT"
725    
726    G2ARGS=
727    BASH=
728  PWD=`pwd`  PWD=`pwd`
729  MAKE=make  MAKE=make
730  AWK=awk  AWK=awk
# Line 457  IEEE= Line 740  IEEE=
740  if test "x$MITGCM_IEEE" != x ; then  if test "x$MITGCM_IEEE" != x ; then
741      IEEE=$MITGCM_IEEE      IEEE=$MITGCM_IEEE
742  fi  fi
743    FS=
744    FS90=
745    
746  AUTODIFF_PKG_USED=f  AUTODIFF_PKG_USED=f
747  AD_OPTFILE=  AD_OPTFILE=
# Line 473  TAMC_EXTRA= Line 758  TAMC_EXTRA=
758    
759    
760  #  The following state can be set directly by command-line switches  #  The following state can be set directly by command-line switches
761  gm_s1="OPTFILE PDEPEND PDEFAULT MAKEFILE PLATFORM ROOTDIR MODS DISABLE ENABLE NOOPT"  gm_s1="OPTFILE PDEPEND PDEFAULT MAKEFILE PLATFORM ROOTDIR MODS DISABLE ENABLE"
762  gm_s2="FC IEEE MPI JAM DUMPSTATE STANDARDDIRS"  gm_s2="FC CPP IEEE MPI JAM DUMPSTATE STANDARDDIRS"
763    
764  #  The following state is not directly set by command-line switches  #  The following state is not directly set by command-line switches
765  gm_s3="LN S64 KPP LINK PACKAGES MAKEDEPEND PDEPEND PDEFAULT INCLUDES FFLAGS FOPTIM "  gm_s3="LN S64 KPP LINK PACKAGES MAKEDEPEND PDEPEND PDEFAULT INCLUDES FFLAGS FOPTIM "
766  gm_s4="CFLAGS KFLAGS1 KFLAGS2 LIBS KPPFILES NOOPTFILES NOOPTFLAGS"  gm_s4="CFLAGS KFLAGS1 KFLAGS2 LIBS KPPFILES NOOPTFILES NOOPTFLAGS"
767  gm_s5="TOOLSDIR SOURCEDIRS INCLUDEDIRS PWD MAKE THISHOSTNAME THISDATE MACHINE"  gm_s5="TOOLSDIR SOURCEDIRS INCLUDEDIRS PWD MAKE THISHOSTNAME THISDATE MACHINE"
768  gm_s6="EXECUTABLE EXEHOOK EXEDIR PACKAGES_CONF"  gm_s6="EXECUTABLE EXEHOOK EXEDIR PACKAGES_CONF"
769  gm_s7="HAVE_SYSTEM HAVE_FDATE FC_NAMEMANGLE"  gm_s7="HAVE_SYSTEM HAVE_FDATE FC_NAMEMANGLE HAVE_ETIME"
770    
771  #  The following are all related to adjoint/tangent-linear stuff  #  The following are all related to adjoint/tangent-linear stuff
772  gm_s10="AUTODIFF_PKG_USED AD_OPTFILE TAMC TAF AD_TAMC_FLAGS AD_TAF_FLAGS"  gm_s10="AUTODIFF_PKG_USED AD_OPTFILE TAMC TAF AD_TAMC_FLAGS AD_TAF_FLAGS"
# Line 491  gm_s12="TAF_EXTRA TAMC_EXTRA" Line 776  gm_s12="TAF_EXTRA TAMC_EXTRA"
776  gm_state="COMMANDL $gm_s1 $gm_s2 $gm_s3 $gm_s4 $gm_s5 $gm_s6 $gm_s7"  gm_state="COMMANDL $gm_s1 $gm_s2 $gm_s3 $gm_s4 $gm_s5 $gm_s6 $gm_s7"
777  gm_state="$gm_state $gm_s10 $gm_s11 $gm_s12"  gm_state="$gm_state $gm_s10 $gm_s11 $gm_s12"
778    
779    cat <<EOF
780    
781    GENMAKE :
782    
783    A program for GENerating MAKEfiles for the MITgcm project.  For a
784    quick list of options, use "genmake -h" or for more detail see:
785    
786      http://mitgcm.org/devel_HOWTO/
787    
788    EOF
789    
 echo  
790  echo "===  Processing options files and arguments  ==="  echo "===  Processing options files and arguments  ==="
791  gm_local="genmake_local"  gm_local="genmake_local"
792  for i in . $MODS ; do  for i in . $MODS ; do
# Line 501  for i in . $MODS ; do Line 795  for i in . $MODS ; do
795          break          break
796      fi      fi
797  done  done
798  echo -n "  getting local config information:  "  printf "  getting local config information:  "
799  if test -e $gm_local ; then  if test -f $gm_local ; then
800      echo "using $gm_local"      echo "using $gm_local"
801      . $gm_local      . $gm_local
802      # echo "DISABLE=$DISABLE"      # echo "DISABLE=$DISABLE"
# Line 523  fi Line 817  fi
817  #done  #done
818  #parse_options  #parse_options
819  ac_prev=  ac_prev=
820  for ac_option ; do  for ac_option in $@ ; do
821    
822        G2ARGS="$G2ARGS \"$ac_option\""
823    
824      # If the previous option needs an argument, assign it.      # If the previous option needs an argument, assign it.
825      if test -n "$ac_prev"; then      if test -n "$ac_prev"; then
# Line 546  for ac_option ; do Line 842  for ac_option ; do
842          -optfile=* | --optfile=* | -of=* | --of=*)          -optfile=* | --optfile=* | -of=* | --of=*)
843              OPTFILE=$ac_optarg ;;              OPTFILE=$ac_optarg ;;
844                    
845          -adoptfile | --adoptfile | -ad | --ad)          -adoptfile | --adoptfile | -adof | --adof)
846              ac_prev=AD_OPTFILE ;;              ac_prev=AD_OPTFILE ;;
847          -adoptfile=* | --adoptfile=* | -adof=* | --adof=*)          -adoptfile=* | --adoptfile=* | -adof=* | --adof=*)
848              AD_OPTFILE=$ac_optarg ;;              AD_OPTFILE=$ac_optarg ;;
# Line 566  for ac_option ; do Line 862  for ac_option ; do
862          -make=* | --make=* | -m=* | --m=*)          -make=* | --make=* | -m=* | --m=*)
863              MAKE=$ac_optarg ;;              MAKE=$ac_optarg ;;
864                    
865            -bash | --bash)
866                ac_prev=BASH ;;
867            -bash=* | --bash=*)
868                BASH=$ac_optarg ;;
869            
870            -makedepend | --makedepend | -md | --md)
871                ac_prev=MAKEDEPEND ;;
872            -makedepend=* | --makedepend=* | -md=* | --md=*)
873                MAKEDEPEND=$ac_optarg ;;
874            
875          -makefile | --makefile | -ma | --ma)          -makefile | --makefile | -ma | --ma)
876              ac_prev=MAKEFILE ;;              ac_prev=MAKEFILE ;;
877          -makefile=* | --makefile=* | -ma=* | --ma=*)          -makefile=* | --makefile=* | -ma=* | --ma=*)
878              MAKEFILE=$ac_optarg ;;              MAKEFILE=$ac_optarg ;;
879                    
880          -platform | --platform | -pl | --pl)          -platform | --platform | -pl | --pl | -platform=* | --platform=* | -pl=* | --pl=*)
881              ac_prev=PLATFORM ;;              echo "ERROR: The platform option has been removed.  Please specify"
882          -platform=* | --platform=* | -pl=* | --pl=*)              echo "  the build options using the \"optfile\" mechanism."
883              PLATFORM=$ac_optarg ;;              echo
884                usage
885                ;;
886                    
887          -rootdir | --rootdir | -rd | --rd)          -rootdir | --rootdir | -rd | --rd)
888              ac_prev=ROOTDIR ;;              ac_prev=ROOTDIR ;;
# Line 601  for ac_option ; do Line 909  for ac_option ; do
909          -standarddirs=* | --standarddirs=*)          -standarddirs=* | --standarddirs=*)
910              STANDARDDIRS=$ac_optarg ;;              STANDARDDIRS=$ac_optarg ;;
911    
         -noopt | --noopt)  
             ac_prev=NOOPT ;;  
         -noopt=* | --noopt=*)  
             NOOPT=$ac_optarg ;;  
           
912  #           -cpp | --cpp)  #           -cpp | --cpp)
913  #               ac_prev=cpp ;;  #               ac_prev=cpp ;;
914  #           -cpp=* | --cpp=*)  #           -cpp=* | --cpp=*)
# Line 616  for ac_option ; do Line 919  for ac_option ; do
919          -fc=* | --fc=*)          -fc=* | --fc=*)
920              FC=$ac_optarg ;;              FC=$ac_optarg ;;
921                    
922            -fs | --fs)
923                ac_prev=FS ;;
924            -fs=* | --fs=*)
925                FS=$ac_optarg ;;
926            
927            -fs90 | --fs90)
928                ac_prev=FS90 ;;
929            -fs90=* | --fs90=*)
930                FS90=$ac_optarg ;;
931            
932          -ieee | --ieee)          -ieee | --ieee)
933              IEEE=true ;;              IEEE=true ;;
934          -noieee | --noieee)          -noieee | --noieee)
935              IEEE= ;;              IEEE= ;;
936            
937          -mpi | --mpi)          -mpi | --mpi)
938              MPI=true ;;              MPI=true ;;
939          -nompi | --nompi)          -mpi=* | --mpi=*)
940              MPI= ;;              MPIPATH=$ac_optarg
941                MPI=true ;;
942                    
943          -jam | --jam)  #       -jam | --jam)
944              JAM=1 ;;  #           JAM=1 ;;
945          -nojam | --nojam)  #       -nojam | --nojam)
946              JAM=0 ;;  #           JAM=0 ;;
947                    
948          -ds | --ds)          -ds | --ds)
949              DUMPSTATE=t ;;              DUMPSTATE=t ;;
# Line 671  if test -f ./.genmakerc ; then Line 985  if test -f ./.genmakerc ; then
985  fi  fi
986    
987  if test "x${ROOTDIR}" = x ; then  if test "x${ROOTDIR}" = x ; then
988      if test "${PWD##/*/}" = "bin" -a -d ../model -a -d ../eesup -a -d ../pkg ; then      tmp=`echo $PWD | sed -e 's/\// /g' | awk '{print $NR}'`
989        if test "x$tmp" = "xbin" -a -d ../model -a -d ../eesup -a -d ../pkg ; then
990          ROOTDIR=".."          ROOTDIR=".."
991      else      else
992          for d in . .. ../.. ../../.. ../../../.. ../../../../.. ; do          for d in . .. ../.. ../../.. ../../../.. ../../../../.. ; do
993              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
994                  ROOTDIR=$d                  ROOTDIR=$d
995                  echo -n "Warning:  ROOTDIR was not specified but there appears to be"                  printf "Warning:  ROOTDIR was not specified but there appears to be"
996                  echo " a copy of MITgcm at \"$ROOTDIR\" so we'll try it."                  echo " a copy of MITgcm at \"$ROOTDIR\" so we'll try it."
997                  break                  break
998              fi              fi
# Line 711  if test "x$OPTFILE" != xNONE ; then Line 1026  if test "x$OPTFILE" != xNONE ; then
1026          . "$OPTFILE"          . "$OPTFILE"
1027          RETVAL=$?          RETVAL=$?
1028          if test "x$RETVAL" != x0 ; then          if test "x$RETVAL" != x0 ; then
1029              echo -n "Error: failed to source OPTFILE \"$OPTFILE\""              printf "Error: failed to source OPTFILE \"$OPTFILE\""
1030              echo "--please check that variable syntax is bash-compatible"              echo "--please check that variable syntax is bash-compatible"
1031              exit 1              exit 1
1032          fi          fi
# Line 724  if test "x$OPTFILE" != xNONE ; then Line 1039  if test "x$OPTFILE" != xNONE ; then
1039      fi      fi
1040  fi  fi
1041    
1042    #  Check for broken systems that cannot correctly distinguish *.F and *.f files
1043    # check_for_broken_Ff
1044    
1045  echo "  getting AD_OPTFILE information:  "  echo "  getting AD_OPTFILE information:  "
1046  if test "x${AD_OPTFILE}" = x ; then  if test "x${AD_OPTFILE}" = x ; then
1047      if test "x$MITGCM_AD_OF" = x ; then      if test "x$MITGCM_AD_OF" = x ; then
# Line 738  if test "x${AD_OPTFILE}" != xNONE ; then Line 1056  if test "x${AD_OPTFILE}" != xNONE ; then
1056          . "$AD_OPTFILE"          . "$AD_OPTFILE"
1057          RETVAL=$?          RETVAL=$?
1058          if test "x$RETVAL" != x0 ; then          if test "x$RETVAL" != x0 ; then
1059              echo -n "Error: failed to source AD_OPTFILE \"$AD_OPTFILE\""              printf "Error: failed to source AD_OPTFILE \"$AD_OPTFILE\""
1060              echo "--please check that variable syntax is bash-compatible"              echo "--please check that variable syntax is bash-compatible"
1061              exit 1              exit 1
1062          fi          fi
# Line 753  fi Line 1071  fi
1071    
1072  #  Check that FC, LINK, CPP, S64, LN, and MAKE are defined.  If not,  #  Check that FC, LINK, CPP, S64, LN, and MAKE are defined.  If not,
1073  #  either set defaults or complain and abort!  #  either set defaults or complain and abort!
1074    if test ! "x$BASH" = x ; then
1075        # add a trailing space so that it works within the Makefile syntax (see below)
1076        BASH="$BASH "
1077    fi
1078  if test "x$FC" = x ; then  if test "x$FC" = x ; then
1079      cat <<EOF 1>&2      cat <<EOF 1>&2
1080    
# Line 766  fi Line 1088  fi
1088  if test "x$LINK" = x ; then  if test "x$LINK" = x ; then
1089      LINK=$FC      LINK=$FC
1090  fi  fi
 if test "x$CPP" = x ; then  
     CPP="cpp"  
 fi  
1091  if test "x$MAKE" = x ; then  if test "x$MAKE" = x ; then
1092      MAKE="make"      MAKE="make"
1093  fi  fi
1094    if test "x$CPP" = x ; then
1095        CPP=cpp
1096    fi
1097    #EH3 === UGLY ===
1098    #  The following is an ugly little hack to check for $CPP in /lib/ and
1099    #  it should eventually be replaced with a more general function that
1100    #  searches a combo of the user's path and a list of "usual suspects"
1101    #  to find the correct location for binaries such as $CPP.
1102    for i in " " "/lib/" ; do
1103        echo "#define A a" | $i$CPP > test_cpp 2>&1 && CPP=$i$CPP
1104    done
1105    #EH3 === UGLY ===
1106  echo "#define A a" | $CPP > test_cpp 2>&1  echo "#define A a" | $CPP > test_cpp 2>&1
1107  RETVAL=$?  RETVAL=$?
1108  if test "x$RETVAL" != x0 ; then  if test "x$RETVAL" != x0 ; then
# Line 788  EOF Line 1119  EOF
1119  else  else
1120      rm -f test_cpp      rm -f test_cpp
1121  fi  fi
1122  if test "x$MAKEDEPEND" = x ; then  look_for_makedepend
     MAKEDEPEND=makedepend  
 fi  
1123  if test "x$LN" = x ; then  if test "x$LN" = x ; then
1124      LN="ln -s"      LN="ln -s"
1125  fi  fi
# Line 808  EOF Line 1137  EOF
1137  fi  fi
1138  rm -f genmake_test_ln genmake_tlink  rm -f genmake_test_ln genmake_tlink
1139    
1140    #  Check for broken *.F/*.f handling and fix if possible
1141    check_for_broken_Ff
1142    
1143    if test ! "x$MPI" = x ; then
1144          echo "  Turning on MPI cpp macros"
1145          DEFINES="$DEFINES -DALLOW_USE_MPI -DALWAYS_USE_MPI"
1146    fi
1147    
1148  printf "\n===  Checking system libraries  ===\n"  printf "\n===  Checking system libraries  ===\n"
1149  echo -n "  Do we have the system() command using $FC...  "  printf "  Do we have the system() command using $FC...  "
1150  cat > genmake_tcomp.f <<EOF  cat > genmake_tcomp.f <<EOF
1151        program hello        program hello
1152        call system('echo hi')        call system('echo hi')
# Line 828  else Line 1164  else
1164  fi  fi
1165  rm -f genmake_tcomp*  rm -f genmake_tcomp*
1166    
1167  echo -n "  Do we have the fdate() command using $FC...  "  printf "  Do we have the fdate() command using $FC...  "
1168  cat > genmake_tcomp.f <<EOF  cat > genmake_tcomp.f <<EOF
1169        program hello        program hello
1170        CHARACTER(128) string        CHARACTER(128) string
# Line 849  else Line 1185  else
1185  fi  fi
1186  rm -f genmake_tcomp*  rm -f genmake_tcomp*
1187    
1188  echo -n "  Can we call simple C routines (here, \"cloc()\") using $FC...  "  printf "  Do we have the etime() command using $FC...  "
1189    cat > genmake_tcomp.f <<EOF
1190          program hello
1191          REAL*4 ACTUAL, TARRAY(2)
1192          EXTERNAL ETIME
1193          REAL*4 ETIME
1194          actual = etime( tarray )
1195          print *, tarray
1196          end
1197    EOF
1198    $FC $FFLAGS $DEFINES -o genmake_tcomp genmake_tcomp.f > genmake_tcomp.log 2>&1
1199    RETVAL=$?
1200    if test "x$RETVAL" = x0 ; then
1201        HAVE_ETIME=t
1202        DEFINES="$DEFINES -DHAVE_ETIME"
1203        echo "yes"
1204    else
1205        HAVE_ETIME=
1206        echo "no"
1207    fi
1208    rm -f genmake_tcomp*
1209    
1210    printf "  Can we call simple C routines (here, \"cloc()\") using $FC...  "
1211  check_HAVE_CLOC  check_HAVE_CLOC
1212  if test "x$HAVE_CLOC" != x ; then  if test "x$HAVE_CLOC" != x ; then
1213      echo "yes"      echo "yes"
1214  else  else
1215      echo "no"      echo "no"
1216  fi  fi
 echo "$FC_NAMEMANGLE" > FC_NAMEMANGLE.h.template  
 cmp FC_NAMEMANGLE.h FC_NAMEMANGLE.h.template > /dev/null 2>&1  
 RETVAL=$?  
 if test "x$RETVAL" != x0 ; then  
     mv -f FC_NAMEMANGLE.h.template FC_NAMEMANGLE.h  
 fi  
1217  rm -f genmake_t*  rm -f genmake_t*
1218    
1219    printf "  Can we create NetCDF-enabled binaries...  "
1220    check_netcdf_libs
1221    if test "x$HAVE_NETCDF" != x ; then
1222        echo "yes"
1223    else
1224        echo "no"
1225    fi
1226    
1227    
1228  printf "\n===  Setting defaults  ===\n"  printf "\n===  Setting defaults  ===\n"
1229  echo -n "  Adding MODS directories:  "  printf "  Adding MODS directories:  "
1230  for d in $MODS ; do  for d in $MODS ; do
1231      if test ! -d $d ; then      if test ! -d $d ; then
1232          echo          echo
1233          echo "Error: MODS directory \"$d\" not found!"          echo "Error: MODS directory \"$d\" not found!"
1234          exit 1          exit 1
1235      else      else
1236          echo -n " $d"          printf " $d"
1237          SOURCEDIRS="$SOURCEDIRS $d"          SOURCEDIRS="$SOURCEDIRS $d"
1238          INCLUDEDIRS="$INCLUDEDIRS $d"          INCLUDEDIRS="$INCLUDEDIRS $d"
1239      fi      fi
# Line 888  if test "x${PLATFORM}" = x ; then Line 1248  if test "x${PLATFORM}" = x ; then
1248  fi  fi
1249    
1250  if test "x${EXEDIR}" = x ; then  if test "x${EXEDIR}" = x ; then
1251      if test "${PWD##/*/}" = "bin" -a -d ../exe -a $ROOTDIR = .. ; then      tmp=`echo $PWD | sed -e 's/\// /g' | awk '{print $NR}'`
1252        if test "x$tmp" = "xbin" -a -d ../exe -a $ROOTDIR = .. ; then
1253          EXEDIR=../exe          EXEDIR=../exe
1254      else      else
1255          EXEDIR=.          EXEDIR=.
# Line 903  if test "x${TOOLSDIR}" = x ; then Line 1264  if test "x${TOOLSDIR}" = x ; then
1264      TOOLSDIR="$ROOTDIR/tools"      TOOLSDIR="$ROOTDIR/tools"
1265  fi  fi
1266  if test ! -d ${TOOLSDIR} ; then  if test ! -d ${TOOLSDIR} ; then
1267      echo "Error: the specified $TOOLSDIR (\"$TOOLSDIR\") does not exist!"      echo "Error: the specified TOOLSDIR (\"$TOOLSDIR\") does not exist!"
1268      exit 1      exit 1
1269  fi  fi
1270  if test "x$S64" = x ; then  if test "x$S64" = x ; then
1271      S64='$(TOOLSDIR)/set64bitConst.sh'      S64='$(TOOLSDIR)/set64bitConst.sh'
1272  fi  fi
1273    THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`
1274    
1275  EXECUTABLE=${EXECUTABLE:-mitgcmuv}  EXECUTABLE=${EXECUTABLE:-mitgcmuv}
1276    
# Line 923  if test -r $ROOTDIR"/eesupp/src/Makefile Line 1285  if test -r $ROOTDIR"/eesupp/src/Makefile
1285          rm -f make_eesupp.errors          rm -f make_eesupp.errors
1286      else      else
1287          echo "Error: problem encountered while building source files in eesupp:"          echo "Error: problem encountered while building source files in eesupp:"
1288          cat make_eesupp.errors          cat make_eesupp.errors 1>&2
1289          exit 1          exit 1
1290      fi      fi
1291  fi  fi
1292    
1293    #same for exch2
1294    if test -r $ROOTDIR"/pkg/exch2/Makefile" ; then
1295        echo "  Making source files in exch2 from  templates"
1296        ( cd $ROOTDIR"/pkg/exch2/" && $MAKE ) > make_exch2.errors 2>&1
1297        RETVAL=$?
1298        if test "x${RETVAL}" = x0 ; then
1299            rm -f make_exch2.errors
1300        else
1301            echo "Error: problem encountered while building source files in exch2:"
1302            cat make_exch2.errors 1>&2
1303            exit 1
1304        fi
1305    fi
1306    
1307  printf "\n===  Determining package settings  ===\n"  printf "\n===  Determining package settings  ===\n"
1308  if  test "x${PDEPEND}" = x ; then  if  test "x${PDEPEND}" = x ; then
1309      tmp=$ROOTDIR"/pkg/pkg_depend"      tmp=$ROOTDIR"/pkg/pkg_depend"
# Line 960  rm -f ./.pd_tmp Line 1336  rm -f ./.pd_tmp
1336  #  Search for default packages.  Note that a "$ROOTDIR/pkg/pkg_groups"  #  Search for default packages.  Note that a "$ROOTDIR/pkg/pkg_groups"
1337  #  file should eventually be added so that, for convenience, one can  #  file should eventually be added so that, for convenience, one can
1338  #  specify groups of packages using names like "ocean" and "atmosphere".  #  specify groups of packages using names like "ocean" and "atmosphere".
1339  echo  -n "  checking default package list:  "  echo "  checking default package list:  "
1340  if test "x${PDEFAULT}" = x ; then  if test "x${PDEFAULT}" = x ; then
1341      for i in "." $MODS ; do      for i in "." $MODS ; do
1342          if test -r $i"/packages.conf" ; then          if test -r $i"/packages.conf" ; then
# Line 973  if test "x${PDEFAULT}" = x ; then Line 1349  if test "x${PDEFAULT}" = x ; then
1349      PDEFAULT="$ROOTDIR/pkg/pkg_default"      PDEFAULT="$ROOTDIR/pkg/pkg_default"
1350  fi  fi
1351  if test "x${PDEFAULT}" = xNONE ; then  if test "x${PDEFAULT}" = xNONE ; then
1352      echo "default packages file disabled"      echo "    default packages file disabled"
1353  else  else
1354      if test ! -r $PDEFAULT ; then      if test ! -r $PDEFAULT ; then
         echo ""  
1355          echo "Warning:  can't read default packages from PDEFAULT=\"$PDEFAULT\""          echo "Warning:  can't read default packages from PDEFAULT=\"$PDEFAULT\""
1356      else      else
1357          echo "  using PDEFAULT=\"$PDEFAULT\""          echo "    using PDEFAULT=\"$PDEFAULT\""
1358          #  Strip the comments and add all the names          #  Strip the comments and add all the names
1359          def=`cat $PDEFAULT | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`          def=`cat $PDEFAULT | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
1360          RETVAL=$?          RETVAL=$?
1361          if test "x${RETVAL}" != x0 ; then          if test "x${RETVAL}" != x0 ; then
1362              echo -n "Error: can't parse default package list "              printf "Error: can't parse default package list "
1363              echo "-- please check PDEFAULT=\"$PDEFAULT\""              echo "-- please check PDEFAULT=\"$PDEFAULT\""
1364              exit 1              exit 1
1365          fi          fi
# Line 992  else Line 1367  else
1367              PACKAGES="$PACKAGES $i"              PACKAGES="$PACKAGES $i"
1368          done          done
1369          echo "    before group expansion packages are: $PACKAGES"          echo "    before group expansion packages are: $PACKAGES"
1370          expand_pkg_groups          RET=1
1371            while test $RET = 1 ; do expand_pkg_groups; RET=$?; done
1372          echo "    after group expansion packages are:  $PACKAGES"          echo "    after group expansion packages are:  $PACKAGES"
1373      fi      fi
1374  fi  fi
1375    
1376  echo "  applying DISABLE settings"  echo "  applying DISABLE settings"
1377    for i in $PACKAGES ; do
1378        echo $i >> ./.tmp_pack
1379    done
1380    for i in `grep  "-" ./.tmp_pack` ; do
1381        j=`echo $i | sed 's/[-]//'`
1382        DISABLE="$DISABLE $j"
1383    done
1384  pack=  pack=
1385  for p in $PACKAGES ; do  for p in $PACKAGES ; do
1386      addit="t"      addit="t"
# Line 1014  PACKAGES="$pack" Line 1397  PACKAGES="$pack"
1397  echo "  applying ENABLE settings"  echo "  applying ENABLE settings"
1398  echo "" > ./.tmp_pack  echo "" > ./.tmp_pack
1399  PACKAGES="$PACKAGES $ENABLE"  PACKAGES="$PACKAGES $ENABLE"
1400    # Test if each explicitly referenced package exists
1401  for i in $PACKAGES ; do  for i in $PACKAGES ; do
1402      if test ! -d "$ROOTDIR/pkg/$i" ; then      j=`echo $i | sed 's/[-+]//'`
1403        if test ! -d "$ROOTDIR/pkg/$j" ; then
1404          echo "Error: can't find package $i at \"$ROOTDIR/pkg/$i\""          echo "Error: can't find package $i at \"$ROOTDIR/pkg/$i\""
1405          exit 1          exit 1
1406      fi      fi
1407      echo $i >> ./.tmp_pack      echo $i >> ./.tmp_pack
1408  done  done
 pack=`cat ./.tmp_pack | sort | uniq`  
 rm -f ./.tmp_pack  
1409  PACKAGES=  PACKAGES=
1410  for i in $pack ; do  for i in `grep -v "-" ./.tmp_pack | sort | uniq` ; do
1411      PACKAGES="$PACKAGES $i"      PACKAGES="$PACKAGES $i"
1412  done  done
1413    rm -f ./.tmp_pack
1414  echo "    packages are:  $PACKAGES"  echo "    packages are:  $PACKAGES"
1415    
1416  echo "  applying package dependency rules"  echo "  applying package dependency rules"
# Line 1093  while test "x$ck" != xtt ; do Line 1477  while test "x$ck" != xtt ; do
1477              echo "  the dependency rules for \"$dname\""              echo "  the dependency rules for \"$dname\""
1478              exit 1              exit 1
1479          fi          fi
1480          i=$(( $i + 1 ))          i=`echo "$i + 1" | bc -l`
1481            #i=$(( $i + 1 ))
1482      done      done
1483      ck=$ck"t"      ck=$ck"t"
1484  done  done
# Line 1112  for i in $PACKAGES ; do Line 1497  for i in $PACKAGES ; do
1497      fi      fi
1498  done  done
1499    
1500    #  Build MNC templates and check for ability to build and use NetCDF
1501    echo $PACKAGES | grep ' mnc ' > /dev/null 2>&1
1502    RETVAL=$?
1503    if test "x$RETVAL" = x0 ; then
1504        ( cd $ROOTDIR"/pkg/mnc" && $MAKE templates ) > make_mnc.errors 2>&1
1505        RETVAL=$?
1506        if test "x${RETVAL}" = x0 ; then
1507            rm -f make_mnc.errors
1508        else
1509            echo "Error: problem encountered while building source files in pkg/mnc:"
1510            cat make_mnc.errors 1>&2
1511            exit 1
1512        fi
1513        if test "x$HAVE_NETCDF" != xt ; then
1514            cat <<EOF
1515    
1516  # Create a list of #define and #undef to enable/disable packages  WARNING: the "mnc" package has been enabled but tests failed to
1517  PACKAGES_DOT_H=PACKAGES_CONFIG.h    compile and/or execute NetCDF applications.  Please check that:
 cat <<EOF >$PACKAGES_DOT_H".tmp"  
 C=== GENMAKE v2 ===  
 C  The following defines have been set by GENMAKE, so please do not  
 C  edit anything below these comments.  In general, you should  
 C  add or remove packages by re-running genmake with different  
 C  "-enable" and/or "-disable" options.  
   
 #ifndef PACKAGES_H  
 #define PACKAGES_H  
1518    
1519  C  Packages disabled by genmake:    1) NetCDF is installed for your compiler and
1520      2) the LIBS variable (within the 'optfile") specifies the correct
1521           NetCDF library to link against.
1522      
1523  EOF  EOF
1524        fi
1525    fi
1526    
1527    # Create a list of #define and #undef to enable/disable packages
1528    PACKAGES_DOT_H=PACKAGES_CONFIG.h
1529  #  The following UGLY HACK sets multiple "#undef"s and it needs to go  #  The following UGLY HACK sets multiple "#undef"s and it needs to go
1530  #  away.  On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h  #  away.  On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h
1531  #  file would eventually be split up so that all package-related #define  #  file would eventually be split up so that all package-related #define
1532  #  statements could be separated and handled only by genmake.  #  statements could be separated and handled only by genmake.
1533  names=`ls -1 "$ROOTDIR/pkg"`  names=`ls -1 "$ROOTDIR/pkg"`
1534  all_pack=  all_pack=
1535    DISABLED_PACKAGES=
1536  for n in $names ; do  for n in $names ; do
1537      if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then      if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
1538          has_pack="f"          has_pack="f"
# Line 1144  for n in $names ; do Line 1544  for n in $names ; do
1544          done          done
1545          if test "x$has_pack" = xf ; then          if test "x$has_pack" = xf ; then
1546              undef=`echo "ALLOW_$n" | $AWK '{print toupper($0)}'`              undef=`echo "ALLOW_$n" | $AWK '{print toupper($0)}'`
1547              echo "#undef $undef" >> $PACKAGES_DOT_H".tmp"              DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
1548          fi          fi
1549      fi      fi
1550  done  done
1551  cat <<EOF >>$PACKAGES_DOT_H".tmp"  ENABLED_PACKAGES=
   
 C  Packages enabled by genmake:  
 EOF  
1552  for i in $PACKAGES ; do  for i in $PACKAGES ; do
1553      def=`echo "ALLOW_$i" | $AWK '{print toupper($0)}'`      def=`echo "ALLOW_$i" | $AWK '{print toupper($0)}'`
1554      echo "#define $def" >> $PACKAGES_DOT_H".tmp"      ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
1555  #eh3 DEFINES="$DEFINES -D$def"  #eh3 DEFINES="$DEFINES -D$def"
1556    
1557  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!
1558      case $i in      case $i in
1559          aim_v23)          aim_v23)
1560              echo "#define   ALLOW_AIM" >> $PACKAGES_DOT_H".tmp"              ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
1561              DEFINES="$DEFINES -DALLOW_AIM"              echo "Warning: ALLOW_AIM is set to enable aim_v23."
             echo "Warning: ALLOW_AIM is set to enable aim_v23. This is REALLY ugly Jean-Michel :-)"  
1562              ;;              ;;
1563      esac      esac
1564  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!
1565    
1566  done  done
 cat <<EOF >>$PACKAGES_DOT_H".tmp"  
   
 #endif /* PACKAGES_H */  
 EOF  
   
 if test ! -f $PACKAGES_DOT_H ; then  
     mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H  
 else  
     cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H  
     RETVAL=$?  
     if test "x$RETVAL" = x0 ; then  
         rm -f $PACKAGES_DOT_H".tmp"  
     else  
         mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"  
         mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H  
     fi  
 fi  
1567    
1568  echo "  Adding STANDARDDIRS"  echo "  Adding STANDARDDIRS"
1569  BUILDDIR=${BUILDDIR:-.}  BUILDDIR=${BUILDDIR:-.}
1570  if test "x$STANDARDDIRS" = x ; then  if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
1571      STANDARDDIRS="eesupp model"      STANDARDDIRS="eesupp model"
1572  fi  fi
1573  for d in $STANDARDDIRS ; do  if test "x$STANDARDDIRS" != x ; then
1574      adr="$ROOTDIR/$d/src"      for d in $STANDARDDIRS ; do
1575      if test ! -d $adr ; then          adr="$ROOTDIR/$d/src"
1576          echo "Error:  directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""          if test ! -d $adr ; then
1577          echo "  is correct and that you correctly specified the STANDARDDIRS option"              echo "Error:  directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1578          exit 1              echo "  is correct and that you correctly specified the STANDARDDIRS option"
1579      else              exit 1
1580          SOURCEDIRS="$SOURCEDIRS $adr"          else
1581      fi              SOURCEDIRS="$SOURCEDIRS $adr"
1582      adr="$ROOTDIR/$d/inc"          fi
1583      if test ! -d $adr ; then          adr="$ROOTDIR/$d/inc"
1584          echo "Error:  directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""          if test ! -d $adr ; then
1585          echo "  is correct and that you correctly specified the STANDARDDIRS option"              echo "Error:  directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1586          exit 1              echo "  is correct and that you correctly specified the STANDARDDIRS option"
1587      else              exit 1
1588          INCLUDEDIRS="$INCLUDEDIRS $adr"          else
1589      fi              INCLUDEDIRS="$INCLUDEDIRS $adr"
1590  done          fi
1591        done
1592    fi
1593    
1594  echo "  Searching for CPP_OPTIONS.h in order to warn about the presence"  echo "  Searching for *OPTIONS.h files in order to warn about the presence"
1595  echo "    of \"#define ALLOW_PKGNAME\"-type statements:"  echo "    of \"#define \"-type statements that are no longer allowed:"
1596  CPP_OPTIONS=  CPP_OPTIONS=
1597    CPP_EEOPTIONS=
1598  spaths=". $INCLUDEDIRS"  spaths=". $INCLUDEDIRS"
1599    names=`ls -1 "$ROOTDIR/pkg"`
1600  for i in $spaths ; do  for i in $spaths ; do
1601      try="$i/CPP_OPTIONS.h"      try="$i/CPP_OPTIONS.h"
1602      #  echo -n "    trying $try : "      if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
     if test -f $try -a -r $try ; then  
1603          echo "    found CPP_OPTIONS=\"$try\""          echo "    found CPP_OPTIONS=\"$try\""
1604          CPP_OPTIONS="$try"          CPP_OPTIONS="$try"
1605          break          # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
1606            for n in $names ; do
1607                test_for_package_in_cpp_options $CPP_OPTIONS $n
1608            done
1609        fi
1610        try="$i/CPP_EEOPTIONS.h"
1611        if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
1612            echo "    found CPP_EEOPTIONS=\"$try\""
1613            # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
1614    #**** not yet enabled ****
1615    #        test_for_mpi_in_cpp_eeoptions $try
1616    #**** not yet enabled ****
1617            CPP_EEOPTIONS="$try"
1618      fi      fi
1619  done  done
1620  if test "x$CPP_OPTIONS" = x ; then  if test "x$CPP_OPTIONS" = x ; then
1621      echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"      echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
1622      exit 1      exit 1
1623  fi  fi
 # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h  
 names=`ls -1 "$ROOTDIR/pkg"`  
 for n in $names ; do  
     test_for_package_in_cpp_options $CPP_OPTIONS $n  
 done  
   
1624    
1625  #  Here, we build the list of files to be "run through" the adjoint  #  Here, we build the list of files to be "run through" the adjoint
1626  #  compiler.  #  compiler.
# Line 1247  for i in $SOURCEDIRS ; do Line 1635  for i in $SOURCEDIRS ; do
1635      done      done
1636  done  done
1637    
 cat <<EOF > adjoint_sed  
 s/call adopen(/call adopen ( mythid,\\  
      \&           /g  
 s/call adclose(/call adclose( mythid,\\  
      \&           /g  
 s/call adread(/call adread ( mythid,\\  
      \&           /g  
 s/call adwrite(/call adwrite( mythid,\\  
      \&           /g  
   
 EOF  
1638    
1639  echo  echo
1640  echo "===  Creating the Makefile  ==="  echo "===  Creating the Makefile  ==="
1641  echo "  setting INCLUDES"  echo "  setting INCLUDES"
1642  for i in $INCLUDEDIRS ; do  for i in $INCLUDEDIRS ; do
1643      if ! test -d $i ; then      if test ! -d $i ; then
 #       INCLUDES="$INCLUDES -I$i"  
 #   else  
1644          echo "Warning: can't find INCLUDEDIRS=\"$i\""          echo "Warning: can't find INCLUDEDIRS=\"$i\""
1645      fi      fi
1646  done  done
# Line 1275  rm -rf .links.tmp Line 1650  rm -rf .links.tmp
1650  mkdir .links.tmp  mkdir .links.tmp
1651  echo "# This section creates symbolic links" > srclinks.tmp  echo "# This section creates symbolic links" > srclinks.tmp
1652  echo "" >> srclinks.tmp  echo "" >> srclinks.tmp
1653  echo -n 'SRCFILES = '    > srclist.inc  printf 'SRCFILES = '    > srclist.inc
1654  echo -n 'CSRCFILES = '   > csrclist.inc  printf 'CSRCFILES = '   > csrclist.inc
1655  echo -n 'F90SRCFILES = ' > f90srclist.inc  printf 'F90SRCFILES = ' > f90srclist.inc
1656  echo -n 'HEADERFILES = ' > hlist.inc  printf 'HEADERFILES = ' > hlist.inc
1657  echo -n 'AD_FLOW_FILES = ' > ad_flow_files.inc  printf 'AD_FLOW_FILES = ' > ad_flow_files.inc
1658  alldirs="$SOURCEDIRS $INCLUDEDIRS ."  alldirs="$SOURCEDIRS $INCLUDEDIRS ."
1659  for d in $alldirs ; do  for d in $alldirs ; do
1660      deplist=      deplist=
# Line 1288  for d in $alldirs ; do Line 1663  for d in $alldirs ; do
1663      for sf in $sfiles ; do      for sf in $sfiles ; do
1664          if test ! -r ".links.tmp/$sf" ; then          if test ! -r ".links.tmp/$sf" ; then
1665              if test -f "$d/$sf" ; then              if test -f "$d/$sf" ; then
1666                    case $d/$sf in
1667                      ./$PACKAGES_DOT_H)
1668                            ;;
1669                      ./AD_CONFIG.h)
1670                            ;;
1671                      ./FC_NAMEMANGLE.h)
1672                            ;;
1673                      *)
1674                            touch .links.tmp/$sf
1675                            deplist="$deplist $sf"
1676                            ;;
1677                    esac
1678                  extn=`echo $sf | $AWK -F '.' '{print $NF}'`                  extn=`echo $sf | $AWK -F '.' '{print $NF}'`
                 touch .links.tmp/$sf  
                 deplist="$deplist $sf"  
1679                  case $extn in                  case $extn in
1680                      F)                      F)
1681                          echo    " \\"  >> srclist.inc                          echo    " \\"  >> srclist.inc
1682                          echo -n " $sf" >> srclist.inc                          printf " $sf" >> srclist.inc
1683                          ;;                          ;;
1684                      F90)                      F90)
1685                          echo    " \\"  >> f90srclist.inc                          echo    " \\"  >> f90srclist.inc
1686                          echo -n " $sf" >> f90srclist.inc                          printf " $sf" >> f90srclist.inc
1687                          ;;                          ;;
1688                      c)                      c)
1689                          echo    " \\"  >> csrclist.inc                          echo    " \\"  >> csrclist.inc
1690                          echo -n " $sf" >> csrclist.inc                          printf " $sf" >> csrclist.inc
1691                          ;;                          ;;
1692                      h)                      h)
1693                          echo    " \\"  >> hlist.inc                          echo    " \\"  >> hlist.inc
1694                          echo -n " $sf" >> hlist.inc                          printf " $sf" >> hlist.inc
1695                          ;;                          ;;
1696                      flow)                      flow)
1697                          echo    " \\"  >> ad_flow_files.inc                          echo    " \\"  >> ad_flow_files.inc
1698                          echo -n " $sf" >> ad_flow_files.inc                          printf " $sf" >> ad_flow_files.inc
1699                          ;;                          ;;
1700                  esac                  esac
1701              fi              fi
# Line 1330  echo "" >> f90srclist.inc Line 1715  echo "" >> f90srclist.inc
1715  echo "" >> hlist.inc  echo "" >> hlist.inc
1716  echo "" >> ad_flow_files.inc  echo "" >> ad_flow_files.inc
1717    
1718  if test -e $MAKEFILE ; then  if test -f $MAKEFILE ; then
1719      mv -f $MAKEFILE "$MAKEFILE.bak"      mv -f $MAKEFILE "$MAKEFILE.bak"
1720  fi  fi
1721  echo "  Writing makefile: $MAKEFILE"  echo "  Writing makefile: $MAKEFILE"
# Line 1339  echo "#    $MACHINE" >> $MAKEFILE Line 1724  echo "#    $MACHINE" >> $MAKEFILE
1724  echo "# This makefile was generated automatically on" >> $MAKEFILE  echo "# This makefile was generated automatically on" >> $MAKEFILE
1725  echo "#    $THISDATE" >> $MAKEFILE  echo "#    $THISDATE" >> $MAKEFILE
1726  echo "# by the command:" >> $MAKEFILE  echo "# by the command:" >> $MAKEFILE
1727  echo "#    $0 $@" >> $MAKEFILE  echo "#    $0 $G2ARGS" >> $MAKEFILE
1728  echo "# executed by:" >> $MAKEFILE  echo "# executed by:" >> $MAKEFILE
1729  echo "#    $USER@${THISHOSTNAME}:${THISCWD}" >> $MAKEFILE  echo "#    $USER@${THISHOSTNAME}:${THISCWD}" >> $MAKEFILE
1730    
# Line 1348  EXE_FTL=$EXECUTABLE"_ftl" Line 1733  EXE_FTL=$EXECUTABLE"_ftl"
1733  EXE_SVD=$EXECUTABLE"_svd"  EXE_SVD=$EXECUTABLE"_svd"
1734    
1735  cat >>$MAKEFILE <<EOF  cat >>$MAKEFILE <<EOF
1736    #
1737    # OPTFILE="$OPTFILE"
1738  #  #
1739  # BUILDDIR     : Directory where object files are written  # BUILDDIR     : Directory where object files are written
1740  # SOURCEDIRS   : Directories containing the source (.F) files  # SOURCEDIRS   : Directories containing the source (.F) files
# Line 1381  EXE_AD      = ${EXE_AD} Line 1768  EXE_AD      = ${EXE_AD}
1768  EXE_FTL     = ${EXE_FTL}  EXE_FTL     = ${EXE_FTL}
1769  EXE_SVD     = ${EXE_SVD}  EXE_SVD     = ${EXE_SVD}
1770    
1771    ENABLED_PACKAGES = ${ENABLED_PACKAGES}
1772    DISABLED_PACKAGES = ${DISABLED_PACKAGES}
1773    
1774    # These files are created by Makefile
1775    SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h
1776    
1777  EOF  EOF
1778    
1779  #  Note: figure out some way to add Hyades JAM libraries here  #  Note: figure out some way to add Hyades JAM libraries here
# Line 1399  FC = ${FC} Line 1792  FC = ${FC}
1792  # Fortran compiler  # Fortran compiler
1793  F90C = ${F90C}  F90C = ${F90C}
1794  # Link editor  # Link editor
1795  LINK = ${LINK}  LINK = ${LINK} ${LDADD}
1796    
1797  # Defines for CPP  # Defines for CPP
1798  DEFINES = ${DEFINES}  DEFINES = ${DEFINES}
# Line 1431  cat csrclist.inc      >> $MAKEFILE Line 1824  cat csrclist.inc      >> $MAKEFILE
1824  cat f90srclist.inc    >> $MAKEFILE  cat f90srclist.inc    >> $MAKEFILE
1825  cat hlist.inc         >> $MAKEFILE  cat hlist.inc         >> $MAKEFILE
1826  cat ad_flow_files.inc >> $MAKEFILE  cat ad_flow_files.inc >> $MAKEFILE
1827  echo               >> $MAKEFILE  echo >> $MAKEFILE
1828  echo 'F77FILES =  $(SRCFILES:.F=.f)'                                           >> $MAKEFILE  echo 'F77FILES =  $(SRCFILES:.F=.'$FS')'      >> $MAKEFILE
1829  echo 'F90FILES =  $(F90SRCFILES:.F90=.f90)'                                    >> $MAKEFILE  echo 'F90FILES =  $(F90SRCFILES:.F=.'$FS90')' >> $MAKEFILE
1830  echo 'OBJFILES =  $(SRCFILES:.F=.o) $(CSRCFILES:.c=.o) $(F90SRCFILES:.F90=.o)' >> $MAKEFILE  echo 'OBJFILES =  $(SRCFILES:.F=.o) $(CSRCFILES:.c=.o) $(F90SRCFILES:.F90=.o)' >> $MAKEFILE
1831    echo >> $MAKEFILE
1832    echo '.SUFFIXES:' >> $MAKEFILE
1833    echo '.SUFFIXES: .o .'$FS' .p .F .c .'$FS90' .F90' >> $MAKEFILE
1834  rm -f srclist.inc csrclist.inc hlist.inc flist.tmp clist.tmp f90srclist.inc  rm -f srclist.inc csrclist.inc hlist.inc flist.tmp clist.tmp f90srclist.inc
1835  rm -f ad_flow_files.inc  rm -f ad_flow_files.inc
1836    
1837  cat >>$MAKEFILE <<EOF  cat >>$MAKEFILE <<EOF
1838    
 .SUFFIXES:  
 .SUFFIXES: .o .f .p .F .c .F90 .f90  
   
1839  all: \$(EXECUTABLE)  all: \$(EXECUTABLE)
1840  \$(EXECUTABLE): \$(OBJFILES)  \$(EXECUTABLE): \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(OBJFILES)
1841            @echo Creating \$@ ...
1842          \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)          \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
1843  depend:  depend:
1844          @make links          @make links
1845          \$(MAKEDEPEND) -o .f \$(DEFINES) \$(INCLUDES) \$(SRCFILES)          \$(MAKEDEPEND) -o .$FS \$(DEFINES) \$(INCLUDES) \$(SRCFILES)
1846          ${TOOLSDIR}/f90mkdepend >> \$(MAKEFILE)          \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
1847            -rm -f makedepend.out
1848    
1849  links: \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES)  links: \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(SPECIAL_FILES)
1850    
1851  small_f: \$(F77FILES) \$(F90FILES)  small_f: \$(F77FILES) \$(F90FILES)
1852    
# Line 1461  output.txt: \$(EXECUTABLE) Line 1855  output.txt: \$(EXECUTABLE)
1855          @\$(EXECUTABLE) > \$@          @\$(EXECUTABLE) > \$@
1856    
1857  clean:  clean:
1858          -cat AD_CONFIG.template > AD_CONFIG.h          -rm -rf *.o *.$FS *.p *.$FS90 *.mod ${RMFILES} work.{pc,pcl} *.template
         -rm -rf *.o *.f *.p *.f90 *.mod ${RMFILES} work.{pc,pcl}  
1859  Clean:  Clean:
1860          @make clean          @make clean
1861          @make cleanlinks          @make cleanlinks
1862          -rm -f Makefile.bak genmake_state genmake_*optfile make.log          -rm -f \$(SPECIAL_FILES)
1863            -rm -f genmake_state genmake_*optfile genmake_warnings make.log run.log *.bak
1864  CLEAN:  CLEAN:
1865          @make Clean          @make Clean
1866          -find \$(EXEDIR) -name "*.meta" -exec rm {} \;          -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
1867          -find \$(EXEDIR) -name "*.data" -exec rm {} \;          -find \$(EXEDIR) -name "*.data" -exec rm {} \;
1868          -find \$(EXEDIR) -name "fort.*" -exec rm {} \;          -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
1869          -rm -f \$(EXECUTABLE) output.txt          -rm -f \$(EXECUTABLE) output.txt STD*
1870    
1871  #eh3 Makefile: makefile  #eh3 Makefile: makefile
1872  makefile:  makefile:
1873          ${0} $@          $THIS_SCRIPT $G2ARGS
1874  cleanlinks:  cleanlinks:
1875          -find . -type l -exec rm {} \;          -find . -type l -exec rm {} \;
1876    
1877  # The normal chain of rules is (  .F - .f - .o  )  # Special targets ($SPECIAL_FILES) which are create by make
1878  .F.f:  ${PACKAGES_DOT_H}:
1879            @echo Creating \$@ ...
1880            @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -bPACKAGES_CONFIG_H "Disabled packages:" \$(DISABLED_PACKAGES) " " "Enabled packages:" \$(ENABLED_PACKAGES) > \$@
1881    AD_CONFIG.h:
1882            @echo Creating \$@ ...
1883            @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN -UALLOW_ECCO_OPTIMIZATION > \$@
1884    FC_NAMEMANGLE.h:
1885            @echo Creating \$@ ...
1886            echo "$FC_NAMEMANGLE" > \$@
1887    
1888    # The normal chain of rules is (  .F - .$FS - .o  )
1889    
1890    %.o : %.F
1891    
1892    .F.$FS:
1893          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1894  .f.o:  .$FS.o:
1895          \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<          \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
1896  .F90.f90:  .F90.$FS90:
1897          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1898  .f90.o:  .$FS90.o:
1899          \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<          \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
1900  .c.o:  .c.o:
1901          \$(CC) \$(CFLAGS) -c \$<          \$(CC) \$(CFLAGS) -c \$<
1902    
1903  # Special exceptions that use the ( .F - .p - .f - .o ) rule-chain  # Special exceptions that use the ( .F - .p - .$FS - .o ) rule-chain
1904  .F.p:  .F.p:
1905          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1906  .p.f:  .p.$FS:
1907          \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<          \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
1908    
1909  #=========================================  #=========================================
# Line 1522  done Line 1930  done
1930    
1931  echo "  Add the source list for AD code generation"  echo "  Add the source list for AD code generation"
1932  echo >> $MAKEFILE  echo >> $MAKEFILE
1933  echo -n "AD_FILES = " >> $MAKEFILE  printf "AD_FILES = " >> $MAKEFILE
1934  AD_FILES=`cat ad_files`  AD_FILES=`cat ad_files`
1935  for i in $AD_FILES ; do  for i in $AD_FILES ; do
1936      echo    " \\" >> $MAKEFILE      echo    " \\" >> $MAKEFILE
1937      echo -n " $i" >> $MAKEFILE      printf " $i" >> $MAKEFILE
1938  done  done
1939  echo >> $MAKEFILE  echo >> $MAKEFILE
1940  rm -f ad_files  rm -f ad_files
# Line 1539  adtaf: ad_taf_output.f Line 1947  adtaf: ad_taf_output.f
1947  adtamc: ad_tamc_output.f  adtamc: ad_tamc_output.f
1948    
1949  ad_input_code.f: \$(AD_FILES) \$(HEADERFILES)  ad_input_code.f: \$(AD_FILES) \$(HEADERFILES)
1950            @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -DALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN -UALLOW_ECCO_OPTIMIZATION > ad_config.template
1951          cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h          cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
1952            -rm -f ad_config.template
1953          @make \$(F77FILES)          @make \$(F77FILES)
1954          @make \$(AD_FLOW_FILES)          @make \$(AD_FLOW_FILES)
1955          cat \$(AD_FLOW_FILES) \$(AD_FILES) > ad_input_code.f          cat \$(AD_FLOW_FILES) \$(AD_FILES) > ad_input_code.f
1956    
1957  ad_taf_output.f: ad_input_code.f  ad_taf_output.f: ad_input_code.f
1958          \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f          \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f
1959          cat ad_input_code_ad.f | sed -f adjoint_sed > ad_taf_output.f          cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f
1960    
1961  adtafonly:  adtafonly:
1962          \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f          \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f
1963          cat ad_input_code_ad.f | sed -f adjoint_sed > ad_taf_output.f          cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f
1964    
1965  ad_taf: ad_taf_output.o \$(OBJFILES)  ad_taf: ad_taf_output.o \$(OBJFILES)
1966          \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)          \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
1967    
1968  ad_tamc_output.f: ad_input_code.f  ad_tamc_output.f: ad_input_code.f
1969          \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.f          \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.f
1970          cat ad_input_code_ad.f | sed -f adjoint_sed > ad_tamc_output.f          cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.f
1971    
1972  ad_tamc: ad_tamc_output.o \$(OBJFILES)  ad_tamc: ad_tamc_output.o \$(OBJFILES)
1973          \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)          \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
# Line 1569  ftltaf: ftl_taf_output.f Line 1979  ftltaf: ftl_taf_output.f
1979  ftltamc: ftl_tamc_output.f  ftltamc: ftl_tamc_output.f
1980    
1981  ftl_input_code.f: \$(AD_FILES) \$(HEADERFILES)  ftl_input_code.f: \$(AD_FILES) \$(HEADERFILES)
1982            @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -UALLOW_ADJOINT_RUN -DALLOW_TANGENTLINEAR_RUN -UALLOW_ECCO_OPTIMIZATION > ftl_config.template
1983          cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h          cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
1984            -rm -f ftl_config.template
1985          @make \$(F77FILES)          @make \$(F77FILES)
1986          @make \$(AD_FLOW_FILES)          @make \$(AD_FLOW_FILES)
1987          cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.f          cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.f
1988    
1989  ftl_taf_output.f: ftl_input_code.f  ftl_taf_output.f: ftl_input_code.f
1990          \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f          \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f
1991          cat ftl_input_code_ftl.f | sed -f adjoint_sed > ftl_taf_output.f          cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f
1992    
1993    ftltafonly:
1994            \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f
1995            cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f
1996    
1997  ftl_taf: ftl_taf_output.o \$(OBJFILES)  ftl_taf: ftl_taf_output.o \$(OBJFILES)
1998          \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)          \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
1999    
2000  ftl_tamc_output.f: ftl_input_code.f  ftl_tamc_output.f: ftl_input_code.f
2001          \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.f          \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.f
2002          cat ftl_input_code_ftl.f | sed -f adjoint_sed > ftl_tamc_output.f          cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.f
2003    
2004  ftl_tamc: ftl_tamc_output.o \$(OBJFILES)  ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
2005          \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)          \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
2006    
2007    
2008  # ... SVD ...  # ... SVD ...
2009  svd: svd_taf  svdtaf: ad_taf_output.f ftl_taf_output.f
2010  svd_taf_f: svd_taf_output.f  svdall: svd_taf
   
 svd_input_code.f: \$(SRCFILES)  
         cmp svd_config.template AD_CONFIG.h || cat svd_config.template > AD_CONFIG.h  
         @make \$(F77FILES)  
         @make \$(AD_FLOW_FILES)  
         cat \$(AD_FLOW_FILES) \$(AD_FILES) > svd_input_code.f  
   
 svd_taf_output.f: svd_input_code.f  
         \$(TAF) \$(SVD_TAF_FLAGS) \$(TAF_EXTRA) svd_input_code.f  
         cat svd_input_code_ad.f | sed -f adjoint_sed > svd_taf_output.f  
2011    
2012  svd_taf: svd_taf_output.o \$(OBJFILES)  svd_taf: ad_taf_output.o ftl_taf_output.o \$(OBJFILES)
2013          \$(LINK) -o ${EXE_SVD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) svd_taf_output.o \$(LIBS)          \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
2014    
2015    
2016  #=========================================  #=========================================
# Line 1622  for i in $KPPFILES ; do Line 2028  for i in $KPPFILES ; do
2028      if test "x$RETVAL" != x0 ; then      if test "x$RETVAL" != x0 ; then
2029          echo "Error: unable to add file \"$i\" to the exceptions list"          echo "Error: unable to add file \"$i\" to the exceptions list"
2030      fi      fi
2031      echo "$base.f: $base.p" >> $MAKEFILE      echo "$base.$FS: $base.p" >> $MAKEFILE
2032  done  done
2033    
2034  echo "  Making list of NOOPTFILES"  echo "  Making list of NOOPTFILES"
# Line 1632  for i in $NOOPTFILES ; do Line 2038  for i in $NOOPTFILES ; do
2038      if test "x$RETVAL" != x0 ; then      if test "x$RETVAL" != x0 ; then
2039          echo "Error: unable to add file \"$i\" to the exceptions list"          echo "Error: unable to add file \"$i\" to the exceptions list"
2040      fi      fi
2041      echo "$base.o: $base.f" >> $MAKEFILE      echo "$base.o: $base.$FS" >> $MAKEFILE
2042      printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE      printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE
2043  done  done
2044    
# Line 1645  printf "\n\n# DO NOT DELETE\n" >> $MAKEF Line 2051  printf "\n\n# DO NOT DELETE\n" >> $MAKEF
2051    
2052  printf "\n===  Done  ===\n"  printf "\n===  Done  ===\n"
2053    
2054  #  Write the "template" files for the adjoint builds  # Create special header files
2055  cat >AD_CONFIG.template <<EOF  $BASH $TOOLSDIR/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -bPACKAGES_CONFIG_H "Disabled packages:" $DISABLED_PACKAGES " " "Enabled packages:" $ENABLED_PACKAGES > $PACKAGES_DOT_H".tmp"
2056  C  WARNING: This file is automatically generated by genmake2 and  if test ! -f $PACKAGES_DOT_H ; then
2057  C    used by the Makefile rules.  Please DO NOT EDIT this file      mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
2058  C    unless you are CERTAIN that you know what you are doing.  else
2059        cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H > /dev/null 2>&1
2060  #undef ALLOW_ADJOINT_RUN      RETVAL=$?
2061  #undef ALLOW_TANGENTLINEAR_RUN      if test "x$RETVAL" = x0 ; then
2062  #undef ALLOW_ECCO_OPTIMIZATION          rm -f $PACKAGES_DOT_H".tmp"
2063  EOF      else
2064  cat >ad_config.template <<EOF          mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"
2065  C  WARNING: This file is automatically generated by genmake2 and          mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
2066  C    used by the Makefile rules.  Please DO NOT EDIT this file      fi
2067  C    unless you are CERTAIN that you know what you are doing.  fi
2068    if test ! -f AD_CONFIG.h ; then
2069  #define ALLOW_ADJOINT_RUN      $BASH $TOOLSDIR/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -UALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN -UALLOW_ECCO_OPTIMIZATION > AD_CONFIG.h
2070  #undef ALLOW_TANGENTLINEAR_RUN  fi
 #undef ALLOW_ECCO_OPTIMIZATION  
 EOF  
 cat >ftl_config.template <<EOF  
 C  WARNING: This file is automatically generated by genmake2 and  
 C    used by the Makefile rules.  Please DO NOT EDIT this file  
 C    unless you are CERTAIN that you know what you are doing.  
   
 #undef ALLOW_ADJOINT_RUN  
 #define ALLOW_TANGENTLINEAR_RUN  
 #undef ALLOW_ECCO_OPTIMIZATION  
 EOF  
 cat >svd_config.template <<EOF  
 C  WARNING: This file is automatically generated by genmake2 and  
 C    used by the Makefile rules.  Please DO NOT EDIT this file  
 C    unless you are CERTAIN that you know what you are doing.  
   
 #undef ALLOW_ADJOINT_RUN  
 #undef ALLOW_TANGENTLINEAR_RUN  
 #undef ALLOW_ECCO_OPTIMIZATION  
 EOF  
 cp AD_CONFIG.template AD_CONFIG.h  
2071    
2072    
2073  #  Write the "state" for future records  #  Write the "state" for future records
2074  if test "x$DUMPSTATE" != xf ; then  if test "x$DUMPSTATE" != xf ; then
2075      echo -n "" > genmake_state      printf "" > genmake_state
2076      for i in $gm_state ; do      for i in $gm_state ; do
2077          t1="t2=\$$i"          t1="t2=\$$i"
2078          eval $t1          eval $t1

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

  ViewVC Help
Powered by ViewVC 1.1.22