/[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.2 by edhill, Fri Aug 22 04:07:00 2003 UTC revision 1.66 by edhill, Mon Feb 23 21:51:32 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            echo -n "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"      # makedepend is not always available
104        if test "x${MAKEDEPEND}" = x ; then
105          which makedepend >& /dev/null
106          RETVAL=$?
107          if test "x${RETVAL}" = x1 ; then
108             echo "    makedepend was not found. Using xmakedpend instead."
109             MAKEDEPEND='$(TOOLSDIR)/xmakedepend'
110          fi
111      fi      fi
     rm -f test link  
112    
113      # look for possible fortran compilers      # look for possible fortran compilers
114        tmp="$MITGCM_FC $FC efc g77 f77 pgf77 pgf95 ifc f90 f95 mpif77 mpf77 mpxlf95"
115      p_FC=      p_FC=
116      for c in f77 g77 pgf77 pgf95 ifc f90 f95 mpif77 mpf77 mpxlf95 ; do      for c in $tmp ; do
117          which $c > /dev/null 2>&1          rm -f ./hello.f ./hello
118            cat >> hello.f <<EOF
119          program hello
120          do i=1,3
121            print *, 'hello world : ', i
122          enddo
123          end
124    EOF
125            $c -o hello hello.f > /dev/null 2>&1
126          RETVAL=$?          RETVAL=$?
127          if test "x${RETVAL}" = x0 ; then          if test "x${RETVAL}" = x0 ; then
128              p_FC="$p_FC $c"              p_FC="$p_FC $c"
129          fi          fi
130      done      done
131      echo "Possible FORTRAN compilers appear to be:  "      rm -f ./hello.f ./hello
132      if test "x${p_FC}" = x ; then      if test "x${p_FC}" = x ; then
133          echo "  None found!!!"          cat 1>&2 <<EOF
134      else  
135          echo "  "$p_FC  Error: No Fortran compilers were found in your path.  Please specify one using:
136      fi  
137        1) an "optfile" on (eg. "-optfile=path/to/OPTFILE"),
138        2) a command-line option (eg. "-fc NAME"), or
139        3) the MITGCM_FC environment variable.
140    
     # look for possible MPI libraries  
     mpi_libs=  
     mpi_fort=`which mpif77 2>/dev/null`  
     RETVAL=$?  
     if test "x${RETVAL}" = x0 ; then  
         cat >>test.f <<EOF  
       PROGRAM HELLO  
       DO 10, I=1,10  
       PRINT *,'Hello World'  
    10 CONTINUE  
       STOP  
       END  
141  EOF  EOF
142          eval "$mpi_fort -showme test.f > out"          exit 1
143          RETVAL=$?      else
144          if test "x${RETVAL}" = x0 ; then          echo "  The possible FORTRAN compilers found in your path are:"
145              a=`cat out`          echo "   "$p_FC
146              for i in $a ; do          if test "x$FC" = x ; then
147                  case $i in              FC=`echo $p_FC | $AWK '{print $1}'`
                     -*)  
                         mpi_libs="$mpi_libs $i" ;;  
                 esac  
             done  
             echo "The MPI libs appear to be:"  
             echo "  "$mpi_libs  
148          fi          fi
         rm -f test.f out  
