/[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.73 by edhill, Tue Mar 16 18:20:34 2004 UTC revision 1.208 by jmc, Thu May 27 02:09:13 2010 UTC
# Line 13  Line 13 
13  test_for_package_in_cpp_options() {  test_for_package_in_cpp_options() {
14      cpp_options=$1      cpp_options=$1
15      pkg=$2      pkg=$2
16      test_for_string_in_file $cpp_options "^[ ]*#define.*ALLOW_$pkg" || exit 99      test_for_string_in_file $cpp_options "^[ ]*#define.*ALLOW_$pkg[ ]"
17      test_for_string_in_file $cpp_options "^[ ]*#undef.*ALLOW_$pkg" || exit 99      test_for_string_in_file $cpp_options "^[ ]*#undef.*ALLOW_$pkg[ ]"
18      test_for_string_in_file $cpp_options "^[ ]*#define.*DISABLE_$pkg" || exit 99      test_for_string_in_file $cpp_options "^[ ]*#define.*DISABLE_$pkg[ ]"
19      test_for_string_in_file $cpp_options "^[ ]*#undef.*DISABLE_$pkg" || exit 99      test_for_string_in_file $cpp_options "^[ ]*#undef.*DISABLE_$pkg[ ]"
20        test_for_string_in_file $cpp_options "^[ ]*#define.*ALLOW_$pkg$"
21        test_for_string_in_file $cpp_options "^[ ]*#undef.*ALLOW_$pkg$"
22        test_for_string_in_file $cpp_options "^[ ]*#define.*DISABLE_$pkg$"
23        test_for_string_in_file $cpp_options "^[ ]*#undef.*DISABLE_$pkg$"
24  }  }
25    
26  # Search for particular CPP #cmds associated with MPI  # Search for particular CPP #cmds associated with MPI
27  # usage: test_for_mpi_in_cpp_eeoptions CPP_file  # usage: test_for_mpi_in_cpp_eeoptions CPP_file
28  test_for_mpi_in_cpp_eeoptions() {  test_for_mpi_in_cpp_eeoptions() {
29      cpp_options=$1      cpp_options=$1
30      test_for_string_in_file $cpp_options "^[ ]*#define.*ALLOW_USE_MPI" || exit 99      test_for_string_in_file $cpp_options "^[ ]*#define.*ALLOW_USE_MPI[ ]"
31      test_for_string_in_file $cpp_options "^[ ]*#undef.*ALLOW_USE_MPI" || exit 99      test_for_string_in_file $cpp_options "^[ ]*#undef.*ALLOW_USE_MPI[ ]"
32      test_for_string_in_file $cpp_options "^[ ]*#define.*ALWAYS_USE_MPI" || exit 99      test_for_string_in_file $cpp_options "^[ ]*#define.*ALWAYS_USE_MPI[ ]"
33      test_for_string_in_file $cpp_options "^[ ]*#undef.*ALWAYS_USE_MPI" || exit 99      test_for_string_in_file $cpp_options "^[ ]*#undef.*ALWAYS_USE_MPI[ ]"
34        test_for_string_in_file $cpp_options "^[ ]*#define.*ALLOW_USE_MPI$"
35        test_for_string_in_file $cpp_options "^[ ]*#undef.*ALLOW_USE_MPI$"
36        test_for_string_in_file $cpp_options "^[ ]*#define.*ALWAYS_USE_MPI$"
37        test_for_string_in_file $cpp_options "^[ ]*#undef.*ALWAYS_USE_MPI$"
38  }  }
39    
40  # Search for particular string in a file. Return 1 if detected, 0 if not  # Search for particular string in a file. Return 1 if detected, 0 if not
# Line 39  test_for_string_in_file() { Line 47  test_for_string_in_file() {
47      if test "x${RETVAL}" = x0 ; then      if test "x${RETVAL}" = x0 ; then
48          printf "Error: In $file there is an illegal line: "          printf "Error: In $file there is an illegal line: "
49          grep -i "$strng" $file          grep -i "$strng" $file
50          return 1          exit 99
51      fi      fi
52      return 0      return 0
53  }  }
# Line 48  test_for_string_in_file() { Line 56  test_for_string_in_file() {
56  # the package list.  # the package list.
57  expand_pkg_groups() {  expand_pkg_groups() {
58      new_packages=      new_packages=
     PKG_GROUPS=$ROOTDIR"/pkg/pkg_groups"  
59      if test -r $PKG_GROUPS ; then      if test -r $PKG_GROUPS ; then
60          cat $PKG_GROUPS | sed -e 's/#.*$//g' | sed -e 's/:/ : /g' > ./p1.tmp          cat $PKG_GROUPS | sed -e 's/#.*$//g' | sed -e 's/:/ : /g' > ./p1.tmp
61          cat ./p1.tmp | $AWK '(NF>2 && $2==":"){ print $0 }' > ./p2.tmp          cat ./p1.tmp | $AWK '(NF>2 && $2==":"){ print $0 }' > ./p2.tmp
# Line 59  expand_pkg_groups() { Line 66  expand_pkg_groups() {
66              if test "x$RETVAL" = x0 ; then              if test "x$RETVAL" = x0 ; then
67                  matched=1                  matched=1
68                  replace=`echo $line | $AWK '{ $1=""; $2=""; print $0 }'`                  replace=`echo $line | $AWK '{ $1=""; $2=""; print $0 }'`
69                  echo "    replacing \"$i\" with: $replace"                  echo "    replacing \"$i\" with:$replace"
70                  new_packages="$new_packages $replace"                  new_packages="$new_packages $replace"
71              else              else
72                  new_packages="$new_packages $i"                  new_packages="$new_packages $i"
# Line 67  expand_pkg_groups() { Line 74  expand_pkg_groups() {
74          done          done
75          PACKAGES=$new_packages          PACKAGES=$new_packages
76          rm -f ./p[1,2].tmp          rm -f ./p[1,2].tmp
77            return $matched
78      else      else
79          echo "Warning: can't read package groups definition file: $PKG_GROUPS"          echo "Warning: can't read package groups definition file: $PKG_GROUPS"
80      fi      fi
81  }  }
82    
83    #  Check for broken environments (eg. cygwin, MacOSX w/HFS+) that
84    #  cannot distinguish [*.F/*.F90] from [*.f/*.f90] files.
85    check_for_broken_Ff()  {
86        #  Do we have defaults for $FS and/or $FS90 ?
87        tfs=f
88        tfs9=f90
89        if test "x$FS" != x ; then
90            tfs="$FS"
91        fi
92        if test "x$FS90" != x ; then
93            tfs9="$FS90"
94        fi
95    
96        #  First check the ability to create a *.F/.f pair.
97        cat <<EOF >> genmake_hello.F
98          program hello
99          write(*,*) 'hi'
100          stop
101          end
102    EOF
103        cp genmake_hello.F "genmake_hello."$tfs > /dev/null 2>&1
104        RETVAL=$?
105        if test "x$RETVAL" != x0 ; then
106            if test "x$FS" = x ; then
107                FS='for'
108                FS90='fr9'
109                check_for_broken_Ff
110            else
111                cat <<EOF 2>&1
112    ERROR: Your file system cannot distinguish between *.F and *.f files
113      (fails the "cp" test) and this program cannot find a suitable
114      replacement extension.  Please try a different build environment or
115      contact the <MITgcm-support@mitgcm.org> list for help.
116    
117    EOF
118                exit -1
119            fi
120            return
121        fi
122        rm -f genmake_hello.*
123    
124        #  Check the ability of ${MAKE} and ${LN} to use the current set
125        #  of extensions.
126        cat <<EOF >> genmake_hello.F
127          program hello
128          write(*,*) 'hi'
129          stop
130          end
131    EOF
132        test -f $MAKEFILE  &&  mv -f $MAKEFILE $MAKEFILE".tst"
133        cat <<EOF >> $MAKEFILE
134    .SUFFIXES:
135    .SUFFIXES: .$tfs .F
136    .F.$tfs:
137            $LN \$< \$@
138    EOF
139        $MAKE "genmake_hello."$tfs > /dev/null 2>&1
140        RETVAL=$?
141        if test "x$RETVAL" != x0 -o ! -f "genmake_hello."$tfs ; then
142            if test "x$FS" = x ; then
143                FS='for'
144                FS90='fr9'
145                check_for_broken_Ff
146            else
147                cat <<EOF 2>&1
148    ERROR: Your file system cannot distinguish between *.F and *.f files
149      (fails the "make/ln" test) and this program cannot find a suitable
150      replacement extension.  Please try a different build environment or
151      contact the <MITgcm-support@mitgcm.org> list for help.
152    
153    EOF
154                exit -1
155                return
156            fi
157        fi
158        rm -f genmake_hello.* $MAKEFILE
159        test -f $MAKEFILE".tst"  &&  mv -f $MAKEFILE".tst" $MAKEFILE
160    
161        #  If we make it here, use the extensions
162        FS=$tfs
163        FS90=$tfs9
164        return
165    }
166    
167    
168    look_for_makedepend()  {
169    
170        #  The "original" makedepend is part of the Imake system that is
171        #  most often distributed with XFree86 or with an XFree86 source
172        #  package.  As a result, many machines (eg. generic Linux) do not
173        #  have a system-default "makedepend" available.  For those
174        #  systems, we have two fall-back options:
175        #
176        #    1) a makedepend implementation shipped with the cyrus-imapd
177        #       package:  ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/
178        #
179        #    2) a known-buggy xmakedpend shell script
180        #
181        #  So the choices are, in order:
182        #
183        #    1) use the user-specified program
184        #    2) use a system-wide default
185        #    3) locally build and use the cyrus implementation
186        #    4) fall back to the buggy local xmakedpend script
187        #
188        if test "x${MAKEDEPEND}" = x ; then
189            which makedepend > /dev/null 2>&1
190            RV0=$?
191            test -f $MAKEFILE  &&  mv -f $MAKEFILE $MAKEFILE".tst"
192            #  echo 'MAKEFILE="'$MAKEFILE'"'
193            cat <<EOF >> $MAKEFILE
194    #   THIS IS A TEST MAKEFILE GENERATED BY "genmake2"
195    #
196    #   Some "makedepend" implementations will die if they cannot
197    #   find a Makefile -- so this file is here to gives them an
198    #   empty one to find and parse.
199    EOF
200            cat <<EOF >> genmake_tc.f
201          program test
202          write(*,*) 'test'
203          stop
204          end
205    EOF
206            makedepend genmake_tc.f > /dev/null 2>&1
207            RV1=$?
208            test -f $MAKEFILE  &&  rm -f $MAKEFILE
209            test -f $MAKEFILE".tst"  &&  mv -f $MAKEFILE".tst" $MAKEFILE
210            if test "x${RV0}${RV1}" = x00 ; then
211                MAKEDEPEND=makedepend
212            else
213                echo "    a system-default makedepend was not found."
214    
215                #  Try to build the cyrus implementation
216                build_cyrus_makedepend
217                RETVAL=$?
218                if test "x$RETVAL" != x0 ; then
219                    MAKEDEPEND='$(TOOLSDIR)/xmakedepend'
220                fi
221                rm -f ./genmake_cy_md
222            fi
223        else
224            #  echo "MAKEDEPEND=${MAKEDEPEND}"
225            echo "${MAKEDEPEND}" | grep -i cyrus > /dev/null 2>&1
226            RETVAL=$?
227            if test x"$RETVAL" = x0 ; then
228                build_cyrus_makedepend
229            fi
230        fi
231    }
232    
233    
234    build_cyrus_makedepend()  {
235        rm -f ./genmake_cy_md
236        (
237            cd $ROOTDIR/tools/cyrus-imapd-makedepend  \
238                &&  ./configure > /dev/null 2>&1  \
239                &&  make > /dev/null 2>&1
240            if test -x ./makedepend.exe ; then
241                $LN ./makedepend.exe ./makedepend
242            fi
243            ./makedepend ifparser.c > /dev/null 2>&1  \
244                &&  echo "true"
245        ) > ./genmake_cy_md
246        grep true ./genmake_cy_md > /dev/null 2>&1
247        RETVAL=$?
248        rm -f ./genmake_cy_md
249        if test "x$RETVAL" = x0 ; then
250            MAKEDEPEND='$(TOOLSDIR)/cyrus-imapd-makedepend/makedepend'
251            return 0
252        else
253            echo "WARNING: unable to build cyrus-imapd-makedepend"
254            return 1
255        fi
256    }
257    
258    
259    build_embed_encode()
260    {
261        printf "  building the embed-encode utility...  "
262        if test ! -e "$ROOTDIR/tools/embed_encode/encode_files" ; then
263            if test ! -d "$ROOTDIR/tools/embed_encode" ; then
264                echo
265                echo "    Error: can't locate \"$ROOTDIR/tools/embed_encode\""
266                echo
267                EMBED_SRC=f
268                return 1
269            fi
270            clist="cc gcc c89 $CC"
271            for ic in $clist ; do
272                comm="$ic -o encode_files encode_files.c"
273                ( cd $ROOTDIR/tools/embed_encode && $comm ) > /dev/null 2>&1
274                RETVAL=$?
275                if test "x$RETVAL" = x0 ; then
276                    echo "OK"
277                    DEFINES="$DEFINES -DHAVE_EMBED_SRC"
278                    return 0
279                fi
280            done
281            echo
282            echo "    Error: unable to build $ROOTDIR/embed_encode/encode_files"
283            echo "      so it has been disabled"
284            echo
285            EMBED_SRC=f
286            return 1
287        fi
288        echo "OK"
289        DEFINES="$DEFINES -DHAVE_EMBED_SRC"
290    }
291    
292    
293  # Guess possible config options for this host  # Guess possible config options for this host
294  find_possible_configs()  {  find_possible_configs()  {
295    
# Line 82  find_possible_configs()  { Line 300  find_possible_configs()  {
300      tmp2=`echo $tmp1 | sed -e 's/i[3-6]86/ia32/' | sed -e 's/athlon/ia32/'`      tmp2=`echo $tmp1 | sed -e 's/i[3-6]86/ia32/' | sed -e 's/athlon/ia32/'`
301      tmp3=`echo $tmp2 | sed -e 's/cray sv1/craysv1/'`      tmp3=`echo $tmp2 | sed -e 's/cray sv1/craysv1/'`
302      PLATFORM=$tmp3      PLATFORM=$tmp3
303        echo $PLATFORM | grep cygwin > /dev/null 2>&1  &&  PLATFORM=cygwin_ia32
304      OFLIST=`(cd $ROOTDIR/tools/build_options; ls | grep "^$PLATFORM")`      OFLIST=`(cd $ROOTDIR/tools/build_options; ls | grep "^$PLATFORM")`
305      echo "  The platform appears to be:  $PLATFORM"      echo "  The platform appears to be:  $PLATFORM"
306        
307      echo "test" > test      echo "test" > test
308      ln -s ./test link      ln -s ./test link
309      RETVAL=$?      RETVAL=$?
# Line 101  find_possible_configs()  { Line 320  find_possible_configs()  {
320          CPP="cpp -traditional -P"          CPP="cpp -traditional -P"
321      fi      fi
322    
323      #  The "original" makedepend is part of the Imake system that is      look_for_makedepend
324      #  most often distributed with XFree86 or with an XFree86 source  
325      #  package.  As a result, many machines (eg. generic Linux) do not      #================================================================
326      #  have a system-default "makedepend" available.  For those      #  look for possible C compilers
327      #  systems, we have two fall-back options:      tmp="$MITGCM_CC $CC gcc c89 cc c99 mpicc icc"
328      #      p_CC=
329      #    1) a makedepend implementation shipped with the cyrus-imapd      for c in $tmp ; do
330      #       package:  ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/          rm -f ./genmake_hello.c  ./genmake_hello
331      #          cat >> genmake_hello.c << EOF
332      #    2) a known-buggy xmakedpend shell script  #include <stdio.h>
333      #  int main(int argc, char **argv) {
334      #  So the choices are, in order:    printf("Hello!\n");
335      #    return 0;
336      #    1) use the user-specified program  }
337      #    2) use a system-wide default  EOF
338      #    3) locally build and use the cyrus implementation          $c -o genmake_hello genmake_hello.c > /dev/null 2>&1
339      #    4) fall back to the buggy local xmakedpend script          RETVAL=$?
340      #          if test "x${RETVAL}" = x0 ; then
341      if test "x${MAKEDEPEND}" = x ; then              p_CC="$p_CC $c"
342        which makedepend > /dev/null 2>&1          fi
343        RETVAL=$?      done
344        if test ! "x${RETVAL}" = x0 ; then      rm -f ./genmake_hello.c ./genmake_hello
345           echo "    a system-default makedepend was not found."      if test "x${p_CC}" = x ; then
346            cat 1>&2 <<EOF
347           #  Try to build the cyrus impl  
348           rm -f ./genmake_cy_md  Error: No C compilers were found in your path.  Please specify one using:
349           (  
350               cd $ROOTDIR/tools/cyrus-imapd-makedepend  \      1) an "optfile" on (eg. "-optfile=path/to/OPTFILE"),
351                   &&  ./configure > /dev/null 2>&1  \      2) the CC or MITGCM_CC environment variables.
352                   &&  make > /dev/null 2>&1  \  
353                   &&  ./makedepend ifparser.c > /dev/null 2>&1  \  EOF
354                   &&  echo "true"          exit 1
355           ) > ./genmake_cy_md      else
356           grep true ./genmake_cy_md > /dev/null 2>&1          echo "  The possible C compilers found in your path are:"
357           RETVAL=$?          echo "   "$p_CC
358           if test "x$RETVAL" = x0 ; then          if test "x$CC" = x ; then
359               MAKEDEPEND='$(TOOLSDIR)/cyrus-imapd-makedepend/makedepend'              CC=`echo $p_CC | $AWK '{print $1}'`
360           else              echo "  Setting C compiler to: "$CC
361               MAKEDEPEND='$(TOOLSDIR)/xmakedepend'          fi
          fi  
          rm -f ./genmake_cy_md  
       fi  
