/[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.10 by adcroft, Fri Sep 26 18:47:59 2003 UTC revision 1.73 by edhill, Tue Mar 16 18:20:34 2004 UTC
# Line 1  Line 1 
1  #!/bin/bash  #! /usr/bin/env bash
2  #  #
3  # $Header$  # $Header$
4  #  #
# Line 8  Line 8 
8  #   modified by aja 01/00  #   modified by aja 01/00
9  #   rewritten in bash by eh3 08/03  #   rewritten in bash by eh3 08/03
10    
11    # Search for particular CPP #cmds associated with packages
12    # usage: test_for_package_in_cpp_options CPP_file package_name
13    test_for_package_in_cpp_options() {
14        cpp_options=$1
15        pkg=$2
16        test_for_string_in_file $cpp_options "^[ ]*#define.*ALLOW_$pkg" || exit 99
17        test_for_string_in_file $cpp_options "^[ ]*#undef.*ALLOW_$pkg" || exit 99
18        test_for_string_in_file $cpp_options "^[ ]*#define.*DISABLE_$pkg" || exit 99
19        test_for_string_in_file $cpp_options "^[ ]*#undef.*DISABLE_$pkg" || exit 99
20    }
21    
22    # Search for particular CPP #cmds associated with MPI
23    # usage: test_for_mpi_in_cpp_eeoptions CPP_file
24    test_for_mpi_in_cpp_eeoptions() {
25        cpp_options=$1
26        test_for_string_in_file $cpp_options "^[ ]*#define.*ALLOW_USE_MPI" || exit 99
27        test_for_string_in_file $cpp_options "^[ ]*#undef.*ALLOW_USE_MPI" || exit 99
28        test_for_string_in_file $cpp_options "^[ ]*#define.*ALWAYS_USE_MPI" || exit 99
29        test_for_string_in_file $cpp_options "^[ ]*#undef.*ALWAYS_USE_MPI" || exit 99
30    }
31    
32    # Search for particular string in a file. Return 1 if detected, 0 if not
33    # usage: test_for_string_in_file file string
34    test_for_string_in_file() {
35        file=$1
36        strng=$2
37        grep -i "$strng" $file > /dev/null 2>&1
38        RETVAL=$?
39        if test "x${RETVAL}" = x0 ; then
40            printf "Error: In $file there is an illegal line: "
41            grep -i "$strng" $file
42            return 1
43        fi
44        return 0
45    }
46    
47    # Read the $ROOTDIR/pkg/pkg_groups file and expand any references to
48    # the package list.
49    expand_pkg_groups() {
50        new_packages=
51        PKG_GROUPS=$ROOTDIR"/pkg/pkg_groups"
52        if test -r $PKG_GROUPS ; then
53            cat $PKG_GROUPS | sed -e 's/#.*$//g' | sed -e 's/:/ : /g' > ./p1.tmp
54            cat ./p1.tmp | $AWK '(NF>2 && $2==":"){ print $0 }' > ./p2.tmp
55            matched=0
56            for i in $PACKAGES ; do
57                line=`grep "^ *$i" ./p2.tmp`
58                RETVAL=$?
59                if test "x$RETVAL" = x0 ; then
60                    matched=1
61                    replace=`echo $line | $AWK '{ $1=""; $2=""; print $0 }'`
62                    echo "    replacing \"$i\" with: $replace"
63                    new_packages="$new_packages $replace"
64                else
65                    new_packages="$new_packages $i"
66                fi
67            done
68            PACKAGES=$new_packages
69            rm -f ./p[1,2].tmp
70        else
71            echo "Warning: can't read package groups definition file: $PKG_GROUPS"
72        fi
73    }
74    
75  # Guess possible config options for this host  # Guess possible config options for this host
76  find_possible_configs()  {  find_possible_configs()  {
77    
78      p_PLATFORM=`uname`"-"`uname -m`      tmp1=`uname`"_"`uname -m`
79      echo "The platform appears to be:"      tmp2=`echo $tmp1 | sed -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
80      echo "  "$p_PLATFORM      tmp3=`echo $tmp2 | sed -e 's/power macintosh/ppc/'`
81        tmp1=`echo $tmp3 | sed -e 's|x86_64|amd64|'`
82      p_LN=      tmp2=`echo $tmp1 | sed -e 's/i[3-6]86/ia32/' | sed -e 's/athlon/ia32/'`
83        tmp3=`echo $tmp2 | sed -e 's/cray sv1/craysv1/'`
84        PLATFORM=$tmp3
85        OFLIST=`(cd $ROOTDIR/tools/build_options; ls | grep "^$PLATFORM")`
86        echo "  The platform appears to be:  $PLATFORM"
87        
88      echo "test" > test      echo "test" > test
89      ln -s ./test link      ln -s ./test link
90      RETVAL=$?      RETVAL=$?
91      if test "x${RETVAL}" = x0 ; then      if test "x${RETVAL}" = x0 ; then
92          p_LN="ln -s"          LN="ln -s"
93        else
94            echo "Error: \"ln -s\" does not appear to work on this system!"
95            echo "  For help, please contact <MITgcm-support@mitgcm.org>."
96            exit 1
97      fi      fi
98      rm -f test link      rm -f test link
99    
100      p_CPP=`which cpp`      if test "x$CPP" = x ; then
101                CPP="cpp -traditional -P"
102      RETVAL=$?      fi
103      if test "x${RETVAL}" = x0 ; then  
104          p_LN="ln -s"      #  The "original" makedepend is part of the Imake system that is
105        #  most often distributed with XFree86 or with an XFree86 source
106        #  package.  As a result, many machines (eg. generic Linux) do not
107        #  have a system-default "makedepend" available.  For those
108        #  systems, we have two fall-back options:
109        #
110        #    1) a makedepend implementation shipped with the cyrus-imapd
111        #       package:  ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/
112        #
113        #    2) a known-buggy xmakedpend shell script
114        #
115        #  So the choices are, in order:
116        #
117        #    1) use the user-specified program
118        #    2) use a system-wide default
119        #    3) locally build and use the cyrus implementation
120        #    4) fall back to the buggy local xmakedpend script
121        #
122        if test "x${MAKEDEPEND}" = x ; then
123          which makedepend > /dev/null 2>&1
124          RETVAL=$?
125          if test ! "x${RETVAL}" = x0 ; then
126             echo "    a system-default makedepend was not found."
127    
128             #  Try to build the cyrus impl
129             rm -f ./genmake_cy_md
130             (
131                 cd $ROOTDIR/tools/cyrus-imapd-makedepend  \
132                     &&  ./configure > /dev/null 2>&1  \
133                     &&  make > /dev/null 2>&1  \
134                     &&  ./makedepend ifparser.c > /dev/null 2>&1  \
135                     &&  echo "true"
136             ) > ./genmake_cy_md
137             grep true ./genmake_cy_md > /dev/null 2>&1
138             RETVAL=$?
139             if test "x$RETVAL" = x0 ; then
140                 MAKEDEPEND='$(TOOLSDIR)/cyrus-imapd-makedepend/makedepend'
141             else
142                 MAKEDEPEND='$(TOOLSDIR)/xmakedepend'
143             fi
144             rm -f ./genmake_cy_md
145          fi
146      fi      fi
     rm -f test link  
147    
148      # look for possible fortran compilers      # look for possible fortran compilers
149        tmp="$MITGCM_FC $FC efc g77 f77 pgf77 pgf95 ifc f90 f95 mpif77 mpf77 mpxlf95"
150      p_FC=      p_FC=
151      for c in f77 g77 pgf77 pgf95 ifc f90 f95 mpif77 mpf77 mpxlf95 ; do      for c in $tmp ; do
152          which $c > /dev/null 2>&1          rm -f ./hello.f ./hello
153            cat >> hello.f <<EOF
154          program hello
155          do i=1,3
156            print *, 'hello world : ', i
157          enddo
158          end
159    EOF
160            $c -o hello hello.f > /dev/null 2>&1
161          RETVAL=$?          RETVAL=$?
162          if test "x${RETVAL}" = x0 ; then          if test "x${RETVAL}" = x0 ; then
163              p_FC="$p_FC $c"              p_FC="$p_FC $c"
164          fi          fi
165      done      done
166      echo "Possible FORTRAN compilers appear to be:  "      rm -f ./hello.f ./hello
167      if test "x${p_FC}" = x ; then      if test "x${p_FC}" = x ; then
168          echo "  None found!!!"          cat 1>&2 <<EOF
169    
170    Error: No Fortran compilers were found in your path.  Please specify one using:
171    
172        1) an "optfile" on (eg. "-optfile=path/to/OPTFILE"),
173        2) a command-line option (eg. "-fc NAME"), or
174        3) the MITGCM_FC environment variable.
175    
176    EOF
177            exit 1
178      else      else
179          echo "  "$p_FC          echo "  The possible FORTRAN compilers found in your path are:"
180            echo "   "$p_FC
181            if test "x$FC" = x ; then
182                FC=`echo $p_FC | $AWK '{print $1}'`
183                echo "  Setting FORTRAN compiler to: "$FC
184            fi
185      fi      fi
186    
187      # look for possible MPI libraries      if test "x$OPTFILE" = x ; then
188      mpi_libs=          OPTFILE=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$FC
189      mpi_fort=`which mpif77 2>/dev/null`          if test ! -r $OPTFILE ; then
190      RETVAL=$?               echo "  I looked for the file "$OPTFILE" but did not find it"
191      if test "x${RETVAL}" = x0 ; then          fi
192          cat >>test.f <<EOF      fi
193        PROGRAM HELLO  #    echo "  The options file:  $p_OF"
194        DO 10, I=1,10  #    echo "    appears to match so we'll use it."
195        PRINT *,'Hello World'  #   for i in $p_FC ; do
196     10 CONTINUE  #p_OF=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$i
197        STOP  #if test -r $p_OF ; then
198        END  #    OPTFILE=$p_OF
199    #    echo "  The options file:  $p_OF"
200    #    echo "    appears to match so we'll use it."
201    #    break
202    #fi
203    #   done
204        if test "x$OPTFILE" = x ; then
205            cat 1>&2 <<EOF
206    
207    Error: No options file was found in:  $ROOTDIR/tools/build_options/
208      that matches this platform ("$PLATFORM") and the compilers found in
209      your path.  Please specify an "optfile" using:
210    
211        1) the command line (eg. "-optfile=path/to/OPTFILE"), or
212        2) the MITGCM_OF environment variable.
213    
214      If you need help, please contact the developers at <MITgcm-support@mitgcm.org>.
215    
216  EOF  EOF
217          eval "$mpi_fort -showme test.f > out"          exit 1
         RETVAL=$?  
         if test "x${RETVAL}" = x0 ; then  
             a=`cat out`  
             for i in $a ; do  
                 case $i in  
                     -*)  
                         mpi_libs="$mpi_libs $i" ;;  
                 esac  
             done  
             echo "The MPI libs appear to be:"  
             echo "  "$mpi_libs  
         fi  
         rm -f test.f out  
218      fi      fi
219        
220    #     # look for possible MPI libraries
221    #     mpi_libs=
222    #     mpi_fort=`which mpif77 2>/dev/null`
223    #     RETVAL=$?
224    #     if test "x${RETVAL}" = x0 ; then
225    #       cat >>test.f <<EOF
226    #       PROGRAM HELLO
227    #       DO 10, I=1,10
228    #       PRINT *,'Hello World'
229    #    10 CONTINUE
230    #       STOP
231    #       END
232    # EOF
233    #       eval "$mpi_fort -showme test.f > out"
234    #       RETVAL=$?
235    #       if test "x${RETVAL}" = x0 ; then
236    #           a=`cat out`
237    #           for i in $a ; do
238    #               case $i in
239    #                   -*)
240    #                       mpi_libs="$mpi_libs $i" ;;
241    #               esac
242    #           done
243    #           echo "The MPI libs appear to be:"
244    #           echo "  "$mpi_libs
245    #       fi
246    #       rm -f test.f out
247    #     fi
248    
249  }  }
250    
# Line 86  get_pdepend_list()  { Line 254  get_pdepend_list()  {
254      #  strip the comments and then convert the dependency file into      #  strip the comments and then convert the dependency file into
255      #  two arrays: PNAME, DNAME      #  two arrays: PNAME, DNAME
256      cat $1 | sed -e 's/#.*$//g' \      cat $1 | sed -e 's/#.*$//g' \
257          | 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} }' \
258          > ./.pd_tmp          > ./.pd_tmp
259      source ./.pd_tmp      . ./.pd_tmp
260      rm -f ./.pd_tmp      rm -f ./.pd_tmp
261    
262      echo -n "PNAME = "${}      printf "PNAME = "${}
263  }  }
264    
265    
266  #  Explain usage  #  Explain usage
267  usage()  {  usage()  {
268      echo  cat <<EOF
269      echo "Usage: "$0" [OPTIONS]"  
270      echo "  where [OPTIONS] can be:"  Usage: "$0" [OPTIONS]
271      echo    where [OPTIONS] can be:
272      echo "    -help | --help | -h | --h"  
273      echo "    -nooptfile | --nooptfile"      -help | --help | -h | --h
274      echo "      -optfile NAME | --optfile NAME | -of NAME | --of NAME"            Print this help message and exit.
275      echo "      -optfile=NAME | --optfile=NAME | -of=NAME | --of=NAME"  
276      echo "    -pdepend NAME | --pdepend NAME"      -nooptfile | --nooptfile
277      echo "      -pdepend=NAME | --pdepend=NAME"        -optfile NAME | --optfile NAME | -of NAME | --of NAME
278      echo "    -pdefault NAME | --pdefault NAME"        -optfile=NAME | --optfile=NAME | -of=NAME | --of=NAME
279      echo "      -pdefault=NAME | --pdefault=NAME"            Use "NAME" as the optfile.  By default, an attempt will be
280      echo "    -make NAME | -m NAME"            made to find an appropriate "standard" optfile in the
281      echo "      --make=NAME | -m=NAME"            tools/build_options/ directory.
282      echo "    -makefile NAME | -mf NAME"  
283      echo "      --makefile=NAME | -mf=NAME"      -pdepend NAME | --pdepend NAME
284      echo "    -platform NAME | --platform NAME | -pl NAME | --pl NAME"        -pdepend=NAME | --pdepend=NAME
285      echo "      -platform=NAME | --platform=NAME | -pl=NAME | --pl=NAME"            Get package dependency information from "NAME".
286      echo "    -rootdir NAME | --rootdir NAME | -rd NAME | --rd NAME"  
287      echo "      -rootdir=NAME | --rootdir=NAME | -rd=NAME | --rd=NAME"      -pdefault NAME | --pdefault NAME
288      echo "    -mods NAME | --mods NAME | -mo NAME | --mo NAME"        -pdefault=NAME | --pdefault=NAME
289      echo "      -mods=NAME | --mods=NAME | -mo=NAME | --mo=NAME"            Get the default package list from "NAME".
290      echo "    -disable NAME | --disable NAME"  
291      echo "      -disable=NAME | --disable=NAME"      -make NAME | -m NAME
292      echo "    -enable NAME | --enable NAME"        --make=NAME | -m=NAME
293      echo "      -enable=NAME | --enable=NAME"            Use "NAME" for the MAKE program. The default is "make" but
294      echo "    -noopt NAME | --noopt NAME"            many platforms, "gmake" is the preferred choice.
295      echo "      -noopt=NAME | --noopt=NAME"  
296  #    echo "    -cpp NAME | --cpp NAME"      -makefile NAME | -mf NAME
297  #    echo "      -cpp=NAME | --cpp=NAME"        --makefile=NAME | -mf=NAME
298      echo "    -fortran NAME | --fortran NAME | -fc NAME | --fc NAME"            Call the makefile "NAME".  The default is "Makefile".
299      echo "      -fc=NAME | --fc=NAME"  
300      echo "    -[no]ieee | --[no]ieee"      -makedepend NAME | -md NAME
301      echo "    -[no]mpi | --[no]mpi"        --makedepend=NAME | -md=NAME
302      echo "    -[no]jam | --[no]jam"            Use "NAME" for the MAKEDEPEND program.
303      echo  
304      echo "  and NAME is a string such as:"      -rootdir NAME | --rootdir NAME | -rd NAME | --rd NAME
305      echo        -rootdir=NAME | --rootdir=NAME | -rd=NAME | --rd=NAME
306      echo "    --enable pkg1   --enable 'pkg1 pkg2'   --enable 'pkg1 pkg2 pkg3'"            Specify the location of the MITgcm ROOTDIR as "NAME".
307      echo "    -mods=dir1   -mods='dir1'   -mods='dir1 dir2 dir3'"            By default, genamke will try to find the location by
308      echo "    -foptim='-Mvect=cachesize:512000,transform -xtypemap=real:64,double:64,integer:32'"            looking in parent directories (up to the 5th parent).
309      echo  
310      echo "  which, depending upon your shell, may need to be single-quoted"      -mods NAME | --mods NAME | -mo NAME | --mo NAME
311      echo "  if it contains spaces, dashes, or other special characters."        -mods=NAME | --mods=NAME | -mo=NAME | --mo=NAME
312              Here, "NAME" specifies a list of directories that are
313              used for additional source code.  Files found in the
314              "mods list" are given preference over files of the same
315              name found elsewhere.
316    
317        -disable NAME | --disable NAME
318          -disable=NAME | --disable=NAME
319              Here "NAME" specifies a list of packages that we don't
320              want to use.  If this violates package dependencies,
321              genamke will exit with an error message.
322    
323        -enable NAME | --enable NAME
324          -enable=NAME | --enable=NAME
325              Here "NAME" specifies a list of packages that we wish
326              to specifically enable.  If this violates package
327              dependencies, genamke will exit with an error message.
328    
329        -standarddirs NAME | --standarddirs NAME
330          -standarddirs=NAME | --standarddirs=NAME
331              Here, "NAME" specifies a list of directories to be
332              used as the "standard" code.
333    
334        -fortran NAME | --fortran NAME | -fc NAME | --fc NAME
335          -fc=NAME | --fc=NAME
336              Use "NAME" as the fortran compiler.  By default, genmake
337              will search for a working compiler by trying a list of
338              "usual suspects" such as g77, f77, etc.
339    
340        -[no]ieee | --[no]ieee
341              Do or don't use IEEE numerics.  Note that this option
342              *only* works if it is supported by the OPTFILE that
343              is being used.
344    
345        -mpi | --mpi
346              Include MPI header files and link to MPI libraries
347        -mpi=PATH | --mpi=PATH
348              Include MPI header files and link to MPI libraries using MPI_ROOT
349              set to PATH. i.e. Include files from $PATH/include, link to libraries
350              from $PATH/lib and use binaries from $PATH/bin.
351    
352        -bash NAME
353              Explicitly specify the Bourne or BASH shell to use
354    
355      While it is most often a single word, the "NAME" variables specified
356      above can in many cases be a space-delimited string such as:
357    
358        --enable pkg1   --enable 'pkg1 pkg2'   --enable 'pkg1 pkg2 pkg3'
359        -mods=dir1   -mods='dir1'   -mods='dir1 dir2 dir3'
360        -foptim='-Mvect=cachesize:512000,transform -xtypemap=real:64,double:64,integer:32'
361    
362      which, depending upon your shell, may need to be single-quoted.
363    
364      For more detailed genmake documentation, please see:
365    
366        http://mitgcm.org/devel_HOWTO/
367    
368    EOF
369    
370      exit 1      exit 1
371  }  }
372    
373  #eh3 # This is the generic configuration.  #  Build a CPP macro to automate calling C routines from FORTRAN
374  #eh3 set LN         = ( 'ln -s' )  get_fortran_c_namemangling()  {
375  #eh3 set CPP        = ( '/lib/cpp -P' )      default_nm="#define FC_NAMEMANGLE(X) X ## _"
376  #eh3 set S64        = ( '$(TOOLSDIR)/set64bitConst.sh' )      
377  #eh3 set KPP        = (  )      cat > genmake_test.c <<EOF
378  #eh3 set FC         = ( 'f77' )  void tcall( char * string ) { tsub( string ); }
379  #eh3 set LINK       = $FC  EOF
380  #eh3 set MAKEDEPEND = ( 'makedepend' )      $MAKE genmake_test.o >> genmake_warnings 2>&1
381  #eh3 set INCLUDES   = ( -I. )      RETVAL=$?
382  #eh3 set FFLAGS     = (  )      if test "x$RETVAL" != x0 ; then
383  #eh3 set FOPTIM     = (  )          FC_NAMEMANGLE=$default_nm
384  #eh3 set CFLAGS     = (  )          cat <<EOF>> genmake_errors
385  #eh3 set KFLAGS1    = (  )  
386  #eh3 set KFLAGS2    = (  )  WARNING: C test compile fails
387  #eh3 set LIBS       = (  )  WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
388  #eh3 set KPPFILES   = (  )  WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here
389  #eh3 if (! $?NOOPTFILES ) set NOOPTFILES = (  )  EOF
390  #eh3 if (! $?NOOPTFLAGS ) set NOOPTFLAGS = (  )          return 1
391        fi
392        c_tcall=`nm genmake_test.o | grep 'T ' | grep tcall | cut -d ' ' -f 3`
393        RETVAL=$?
394        if test "x$RETVAL" != x0 ; then
395            FC_NAMEMANGLE=$default_nm
396            cat <<EOF>> genmake_warnings
397    
398    WARNING: The "nm" command failed.
399    WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
400    WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here
401    EOF
402            return 1
403        fi
404        cat > genmake_tcomp.f <<EOF
405          subroutine tcall( string )
406          character*(*) string
407          call tsub( string )
408          end
409    EOF
410        $FC $FFLAGS $DEFINES -c genmake_tcomp.f >> genmake_warnings 2>&1
411        RETVAL=$?
412        if test "x$RETVAL" != x0 ; then
413            FC_NAMEMANGLE=$default_nm
414            cat <<EOF>> genmake_warnings
415    
416    WARNING: FORTRAN test compile fails -- please see "genmake_errors"
417    WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
418    WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here.
419    EOF
420            return 1
421        fi
422        f_tcall=`nm genmake_tcomp.o | grep 'T ' | grep tcall | cut -d ' ' -f 3`
423        RETVAL=$?
424        if test "x$RETVAL" != x0 ; then
425            FC_NAMEMANGLE=$default_nm
426            cat <<EOF>> genmake_warnings
427    
428    WARNING: The "nm" command failed.
429    WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
430    WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here.
431    EOF
432            return 1
433        fi
434    
435        c_a=`echo $c_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 1 | sed -e 's|Y||'`
436        f_a=`echo $f_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 1 | sed -e 's|Y||'`
437        c_b=`echo $c_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 2 | sed -e 's|Y||'`
438        f_b=`echo $f_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 2 | sed -e 's|Y||'`
439    
440        nmangle="X"
441        if test "x$c_a" != "x$f_a" ; then
442            comm="echo x$f_a | sed -e 's|x$c_a||'"
443            a=`eval $comm`
444            nmangle="$a ## $nmangle"
445        fi
446        if test "x$c_b" != "x$f_b" ; then
447            comm="echo x$f_b | sed -e 's|x$c_b||'"
448            b=`eval $comm`
449            nmangle="$nmangle ## $b"
450        fi
451    
452        FC_NAMEMANGLE="#define FC_NAMEMANGLE(X)  $nmangle"
453    
454        #  cleanup the testing files
455        rm -f genmake_tcomp.* genmake_test.*
456    }
457    
458    
459    check_HAVE_CLOC()  {
460        get_fortran_c_namemangling
461        cat <<EOF > genmake_tc_1.c
462    $FC_NAMEMANGLE
463    #include <stdio.h>
464    #include <stdlib.h>
465    #include <unistd.h>
466    #include <assert.h>
467    #include <sys/time.h>
468    void FC_NAMEMANGLE(cloc) ( double *curtim )
469    {
470     struct timeval tv1;
471     gettimeofday(&tv1 , (void *)NULL );
472     *curtim =  (double)((tv1.tv_usec)+(tv1.tv_sec)*1.E6);
473     *curtim = *curtim/1.E6;
474    }
475    EOF
476        make genmake_tc_1.o >> genmake_tc.log 2>&1
477        RET_C=$?
478        cat <<EOF > genmake_tc_2.f
479          program hello
480          Real*8 wtime
481          external cloc
482          call cloc(wtime)
483          print *," HELLO WORLD", wtime
484          end program hello
485    EOF
486        $FC $FFLAGS -o genmake_tc genmake_tc_2.f genmake_tc_1.o >> genmake_tc.log 2>&1
487        RET_F=$?
488        test -x ./genmake_tc  &&  ./genmake_tc >> genmake_tc.log 2>&1
489        RETVAL=$?
490        if test "x$RETVAL" = x0 ; then
491            HAVE_CLOC=t
492            DEFINES="$DEFINES -DHAVE_CLOC"
493        fi
494        rm -f genmake_tc*
495    }
496    
497    
498    check_netcdf_libs()  {
499        cat <<EOF > genmake_tnc.F
500          program fgennc
501    #include "netcdf.inc"
502          integer iret, ncid, xid
503          iret = nf_create('genmake_tnc.nc', NF_CLOBBER, ncid)
504          IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
505          iret = nf_def_dim(ncid, 'X', 11, xid)
506          IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
507          iret = nf_close(ncid)
508          IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
509          end
510    EOF
511        $CPP genmake_tnc.F > genmake_tnc.f  \
512            &&  $FC $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.f $LIBS >> genmake_tnc.log 2>&1
513        RET_COMPILE=$?
514        test -x ./genmake_tnc  &&  ./genmake_tnc >> genmake_tnc.log 2>&1
515        RETVAL=$?
516        if test "x$RET_COMPILE" = x0 -a "x$RETVAL" = x0 ; then
517            HAVE_NETCDF=t
518        else
519            # try again with "-lnetcdf" added to the libs
520            $CPP genmake_tnc.F > genmake_tnc.f  \
521                &&  $FC $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.f \
522                $LIBS -lnetcdf >> genmake_tnc_2.log 2>&1
523            RET_COMPILE=$?
524            test -x ./genmake_tnc  &&  ./genmake_tnc >> genmake_tnc.log 2>&1
525            RETVAL=$?
526            if test "x$RET_COMPILE" = x0 -a "x$RETVAL" = x0 ; then
527                LIBS="$LIBS -lnetcdf"
528                HAVE_NETCDF=t
529            else
530                cat genmake_tnc.log >> genmake_warnings
531            fi
532        fi
533        rm -f genmake_tnc*
534    }
535    
536    
537    
538    ###############################################################################
539    #   Sequential part of script starts here
540    ###############################################################################
541    
542  #  Set defaults here  #  Set defaults here
543  COMMANDL="$0 $@"  COMMANDL="$0 $@"
# Line 171  LN= Line 547  LN=
547  S64=  S64=
548  KPP=  KPP=
549  FC=  FC=
550    CPP=
551  LINK=  LINK=
552    DEFINES=
553  PACKAGES=  PACKAGES=
554  ENABLE=  ENABLE=
555  DISABLE=  DISABLE=
556  MAKEFILE=  MAKEFILE=
557  MAKEDEPEND=  MAKEDEPEND=
558  PDEPEND=  PDEPEND=
559  DUMPSTATE=f  DUMPSTATE=t
560  PDEFAULT=  PDEFAULT=
561  OPTFILE=  OPTFILE=
562  INCLUDES="-I."  INCLUDES="-I."
# Line 187  FOPTIM= Line 565  FOPTIM=
565  CFLAGS=  CFLAGS=
566  KFLAGS1=  KFLAGS1=
567  KFLAGS2=  KFLAGS2=
568    #LDADD=
569  LIBS=  LIBS=
570  KPPFILES=  KPPFILES=
571  NOOPTFILES=  NOOPTFILES=
572  NOOPTFLAGS=  NOOPTFLAGS=
573    MPI=
574    MPIPATH=
575    
576    # DEFINES checked by test compilation
577    HAVE_SYSTEM=
578    HAVE_FDATE=
579    FC_NAMEMANGLE=
580    HAVE_CLOC=
581    HAVE_NETCDF=
582    
583  MODS=  MODS=
584  TOOLSDIR=  TOOLSDIR=
585  SOURCEDIRS=  SOURCEDIRS=
586  INCLUDEDIRS=  INCLUDEDIRS=
587    STANDARDDIRS="USE_THE_DEFAULT"
588    
589    G2ARGS=
590    BASH=
591  PWD=`pwd`  PWD=`pwd`
592  MAKE=make  MAKE=make
593    AWK=awk
594  THISHOSTNAME=`hostname`  THISHOSTNAME=`hostname`
595  THISCWD=`pwd`  THISCWD=`pwd`
596  THISDATE=`date`  THISDATE=`date`
# Line 206  MACHINE=`uname -a` Line 598  MACHINE=`uname -a`
598  EXECUTABLE=  EXECUTABLE=
599  EXEHOOK=  EXEHOOK=
600  EXEDIR=  EXEDIR=
601    PACKAGES_CONF=
602    IEEE=
603    if test "x$MITGCM_IEEE" != x ; then
604        IEEE=$MITGCM_IEEE
605    fi
606    
607    AUTODIFF_PKG_USED=f
608    AD_OPTFILE=
609    TAF=
610    AD_TAF_FLAGS=
611    FTL_TAF_FLAGS=
612    SVD_TAF_FLAGS=
613    TAF_EXTRA=
614    TAMC=
615    AD_TAMC_FLAGS=
616    FTL_TAF_FLAGS=
617    SVD_TAMC_FLAGS=
618    TAMC_EXTRA=
619    
620    
621  #  The following state can be set directly by command-line switches  #  The following state can be set directly by command-line switches
622  gm_s1="OPTFILE PDEPEND PDEFAULT MAKEFILE PLATFORM ROOTDIR MODS DISABLE ENABLE NOOPT"  gm_s1="OPTFILE PDEPEND PDEFAULT MAKEFILE PLATFORM ROOTDIR MODS DISABLE ENABLE"
623  gm_s2="FC IEEE MPI JAM DUMPSTATE"  gm_s2="FC CPP IEEE MPI JAM DUMPSTATE STANDARDDIRS"
624    
625  #  The following state is not directly set by command-line switches  #  The following state is not directly set by command-line switches
626  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 "
627  gm_s4="CFLAGS KFLAGS1 KFLAGS2 LIBS KPPFILES NOOPTFILES NOOPTFLAGS"  gm_s4="CFLAGS KFLAGS1 KFLAGS2 LIBS KPPFILES NOOPTFILES NOOPTFLAGS"
628  gm_s5="TOOLSDIR SOURCEDIRS INCLUDEDIRS PWD MAKE THISHOSTNAME THISDATE MACHINE"  gm_s5="TOOLSDIR SOURCEDIRS INCLUDEDIRS PWD MAKE THISHOSTNAME THISDATE MACHINE"
629  gm_s6="EXECUTABLE EXEHOOK EXEDIR"  gm_s6="EXECUTABLE EXEHOOK EXEDIR PACKAGES_CONF"
630    gm_s7="HAVE_SYSTEM HAVE_FDATE FC_NAMEMANGLE"
631    
632  gm_state="COMMANDL $gm_s1 $gm_s2 $gm_s3 $gm_s4 $gm_s5 $gm_s6"  #  The following are all related to adjoint/tangent-linear stuff
633    gm_s10="AUTODIFF_PKG_USED AD_OPTFILE TAMC TAF AD_TAMC_FLAGS AD_TAF_FLAGS"
634    gm_s11="FTL_TAMC_FLAGS FTL_TAF_FLAGS SVD_TAMC_FLAGS SVD_TAF_FLAGS"
635    gm_s12="TAF_EXTRA TAMC_EXTRA"
636    
637    gm_state="COMMANDL $gm_s1 $gm_s2 $gm_s3 $gm_s4 $gm_s5 $gm_s6 $gm_s7"
638    gm_state="$gm_state $gm_s10 $gm_s11 $gm_s12"
639    
640    cat <<EOF
641    
642    GENMAKE :
643    
644    A program for GENerating MAKEfiles for the MITgcm project.  For a
645    quick list of options, use "genmake -h" or for more detail see:
646    
647      http://mitgcm.org/devel_HOWTO/
648    
649    EOF
650    
 echo  
651  echo "===  Processing options files and arguments  ==="  echo "===  Processing options files and arguments  ==="
652  gm_local="./gm_local"  gm_local="genmake_local"
653  echo -n "  getting local config information:  "  for i in . $MODS ; do
654        if test -r $i/$gm_local ; then
655            . $i/$gm_local
656            break
657        fi
658    done
659    printf "  getting local config information:  "
660  if test -e $gm_local ; then  if test -e $gm_local ; then
661      echo "using $gm_local"      echo "using $gm_local"
662      source $gm_local      . $gm_local
663      # echo "DISABLE=$DISABLE"      # echo "DISABLE=$DISABLE"
664      # echo "ENABLE=$ENABLE"      # echo "ENABLE=$ENABLE"
665  else  else
# Line 244  fi Line 677  fi
677  #   n=$(( $n + 1 ))  #   n=$(( $n + 1 ))
678  #done  #done
679  #parse_options  #parse_options
   
680  ac_prev=  ac_prev=
681  for ac_option ; do  for ac_option ; do
682    
683        G2ARGS="$G2ARGS \"$ac_option\""
684    
685      # If the previous option needs an argument, assign it.      # If the previous option needs an argument, assign it.
686      if test -n "$ac_prev"; then      if test -n "$ac_prev"; then
687          eval "$ac_prev=\$ac_option"          eval "$ac_prev=\$ac_option"
# Line 269  for ac_option ; do Line 703  for ac_option ; do
703          -optfile=* | --optfile=* | -of=* | --of=*)          -optfile=* | --optfile=* | -of=* | --of=*)
704              OPTFILE=$ac_optarg ;;              OPTFILE=$ac_optarg ;;
705                    
706            -adoptfile | --adoptfile | -adof | --adof)
707                ac_prev=AD_OPTFILE ;;
708            -adoptfile=* | --adoptfile=* | -adof=* | --adof=*)
709                AD_OPTFILE=$ac_optarg ;;
710            
711          -pdepend | --pdepend)          -pdepend | --pdepend)
712              ac_prev=PDEPEND ;;              ac_prev=PDEPEND ;;
713          -pdepend=* | --pdepend=*)          -pdepend=* | --pdepend=*)
# Line 284  for ac_option ; do Line 723  for ac_option ; do
723          -make=* | --make=* | -m=* | --m=*)          -make=* | --make=* | -m=* | --m=*)
724              MAKE=$ac_optarg ;;              MAKE=$ac_optarg ;;
725                    
726            -bash | --bash)
727                ac_prev=BASH ;;
728            -bash=* | --bash=*)
729                BASH=$ac_optarg ;;
730            
731            -makedepend | --makedepend | -md | --md)
732                ac_prev=MAKEDEPEND ;;
733            -makedepend=* | --makedepend=* | -md=* | --md=*)
734                MAKEDEPEND=$ac_optarg ;;
735            
736          -makefile | --makefile | -ma | --ma)          -makefile | --makefile | -ma | --ma)
737              ac_prev=MAKEFILE ;;              ac_prev=MAKEFILE ;;
738          -makefile=* | --makefile=* | -ma=* | --ma=*)          -makefile=* | --makefile=* | -ma=* | --ma=*)
739              MAKEFILE=$ac_optarg ;;              MAKEFILE=$ac_optarg ;;
740                    
741          -platform | --platform | -pl | --pl)          -platform | --platform | -pl | --pl | -platform=* | --platform=* | -pl=* | --pl=*)
742              ac_prev=PLATFORM ;;              echo "ERROR: The platform option has been removed.  Please specify"
743          -platform=* | --platform=* | -pl=* | --pl=*)              echo "  the build options using the \"optfile\" mechanism."
744              PLATFORM=$ac_optarg ;;              echo
745                usage
746                ;;
747                    
748          -rootdir | --rootdir | -rd | --rd)          -rootdir | --rootdir | -rd | --rd)
749              ac_prev=ROOTDIR ;;              ac_prev=ROOTDIR ;;
# Line 314  for ac_option ; do Line 765  for ac_option ; do
765          -enable=* | --enable=*)          -enable=* | --enable=*)
766              ENABLE=$ac_optarg ;;              ENABLE=$ac_optarg ;;
767                    
768          -noopt | --noopt)          -standarddirs | --standarddirs)
769              ac_prev=NOOPT ;;              ac_prev=STANDARDDIRS ;;
770          -noopt=* | --noopt=*)          -standarddirs=* | --standarddirs=*)
771              NOOPT=$ac_optarg ;;              STANDARDDIRS=$ac_optarg ;;
772            
773  #           -cpp | --cpp)  #           -cpp | --cpp)
774  #               ac_prev=cpp ;;  #               ac_prev=cpp ;;
775  #           -cpp=* | --cpp=*)  #           -cpp=* | --cpp=*)
# Line 330  for ac_option ; do Line 781  for ac_option ; do
781              FC=$ac_optarg ;;              FC=$ac_optarg ;;
782                    
783          -ieee | --ieee)          -ieee | --ieee)
784              IEEE=1 ;;              IEEE=true ;;
785          -noieee | --noieee)          -noieee | --noieee)
786              IEEE=0 ;;              IEEE= ;;
787            
788          -mpi | --mpi)          -mpi | --mpi)
789              MPI=1 ;;              MPI=true ;;
790          -nompi | --nompi)          -mpi=* | --mpi=*)
791              MPI=0 ;;              MPIPATH=$ac_optarg
792                        MPI=true ;;
793          -jam | --jam)          
794              JAM=1 ;;  #       -jam | --jam)
795          -nojam | --nojam)  #           JAM=1 ;;
796              JAM=0 ;;  #       -nojam | --nojam)
797    #           JAM=0 ;;
798                    
799          -ds | --ds)          -ds | --ds)
800              DUMPSTATE=t ;;              DUMPSTATE=t ;;
801                    
802            -taf_extra | --taf_extra)
803                ac_prev=TAF_EXTRA ;;
804            -taf_extra=* | --taf_extra=*)
805                TAF_EXTRA=$ac_optarg ;;
806    
807            -tamc_extra | --tamc_extra)
808                ac_prev=TAMC_EXTRA ;;
809            -tamc_extra=* | --tamc_extra=*)
810                TAMC_EXTRA=$ac_optarg ;;
811    
812          -*)          -*)
813              echo "Error: unrecognized option: "$ac_option              echo "Error: unrecognized option: "$ac_option
814              usage              usage
# Line 361  for ac_option ; do Line 823  for ac_option ; do
823            
824  done  done
825    
826    if test -f ./.genmakerc ; then
827        echo
828        echo "WARNING: genmake2 has detected a copy of the old-style \"./.genmakerc\""
829        echo "  file.  This file format is no longer supported.  Please see:"
830        echo
831        echo "    http://mitgcm.org/devel_HOWTO/"
832        echo
833        echo "  for directions on how to setup and use the new \"genmake2\" input"
834        echo "  files and send an email to MITgcm-support@mitgcm.org if you want help."
835        echo
836    fi
837    
838    if test "x${ROOTDIR}" = x ; then
839        if test "${PWD##/*/}" = "bin" -a -d ../model -a -d ../eesup -a -d ../pkg ; then
840            ROOTDIR=".."
841        else
842            for d in . .. ../.. ../../.. ../../../.. ../../../../.. ; do
843                if [ -d "$d/model" -a -d "$d/eesupp" -a -d "$d/pkg" ]; then
844                    ROOTDIR=$d
845                    printf "Warning:  ROOTDIR was not specified but there appears to be"
846                    echo " a copy of MITgcm at \"$ROOTDIR\" so we'll try it."
847                    break
848                fi
849            done
850        fi
851    fi
852    if test "x${ROOTDIR}" = x ; then
853        echo "Error: Cannot determine ROOTDIR for MITgcm code."
854        echo "  Please specify a ROOTDIR using either an options "
855        echo "  file or a command-line option."
856        exit 1
857    fi
858    if test ! -d ${ROOTDIR} ; then
859        echo "Error: the specified ROOTDIR (\"$ROOTDIR\") does not exist!"
860        exit 1
861    fi
862    
863  echo "  getting OPTFILE information:  "  echo "  getting OPTFILE information:  "
864  if test "x${OPTFILE}" = x ; then  if test "x${OPTFILE}" = x ; then
865      echo "Warning: no OPTFILE specified so we'll look for possible settings"      if test "x$MITGCM_OF" = x ; then
866      printf "\n===  Searching for possible settings for OPTFILE  ===\n"          echo "Warning: no OPTFILE specified so we'll look for possible settings"
867      find_possible_configs          printf "\n===  Searching for possible settings for OPTFILE  ===\n"
868  else          find_possible_configs
     if test "x$OPTFILE" = xNONE ; then  
         echo "    OPTFILE=NONE so we'll try to use default settings"  
869      else      else
870          if test -f "$OPTFILE" -a -r "$OPTFILE" ; then          OPTFILE=$MITGCM_OF
871              echo "    using OPTFILE=\"$OPTFILE\""      fi
872              source "$OPTFILE"  fi
873              RETVAL=$?  if test "x$OPTFILE" != xNONE ; then
874              if test "x$RETVAL" != x0 ; then      if test -f "$OPTFILE" -a -r "$OPTFILE" ; then
875                  echo -n "Error: failed to source OPTFILE \"$OPTFILE\""          echo "    using OPTFILE=\"$OPTFILE\""
876                  echo "--please check that variable syntax is bash-compatible"          . "$OPTFILE"
877                  exit 1          RETVAL=$?
878              fi          if test "x$RETVAL" != x0 ; then
879              if test "x$DUMPSTATE" != xf ; then              printf "Error: failed to source OPTFILE \"$OPTFILE\""
880                  cp -f $OPTFILE "gm_optfile"              echo "--please check that variable syntax is bash-compatible"
             fi  
         else  
             echo "Error: can't read OPTFILE=\"$OPTFILE\""  
881              exit 1              exit 1
882          fi          fi
883            if test "x$DUMPSTATE" != xf ; then
884                cp -f $OPTFILE "genmake_optfile"
885            fi
886        else
887            echo "Error: can't read OPTFILE=\"$OPTFILE\""
888            exit 1
889      fi      fi
890  fi  fi
891    
892  #  Check that FC, LINK, CPP, and S64 are defined.  If not, complain  echo "  getting AD_OPTFILE information:  "
893  #  and abort!  if test "x${AD_OPTFILE}" = x ; then
894        if test "x$MITGCM_AD_OF" = x ; then
895            AD_OPTFILE=$ROOTDIR/tools/adjoint_options/adjoint_default
896        else
897            AD_OPTFILE=$MITGCM_AD_OF
898        fi
899    fi
900    if test "x${AD_OPTFILE}" != xNONE ; then
901        if test -f "$AD_OPTFILE" -a -r "$AD_OPTFILE" ; then
902            echo "    using AD_OPTFILE=\"$AD_OPTFILE\""
903            . "$AD_OPTFILE"
904            RETVAL=$?
905            if test "x$RETVAL" != x0 ; then
906                printf "Error: failed to source AD_OPTFILE \"$AD_OPTFILE\""
907                echo "--please check that variable syntax is bash-compatible"
908                exit 1
909            fi
910            if test "x$DUMPSTATE" != xf ; then
911                cp -f $AD_OPTFILE "genmake_ad_optfile"
912            fi
913        else
914            echo "Error: can't read AD_OPTFILE=\"$AD_OPTFILE\""
915            exit 1
916        fi
917    fi
918    
919    #  Check that FC, LINK, CPP, S64, LN, and MAKE are defined.  If not,
920    #  either set defaults or complain and abort!
921    if test ! "x$BASH" = x ; then
922        # add a trailing space so that it works within the Makefile syntax (see below)
923        BASH="$BASH "
924    fi
925  if test "x$FC" = x ; then  if test "x$FC" = x ; then
926      cat <<EOF 1>&2      cat <<EOF 1>&2
927    
928  Error: no Fortran compiler: please specify using one of the following:  Error: no Fortran compiler: please specify using one of the following:
929    1) within the options file ("FC=...") as specified by "-of=OPTFILE"    1) within the options file ("FC=...") as specified by "-of=OPTFILE"
930    2) the "-fc=XXX" command-line option    2) the "-fc=XXX" command-line option
931    3) the "./gm_local" file    3) the "./genmake_local" file
932  EOF  EOF
933      exit 1      exit 1
934  fi  fi
935  if test "x$LINK" = x ; then  if test "x$LINK" = x ; then
936      LINK=$FC      LINK=$FC
937  fi  fi
938    if test "x$MAKE" = x ; then
939        MAKE="make"
940    fi
941  if test "x$CPP" = x ; then  if test "x$CPP" = x ; then
942        CPP=cpp
943    fi
944    #EH3 === UGLY ===
945    #  The following an ugly little hack to check for $CPP in /lib/ and it
946    #  should eventually be replaced with a more general function that
947    #  searches a combo of the user's path and a list of "usual suspects"
948    #  to find the correct location for binaries such as $CPP.
949    for i in " " "/lib/" ; do
950        echo "#define A a" | $i$CPP > test_cpp 2>&1 && CPP=$i$CPP
951    done
952    #EH3 === UGLY ===
953    echo "#define A a" | $CPP > test_cpp 2>&1
954    RETVAL=$?
955    if test "x$RETVAL" != x0 ; then
956      cat <<EOF 1>&2      cat <<EOF 1>&2
957    
958  Error: no C pre-processor: please specify using one of the following:  Error: C pre-processor "$CPP" failed the test case: please specify using:
959    
960    1) within the options file ("CPP=...") as specified by "-of=OPTFILE"    1) within the options file ("CPP=...") as specified by "-of=OPTFILE"
961    2) the "./gm_local" file    2) the "./genmake_local" file
962      3) with the CPP environment variable
963    
964  EOF  EOF
965      exit 1      exit 1
966    else
967        rm -f test_cpp
968  fi  fi
969  if test "x$S64" = x ; then  if test "x$MAKEDEPEND" = x ; then
970        MAKEDEPEND=makedepend
971    fi
972    if test "x$LN" = x ; then
973        LN="ln -s"
974    fi
975    echo "test" > genmake_test_ln
976    $LN genmake_test_ln genmake_tlink
977    RETVAL=$?
978    if test "x$RETVAL" != x0 ; then
979      cat <<EOF 1>&2      cat <<EOF 1>&2
980    
981  Error: no C pre-processor: please specify using one of the following:  Error: The command "ln -s" failed -- please specify a working soft-link
982    1) within the options file ("S64=...") as specified by "-of=OPTFILE"    command in the optfile.
983    2) the "./gm_local" file  
984  EOF  EOF
985      exit 1      exit 1
986  fi  fi
987    rm -f genmake_test_ln genmake_tlink
988    
989    if test ! "x$MPI" = x ; then
990          echo "  Turning on MPI cpp macros"
991          DEFINES="$DEFINES -DALLOW_USE_MPI -DALWAYS_USE_MPI"
992    fi
993    
994    printf "\n===  Checking system libraries  ===\n"
995    printf "  Do we have the system() command using $FC...  "
996    cat > genmake_tcomp.f <<EOF
997          program hello
998          call system('echo hi')
999          end
1000    EOF
1001    $FC $FFLAGS $DEFINES -o genmake_tcomp genmake_tcomp.f > genmake_tcomp.log 2>&1
1002    RETVAL=$?
1003    if test "x$RETVAL" = x0 ; then
1004        HAVE_SYSTEM=t
1005        DEFINES="$DEFINES -DHAVE_SYSTEM"
1006        echo "yes"
1007    else
1008        HAVE_SYSTEM=
1009        echo "no"
1010    fi
1011    rm -f genmake_tcomp*
1012    
1013    printf "  Do we have the fdate() command using $FC...  "
1014    cat > genmake_tcomp.f <<EOF
1015          program hello
1016          CHARACTER(128) string
1017          string = ' '
1018          call fdate( string )
1019          print *, string
1020          end
1021    EOF
1022    $FC $FFLAGS $DEFINES -o genmake_tcomp genmake_tcomp.f > genmake_tcomp.log 2>&1
1023    RETVAL=$?
1024    if test "x$RETVAL" = x0 ; then
1025        HAVE_FDATE=t
1026        DEFINES="$DEFINES -DHAVE_FDATE"
1027        echo "yes"
1028    else
1029        HAVE_FDATE=
1030        echo "no"
1031    fi
1032    rm -f genmake_tcomp*
1033    
1034    printf "  Can we call simple C routines (here, \"cloc()\") using $FC...  "
1035    check_HAVE_CLOC
1036    if test "x$HAVE_CLOC" != x ; then
1037        echo "yes"
1038    else
1039        echo "no"
1040    fi
1041    rm -f genmake_t*
1042    
1043    printf "  Can we create NetCDF-enabled binaries...  "
1044    check_netcdf_libs
1045    if test "x$HAVE_NETCDF" != x ; then
1046        echo "yes"
1047    else
1048        echo "no"
1049    fi
1050    
1051    
1052  printf "\n===  Setting defaults  ===\n"  printf "\n===  Setting defaults  ===\n"
1053  echo -n "  Adding MODS directories:  "  printf "  Adding MODS directories:  "
1054  for d in $MODS ; do  for d in $MODS ; do
1055      if test ! -d $d ; then      if test ! -d $d ; then
1056          echo          echo
1057          echo "Error: MODS directory \"$d\" not found!"          echo "Error: MODS directory \"$d\" not found!"
1058          exit 1          exit 1
1059      else      else
1060          echo -n " $d"          printf " $d"
1061          SOURCEDIRS="$SOURCEDIRS $d"          SOURCEDIRS="$SOURCEDIRS $d"
1062          INCLUDEDIRS="$INCLUDEDIRS $d"          INCLUDEDIRS="$INCLUDEDIRS $d"
1063      fi      fi
# Line 446  if test "x${PLATFORM}" = x ; then Line 1071  if test "x${PLATFORM}" = x ; then
1071      PLATFORM=$p_PLATFORM      PLATFORM=$p_PLATFORM
1072  fi  fi
1073    
 if test "x${ROOTDIR}" = x ; then  
     if test "${PWD##/*/}" = "bin" -a -d ../model -a -d ../eesup -a -d ../pkg ; then  
         ROOTDIR=".."  
     else  
         for d in . .. ../.. ../../.. ../../../.. ../../../../.. ; do  
             if [ -d "$d/model" -a -d "$d/eesupp" -a -d "$d/pkg" ]; then  
                 ROOTDIR=$d  
                 echo -n "Warning:  ROOTDIR was not specified but there appears to be"  
                 echo " a copy of MITgcm at \"$ROOTDIR\" so we'll try it."  
                 break  
             fi  
         done  
     fi  
 fi  
 if test "x${ROOTDIR}" = x ; then  
     echo "Error: Cannot determine ROOTDIR for MITgcm code."  
     echo "  Please specify a ROOTDIR using either an options "  
     echo "  file or a command-line option."  
     exit 1  
 fi  
 if test ! -d ${ROOTDIR} ; then  
     echo "Error: the specified ROOTDIR (\"$ROOTDIR\") does not exist!"  
     exit 1  
 fi  
   
1074  if test "x${EXEDIR}" = x ; then  if test "x${EXEDIR}" = x ; then
1075      if test "${PWD##/*/}" = "bin" -a -d ../exe -a $ROOTDIR = .. ; then      if test "${PWD##/*/}" = "bin" -a -d ../exe -a $ROOTDIR = .. ; then
1076          EXEDIR=../exe          EXEDIR=../exe
# Line 487  if test "x${TOOLSDIR}" = x ; then Line 1087  if test "x${TOOLSDIR}" = x ; then
1087      TOOLSDIR="$ROOTDIR/tools"      TOOLSDIR="$ROOTDIR/tools"
1088  fi  fi
1089  if test ! -d ${TOOLSDIR} ; then  if test ! -d ${TOOLSDIR} ; then
1090      echo "Error: the specified $TOOLSDIR (\"$TOOLSDIR\") does not exist!"      echo "Error: the specified TOOLSDIR (\"$TOOLSDIR\") does not exist!"
1091      exit 1      exit 1
1092  fi  fi
1093    if test "x$S64" = x ; then
1094        S64='$(TOOLSDIR)/set64bitConst.sh'
1095    fi
1096    THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`
1097    
1098  EXECUTABLE=${EXECUTABLE:-mitgcmuv}  EXECUTABLE=${EXECUTABLE:-mitgcmuv}
1099    
# Line 498  EXECUTABLE=${EXECUTABLE:-mitgcmuv} Line 1102  EXECUTABLE=${EXECUTABLE:-mitgcmuv}
1102  #  they appear as regular source code  #  they appear as regular source code
1103  if test -r $ROOTDIR"/eesupp/src/Makefile" ; then  if test -r $ROOTDIR"/eesupp/src/Makefile" ; then
1104      echo "  Making source files in eesupp from templates"      echo "  Making source files in eesupp from templates"
1105      $MAKE -C $ROOTDIR"/eesupp/src/" > make_eesupp.errors 2>&1      ( cd $ROOTDIR"/eesupp/src/" && $MAKE ) > make_eesupp.errors 2>&1
1106      RETVAL=$?      RETVAL=$?
1107      if test "x${RETVAL}" = x0 ; then      if test "x${RETVAL}" = x0 ; then
1108          rm -f make_eesupp.errors          rm -f make_eesupp.errors
1109      else      else
1110          echo "Error: problem encountered while building source files in eesupp:"          echo "Error: problem encountered while building source files in eesupp:"
1111          cat make_eesupp.errors          cat make_eesupp.errors 1>&2
1112          exit 1          exit 1
1113      fi      fi
1114  fi  fi
1115    
1116    #same for exch2
1117    if test -r $ROOTDIR"/pkg/exch2/Makefile" ; then
1118        echo "  Making source files in exch2 from  templates"
1119        ( cd $ROOTDIR"/pkg/exch2/" && $MAKE ) > make_exch2.errors 2>&1
1120        RETVAL=$?
1121        if test "x${RETVAL}" = x0 ; then
1122            rm -f make_exch2.errors
1123        else
1124            echo "Error: problem encountered while building source files in exch2:"
1125            cat make_exch2.errors 1>&2
1126            exit 1
1127        fi
1128    fi
1129    
1130  printf "\n===  Determining package settings  ===\n"  printf "\n===  Determining package settings  ===\n"
1131  if  test "x${PDEPEND}" = x ; then  if  test "x${PDEPEND}" = x ; then
1132      tmp=$ROOTDIR"/pkg/pkg_depend"      tmp=$ROOTDIR"/pkg/pkg_depend"
# Line 528  echo "  getting package dependency info Line 1146  echo "  getting package dependency info
1146  #  Strip the comments and then convert the dependency file into  #  Strip the comments and then convert the dependency file into
1147  #  two arrays: PNAME, DNAME  #  two arrays: PNAME, DNAME
1148  cat $PDEPEND | sed -e 's/#.*$//g' \  cat $PDEPEND | sed -e 's/#.*$//g' \
1149      | awk 'BEGIN{nn=-1;} (NF>0){ for(i=2;i<=NF;i++){nn++; print "PNAME_"nn"="$1"\nDNAME_"nn"="$i}} END{print "nname="nn}' \      | $AWK 'BEGIN{nn=-1;} (NF>0){ for(i=2;i<=NF;i++){nn++; print "PNAME_"nn"="$1"\nDNAME_"nn"="$i}} END{print "nname="nn}' \
1150      > ./.pd_tmp      > ./.pd_tmp
1151  RETVAL=$?  RETVAL=$?
1152  if test ! "x${RETVAL}" = x0 ; then  if test ! "x${RETVAL}" = x0 ; then
1153      echo "Error: unable to parse package dependencies -- please check PDEPEND=\"$PDEPEND\""      echo "Error: unable to parse package dependencies -- please check PDEPEND=\"$PDEPEND\""
1154      exit 1      exit 1
1155  fi  fi
1156  source ./.pd_tmp  . ./.pd_tmp
1157  rm -f ./.pd_tmp  rm -f ./.pd_tmp
1158    
1159  echo  -n "  checking default package list:  "  #  Search for default packages.  Note that a "$ROOTDIR/pkg/pkg_groups"
1160    #  file should eventually be added so that, for convenience, one can
1161    #  specify groups of packages using names like "ocean" and "atmosphere".
1162    echo "  checking default package list:  "
1163    if test "x${PDEFAULT}" = x ; then
1164        for i in "." $MODS ; do
1165            if test -r $i"/packages.conf" ; then
1166                    PDEFAULT=$i"/packages.conf"
1167                    break
1168            fi
1169        done
1170    fi
1171  if test "x${PDEFAULT}" = x ; then  if test "x${PDEFAULT}" = x ; then
1172      PDEFAULT="$ROOTDIR/pkg/pkg_default"      PDEFAULT="$ROOTDIR/pkg/pkg_default"
1173  fi  fi
1174  if test "x${PDEFAULT}" = xNONE ; then  if test "x${PDEFAULT}" = xNONE ; then
1175      echo "default packages file disabled"      echo "    default packages file disabled"
1176  else  else
1177      if test ! -r $PDEFAULT ; then      if test ! -r $PDEFAULT ; then
         echo ""  
1178          echo "Warning:  can't read default packages from PDEFAULT=\"$PDEFAULT\""          echo "Warning:  can't read default packages from PDEFAULT=\"$PDEFAULT\""
1179      else      else
1180          echo "  using PDEFAULT=\"$PDEFAULT\""          echo "    using PDEFAULT=\"$PDEFAULT\""
1181          #  Strip the comments and add all the names          #  Strip the comments and add all the names
1182          def=`cat $PDEFAULT | sed -e 's/#.*$//g' | awk '(NF>0){print $0}'`          def=`cat $PDEFAULT | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
1183          RETVAL=$?          RETVAL=$?
1184          if test "x${RETVAL}" != x0 ; then          if test "x${RETVAL}" != x0 ; then
1185              echo -n "Error: can't parse default package list "              printf "Error: can't parse default package list "
1186              echo "-- please check PDEFAULT=\"$PDEFAULT\""              echo "-- please check PDEFAULT=\"$PDEFAULT\""
1187              exit 1              exit 1
1188          fi          fi
1189          for i in $def ; do          for i in $def ; do
1190              PACKAGES="$PACKAGES $i"              PACKAGES="$PACKAGES $i"
1191          done          done
1192          echo "    packages are:  $PACKAGES"          echo "    before group expansion packages are: $PACKAGES"
1193            expand_pkg_groups
1194            echo "    after group expansion packages are:  $PACKAGES"
1195      fi      fi
1196  fi  fi
1197    
# Line 580  for p in $PACKAGES ; do Line 1210  for p in $PACKAGES ; do
1210  done  done
1211  PACKAGES="$pack"  PACKAGES="$pack"
1212  echo "  applying ENABLE settings"  echo "  applying ENABLE settings"
1213  rm -f ./.tmp_pack  echo "" > ./.tmp_pack
1214  PACKAGES="$PACKAGES $ENABLE"  PACKAGES="$PACKAGES $ENABLE"
1215  for i in $PACKAGES ; do  for i in $PACKAGES ; do
1216      if test ! -d "$ROOTDIR/pkg/$i" ; then      if test ! -d "$ROOTDIR/pkg/$i" ; then
# Line 671  for i in $PACKAGES ; do Line 1301  for i in $PACKAGES ; do
1301      if test -d $adr ; then      if test -d $adr ; then
1302          SOURCEDIRS="$SOURCEDIRS $adr"          SOURCEDIRS="$SOURCEDIRS $adr"
1303          INCLUDEDIRS="$INCLUDEDIRS $adr"          INCLUDEDIRS="$INCLUDEDIRS $adr"
1304            if test "x$i" = xautodiff ; then
1305                AUTODIFF_PKG_USED=t
1306            fi
1307      else      else
1308          echo "Error: the directory \"$adr\" for package $i doesn't exist"          echo "Error: the directory \"$adr\" for package $i doesn't exist"
1309          exit 1          exit 1
1310      fi      fi
1311  done  done
1312    
1313  #  This is compatible with the old genmake.  The "DISABLE_*" flags  #  Build MNC templates and check for ability to build and use NetCDF
1314  #  need to be replaced by the "ALLOW_*" flags set below.  echo $PACKAGES | grep ' mnc ' > /dev/null 2>&1
1315  #  RETVAL=$?
1316  # echo -n "  Setting package-specific CPP flags:  "  if test "x$RETVAL" = x0 ; then
1317  # pkrm=( mom_fluxform mom_vecinv generic_advdiff )      ( cd $ROOTDIR"/pkg/mnc" && $MAKE templates ) > make_mnc.errors 2>&1
1318  # pkrmdef=( -DDISABLE_MOM_FLUXFORM -DDISABLE_MOM_VECINV -DDISABLE_GENERIC_ADVDIFF -DDISABLE_DEBUGMODE )      RETVAL=$?
1319  # echo -n "  "      if test "x${RETVAL}" = x0 ; then
1320  # i=0          rm -f make_mnc.errors
1321  # while test $i -lt "${#pkrm[@]}" ; do      else
1322  #     echo "$PACKAGES" | grep "${pk[$i]}" > /dev/null 2>&1          echo "Error: problem encountered while building source files in pkg/mnc:"
1323  #     RETVAL=$?          cat make_mnc.errors 1>&2
1324  #     if test "x$RETVAL" = x1 ; then          exit 1
1325  #       DEFINES="$DEFINES ${pkdef[$i]}"      fi
1326  #       echo -n " ${pkdef[$i]}"      if test "x$HAVE_NETCDF" != xt ; then
1327  #     fi          cat <<EOF
 #     i=$(( $i + 1 ))  
 # done  
 # echo  
1328    
1329  echo "  Searching for CPP_OPTIONS.h (macros and flags for configuring the model):"  WARNING: the "mnc" package has been enabled but tests failed to
1330  CPP_OPTIONS=    compile and/or execute NetCDF applications.  Please check that:
1331  spaths="$MODS ./ $SOURCEDIRS"  
1332  for i in $spaths ; do    1) NetCDF is installed for your compiler and
1333      try="$i/CPP_OPTIONS.h"    2) the LIBS variable (within the 'optfile") specifies the correct
1334      #  echo -n "    trying $try : "         NetCDF library to link against.
1335      if test -f $try -a -r $try ; then    
1336          echo "    found CPP_OPTIONS=\"$try\""  EOF
         CPP_OPTIONS="$try"  
         if test "x$i" != "x." ; then  
             cp -f $CPP_OPTIONS .  
         fi  
         break  
1337      fi      fi
 done  
 if test "x$CPP_OPTIONS" = x ; then  
     echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"  
     exit 1  
1338  fi  fi
 if test -e CPP_OPTIONS.h ; then  
     if test ! -e CPP_OPTIONS.h.bak ; then  
         cp -f CPP_OPTIONS.h CPP_OPTIONS.h.bak  
     fi  
     cat CPP_OPTIONS.h \  
         | awk 'BEGIN{p=1;} ($1=="C===" && $2=="GENMAKE"){p=0;} {if (p==1) print $0}' \  
         > CPP_OPTIONS.h.tmp  
 fi  
 cat <<EOF >>CPP_OPTIONS.h.tmp  
 C=== GENMAKE v2 ===  
 C  The following defines have been set by GENMAKE, so please edit  
 C  them only if you know what you're doing.  In general, you should  
 C  add or remove packages by re-running genmake with different  
 C  "-enable" and/or "-disable" options.  
1339    
1340  C  Packages disabled by genmake:  # Create a list of #define and #undef to enable/disable packages
1341  EOF  PACKAGES_DOT_H=PACKAGES_CONFIG.h
1342  #  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
1343  #  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
1344  #  file would eventually be split up so that all package-related #define  #  file would eventually be split up so that all package-related #define
1345  #  statements could be separated and handled only by genmake.  #  statements could be separated and handled only by genmake.
1346  names=`ls -1 "$ROOTDIR/pkg"`  names=`ls -1 "$ROOTDIR/pkg"`
1347  all_pack=  all_pack=
1348    DISABLED_PACKAGES=
1349  for n in $names ; do  for n in $names ; do
1350      if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then      if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
1351          has_pack="f"          has_pack="f"
# Line 748  for n in $names ; do Line 1356  for n in $names ; do
1356              fi              fi
1357          done          done
1358          if test "x$has_pack" = xf ; then          if test "x$has_pack" = xf ; then
1359              undef=`echo "ALLOW_$n" | awk '{print toupper($0)}'`              undef=`echo "ALLOW_$n" | $AWK '{print toupper($0)}'`
1360              echo "#undef $undef" >> CPP_OPTIONS.h.tmp              DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
   
 #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!  
             case $n in  
                 mom_fluxform)  
                     DEFINES="$DEFINES -DDISABLE_MOM_FLUXFORM"  
                     ;;  
                 mom_vecinv)  
                     DEFINES="$DEFINES -DDISABLE_MOM_VECINV"  
                     ;;  
                 generic_advdiff)  
                     DEFINES="$DEFINES -DDISABLE_GENERIC_ADVDIFF"  
                     ;;  
                 debug)  
                     DEFINES="$DEFINES -DDISABLE_DEBUGMODE"  
                     ;;  
             esac  
 #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!  
   
1361          fi          fi
1362      fi      fi
1363  done  done
1364  cat <<EOF >>CPP_OPTIONS.h.tmp  ENABLED_PACKAGES=
   
 C  Packages enabled by genmake:  
 EOF  
1365  for i in $PACKAGES ; do  for i in $PACKAGES ; do
1366      def=`echo "ALLOW_$i" | awk '{print toupper($0)}'`      def=`echo "ALLOW_$i" | $AWK '{print toupper($0)}'`
1367      echo "#define $def" >> CPP_OPTIONS.h.tmp      ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
1368    #eh3 DEFINES="$DEFINES -D$def"
1369    
1370  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!
1371      case $i in      case $i in
1372          aim_v23)          aim_v23)
1373              echo "#define   ALLOW_AIM" >> CPP_OPTIONS.h.tmp              ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
1374                echo "Warning: ALLOW_AIM is set to enable aim_v23."
1375              ;;              ;;
1376      esac      esac
1377  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!
1378    
1379  done  done
 mv -f CPP_OPTIONS.h.tmp CPP_OPTIONS.h  
1380    
1381  echo "  Adding STANDARDDIRS"  echo "  Adding STANDARDDIRS"
1382  BUILDDIR=${BUILDDIR:-.}  BUILDDIR=${BUILDDIR:-.}
1383  STANDARDDIRS=${STANDARDDIRS:-"eesupp model"}  if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
1384  for d in $STANDARDDIRS ; do      STANDARDDIRS="eesupp model"
1385      adr="$ROOTDIR/$d/src"  fi
1386      if test ! -d $adr ; then  if test "x$STANDARDDIRS" != x ; then
1387          echo "Error:  directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""      for d in $STANDARDDIRS ; do
1388          echo "  is correct and that you correctly specified the STANDARDDIRS option"          adr="$ROOTDIR/$d/src"
1389          exit 1          if test ! -d $adr ; then
1390      else              echo "Error:  directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1391          SOURCEDIRS="$SOURCEDIRS $adr"              echo "  is correct and that you correctly specified the STANDARDDIRS option"
1392      fi              exit 1
1393      adr="$ROOTDIR/$d/inc"          else
1394      if test ! -d $adr ; then              SOURCEDIRS="$SOURCEDIRS $adr"
1395          echo "Error:  directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""          fi
1396          echo "  is correct and that you correctly specified the STANDARDDIRS option"          adr="$ROOTDIR/$d/inc"
1397          exit 1          if test ! -d $adr ; then
1398      else              echo "Error:  directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1399          INCLUDEDIRS="$INCLUDEDIRS $adr"              echo "  is correct and that you correctly specified the STANDARDDIRS option"
1400                exit 1
1401            else
1402                INCLUDEDIRS="$INCLUDEDIRS $adr"
1403            fi
1404        done
1405    fi
1406    
1407    echo "  Searching for *OPTIONS.h files in order to warn about the presence"
1408    echo "    of \"#define \"-type statements that are no longer allowed:"
1409    CPP_OPTIONS=
1410    CPP_EEOPTIONS=
1411    spaths=". $INCLUDEDIRS"
1412    names=`ls -1 "$ROOTDIR/pkg"`
1413    for i in $spaths ; do
1414        try="$i/CPP_OPTIONS.h"
1415        if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
1416            echo "    found CPP_OPTIONS=\"$try\""
1417            CPP_OPTIONS="$try"
1418            # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
1419            for n in $names ; do
1420                test_for_package_in_cpp_options $CPP_OPTIONS $n
1421            done
1422        fi
1423        try="$i/CPP_EEOPTIONS.h"
1424        if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
1425            echo "    found CPP_EEOPTIONS=\"$try\""
1426            # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
1427    #**** not yet enabled ****
1428    #        test_for_mpi_in_cpp_eeoptions $try
1429    #**** not yet enabled ****
1430            CPP_EEOPTIONS="$try"
1431      fi      fi
1432  done  done
1433    if test "x$CPP_OPTIONS" = x ; then
1434        echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
1435        exit 1
1436    fi
1437    
1438    #  Here, we build the list of files to be "run through" the adjoint
1439    #  compiler.
1440    if test -f ./ad_files ; then
1441        rm -f ./ad_files
1442    fi
1443    echo "  Creating the list of files for the adjoint compiler."
1444    for i in $SOURCEDIRS ; do
1445        list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
1446        for j in $list_files ; do
1447            cat $i/$j >> ad_files
1448        done
1449    done
1450    
1451    
1452  echo  echo
1453  echo "===  Creating the Makefile  ==="  echo "===  Creating the Makefile  ==="
1454  echo "  setting INCLUDES"  echo "  setting INCLUDES"
1455  for i in $INCLUDEDIRS ; do  for i in $INCLUDEDIRS ; do
1456      if test -d $i ; then      if ! test -d $i ; then
1457          INCLUDES="$INCLUDES -I$i"  #       INCLUDES="$INCLUDES -I$i"
1458      else  #   else
1459          echo "Warning: can't find INCLUDEDIRS=\"$i\""          echo "Warning: can't find INCLUDEDIRS=\"$i\""
1460      fi      fi
1461  done  done
# Line 829  rm -rf .links.tmp Line 1465  rm -rf .links.tmp
1465  mkdir .links.tmp  mkdir .links.tmp
1466  echo "# This section creates symbolic links" > srclinks.tmp  echo "# This section creates symbolic links" > srclinks.tmp
1467  echo "" >> srclinks.tmp  echo "" >> srclinks.tmp
1468  echo -n 'SRCFILES = '    > srclist.inc  printf 'SRCFILES = '    > srclist.inc
1469  echo -n 'CSRCFILES = '   > csrclist.inc  printf 'CSRCFILES = '   > csrclist.inc
1470  echo -n 'F90SRCFILES = ' > f90srclist.inc  printf 'F90SRCFILES = ' > f90srclist.inc
1471  echo -n 'HEADERFILES = ' > hlist.inc  printf 'HEADERFILES = ' > hlist.inc
1472    printf 'AD_FLOW_FILES = ' > ad_flow_files.inc
1473  alldirs="$SOURCEDIRS $INCLUDEDIRS ."  alldirs="$SOURCEDIRS $INCLUDEDIRS ."
1474  for d in $alldirs ; do  for d in $alldirs ; do
1475      deplist=      deplist=
1476      sfiles=`( cd $d; echo *.[h,c,F] )`      sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
1477      sfiles=`( echo $sfiles; cd $d; echo *.F90 )`      sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
1478      for sf in $sfiles ; do      for sf in $sfiles ; do
1479          if test ! -r ".links.tmp/$sf" ; then          if test ! -r ".links.tmp/$sf" ; then
1480              if test -f "$d/$sf" ; then              if test -f "$d/$sf" ; then
1481                  extn=`echo $sf | awk -F '.' '{print $NF}'`                  case $d/$sf in
1482                  touch .links.tmp/$sf                    ./$PACKAGES_DOT_H)
1483                  deplist="$deplist $sf"                          ;;
1484                      ./AD_CONFIG.h)
1485                            ;;
1486                      ./FC_NAMEMANGLE.h)
1487                            ;;
1488                      *)
1489                            touch .links.tmp/$sf
1490                            deplist="$deplist $sf"
1491                            ;;
1492                    esac
1493                    extn=`echo $sf | $AWK -F '.' '{print $NF}'`
1494                  case $extn in                  case $extn in
1495                      F)                      F)
1496                          echo    " \\"  >> srclist.inc                          echo    " \\"  >> srclist.inc
1497                          echo -n " $sf" >> srclist.inc                          printf " $sf" >> srclist.inc
1498                          ;;                          ;;
1499                      F90)                      F90)
1500                          echo    " \\"  >> f90srclist.inc                          echo    " \\"  >> f90srclist.inc
1501                          echo -n " $sf" >> f90srclist.inc                          printf " $sf" >> f90srclist.inc
1502                          ;;                          ;;
1503                      c)                      c)
1504                          echo    " \\"  >> csrclist.inc                          echo    " \\"  >> csrclist.inc
1505                          echo -n " $sf" >> csrclist.inc                          printf " $sf" >> csrclist.inc
1506                          ;;                          ;;
1507                      h)                      h)
1508                          echo    " \\"  >> hlist.inc                          echo    " \\"  >> hlist.inc
1509                          echo -n " $sf" >> hlist.inc                          printf " $sf" >> hlist.inc
1510                            ;;
1511                        flow)
1512                            echo    " \\"  >> ad_flow_files.inc
1513                            printf " $sf" >> ad_flow_files.inc
1514                          ;;                          ;;
1515                  esac                  esac
1516              fi              fi
# Line 877  echo "" >> srclist.inc Line 1528  echo "" >> srclist.inc
1528  echo "" >> csrclist.inc  echo "" >> csrclist.inc
1529  echo "" >> f90srclist.inc  echo "" >> f90srclist.inc
1530  echo "" >> hlist.inc  echo "" >> hlist.inc
1531    echo "" >> ad_flow_files.inc
1532    
1533  if test -e $MAKEFILE ; then  if test -e $MAKEFILE ; then
1534      mv -f $MAKEFILE "$MAKEFILE.bak"      mv -f $MAKEFILE "$MAKEFILE.bak"
# Line 887  echo "#    $MACHINE" >> $MAKEFILE Line 1539  echo "#    $MACHINE" >> $MAKEFILE
1539  echo "# This makefile was generated automatically on" >> $MAKEFILE  echo "# This makefile was generated automatically on" >> $MAKEFILE
1540  echo "#    $THISDATE" >> $MAKEFILE  echo "#    $THISDATE" >> $MAKEFILE
1541  echo "# by the command:" >> $MAKEFILE  echo "# by the command:" >> $MAKEFILE
1542  echo "#    $0 $@" >> $MAKEFILE  echo "#    $0 $G2ARGS" >> $MAKEFILE
1543  echo "# executed by:" >> $MAKEFILE  echo "# executed by:" >> $MAKEFILE
1544  echo "#    $USER@${THISHOSTNAME}:${THISCWD}" >> $MAKEFILE  echo "#    $USER@${THISHOSTNAME}:${THISCWD}" >> $MAKEFILE
1545    
1546    EXE_AD=$EXECUTABLE"_ad"
1547    EXE_FTL=$EXECUTABLE"_ftl"
1548    EXE_SVD=$EXECUTABLE"_svd"
1549    
1550  cat >>$MAKEFILE <<EOF  cat >>$MAKEFILE <<EOF
1551    #
1552    # OPTFILE="$OPTFILE"
1553  #  #
1554  # BUILDDIR     : Directory where object files are written  # BUILDDIR     : Directory where object files are written
1555  # SOURCEDIRS   : Directories containing the source (.F) files  # SOURCEDIRS   : Directories containing the source (.F) files
# Line 918  EXEDIR      = ${EXEDIR} Line 1577  EXEDIR      = ${EXEDIR}
1577  EXECUTABLE  = \$(EXEDIR)/${EXECUTABLE}  EXECUTABLE  = \$(EXEDIR)/${EXECUTABLE}
1578  TOOLSDIR    = ${TOOLSDIR}  TOOLSDIR    = ${TOOLSDIR}
1579    
1580    #eh3  new defines for the adjoint work
1581    AUTODIFF    = ${ROOTDIR}/pkg/autodiff
1582    EXE_AD      = ${EXE_AD}
1583    EXE_FTL     = ${EXE_FTL}
1584    EXE_SVD     = ${EXE_SVD}
1585    
1586    ENABLED_PACKAGES = ${ENABLED_PACKAGES}
1587    DISABLED_PACKAGES = ${DISABLED_PACKAGES}
1588    
1589    # These files are created by Makefile
1590    SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h
1591    
1592  EOF  EOF
1593    
1594  #  Note: figure out some way to add Hyades JAM libraries here  #  Note: figure out some way to add Hyades JAM libraries here
# Line 936  FC = ${FC} Line 1607  FC = ${FC}
1607  # Fortran compiler  # Fortran compiler
1608  F90C = ${F90C}  F90C = ${F90C}
1609  # Link editor  # Link editor
1610  LINK = ${LINK}  LINK = ${LINK} ${LDADD}
1611    
1612  # Defines for CPP  # Defines for CPP
1613  DEFINES = ${DEFINES}  DEFINES = ${DEFINES}
# Line 963  MAKEFILE=${MAKEFILE} Line 1634  MAKEFILE=${MAKEFILE}
1634    
1635  EOF  EOF
1636    
1637  cat srclist.inc    >> $MAKEFILE  cat srclist.inc       >> $MAKEFILE
1638  cat csrclist.inc   >> $MAKEFILE  cat csrclist.inc      >> $MAKEFILE
1639  cat f90srclist.inc >> $MAKEFILE  cat f90srclist.inc    >> $MAKEFILE
1640  cat hlist.inc      >> $MAKEFILE  cat hlist.inc         >> $MAKEFILE
1641    cat ad_flow_files.inc >> $MAKEFILE
1642    echo               >> $MAKEFILE
1643  echo 'F77FILES =  $(SRCFILES:.F=.f)'                                           >> $MAKEFILE  echo 'F77FILES =  $(SRCFILES:.F=.f)'                                           >> $MAKEFILE
1644  echo 'F90FILES =  $(F90SRCFILES:.F90=.f90)'                                    >> $MAKEFILE  echo 'F90FILES =  $(F90SRCFILES:.F90=.f90)'                                    >> $MAKEFILE
1645  echo 'OBJFILES =  $(SRCFILES:.F=.o) $(CSRCFILES:.c=.o) $(F90SRCFILES:.F90=.o)' >> $MAKEFILE  echo 'OBJFILES =  $(SRCFILES:.F=.o) $(CSRCFILES:.c=.o) $(F90SRCFILES:.F90=.o)' >> $MAKEFILE
1646    
1647  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
1648    rm -f ad_flow_files.inc
1649    
1650  cat >>$MAKEFILE <<EOF  cat >>$MAKEFILE <<EOF
1651    
# Line 979  cat >>$MAKEFILE <<EOF Line 1653  cat >>$MAKEFILE <<EOF
1653  .SUFFIXES: .o .f .p .F .c .F90 .f90  .SUFFIXES: .o .f .p .F .c .F90 .f90
1654    
1655  all: \$(EXECUTABLE)  all: \$(EXECUTABLE)
1656  \$(EXECUTABLE): \$(OBJFILES)  \$(EXECUTABLE): \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(OBJFILES)
1657            @echo Creating \$@ ...
1658          \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)          \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
1659  depend:  depend:
1660          @make links          @make links
1661          \$(MAKEDEPEND) -o .f \$(DEFINES) \$(INCLUDES) \$(SRCFILES)          \$(MAKEDEPEND) -o .f \$(DEFINES) \$(INCLUDES) \$(SRCFILES)
1662          ${TOOLSDIR}/f90mkdepend >> \$(MAKEFILE)          \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
1663            -rm -f makedepend.out
1664    
1665  links: \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES)  links: \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(SPECIAL_FILES)
1666    
1667  small_f: \$(F77FILES) \$(F90FILES)  small_f: \$(F77FILES) \$(F90FILES)
1668    
# Line 995  output.txt: \$(EXECUTABLE) Line 1671  output.txt: \$(EXECUTABLE)
1671          @\$(EXECUTABLE) > \$@          @\$(EXECUTABLE) > \$@
1672    
1673  clean:  clean:
1674          -rm -rf *.o *.f *.p *.f90 *.mod ${RMFILES} work.{pc,pcl}          -rm -rf *.o *.f *.p *.f90 *.mod ${RMFILES} work.{pc,pcl} *.template
1675  Clean:  Clean:
1676          @make clean          @make clean
1677          @make cleanlinks          @make cleanlinks
1678          -rm -f Makefile.bak          -rm -f \$(SPECIAL_FILES)
1679            -rm -f genmake_state genmake_*optfile genmake_warnings make.log run.log *.bak
1680  CLEAN:  CLEAN:
1681          @make Clean          @make Clean
1682          -find \$(EXEDIR) -name "*.meta" -exec rm {} \;          -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
1683          -find \$(EXEDIR) -name "*.data" -exec rm {} \;          -find \$(EXEDIR) -name "*.data" -exec rm {} \;
1684          -find \$(EXEDIR) -name "fort.*" -exec rm {} \;          -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
1685          -rm -f \$(EXECUTABLE)          -rm -f \$(EXECUTABLE) output.txt
1686    
1687    #eh3 Makefile: makefile
1688  makefile:  makefile:
1689          ${0} $@          $THIS_SCRIPT $G2ARGS
1690  cleanlinks:  cleanlinks:
1691          -find . -type l -exec rm {} \;          -find . -type l -exec rm {} \;
1692    
1693    # Special targets ($SPECIAL_FILES) which are create by make
1694    ${PACKAGES_DOT_H}:
1695            @echo Creating \$@ ...
1696            @$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) > \$@
1697    AD_CONFIG.h:
1698            @echo Creating \$@ ...
1699            @$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 > \$@
1700    FC_NAMEMANGLE.h:
1701            @echo Creating \$@ ...
1702            echo "$FC_NAMEMANGLE" > \$@
1703    
1704  # The normal chain of rules is (  .F - .f - .o  )  # The normal chain of rules is (  .F - .f - .o  )
1705  .F.f:  .F.f:
1706          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
# Line 1030  cleanlinks: Line 1719  cleanlinks:
1719  .p.f:  .p.f:
1720          \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<          \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
1721    
1722    #=========================================
1723    #===  Automatic Differentiation Rules  ===
1724    
1725    TAMC           = ${TAMC}
1726    TAF            = ${TAF}
1727    
1728    TAF_EXTRA      = ${TAF_EXTRA}
1729    TAMC_EXTRA     = ${TAMC_EXTRA}
1730    
1731    EOF
1732    
1733    ad_vars="AD_TAMC_FLAGS AD_TAF_FLAGS"
1734    ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF_FLAGS"
1735    ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
1736    for i in $ad_vars ; do
1737        name=$i
1738        t1="t2=\$"`echo $i`
1739        eval $t1
1740        printf "%-20s = " $name >> $MAKEFILE
1741        echo $t2 >> $MAKEFILE
1742    done
1743    
1744    echo "  Add the source list for AD code generation"
1745    echo >> $MAKEFILE
1746    printf "AD_FILES = " >> $MAKEFILE
1747    AD_FILES=`cat ad_files`
1748    for i in $AD_FILES ; do
1749        echo    " \\" >> $MAKEFILE
1750        printf " $i" >> $MAKEFILE
1751    done
1752    echo >> $MAKEFILE
1753    rm -f ad_files
1754    
1755    cat >>$MAKEFILE <<EOF
1756    
1757    # ... AD ...
1758    adall: ad_taf
1759    adtaf: ad_taf_output.f
1760    adtamc: ad_tamc_output.f
1761    
1762    ad_input_code.f: \$(AD_FILES) \$(HEADERFILES)
1763            @$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
1764            cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
1765            -rm -f ad_config.template
1766            @make \$(F77FILES)
1767            @make \$(AD_FLOW_FILES)
1768            cat \$(AD_FLOW_FILES) \$(AD_FILES) > ad_input_code.f
1769    
1770    ad_taf_output.f: ad_input_code.f
1771            \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f
1772            cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f
1773    
1774    adtafonly:
1775            \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f
1776            cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f
1777    
1778    ad_taf: ad_taf_output.o \$(OBJFILES)
1779            \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
1780    
1781    ad_tamc_output.f: ad_input_code.f
1782            \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.f
1783            cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.f
1784    
1785    ad_tamc: ad_tamc_output.o \$(OBJFILES)
1786            \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
1787    
1788    
1789    # ... FTL ...
1790    ftlall: ftl_taf
1791    ftltaf: ftl_taf_output.f
1792    ftltamc: ftl_tamc_output.f
1793    
1794    ftl_input_code.f: \$(AD_FILES) \$(HEADERFILES)
1795            @$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
1796            cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
1797            -rm -f ftl_config.template
1798            @make \$(F77FILES)
1799            @make \$(AD_FLOW_FILES)
1800            cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.f
1801    
1802    ftl_taf_output.f: ftl_input_code.f
1803            \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f
1804            cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f
1805    
1806    ftltafonly:
1807            \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f
1808            cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f
1809    
1810    ftl_taf: ftl_taf_output.o \$(OBJFILES)
1811            \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
1812    
1813    ftl_tamc_output.f: ftl_input_code.f
1814            \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.f
1815            cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.f
1816    
1817    ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
1818            \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
1819    
1820    
1821    # ... SVD ...
1822    svdtaf: ad_taf_output.f ftl_taf_output.f
1823    svdall: svd_taf
1824    
1825    svd_taf: ad_taf_output.o ftl_taf_output.o \$(OBJFILES)
1826            \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
1827    
1828    
1829    #=========================================
1830    
1831  EOF  EOF
1832    
1833  if test "x$EXEHOOK" != x ; then  if test "x$EXEHOOK" != x ; then
# Line 1066  printf "\n\n# DO NOT DELETE\n" >> $MAKEF Line 1864  printf "\n\n# DO NOT DELETE\n" >> $MAKEF
1864    
1865  printf "\n===  Done  ===\n"  printf "\n===  Done  ===\n"
1866    
1867    # Create special header files
1868    $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"
1869    if test ! -f $PACKAGES_DOT_H ; then
1870        mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
1871    else
1872        cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H > /dev/null 2>&1
1873        RETVAL=$?
1874        if test "x$RETVAL" = x0 ; then
1875            rm -f $PACKAGES_DOT_H".tmp"
1876        else
1877            mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"
1878            mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
1879        fi
1880    fi
1881    if test ! -f AD_CONFIG.h ; then
1882        $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
1883    fi
1884    
1885    
1886  #  Write the "state" for future records  #  Write the "state" for future records
1887  if test "x$DUMPSTATE" != xf ; then  if test "x$DUMPSTATE" != xf ; then
1888      echo -n "" > gm_state      printf "" > genmake_state
1889      for i in $gm_state ; do      for i in $gm_state ; do
1890          t1="t2=\$$i"          t1="t2=\$$i"
1891          eval $t1          eval $t1
1892          echo "$i='$t2'" >> gm_state          echo "$i='$t2'" >> genmake_state
1893      done      done
1894  fi  fi

Legend:
Removed from v.1.10  
changed lines
  Added in v.1.73

  ViewVC Help
Powered by ViewVC 1.1.22