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

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

  ViewVC Help
Powered by ViewVC 1.1.22