362      fi      fi
363    
364      # look for possible fortran compilers      #================================================================
365      tmp="$MITGCM_FC $FC efc g77 f77 pgf77 pgf95 ifc f90 f95 mpif77 mpf77 mpxlf95"      #  look for possible FORTRAN compilers
366        tmp="$MITGCM_FC $FC efc g77 f77 pgf77 pgf95 ifc ifort f90 f95 mpif77 mpf77 mpxlf95 gfortran g95"
367      p_FC=      p_FC=
368      for c in $tmp ; do      for c in $tmp ; do
369          rm -f ./hello.f ./hello          rm -f ./hello.f ./hello
# Line 171  Error: No Fortran compilers were found i Line 388  Error: No Fortran compilers were found i
388    
389      1) an "optfile" on (eg. "-optfile=path/to/OPTFILE"),      1) an "optfile" on (eg. "-optfile=path/to/OPTFILE"),
390      2) a command-line option (eg. "-fc NAME"), or      2) a command-line option (eg. "-fc NAME"), or
391      3) the MITGCM_FC environment variable.      3) the FC or MITGCM_FC environment variables.
392    
393  EOF  EOF
394          exit 1          exit 1
395      else      else
396          echo "  The possible FORTRAN compilers found in your path are:"          echo "  The possible FORTRAN compilers found in your path are:"
397          echo "   "$p_FC          echo "   "$p_FC
398          if test "x$FC" = x ; then      fi
399              FC=`echo $p_FC | $AWK '{print $1}'`  
400              echo "  Setting FORTRAN compiler to: "$FC      #  Use the first of the compilers found in the current PATH
401          fi      #  that has a correctly-named optfile
402        if test "x$OPTFILE" = x  -a  "x$FC" = x ; then
403            for i in $p_FC ; do
404                OPTFILE=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$i
405                if test -r $OPTFILE ; then
406                    echo "  Setting OPTFILE to: "$OPTFILE
407                    break
408                fi
409            done
410      fi      fi
411    
412      if test "x$OPTFILE" = x ; then      if test "x$OPTFILE" = x ; then
# Line 216  Error: No options file was found in:  $R Line 441  Error: No options file was found in:  $R
441  EOF  EOF
442          exit 1          exit 1
443      fi      fi
444        
445  #     # look for possible MPI libraries  #     # look for possible MPI libraries
446  #     mpi_libs=  #     mpi_libs=
447  #     mpi_fort=`which mpif77 2>/dev/null`  #     mpi_fort=`which mpif77 2>/dev/null`
# Line 235  EOF Line 460  EOF
460  #       if test "x${RETVAL}" = x0 ; then  #       if test "x${RETVAL}" = x0 ; then
461  #           a=`cat out`  #           a=`cat out`
462  #           for i in $a ; do  #           for i in $a ; do
463  #               case $i in  #               case $i in
464  #                   -*)  #                   -*)
465  #                       mpi_libs="$mpi_libs $i" ;;  #                       mpi_libs="$mpi_libs $i" ;;
466  #               esac  #               esac
# Line 254  get_pdepend_list()  { Line 479  get_pdepend_list()  {
479      #  strip the comments and then convert the dependency file into      #  strip the comments and then convert the dependency file into
480      #  two arrays: PNAME, DNAME      #  two arrays: PNAME, DNAME
481      cat $1 | sed -e 's/#.*$//g' \      cat $1 | sed -e 's/#.*$//g' \
482          | $AWK 'BEGIN{nn=0;} (NF>0){ for(i=2;i<=NF;i++){nn++; print "PNAME["nn"]="$1"\nDNAME["nn"]="$i} }' \          | $AWK 'BEGIN{nn=-1;} (NF>0){ for(i=2;i<=NF;i++){nn++; print "PNAME_"nn"="$1"\nDNAME_"nn"="$i}} END{print "nname="nn}' \
483          > ./.pd_tmp          > ./.pd_tmp
484        RETVAL=$?
485        if test ! "x${RETVAL}" = x0 ; then
486          echo "Error: unable to parse package dependencies -- please check PKG_DEPEND=\"$1\""
487          exit 1
488        fi
489      . ./.pd_tmp      . ./.pd_tmp
490      rm -f ./.pd_tmp      rm -f ./.pd_tmp
491    
     printf "PNAME = "${}  
492  }  }
493    
494    
# Line 273  Usage: "$0" [OPTIONS] Line 502  Usage: "$0" [OPTIONS]
502      -help | --help | -h | --h      -help | --help | -h | --h
503            Print this help message and exit.            Print this help message and exit.
504    
505        -adoptfile NAME | --adoptfile NAME | -adof NAME | --adof NAME
506          -adoptfile=NAME | --adoptfile=NAME | -adof=NAME | --adof=NAME
507              Use "NAME" as the adoptfile.  By default, the file at
508              "tools/adjoint_options/adjoint_default" will be used.
509    
510      -nooptfile | --nooptfile      -nooptfile | --nooptfile
511        -optfile NAME | --optfile NAME | -of NAME | --of NAME        -optfile NAME | --optfile NAME | -of NAME | --of NAME
512        -optfile=NAME | --optfile=NAME | -of=NAME | --of=NAME        -optfile=NAME | --optfile=NAME | -of=NAME | --of=NAME
513            Use "NAME" as the optfile.  By default, an attempt will be            Use "NAME" as the optfile.  By default, an attempt will be
514            made to find an appropriate "standard" optfile in the            made to find an appropriate "standard" optfile in the
515            tools/build_options/ directory.            tools/build_options/ directory.
516    
517      -pdepend NAME | --pdepend NAME      -pdepend NAME | --pdepend NAME
518        -pdepend=NAME | --pdepend=NAME        -pdepend=NAME | --pdepend=NAME
519            Get package dependency information from "NAME".            Get package dependency information from "NAME".
520    
521      -pdefault NAME | --pdefault NAME      -pgroups NAME | --pgroups NAME
522        -pdefault=NAME | --pdefault=NAME        -pgroups=NAME | --pgroups=NAME
523            Get the default package list from "NAME".            Get the package groups information from "NAME".
524    
525        -bash NAME
526              Explicitly specify the Bourne or BASH shell to use
527    
528      -make NAME | -m NAME      -make NAME | -m NAME
529        --make=NAME | -m=NAME        --make=NAME | -m=NAME
530            Use "NAME" for the MAKE program. The default is "make" but            Use "NAME" for the MAKE program. The default is "make" but
531            many platforms, "gmake" is the preferred choice.            many platforms, "gmake" is the preferred choice.
532    
533      -makefile NAME | -mf NAME      -makefile NAME | -mf NAME
# Line 304  Usage: "$0" [OPTIONS] Line 541  Usage: "$0" [OPTIONS]
541      -rootdir NAME | --rootdir NAME | -rd NAME | --rd NAME      -rootdir NAME | --rootdir NAME | -rd NAME | --rd NAME
542        -rootdir=NAME | --rootdir=NAME | -rd=NAME | --rd=NAME        -rootdir=NAME | --rootdir=NAME | -rd=NAME | --rd=NAME
543            Specify the location of the MITgcm ROOTDIR as "NAME".            Specify the location of the MITgcm ROOTDIR as "NAME".
544            By default, genamke will try to find the location by            By default, genamke will try to find the location by
545            looking in parent directories (up to the 5th parent).            looking in parent directories (up to the 5th parent).
546    
547      -mods NAME | --mods NAME | -mo NAME | --mo NAME      -mods NAME | --mods NAME | -mo NAME | --mo NAME
548        -mods=NAME | --mods=NAME | -mo=NAME | --mo=NAME        -mods=NAME | --mods=NAME | -mo=NAME | --mo=NAME
549            Here, "NAME" specifies a list of directories that are            Here, "NAME" specifies a list of directories that are
550            used for additional source code.  Files found in the            used for additional source code.  Files found in the
551            "mods list" are given preference over files of the same            "mods list" are given preference over files of the same
552            name found elsewhere.            name found elsewhere.
553    
554      -disable NAME | --disable NAME      -disable NAME | --disable NAME
555        -disable=NAME | --disable=NAME        -disable=NAME | --disable=NAME
556            Here "NAME" specifies a list of packages that we don't            Here "NAME" specifies a list of packages that we don't
557            want to use.  If this violates package dependencies,            want to use.  If this violates package dependencies,
558            genamke will exit with an error message.            genamke will exit with an error message.
559    
560      -enable NAME | --enable NAME      -enable NAME | --enable NAME
561        -enable=NAME | --enable=NAME        -enable=NAME | --enable=NAME
562            Here "NAME" specifies a list of packages that we wish            Here "NAME" specifies a list of packages that we wish
563            to specifically enable.  If this violates package            to specifically enable.  If this violates package
564            dependencies, genamke will exit with an error message.            dependencies, genamke will exit with an error message.
565    
566      -standarddirs NAME | --standarddirs NAME      -standarddirs NAME | --standarddirs NAME
567        -standarddirs=NAME | --standarddirs=NAME        -standarddirs=NAME | --standarddirs=NAME
568            Here, "NAME" specifies a list of directories to be            Here, "NAME" specifies a list of directories to be
569            used as the "standard" code.            used as the "standard" code.
570    
571      -fortran NAME | --fortran NAME | -fc NAME | --fc NAME      -fortran NAME | --fortran NAME | -fc NAME | --fc NAME
572        -fc=NAME | --fc=NAME        -fc=NAME | --fc=NAME
573            Use "NAME" as the fortran compiler.  By default, genmake            Use "NAME" as the fortran compiler.  By default, genmake
574            will search for a working compiler by trying a list of            will search for a working compiler by trying a list of
575            "usual suspects" such as g77, f77, etc.            "usual suspects" such as g77, f77, etc.
576    
577        -cc NAME | --cc NAME | -cc=NAME | --cc=NAME
578              Use "NAME" as the C compiler.  By default, genmake
579              will search for a working compiler by trying a list of
580              "usual suspects" such as gcc, c89, cc, etc.
581    
582      -[no]ieee | --[no]ieee      -[no]ieee | --[no]ieee
583            Do or don't use IEEE numerics.  Note that this option            Do or don't use IEEE numerics.  Note that this option
584            *only* works if it is supported by the OPTFILE that            *only* works if it is supported by the OPTFILE that
585            is being used.            is being used.
586    
587        -use_real4 | -use_r4 | -ur4 | --use_real4 | --use_r4 | --ur4
588              Use "real*4" type for _RS variable (#undef REAL4_IS_SLOW)
589              *only* works if CPP_EEOPTIONS.h allows this.
590    
591        -ignoretime | -ignore_time | --ignoretime | --ignore_time
592              Ignore all the "wall clock" routines entirely.  This will
593              not in any way hurt the model results -- it simply means
594              that the code that checks how long the model spends in
595              various routines will give junk values.
596    
597        -ts | --ts
598              Produce timing information per timestep
599        -papis | --papis
600              Produce summary MFlop/s (and IPC) with PAPI per timestep
601        -pcls | --pcls
602              Produce summary MFlop/s etc. with PCL per timestep
603        -foolad | --foolad
604              Fool the AD code generator
605        -papi | --papi
606              Performance analysis with PAPI
607        -pcl | --pcl
608              Performance analysis with PCL
609        -hpmt | --hpmt
610              Performance analysis with the HPM Toolkit
611    
612        -gsl | --gsl
613              Use GSL to control floating point rounding and precision
614        -devel | --devel
615              Add additional warning and debugging flags for development
616    
617      -mpi | --mpi      -mpi | --mpi
618            Include MPI header files and link to MPI libraries            Include MPI header files and link to MPI libraries
619      -mpi=PATH | --mpi=PATH      -mpi=PATH | --mpi=PATH
620            Include MPI header files and link to MPI libraries using MPI_ROOT            Include MPI header files and link to MPI libraries using MPI_ROOT
621            set to PATH. i.e. Include files from $PATH/include, link to libraries            set to PATH. i.e. Include files from \$PATH/include, link to libraries
622            from $PATH/lib and use binaries from $PATH/bin.            from \$PATH/lib and use binaries from \$PATH/bin.
623    
624      -bash NAME      -omp | --omp
625            Explicitly specify the Bourne or BASH shell to use            Activate OpenMP code + use Compiler option OMPFLAG
626        -omp=OMPFLAG | --omp=OMPFLAG
627              Activate OpenMP code + use Compiler option OMPFLAG
628    
629        -es | --es | -embed-source | --embed-source
630              Embed a tarball containing the full source code
631              (including the Makefile, etc.) used to build the
632              executable [off by default]
633    
634    While it is most often a single word, the "NAME" variables specified    While it is most often a single word, the "NAME" variables specified
635    above can in many cases be a space-delimited string such as:    above can in many cases be a space-delimited string such as:
636    
637      --enable pkg1   --enable 'pkg1 pkg2'   --enable 'pkg1 pkg2 pkg3'      --enable pkg1   --enable 'pkg1 pkg2'   --enable 'pkg1 pkg2 pkg3'
# Line 363  Usage: "$0" [OPTIONS] Line 642  Usage: "$0" [OPTIONS]
642    
643    For more detailed genmake documentation, please see:    For more detailed genmake documentation, please see:
644    
645      http://mitgcm.org/devel_HOWTO/      http://mitgcm.org/public/devel_HOWTO/
646    
647  EOF  EOF
648    
# Line 372  EOF Line 651  EOF
651    
652  #  Build a CPP macro to automate calling C routines from FORTRAN  #  Build a CPP macro to automate calling C routines from FORTRAN
653  get_fortran_c_namemangling()  {  get_fortran_c_namemangling()  {
654    
655        #echo "FC_NAMEMANGLE = \"$FC_NAMEMANGLE\""
656        if test ! "x$FC_NAMEMANGLE" = x ; then
657            return 0
658        fi
659    
660      default_nm="#define FC_NAMEMANGLE(X) X ## _"      default_nm="#define FC_NAMEMANGLE(X) X ## _"
661        
662      cat > genmake_test.c <<EOF      cat > genmake_test.c <<EOF
663  void tcall( char * string ) { tsub( string ); }  void tcall( char * string ) { tsub( string ); }
664  EOF  EOF
# Line 389  WARNING: Please contact <MITgcm-support@ Line 674  WARNING: Please contact <MITgcm-support@
674  EOF  EOF
675          return 1          return 1
676      fi      fi
677      c_tcall=`nm genmake_test.o | grep 'T ' | grep tcall | cut -d ' ' -f 3`      c_tcall=`nm genmake_test.o 2>/dev/null | grep 'T ' | grep tcall | cut -d ' ' -f 3`
678      RETVAL=$?      RETVAL=$?
679      if test "x$RETVAL" != x0 ; then      if test "x$RETVAL" != x0 ; then
680          FC_NAMEMANGLE=$default_nm          FC_NAMEMANGLE=$default_nm
# Line 401  WARNING: Please contact <MITgcm-support@ Line 686  WARNING: Please contact <MITgcm-support@
686  EOF  EOF
687          return 1          return 1
688      fi      fi
689      cat > genmake_tcomp.f <<EOF      cat > genmake_tcomp.$FS <<EOF
690        subroutine tcall( string )        subroutine tcall( string )
691        character*(*) string        character*(*) string
692        call tsub( string )        call tsub( string )
693        end        end
694  EOF  EOF
695      $FC $FFLAGS $DEFINES -c genmake_tcomp.f >> genmake_warnings 2>&1      $FC $FFLAGS -c genmake_tcomp.$FS >> genmake_warnings 2>&1
696      RETVAL=$?      RETVAL=$?
697      if test "x$RETVAL" != x0 ; then      if test "x$RETVAL" != x0 ; then
698          FC_NAMEMANGLE=$default_nm          FC_NAMEMANGLE=$default_nm
# Line 419  WARNING: Please contact <MITgcm-support@ Line 704  WARNING: Please contact <MITgcm-support@
704  EOF  EOF
705          return 1          return 1
706      fi      fi
707      f_tcall=`nm genmake_tcomp.o | grep 'T ' | grep tcall | cut -d ' ' -f 3`      f_tcall=`nm genmake_tcomp.o 2>/dev/null | grep 'T ' | grep tcall | cut -d ' ' -f 3`
708      RETVAL=$?      RETVAL=$?
709      if test "x$RETVAL" != x0 ; then      if test "x$RETVAL" != x0 ; then
710          FC_NAMEMANGLE=$default_nm          FC_NAMEMANGLE=$default_nm
# Line 473  void FC_NAMEMANGLE(cloc) ( double *curti Line 758  void FC_NAMEMANGLE(cloc) ( double *curti
758   *curtim = *curtim/1.E6;   *curtim = *curtim/1.E6;
759  }  }
760  EOF  EOF
761      make genmake_tc_1.o >> genmake_tc.log 2>&1      COMM="$CC $CFLAGS -c genmake_tc_1.c"
762        echo $COMM >> genmake_warnings
763        $COMM >> genmake_warnings 2>&1
764      RET_C=$?      RET_C=$?
765      cat <<EOF > genmake_tc_2.f      cat <<EOF > genmake_tc_2.$FS
766        program hello        program hello
767        Real*8 wtime        REAL*8 wtime
768        external cloc        external cloc
769        call cloc(wtime)        call cloc(wtime)
770        print *," HELLO WORLD", wtime        print *," HELLO WORLD", wtime
771        end program hello        end
772  EOF  EOF
773      $FC $FFLAGS -o genmake_tc genmake_tc_2.f genmake_tc_1.o >> genmake_tc.log 2>&1      COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
774        echo $COMM >> genmake_warnings
775        $COMM >> genmake_warnings 2>&1
776      RET_F=$?      RET_F=$?
777      test -x ./genmake_tc  &&  ./genmake_tc >> genmake_tc.log 2>&1      test -x ./genmake_tc  &&  ./genmake_tc >> genmake_warnings 2>&1
778      RETVAL=$?      RETVAL=$?
779      if test "x$RETVAL" = x0 ; then      if test "x$RETVAL" = x0 ; then
780          HAVE_CLOC=t          HAVE_CLOC=t
# Line 495  EOF Line 784  EOF
784  }  }
785    
786    
787    check_HAVE_SIGREG()  {
788        if test ! "x$HAVE_SIGREG" = x ; then
789            return
790        fi
791        get_fortran_c_namemangling
792        cat <<EOF > genmake_tc_1.c
793    $FC_NAMEMANGLE
794    #include <stdlib.h>
795    #include <stdio.h>
796    #include <signal.h>
797    #include <errno.h>
798    #include <ucontext.h>
799    
800    int * ip;
801    
802    static void killhandler(
803        unsigned int sn, siginfo_t  si, struct ucontext *sc )
804    {
805        *ip = *ip + 1;
806        return;
807    }
808    
809    void FC_NAMEMANGLE(sigreg) (int * aip)
810    {
811        struct sigaction s;
812        ip = aip;
813        s.sa_flags = SA_SIGINFO;
814        s.sa_sigaction = (void *)killhandler;
815        if(sigaction (SIGTERM,&s,(struct sigaction *)NULL)) {
816            printf("Sigaction returned error = %d\n", errno);
817            exit(0);
818        }
819        return;
820    }
821    EOF
822        COMM="$CC $CFLAGS -c genmake_tc_1.c"
823        echo $COMM >> genmake_warnings
824        $COMM >> genmake_warnings 2>&1
825        RET_C=$?
826        cat <<EOF > genmake_tc_2.$FS
827          program hello
828          integer anint
829          common /iv/ anint
830          external sigreg
831          call sigreg(anint)
832          end
833    EOF
834        echo >> genmake_warnings
835        echo "running: check_HAVE_SIGREG()" >> genmake_warnings
836        cat genmake_tc_2.$FS >> genmake_warnings
837        COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
838        echo $COMM >> genmake_warnings
839        $COMM >> genmake_warnings 2>&1
840        RETVAL=$?
841        if test "x$RETVAL" = x0 ; then
842            HAVE_SIGREG=t
843            DEFINES="$DEFINES -DHAVE_SIGREG"
844        fi
845        rm -f genmake_tc*
846    }
847    
848    
849    check_HAVE_SETRLSTK()  {
850        if test "x$HAVE_SETRLSTK" = xt ; then
851            DEFINES="$DEFINES -DHAVE_SETRLSTK"
852            return
853        fi  
854        if test ! "x$HAVE_SETRLSTK" = x ; then
855            return
856        fi
857        get_fortran_c_namemangling
858        cat <<EOF > genmake_tc_1.c
859    $FC_NAMEMANGLE
860    #include <sys/time.h>
861    #include <sys/resource.h>
862    #include <unistd.h>
863    void FC_NAMEMANGLE(setrlstk) ()
864    {
865        struct rlimit rls;
866        rls.rlim_cur = RLIM_INFINITY;
867        rls.rlim_max = RLIM_INFINITY;
868        setrlimit(RLIMIT_STACK, &rls);
869        return;
870    }
871    EOF
872        COMM="$CC $CFLAGS -c genmake_tc_1.c"
873        echo $COMM >> genmake_warnings
874        $COMM >> genmake_warnings 2>&1
875        RET_C=$?
876        cat <<EOF > genmake_tc_2.$FS
877          program hello
878          external setrlstk
879          call setrlstk()
880          end
881    EOF
882        echo >> genmake_warnings
883        echo "running: check_HAVE_SETRLSTK()" >> genmake_warnings
884        cat genmake_tc_2.$FS >> genmake_warnings
885        COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
886        echo $COMM >> genmake_warnings
887        $COMM >> genmake_warnings 2>&1
888        RETVAL=$?
889        if test "x$RETVAL" = x0 ; then
890            HAVE_SETRLSTK=t
891            DEFINES="$DEFINES -DHAVE_SETRLSTK"
892        fi
893        rm -f genmake_tc*
894    }
895    
896    
897    check_HAVE_STAT()  {
898        get_fortran_c_namemangling
899        cat <<EOF > genmake_tc_1.c
900    $FC_NAMEMANGLE
901    #include <stdio.h>
902    #include <stdlib.h>
903    #include <unistd.h>
904    #include <sys/stat.h>
905    #include <sys/types.h>
906    void FC_NAMEMANGLE(tfsize) ( int *nbyte )
907    {
908        char name[512];
909        struct stat astat;
910    
911        name[0] = 'a'; name[1] = '\0';
912        if (! stat(name, &astat))
913            *nbyte = (int)(astat.st_size);
914        else
915            *nbyte = -1;
916    }
917    EOF
918        COMM="$CC $CFLAGS -c genmake_tc_1.c"
919        echo $COMM >> genmake_warnings
920        $COMM >> genmake_tc.log 2>&1
921        RET_C=$?
922        cat <<EOF > genmake_tc_2.$FS
923          program hello
924          integer nbyte
925          call tfsize(nbyte)
926          print *," HELLO WORLD", nbyte
927          end
928    EOF
929        echo >> genmake_warnings
930        echo "running: check_HAVE_STAT()" >> genmake_warnings
931        cat genmake_tc_2.$FS >> genmake_warnings
932        COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
933        echo $COMM >> genmake_warnings
934        $COMM >> genmake_tc.log 2>&1
935        RETVAL=$?
936        if test "x$RETVAL" = x0 ; then
937            HAVE_STAT=t
938            DEFINES="$DEFINES -DHAVE_STAT"
939        fi
940        rm -f genmake_tc*
941    }
942    
943    
944  check_netcdf_libs()  {  check_netcdf_libs()  {
945        if test ! "x$SKIP_NETCDF_CHECK" = x ; then
946            return
947        fi
948        echo >> genmake_warnings
949        echo "running: check_netcdf_libs()" >> genmake_warnings
950      cat <<EOF > genmake_tnc.F      cat <<EOF > genmake_tnc.F
951        program fgennc        program fgennc
952  #include "netcdf.inc"  #include "netcdf.inc"
953    EOF
954        if test ! "x$MPI" = x ; then
955            echo '#include "mpif.h"' >> genmake_tnc.F
956        fi
957        cat <<EOF >> genmake_tnc.F
958        integer iret, ncid, xid        integer iret, ncid, xid
959        iret = nf_create('genmake_tnc.nc', NF_CLOBBER, ncid)        iret = nf_create('genmake_tnc.nc', NF_CLOBBER, ncid)
960        IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)        IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
# Line 508  check_netcdf_libs()  { Line 964  check_netcdf_libs()  {
964        IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)        IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
965        end        end
966  EOF  EOF
967      $CPP genmake_tnc.F > genmake_tnc.f  \      echo "===  genmake_tnc.F  ===" > genmake_tnc.log
968          &&  $FC $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.f $LIBS >> genmake_tnc.log 2>&1      cat genmake_tnc.F >> genmake_tnc.log
969        echo "===  genmake_tnc.F  ===" >> genmake_tnc.log
970        RET_CPP=f
971        COMM="cat genmake_tnc.F | $CPP $DEFINES $INCLUDES"
972        echo "$COMM" >> genmake_tnc.log
973        eval $COMM > genmake_tnc.$FS 2>/dev/null  &&  RET_CPP=t
974        if test "x$RET_CPP" = xf ; then
975            echo "  WARNING: CPP failed to pre-process the netcdf test." \
976                >> genmake_tnc.log
977            echo "    Please check that \$INCLUDES is properly set." \
978                >> genmake_tnc.log
979        fi
980        echo "$FC $FFLAGS $FOPTIM -c genmake_tnc.$FS  \ " >> genmake_tnc.log
981        echo "  &&  $LINK $FFLAGS $FOPTIM -o genmake_tnc.o $LIBS" >> genmake_tnc.log
982        $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1  \
983            &&  $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS >> genmake_tnc.log 2>&1
984      RET_COMPILE=$?      RET_COMPILE=$?
985      test -x ./genmake_tnc  &&  ./genmake_tnc >> genmake_tnc.log 2>&1      cat genmake_tnc.log >> genmake_warnings
986      RETVAL=$?  
987      if test "x$RET_COMPILE" = x0 -a "x$RETVAL" = x0 ; then      #EH3  Remove test program execution for machines that either disallow
988        #EH3  execution or cannot support it (eg. cross-compilers)
989        #EH3
990        #EH3 test -x ./genmake_tnc  &&  ./genmake_tnc >> genmake_tnc.log 2>&1
991        #EH3 RETVAL=$?
992        #EH3 if test "x$RET_COMPILE" = x0 -a "x$RETVAL" = x0 ; then
993    
994        if test "x$RET_COMPILE" = x0 ; then
995          HAVE_NETCDF=t          HAVE_NETCDF=t
996      else      else
997          # try again with "-lnetcdf" added to the libs          # try again with "-lnetcdf" added to the libs
998          $CPP genmake_tnc.F > genmake_tnc.f  \          echo "try again with added '-lnetcdf'" > genmake_tnc.log
999              &&  $FC $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.f \          echo "cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS \ " >> genmake_tnc.log
1000              $LIBS -lnetcdf >> genmake_tnc_2.log 2>&1          echo " &&  $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS \ " >> genmake_tnc.log
1001            echo " &&  $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf" >> genmake_tnc.log
1002            cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS 2>/dev/null  \
1003                &&  $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1  \
1004                &&  $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf >> genmake_tnc.log 2>&1
1005          RET_COMPILE=$?          RET_COMPILE=$?
1006          test -x ./genmake_tnc  &&  ./genmake_tnc >> genmake_tnc.log 2>&1          cat genmake_tnc.log >> genmake_warnings
1007          RETVAL=$?          if test "x$RET_COMPILE" = x0 ; then
         if test "x$RET_COMPILE" = x0 -a "x$RETVAL" = x0 ; then  
