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

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

  ViewVC Help
Powered by ViewVC 1.1.22