149      fi      fi
150    
151  }      for i in $p_FC ; do
152            p_OF=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$i
153            if test -r $p_OF ; then
154                OPTFILE=$p_OF
155                echo "  The options file:  $p_OF"
156                echo "    appears to match so we'll use it."
157                break
158            fi
159        done
160        if test "x$OPTFILE" = x ; then
161            cat 1>&2 <<EOF
162    
163  parse_options()  {  Error: No options file was found in:  $ROOTDIR/tools/build_options/
164      that matches this platform ("$PLATFORM") and the compilers found in
165      your path.  Please specify an "optfile" using:
166    
167      ac_prev=      1) the command line (eg. "-optfile=path/to/OPTFILE"), or
168      for ac_option in "${OPTIONS[@]}" ; do      2) the MITGCM_OF environment variable.
169    
170      If you need help, please contact the developers at <MITgcm-support@mitgcm.org>.
171    
172    EOF
173            exit 1
174        fi
175        
176    #     # look for possible MPI libraries
177    #     mpi_libs=
178    #     mpi_fort=`which mpif77 2>/dev/null`
179    #     RETVAL=$?
180    #     if test "x${RETVAL}" = x0 ; then
181    #       cat >>test.f <<EOF
182    #       PROGRAM HELLO
183    #       DO 10, I=1,10
184    #       PRINT *,'Hello World'
185    #    10 CONTINUE
186    #       STOP
187    #       END
188    # EOF
189    #       eval "$mpi_fort -showme test.f > out"
190    #       RETVAL=$?
191    #       if test "x${RETVAL}" = x0 ; then
192    #           a=`cat out`
193    #           for i in $a ; do
194    #               case $i in
195    #                   -*)
196    #                       mpi_libs="$mpi_libs $i" ;;
197    #               esac
198    #           done
199    #           echo "The MPI libs appear to be:"
200    #           echo "  "$mpi_libs
201    #       fi
202    #       rm -f test.f out
203    #     fi
204    
         # echo "ac_option = :$ac_option:"  
           
         # If the previous option needs an argument, assign it.  
         if test -n "$ac_prev"; then  
             eval "$ac_prev=\$ac_option"  
             ac_prev=  
             continue  
         fi  
           
         ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`  
           
         case $ac_option in  
               
             -help | --help | -h | --h)  
                 usage ;;  
               
             -nooptfile | --nooptfile)  
                 OPTFILE="NONE" ;;  
             -optfile | --optfile | -of | --of)  
                 ac_prev=optfile ;;  
             -optfile=* | --optfile=* | -of=* | --of=*)  
                 OPTFILE=$ac_optarg ;;  
               
             -pdepend | --pdepend)  
                 ac_prev=pdepend ;;  
             -pdepend=* | --pdepend=*)  
                 PDEPEND=$ac_optarg ;;  
               
             -pdefault | --pdefault)  
                 ac_prev=pdefault ;;  
             -pdefault=* | --pdefault=*)  
                 PDEFAULT=$ac_optarg ;;  
               
             -makefile | -ma)  
                 ac_prev=makefile ;;  
             --makefile=* | -ma=*)  
                 MAKEFILE=$ac_optarg ;;  
               
             -platform | --platform | -pl | --pl)  
                 ac_prev=platform ;;  
             -platform=* | --platform=* | -pl=* | --pl=*)  
                 PLATFORM=$ac_optarg ;;  
   
             -rootdir | --rootdir | -rd | --rd)  
                 ac_prev=rootdir ;;  
             -rootdir=* | --rootdir=* | -rd=* | --rd=*)  
                 ROOTDIR=$ac_optarg ;;  
               
             -mods | --mods | -mo | --mo)  
                 ac_prev=mods ;;  
             -mods=* | --mods=* | -mo=* | --mo=*)  
                 MODS=$ac_optarg ;;  
               
             -disable | --disable)  
                 ac_prev=disable ;;  
             -disable=* | --disable=*)  
                 DISABLE=$ac_optarg ;;  
               
             -enable | --enable)  
                 ac_prev=enable ;;  
             -enable=* | --enable=*)  
                 ENABLE=$ac_optarg ;;  
               
             -noopt | --noopt)  
                 ac_prev=noopt ;;  
             -noopt=* | --noopt=*)  
                 NOOPT=$ac_optarg ;;  
               
 #           -cpp | --cpp)  
 #               ac_prev=cpp ;;  
 #           -cpp=* | --cpp=*)  
 #               CPP=$ac_optarg ;;  
               
             -fortran | --fortran | -fc | --fc)  
                 ac_prev=fc ;;  
             -fc=* | --fc=*)  
                 FC=$ac_optarg ;;  
               
             -ieee | --ieee)  
                 IEEE=1 ;;  
             -noieee | --noieee)  
                 IEEE=0 ;;  
               
             -mpi | --mpi)  
                 MPI=1 ;;  
             -nompi | --nompi)  
                 MPI=0 ;;  
               
             -jam | --jam)  
                 JAM=1 ;;  
             -nojam | --nojam)  
                 JAM=0 ;;  
               
             -*)  
                 echo "Error: unrecognized option: "$ac_option  
                 usage  
                 ;;  
               
             *)  
                 echo "Error: unrecognized argument: "$ac_option  
                 usage  
                 ;;  
               
         esac  
           
     done  
205  }  }
206    
207  #  Parse the package dependency information  #  Parse the package dependency information
# Line 199  get_pdepend_list()  { Line 210  get_pdepend_list()  {
210      #  strip the comments and then convert the dependency file into      #  strip the comments and then convert the dependency file into
211      #  two arrays: PNAME, DNAME      #  two arrays: PNAME, DNAME
212      cat $1 | sed -e 's/#.*$//g' \      cat $1 | sed -e 's/#.*$//g' \
213          | 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} }' \
214          > ./.pd_tmp          > ./.pd_tmp
215      source ./.pd_tmp      . ./.pd_tmp
216      rm -f ./.pd_tmp      rm -f ./.pd_tmp
217    
218      echo -n "PNAME = "${}      echo -n "PNAME = "${}
# Line 210  get_pdepend_list()  { Line 221  get_pdepend_list()  {
221    
222  #  Explain usage  #  Explain usage
223  usage()  {  usage()  {
224      echo  cat <<EOF
225      echo "Usage: "$0" [OPTIONS]"  
226      echo "  where [OPTIONS] can be:"  Usage: "$0" [OPTIONS]
227      echo    where [OPTIONS] can be:
228      echo "    -help | --help | -h | --h"  
229      echo "    -nooptfile | --nooptfile"      -help | --help | -h | --h
230      echo "      -optfile NAME | --optfile NAME | -of NAME | --of NAME"            Print this help message and exit.
231      echo "      -optfile=NAME | --optfile=NAME | -of=NAME | --of=NAME"  
232      echo "    -pdepend NAME | --pdepend NAME"      -nooptfile | --nooptfile
233      echo "      -pdepend=NAME | --pdepend=NAME"        -optfile NAME | --optfile NAME | -of NAME | --of NAME
234      echo "    -pdefault NAME | --pdefault NAME"        -optfile=NAME | --optfile=NAME | -of=NAME | --of=NAME
235      echo "      -pdefault=NAME | --pdefault=NAME"            Use "NAME" as the optfile.  By default, an attempt will be
236      echo "    -makefile NAME | -ma NAME"            made to find an appropriate "standard" optfile in the
237      echo "      --makefile=NAME | -ma=NAME"            tools/build_options/ directory.
238      echo "    -platform NAME | --platform NAME | -pl NAME | --pl NAME"  
239      echo "      -platform=NAME | --platform=NAME | -pl=NAME | --pl=NAME"      -pdepend NAME | --pdepend NAME
240      echo "    -rootdir NAME | --rootdir NAME | -rd NAME | --rd NAME"        -pdepend=NAME | --pdepend=NAME
241      echo "      -rootdir=NAME | --rootdir=NAME | -rd=NAME | --rd=NAME"            Get package dependency information from "NAME".
242      echo "    -mods NAME | --mods NAME | -mo NAME | --mo NAME"  
243      echo "      -mods=NAME | --mods=NAME | -mo=NAME | --mo=NAME"      -pdefault NAME | --pdefault NAME
244      echo "    -disable NAME | --disable NAME"        -pdefault=NAME | --pdefault=NAME
245      echo "      -disable=NAME | --disable=NAME"            Get the default package list from "NAME".
246      echo "    -enable NAME | --enable NAME"  
247      echo "      -enable=NAME | --enable=NAME"      -make NAME | -m NAME
248      echo "    -noopt NAME | --noopt NAME"        --make=NAME | -m=NAME
249      echo "      -noopt=NAME | --noopt=NAME"            Use "NAME" for the MAKE program. The default is "make" but
250  #    echo "    -cpp NAME | --cpp NAME"            many platforms, "gmake" is the preferred choice.
251  #    echo "      -cpp=NAME | --cpp=NAME"  
252      echo "    -fortran NAME | --fortran NAME | -fc NAME | --fc NAME"      -makefile NAME | -mf NAME
253      echo "      -fc=NAME | --fc=NAME"        --makefile=NAME | -mf=NAME
254      echo "    -[no]ieee | --[no]ieee"            Call the makefile "NAME".  The default is "Makefile".
255      echo "    -[no]mpi | --[no]mpi"  
256      echo "    -[no]jam | --[no]jam"      -rootdir NAME | --rootdir NAME | -rd NAME | --rd NAME
257      echo        -rootdir=NAME | --rootdir=NAME | -rd=NAME | --rd=NAME
258      echo "  and NAME is a string such as:"            Specify the location of the MITgcm ROOTDIR as "NAME".
259      echo            By default, genamke will try to find the location by
260      echo "    --enable pkg1   --enable 'pkg1 pkg2'   --enable 'pkg1 pkg2 pkg3'"            looking in parent directories (up to the 5th parent).
261      echo "    -mods=dir1   -mods='dir1'   -mods='dir1 dir2 dir3'"  
262      echo "    -foptim='-Mvect=cachesize:512000,transform -xtypemap=real:64,double:64,integer:32'"      -mods NAME | --mods NAME | -mo NAME | --mo NAME
263      echo        -mods=NAME | --mods=NAME | -mo=NAME | --mo=NAME
264      echo "  which, depending upon your shell, may need to be single-quoted"            Here, "NAME" specifies a list of directories that are
265      echo "  if it contains spaces, dashes, or other special characters."            used for additional source code.  Files found in the
266              "mods list" are given preference over files of the same
267              name found elsewhere.
268    
269        -disable NAME | --disable NAME
270          -disable=NAME | --disable=NAME
271              Here "NAME" specifies a list of packages that we don't
272              want to use.  If this violates package dependencies,
273              genamke will exit with an error message.
274    
275        -enable NAME | --enable NAME
276          -enable=NAME | --enable=NAME
277              Here "NAME" specifies a list of packages that we wish
278              to specifically enable.  If this violates package
279              dependencies, genamke will exit with an error message.
280    
281        -standarddirs NAME | --standarddirs NAME
282          -standarddirs=NAME | --standarddirs=NAME
283              Here, "NAME" specifies a list of directories to be
284              used as the "standard" code.
285    
286        -fortran NAME | --fortran NAME | -fc NAME | --fc NAME
287          -fc=NAME | --fc=NAME
288              Use "NAME" as the fortran compiler.  By default, genmake
289              will search for a working compiler by trying a list of
290              "usual suspects" such as g77, f77, etc.
291    
292        -[no]ieee | --[no]ieee
293              Do or don't use IEEE numerics.  Note that this option
294              *only* works if it is supported by the OPTFILE that
295              is being used.
296    
297      While it is most often a single word, the "NAME" variables specified
298      above can in many cases be a space-delimited string such as:
299    
300        --enable pkg1   --enable 'pkg1 pkg2'   --enable 'pkg1 pkg2 pkg3'
301        -mods=dir1   -mods='dir1'   -mods='dir1 dir2 dir3'
302        -foptim='-Mvect=cachesize:512000,transform -xtypemap=real:64,double:64,integer:32'
303    
304      which, depending upon your shell, may need to be single-quoted.
305    
306      For more detailed genmake documentation, please see:
307    
308        http://mitgcm.org/devel_HOWTO/
309    
310    EOF
311    
312      exit 1      exit 1
313  }  }
314    
315  # Dump all important state  #  Build a CPP macro to automate calling C routines from FORTRAN
316  dump_state()  {  get_fortran_c_namemangling()  {
317      fname=$1      default_nm="#define FC_NAMEMANGLE(X) X ## _"
318      echo " " > $fname      
319        cat > genmake_test.c <<EOF
320    void tcall( char * string ) { tsub( string ); }
321    EOF
322        $MAKE genmake_test.o >> genmake_warnings 2>&1
323      RETVAL=$?      RETVAL=$?
324      if test "x${RETVAL}" = x ; then      if test "x$RETVAL" != x0 ; then
325          echo "Error: cannot write to $fname"          FC_NAMEMANGLE=$default_nm
326          exit 1          cat <<EOF>> genmake_errors
327    
328    WARNING: C test compile fails
329    WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
330    WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here
331    EOF
332            return 1
333      fi      fi
334      echo "makefile "$makefile > $fname      c_tcall=`nm genmake_test.o | grep 'T ' | grep tcall | cut -d ' ' -f 3`
335        RETVAL=$?
336        if test "x$RETVAL" != x0 ; then
337            FC_NAMEMANGLE=$default_nm
338            cat <<EOF>> genmake_warnings
339    
340    WARNING: The "nm" command failed.
341    WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
342    WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here
343    EOF
344            return 1
345        fi
346        cat > genmake_tcomp.f <<EOF
347          subroutine tcall( string )
348          character*(*) string
349          call tsub( string )
350          end
351    EOF
352        $FC $FFLAGS $DEFINES -c genmake_tcomp.f >> genmake_warnings 2>&1
353        RETVAL=$?
354        if test "x$RETVAL" != x0 ; then
355            FC_NAMEMANGLE=$default_nm
356            cat <<EOF>> genmake_warnings
357    
358    WARNING: FORTRAN test compile fails -- please see "genmake_errors"
359    WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
360    WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here.
361    EOF
362            return 1
363        fi
364        f_tcall=`nm genmake_tcomp.o | grep 'T ' | grep tcall | cut -d ' ' -f 3`
365        RETVAL=$?
366        if test "x$RETVAL" != x0 ; then
367            FC_NAMEMANGLE=$default_nm
368            cat <<EOF>> genmake_warnings
369    
370    WARNING: The "nm" command failed.
371    WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
372    WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here.
373    EOF
374            return 1
375        fi
376    
377        c_a=`echo $c_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 1 | sed -e 's|Y||'`
378        f_a=`echo $f_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 1 | sed -e 's|Y||'`
379        c_b=`echo $c_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 2 | sed -e 's|Y||'`
380        f_b=`echo $f_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 2 | sed -e 's|Y||'`
381    
382        nmangle="X"
383        if test "x$c_a" != "x$f_a" ; then
384            comm="echo x$f_a | sed -e 's|x$c_a||'"
385            a=`eval $comm`
386            nmangle="$a ## $nmangle"
387        fi
388        if test "x$c_b" != "x$f_b" ; then
389            comm="echo x$f_b | sed -e 's|x$c_b||'"
390            b=`eval $comm`
391            nmangle="$nmangle ## $b"
392        fi
393    
394        FC_NAMEMANGLE="#define FC_NAMEMANGLE(X)  $nmangle"
395    
396        #  cleanup the testing files
397        rm -f genmake_tcomp.* genmake_test.*
398  }  }
399    
400    
401  #eh3 # This is the generic configuration.  check_HAVE_CLOC()  {
402  #eh3 set LN         = ( 'ln -s' )      get_fortran_c_namemangling
403  #eh3 set CPP        = ( '/lib/cpp -P' )      cat <<EOF > genmake_tc_1.c
404  #eh3 set S64        = ( '$(TOOLSDIR)/set64bitConst.sh' )  $FC_NAMEMANGLE
405  #eh3 set KPP        = (  )  #include <stdio.h>
406  #eh3 set FC         = ( 'f77' )  #include <stdlib.h>
407  #eh3 set LINK       = $FC  #include <unistd.h>
408  #eh3 set MAKEDEPEND = ( 'makedepend' )  #include <assert.h>
409  #eh3 set INCLUDES   = ( -I. )  #include <sys/time.h>
410  #eh3 set FFLAGS     = (  )  void FC_NAMEMANGLE(cloc) ( double *curtim )
411  #eh3 set FOPTIM     = (  )  {
412  #eh3 set CFLAGS     = (  )   struct timeval tv1;
413  #eh3 set KFLAGS1    = (  )   gettimeofday(&tv1 , (void *)NULL );
414  #eh3 set KFLAGS2    = (  )   *curtim =  (double)((tv1.tv_usec)+(tv1.tv_sec)*1.E6);
415  #eh3 set LIBS       = (  )   *curtim = *curtim/1.E6;
416  #eh3 set KPPFILES   = (  )  }
417  #eh3 if (! $?NOOPTFILES ) set NOOPTFILES = (  )  EOF
418  #eh3 if (! $?NOOPTFLAGS ) set NOOPTFLAGS = (  )      make genmake_tc_1.o >> genmake_tc.log 2>&1
419        RET_C=$?
420        cat <<EOF > genmake_tc_2.f
421          program hello
422          Real*8 wtime
423          external cloc
424          call cloc(wtime)
425          print *," HELLO WORLD", wtime
426          end program hello
427    EOF
428        $FC $FFLAGS -o genmake_tc genmake_tc_2.f genmake_tc_1.o >> genmake_tc.log 2>&1
429        RET_F=$?
430        test -x ./genmake_tc  &&  ./genmake_tc >> genmake_tc.log 2>&1
431        RETVAL=$?
432        if test "x$RETVAL" = x0 ; then
433            HAVE_CLOC=t
434            DEFINES="$DEFINES -DHAVE_CLOC"
435        fi
436        rm -f genmake_tc*
437    }
438    
439    
440    check_netcdf_libs()  {
441        cat <<EOF > genmake_tnc.F
442          program fgennc
443    #include "netcdf.inc"
444          integer iret, ncid, xid
445          iret = nf_create('genmake_tnc.nc', NF_CLOBBER, ncid)
446          IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
447          iret = nf_def_dim(ncid, 'X', 11, xid)
448          IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
449          iret = nf_close(ncid)
450          IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
451          end
452    EOF
453        $CPP genmake_tnc.F > genmake_tnc.f  \
454            &&  $FC $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.f $LIBS >> genmake_tnc.log 2>&1
455        RET_COMPILE=$?
456        test -x ./genmake_tnc  &&  ./genmake_tnc >> genmake_tnc.log 2>&1
457        RETVAL=$?
458        if test "x$RET_COMPILE" = x0 -a "x$RETVAL" = x0 ; then
459            HAVE_NETCDF=t
460        else
461            # try again with "-lnetcdf" added to the libs
462            $CPP genmake_tnc.F > genmake_tnc.f  \
463                &&  $FC $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.f \
464                $LIBS -lnetcdf >> genmake_tnc_2.log 2>&1
465            RET_COMPILE=$?
466            test -x ./genmake_tnc  &&  ./genmake_tnc >> genmake_tnc.log 2>&1
467            RETVAL=$?
468            if test "x$RET_COMPILE" = x0 -a "x$RETVAL" = x0 ; then
469                LIBS="$LIBS -lnetcdf"
470                HAVE_NETCDF=t
471            else
472                cat genmake_tnc.log >> genmake_warnings
473            fi
474        fi
475        rm -f genmake_tnc*
476    }
477    
478    
479  #  Set defaults here  #  Set defaults here
480    COMMANDL="$0 $@"
481    
482  PLATFORM=  PLATFORM=
483  LN=  LN=
484  S64=  S64=
485  KPP=  KPP=
486  FC=  FC=
487    CPP=
488  LINK=  LINK=
489    # DEFINES="-DWORDLENGTH=4"
490    DEFINES=
491  PACKAGES=  PACKAGES=
492  ENABLE=  ENABLE=
493  DISABLE=  DISABLE=
494  MAKEFILE=  MAKEFILE=
495  MAKEDEPEND=  MAKEDEPEND=
496  PDEPEND=  PDEPEND=
497    DUMPSTATE=t
498  PDEFAULT=  PDEFAULT=
499  OPTFILE=  OPTFILE=
500  INCLUDES="-I."  INCLUDES="-I."
# Line 313  KPPFILES= Line 508  KPPFILES=
508  NOOPTFILES=  NOOPTFILES=
509  NOOPTFLAGS=  NOOPTFLAGS=
510    
511    # DEFINES checked by test compilation
512    HAVE_SYSTEM=
513    HAVE_FDATE=
514    FC_NAMEMANGLE=
515    HAVE_CLOC=
516    HAVE_NETCDF=
517    
518  MODS=  MODS=
519  TOOLSDIR=  TOOLSDIR=
520  SOURCEDIRS=  SOURCEDIRS=
521  INCLUDEDIRS=  INCLUDEDIRS=
522    STANDARDDIRS="USE_THE_DEFAULT"
523    
524  PWD=`pwd`  PWD=`pwd`
525  MAKE=make  MAKE=make
526    AWK=awk
527  THISHOSTNAME=`hostname`  THISHOSTNAME=`hostname`
528  THISCWD=`pwd`  THISCWD=`pwd`
529  THISDATE=`date`  THISDATE=`date`
530  MACHINE=`uname -a`  MACHINE=`uname -a`
531    EXECUTABLE=
532    EXEHOOK=
533    EXEDIR=
534    PACKAGES_CONF=
535    IEEE=
536    if test "x$MITGCM_IEEE" != x ; then
537        IEEE=$MITGCM_IEEE
538    fi
539    
540    AUTODIFF_PKG_USED=f
541    AD_OPTFILE=
542    TAF=
543    AD_TAF_FLAGS=
544    FTL_TAF_FLAGS=
545    SVD_TAF_FLAGS=
546    TAF_EXTRA=
547    TAMC=
548    AD_TAMC_FLAGS=
549    FTL_TAF_FLAGS=
550    SVD_TAMC_FLAGS=
551    TAMC_EXTRA=
552    
553    
554    #  The following state can be set directly by command-line switches
555    gm_s1="OPTFILE PDEPEND PDEFAULT MAKEFILE PLATFORM ROOTDIR MODS DISABLE ENABLE"
556    gm_s2="FC CPP IEEE MPI JAM DUMPSTATE STANDARDDIRS"
557    
558    #  The following state is not directly set by command-line switches
559    gm_s3="LN S64 KPP LINK PACKAGES MAKEDEPEND PDEPEND PDEFAULT INCLUDES FFLAGS FOPTIM "
560    gm_s4="CFLAGS KFLAGS1 KFLAGS2 LIBS KPPFILES NOOPTFILES NOOPTFLAGS"
561    gm_s5="TOOLSDIR SOURCEDIRS INCLUDEDIRS PWD MAKE THISHOSTNAME THISDATE MACHINE"
562    gm_s6="EXECUTABLE EXEHOOK EXEDIR PACKAGES_CONF"
563    gm_s7="HAVE_SYSTEM HAVE_FDATE FC_NAMEMANGLE"
564    
565    #  The following are all related to adjoint/tangent-linear stuff
566    gm_s10="AUTODIFF_PKG_USED AD_OPTFILE TAMC TAF AD_TAMC_FLAGS AD_TAF_FLAGS"
567    gm_s11="FTL_TAMC_FLAGS FTL_TAF_FLAGS SVD_TAMC_FLAGS SVD_TAF_FLAGS"
568    gm_s12="TAF_EXTRA TAMC_EXTRA"
569    
570    gm_state="COMMANDL $gm_s1 $gm_s2 $gm_s3 $gm_s4 $gm_s5 $gm_s6 $gm_s7"
571    gm_state="$gm_state $gm_s10 $gm_s11 $gm_s12"
572    
573    cat <<EOF
574    
575    GENMAKE :
576    
577    A program for GENerating MAKEfiles for the MITgcm project.  For a
578    quick list of options, use "genmake -h" or for more detail see:
579    
580      http://mitgcm.org/devel_HOWTO/
581    
582    EOF
583    
 echo  
584  echo "===  Processing options files and arguments  ==="  echo "===  Processing options files and arguments  ==="
585  gm_local="./gm_local"  gm_local="genmake_local"
586    for i in . $MODS ; do
587        if test -r $i/$gm_local ; then
588            . $i/$gm_local
589            break
590        fi
591    done
592  echo -n "  getting local config information:  "  echo -n "  getting local config information:  "
593  if test -e $gm_local ; then  if test -e $gm_local ; then
594      echo "using $gm_local"      echo "using $gm_local"
595      source $gm_local      . $gm_local
596      # echo "DISABLE=$DISABLE"      # echo "DISABLE=$DISABLE"
597      # echo "ENABLE=$ENABLE"      # echo "ENABLE=$ENABLE"
598  else  else
# Line 349  fi Line 610  fi
610  #   n=$(( $n + 1 ))  #   n=$(( $n + 1 ))
611  #done  #done
612  #parse_options  #parse_options
   
613  ac_prev=  ac_prev=
614  for ac_option ; do  for ac_option ; do
615    
# Line 370  for ac_option ; do Line 630  for ac_option ; do
630          -nooptfile | --nooptfile)          -nooptfile | --nooptfile)
631              OPTFILE="NONE" ;;              OPTFILE="NONE" ;;
632          -optfile | --optfile | -of | --of)          -optfile | --optfile | -of | --of)
633              ac_prev=optfile ;;              ac_prev=OPTFILE ;;
634          -optfile=* | --optfile=* | -of=* | --of=*)          -optfile=* | --optfile=* | -of=* | --of=*)
635              OPTFILE=$ac_optarg ;;              OPTFILE=$ac_optarg ;;
636                    
637            -adoptfile | --adoptfile | -adof | --adof)
638                ac_prev=AD_OPTFILE ;;
639            -adoptfile=* | --adoptfile=* | -adof=* | --adof=*)
640                AD_OPTFILE=$ac_optarg ;;
641            
642          -pdepend | --pdepend)          -pdepend | --pdepend)
643              ac_prev=pdepend ;;              ac_prev=PDEPEND ;;
644          -pdepend=* | --pdepend=*)          -pdepend=* | --pdepend=*)
645              PDEPEND=$ac_optarg ;;              PDEPEND=$ac_optarg ;;
646                    
647          -pdefault | --pdefault)          -pdefault | --pdefault)
648              ac_prev=pdefault ;;              ac_prev=PDEFAULT ;;
649          -pdefault=* | --pdefault=*)          -pdefault=* | --pdefault=*)
650              PDEFAULT=$ac_optarg ;;              PDEFAULT=$ac_optarg ;;
651                    
652          -makefile | -ma)          -make | --make | -m | --m)
653              ac_prev=makefile ;;              ac_prev=MAKE ;;
654          --makefile=* | -ma=*)          -make=* | --make=* | -m=* | --m=*)
655                MAKE=$ac_optarg ;;
656            
657            -makefile | --makefile | -ma | --ma)
658                ac_prev=MAKEFILE ;;
659            -makefile=* | --makefile=* | -ma=* | --ma=*)
660              MAKEFILE=$ac_optarg ;;              MAKEFILE=$ac_optarg ;;
661                    
662          -platform | --platform | -pl | --pl)          -platform | --platform | -pl | --pl | -platform=* | --platform=* | -pl=* | --pl=*)
663              ac_prev=platform ;;              echo "ERROR: The platform option has been removed.  Please specify"
664          -platform=* | --platform=* | -pl=* | --pl=*)              echo "  the build options using the \"optfile\" mechanism."
665              PLATFORM=$ac_optarg ;;              echo
666                usage
667                ;;
668                    
669          -rootdir | --rootdir | -rd | --rd)          -rootdir | --rootdir | -rd | --rd)
670              ac_prev=rootdir ;;              ac_prev=ROOTDIR ;;
671          -rootdir=* | --rootdir=* | -rd=* | --rd=*)          -rootdir=* | --rootdir=* | -rd=* | --rd=*)
672              ROOTDIR=$ac_optarg ;;              ROOTDIR=$ac_optarg ;;
673                    
674          -mods | --mods | -mo | --mo)          -mods | --mods | -mo | --mo)
675              ac_prev=mods ;;              ac_prev=MODS ;;
676          -mods=* | --mods=* | -mo=* | --mo=*)          -mods=* | --mods=* | -mo=* | --mo=*)
677              MODS=$ac_optarg ;;              MODS=$ac_optarg ;;
678                    
679          -disable | --disable)          -disable | --disable)
680              ac_prev=disable ;;              ac_prev=DISABLE ;;
681          -disable=* | --disable=*)          -disable=* | --disable=*)
682              DISABLE=$ac_optarg ;;              DISABLE=$ac_optarg ;;
683                    
684          -enable | --enable)          -enable | --enable)
685              ac_prev=enable ;;              ac_prev=ENABLE ;;
686          -enable=* | --enable=*)          -enable=* | --enable=*)
687              ENABLE=$ac_optarg ;;              ENABLE=$ac_optarg ;;
688                    
689          -noopt | --noopt)          -standarddirs | --standarddirs)
690              ac_prev=noopt ;;              ac_prev=STANDARDDIRS ;;
691          -noopt=* | --noopt=*)          -standarddirs=* | --standarddirs=*)
692              NOOPT=$ac_optarg ;;              STANDARDDIRS=$ac_optarg ;;
693            
694  #           -cpp | --cpp)  #           -cpp | --cpp)
695  #               ac_prev=cpp ;;  #               ac_prev=cpp ;;
696  #           -cpp=* | --cpp=*)  #           -cpp=* | --cpp=*)
697  #               CPP=$ac_optarg ;;  #               CPP=$ac_optarg ;;
698                            
699          -fortran | --fortran | -fc | --fc)          -fortran | --fortran | -fc | --fc)
700              ac_prev=fc ;;              ac_prev=FC ;;
701          -fc=* | --fc=*)          -fc=* | --fc=*)
702              FC=$ac_optarg ;;              FC=$ac_optarg ;;
703                    
704          -ieee | --ieee)          -ieee | --ieee)
705              IEEE=1 ;;              IEEE=true ;;
706          -noieee | --noieee)          -noieee | --noieee)
707              IEEE=0 ;;              IEEE= ;;
           
         -mpi | --mpi)  
             MPI=1 ;;  
         -nompi | --nompi)  
             MPI=0 ;;  
           
         -jam | --jam)  
             JAM=1 ;;  
         -nojam | --nojam)  
             JAM=0 ;;  
708                    
709    #       -jam | --jam)
710    #           JAM=1 ;;
711    #       -nojam | --nojam)
712    #           JAM=0 ;;
713            
714            -ds | --ds)
715                DUMPSTATE=t ;;
716            
717            -taf_extra | --taf_extra)
718                ac_prev=TAF_EXTRA ;;
719            -taf_extra=* | --taf_extra=*)
720                TAF_EXTRA=$ac_optarg ;;
721    
722            -tamc_extra | --tamc_extra)
723                ac_prev=TAMC_EXTRA ;;
724            -tamc_extra=* | --tamc_extra=*)
725                TAMC_EXTRA=$ac_optarg ;;
726    
727          -*)          -*)
728              echo "Error: unrecognized option: "$ac_option              echo "Error: unrecognized option: "$ac_option
729              usage              usage
# Line 458  for ac_option ; do Line 738  for ac_option ; do
738            
739  done  done
740    
741    if test -f ./.genmakerc ; then
742        echo
743        echo "WARNING: genmake2 has detected a copy of the old-style \"./.genmakerc\""
744        echo "  file.  This file format is no longer supported.  Please see:"
745        echo
746        echo "    http://mitgcm.org/devel_HOWTO/"
747        echo
748        echo "  for directions on how to setup and use the new \"genmake2\" input"
749        echo "  files and send an email to MITgcm-support@mitgcm.org if you want help."
750        echo
751    fi
752    
753    if test "x${ROOTDIR}" = x ; then
754        if test "${PWD##/*/}" = "bin" -a -d ../model -a -d ../eesup -a -d ../pkg ; then
755            ROOTDIR=".."
756        else
757            for d in . .. ../.. ../../.. ../../../.. ../../../../.. ; do
758                if [ -d "$d/model" -a -d "$d/eesupp" -a -d "$d/pkg" ]; then
759                    ROOTDIR=$d
760                    echo -n "Warning:  ROOTDIR was not specified but there appears to be"
761                    echo " a copy of MITgcm at \"$ROOTDIR\" so we'll try it."
762                    break
763                fi
764            done
765        fi
766    fi
767    if test "x${ROOTDIR}" = x ; then
768        echo "Error: Cannot determine ROOTDIR for MITgcm code."
769        echo "  Please specify a ROOTDIR using either an options "
770        echo "  file or a command-line option."
771        exit 1
772    fi
773    if test ! -d ${ROOTDIR} ; then
774        echo "Error: the specified ROOTDIR (\"$ROOTDIR\") does not exist!"
775        exit 1
776    fi
777    
778  echo "  getting OPTFILE information:  "  echo "  getting OPTFILE information:  "
779  if test "x${OPTFILE}" = x ; then  if test "x${OPTFILE}" = x ; then
780      echo "Warning: no OPTFILE specified so we'll look for possible settings"      if test "x$MITGCM_OF" = x ; then
781      printf "\n===  Searching for possible settings for OPTFILE  ===\n"          echo "Warning: no OPTFILE specified so we'll look for possible settings"
782      find_possible_configs          printf "\n===  Searching for possible settings for OPTFILE  ===\n"
783  else          find_possible_configs
     if test "x$OPTFILE" = xNONE ; then  
         echo "    OPTFILE=NONE so we'll try to use default settings"  
784      else      else
785          if test -f "$OPTFILE" -a -r "$OPTFILE" ; then          OPTFILE=$MITGCM_OF
786              echo "    using OPTFILE=\"$OPTFILE\""      fi
787              source "$OPTFILE"  fi
788              RETVAL=$?  if test "x$OPTFILE" != xNONE ; then
789              if test "x$RETVAL" != x0 ; then      if test -f "$OPTFILE" -a -r "$OPTFILE" ; then
790                  echo -n "Error: failed to source OPTFILE \"$OPTFILE\""          echo "    using OPTFILE=\"$OPTFILE\""
791                  echo "--please check that variable syntax is bash-compatible"          . "$OPTFILE"
792                  exit 1          RETVAL=$?
793              fi          if test "x$RETVAL" != x0 ; then
794          else              echo -n "Error: failed to source OPTFILE \"$OPTFILE\""
795              echo "Error: can't read OPTFILE=\"$OPTFILE\""              echo "--please check that variable syntax is bash-compatible"
796                exit 1
797            fi
798            if test "x$DUMPSTATE" != xf ; then
799                cp -f $OPTFILE "genmake_optfile"
800            fi
801        else
802            echo "Error: can't read OPTFILE=\"$OPTFILE\""
803            exit 1
804        fi
805    fi
806    
807    echo "  getting AD_OPTFILE information:  "
808    if test "x${AD_OPTFILE}" = x ; then
809        if test "x$MITGCM_AD_OF" = x ; then
810            AD_OPTFILE=$ROOTDIR/tools/adjoint_options/adjoint_default
811        else
812            AD_OPTFILE=$MITGCM_AD_OF
813        fi
814    fi
815    if test "x${AD_OPTFILE}" != xNONE ; then
816        if test -f "$AD_OPTFILE" -a -r "$AD_OPTFILE" ; then
817            echo "    using AD_OPTFILE=\"$AD_OPTFILE\""
818            . "$AD_OPTFILE"
819            RETVAL=$?
820            if test "x$RETVAL" != x0 ; then
821                echo -n "Error: failed to source AD_OPTFILE \"$AD_OPTFILE\""
822                echo "--please check that variable syntax is bash-compatible"
823              exit 1              exit 1
824          fi          fi
825            if test "x$DUMPSTATE" != xf ; then
826                cp -f $AD_OPTFILE "genmake_ad_optfile"
827            fi
828        else
829            echo "Error: can't read AD_OPTFILE=\"$AD_OPTFILE\""
830            exit 1
831      fi      fi
832  fi  fi
833    
834    #  Check that FC, LINK, CPP, S64, LN, and MAKE are defined.  If not,
835    #  either set defaults or complain and abort!
836    if test "x$FC" = x ; then
837        cat <<EOF 1>&2
838    
839    Error: no Fortran compiler: please specify using one of the following:
840      1) within the options file ("FC=...") as specified by "-of=OPTFILE"
841      2) the "-fc=XXX" command-line option
842      3) the "./genmake_local" file
843    EOF
844        exit 1
845    fi
846    if test "x$LINK" = x ; then
847        LINK=$FC
848    fi
849    if test "x$MAKE" = x ; then
850        MAKE="make"
851    fi
852    if test "x$CPP" = x ; then
853        CPP=cpp
854    fi
855    #EH3 === UGLY ===
856    #  The following an ugly little hack to check for $CPP in /lib/ and it
857    #  should eventually be replaced with a more general function that
858    #  searches a combo of the user's path and a list of "usual suspects"
859    #  to find the correct location for binaries such as $CPP.
860    for i in " " "/lib/" ; do
861        echo "#define A a" | $i$CPP > test_cpp 2>&1 && CPP=$i$CPP
862    done
863    #EH3 === UGLY ===
864    echo "#define A a" | $CPP > test_cpp 2>&1
865    RETVAL=$?
866    if test "x$RETVAL" != x0 ; then
867        cat <<EOF 1>&2
868    
869    Error: C pre-processor "$CPP" failed the test case: please specify using:
870    
871      1) within the options file ("CPP=...") as specified by "-of=OPTFILE"
872      2) the "./genmake_local" file
873      3) with the CPP environment variable
874    
875    EOF
876        exit 1
877    else
878        rm -f test_cpp
879    fi
880    if test "x$MAKEDEPEND" = x ; then
881        MAKEDEPEND=makedepend
882    fi
883    if test "x$LN" = x ; then
884        LN="ln -s"
885    fi
886    echo "test" > genmake_test_ln
887    $LN genmake_test_ln genmake_tlink
888    RETVAL=$?
889    if test "x$RETVAL" != x0 ; then
890        cat <<EOF 1>&2
891    
892    Error: The command "ln -s" failed -- please specify a working soft-link
893      command in the optfile.
894    
895    EOF
896        exit 1
897    fi
898    rm -f genmake_test_ln genmake_tlink
899    
900    
901    printf "\n===  Checking system libraries  ===\n"
902    echo -n "  Do we have the system() command using $FC...  "
903    cat > genmake_tcomp.f <<EOF
904          program hello
905          call system('echo hi')
906          end
907    EOF
908    $FC $FFLAGS $DEFINES -o genmake_tcomp genmake_tcomp.f > genmake_tcomp.log 2>&1
909    RETVAL=$?
910    if test "x$RETVAL" = x0 ; then
911        HAVE_SYSTEM=t
912        DEFINES="$DEFINES -DHAVE_SYSTEM"
913        echo "yes"
914    else
915        HAVE_SYSTEM=
916        echo "no"
917    fi
918    rm -f genmake_tcomp*
919    
920    echo -n "  Do we have the fdate() command using $FC...  "
921    cat > genmake_tcomp.f <<EOF
922          program hello
923          CHARACTER(128) string
924          string = ' '
925          call fdate( string )
926          print *, string
927          end
928    EOF
929    $FC $FFLAGS $DEFINES -o genmake_tcomp genmake_tcomp.f > genmake_tcomp.log 2>&1
930    RETVAL=$?
931    if test "x$RETVAL" = x0 ; then
932        HAVE_FDATE=t
933        DEFINES="$DEFINES -DHAVE_FDATE"
934        echo "yes"
935    else
936        HAVE_FDATE=
937        echo "no"
938    fi
939    rm -f genmake_tcomp*
940    
941    echo -n "  Can we call simple C routines (here, \"cloc()\") using $FC...  "
942    check_HAVE_CLOC
943    if test "x$HAVE_CLOC" != x ; then
944        echo "yes"
945    else
946        echo "no"
947    fi
948    rm -f genmake_t*
949    
950    echo -n "  Can we create NetCDF-enabled binaries...  "
951    check_netcdf_libs
952    if test "x$HAVE_NETCDF" != x ; then
953        echo "yes"
954    else
955        echo "no"
956    fi
957    
958    
959  printf "\n===  Setting defaults  ===\n"  printf "\n===  Setting defaults  ===\n"
960  echo -n "  Adding MODS directories:  "  echo -n "  Adding MODS directories:  "
961  for d in $MODS ; do  for d in $MODS ; do
# Line 505  if test "x${PLATFORM}" = x ; then Line 978  if test "x${PLATFORM}" = x ; then
978      PLATFORM=$p_PLATFORM      PLATFORM=$p_PLATFORM
979  fi  fi
980    
 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  
   
981  if test "x${EXEDIR}" = x ; then  if test "x${EXEDIR}" = x ; then
982      if test "${PWD##/*/}" = "bin" -a -d ../exe -a $ROOTDIR = .. ; then      if test "${PWD##/*/}" = "bin" -a -d ../exe -a $ROOTDIR = .. ; then
983          EXEDIR=../exe          EXEDIR=../exe
# Line 546  if test "x${TOOLSDIR}" = x ; then Line 994  if test "x${TOOLSDIR}" = x ; then
994      TOOLSDIR="$ROOTDIR/tools"      TOOLSDIR="$ROOTDIR/tools"
995  fi  fi
996  if test ! -d ${TOOLSDIR} ; then  if test ! -d ${TOOLSDIR} ; then
997      echo "Error: the specified $TOOLSDIR (\"$TOOLSDIR\") does not exist!"      echo "Error: the specified TOOLSDIR (\"$TOOLSDIR\") does not exist!"
998      exit 1      exit 1
999  fi  fi
1000    if test "x$S64" = x ; then
1001        S64='$(TOOLSDIR)/set64bitConst.sh'
1002    fi
1003    THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`
1004    
1005  EXECUTABLE=${EXECUTABLE:-mitgcmuv}  EXECUTABLE=${EXECUTABLE:-mitgcmuv}
1006    
# Line 557  EXECUTABLE=${EXECUTABLE:-mitgcmuv} Line 1009  EXECUTABLE=${EXECUTABLE:-mitgcmuv}
1009  #  they appear as regular source code  #  they appear as regular source code
1010  if test -r $ROOTDIR"/eesupp/src/Makefile" ; then  if test -r $ROOTDIR"/eesupp/src/Makefile" ; then
1011      echo "  Making source files in eesupp from templates"      echo "  Making source files in eesupp from templates"
1012      $MAKE -C $ROOTDIR"/eesupp/src/" > make_eesupp.errors 2>&1      ( cd $ROOTDIR"/eesupp/src/" && $MAKE ) > make_eesupp.errors 2>&1
1013      RETVAL=$?      RETVAL=$?
1014      if test "x${RETVAL}" = x0 ; then      if test "x${RETVAL}" = x0 ; then
1015          rm -f make_eesupp.errors          rm -f make_eesupp.errors
1016      else      else
1017          echo "Error: problem encountered while building source files in eesupp:"          echo "Error: problem encountered while building source files in eesupp:"
1018          cat make_eesupp.errors          cat make_eesupp.errors 1>&2
1019          exit 1          exit 1
1020      fi      fi
1021  fi  fi
1022    
1023    #same for exch2
1024    if test -r $ROOTDIR"/pkg/exch2/Makefile" ; then
1025        echo "  Making source files in exch2 from  templates"
1026        ( cd $ROOTDIR"/pkg/exch2/" && $MAKE ) > make_exch2.errors 2>&1
1027        RETVAL=$?
1028        if test "x${RETVAL}" = x0 ; then
1029            rm -f make_exch2.errors
1030        else
1031            echo "Error: problem encountered while building source files in exch2:"
1032            cat make_exch2.errors 1>&2
1033            exit 1
1034        fi
1035    fi
1036    
1037  printf "\n===  Determining package settings  ===\n"  printf "\n===  Determining package settings  ===\n"
1038  if  test "x${PDEPEND}" = x ; then  if  test "x${PDEPEND}" = x ; then
1039      tmp=$ROOTDIR"/pkg/pkg_depend"      tmp=$ROOTDIR"/pkg/pkg_depend"
# Line 587  echo "  getting package dependency info Line 1053  echo "  getting package dependency info
1053  #  Strip the comments and then convert the dependency file into  #  Strip the comments and then convert the dependency file into
1054  #  two arrays: PNAME, DNAME  #  two arrays: PNAME, DNAME
1055  cat $PDEPEND | sed -e 's/#.*$//g' \  cat $PDEPEND | sed -e 's/#.*$//g' \
1056      | 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}' \
1057      > ./.pd_tmp      > ./.pd_tmp
1058  RETVAL=$?  RETVAL=$?
1059  if test ! "x${RETVAL}" = x0 ; then  if test ! "x${RETVAL}" = x0 ; then
1060      echo "Error: unable to parse package dependencies -- please check PDEPEND=\"$PDEPEND\""      echo "Error: unable to parse package dependencies -- please check PDEPEND=\"$PDEPEND\""
1061      exit 1      exit 1
1062  fi  fi
1063  source ./.pd_tmp  . ./.pd_tmp
1064  rm -f ./.pd_tmp  rm -f ./.pd_tmp
1065    
1066  echo  -n "  checking default package list:  "  #  Search for default packages.  Note that a "$ROOTDIR/pkg/pkg_groups"
1067    #  file should eventually be added so that, for convenience, one can
1068    #  specify groups of packages using names like "ocean" and "atmosphere".
1069    echo "  checking default package list:  "
1070    if test "x${PDEFAULT}" = x ; then
1071        for i in "." $MODS ; do
1072            if test -r $i"/packages.conf" ; then
1073                    PDEFAULT=$i"/packages.conf"
1074                    break
1075            fi
1076        done
1077    fi
1078  if test "x${PDEFAULT}" = x ; then  if test "x${PDEFAULT}" = x ; then
1079      PDEFAULT="$ROOTDIR/pkg/pkg_default"      PDEFAULT="$ROOTDIR/pkg/pkg_default"
1080  fi  fi
1081  if test "x${PDEFAULT}" = xNONE ; then  if test "x${PDEFAULT}" = xNONE ; then
1082      echo "default packages file disabled"      echo "    default packages file disabled"
1083  else  else
1084      if test ! -r $PDEFAULT ; then      if test ! -r $PDEFAULT ; then
         echo ""  