1008              LIBS="$LIBS -lnetcdf"              LIBS="$LIBS -lnetcdf"
1009              HAVE_NETCDF=t              HAVE_NETCDF=t
1010          else          else
1011            # try again with "-lnetcdff" added to the libs
1012                echo "try again with added '-lnetcdff -lnetcdf'" > genmake_tnc.log
1013                echo "cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS \ " >> genmake_tnc.log
1014                echo " &&  $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS \ " >> genmake_tnc.log
1015                echo " &&  $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf" >> genmake_tnc.log
1016                cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS 2>/dev/null  \
1017                    &&  $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1  \
1018                    &&  $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdff -lnetcdf >> genmake_tnc.log 2>&1
1019                RET_COMPILE=$?
1020              cat genmake_tnc.log >> genmake_warnings              cat genmake_tnc.log >> genmake_warnings
1021                if test "x$RET_COMPILE" = x0 ; then
1022                    LIBS="$LIBS -lnetcdff -lnetcdf"
1023                    HAVE_NETCDF=t
1024                fi
1025          fi          fi
1026      fi      fi
1027      rm -f genmake_tnc*      rm -f genmake_tnc*
# Line 546  PLATFORM= Line 1040  PLATFORM=
1040  LN=  LN=
1041  S64=  S64=
1042  KPP=  KPP=
1043  FC=  #FC=
1044  CPP=  #CC=gcc
1045    #CPP=
1046  LINK=  LINK=
1047  DEFINES=  DEFINES=
1048  PACKAGES=  PACKAGES=
1049  ENABLE=  ENABLE=
1050  DISABLE=  DISABLE=
1051  MAKEFILE=  # MAKEFILE=
1052  MAKEDEPEND=  # MAKEDEPEND=
1053  PDEPEND=  PKG_DEPEND=
1054    PKG_GROUPS=
1055  DUMPSTATE=t  DUMPSTATE=t
 PDEFAULT=  
1056  OPTFILE=  OPTFILE=
1057  INCLUDES="-I."  INCLUDES="-I. $INCLUDES"
1058  FFLAGS=  FFLAGS=
1059  FOPTIM=  FOPTIM=
1060    FEXTRAFLAGS=
1061    USE_EXTENDED_SRC=
1062    EXTENDED_SRC_FLAG=
1063  CFLAGS=  CFLAGS=
1064  KFLAGS1=  KFLAGS1=
1065  KFLAGS2=  KFLAGS2=
# Line 572  NOOPTFILES= Line 1070  NOOPTFILES=
1070  NOOPTFLAGS=  NOOPTFLAGS=
1071  MPI=  MPI=
1072  MPIPATH=  MPIPATH=
1073    OMP=
1074    OMPFLAG=
1075    USE_R4=
1076    TS=
1077    PAPIS=
1078    PCLS=
1079    FOOLAD=
1080    PAPI=
1081    PCL=
1082    HPMT=
1083    GSL=
1084    DEVEL=
1085    HAVE_TEST_L=
1086    
1087  # DEFINES checked by test compilation  # DEFINES checked by test compilation or command-line
1088  HAVE_SYSTEM=  HAVE_SYSTEM=
1089  HAVE_FDATE=  HAVE_FDATE=
1090  FC_NAMEMANGLE=  FC_NAMEMANGLE=
1091  HAVE_CLOC=  HAVE_CLOC=
1092    # HAVE_SETRLSTK=
1093    HAVE_STAT=
1094  HAVE_NETCDF=  HAVE_NETCDF=
1095    HAVE_ETIME=
1096    IGNORE_TIME=
1097    
1098  MODS=  MODS=
1099  TOOLSDIR=  TOOLSDIR=
# Line 589  STANDARDDIRS="USE_THE_DEFAULT" Line 1104  STANDARDDIRS="USE_THE_DEFAULT"
1104  G2ARGS=  G2ARGS=
1105  BASH=  BASH=
1106  PWD=`pwd`  PWD=`pwd`
1107  MAKE=make  test "x$MAKE" = x  &&  MAKE=make
1108  AWK=awk  test "x$AWK" = x   &&  AWK=awk
1109  THISHOSTNAME=`hostname`  EMBED_SRC=
1110    THISHOST=`hostname`
1111  THISCWD=`pwd`  THISCWD=`pwd`
1112  THISDATE=`date`  THISDATE=`date`
1113    THISUSER=`echo $USER`
1114    THISVER=
1115  MACHINE=`uname -a`  MACHINE=`uname -a`
1116  EXECUTABLE=  EXECUTABLE=
1117  EXEHOOK=  EXEHOOK=
# Line 603  IEEE= Line 1121  IEEE=
1121  if test "x$MITGCM_IEEE" != x ; then  if test "x$MITGCM_IEEE" != x ; then
1122      IEEE=$MITGCM_IEEE      IEEE=$MITGCM_IEEE
1123  fi  fi
1124    FS=
1125    FS90=
1126    
1127  AUTODIFF_PKG_USED=f  AUTODIFF_PKG_USED=f
1128  AD_OPTFILE=  AD_OPTFILE=
# Line 617  FTL_TAF_FLAGS= Line 1137  FTL_TAF_FLAGS=
1137  SVD_TAMC_FLAGS=  SVD_TAMC_FLAGS=
1138  TAMC_EXTRA=  TAMC_EXTRA=
1139    
   
1140  #  The following state can be set directly by command-line switches  #  The following state can be set directly by command-line switches
1141  gm_s1="OPTFILE PDEPEND PDEFAULT MAKEFILE PLATFORM ROOTDIR MODS DISABLE ENABLE"  gm_s1="OPTFILE PKG_DEPEND PKG_GROUPS MAKEFILE MAKEDEPEND PLATFORM ROOTDIR MODS DISABLE ENABLE"
1142  gm_s2="FC CPP IEEE MPI JAM DUMPSTATE STANDARDDIRS"  gm_s2="FC IEEE USE_R4 TS PAPIS PCLS PAPI PCL HPMT GSL DEVEL MPI OMP DUMPSTATE STANDARDDIRS"
1143    
1144  #  The following state is not directly set by command-line switches  #  The following state is not directly set by command-line switches
1145  gm_s3="LN S64 KPP LINK PACKAGES MAKEDEPEND PDEPEND PDEFAULT INCLUDES FFLAGS FOPTIM "  gm_s3="LN S64 LINK MAKE PACKAGES INCLUDES FFLAGS FOPTIM FEXTRAFLAGS"
1146  gm_s4="CFLAGS KFLAGS1 KFLAGS2 LIBS KPPFILES NOOPTFILES NOOPTFLAGS"  gm_s4="CFLAGS LIBS KPP KFLAGS1 KFLAGS2 KPPFILES NOOPTFILES NOOPTFLAGS"
1147  gm_s5="TOOLSDIR SOURCEDIRS INCLUDEDIRS PWD MAKE THISHOSTNAME THISDATE MACHINE"  gm_s5="TOOLSDIR SOURCEDIRS INCLUDEDIRS PWD THISHOST THISUSER THISDATE THISVER MACHINE"
1148  gm_s6="EXECUTABLE EXEHOOK EXEDIR PACKAGES_CONF"  gm_s6="EXECUTABLE EXEHOOK EXEDIR PACKAGES_CONF"
1149  gm_s7="HAVE_SYSTEM HAVE_FDATE FC_NAMEMANGLE"  gm_s7="FC_NAMEMANGLE HAVE_NETCDF HAVE_SYSTEM HAVE_FDATE HAVE_ETIME"
1150    
1151  #  The following are all related to adjoint/tangent-linear stuff  #  The following are all related to adjoint/tangent-linear stuff
1152  gm_s10="AUTODIFF_PKG_USED AD_OPTFILE TAMC TAF AD_TAMC_FLAGS AD_TAF_FLAGS"  gm_s10="AUTODIFF_PKG_USED AD_OPTFILE TAMC TAF AD_TAMC_FLAGS AD_TAF_FLAGS"
# Line 650  EOF Line 1169  EOF
1169    
1170  echo "===  Processing options files and arguments  ==="  echo "===  Processing options files and arguments  ==="
1171  gm_local="genmake_local"  gm_local="genmake_local"
 for i in . $MODS ; do  
     if test -r $i/$gm_local ; then  
         . $i/$gm_local  
         break  
     fi  
 done  
1172  printf "  getting local config information:  "  printf "  getting local config information:  "
1173  if test -e $gm_local ; then  if test -f $gm_local ; then
1174      echo "using $gm_local"      echo "using $gm_local"
1175      . $gm_local      . $gm_local
1176      # echo "DISABLE=$DISABLE"      # echo "DISABLE=$DISABLE"
# Line 666  else Line 1179  else
1179      echo "none found"      echo "none found"
1180  fi  fi
1181    
1182  #  echo "$0::$1:$2:$3:$4:$5:$6:$7:"  #echo "$0::$1:$2:$3:$4:$5:$6:$7:"
 #OPTIONS=  
 #n=0  
 #for i ; do  
 #   echo "$i  $n"  
 #   setvar="OPTIONS[$n]='$i'"  
 #   #  echo "  $setvar"  
 #   eval "$setvar"  
 #   n=$(( $n + 1 ))  
 #done  
1183  #parse_options  #parse_options
1184  ac_prev=  ac_prev=
1185  for ac_option ; do  for ac_option in "$@" ; do
1186    
1187      G2ARGS="$G2ARGS \"$ac_option\""      G2ARGS="$G2ARGS \"$ac_option\""
1188    
# Line 688  for ac_option ; do Line 1192  for ac_option ; do
1192          ac_prev=          ac_prev=
1193          continue          continue
1194      fi      fi
1195        
1196      ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`      ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
1197        
1198      case $ac_option in      case $ac_option in
1199                    
1200          -help | --help | -h | --h)          -help | --help | -h | --h)
# Line 709  for ac_option ; do Line 1213  for ac_option ; do
1213              AD_OPTFILE=$ac_optarg ;;              AD_OPTFILE=$ac_optarg ;;
1214                    
1215          -pdepend | --pdepend)          -pdepend | --pdepend)
1216              ac_prev=PDEPEND ;;              ac_prev=PKG_DEPEND ;;
1217          -pdepend=* | --pdepend=*)          -pdepend=* | --pdepend=*)
1218              PDEPEND=$ac_optarg ;;              PKG_DEPEND=$ac_optarg ;;
1219                    
1220          -pdefault | --pdefault)          -pgroups | --pgroups)
1221              ac_prev=PDEFAULT ;;              ac_prev=PKG_GROUPS ;;
1222          -pdefault=* | --pdefault=*)          -pgroups=* | --pgroups=*)
1223              PDEFAULT=$ac_optarg ;;              PKG_GROUPS=$ac_optarg ;;
1224                    
1225          -make | --make | -m | --m)          -make | --make | -m | --m)
1226              ac_prev=MAKE ;;              ac_prev=MAKE ;;
# Line 774  for ac_option ; do Line 1278  for ac_option ; do
1278  #               ac_prev=cpp ;;  #               ac_prev=cpp ;;
1279  #           -cpp=* | --cpp=*)  #           -cpp=* | --cpp=*)
1280  #               CPP=$ac_optarg ;;  #               CPP=$ac_optarg ;;
1281                        
1282            -cc | --cc)
1283                ac_prev=CC ;;
1284            -cc=* | --cc=*)
1285                CC=$ac_optarg ;;
1286            
1287          -fortran | --fortran | -fc | --fc)          -fortran | --fortran | -fc | --fc)
1288              ac_prev=FC ;;              ac_prev=FC ;;
1289          -fc=* | --fc=*)          -fc=* | --fc=*)
1290              FC=$ac_optarg ;;              FC=$ac_optarg ;;
1291                    
1292            -fs | --fs)
1293                ac_prev=FS ;;
1294            -fs=* | --fs=*)
1295                FS=$ac_optarg ;;
1296            
1297            -fs90 | --fs90)
1298                ac_prev=FS90 ;;
1299            -fs90=* | --fs90=*)
1300                FS90=$ac_optarg ;;
1301            
1302          -ieee | --ieee)          -ieee | --ieee)
1303              IEEE=true ;;              IEEE=true ;;
1304          -noieee | --noieee)          -noieee | --noieee)
1305              IEEE= ;;              IEEE= ;;
1306    
1307            -use_real4 | -use_r4 | -ur4 | --use_real4 | --use_r4 | --ur4 )
1308                USE_R4=true ;;
1309    
1310            -ts | --ts)
1311                TS=true ;;
1312            -papis | --papis)
1313                PAPIS=true ;;
1314            -pcls | --pcls)
1315                PCLS=true ;;
1316            -foolad | --foolad)
1317                FOOLAD=true ;;
1318            -papi | --papi)
1319                PAPI=true ;;
1320            -pcl | --pcl)
1321                PCL=true ;;
1322            -hpmt | --hpmt)
1323                HPMT=true ;;
1324    
1325            -gsl | --gsl)
1326                GSL=true ;;
1327    
1328            -devel | --devel)
1329                DEVEL=true ;;
1330    
1331          -mpi | --mpi)          -mpi | --mpi)
1332              MPI=true ;;              MPI=true ;;
1333          -mpi=* | --mpi=*)          -mpi=* | --mpi=*)
1334              MPIPATH=$ac_optarg              MPIPATH=$ac_optarg
1335              MPI=true ;;              MPI=true ;;
1336                    
1337  #       -jam | --jam)          -omp | --omp)
1338  #           JAM=1 ;;              OMP=true ;;
1339  #       -nojam | --nojam)          -omp=* | --omp=*)
1340  #           JAM=0 ;;              OMPFLAG=$ac_optarg
1341                OMP=true ;;
1342                    
1343          -ds | --ds)          -ds | --ds)
1344              DUMPSTATE=t ;;              DUMPSTATE=t ;;
# Line 808  for ac_option ; do Line 1352  for ac_option ; do
1352              ac_prev=TAMC_EXTRA ;;              ac_prev=TAMC_EXTRA ;;
1353          -tamc_extra=* | --tamc_extra=*)          -tamc_extra=* | --tamc_extra=*)
1354              TAMC_EXTRA=$ac_optarg ;;              TAMC_EXTRA=$ac_optarg ;;
1355            
1356            -ignoretime | -ignore_time | --ignoretime | --ignore_time)
1357                IGNORE_TIME="-DIGNORE_TIME" ;;
1358    
1359            -es | --es | -embed-source | --embed-source)
1360                EMBED_SRC=t ;;
1361    
1362          -*)          -*)
1363              echo "Error: unrecognized option: "$ac_option              echo "Error: unrecognized option: "$ac_option
# Line 820  for ac_option ; do Line 1370  for ac_option ; do
1370              ;;              ;;
1371                    
1372      esac      esac
1373        
1374  done  done
1375    
1376    
1377  if test -f ./.genmakerc ; then  if test -f ./.genmakerc ; then
1378      echo      echo
1379      echo "WARNING: genmake2 has detected a copy of the old-style \"./.genmakerc\""      echo "WARNING: genmake2 has detected a copy of the old-style \"./.genmakerc\""
1380      echo "  file.  This file format is no longer supported.  Please see:"      echo "  file.  This file format is no longer supported.  For directions on"
1381      echo      echo "  how to setup and use the new \"genmake2\" script, please see:"
1382      echo "    http://mitgcm.org/devel_HOWTO/"      echo "    http://mitgcm.org/devel_HOWTO/"
1383        echo "  and send an email to MITgcm-support@mitgcm.org if you need help."
1384        echo "WARNING: ignore \"./.genmakerc\" and continue."
1385      echo      echo
     echo "  for directions on how to setup and use the new \"genmake2\" input"  
     echo "  files and send an email to MITgcm-support@mitgcm.org if you want help."  
     echo  
1386  fi  fi
1387    
1388    #  Find the MITgcm ${ROOTDIR}
1389  if test "x${ROOTDIR}" = x ; then  if test "x${ROOTDIR}" = x ; then
1390      if test "${PWD##/*/}" = "bin" -a -d ../model -a -d ../eesup -a -d ../pkg ; then      tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1391        if test "x$tmp" = "xbin" -a -d ../model -a -d ../eesupp -a -d ../pkg ; then
1392          ROOTDIR=".."          ROOTDIR=".."
1393      else      else
1394          for d in . .. ../.. ../../.. ../../../.. ../../../../.. ; do          for d in . .. ../.. ../../.. ../../../.. ../../../../.. ; do
# Line 860  if test ! -d ${ROOTDIR} ; then Line 1412  if test ! -d ${ROOTDIR} ; then
1412      exit 1      exit 1
1413  fi  fi
1414    
1415    #  Find the MITgcm ${THISVER}
1416    version_file="${ROOTDIR}/doc/tag-index"
1417    if test -f $version_file ; then
1418        THISVER=`$AWK '/^checkpoint/{print $1; exit}' $version_file`
1419    #-  remove ./BUILD_INFO.h file if older than version_file
1420        if test -f ./BUILD_INFO.h -a ./BUILD_INFO.h -ot $version_file ; then
1421            echo "  remove ./BUILD_INFO.h (older than ${version_file})"
1422            rm -f ./BUILD_INFO.h
1423        fi
1424    fi
1425    
1426    if test "x$MAKEFILE" = x ; then
1427        MAKEFILE="Makefile"
1428    fi
1429    
1430  echo "  getting OPTFILE information:  "  echo "  getting OPTFILE information:  "
1431  if test "x${OPTFILE}" = x ; then  if test "x${OPTFILE}" = x ; then
1432      if test "x$MITGCM_OF" = x ; then      if test "x$MITGCM_OF" = x ; then
# Line 916  if test "x${AD_OPTFILE}" != xNONE ; then Line 1483  if test "x${AD_OPTFILE}" != xNONE ; then
1483      fi      fi
1484  fi  fi
1485    
1486  #  Check that FC, LINK, CPP, S64, LN, and MAKE are defined.  If not,  #====================================================================
1487    #  Set default values if not set by the optfile
1488    #
1489    #  Check that FC, CC, LINK, CPP, S64, LN, and MAKE are defined.  If not,
1490  #  either set defaults or complain and abort!  #  either set defaults or complain and abort!
1491  if test ! "x$BASH" = x ; then  if test ! "x$BASH" = x ; then
1492      # add a trailing space so that it works within the Makefile syntax (see below)      # add a trailing space so that it works within the Makefile syntax (see below)
# Line 932  Error: no Fortran compiler: please speci Line 1502  Error: no Fortran compiler: please speci
1502  EOF  EOF
1503      exit 1      exit 1
1504  fi  fi
1505    if test "x$CC" = x ; then
1506        CC=cc
1507    #     cat <<EOF 1>&2
1508    # Error: no C compiler: please specify using one of the following:
1509    #   1) within the options file ("CC=...") as specified by "-of=OPTFILE"
1510    #   2) the "-cc=XXX" command-line option
1511    #   3) the "./genmake_local" file
1512    # EOF
1513    #     exit 1
1514    fi
1515  if test "x$LINK" = x ; then  if test "x$LINK" = x ; then
1516      LINK=$FC      LINK=$FC
1517  fi  fi
# Line 942  if test "x$CPP" = x ; then Line 1522  if test "x$CPP" = x ; then
1522      CPP=cpp      CPP=cpp
1523  fi  fi
1524  #EH3 === UGLY ===  #EH3 === UGLY ===
1525  #  The following an ugly little hack to check for $CPP in /lib/ and it  #  The following is an ugly little hack to check for $CPP in /lib/ and
1526  #  should eventually be replaced with a more general function that  #  it should eventually be replaced with a more general function that
1527  #  searches a combo of the user's path and a list of "usual suspects"  #  searches a combo of the user's path and a list of "usual suspects"
1528  #  to find the correct location for binaries such as $CPP.  #  to find the correct location for binaries such as $CPP.
1529  for i in " " "/lib/" ; do  for i in " " "/lib/" ; do
# Line 966  EOF Line 1546  EOF
1546  else  else
1547      rm -f test_cpp      rm -f test_cpp
1548  fi  fi
1549  if test "x$MAKEDEPEND" = x ; then  look_for_makedepend
     MAKEDEPEND=makedepend  
 fi  
1550  if test "x$LN" = x ; then  if test "x$LN" = x ; then
1551      LN="ln -s"      LN="ln -s"
1552  fi  fi
# Line 984  Error: The command "ln -s" failed -- ple Line 1562  Error: The command "ln -s" failed -- ple
1562  EOF  EOF
1563      exit 1      exit 1
1564  fi  fi
1565    test -L genmake_tlink > /dev/null 2>&1
1566    RETVAL=$?
1567    if test "x$RETVAL" = x0 ; then
1568        HAVE_TEST_L=t
1569    fi
1570  rm -f genmake_test_ln genmake_tlink  rm -f genmake_test_ln genmake_tlink
1571    
1572    #  Check for broken *.F/*.f handling and fix if possible
1573    check_for_broken_Ff
1574    
1575  if test ! "x$MPI" = x ; then  if test ! "x$MPI" = x ; then
1576        echo "  Turning on MPI cpp macros"        echo "  Turning on MPI cpp macros"
1577        DEFINES="$DEFINES -DALLOW_USE_MPI -DALWAYS_USE_MPI"        DEFINES="$DEFINES -DALLOW_USE_MPI -DALWAYS_USE_MPI"
1578  fi  fi
1579    if test ! "x$OMP" = x ; then
1580          echo "  Add OMPFLAG and turn on OpenMP cpp macros"
1581          FFLAGS="$FFLAGS $OMPFLAG"
1582          F90FLAGS="$F90FLAGS $OMPFLAG"
1583          DEFINES="$DEFINES -DUSE_OMP_THREADING"
1584    fi
1585    
1586    if test ! "x$USE_R4" = x ; then
1587          echo "  Turning on LET_RS_BE_REAL4 cpp flag"
1588          DEFINES="$DEFINES -DLET_RS_BE_REAL4"
1589    fi
1590    
1591    if test ! "x$TS" = x ; then
1592          echo "  Turning on timing per timestep"
1593          if test ! "x$FOOLAD" = x ; then
1594                DEFINES="$DEFINES -DTIME_PER_TIMESTEP_SFP"
1595          else
1596                DEFINES="$DEFINES -DTIME_PER_TIMESTEP"
1597          fi
1598          PACKAGES="$PACKAGES showflops"
1599    fi
1600    if test ! "x$PAPIS" = x ; then
1601          echo "  Turning on PAPI flop summary per timestep"
1602          echo "  Please make sure PAPIINC, PAPILIB are defined"
1603          if test ! "x$FOOLAD" = x ; then
1604                DEFINES="$DEFINES -DUSE_PAPI_FLOPS_SFP"
1605          else
1606                DEFINES="$DEFINES -DUSE_PAPI_FLOPS"
1607          fi
1608          INCLUDES="$INCLUDES $PAPIINC"
1609          LIBS="$LIBS $PAPILIB"
1610          PACKAGES="$PACKAGES showflops"
1611    fi
1612    if test ! "x$PCLS" = x ; then
1613          echo "  Turning on PCL counter summary per timestep"
1614          echo "  Please make sure PCLINC, PCLLIB are defined"
1615          if test ! "x$FOOLAD" = x ; then
1616                DEFINES="$DEFINES -DUSE_PCL_FLOPS_SFP"
1617          else
1618                DEFINES="$DEFINES -DUSE_PCL_FLOPS"
1619          fi
1620          INCLUDES="$INCLUDES $PCLINC"
1621          LIBS="$LIBS $PCLLIB"
1622          PACKAGES="$PACKAGES showflops"
1623    fi
1624    if test ! "x$PAPI" = x ; then
1625          if test ! "x$PAPIS" = x ; then
1626              echo "  PAPI performance analysis and flop summary per timestep cannot co-exist!"
1627              echo "  Sticking with PAPI flop summary per timestep!"
1628          else
1629              echo "  Turning on performance analysis with PAPI"
1630              echo "  Please make sure PAPIINC, PAPILIB are defined"
1631              DEFINES="$DEFINES -DUSE_PAPI"
1632              INCLUDES="$INCLUDES $PAPIINC"
1633              LIBS="$LIBS $PAPILIB"
1634          fi
1635    fi
1636    if test ! "x$PCL" = x ; then
1637          if test ! "x$PCLS" = x ; then
1638              echo "  PCL performance analysis and flop summary per timestep cannot co-exist!"
1639              echo "  Sticking with PCL flop summary per timestep!"
1640          else
1641              echo "  Turning on performance analysis with PCL"
1642              echo "  Please make sure PCLINC, PCLLIB are defined"
1643              DEFINES="$DEFINES -DUSE_PCL"
1644              INCLUDES="$INCLUDES $PCLINC"
1645              LIBS="$LIBS $PCLLIB"
1646          fi
1647    fi
1648    if test ! "x$HPMT" = x ; then
1649          if test ! "x$PAPI" = x ; then
1650              echo "  PAPI and the HPM Toolkit cannot co-exist!"
1651              echo "  Sticking with PAPI!"
1652          else if test ! "x$PCL" = x ; then
1653              echo "  PCL and the HPM Toolkit cannot co-exist!"
1654              echo "  Sticking with PCL!"
1655          else
1656              echo "  Turning on performance analysis with the HPM Toolkit"
1657              echo "  Please make sure HPMTINC, HPMTLIB are defined"
1658              DEFINES="$DEFINES -DUSE_LIBHPM"
1659              INCLUDES="$INCLUDES $HPMTINC"
1660              LIBS="$LIBS $HPMTLIB"
1661          fi
1662          fi
1663    fi
1664    if test ! "x$GSL" = x ; then
1665          echo "  Turning on use of GSL to control floating point calculations"
1666          echo "  Please make sure GSLINC, GSLLIB are defined"
1667          DEFINES="$DEFINES -DUSE_GSL_IEEE"
1668          INCLUDES="$INCLUDES $GSLINC"
1669          LIBS="$LIBS $GSLLIB"
1670    fi
1671    #- if USE_EXTENDED_SRC is set, add EXTENDED_SRC_FLAG to FFLAGS :
1672    if test ! "x$USE_EXTENDED_SRC" = x ; then
1673          FFLAGS="$FFLAGS $EXTENDED_SRC_FLAG"
1674          F90FIXEDFORMAT="$F90FIXEDFORMAT $EXTENDED_SRC_FLAG"
1675    fi
1676    
1677  printf "\n===  Checking system libraries  ===\n"  printf "\n===  Checking system libraries  ===\n"
1678  printf "  Do we have the system() command using $FC...  "  printf "  Do we have the system() command using $FC...  "
1679  cat > genmake_tcomp.f <<EOF  cat > genmake_tcomp.$FS <<EOF
1680        program hello        program hello
1681        call system('echo hi')        call system('echo hi')
1682        end        end
1683  EOF  EOF
1684  $FC $FFLAGS $DEFINES -o genmake_tcomp genmake_tcomp.f > genmake_tcomp.log 2>&1  $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1685  RETVAL=$?  RETVAL=$?
1686  if test "x$RETVAL" = x0 ; then  if test "x$RETVAL" = x0 ; then
1687      HAVE_SYSTEM=t      HAVE_SYSTEM=t
# Line 1011  fi Line 1694  fi
1694  rm -f genmake_tcomp*  rm -f genmake_tcomp*
1695    
1696  printf "  Do we have the fdate() command using $FC...  "  printf "  Do we have the fdate() command using $FC...  "
1697  cat > genmake_tcomp.f <<EOF  cat > genmake_tcomp.$FS <<EOF
1698        program hello        program hello
1699        CHARACTER(128) string        CHARACTER*(128) string
1700        string = ' '        string = ' '
1701        call fdate( string )        call fdate( string )
1702        print *, string        print *, string
1703        end        end
1704  EOF  EOF
1705  $FC $FFLAGS $DEFINES -o genmake_tcomp genmake_tcomp.f > genmake_tcomp.log 2>&1  $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1706  RETVAL=$?  RETVAL=$?
1707  if test "x$RETVAL" = x0 ; then  if test "x$RETVAL" = x0 ; then
1708      HAVE_FDATE=t      HAVE_FDATE=t
# Line 1031  else Line 1714  else
1714  fi  fi
1715  rm -f genmake_tcomp*  rm -f genmake_tcomp*
1716    
1717    printf "  Do we have the etime() command using $FC...  "
1718    cat > genmake_tcomp.$FS <<EOF
1719          program hello
1720          REAL*4 ACTUAL, TARRAY(2)
1721          EXTERNAL ETIME
1722          REAL*4 ETIME
1723          actual = etime( tarray )
1724          print *, tarray
1725          end
1726    EOF
1727    $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1728    RETVAL=$?
1729    if test "x$RETVAL" = x0 ; then
1730        HAVE_ETIME=t
1731        DEFINES="$DEFINES -DHAVE_ETIME"
1732        echo "yes"
1733    else
1734        HAVE_ETIME=
1735        echo "no"
1736    fi
1737    rm -f genmake_tcomp*
1738    
1739  printf "  Can we call simple C routines (here, \"cloc()\") using $FC...  "  printf "  Can we call simple C routines (here, \"cloc()\") using $FC...  "
1740  check_HAVE_CLOC  check_HAVE_CLOC
1741  if test "x$HAVE_CLOC" != x ; then  if test "x$HAVE_CLOC" != x ; then
1742      echo "yes"      echo "yes"
1743  else  else
1744      echo "no"      echo "no"
1745        if test "x$EMBED_SRC" = xt ; then
1746            echo "    WARNING: you requested file embedding but it has"
1747            echo "      been disabled since C code cannot be called"
1748            EMBED_SRC=
1749        fi
1750    fi
1751    rm -f genmake_t*
1752    
1753    printf "  Can we unlimit the stack size using $FC...  "
1754    check_HAVE_SETRLSTK
1755    if test "x$HAVE_SETRLSTK" = xt ; then
1756        echo "yes"
1757    else
1758        echo "no"
1759    fi
1760    rm -f genmake_t*
1761    
1762    printf "  Can we register a signal handler using $FC...  "
1763    check_HAVE_SIGREG
1764    if test "x$HAVE_SIGREG" = xt ; then
1765        echo "yes"
1766    else
1767        echo "no"
1768    fi
1769    rm -f genmake_t*
1770    
1771    printf "  Can we use stat() through C calls...  "
1772    check_HAVE_STAT
1773    if test "x$HAVE_STAT" != x ; then
1774        echo "yes"
1775    else
1776        echo "no"
1777  fi  fi
1778  rm -f genmake_t*  rm -f genmake_t*
1779    
# Line 1047  if test "x$HAVE_NETCDF" != x ; then Line 1784  if test "x$HAVE_NETCDF" != x ; then
1784  else  else
1785      echo "no"      echo "no"
1786  fi  fi
1787    DEFINES="$DEFINES $IGNORE_TIME"
1788    
1789    if test "x$EMBED_SRC" = xt ; then
1790        build_embed_encode
1791    fi
1792    if test "x$EMBED_SRC" = xt ; then
1793        ENABLE="$ENABLE embed_files"
1794    fi
1795    
1796    
1797  printf "\n===  Setting defaults  ===\n"  printf "\n===  Setting defaults  ===\n"
1798  printf "  Adding MODS directories:  "  printf "  Adding MODS directories: "
1799  for d in $MODS ; do  for d in $MODS ; do
1800      if test ! -d $d ; then      if test ! -d $d ; then
1801          echo          echo
1802          echo "Error: MODS directory \"$d\" not found!"          echo "Error: MODS directory \"$d\" not found!"
1803          exit 1          exit 1
1804      else      else
1805          printf " $d"          printf "$d "
1806          SOURCEDIRS="$SOURCEDIRS $d"          SOURCEDIRS="$SOURCEDIRS $d"
1807          INCLUDEDIRS="$INCLUDEDIRS $d"          INCLUDEDIRS="$INCLUDEDIRS $d"
1808      fi      fi
1809  done  done
1810  echo  echo
1811    
 if test "x$MAKEFILE" = x ; then  
     MAKEFILE="Makefile"  
 fi  
1812  if test "x${PLATFORM}" = x ; then  if test "x${PLATFORM}" = x ; then
1813      PLATFORM=$p_PLATFORM      PLATFORM=$p_PLATFORM
1814  fi  fi
1815    
1816  if test "x${EXEDIR}" = x ; then  if test "x${EXEDIR}" = x ; then
1817      if test "${PWD##/*/}" = "bin" -a -d ../exe -a $ROOTDIR = .. ; then      tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1818        if test "x$tmp" = "xbin" -a -d ../exe -a $ROOTDIR = .. ; then
1819          EXEDIR=../exe          EXEDIR=../exe
1820      else      else
1821          EXEDIR=.          EXEDIR=.
# Line 1091  if test ! -d ${TOOLSDIR} ; then Line 1834  if test ! -d ${TOOLSDIR} ; then
1834      exit 1      exit 1
1835  fi  fi
1836  if test "x$S64" = x ; then  if test "x$S64" = x ; then
1837      S64='$(TOOLSDIR)/set64bitConst.sh'      echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.sh > /dev/null 2>&1
1838        RETVAL=$?
1839        if test "x${RETVAL}" = x0 ; then
1840            S64='$(TOOLSDIR)/set64bitConst.sh'
1841        else
1842            echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.csh > /dev/null 2>&1
1843            RETVAL=$?
1844            if test "x${RETVAL}" = x0 ; then
1845                S64='$(TOOLSDIR)/set64bitConst.csh'
1846            else
1847                cat <<EOF
1848    
1849    ERROR: neither of the two default scripts:
1850    
1851        ${TOOLSDIR}/set64bitConst.sh
1852        ${TOOLSDIR}/set64bitConst.csh
1853    
1854      are working so please check paths or specify (with \$S64) a
1855      working version of this script.
1856    
1857    EOF
1858                exit 1
1859            fi
1860        fi
1861  fi  fi
1862  THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`  THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`
1863    
1864  EXECUTABLE=${EXECUTABLE:-mitgcmuv}  EXECUTABLE=${EXECUTABLE:-mitgcmuv}
1865    
1866    #  Set Standard Code Directories:
1867    if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
1868        STANDARDDIRS="eesupp model"
1869    fi
1870    #  if model in Standard-Code-Dir, add eesupp (needed to compile model)
1871    echo " $STANDARDDIRS " | grep ' model ' > /dev/null 2>&1
1872    ckM=$?
1873    echo " $STANDARDDIRS " | grep ' eesupp ' > /dev/null 2>&1
1874    ckE=$?
1875    if test $ckM = 0 -a $ckE = 1 ; then
1876        STANDARDDIRS="$STANDARDDIRS eesupp"
1877    fi
1878    
1879  #  We have a special set of source files in eesupp/src which are  #  We have a special set of source files in eesupp/src which are
1880  #  generated from some template source files. We'll make them first so  #  generated from some template source files. We'll make them first so
1881  #  they appear as regular source code  #  they appear as regular source code
1882  if test -r $ROOTDIR"/eesupp/src/Makefile" ; then  if test -r $ROOTDIR"/eesupp/src/Makefile" ; then
1883      echo "  Making source files in eesupp from templates"      echo "  Making source files in eesupp from templates"
1884      ( cd $ROOTDIR"/eesupp/src/" && $MAKE ) > make_eesupp.errors 2>&1      ( cd $ROOTDIR"/eesupp/src/" && $MAKE clean_old && $MAKE \
1885        ) > make_eesupp.errors 2>&1
1886      RETVAL=$?      RETVAL=$?
1887      if test "x${RETVAL}" = x0 ; then      if test "x${RETVAL}" = x0 ; then
1888          rm -f make_eesupp.errors          rm -f make_eesupp.errors
# Line 1113  if test -r $ROOTDIR"/eesupp/src/Makefile Line 1893  if test -r $ROOTDIR"/eesupp/src/Makefile
1893      fi      fi
1894  fi  fi
1895    
1896  #same for exch2  #same for pkg/exch2 and pkg/regrid
1897  if test -r $ROOTDIR"/pkg/exch2/Makefile" ; then  for pdir in exch2 regrid ; do
1898      echo "  Making source files in exch2 from  templates"      if test -r $ROOTDIR"/pkg/${pdir}/Makefile" ; then
1899      ( cd $ROOTDIR"/pkg/exch2/" && $MAKE ) > make_exch2.errors 2>&1          echo "  Making source files in pkg/${pdir} from templates"
1900      RETVAL=$?          ( cd $ROOTDIR"/pkg/"${pdir} && $MAKE clean_old && $MAKE \
1901      if test "x${RETVAL}" = x0 ; then          ) > make_${pdir}.errors 2>&1
1902          rm -f make_exch2.errors          RETVAL=$?
1903      else          if test "x${RETVAL}" = x0 ; then
1904          echo "Error: problem encountered while building source files in exch2:"              rm -f make_${pdir}.errors
1905          cat make_exch2.errors 1>&2          else
1906          exit 1              echo "Error: problem encountered while building source files in pkg/${pdir}:"
1907                cat make_${pdir}.errors 1>&2
1908                exit 1
1909            fi
1910      fi      fi
1911  fi  done
1912    
1913  printf "\n===  Determining package settings  ===\n"  printf "\n===  Determining package settings  ===\n"
1914  if  test "x${PDEPEND}" = x ; then  if  test "x${PKG_DEPEND}" = x ; then
1915      tmp=$ROOTDIR"/pkg/pkg_depend"      tmp=$ROOTDIR"/pkg/pkg_depend"
1916      if test -r $tmp ; then      if test -r $tmp ; then PKG_DEPEND=$tmp ; fi
1917          PDEPEND=$tmp  fi
1918      else  if  test "x${PKG_DEPEND}" = x ; then
1919          echo "Warning:  No package dependency information was specified."          echo "Warning:  No package dependency information was specified."
1920          echo "  Please check that ROOTDIR/pkg/pkg_depend exists."          echo "  Please check that ROOTDIR/pkg/pkg_depend exists."
     fi  
1921  else  else
1922      if test ! -r ${PDEPEND} ; then      if test ! -r ${PKG_DEPEND} ; then
1923          echo "Error:  can't read package dependency info from PDEPEND=\"$PDEPEND\""          echo "Error:  can't read package dependency info from PKG_DEPEND=\"$PKG_DEPEND\""
1924          exit 1          exit 1
1925      fi      fi
1926        echo "  getting package dependency info from  $PKG_DEPEND"
1927    #  Strip the comments and then convert the dependency file into arrays: PNAME, DNAME
1928        get_pdepend_list $PKG_DEPEND
1929  fi  fi
1930  echo "  getting package dependency info from  $PDEPEND"  
1931  #  Strip the comments and then convert the dependency file into  # A default package groups file "$ROOTDIR/pkg/pkg_groups" is provided
1932  #  two arrays: PNAME, DNAME  #  to define the "default_pkg_list" and package groups (for convenience, one
1933  cat $PDEPEND | sed -e 's/#.*$//g' \  #  can specify a group of packages using names like "ocean" and "atmosphere").
1934      | $AWK 'BEGIN{nn=-1;} (NF>0){ for(i=2;i<=NF;i++){nn++; print "PNAME_"nn"="$1"\nDNAME_"nn"="$i}} END{print "nname="nn}' \  if test "x${PKG_GROUPS}" = x ; then
1935      > ./.pd_tmp      tmp=$ROOTDIR"/pkg/pkg_groups"
1936  RETVAL=$?      if test -r $tmp ; then PKG_GROUPS=$tmp ; fi
1937  if test ! "x${RETVAL}" = x0 ; then  fi
1938      echo "Error: unable to parse package dependencies -- please check PDEPEND=\"$PDEPEND\""  if test "x${PKG_GROUPS}" = x ; then
1939      exit 1          echo "Warning:  No package groups information was specified."
1940            echo "  Please check that ROOTDIR/pkg/pkg_groups exists."
1941    else
1942        if test ! -r ${PKG_GROUPS} ; then
1943            echo "Error:  can't read package groups info from PKG_GROUPS=\"$PKG_GROUPS\""
1944            exit 1
1945        fi
1946        echo "  getting package groups info from      $PKG_GROUPS"
1947  fi  fi
 . ./.pd_tmp  
 rm -f ./.pd_tmp  
1948    
1949  #  Search for default packages.  Note that a "$ROOTDIR/pkg/pkg_groups"  #  Search for packages to compile.
1950  #  file should eventually be added so that, for convenience, one can  echo "  checking list of packages to compile:"
1951  #  specify groups of packages using names like "ocean" and "atmosphere".  PKG_LIST=
1952  echo "  checking default package list:  "  if test "x${PKG_LIST}" = x ; then
 if test "x${PDEFAULT}" = x ; then  
1953      for i in "." $MODS ; do      for i in "." $MODS ; do
1954          if test -r $i"/packages.conf" ; then          if test -r $i"/packages.conf" ; then
1955                  PDEFAULT=$i"/packages.conf"                  PKG_LIST=$i"/packages.conf"
1956                  break                  break
1957          fi          fi
1958      done      done
1959  fi  fi
1960  if test "x${PDEFAULT}" = x ; then  if test "x${PKG_LIST}" = x ; then
1961      PDEFAULT="$ROOTDIR/pkg/pkg_default"      pkg_list='default_pkg_list'
1962  fi      if test "x${PKG_GROUPS}" = x ; then
1963  if test "x${PDEFAULT}" = xNONE ; then          echo "Error:  need package groups info to expand pkg_list=\"$pkg_list\""
1964      echo "    default packages file disabled"          exit 1
1965        fi
1966  else  else
1967      if test ! -r $PDEFAULT ; then      if test ! -r $PKG_LIST ; then
1968          echo "Warning:  can't read default packages from PDEFAULT=\"$PDEFAULT\""          echo "Error:  can't read package list from PKG_LIST=\"$PKG_LIST\""
1969            exit 1
1970      else      else
1971          echo "    using PDEFAULT=\"$PDEFAULT\""          echo "    using PKG_LIST=\"$PKG_LIST\""
1972          #  Strip the comments and add all the names          #  Strip the comments and add all the names
1973          def=`cat $PDEFAULT | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`          pkg_list=`cat $PKG_LIST | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
1974          RETVAL=$?          RETVAL=$?
1975          if test "x${RETVAL}" != x0 ; then          if test "x${RETVAL}" != x0 ; then
1976              printf "Error: can't parse default package list "              printf "Error: can't parse package list "
1977              echo "-- please check PDEFAULT=\"$PDEFAULT\""              echo "-- please check PKG_LIST=\"$PKG_LIST\""
1978              exit 1              exit 1
1979          fi          fi
         for i in $def ; do  
             PACKAGES="$PACKAGES $i"  
         done  
         echo "    before group expansion packages are: $PACKAGES"  
         expand_pkg_groups  
         echo "    after group expansion packages are:  $PACKAGES"  