1085          echo "Warning:  can't read default packages from PDEFAULT=\"$PDEFAULT\""          echo "Warning:  can't read default packages from PDEFAULT=\"$PDEFAULT\""
1086      else      else
1087          echo "  using PDEFAULT=\"$PDEFAULT\""          echo "    using PDEFAULT=\"$PDEFAULT\""
1088          #  Strip the comments and add all the names          #  Strip the comments and add all the names
1089          def=`cat $PDEFAULT | sed -e 's/#.*$//g' | awk '(NF>0){print $0}'`          def=`cat $PDEFAULT | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
1090          RETVAL=$?          RETVAL=$?
1091          if test "x${RETVAL}" != x0 ; then          if test "x${RETVAL}" != x0 ; then
1092              echo -n "Error: can't parse default package list "              echo -n "Error: can't parse default package list "
# Line 620  else Line 1096  else
1096          for i in $def ; do          for i in $def ; do
1097              PACKAGES="$PACKAGES $i"              PACKAGES="$PACKAGES $i"
1098          done          done
1099          echo "    packages are:  $PACKAGES"          echo "    before group expansion packages are: $PACKAGES"
1100            expand_pkg_groups
1101            echo "    after group expansion packages are:  $PACKAGES"
1102      fi      fi
1103  fi  fi
1104    
# Line 639  for p in $PACKAGES ; do Line 1117  for p in $PACKAGES ; do
1117  done  done
1118  PACKAGES="$pack"  PACKAGES="$pack"
1119  echo "  applying ENABLE settings"  echo "  applying ENABLE settings"
1120  rm -f ./.tmp_pack  echo "" > ./.tmp_pack
1121  PACKAGES="$PACKAGES $ENABLE"  PACKAGES="$PACKAGES $ENABLE"
1122  for i in $PACKAGES ; do  for i in $PACKAGES ; do
1123      if test ! -d "$ROOTDIR/pkg/$i" ; then      if test ! -d "$ROOTDIR/pkg/$i" ; then
# Line 730  for i in $PACKAGES ; do Line 1208  for i in $PACKAGES ; do
1208      if test -d $adr ; then      if test -d $adr ; then
1209          SOURCEDIRS="$SOURCEDIRS $adr"          SOURCEDIRS="$SOURCEDIRS $adr"
1210          INCLUDEDIRS="$INCLUDEDIRS $adr"          INCLUDEDIRS="$INCLUDEDIRS $adr"
1211            if test "x$i" = xautodiff ; then
1212                AUTODIFF_PKG_USED=t
1213            fi
1214      else      else
1215          echo "Error: the directory \"$adr\" for package $i doesn't exist"          echo "Error: the directory \"$adr\" for package $i doesn't exist"
1216          exit 1          exit 1
1217      fi      fi
1218  done  done
1219    
1220  #  This is compatible with the old genmake.  The "DISABLE_*" flags  #  Build MNC templates and check for ability to build and use NetCDF
1221  #  need to be replaced by the "ALLOW_*" flags set below.  echo $PACKAGES | grep ' mnc ' > /dev/null 2>&1
1222  #  RETVAL=$?
1223  # echo -n "  Setting package-specific CPP flags:  "  if test "x$RETVAL" = x0 ; then
1224  # pkrm=( mom_fluxform mom_vecinv generic_advdiff )      ( cd $ROOTDIR"/pkg/mnc" && $MAKE templates ) > make_mnc.errors 2>&1
1225  # pkrmdef=( -DDISABLE_MOM_FLUXFORM -DDISABLE_MOM_VECINV -DDISABLE_GENERIC_ADVDIFF -DDISABLE_DEBUGMODE )      RETVAL=$?
1226  # echo -n "  "      if test "x${RETVAL}" = x0 ; then
1227  # i=0          rm -f make_mnc.errors
1228  # while test $i -lt "${#pkrm[@]}" ; do      else
1229  #     echo "$PACKAGES" | grep "${pk[$i]}" > /dev/null 2>&1          echo "Error: problem encountered while building source files in pkg/mnc:"
1230  #     RETVAL=$?          cat make_mnc.errors 1>&2
1231  #     if test "x$RETVAL" = x1 ; then          exit 1
1232  #       DEFINES="$DEFINES ${pkdef[$i]}"      fi
1233  #       echo -n " ${pkdef[$i]}"      if test "x$HAVE_NETCDF" != xt ; then
1234  #     fi          cat <<EOF
 #     i=$(( $i + 1 ))  
 # done  
 # echo  
1235    
1236  echo "  Setting package-specific CPP flags in CPP_OPTIONS.h:"  WARNING: the "mnc" package has been enabled but tests failed to
1237  CPP_OPTIONS=    compile and/or execute NetCDF applications.  Please check that:
1238  spaths=". $SOURCEDIRS"  
1239  for i in $spaths ; do    1) NetCDF is installed for your compiler and
1240      try="$i/CPP_OPTIONS.h"    2) the LIBS variable (within the 'optfile") specifies the correct
1241      #  echo -n "    trying $try : "         NetCDF library to link against.
1242      if test -f $try -a -r $try ; then    
1243          echo "    found CPP_OPTIONS=\"$try\""  EOF
         CPP_OPTIONS="$try"  
         if test "x$i" != "x." ; then  
             cp -f $CPP_OPTIONS .  
         fi  
         break  
1244      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  
1245  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.  
1246    
1247  C  Packages disabled by genmake:  # Create a list of #define and #undef to enable/disable packages
1248  EOF  PACKAGES_DOT_H=PACKAGES_CONFIG.h
1249  #  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
1250  #  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
1251  #  file would eventually be split up so that all package-related #define  #  file would eventually be split up so that all package-related #define
1252  #  statements could be separated and handled only by genmake.  #  statements could be separated and handled only by genmake.
1253  names=`ls -1 "$ROOTDIR/pkg"`  names=`ls -1 "$ROOTDIR/pkg"`
1254  all_pack=  all_pack=
1255    DISABLED_PACKAGES=
1256  for n in $names ; do  for n in $names ; do
1257      if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then      if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
1258          has_pack="f"          has_pack="f"
# Line 807  for n in $names ; do Line 1263  for n in $names ; do
1263              fi              fi
1264          done          done
1265          if test "x$has_pack" = xf ; then          if test "x$has_pack" = xf ; then
1266              undef=`echo "ALLOW_$n" | awk '{print toupper($0)}'`              undef=`echo "ALLOW_$n" | $AWK '{print toupper($0)}'`
1267              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!!!  
   
1268          fi          fi
1269      fi      fi
1270  done  done
1271  cat <<EOF >>CPP_OPTIONS.h.tmp  ENABLED_PACKAGES=
   
 C  Packages enabled by genmake:  
 EOF  
1272  for i in $PACKAGES ; do  for i in $PACKAGES ; do
1273      def=`echo "ALLOW_$i" | awk '{print toupper($0)}'`      def=`echo "ALLOW_$i" | $AWK '{print toupper($0)}'`
1274      echo "#define $def" >> CPP_OPTIONS.h.tmp      ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
1275    #eh3 DEFINES="$DEFINES -D$def"
1276    
1277  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!
1278      case $i in      case $i in
1279          aim_v23)          aim_v23)
1280              echo "#define   ALLOW_AIM" >> CPP_OPTIONS.h.tmp              ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
1281                echo "Warning: ALLOW_AIM is set to enable aim_v23."
1282              ;;              ;;
1283      esac      esac
1284  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!
1285    
1286  done  done
 mv -f CPP_OPTIONS.h.tmp CPP_OPTIONS.h  
1287    
1288  echo "  Adding STANDARDDIRS"  echo "  Adding STANDARDDIRS"
1289  BUILDDIR=${BUILDDIR:-.}  BUILDDIR=${BUILDDIR:-.}
1290  STANDARDDIRS=${STANDARDDIRS:-"eesupp model"}  if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
1291  for d in $STANDARDDIRS ; do      STANDARDDIRS="eesupp model"
1292      adr="$ROOTDIR/$d/src"  fi
1293      if test ! -d $adr ; then  if test "x$STANDARDDIRS" != x ; then
1294          echo "Error:  directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""      for d in $STANDARDDIRS ; do
1295          echo "  is correct and that you correctly specified the STANDARDDIRS option"          adr="$ROOTDIR/$d/src"
1296          exit 1          if test ! -d $adr ; then
1297      else              echo "Error:  directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1298          SOURCEDIRS="$SOURCEDIRS $adr"              echo "  is correct and that you correctly specified the STANDARDDIRS option"
1299      fi              exit 1
1300      adr="$ROOTDIR/$d/inc"          else
1301      if test ! -d $adr ; then              SOURCEDIRS="$SOURCEDIRS $adr"
1302          echo "Error:  directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""          fi
1303          echo "  is correct and that you correctly specified the STANDARDDIRS option"          adr="$ROOTDIR/$d/inc"
1304          exit 1          if test ! -d $adr ; then
1305      else              echo "Error:  directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1306          INCLUDEDIRS="$INCLUDEDIRS $adr"              echo "  is correct and that you correctly specified the STANDARDDIRS option"
1307                exit 1
1308            else
1309                INCLUDEDIRS="$INCLUDEDIRS $adr"
1310            fi
1311        done
1312    fi
1313    
1314    echo "  Searching for *OPTIONS.h files in order to warn about the presence"
1315    echo "    of \"#define \"-type statements that are no longer allowed:"
1316    CPP_OPTIONS=
1317    CPP_EEOPTIONS=
1318    spaths=". $INCLUDEDIRS"
1319    names=`ls -1 "$ROOTDIR/pkg"`
1320    for i in $spaths ; do
1321        try="$i/CPP_OPTIONS.h"
1322        if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
1323            echo "    found CPP_OPTIONS=\"$try\""
1324            CPP_OPTIONS="$try"
1325            # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
1326            for n in $names ; do
1327                test_for_package_in_cpp_options $CPP_OPTIONS $n
1328            done
1329        fi
1330        try="$i/CPP_EEOPTIONS.h"
1331        if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
1332            echo "    found CPP_EEOPTIONS=\"$try\""
1333            # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
1334    #**** not yet enabled ****
1335    #        test_for_mpi_in_cpp_eeoptions $try
1336    #**** not yet enabled ****
1337            CPP_EEOPTIONS="$try"
1338      fi      fi
1339  done  done
1340    if test "x$CPP_OPTIONS" = x ; then
1341        echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
1342        exit 1
1343    fi
1344    
1345    #  Here, we build the list of files to be "run through" the adjoint
1346    #  compiler.
1347    if test -f ./ad_files ; then
1348        rm -f ./ad_files
1349    fi
1350    echo "  Creating the list of files for the adjoint compiler."
1351    for i in $SOURCEDIRS ; do
1352        list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
1353        for j in $list_files ; do
1354            cat $i/$j >> ad_files
1355        done
1356    done
1357    
1358    
1359  echo  echo
1360  echo "===  Creating the Makefile  ==="  echo "===  Creating the Makefile  ==="
1361  echo "  setting INCLUDES"  echo "  setting INCLUDES"
1362  for i in $INCLUDEDIRS ; do  for i in $INCLUDEDIRS ; do
1363      if test -d $i ; then      if ! test -d $i ; then
1364          INCLUDES="$INCLUDES -I$i"  #       INCLUDES="$INCLUDES -I$i"
1365      else  #   else
1366          echo "Warning: can't find INCLUDEDIRS=\"$i\""          echo "Warning: can't find INCLUDEDIRS=\"$i\""
1367      fi      fi
1368  done  done
# Line 888  rm -rf .links.tmp Line 1372  rm -rf .links.tmp
1372  mkdir .links.tmp  mkdir .links.tmp
1373  echo "# This section creates symbolic links" > srclinks.tmp  echo "# This section creates symbolic links" > srclinks.tmp
1374  echo "" >> srclinks.tmp  echo "" >> srclinks.tmp
1375  echo -n 'SRCFILES = ' > srclist.inc  echo -n 'SRCFILES = '    > srclist.inc
1376  echo -n 'CSRCFILES = ' > csrclist.inc  echo -n 'CSRCFILES = '   > csrclist.inc
1377    echo -n 'F90SRCFILES = ' > f90srclist.inc
1378  echo -n 'HEADERFILES = ' > hlist.inc  echo -n 'HEADERFILES = ' > hlist.inc
1379  alldirs=". $SOURCEDIRS $INCLUDEDIRS"  echo -n 'AD_FLOW_FILES = ' > ad_flow_files.inc
1380    alldirs="$SOURCEDIRS $INCLUDEDIRS ."
1381  for d in $alldirs ; do  for d in $alldirs ; do
1382      deplist=      deplist=
1383      sfiles=`( cd $d; echo *.[h,c,F] )`      sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
1384        sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
1385      for sf in $sfiles ; do      for sf in $sfiles ; do
1386          if test ! -r ".links.tmp/$sf" ; then          if test ! -r ".links.tmp/$sf" ; then
1387              if test -f "$d/$sf" ; then              if test -f "$d/$sf" ; then
1388                  extn=`echo $sf | awk -F '.' '{print $NF}'`                  case $d/$sf in
1389                  touch .links.tmp/$sf                    ./$PACKAGES_DOT_H)
1390                  deplist="$deplist $sf"                          ;;
1391                      ./AD_CONFIG.h)
1392                            ;;
1393                      ./FC_NAMEMANGLE.h)
1394                            ;;
1395                      *)
1396                            touch .links.tmp/$sf
1397                            deplist="$deplist $sf"
1398                            ;;
1399                    esac
1400                    extn=`echo $sf | $AWK -F '.' '{print $NF}'`
1401                  case $extn in                  case $extn in
1402                      F)                      F)
1403                          echo    " \\"  >> srclist.inc                          echo    " \\"  >> srclist.inc
1404                          echo -n " $sf" >> srclist.inc                          echo -n " $sf" >> srclist.inc
1405                          ;;                          ;;
1406                        F90)
1407                            echo    " \\"  >> f90srclist.inc
1408                            echo -n " $sf" >> f90srclist.inc
1409                            ;;
1410                      c)                      c)
1411                          echo    " \\"  >> csrclist.inc                          echo    " \\"  >> csrclist.inc
1412                          echo -n " $sf" >> csrclist.inc                          echo -n " $sf" >> csrclist.inc
# Line 914  for d in $alldirs ; do Line 1415  for d in $alldirs ; do
1415                          echo    " \\"  >> hlist.inc                          echo    " \\"  >> hlist.inc
1416                          echo -n " $sf" >> hlist.inc                          echo -n " $sf" >> hlist.inc
1417                          ;;                          ;;
1418                        flow)
1419                            echo    " \\"  >> ad_flow_files.inc
1420                            echo -n " $sf" >> ad_flow_files.inc
1421                            ;;
1422                  esac                  esac
1423              fi              fi
1424          fi          fi
# Line 928  done Line 1433  done
1433  rm -rf .links.tmp  rm -rf .links.tmp
1434  echo "" >> srclist.inc  echo "" >> srclist.inc
1435  echo "" >> csrclist.inc  echo "" >> csrclist.inc
1436    echo "" >> f90srclist.inc
1437  echo "" >> hlist.inc  echo "" >> hlist.inc
1438    echo "" >> ad_flow_files.inc
1439    
1440  if test -e $MAKEFILE ; then  if test -e $MAKEFILE ; then
1441      mv -f $MAKEFILE "$MAKEFILE.bak"      mv -f $MAKEFILE "$MAKEFILE.bak"
# Line 942  echo "# by the command:" >> $MAKEFILE Line 1449  echo "# by the command:" >> $MAKEFILE
1449  echo "#    $0 $@" >> $MAKEFILE  echo "#    $0 $@" >> $MAKEFILE
1450  echo "# executed by:" >> $MAKEFILE  echo "# executed by:" >> $MAKEFILE
1451  echo "#    $USER@${THISHOSTNAME}:${THISCWD}" >> $MAKEFILE  echo "#    $USER@${THISHOSTNAME}:${THISCWD}" >> $MAKEFILE
1452    
1453    EXE_AD=$EXECUTABLE"_ad"
1454    EXE_FTL=$EXECUTABLE"_ftl"
1455    EXE_SVD=$EXECUTABLE"_svd"
1456    
1457  cat >>$MAKEFILE <<EOF  cat >>$MAKEFILE <<EOF
1458    #
1459    # OPTFILE="$OPTFILE"
1460  #  #
1461  # BUILDDIR     : Directory where object files are written  # BUILDDIR     : Directory where object files are written
1462  # SOURCEDIRS   : Directories containing the source (.F) files  # SOURCEDIRS   : Directories containing the source (.F) files
# Line 970  EXEDIR      = ${EXEDIR} Line 1484  EXEDIR      = ${EXEDIR}
1484  EXECUTABLE  = \$(EXEDIR)/${EXECUTABLE}  EXECUTABLE  = \$(EXEDIR)/${EXECUTABLE}
1485  TOOLSDIR    = ${TOOLSDIR}  TOOLSDIR    = ${TOOLSDIR}
1486    
1487    #eh3  new defines for the adjoint work
1488    AUTODIFF    = ${ROOTDIR}/pkg/autodiff
1489    EXE_AD      = ${EXE_AD}
1490    EXE_FTL     = ${EXE_FTL}
1491    EXE_SVD     = ${EXE_SVD}
1492    
1493    ENABLED_PACKAGES = ${ENABLED_PACKAGES}
1494    DISABLED_PACKAGES = ${DISABLED_PACKAGES}
1495    
1496    # These files are created by Makefile
1497    SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h
1498    
1499  EOF  EOF
1500    
1501  #  Note: figure out some way to add Hyades JAM libraries here  #  Note: figure out some way to add Hyades JAM libraries here
# Line 985  MAKEDEPEND = ${MAKEDEPEND} Line 1511  MAKEDEPEND = ${MAKEDEPEND}
1511  KPP = ${KPP}  KPP = ${KPP}
1512  # Fortran compiler  # Fortran compiler
1513  FC = ${FC}  FC = ${FC}
1514    # Fortran compiler
1515    F90C = ${F90C}
1516  # Link editor  # Link editor
1517  LINK = ${LINK}  LINK = ${LINK}
1518    
# Line 998  KFLAGS2 = ${KFLAGS2} Line 1526  KFLAGS2 = ${KFLAGS2}
1526  # Optim./debug for FC  # Optim./debug for FC
1527  FFLAGS = ${FFLAGS}  FFLAGS = ${FFLAGS}
1528  FOPTIM = ${FOPTIM}  FOPTIM = ${FOPTIM}
1529    # Optim./debug for FC
1530    F90FLAGS = ${F90FLAGS}
1531    F90OPTIM = ${F90OPTIM}
1532  # Flags for CC  # Flags for CC
1533  CFLAGS = ${CFLAGS}  CFLAGS = ${CFLAGS}
1534  # Files that should not be optimized  # Files that should not be optimized
# Line 1005  NOOPTFILES = ${NOOPTFILES} Line 1536  NOOPTFILES = ${NOOPTFILES}
1536  NOOPTFLAGS = ${NOOPTFLAGS}  NOOPTFLAGS = ${NOOPTFLAGS}
1537  # Flags and libraries needed for linking  # Flags and libraries needed for linking
1538  LIBS = ${LIBS} \$(XLIBS)  LIBS = ${LIBS} \$(XLIBS)
1539    # Name of the Mekfile
1540    MAKEFILE=${MAKEFILE}
1541    
1542  EOF  EOF
1543    
1544  cat srclist.inc  >> $MAKEFILE  cat srclist.inc       >> $MAKEFILE
1545  cat csrclist.inc >> $MAKEFILE  cat csrclist.inc      >> $MAKEFILE
1546  cat hlist.inc >> $MAKEFILE  cat f90srclist.inc    >> $MAKEFILE
1547  echo 'F77FILES =  $(SRCFILES:.F=.f)'                    >> $MAKEFILE  cat hlist.inc         >> $MAKEFILE
1548  echo 'OBJFILES =  $(SRCFILES:.F=.o) $(CSRCFILES:.c=.o)' >> $MAKEFILE  cat ad_flow_files.inc >> $MAKEFILE
1549    echo               >> $MAKEFILE
1550    echo 'F77FILES =  $(SRCFILES:.F=.f)'                                           >> $MAKEFILE
1551    echo 'F90FILES =  $(F90SRCFILES:.F90=.f90)'                                    >> $MAKEFILE
1552    echo 'OBJFILES =  $(SRCFILES:.F=.o) $(CSRCFILES:.c=.o) $(F90SRCFILES:.F90=.o)' >> $MAKEFILE
1553    
1554  rm -f srclist.inc csrclist.inc hlist.inc flist.tmp clist.tmp  rm -f srclist.inc csrclist.inc hlist.inc flist.tmp clist.tmp f90srclist.inc
1555    rm -f ad_flow_files.inc
1556    
1557  cat >>$MAKEFILE <<EOF  cat >>$MAKEFILE <<EOF
1558    
1559  .SUFFIXES:  .SUFFIXES:
1560  .SUFFIXES: .o .f .p .F .c  .SUFFIXES: .o .f .p .F .c .F90 .f90
1561    
1562  all: \$(EXECUTABLE)  all: \$(EXECUTABLE)
1563  \$(EXECUTABLE): \$(OBJFILES)  \$(EXECUTABLE): \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(OBJFILES)
1564            @echo Creating \$@ ...
1565          \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)          \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
1566  depend:  depend:
1567          @make links          @make links
1568          \$(MAKEDEPEND) -o .f \$(DEFINES) \$(INCLUDES) \$(SRCFILES)          \$(MAKEDEPEND) -o .f \$(DEFINES) \$(INCLUDES) \$(SRCFILES)
1569            \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
1570    
1571  links: \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES)  links: \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(SPECIAL_FILES)
1572    
1573  small_f: \$(F77FILES)  small_f: \$(F77FILES) \$(F90FILES)
1574    
1575  output.txt: \$(EXECUTABLE)  output.txt: \$(EXECUTABLE)
1576          @printf 'running ... '          @printf 'running ... '
1577          @\$(EXECUTABLE) > \$@          @\$(EXECUTABLE) > \$@
1578    
1579  clean:  clean:
1580          -rm -rf *.o *.f *.p ${RMFILES} work.{pc,pcl}          -rm -rf *.o *.f *.p *.f90 *.mod ${RMFILES} work.{pc,pcl} *.template
1581  Clean:  Clean:
1582          @make clean          @make clean
1583          @make cleanlinks          @make cleanlinks
1584          -rm -f Makefile.bak          -rm -f \$(SPECIAL_FILES)
1585            -rm -f genmake_state genmake_*optfile genmake_warnings make.log run.log *.bak
1586  CLEAN:  CLEAN:
1587          @make Clean          @make Clean
1588          -find \$(EXEDIR) -name "*.meta" -exec rm {} \;          -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
1589          -find \$(EXEDIR) -name "*.data" -exec rm {} \;          -find \$(EXEDIR) -name "*.data" -exec rm {} \;
1590          -find \$(EXEDIR) -name "fort.*" -exec rm {} \;          -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
1591          -rm -f \$(EXECUTABLE)          -rm -f \$(EXECUTABLE) output.txt
1592    
1593    #eh3 Makefile: makefile
1594  makefile:  makefile:
1595          ${0} $@          $THIS_SCRIPT $@
1596  cleanlinks:  cleanlinks:
1597          -find . -type l -exec rm {} \;          -find . -type l -exec rm {} \;
1598    
1599    # Special targets ($SPECIAL_FILES) which are create by make
1600    ${PACKAGES_DOT_H}:
1601            @echo Creating \$@ ...
1602            @\$(TOOLSDIR)/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -bPACKAGES_CONFIG_H "Disabled packages:" \$(DISABLED_PACKAGES) " " "Enabled packages:" \$(ENABLED_PACKAGES) > \$@
1603    AD_CONFIG.h:
1604            @echo Creating \$@ ...
1605            @\$(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 > \$@
1606    FC_NAMEMANGLE.h:
1607            @echo Creating \$@ ...
1608            echo "$FC_NAMEMANGLE" > \$@
1609    
1610  # The normal chain of rules is (  .F - .f - .o  )  # The normal chain of rules is (  .F - .f - .o  )
1611  .F.f:  .F.f:
1612          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1613  .f.o:  .f.o:
1614          \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<          \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
1615    .F90.f90:
1616            \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1617    .f90.o:
1618            \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
1619  .c.o:  .c.o:
1620          \$(CC) \$(CFLAGS) -c \$<          \$(CC) \$(CFLAGS) -c \$<
1621    
# Line 1068  cleanlinks: Line 1625  cleanlinks:
1625  .p.f:  .p.f:
1626          \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<          \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
1627    
1628    #=========================================
1629    #===  Automatic Differentiation Rules  ===
1630    
1631    TAMC           = ${TAMC}
1632    TAF            = ${TAF}
1633    
1634    TAF_EXTRA      = ${TAF_EXTRA}
1635    TAMC_EXTRA     = ${TAMC_EXTRA}
1636    
1637  EOF  EOF
1638    
1639    ad_vars="AD_TAMC_FLAGS AD_TAF_FLAGS"
1640    ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF_FLAGS"
1641    ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
1642    for i in $ad_vars ; do
1643        name=$i
1644        t1="t2=\$"`echo $i`
1645        eval $t1
1646        printf "%-20s = " $name >> $MAKEFILE
1647        echo $t2 >> $MAKEFILE
1648    done
1649    
1650    echo "  Add the source list for AD code generation"
1651    echo >> $MAKEFILE
1652    echo -n "AD_FILES = " >> $MAKEFILE
1653    AD_FILES=`cat ad_files`
1654    for i in $AD_FILES ; do
1655        echo    " \\" >> $MAKEFILE
1656        echo -n " $i" >> $MAKEFILE
1657    done
1658    echo >> $MAKEFILE
1659    rm -f ad_files
1660    
1661    cat >>$MAKEFILE <<EOF
1662    
1663    # ... AD ...
1664    adall: ad_taf
1665    adtaf: ad_taf_output.f
1666    adtamc: ad_tamc_output.f
1667    
1668    ad_input_code.f: \$(AD_FILES) \$(HEADERFILES)
1669            @\$(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
1670            cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
1671            -rm -f ad_config.template
1672            @make \$(F77FILES)
1673            @make \$(AD_FLOW_FILES)
1674            cat \$(AD_FLOW_FILES) \$(AD_FILES) > ad_input_code.f
1675    
1676    ad_taf_output.f: ad_input_code.f
1677            \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f
1678            cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f
1679    
1680    adtafonly:
1681            \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f
1682            cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f
1683    
1684    ad_taf: ad_taf_output.o \$(OBJFILES)
1685            \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
1686    
1687    ad_tamc_output.f: ad_input_code.f
1688            \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.f
1689            cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.f
1690    
1691    ad_tamc: ad_tamc_output.o \$(OBJFILES)
1692            \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
1693    
1694    
1695    # ... FTL ...
1696    ftlall: ftl_taf
1697    ftltaf: ftl_taf_output.f
1698    ftltamc: ftl_tamc_output.f
1699    
1700    ftl_input_code.f: \$(AD_FILES) \$(HEADERFILES)
1701            @\$(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
1702            cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
1703            -rm -f ftl_config.template
1704            @make \$(F77FILES)
1705            @make \$(AD_FLOW_FILES)
1706            cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.f
1707    
1708    ftl_taf_output.f: ftl_input_code.f
1709            \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f
1710            cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f
1711    
1712    ftltafonly:
1713            \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f
1714            cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f
1715    
1716    ftl_taf: ftl_taf_output.o \$(OBJFILES)
1717            \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
1718    
1719    ftl_tamc_output.f: ftl_input_code.f
1720            \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.f
1721            cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.f
1722    
1723    ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
1724            \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
1725    
1726    
1727    # ... SVD ...
1728    svdtaf: ad_taf_output.f ftl_taf_output.f
1729    svdall: svd_taf
1730    
1731    svd_taf: ad_taf_output.o ftl_taf_output.o \$(OBJFILES)
1732            \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
1733    
1734    
1735    #=========================================
1736    
1737    EOF
1738    
1739    if test "x$EXEHOOK" != x ; then
1740        printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE
1741    fi
1742    
1743  echo "  Making list of \"exceptions\" that need \".p\" files"  echo "  Making list of \"exceptions\" that need \".p\" files"
1744  for i in $KPPFILES ; do  for i in $KPPFILES ; do
1745      base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`      base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
# Line 1099  echo "  Adding makedepend marker" Line 1769  echo "  Adding makedepend marker"
1769  printf "\n\n# DO NOT DELETE\n" >> $MAKEFILE  printf "\n\n# DO NOT DELETE\n" >> $MAKEFILE
1770    
1771  printf "\n===  Done  ===\n"  printf "\n===  Done  ===\n"
1772    
1773    # Create special header files
1774    $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"
1775    if test ! -f $PACKAGES_DOT_H ; then
1776        mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
1777    else
1778        cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H > /dev/null 2>&1
1779        RETVAL=$?
1780        if test "x$RETVAL" = x0 ; then
1781            rm -f $PACKAGES_DOT_H".tmp"
1782        else
1783            mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"
1784            mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
1785        fi
1786    fi
1787    if test ! -f AD_CONFIG.h ; then
1788        $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
1789    fi
1790    
1791    
1792    #  Write the "state" for future records
1793    if test "x$DUMPSTATE" != xf ; then
1794        echo -n "" > genmake_state
1795        for i in $gm_state ; do
1796            t1="t2=\$$i"
1797            eval $t1
1798            echo "$i='$t2'" >> genmake_state
1799        done
1800    fi

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.66

  ViewVC Help
Powered by ViewVC 1.1.22