1980      fi      fi
1981  fi  fi
1982    for i in $pkg_list ; do
1983        PACKAGES="$PACKAGES $i"
1984    done
1985    echo     "    before group expansion packages are:$PACKAGES"
1986    if test "x${PKG_GROUPS}" != x ; then
1987        RET=1
1988        while test $RET = 1 ; do expand_pkg_groups; RET=$?; done
1989        echo "    after group expansion packages are: $PACKAGES"
1990    fi
1991    
1992  echo "  applying DISABLE settings"  echo "  applying DISABLE settings"
1993    echo "" > ./.tmp_pack
1994    for i in $PACKAGES ; do
1995        echo $i >> ./.tmp_pack
1996    done
1997    for i in `grep  "-" ./.tmp_pack` ; do
1998        j=`echo $i | sed 's/[-]//'`
1999        DISABLE="$DISABLE $j"
2000    done
2001  pack=  pack=
2002  for p in $PACKAGES ; do  for p in $PACKAGES ; do
2003      addit="t"      addit="t"
# Line 1212  PACKAGES="$pack" Line 2014  PACKAGES="$pack"
2014  echo "  applying ENABLE settings"  echo "  applying ENABLE settings"
2015  echo "" > ./.tmp_pack  echo "" > ./.tmp_pack
2016  PACKAGES="$PACKAGES $ENABLE"  PACKAGES="$PACKAGES $ENABLE"
2017    # Test if each explicitly referenced package exists
2018  for i in $PACKAGES ; do  for i in $PACKAGES ; do
2019      if test ! -d "$ROOTDIR/pkg/$i" ; then      j=`echo $i | sed 's/[-+]//'`
2020          echo "Error: can't find package $i at \"$ROOTDIR/pkg/$i\""      if test ! -d "$ROOTDIR/pkg/$j" ; then
2021          exit 1          echo "Error: dir '$ROOTDIR/pkg/$i' missing for package '$i'"
2022            exit 1
2023      fi      fi
2024      echo $i >> ./.tmp_pack      echo $i >> ./.tmp_pack
2025  done  done
 pack=`cat ./.tmp_pack | sort | uniq`  
 rm -f ./.tmp_pack  
2026  PACKAGES=  PACKAGES=
2027  for i in $pack ; do  for i in `grep -v "-" ./.tmp_pack | sort | uniq` ; do
2028      PACKAGES="$PACKAGES $i"      PACKAGES="$PACKAGES $i"
2029  done  done
2030  echo "    packages are:  $PACKAGES"  rm -f ./.tmp_pack
2031    echo "    packages are: $PACKAGES"
2032    
2033    #  Check for package MNC: if NetCDF is available, then build the MNC
2034    #  template files ; otherwise, delete mnc from the list of packages.
2035    echo " $PACKAGES " | grep ' mnc ' > /dev/null 2>&1
2036    mnc_in=$?
2037    if test "x$HAVE_NETCDF" != xt ; then
2038        if test "x$mnc_in" = x0 ; then
2039            cat <<EOF
2040    *********************************************************************
2041    WARNING: the "mnc" package was enabled but tests failed to compile
2042      NetCDF applications.  Please check that:
2043    
2044      1) NetCDF is correctly installed for this compiler and
2045      2) the LIBS variable (within the "optfile") specifies the correct
2046           NetCDF library to link against.
2047    
2048      Due to this failure, the "mnc" package is now DISABLED.
2049    *********************************************************************
2050    EOF
2051            PACKAGES=`echo $PACKAGES | sed -e 's/mnc//g'`
2052            DISABLE="$DISABLE mnc"
2053        else
2054        #  this prevent to add mnc (due to pdepend rules) if not available
2055            DISABLE="$DISABLE mnc"
2056        fi
2057    else
2058        # we have NetCDF, we try to build MNC template files
2059        ( cd $ROOTDIR"/pkg/mnc" && $MAKE testclean && $MAKE templates ) > make_mnc.errors 2>&1
2060        RETVAL=$?
2061        if test "x${RETVAL}" = x0 ; then
2062            rm -f make_mnc.errors
2063        else
2064            echo "Error: problem encountered while building source files in pkg/mnc:"
2065            cat make_mnc.errors 1>&2
2066            if test "x$mnc_in" = x0 ; then
2067                exit 1
2068            else
2069                DISABLE="$DISABLE mnc"
2070            fi
2071        fi
2072    fi
2073    
2074    #  Check for package PROFILES: if NetCDF is not available,
2075    #  then delete profiles from the list of available packages.
2076    if test "x$HAVE_NETCDF" != xt ; then
2077        echo " $PACKAGES " | grep ' profiles ' > /dev/null 2>&1
2078        RETVAL=$?
2079        if test "x$RETVAL" = x0 ; then
2080            cat <<EOF
2081    *********************************************************************
2082    WARNING: the "profiles" package was enabled but tests failed to
2083      compile NetCDF applications.  Please check that:
2084    
2085      1) NetCDF is correctly installed for this compiler and
2086      2) the LIBS variable (within the "optfile") specifies the correct
2087           NetCDF library to link against.
2088    
2089  echo "  applying package dependency rules"    Due to this failure, the "profiles" package is now DISABLED.
2090  ck=  *********************************************************************
2091  while test "x$ck" != xtt ; do  EOF
2092            PACKAGES=`echo $PACKAGES | sed -e 's/profiles//g'`
2093            DISABLE="$DISABLE profiles"
2094        else
2095        #  this prevent to add profiles (due to pdepend rules) if not available
2096            DISABLE="$DISABLE profiles"
2097        fi
2098    fi
2099    
2100    if  test "x${PKG_DEPEND}" != x ; then
2101      echo "  applying package dependency rules"
2102      ck=
2103      while test "x$ck" != xtt ; do
2104      i=0      i=0
2105      # rtot=${#PNAME[@]}      # rtot=${#PNAME[@]}
2106      rtot=$nname      rtot=$nname
2107      while test $i -lt $rtot ; do      while test $i -le $rtot ; do
2108    
2109          #  Is $pname in the current $PACKAGES list?          #  Is $pname in the current $PACKAGES list?
2110          #  pname=${PNAME[$i]}          #  pname=${PNAME[$i]}
# Line 1245  while test "x$ck" != xtt ; do Line 2116  while test "x$ck" != xtt ; do
2116                  pin="t"                  pin="t"
2117              fi              fi
2118          done          done
2119            #  or in the current $STANDARDDIRS list?
2120            for p in $STANDARDDIRS ; do
2121                if test "x$p" = "x$pname" ; then pin="t" ; fi
2122            done
2123    
2124          #  Is the DNAME entry a (+) or (-) rule ?          #  Is the DNAME entry a (+) or (-) rule ?
2125          tmp="dname=\"\$DNAME_$i\""          tmp="dname=\"\$DNAME_$i\""
# Line 1267  while test "x$ck" != xtt ; do Line 2142  while test "x$ck" != xtt ; do
2142    
2143          #  Do we need to add $dname according to the dependency rules?          #  Do we need to add $dname according to the dependency rules?
2144          if test "x$pin" = xt -a "x$plus" = "x+" -a "x$din" = xf ; then          if test "x$pin" = xt -a "x$plus" = "x+" -a "x$din" = xf ; then
2145                #echo "   " $pname ": need to add :" $dname
2146              in_dis="f"              in_dis="f"
2147              for dis in $DISABLE ; do              for dis in $DISABLE ; do
2148                  if test "x$dis" = "x$dname" ; then                  if test "x$dis" = "x$dname" ; then
# Line 1287  while test "x$ck" != xtt ; do Line 2163  while test "x$ck" != xtt ; do
2163          #  Do we need to get rid of $dname according to the dependency rules?          #  Do we need to get rid of $dname according to the dependency rules?
2164          if test "x$pin" = xt -a "x$plus" = "x-" -a "x$din" = xt; then          if test "x$pin" = xt -a "x$plus" = "x-" -a "x$din" = xt; then
2165              echo "Error: can't satisfy package dependencies:"              echo "Error: can't satisfy package dependencies:"
2166              echo "  \"$pname\" was requested but is disallowed by"              echo "  \"$pname\" was requested but is disallowed by"
2167              echo "  the dependency rules for \"$dname\""              echo "  the dependency rules for \"$dname\""
2168              exit 1              exit 1
2169          fi          fi
2170          i=$(( $i + 1 ))          i=`echo "$i + 1" | bc -l`
2171            #i=$(( $i + 1 ))
2172      done      done
2173      ck=$ck"t"      ck=$ck"t"
2174  done    done
2175  echo "    packages are:  $PACKAGES"    echo "    packages are: $PACKAGES"
2176    fi
2177  for i in $PACKAGES ; do  for i in $PACKAGES ; do
2178      adr="$ROOTDIR/pkg/$i"      adr="$ROOTDIR/pkg/$i"
2179      if test -d $adr ; then      if test -d $adr ; then
# Line 1310  for i in $PACKAGES ; do Line 2188  for i in $PACKAGES ; do
2188      fi      fi
2189  done  done
2190    
 #  Build MNC templates and check for ability to build and use NetCDF  
 echo $PACKAGES | grep ' mnc ' > /dev/null 2>&1  
 RETVAL=$?  
 if test "x$RETVAL" = x0 ; then  
     ( cd $ROOTDIR"/pkg/mnc" && $MAKE templates ) > make_mnc.errors 2>&1  
     RETVAL=$?  
     if test "x${RETVAL}" = x0 ; then  
         rm -f make_mnc.errors  
     else  
         echo "Error: problem encountered while building source files in pkg/mnc:"  
         cat make_mnc.errors 1>&2  
         exit 1  
     fi  
     if test "x$HAVE_NETCDF" != xt ; then  
         cat <<EOF  
   
 WARNING: the "mnc" package has been enabled but tests failed to  
   compile and/or execute NetCDF applications.  Please check that:  
   
   1) NetCDF is installed for your compiler and  
   2) the LIBS variable (within the 'optfile") specifies the correct  
        NetCDF library to link against.  
     
 EOF  
     fi  
 fi  
   
2191  # Create a list of #define and #undef to enable/disable packages  # Create a list of #define and #undef to enable/disable packages
2192  PACKAGES_DOT_H=PACKAGES_CONFIG.h  PACKAGES_DOT_H=PACKAGES_CONFIG.h
2193  #  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
2194  #  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
2195  #  file would eventually be split up so that all package-related #define  #  file would eventually be split up so that all package-related #define
2196  #  statements could be separated and handled only by genmake.  #  statements could be separated and handled only by genmake.
2197  names=`ls -1 "$ROOTDIR/pkg"`  names=`ls -1 "$ROOTDIR/pkg"`
# Line 1356  for n in $names ; do Line 2207  for n in $names ; do
2207              fi              fi
2208          done          done
2209          if test "x$has_pack" = xf ; then          if test "x$has_pack" = xf ; then
2210              undef=`echo "ALLOW_$n" | $AWK '{print toupper($0)}'`              undef=`echo "ALLOW_$n" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2211              DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"              DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
2212          fi          fi
2213      fi      fi
2214  done  done
2215  ENABLED_PACKAGES=  ENABLED_PACKAGES=
2216  for i in $PACKAGES ; do  for i in $PACKAGES ; do
2217      def=`echo "ALLOW_$i" | $AWK '{print toupper($0)}'`      def=`echo "ALLOW_$i" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2218      ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"      ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
2219  #eh3 DEFINES="$DEFINES -D$def"  #eh3 DEFINES="$DEFINES -D$def"
2220    
2221  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!
2222      case $i in      case $i in
2223          aim_v23)          aim_v23)
2224              ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"              ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
2225              echo "Warning: ALLOW_AIM is set to enable aim_v23."              echo "Warning: ALLOW_AIM is set to enable aim_v23."
# Line 1378  for i in $PACKAGES ; do Line 2229  for i in $PACKAGES ; do
2229    
2230  done  done
2231    
2232  echo "  Adding STANDARDDIRS"  echo "  Adding STANDARDDIRS='$STANDARDDIRS'"
2233  BUILDDIR=${BUILDDIR:-.}  BUILDDIR=${BUILDDIR:-.}
 if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then  
     STANDARDDIRS="eesupp model"  
 fi  
2234  if test "x$STANDARDDIRS" != x ; then  if test "x$STANDARDDIRS" != x ; then
2235      for d in $STANDARDDIRS ; do      for d in $STANDARDDIRS ; do
2236          adr="$ROOTDIR/$d/src"          adr="$ROOTDIR/$d/src"
# Line 1437  fi Line 2285  fi
2285    
2286  #  Here, we build the list of files to be "run through" the adjoint  #  Here, we build the list of files to be "run through" the adjoint
2287  #  compiler.  #  compiler.
2288  if test -f ./ad_files ; then  if test -f ./adSrcFiles.tmp ; then
2289      rm -f ./ad_files      rm -f ./adSrcFiles.tmp
2290  fi  fi
2291  echo "  Creating the list of files for the adjoint compiler."  echo "  Creating the list of files for the adjoint compiler."
2292    touch adSrcFiles.tmp
2293  for i in $SOURCEDIRS ; do  for i in $SOURCEDIRS ; do
2294      list_files=`( cd $i && ls -1 *.list 2>/dev/null )`      list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
2295      for j in $list_files ; do      for j in $list_files ; do
2296          cat $i/$j >> ad_files          cat $i/$j >> adSrcFiles.tmp
2297      done      done
2298  done  done
2299    if test ! "x"$FS = "x.f" ; then
2300        cat adSrcFiles.tmp | sed -e "s/\.f/.$FS/g" > adSrcFiles.tmp_f
2301        mv -f adSrcFiles.tmp_f adSrcFiles.tmp
2302    fi
2303    
2304  echo  echo
2305  echo "===  Creating the Makefile  ==="  echo "===  Creating the Makefile  ==="
2306  echo "  setting INCLUDES"  echo "  setting INCLUDES"
2307  for i in $INCLUDEDIRS ; do  for i in $INCLUDEDIRS ; do
2308      if ! test -d $i ; then      if test ! -d $i ; then
 #       INCLUDES="$INCLUDES -I$i"  
 #   else  
2309          echo "Warning: can't find INCLUDEDIRS=\"$i\""          echo "Warning: can't find INCLUDEDIRS=\"$i\""
2310      fi      fi
2311  done  done
2312    
2313    if test ! "x$DIVA" = x ; then
2314        echo "  Creating the pseudo-MPI include directory"
2315        INCLUDES="-I./mpi_headers $INCLUDES"
2316        rm -rf ./mpi_headers
2317        mkdir -p ./mpi_headers
2318    
2319        if test "x$MPIINCLUDEDIR" = x ; then
2320            if test "x$MPIHOME" = x ; then
2321                MPIHOME='/usr'
2322            fi
2323            MPIINCLUDEDIR='$MPIHOME/include'
2324        fi
2325    
2326        if test -r $MPIINCLUDEDIR/mpif.h ; then
2327            for i in $MPI_HEADER_FILES; do
2328                cp -p $MPIINCLUDEDIR/$i ./mpi_headers
2329            done
2330    
2331            perl -i -pe 's/MPI_DISPLACEMENT_CURRENT=-1_8/MPI_DISPLACEMENT_CURRENT=-1/g' mpi_headers/mpif.h
2332        else
2333            echo " We cannot create a copy of mpif.h!"
2334    #       exit -1
2335        fi
2336    fi
2337    
2338  echo "  Determining the list of source and include files"  echo "  Determining the list of source and include files"
2339  rm -rf .links.tmp  rm -rf .links.tmp
2340  mkdir .links.tmp  mkdir .links.tmp
2341    touch .links.tmp/foo
2342    if test ! -r ".links.tmp/foo" ; then
2343        echo
2344        echo "ERROR : something is wrong with your directory permissions or"
2345        echo "   your user file-creation mask (\"umask\") since creating a"
2346        echo "   sub-dir, touch-ing a file within it, and then reading it is"
2347        echo "   not working.  Please try setting your umask to something"
2348        echo "   sane such as:"
2349        echo
2350        echo "      umask 0002"
2351        echo
2352        echo "   and please verify that you have the proper permissions for"
2353        echo "   creating sub-directories and then reading files created"
2354        echo "   within them."
2355        echo
2356        exit 1
2357    fi
2358    rm -f .links.tmp/foo
2359    
2360    if test "x$OPENAD" != x ; then
2361        OAD_DONT_COMPILE="/dev/null"
2362        OAD_DONT_TRANSFORM="/dev/null"
2363        OAD_KEEP_ORIGINAL="/dev/null"
2364        OAD_CB2M_FILES="/dev/null"
2365        echo "  looking for dontCompile file:  "
2366        for i in "." $MODS ; do
2367            if test -r $i"/dontCompile" ; then
2368                OAD_DONT_COMPILE=$i"/dontCompile"
2369                echo "     found $OAD_DONT_COMPILE"
2370                break
2371            fi
2372        done
2373        echo "  looking for dontTransform file:  "
2374        for i in "." $MODS ; do
2375            if test -r $i"/dontTransform" ; then
2376                OAD_DONT_TRANSFORM=$i"/dontTransform"
2377                echo "     found $OAD_DONT_TRANSFORM"
2378                break
2379            fi
2380        done
2381        echo "  looking for keepOriginal file:  "
2382        for i in "." $MODS ; do
2383            if test -r $i"/keepOriginal" ; then
2384                OAD_KEEP_ORIGINAL=$i"/keepOriginal"
2385                echo "     found $OAD_KEEP_ORIGINAL"
2386                break
2387            fi
2388        done
2389        echo "  looking for cb2mFiles:  "
2390        for i in "." $MODS ; do
2391            if test -r $i"/cb2mFiles" ; then
2392                OAD_CB2M_FILES=$i"/cb2mFiles"
2393                echo "     found $OAD_CB2M_FILES"
2394                break
2395            fi
2396        done
2397        echo "   OpenAD exceptions:  "
2398    fi
2399    
2400  echo "# This section creates symbolic links" > srclinks.tmp  echo "# This section creates symbolic links" > srclinks.tmp
2401  echo "" >> srclinks.tmp  echo "" >> srclinks.tmp
2402  printf 'SRCFILES = '    > srclist.inc  printf 'F77_SRC_FILES = ' > F77srclist.tmp
2403  printf 'CSRCFILES = '   > csrclist.inc  printf 'NON_AD_F77_SRC_FILES = ' > nonADF77srclist.tmp
2404  printf 'F90SRCFILES = ' > f90srclist.inc  printf 'C_SRC_FILES = '   > csrclist.tmp
2405  printf 'HEADERFILES = ' > hlist.inc  printf 'F90_SRC_FILES = ' > F90srclist.tmp
2406  printf 'AD_FLOW_FILES = ' > ad_flow_files.inc  printf 'H_SRC_FILES = '   > hsrclist.tmp
2407    printf 'AD_FLOW_FILES = ' > ad_flow_files.tmp
2408  alldirs="$SOURCEDIRS $INCLUDEDIRS ."  alldirs="$SOURCEDIRS $INCLUDEDIRS ."
2409  for d in $alldirs ; do  for d in $alldirs ; do
2410      deplist=      deplist=
2411      sfiles=`( cd $d; echo *.[h,c,F] *.flow )`      sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
2412      sfiles=`( echo $sfiles; cd $d; echo *.F90 )`      sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
2413        if test "x$OPENAD" != x ; then
2414            sfiles=`( echo $sfiles | grep -v _cb2m\. )`
2415        fi
2416      for sf in $sfiles ; do      for sf in $sfiles ; do
2417          if test ! -r ".links.tmp/$sf" ; then          if test ! -r ".links.tmp/$sf" ; then
2418              if test -f "$d/$sf" ; then              if test -f "$d/$sf" ; then
2419                    ignore_f=f
2420                  case $d/$sf in                  case $d/$sf in
2421                    ./$PACKAGES_DOT_H)                    ./$PACKAGES_DOT_H)
2422                            ignore_f=t
2423                          ;;                          ;;
2424                    ./AD_CONFIG.h)                    ./AD_CONFIG.h)
2425                            ignore_f=t
2426                          ;;                          ;;
2427                    ./FC_NAMEMANGLE.h)                    ./FC_NAMEMANGLE.h)
2428                            ignore_f=t
2429                            ;;
2430                      ./BUILD_INFO.h)
2431                            ignore_f=t
2432                            ;;
2433                      ./EMBEDDED_FILES.h)
2434                            ignore_f=t
2435                          ;;                          ;;
2436                    *)                    *)
2437                          touch .links.tmp/$sf                          #  For the local directory *ONLY*,
2438                          deplist="$deplist $sf"                          #  ignore all soft-links
2439                            if test "x$HAVE_TEST_L" = xt -a "x$d" = x. -a -L $sf ; then
2440                                ignore_f=t
2441                            else
2442                                touch .links.tmp/$sf
2443                                deplist="$deplist $sf"
2444                            fi
2445                          ;;                          ;;
2446                  esac                  esac
2447                  extn=`echo $sf | $AWK -F '.' '{print $NF}'`                  if test "x$ignore_f" = xf ; then
2448                  case $extn in                      extn=`echo $sf | $AWK -F. '{print $NF}'`
2449                      F)                      case $extn in
2450                          echo    " \\"  >> srclist.inc                        F)
2451                          printf " $sf" >> srclist.inc                          echo    " \\"  >> F77srclist.tmp
2452                            printf " $sf" >> F77srclist.tmp
2453                            if test "x$OPENAD" != x ; then
2454                                basename=${sf%%.F}
2455                                isAD=`egrep ^$basename.f'[  ]*' adSrcFiles.tmp`
2456                                if test -z "$isAD" ; then
2457                                    toBeIgnored=`egrep ^$basename'[      ]*' ${OAD_DONT_COMPILE}`
2458                                    if test -z "$toBeIgnored" ; then
2459                                        echo    " \\"  >> nonADF77srclist.tmp
2460                                        printf " $sf" >> nonADF77srclist.tmp
2461                                    else
2462                                        echo "    not to be compiled   :  $sf"
2463                                    fi
2464                                else # file is initially listed as an AD file we want to exclude it
2465                                     # or we want to retain the untransformed version
2466                                    notToBeTransformed=`egrep ^$basename'[      ]*' ${OAD_DONT_TRANSFORM}`
2467                                    untransformedVersionToBeKept=`egrep ^$basename'[      ]*' ${OAD_KEEP_ORIGINAL}`
2468                                    if test -n "$notToBeTransformed"; then
2469                                        echo "    not to be transformed:  $sf"
2470                                    fi
2471                                    if test -n "$untransformedVersionToBeKept" ; then
2472                                        echo "    original to be kept  :  $sf"
2473                                    fi
2474                                    if test -n "$notToBeTransformed" -o -n "$untransformedVersionToBeKept" ; then
2475                                        echo    " \\"  >> nonADF77srclist.tmp
2476                                        printf " $sf" >> nonADF77srclist.tmp
2477                                    fi
2478                                fi
2479                            fi
2480                          ;;                          ;;
2481                      F90)                      F90)
2482                          echo    " \\"  >> f90srclist.inc                          echo    " \\"  >> F90srclist.tmp
2483                          printf " $sf" >> f90srclist.inc                          printf " $sf" >> F90srclist.tmp
2484                          ;;                          ;;
2485                      c)                      c)
2486                          echo    " \\"  >> csrclist.inc                          echo    " \\"  >> csrclist.tmp
2487                          printf " $sf" >> csrclist.inc                          printf " $sf" >> csrclist.tmp
2488                          ;;                          ;;
2489                      h)                      h)
2490                          echo    " \\"  >> hlist.inc                          echo    " \\"  >> hsrclist.tmp
2491                          printf " $sf" >> hlist.inc                          printf " $sf" >> hsrclist.tmp
2492                          ;;                          ;;
2493                      flow)                      flow)
2494                          echo    " \\"  >> ad_flow_files.inc                          echo    " \\"  >> ad_flow_files.tmp
2495                          printf " $sf" >> ad_flow_files.inc                          printf " $sf" >> ad_flow_files.tmp
2496                          ;;                          ;;
2497                  esac                     esac
2498                    fi
2499              fi              fi
2500          fi          fi
2501      done      done
2502      if test "x$deplist" != x ; then      if test "x$deplist" != x ; then
2503          echo "" >> srclinks.tmp        if test "$d" != "." ; then
2504            echo "" >> srclinks.tmp
2505          echo "#  These files are linked from $d" >> srclinks.tmp          echo "#  These files are linked from $d" >> srclinks.tmp
2506          echo "$deplist :" >> srclinks.tmp          echo "$deplist :" >> srclinks.tmp
2507          printf "\t\$(LN) %s/\$@ \$@\n" $d >> srclinks.tmp  # We need to make sure that the link isn't already there.
2508    # This may happen when make thinks that a header file has to be "remade"
2509    # because a module it depends on has changed.  In this case we do nothing.
2510            printf "\tif [ ! -L \$@ ]; then \$(LN) %s/\$@ \$@; fi\n" $d >> srclinks.tmp
2511          fi
2512      fi      fi
2513  done  done
2514  rm -rf .links.tmp  rm -rf .links.tmp
2515  echo "" >> srclist.inc  echo "" >> F77srclist.tmp
2516  echo "" >> csrclist.inc  echo "" >> nonADF77srclist.tmp
2517  echo "" >> f90srclist.inc  echo "" >> csrclist.tmp
2518  echo "" >> hlist.inc  echo "" >> F90srclist.tmp
2519  echo "" >> ad_flow_files.inc  echo "" >> hsrclist.tmp
2520    echo "" >> ad_flow_files.tmp
2521    
2522    CMDLINE=$0
2523    for xx in "$@" ; do nw=`echo $xx | wc -w`
2524        if test $nw = '1' ; then CMDLINE="$CMDLINE $xx"
2525                            else CMDLINE="$CMDLINE '$xx'" ; fi
2526    done
2527    
2528  if test -e $MAKEFILE ; then  if test -f $MAKEFILE ; then
2529      mv -f $MAKEFILE "$MAKEFILE.bak"      mv -f $MAKEFILE "$MAKEFILE.old"
2530  fi  fi
2531  echo "  Writing makefile: $MAKEFILE"  echo "  Writing makefile: $MAKEFILE"
2532  echo "# Multithreaded + multi-processing makefile for:" > $MAKEFILE  echo "# Multithreaded + multi-processing makefile for:" > $MAKEFILE
# Line 1539  echo "#    $MACHINE" >> $MAKEFILE Line 2534  echo "#    $MACHINE" >> $MAKEFILE
2534  echo "# This makefile was generated automatically on" >> $MAKEFILE  echo "# This makefile was generated automatically on" >> $MAKEFILE
2535  echo "#    $THISDATE" >> $MAKEFILE  echo "#    $THISDATE" >> $MAKEFILE
2536  echo "# by the command:" >> $MAKEFILE  echo "# by the command:" >> $MAKEFILE
2537  echo "#    $0 $G2ARGS" >> $MAKEFILE  echo "#    $CMDLINE"  >> $MAKEFILE
2538  echo "# executed by:" >> $MAKEFILE  echo "# executed by:" >> $MAKEFILE
2539  echo "#    $USER@${THISHOSTNAME}:${THISCWD}" >> $MAKEFILE  echo "#    ${THISUSER}@${THISHOST}:${THISCWD}" >> $MAKEFILE
2540    
2541  EXE_AD=$EXECUTABLE"_ad"  EXE_AD=$EXECUTABLE"_ad"
2542  EXE_FTL=$EXECUTABLE"_ftl"  EXE_FTL=$EXECUTABLE"_ftl"
# Line 1550  EXE_SVD=$EXECUTABLE"_svd" Line 2545  EXE_SVD=$EXECUTABLE"_svd"
2545  cat >>$MAKEFILE <<EOF  cat >>$MAKEFILE <<EOF
2546  #  #
2547  # OPTFILE="$OPTFILE"  # OPTFILE="$OPTFILE"
2548  #  #
2549  # BUILDDIR     : Directory where object files are written  # BUILDDIR     : Directory where object files are written
2550  # SOURCEDIRS   : Directories containing the source (.F) files  # SOURCEDIRS   : Directories containing the source (.F) files
2551  # INCLUDEDIRS  : Directories containing the header-source (.h) files  # INCLUDEDIRS  : Directories containing the header-source (.h) files
# Line 1570  cat >>$MAKEFILE <<EOF Line 2565  cat >>$MAKEFILE <<EOF
2565  # LIBS         : Library flags /or/ additional optimization/debugging flags  # LIBS         : Library flags /or/ additional optimization/debugging flags
2566    
2567  ROOTDIR     = ${ROOTDIR}  ROOTDIR     = ${ROOTDIR}
2568  BUILDDIR    = ${BUILDDIR}    BUILDDIR    = ${BUILDDIR}
2569  SOURCEDIRS  = ${SOURCEDIRS}  SOURCEDIRS  = ${SOURCEDIRS}
2570  INCLUDEDIRS = ${INCLUDEDIRS}  INCLUDEDIRS = ${INCLUDEDIRS}
2571  EXEDIR      = ${EXEDIR}  EXEDIR      = ${EXEDIR}
# Line 1587  ENABLED_PACKAGES = ${ENABLED_PACKAGES} Line 2582  ENABLED_PACKAGES = ${ENABLED_PACKAGES}
2582  DISABLED_PACKAGES = ${DISABLED_PACKAGES}  DISABLED_PACKAGES = ${DISABLED_PACKAGES}
2583    
2584  # These files are created by Makefile  # These files are created by Makefile
2585  SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h  SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h BUILD_INFO.h
   
2586  EOF  EOF
2587    
2588  #  Note: figure out some way to add Hyades JAM libraries here  if test "x$EMBED_SRC" = xt ; then
2589        echo "EMBEDDED_FILES = EMBEDDED_FILES.h" >>$MAKEFILE
2590    else
2591        echo "EMBEDDED_FILES = " >>$MAKEFILE
2592    fi
2593    
2594  cat >>$MAKEFILE <<EOF  cat >>$MAKEFILE <<EOF
2595  # Unix ln (link)  # Unix ln (link)
2596  LN = ${LN}  LN = ${LN}
# Line 1606  KPP = ${KPP} Line 2604  KPP = ${KPP}
2604  FC = ${FC}  FC = ${FC}
2605  # Fortran compiler  # Fortran compiler
2606  F90C = ${F90C}  F90C = ${F90C}
2607    # C compiler
2608    CC = ${CC}
2609  # Link editor  # Link editor
2610  LINK = ${LINK} ${LDADD}  LINK = ${LINK} ${LDADD}
2611    
# Line 1617  INCLUDES = ${INCLUDES} Line 2617  INCLUDES = ${INCLUDES}
2617  KFLAGS1 = ${KFLAGS1}  KFLAGS1 = ${KFLAGS1}
2618  KFLAGS2 = ${KFLAGS2}  KFLAGS2 = ${KFLAGS2}
2619  # Optim./debug for FC  # Optim./debug for FC
2620  FFLAGS = ${FFLAGS}  FFLAGS = ${FFLAGS} ${FEXTRAFLAGS}
2621  FOPTIM = ${FOPTIM}  FOPTIM = ${FOPTIM}
2622  # Optim./debug for FC  # Optim./debug for FC
2623  F90FLAGS = ${F90FLAGS}  F90FLAGS = ${F90FLAGS}
2624  F90OPTIM = ${F90OPTIM}  F90OPTIM = ${F90OPTIM}
2625    F90FIXEDFORMAT = ${F90FIXEDFORMAT}
2626  # Flags for CC  # Flags for CC
2627  CFLAGS = ${CFLAGS}  CFLAGS = ${CFLAGS}
2628  # Files that should not be optimized  # Files that should not be optimized
2629  NOOPTFILES = ${NOOPTFILES}  NOOPTFILES = ${NOOPTFILES}
2630  NOOPTFLAGS = ${NOOPTFLAGS}  NOOPTFLAGS = ${NOOPTFLAGS}
2631  # Flags and libraries needed for linking  # Flags and libraries needed for linking
2632  LIBS = ${LIBS} \$(XLIBS)  LIBS = ${LIBS}
2633  # Name of the Mekfile  # Name of the Mekfile
2634  MAKEFILE=${MAKEFILE}  MAKEFILE=${MAKEFILE}
2635    
2636  EOF  EOF
2637    
2638  cat srclist.inc       >> $MAKEFILE  cat F77srclist.tmp      >> $MAKEFILE
2639  cat csrclist.inc      >> $MAKEFILE  cat nonADF77srclist.tmp >> $MAKEFILE
2640  cat f90srclist.inc    >> $MAKEFILE  cat csrclist.tmp        >> $MAKEFILE
2641  cat hlist.inc         >> $MAKEFILE  cat F90srclist.tmp      >> $MAKEFILE
2642  cat ad_flow_files.inc >> $MAKEFILE  cat hsrclist.tmp        >> $MAKEFILE
2643  echo               >> $MAKEFILE  cat ad_flow_files.tmp   >> $MAKEFILE
 echo 'F77FILES =  $(SRCFILES:.F=.f)'                                           >> $MAKEFILE  
 echo 'F90FILES =  $(F90SRCFILES:.F90=.f90)'                                    >> $MAKEFILE  
 echo 'OBJFILES =  $(SRCFILES:.F=.o) $(CSRCFILES:.c=.o) $(F90SRCFILES:.F90=.o)' >> $MAKEFILE  
2644    
2645  rm -f srclist.inc csrclist.inc hlist.inc flist.tmp clist.tmp f90srclist.inc  rm -f F77srclist.tmp nonADF77srclist.tmp csrclist.tmp F90srclist.tmp hsrclist.tmp ad_flow_files.tmp
 rm -f ad_flow_files.inc  
2646    
2647  cat >>$MAKEFILE <<EOF  echo >> $MAKEFILE
2648    
2649  .SUFFIXES:  # add definitions for preprocessed sources
2650  .SUFFIXES: .o .f .p .F .c .F90 .f90  # and note that not all systems allow case sensitive extensions
2651    # hence the $FS and $FS90 here.
2652    # for fixed format f90 files we use ff90 or FF90 resp
2653    # but these are not expected to be the original source files
2654    
2655    echo 'F77_PP_SRC_FILES = $(F77_SRC_FILES:.F=.'$FS')'      >> $MAKEFILE
2656    echo 'F90_PP_SRC_FILES = $(F90_SRC_FILES:.F90=.'$FS90')' >> $MAKEFILE
2657    echo 'OBJFILES= $(F77_SRC_FILES:.F=.o) $(C_SRC_FILES:.c=.o) $(F90_SRC_FILES:.F90=.o)' >> $MAKEFILE
2658    echo 'FLOFILES =  $(AD_FLOW_FILES:.flow=.flowdir)' >> $MAKEFILE
2659    echo >> $MAKEFILE
2660    echo '.SUFFIXES:' >> $MAKEFILE
2661    echo '.SUFFIXES: .o .'$FS' .p .F .c .f'$FS90' .'$FS90' .FF90 .F90 .flowdir .flow' >> $MAKEFILE
2662    
2663    cat >>$MAKEFILE <<EOF
2664    
2665  all: \$(EXECUTABLE)  all: \$(EXECUTABLE)
2666  \$(EXECUTABLE): \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(OBJFILES)  \$(EXECUTABLE): \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(OBJFILES) \$(EMBEDDED_FILES)
2667          @echo Creating \$@ ...          @echo Creating \$@ ...
2668          \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)          \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
2669  depend:  depend:
2670          @make links          @make links
2671          \$(MAKEDEPEND) -o .f \$(DEFINES) \$(INCLUDES) \$(SRCFILES)          \$(MAKEDEPEND) -o .$FS \$(DEFINES) \$(INCLUDES) \$(F77_SRC_FILES)
2672          \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)          \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
2673          -rm -f makedepend.out          -rm -f makedepend.out
2674    
2675  links: \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(SPECIAL_FILES)  lib: libmitgcmuv.a
2676    
2677  small_f: \$(F77FILES) \$(F90FILES)  libmitgcmuv.a: \$(OBJFILES)
2678            ar rcv libmitgcmuv.a \$(OBJFILES)
2679            ar d   libmitgcmuv.a main.o
2680    
2681    links: \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(SPECIAL_FILES)
2682    
2683    small_f: \$(F77_PP_SRC_FILES) \$(F90_PP_SRC_FILES)
2684    
2685  output.txt: \$(EXECUTABLE)  output.txt: \$(EXECUTABLE)
2686          @printf 'running ... '          @printf 'running ... '
2687          @\$(EXECUTABLE) > \$@          @\$(EXECUTABLE) > \$@
2688    
2689  clean:  clean:
2690          -rm -rf *.o *.f *.p *.f90 *.mod ${RMFILES} work.{pc,pcl} *.template          -rm -rf *.p *.$FS90 *.mod ${RMFILES} work.{pc,pcl} *.template
2691            -rm -rf *.o
2692            -rm -rf *.$FS *.flowdir
2693            -rm -rf *.f$FS90 \$(AD_CLEAN) ad_input*
2694  Clean:  Clean:
2695          @make clean          @make clean
2696          @make cleanlinks          @make cleanlinks
2697          -rm -f \$(SPECIAL_FILES)          -rm -f \$(SPECIAL_FILES)
2698          -rm -f genmake_state genmake_*optfile genmake_warnings make.log run.log *.bak          -rm -f genmake_state genmake_*optfile genmake_warnings genmake_errors
2699            -rm -f make.log run.log f90mkdepend.log *.bak "$MAKEFILE.old"
2700            -rm -f taf_command taf_output taf_ad.log taf_ad_flow.log
2701  CLEAN:  CLEAN:
2702          @make Clean          @make Clean
2703          -find \$(EXEDIR) -name "*.meta" -exec rm {} \;          -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
2704          -find \$(EXEDIR) -name "*.data" -exec rm {} \;          -find \$(EXEDIR) -name "*.data" -exec rm {} \;
2705          -find \$(EXEDIR) -name "fort.*" -exec rm {} \;          -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
2706          -rm -f \$(EXECUTABLE) output.txt          -rm -f \$(EXECUTABLE) \$(EXE_AD) *.txt STD* *diagnostics.log datetime
2707            -rm -f *_MIT_CE_000.opt0000 costfunction*0000
2708            -rm -rf mnc_test_*
2709    
2710  #eh3 Makefile: makefile  #eh3 Makefile: makefile
2711  makefile:  makefile:
# Line 1690  makefile: Line 2713  makefile:
2713  cleanlinks:  cleanlinks:
2714          -find . -type l -exec rm {} \;          -find . -type l -exec rm {} \;
2715    
2716  # Special targets ($SPECIAL_FILES) which are create by make  # Special targets (SPECIAL_FILES) which are created by make
2717  ${PACKAGES_DOT_H}:  ${PACKAGES_DOT_H}:
2718          @echo Creating \$@ ...          @echo Creating \$@ ...
2719          @$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) > \$@          @$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) > \$@
# Line 1701  FC_NAMEMANGLE.h: Line 2724  FC_NAMEMANGLE.h:
2724          @echo Creating \$@ ...          @echo Creating \$@ ...
2725          echo "$FC_NAMEMANGLE" > \$@          echo "$FC_NAMEMANGLE" > \$@
2726    
2727  # The normal chain of rules is (  .F - .f - .o  )  BUILD_INFO.h:
2728  .F.f:          @echo Creating \$@ ...
2729    EOF
2730    
2731    test ! "x$THISVER" = x  && echo "       -echo \"#define THISVER '$THISVER'\" > \$@"   >> $MAKEFILE
2732    test ! "x$THISUSER" = x && echo "       -echo \"#define THISUSER '$THISUSER'\" >> \$@" >> $MAKEFILE
2733    test ! "x$THISDATE" = x && echo "       -echo \"#define THISDATE '$THISDATE'\" >> \$@" >> $MAKEFILE
2734    test ! "x$THISHOST" = x && echo "       -echo \"#define THISHOST '$THISHOST'\" >> \$@" >> $MAKEFILE
2735    
2736    if test "x$EMBED_SRC" = xt ; then
2737        cat >>$MAKEFILE <<EOF
2738    
2739    decode_files.o : EMBEDDED_FILES.h
2740    
2741    ##  \$(F77_PP_SRC_FILES)
2742    all_fF.tar.gz : \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(F77_PP_SRC_FILES) Makefile
2743            @echo Creating \$@ ...
2744            -tar -hcf all_fF.tar \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(F77_PP_SRC_FILES) Makefile
2745            -rm -f all_fF.tar.gz
2746            -gzip all_fF.tar
2747    
2748    EMBEDDED_FILES.h : all_fF.tar.gz
2749            @echo Creating \$@ ...
2750            -\${ROOTDIR}/tools/embed_encode/encode_files EMBEDDED_FILES.h all_fF.tar.gz
2751    
2752    EOF
2753    fi
2754    
2755    cat >>$MAKEFILE <<EOF
2756    
2757    # The normal chain of rules is (  .F - .$FS - .o  )
2758    
2759    ## This nullifies any default implicit rules concerning these two file types:
2760    ## %.o : %.F
2761    
2762    .F.$FS:
2763          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2764  .f.o:  .$FS.o:
2765          \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<          \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
2766  .F90.f90:  .F90.$FS90:
2767            \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2768    .FF90.f$FS90:
2769          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2770  .f90.o:  .$FS90.o:
2771          \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<          \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
2772    .f$FS90.o:
2773            cp \$< \$(basename  \$<).f90
2774            \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$(F90FIXEDFORMAT) \$(basename  \$<).f90
2775  .c.o:  .c.o:
2776          \$(CC) \$(CFLAGS) -c \$<          \$(CC) \$(CFLAGS) \$(DEFINES) \$(INCLUDES) -c \$<
2777    .flow.flowdir:
2778            \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2779    
2780  # Special exceptions that use the ( .F - .p - .f - .o ) rule-chain  # Special exceptions that use the ( .F - .p - .$FS - .o ) rule-chain
2781  .F.p:  .F.p:
2782          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2783  .p.f:  .p.$FS:
2784          \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<          \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
2785    
2786    EOF
2787    
2788  #=========================================  #=========================================
2789  #===  Automatic Differentiation Rules  ===  #===  Automatic Differentiation Rules  ===
2790    #===  for TAMC/TAF  ======================
2791    
2792    if test "x$OPENAD" = x ; then
2793    
2794    cat >>$MAKEFILE <<EOF
2795    
2796  TAMC           = ${TAMC}  TAMC           = ${TAMC}
2797  TAF            = ${TAF}  TAF            = ${TAF}
# Line 1735  ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF Line 2806  ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF
2806  ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"  ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
2807  for i in $ad_vars ; do  for i in $ad_vars ; do
2808      name=$i      name=$i
2809      t1="t2=\$"`echo $i`      t1="t2=\$"`echo "$i"`
2810      eval $t1      eval $t1
2811      printf "%-20s = " $name >> $MAKEFILE      printf "%-20s = " $name >> $MAKEFILE
2812      echo $t2 >> $MAKEFILE      echo "$t2" | sed -e 's| \+| |g' >> $MAKEFILE
2813  done  done
2814    
2815  echo "  Add the source list for AD code generation"  echo "  Add the source list for AD code generation"
2816  echo >> $MAKEFILE  echo >> $MAKEFILE
2817  printf "AD_FILES = " >> $MAKEFILE  printf "AD_FILES = " >> $MAKEFILE
2818  AD_FILES=`cat ad_files`  AD_FILES=`cat adSrcFiles.tmp`
2819  for i in $AD_FILES ; do  for i in $AD_FILES ; do
2820      echo    " \\" >> $MAKEFILE      echo    " \\" >> $MAKEFILE
2821      printf " $i" >> $MAKEFILE      printf " $i" >> $MAKEFILE
2822  done  done
2823  echo >> $MAKEFILE  echo >> $MAKEFILE
2824  rm -f ad_files  rm -f adSrcFiles.tmp
2825    
2826  cat >>$MAKEFILE <<EOF  cat >>$MAKEFILE <<EOF
2827    
2828  # ... AD ...  # ... AD ...
2829  adall: ad_taf  adall: \$(EXE_AD)
2830  adtaf: ad_taf_output.f  adtaf: ad_taf_output.$FS
2831  adtamc: ad_tamc_output.f  adtamc: ad_tamc_output.$FS
2832    
2833  ad_input_code.f: \$(AD_FILES) \$(HEADERFILES)  ad_input_code.$FS: \$(AD_FILES) \$(H_SRC_FILES) \$(AD_FLOW_FILES)
2834          @$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          @$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
2835          cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h          cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
2836          -rm -f ad_config.template          -rm -f ad_config.template
2837          @make \$(F77FILES)          @make \$(F77_PP_SRC_FILES)
2838          @make \$(AD_FLOW_FILES)          @make \$(FLOFILES)
2839          cat \$(AD_FLOW_FILES) \$(AD_FILES) > ad_input_code.f          cat \$(FLOFILES) \$(AD_FILES) | sed -f \$(TOOLSDIR)/remove_comments_sed > ad_input_code.$FS
2840    
2841  ad_taf_output.f: ad_input_code.f  ad_taf_output.$FS: ad_input_code.$FS
2842          \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f          \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2843          cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f          ls -l ad_input_code_ad.$FS
2844            cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2845    
2846  adtafonly:  adtafonly:
2847          \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f          \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2848          cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f          ls -l ad_input_code_ad.$FS
2849            cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2850  ad_taf: ad_taf_output.o \$(OBJFILES)  
2851          \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)  \${EXE_AD}: ad_taf_output.o \$(OBJFILES)
2852            \$(LINK) -o \${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
2853  ad_tamc_output.f: ad_input_code.f  
2854          \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.f  ad_tamc_output.$FS: ad_input_code.$FS
2855          cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.f          \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.$FS
2856            cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.$FS
2857    
2858  ad_tamc: ad_tamc_output.o \$(OBJFILES)  ad_tamc: ad_tamc_output.o \$(OBJFILES)
2859          \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)          \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
2860    
2861    adonlyfwd:
2862            patch < \$(TOOLSDIR)/ad_taf_output.f.onlyfwd.diff
2863    
2864    adtrick:
2865            patch < \$(TOOLSDIR)/ad_taf_output.f.adtrick.diff
2866    
2867  # ... FTL ...  # ... FTL ...
2868  ftlall: ftl_taf  ftlall: ftl_taf
2869  ftltaf: ftl_taf_output.f  ftltaf: ftl_taf_output.$FS
2870  ftltamc: ftl_tamc_output.f  ftltamc: ftl_tamc_output.$FS
2871    
2872  ftl_input_code.f: \$(AD_FILES) \$(HEADERFILES)  ftl_input_code.$FS: \$(AD_FILES) \$(H_SRC_FILES)
2873          @$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          @$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
2874          cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h          cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
2875          -rm -f ftl_config.template          -rm -f ftl_config.template
2876          @make \$(F77FILES)          @make \$(F77_PP_SRC_FILES)
2877          @make \$(AD_FLOW_FILES)          @make \$(AD_FLOW_FILES)
2878          cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.f          cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.$FS
2879    
2880  ftl_taf_output.f: ftl_input_code.f  ftl_taf_output.$FS: ftl_input_code.$FS
2881          \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f          \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
2882          cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f          ls -l ftl_input_code_ftl.$FS
2883            cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
2884    
2885  ftltafonly:  ftltafonly:
2886          \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f          \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
2887          cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f          ls -l ftl_input_code_ftl.$FS
2888            cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
2889    
2890  ftl_taf: ftl_taf_output.o \$(OBJFILES)  ftl_taf: ftl_taf_output.o \$(OBJFILES)
2891          \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)          \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
2892    
2893  ftl_tamc_output.f: ftl_input_code.f  ftl_tamc_output.$FS: ftl_input_code.$FS
2894          \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.f          \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.$FS
2895          cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.f          cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.$FS
2896    
2897  ftl_tamc: ftl_tamc_output.o \$(OBJFILES)  ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
2898          \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)          \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
2899    
2900    
2901  # ... SVD ...  # ... SVD ...
2902  svdtaf: ad_taf_output.f ftl_taf_output.f  svdtaf: ad_taf_output.$FS ftl_taf_output.$FS
2903  svdall: svd_taf          @echo "--->>> Only ran TAF to generate SVD code!    <<<---"
2904            @echo "--->>> Do make svdall afterwards to compile. <<<---"
2905    svdall: svd_touch svd_taf
2906    
2907  svd_taf: ad_taf_output.o ftl_taf_output.o \$(OBJFILES)  svd_taf: \$(OBJFILES)
2908          \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)          \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
2909    
2910            @echo "--->>> Only COMPILE svd code! <<<---"
2911            @echo "--->>> Assumes you previously <<<---"
2912            @echo "--->>> did make svdtaf        <<<---"
2913    
2914    svd_touch:
2915            @echo "--->>> Only COMPILE svd code! <<<---"
2916            @echo "--->>> Assumes you previously <<<---"
2917            @echo "--->>> did make svdtaf        <<<---"
2918            touch ad_taf_output.$FS ftl_taf_output.$FS
2919            \$(FC) \$(FFLAGS) \$(FOPTIM) -c ad_taf_output.$FS
2920            \$(FC) \$(FFLAGS) \$(FOPTIM) -c ftl_taf_output.$FS
2921            @$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
2922            cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
2923            -rm -f ftl_config.template
2924    
2925  #=========================================  EOF
2926    
2927    fi
2928    
2929    #===  for OpenAD  ========================
2930    
2931    if test "x$OPENAD" != x ; then
2932    
2933    # ============ begin OpenAD specific section ==============
2934    
2935    cat >>$MAKEFILE <<EOF
2936    
2937    # all the source files linked from the various locations:
2938    ALL_LINKED_FILES= \
2939    \$(F77_SRC_FILES) \
2940    \$(C_SRC_FILES) \
2941    \$(H_SRC_FILES) \
2942    \$(F90_SRC_FILES) \
2943    \$(SPECIAL_FILES)
2944    
2945    ifndef OPENADROOT
2946      \$(error "Error:  environment variable OPENADROOT not defined!")
2947    endif
2948    
2949    ifndef XAIFSCHEMAROOT
2950      \$(error "Error:  environment variable XAIFSCHEMAROOT not defined!")
2951    endif
2952    
2953    ifndef XAIFBOOSTERROOT
2954      \$(error "Error:  environment variable XAIFBOOSTERROOT not defined!")
2955    endif
2956    
2957    EOF
2958    
2959    echo "  Add the source list for common block to module conversion "
2960    echo >> $MAKEFILE
2961    printf "CB2M_F90_SRC_NAMES = " >> $MAKEFILE
2962    for i in `cat ${OAD_CB2M_FILES}` ; do
2963      echo    " \\" >> $MAKEFILE
2964      printf " $i" >> $MAKEFILE
2965    done
2966    echo >> $MAKEFILE
2967    
2968    echo "  Add the source list for AD code generation"
2969    echo >> $MAKEFILE
2970    printf "AD_FILES = " >> $MAKEFILE
2971    for i in `cat ${OAD_CB2M_FILES}` ; do
2972      echo    " \\" >> $MAKEFILE
2973      printf " ${i}_mod.f$FS90" >> $MAKEFILE
2974    done
2975    AD_FILES=`cat adSrcFiles.tmp`
2976    for i in $AD_FILES ; do
2977      basename=${i%%.f}
2978      toBeIgnored=`egrep ^$basename'[      ]*' ${OAD_DONT_COMPILE} ${OAD_DONT_TRANSFORM}`
2979      if test -z "$toBeIgnored" ; then
2980        echo    " \\" >> $MAKEFILE
2981        printf " $i" >> $MAKEFILE
2982      fi
2983    done
2984    echo >> $MAKEFILE
2985    rm -f adSrcFiles.tmp
2986    
2987    cat >>$MAKEFILE <<EOF
2988    
2989    adAll: \$(EXE_AD)
2990    .PHONY: adAll
2991    
2992    CB2M_F90_PP_SRC_FILES=\$(addsuffix _mod.f$FS90, \$(CB2M_F90_SRC_NAMES))
2993    
2994    .PRECIOUS: \$(CB2M_F90_PP_SRC_FILES) \$(NON_AD_F77_SRC_FILES:.F=_cb2m.f$FS90)
2995    
2996    .PHONY: adDepend
2997    adDepend: \$(ALL_LINKED_FILES) \$(addsuffix _mod.h, \$(CB2M_F90_SRC_NAMES)) \$(addsuffix _mod.FF90, \$(CB2M_F90_SRC_NAMES)) \$(F77_SRC_FILES:.F=_cb2m.FF90)
2998            \$(MAKEDEPEND) -o .$FS \$(DEFINES) \$(INCLUDES) \$(F77_SRC_FILES)
2999            \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
3000            -rm -f makedepend.out
3001    
3002    OPENAD_SUPPORT_F90_SRC_FILES = \
3003    w2f__types.F90 \
3004    OAD_active.F90 \
3005    OAD_cp.F90 \
3006    OAD_rev.F90 \
3007    OAD_tape.F90
3008    
3009    OPENAD_SUPPORT_C_SRC_FILES = \
3010    iaddr.c \
3011    timeRatio.c
3012    
3013    f95_test_mods.f90: \$(OPENAD_SUPPORT_F90_SRC_FILES:F90=$FS90)
3014            cat \$^ > \$@
3015    
3016    f95_test.f90: all_mods.xb.x2w.w2f.pp.f$FS90 \$(NON_AD_F77_SRC_FILES:.F=_cb2m.f$FS90) ad_input_code.w2f.pre.xb.x2w.w2f.td.pp.f$FS90
3017            cat \$^ > \$@
3018    
3019    f95_test.out: f95_test_mods.f90 f95_test.f90
3020            f95 -fixed -w=unused -maxcontin=132 -c f95_test_mods.f90 > \$@ 2>&1
3021            f95 -fixed -w=unused -maxcontin=132 -c -fixed f95_test.f90 >> \$@ 2>&1
3022    
3023    # the file included below is created by the
3024    # postProcessor and its inclusion sets the
3025    # variable POSTPROCESSEDFILES
3026    # used below. Because the file is made during
3027    # make it won't be read until the second (recursive)
3028    # invocation in the rule below
3029    -include postProcess.make
3030    
3031    AD_OBJ_FILES_S1=\$(OPENAD_SUPPORT_F90_SRC_FILES:.F90=.o) \$(OPENAD_SUPPORT_C_SRC_FILES:.c=.o) \$(POSTPROCESSEDFILES:.f$FS90=.o)
3032    
3033    AD_OBJ_FILES_S2=\$(AD_OBJ_FILES_S1) \$(NON_AD_F77_SRC_FILES:.F=_cb2m.o) \$(C_SRC_FILES:.c=.o) \$(F90_SRC_FILES:.F90=.o)
3034    
3035    postProcess.comp: \$(ALL_LINKED_FILES) \$(addsuffix _mod.h, \$(CB2M_F90_SRC_NAMES)) postProcess.tag \$(AD_OBJ_FILES_S1)
3036    ifeq (\$(MAKELEVEL),0)
3037            \$(MAKE) adAll
3038    else
3039            touch \$@
3040    endif
3041    
3042    \$(EXE_AD): \$(ALL_LINKED_FILES) \$(addsuffix _mod.h, \$(CB2M_F90_SRC_NAMES)) postProcess.comp \$(AD_OBJ_FILES_S2)
3043    ifeq (\$(MAKELEVEL),1)
3044            \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(AD_OBJ_FILES_S2) \$(LIBS)
3045    else
3046            touch \$@
3047    endif
3048    
3049    # makefile debug rule
3050    openad: ad_input_code.w2f.pre.xb.x2w.w2f.td.pp.f$FS90
3051    .PHONY: openad
3052    
3053    # create the module files
3054    %_mod.FF90 : %.h ../OAD_support/cb2mGetModules.csh ../OAD_support/cb2mGetModules.awk
3055            ../OAD_support/cb2mGetModules.csh $< ../OAD_support/cb2mGetModules.awk
3056    
3057    # create the header files
3058    %_mod.h : %.h ../OAD_support/cb2mGetHeaders.csh ../OAD_support/cb2mGetHeaders.awk
3059            ../OAD_support/cb2mGetHeaders.csh $< ../OAD_support/cb2mGetHeaders.awk \$(CB2M_F90_SRC_NAMES)
3060    
3061    # change everybody else to use the new module files:
3062    %_cb2m.FF90 : %.F ../OAD_support/cb2mUseModules.bash
3063            ../OAD_support/cb2mUseModules.bash $< ${MPI}
3064    
3065    # makefile debug rule
3066    small_f: \$(CB2M_F90_PP_SRC_FILES)
3067    .PHONY: small_f
3068    
3069    ad_output.txt: \$(EXE_AD)
3070            @printf 'linking data files ... '
3071            \$(LN) -f ../input_ad/data* ../input_ad/eedata .
3072            \$(LN) -f ../../global_ocean.90x40x15/input/*.bin .
3073            @printf 'running ... '
3074            @./\$(EXE_AD) > \$@
3075    
3076    CB2M_AD_FILES=\$(AD_FILES:.f=_cb2m.f$FS90)
3077    ad_input_code.f$FS90:  \$(CB2M_AD_FILES)
3078            cat \$^ > \$@
3079    
3080    # strip all comments and blanks to reduce
3081    # the file size in order to reduce perl's memory requirements
3082    ad_input_code_sf.f$FS90 : ad_input_code.f$FS90
3083            cat \$^ | sed -f ../OAD_support/strip.sed | sed -f ../OAD_support/stop2print.sed > \$@
3084    
3085    # mfef90 preprocessing
3086    # expand statement functions
3087    # expose mfef90 specific substring handling
3088    # add the w2f__types module
3089    ad_input_code_sf.w2f.f$FS90: ad_input_code_sf.f$FS90 mfef90 whirl2f whirl2f_be w2f__types.f90
3090            ./mfef90 -r8 -z -F -N132 \$<
3091            mv \$<.B \$(basename \$<).B
3092            ./whirl2f -openad \$(basename \$<).B
3093            cat w2f__types.f90 \$(basename \$<).w2f.f > \$@
3094    
3095    # canonicalizer
3096    ad_input_code_sf.w2f.pre.f$FS90: ad_input_code_sf.w2f.f$FS90 preProcess.py
3097            ./preProcess.py --timing --r8 -H -S \$< -o \$@
3098    
3099    # F -> WHIRL
3100    # note that the canonicalized version cuts off at col 72
3101    # doing this also for string constants which is ok as long
3102    # as we are in fixed mode and cut of exactly there.
3103    # Otherwise mfef90 patches in spaces to fill up to 72 (or 132)
3104    # characters respectively.
3105    ad_input_code_sf.w2f.pre.B: ad_input_code_sf.w2f.pre.f$FS90 mfef90
3106            ./mfef90 -r8 -z -F \$<
3107            mv \$<.B \$@
3108    
3109    # WHIRL -> XAIF
3110    ad_input_code_sf.w2f.pre.xaif : ad_input_code_sf.w2f.pre.B whirl2xaif
3111            ./whirl2xaif -s -n --debug 1 -o \$@ \$<
3112    
3113    # XAIF -> XAIF'
3114    ad_input_code_sf.w2f.pre.xb.xaif : ad_input_code_sf.w2f.pre.xaif xaif.xsd xaif_base.xsd xaif_inlinable_intrinsics.xsd xaif_derivative_propagator.xsd xaif_output.xsd oadDriver
3115            ./oadDriver -f -t forward_step -i \$< -c \${XAIFSCHEMAROOT}/schema/examples/inlinable_intrinsics.xaif -o \$@ -I -r
3116    
3117    # XAIF' -> WHIRL'
3118    ad_input_code_sf.w2f.pre.xb.x2w.B : ad_input_code_sf.w2f.pre.xb.xaif xaif2whirl
3119            ./xaif2whirl --debug 1 ad_input_code_sf.w2f.pre.B \$<
3120    
3121    # WHIRL' -> F'
3122    ad_input_code_sf.w2f.pre.xb.x2w.w2f.f$FS90: ad_input_code_sf.w2f.pre.xb.x2w.B whirl2f whirl2f_be
3123            ./whirl2f -FLIST:ftn_file=\$@ -openad \$<
3124    
3125    # insert template directives
3126    ad_input_code_sf.w2f.pre.xb.x2w.w2f.td.f$FS90: ad_input_code_sf.w2f.pre.xb.x2w.w2f.f$FS90 ../OAD_support/insertTemplateDir.bash
3127            ../OAD_support/insertTemplateDir.bash \$< \$@
3128    
3129    PPEXTRAS=\$(wildcard ../OAD_support/ad_template.*.F) ../OAD_support/ad_inline.F
3130    # postprocess F'
3131    postProcess.tag: ad_input_code_sf.w2f.pre.xb.x2w.w2f.td.f$FS90 postProcess.py \$(PPEXTRAS:.F=.f)
3132            # the target is a placeholder to signal execution of the rule
3133            touch \$@
3134            # this step also creates the file postProcess.make but we cannot
3135            # name it as the target or else make will try to remake it for
3136            # the include directive above for any rule, e.g. make clean
3137            ./postProcess.py --progress --timing --outputFormat=fixed -m r -i ../OAD_support/ad_inline.f --width 4 \$<
3138    
3139    # setup some links
3140    %.xsd:
3141            \$(LN) \${XAIFSCHEMAROOT}/schema/\$@ .
3142    
3143    mfef90:
3144            \$(LN) \${OPEN64ROOT}/crayf90/sgi/mfef90 .
3145    
3146    # link the support files:
3147    \$(OPENAD_SUPPORT_F90_SRC_FILES) \$(OPENAD_SUPPORT_C_SRC_FILES):
3148            \$(LN) ../OAD_support/\$@ .
3149    
3150    whirl2xaif xaif2whirl:
3151            \$(LN) \${OPENADFORTTK}/bin/\$@ .
3152    
3153    preProcess.py postProcess.py:
3154            \$(LN) \${OPENADFORTTK_BASE}/tools/SourceProcessing/\$@ .
3155    
3156    whirl2f whirl2f_be:
3157            \$(LN) \${OPEN64ROOT}/whirl2f/\$@ .
3158    
3159    oadDriver:
3160            \$(LN) \${XAIFBOOSTERROOT}/xaifBooster/algorithms/BasicBlockPreaccumulationReverse/driver/oadDriver \$@
3161    
3162    AD_CLEAN += *_mod.h *_mod.F90 *.FF90 *.mod-whirl temp.sed oad_cp.* postProcess.make postProcess.tag postProcess.comp \$(PPEXTRAS:.F=.f)
3163    
3164    # ============ end OpenAD specific section ==============
3165    
3166  EOF  EOF
3167    
3168    fi
3169    
3170    #=========================================
3171    
3172  if test "x$EXEHOOK" != x ; then  if test "x$EXEHOOK" != x ; then
3173      printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE      printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE
3174  fi  fi
# Line 1841  for i in $KPPFILES ; do Line 3180  for i in $KPPFILES ; do
3180      if test "x$RETVAL" != x0 ; then      if test "x$RETVAL" != x0 ; then
3181          echo "Error: unable to add file \"$i\" to the exceptions list"          echo "Error: unable to add file \"$i\" to the exceptions list"
3182      fi      fi
3183      echo "$base.f: $base.p" >> $MAKEFILE      echo "$base.$FS: $base.p" >> $MAKEFILE
3184  done  done
3185    
3186  echo "  Making list of NOOPTFILES"  echo "  Making list of NOOPTFILES"
# Line 1851  for i in $NOOPTFILES ; do Line 3190  for i in $NOOPTFILES ; do
3190      if test "x$RETVAL" != x0 ; then      if test "x$RETVAL" != x0 ; then
3191          echo "Error: unable to add file \"$i\" to the exceptions list"          echo "Error: unable to add file \"$i\" to the exceptions list"
3192      fi      fi
3193      echo "$base.o: $base.f" >> $MAKEFILE      echo "$base.o: $base.$FS" >> $MAKEFILE
3194      printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE      printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE
3195  done  done
3196    
# Line 1865  printf "\n\n# DO NOT DELETE\n" >> $MAKEF Line 3204  printf "\n\n# DO NOT DELETE\n" >> $MAKEF
3204  printf "\n===  Done  ===\n"  printf "\n===  Done  ===\n"
3205    
3206  # Create special header files  # Create special header files
3207  $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"  $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"
3208  if test ! -f $PACKAGES_DOT_H ; then  if test ! -f $PACKAGES_DOT_H ; then
3209      mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H      mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
3210  else  else

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

  ViewVC Help
Powered by ViewVC 1.1.22