/[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.27 by edhill, Tue Nov 4 18:40:58 2003 UTC revision 1.180 by utke, Thu Dec 11 17:50:56 2008 UTC
# Line 1  Line 1 
1  #!/bin/bash  #! /usr/bin/env bash
2  #  #
3  # $Header$  # $Header$
4  #  #
# Line 13  Line 13 
13  test_for_package_in_cpp_options() {  test_for_package_in_cpp_options() {
14      cpp_options=$1      cpp_options=$1
15      pkg=$2      pkg=$2
16      grep -i "#define.*ALLOW_$pkg" $cpp_options > /dev/null 2>&1      test_for_string_in_file $cpp_options "^[ ]*#define.*ALLOW_$pkg[ ]"
17      RETVAL=$?      test_for_string_in_file $cpp_options "^[ ]*#undef.*ALLOW_$pkg[ ]"
18      if test "x${RETVAL}" = x0 ; then      test_for_string_in_file $cpp_options "^[ ]*#define.*DISABLE_$pkg[ ]"
19          echo "Error: In $cpp_options there is an illegal line: #define ALLOW_$pkg"      test_for_string_in_file $cpp_options "^[ ]*#undef.*DISABLE_$pkg[ ]"
20          exit 99      test_for_string_in_file $cpp_options "^[ ]*#define.*ALLOW_$pkg$"
21      fi      test_for_string_in_file $cpp_options "^[ ]*#undef.*ALLOW_$pkg$"
22      grep -i "#undef.*ALLOW_$pkg" $cpp_options > /dev/null 2>&1      test_for_string_in_file $cpp_options "^[ ]*#define.*DISABLE_$pkg$"
23      RETVAL=$?      test_for_string_in_file $cpp_options "^[ ]*#undef.*DISABLE_$pkg$"
24      if test "x${RETVAL}" = x0 ; then  }
25          echo "Error: In $cpp_options there is an illegal line: #undef ALLOW_$pkg"  
26          exit 99  # Search for particular CPP #cmds associated with MPI
27      fi  # usage: test_for_mpi_in_cpp_eeoptions CPP_file
28      grep -i "#define.*DISABLE_$pkg" $cpp_options > /dev/null 2>&1  test_for_mpi_in_cpp_eeoptions() {
29        cpp_options=$1
30        test_for_string_in_file $cpp_options "^[ ]*#define.*ALLOW_USE_MPI[ ]"
31        test_for_string_in_file $cpp_options "^[ ]*#undef.*ALLOW_USE_MPI[ ]"
32        test_for_string_in_file $cpp_options "^[ ]*#define.*ALWAYS_USE_MPI[ ]"
33        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
41    # usage: test_for_string_in_file file string
42    test_for_string_in_file() {
43        file=$1
44        strng=$2
45        grep -i "$strng" $file > /dev/null 2>&1
46      RETVAL=$?      RETVAL=$?
47      if test "x${RETVAL}" = x0 ; then      if test "x${RETVAL}" = x0 ; then
48          echo "Error: In $cpp_options there is an illegal line: #define DISABLE_$pkg"          printf "Error: In $file there is an illegal line: "
49            grep -i "$strng" $file
50          exit 99          exit 99
51      fi      fi
52      grep -i "#undef.*DISABLE_$pkg" $cpp_options > /dev/null 2>&1      return 0
     RETVAL=$?  
     if test "x${RETVAL}" = x0 ; then  
         echo "Error: In $cpp_options there is an illegal line: #undef DISABLE_$pkg"  
         exit 99  
    fi  
53  }  }
54    
55  # Read the $ROOTDIR/pkg/pkg_groups file and expand any references to  # Read the $ROOTDIR/pkg/pkg_groups file and expand any references to
# Line 62  expand_pkg_groups() { Line 75  expand_pkg_groups() {
75          done          done
76          PACKAGES=$new_packages          PACKAGES=$new_packages
77          rm -f ./p[1,2].tmp          rm -f ./p[1,2].tmp
78            return $matched
79      else      else
80          echo "Warning: can't read package groups definition file: $PKG_GROUPS"          echo "Warning: can't read package groups definition file: $PKG_GROUPS"
81      fi      fi
82  }  }
83    
84    #  Check for broken environments (eg. cygwin, MacOSX w/HFS+) that
85    #  cannot distinguish [*.F/*.F90] from [*.f/*.f90] files.
86    check_for_broken_Ff()  {
87        #  Do we have defaults for $FS and/or $FS90 ?
88        tfs=f
89        tfs9=f90
90        if test "x$FS" != x ; then
91            tfs="$FS"
92        fi
93        if test "x$FS90" != x ; then
94            tfs9="$FS90"
95        fi
96    
97        #  First check the ability to create a *.F/.f pair.
98        cat <<EOF >> genmake_hello.F
99          program hello
100          write(*,*) 'hi'
101          stop
102          end
103    EOF
104        cp genmake_hello.F "genmake_hello."$tfs > /dev/null 2>&1
105        RETVAL=$?
106        if test "x$RETVAL" != x0 ; then
107            if test "x$FS" = x ; then
108                FS='for'
109                FS90='fr9'
110                check_for_broken_Ff
111            else
112                cat <<EOF 2>&1
113    ERROR: Your file system cannot distinguish between *.F and *.f files
114      (fails the "cp" test) and this program cannot find a suitable
115      replacement extension.  Please try a different build environment or
116      contact the <MITgcm-support@mitgcm.org> list for help.
117    
118    EOF
119                exit -1
120            fi
121            return
122        fi
123        rm -f genmake_hello.*
124    
125        #  Check the ability of ${MAKE} and ${LN} to use the current set
126        #  of extensions.
127        cat <<EOF >> genmake_hello.F
128          program hello
129          write(*,*) 'hi'
130          stop
131          end
132    EOF
133        test -f $MAKEFILE  &&  mv -f $MAKEFILE $MAKEFILE".tst"
134        cat <<EOF >> $MAKEFILE
135    .SUFFIXES:
136    .SUFFIXES: .$tfs .F
137    .F.$tfs:
138            $LN \$< \$@
139    EOF
140        $MAKE "genmake_hello."$tfs > /dev/null 2>&1
141        RETVAL=$?
142        if test "x$RETVAL" != x0 -o ! -f "genmake_hello."$tfs ; then
143            if test "x$FS" = x ; then
144                FS='for'
145                FS90='fr9'
146                check_for_broken_Ff
147            else
148                cat <<EOF 2>&1
149    ERROR: Your file system cannot distinguish between *.F and *.f files
150      (fails the "make/ln" test) and this program cannot find a suitable
151      replacement extension.  Please try a different build environment or
152      contact the <MITgcm-support@mitgcm.org> list for help.
153    
154    EOF
155                exit -1
156                return
157            fi
158        fi
159        rm -f genmake_hello.* $MAKEFILE
160        test -f $MAKEFILE".tst"  &&  mv -f $MAKEFILE".tst" $MAKEFILE
161    
162        #  If we make it here, use the extensions
163        FS=$tfs
164        FS90=$tfs9
165        return
166    }
167    
168    
169    look_for_makedepend()  {
170    
171        #  The "original" makedepend is part of the Imake system that is
172        #  most often distributed with XFree86 or with an XFree86 source
173        #  package.  As a result, many machines (eg. generic Linux) do not
174        #  have a system-default "makedepend" available.  For those
175        #  systems, we have two fall-back options:
176        #
177        #    1) a makedepend implementation shipped with the cyrus-imapd
178        #       package:  ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/
179        #
180        #    2) a known-buggy xmakedpend shell script
181        #
182        #  So the choices are, in order:
183        #
184        #    1) use the user-specified program
185        #    2) use a system-wide default
186        #    3) locally build and use the cyrus implementation
187        #    4) fall back to the buggy local xmakedpend script
188        #
189        if test "x${MAKEDEPEND}" = x ; then
190            which makedepend > /dev/null 2>&1
191            RV0=$?
192            test -f $MAKEFILE  &&  mv -f $MAKEFILE $MAKEFILE".tst"
193            #  echo 'MAKEFILE="'$MAKEFILE'"'
194            cat <<EOF >> $MAKEFILE
195    #   THIS IS A TEST MAKEFILE GENERATED BY "genmake2"
196    #
197    #   Some "makedepend" implementations will die if they cannot
198    #   find a Makefile -- so this file is here to gives them an
199    #   empty one to find and parse.
200    EOF
201            cat <<EOF >> genmake_tc.f
202          program test
203          write(*,*) 'test'
204          stop
205          end
206    EOF
207            makedepend genmake_tc.f > /dev/null 2>&1
208            RV1=$?
209            test -f $MAKEFILE  &&  rm -f $MAKEFILE
210            test -f $MAKEFILE".tst"  &&  mv -f $MAKEFILE".tst" $MAKEFILE
211            if test "x${RV0}${RV1}" = x00 ; then
212                MAKEDEPEND=makedepend
213            else
214                echo "    a system-default makedepend was not found."
215                
216                #  Try to build the cyrus implementation
217                build_cyrus_makedepend
218                RETVAL=$?
219                if test "x$RETVAL" != x0 ; then
220                    MAKEDEPEND='$(TOOLSDIR)/xmakedepend'
221                fi
222                rm -f ./genmake_cy_md
223            fi
224        else
225            #  echo "MAKEDEPEND=${MAKEDEPEND}"
226            echo "${MAKEDEPEND}" | grep -i cyrus > /dev/null 2>&1
227            RETVAL=$?
228            if test x"$RETVAL" = x0 ; then
229                build_cyrus_makedepend
230            fi
231        fi
232    }
233    
234    
235    build_cyrus_makedepend()  {
236        rm -f ./genmake_cy_md
237        (
238            cd $ROOTDIR/tools/cyrus-imapd-makedepend  \
239                &&  ./configure > /dev/null 2>&1  \
240                &&  make > /dev/null 2>&1
241            if test -x ./makedepend.exe ; then
242                $LN ./makedepend.exe ./makedepend
243            fi
244            ./makedepend ifparser.c > /dev/null 2>&1  \
245                &&  echo "true"
246        ) > ./genmake_cy_md
247        grep true ./genmake_cy_md > /dev/null 2>&1
248        RETVAL=$?
249        rm -f ./genmake_cy_md
250        if test "x$RETVAL" = x0 ; then
251            MAKEDEPEND='$(TOOLSDIR)/cyrus-imapd-makedepend/makedepend'
252            return 0
253        else
254            echo "WARNING: unable to build cyrus-imapd-makedepend"
255            return 1
256        fi
257    }
258    
259    
260    build_embed_encode()
261    {
262        printf "  building the embed-encode utility...  "
263        if test ! -e "$ROOTDIR/tools/embed_encode/encode_files" ; then
264            if test ! -d "$ROOTDIR/tools/embed_encode" ; then
265                echo
266                echo "    Error: can't locate \"$ROOTDIR/tools/embed_encode\""
267                echo
268                EMBED_SRC=f
269                return 1
270            fi
271            clist="cc gcc c89 $CC"
272            for ic in $clist ; do
273                comm="$ic -o encode_files encode_files.c"
274                ( cd $ROOTDIR/tools/embed_encode && $comm ) > /dev/null 2>&1
275                RETVAL=$?
276                if test "x$RETVAL" = x0 ; then
277                    echo "OK"
278                    DEFINES="$DEFINES -DHAVE_EMBED_SRC"
279                    return 0
280                fi
281            done
282            echo
283            echo "    Error: unable to build $ROOTDIR/embed_encode/encode_files"
284            echo "      so it has been disabled"
285            echo
286            EMBED_SRC=f
287            return 1
288        fi
289        echo "OK"
290        DEFINES="$DEFINES -DHAVE_EMBED_SRC"
291    }
292    
293    
294  # Guess possible config options for this host  # Guess possible config options for this host
295  find_possible_configs()  {  find_possible_configs()  {
296    
297      tmp1=`uname`"_"`uname -m`      tmp1=`uname`"_"`uname -m`
298      tmp2=`echo $tmp1 | sed -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`      tmp2=`echo $tmp1 | sed -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
299      tmp3=`echo $tmp2 | sed -e 's/power macintosh/ppc/'`      tmp3=`echo $tmp2 | sed -e 's/power macintosh/ppc/'`
300      PLATFORM=`echo $tmp3 | sed -e 's/i[3-6]86/ia32/' | sed -e 's/athlon/ia32/'`      tmp1=`echo $tmp3 | sed -e 's|x86_64|amd64|'`
301        tmp2=`echo $tmp1 | sed -e 's/i[3-6]86/ia32/' | sed -e 's/athlon/ia32/'`
302        tmp3=`echo $tmp2 | sed -e 's/cray sv1/craysv1/'`
303        PLATFORM=$tmp3
304        echo $PLATFORM | grep cygwin > /dev/null 2>&1  &&  PLATFORM=cygwin_ia32
305      OFLIST=`(cd $ROOTDIR/tools/build_options; ls | grep "^$PLATFORM")`      OFLIST=`(cd $ROOTDIR/tools/build_options; ls | grep "^$PLATFORM")`
306      echo "  The platform appears to be:  $PLATFORM"      echo "  The platform appears to be:  $PLATFORM"
 #     if test "x$OFLIST" = x ; then  
 #       echo "  No pre-defined options files were found matching this platform"  
 #       echo "  but examples for other platforms can be found in:"  
 #       echo "    $ROOTDIR/tools/build_options"  
 #     else  
 #       echo "  Options files (located in $ROOTDIR/tools/build_options) that"  
 #       echo "  may work with this machine are:"  
 #       for i in $OFLIST ; do  
 #           echo "    $i"  
 #       done  
 #     fi  
307            
308      echo "test" > test      echo "test" > test
309      ln -s ./test link      ln -s ./test link
# Line 104  find_possible_configs()  { Line 321  find_possible_configs()  {
321          CPP="cpp -traditional -P"          CPP="cpp -traditional -P"
322      fi      fi
323    
324      # look for possible fortran compilers      look_for_makedepend
325      tmp="$MITGCM_FC $FC efc g77 f77 pgf77 pgf95 ifc f90 f95 mpif77 mpf77 mpxlf95"  
326        #================================================================
327        #  look for possible C compilers
328        tmp="$MITGCM_CC $CC gcc c89 cc c99 mpicc icc"
329        p_CC=
330        for c in $tmp ; do
331            rm -f ./genmake_hello.c  ./genmake_hello
332            cat >> genmake_hello.c << EOF
333    #include <stdio.h>
334    int main(int argc, char **argv) {
335      printf("Hello!\n");
336      return 0;
337    }
338    EOF
339            $c -o genmake_hello genmake_hello.c > /dev/null 2>&1
340            RETVAL=$?
341            if test "x${RETVAL}" = x0 ; then
342                p_CC="$p_CC $c"
343            fi
344        done
345        rm -f ./genmake_hello.c ./genmake_hello
346        if test "x${p_CC}" = x ; then
347            cat 1>&2 <<EOF
348    
349    Error: No C compilers were found in your path.  Please specify one using:
350    
351        1) an "optfile" on (eg. "-optfile=path/to/OPTFILE"),
352        2) the CC or MITGCM_CC environment variables.
353    
354    EOF
355            exit 1
356        else
357            echo "  The possible C compilers found in your path are:"
358            echo "   "$p_CC
359            if test "x$CC" = x ; then
360                CC=`echo $p_CC | $AWK '{print $1}'`
361                echo "  Setting C compiler to: "$CC
362            fi
363        fi
364    
365        #================================================================
366        #  look for possible FORTRAN compilers
367        tmp="$MITGCM_FC $FC efc g77 f77 pgf77 pgf95 ifc ifort f90 f95 mpif77 mpf77 mpxlf95 gfortran g95"
368      p_FC=      p_FC=
369      for c in $tmp ; do      for c in $tmp ; do
370          rm -f ./hello.f ./hello          rm -f ./hello.f ./hello
# Line 130  Error: No Fortran compilers were found i Line 389  Error: No Fortran compilers were found i
389    
390      1) an "optfile" on (eg. "-optfile=path/to/OPTFILE"),      1) an "optfile" on (eg. "-optfile=path/to/OPTFILE"),
391      2) a command-line option (eg. "-fc NAME"), or      2) a command-line option (eg. "-fc NAME"), or
392      3) the MITGCM_FC environment variable.      3) the FC or MITGCM_FC environment variables.
393    
394  EOF  EOF
395          exit 1          exit 1
396      else      else
397          echo "  The possible FORTRAN compilers found in your path are:"          echo "  The possible FORTRAN compilers found in your path are:"
398          echo "   "$p_FC          echo "   "$p_FC
         if test "x$FC" = x ; then  
             FC=`echo $p_FC | $AWK '{print $1}'`  
         fi  
399      fi      fi
400    
401      for i in $p_FC ; do      #  Use the first of the compilers found in the current PATH
402          p_OF=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$i      #  that has a correctly-named optfile
403          if test -r $p_OF ; then      if test "x$OPTFILE" = x  -a  "x$FC" = x ; then
404              OPTFILE=$p_OF          for i in $p_FC ; do
405              echo "  The options file:  $p_OF"              OPTFILE=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$i
406              echo "    appears to match so we'll use it."              if test -r $OPTFILE ; then
407              break                  echo "  Setting OPTFILE to: "$OPTFILE
408          fi                  break
409      done              fi
410            done
411        fi
412    
413        if test "x$OPTFILE" = x ; then
414            OPTFILE=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$FC
415            if test ! -r $OPTFILE ; then
416                 echo "  I looked for the file "$OPTFILE" but did not find it"
417            fi
418        fi
419    #    echo "  The options file:  $p_OF"
420    #    echo "    appears to match so we'll use it."
421    #   for i in $p_FC ; do
422    #p_OF=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$i
423    #if test -r $p_OF ; then
424    #    OPTFILE=$p_OF
425    #    echo "  The options file:  $p_OF"
426    #    echo "    appears to match so we'll use it."
427    #    break
428    #fi
429    #   done
430      if test "x$OPTFILE" = x ; then      if test "x$OPTFILE" = x ; then
431          cat 1>&2 <<EOF          cat 1>&2 <<EOF
432    
# Line 206  get_pdepend_list()  { Line 482  get_pdepend_list()  {
482      cat $1 | sed -e 's/#.*$//g' \      cat $1 | sed -e 's/#.*$//g' \
483          | $AWK 'BEGIN{nn=0;} (NF>0){ for(i=2;i<=NF;i++){nn++; print "PNAME["nn"]="$1"\nDNAME["nn"]="$i} }' \          | $AWK 'BEGIN{nn=0;} (NF>0){ for(i=2;i<=NF;i++){nn++; print "PNAME["nn"]="$1"\nDNAME["nn"]="$i} }' \
484          > ./.pd_tmp          > ./.pd_tmp
485      source ./.pd_tmp      . ./.pd_tmp
486      rm -f ./.pd_tmp      rm -f ./.pd_tmp
487    
488      echo -n "PNAME = "${}      printf "PNAME = "${}
489  }  }
490    
491    
492  #  Explain usage  #  Explain usage
493  usage()  {  usage()  {
494      echo  cat <<EOF
495      echo "Usage: "$0" [OPTIONS]"  
496      echo "  where [OPTIONS] can be:"  Usage: "$0" [OPTIONS]
497      echo    where [OPTIONS] can be:
498      echo "    -help | --help | -h | --h"  
499      echo "    -nooptfile | --nooptfile"      -help | --help | -h | --h
500      echo "      -optfile NAME | --optfile NAME | -of NAME | --of NAME"            Print this help message and exit.
501      echo "      -optfile=NAME | --optfile=NAME | -of=NAME | --of=NAME"  
502      echo "    -pdepend NAME | --pdepend NAME"      -adoptfile NAME | --adoptfile NAME | -adof NAME | --adof NAME
503      echo "      -pdepend=NAME | --pdepend=NAME"        -adoptfile=NAME | --adoptfile=NAME | -adof=NAME | --adof=NAME
504      echo "    -pdefault NAME | --pdefault NAME"            Use "NAME" as the adoptfile.  By default, the file at
505      echo "      -pdefault=NAME | --pdefault=NAME"            "tools/adjoint_options/adjoint_default" will be used.
506      echo "    -make NAME | -m NAME"  
507      echo "      --make=NAME | -m=NAME"      -nooptfile | --nooptfile
508      echo "    -makefile NAME | -mf NAME"        -optfile NAME | --optfile NAME | -of NAME | --of NAME
509      echo "      --makefile=NAME | -mf=NAME"        -optfile=NAME | --optfile=NAME | -of=NAME | --of=NAME
510      echo "    -platform NAME | --platform NAME | -pl NAME | --pl NAME"            Use "NAME" as the optfile.  By default, an attempt will be
511      echo "      -platform=NAME | --platform=NAME | -pl=NAME | --pl=NAME"            made to find an appropriate "standard" optfile in the
512      echo "    -rootdir NAME | --rootdir NAME | -rd NAME | --rd NAME"            tools/build_options/ directory.
513      echo "      -rootdir=NAME | --rootdir=NAME | -rd=NAME | --rd=NAME"  
514      echo "    -mods NAME | --mods NAME | -mo NAME | --mo NAME"      -pdepend NAME | --pdepend NAME
515      echo "      -mods=NAME | --mods=NAME | -mo=NAME | --mo=NAME"        -pdepend=NAME | --pdepend=NAME
516      echo "    -disable NAME | --disable NAME"            Get package dependency information from "NAME".
517      echo "      -disable=NAME | --disable=NAME"  
518      echo "    -enable NAME | --enable NAME"      -pdefault NAME | --pdefault NAME
519      echo "      -enable=NAME | --enable=NAME"        -pdefault=NAME | --pdefault=NAME
520      echo "    -standarddirs NAME | --standarddirs NAME"            Get the default package list from "NAME".
521      echo "      -standarddirs=NAME | --standarddirs=NAME"  
522      echo "    -noopt NAME | --noopt NAME"      -make NAME | -m NAME
523      echo "      -noopt=NAME | --noopt=NAME"        --make=NAME | -m=NAME
524  #    echo "    -cpp NAME | --cpp NAME"            Use "NAME" for the MAKE program. The default is "make" but
525  #    echo "      -cpp=NAME | --cpp=NAME"            many platforms, "gmake" is the preferred choice.
526      echo "    -fortran NAME | --fortran NAME | -fc NAME | --fc NAME"  
527      echo "      -fc=NAME | --fc=NAME"      -makefile NAME | -mf NAME
528      echo "    -[no]ieee | --[no]ieee"        --makefile=NAME | -mf=NAME
529      echo "    -[no]mpi | --[no]mpi"            Call the makefile "NAME".  The default is "Makefile".
530      echo "    -[no]jam | --[no]jam"  
531      echo      -makedepend NAME | -md NAME
532      echo "  and NAME is a string such as:"        --makedepend=NAME | -md=NAME
533      echo            Use "NAME" for the MAKEDEPEND program.
534      echo "    --enable pkg1   --enable 'pkg1 pkg2'   --enable 'pkg1 pkg2 pkg3'"  
535      echo "    -mods=dir1   -mods='dir1'   -mods='dir1 dir2 dir3'"      -rootdir NAME | --rootdir NAME | -rd NAME | --rd NAME
536      echo "    -foptim='-Mvect=cachesize:512000,transform -xtypemap=real:64,double:64,integer:32'"        -rootdir=NAME | --rootdir=NAME | -rd=NAME | --rd=NAME
537      echo            Specify the location of the MITgcm ROOTDIR as "NAME".
538      echo "  which, depending upon your shell, may need to be single-quoted"            By default, genamke will try to find the location by
539      echo "  if it contains spaces, dashes, or other special characters."            looking in parent directories (up to the 5th parent).
540    
541        -mods NAME | --mods NAME | -mo NAME | --mo NAME
542          -mods=NAME | --mods=NAME | -mo=NAME | --mo=NAME
543              Here, "NAME" specifies a list of directories that are
544              used for additional source code.  Files found in the
545              "mods list" are given preference over files of the same
546              name found elsewhere.
547    
548        -disable NAME | --disable NAME
549          -disable=NAME | --disable=NAME
550              Here "NAME" specifies a list of packages that we don't
551              want to use.  If this violates package dependencies,
552              genamke will exit with an error message.
553    
554        -enable NAME | --enable NAME
555          -enable=NAME | --enable=NAME
556              Here "NAME" specifies a list of packages that we wish
557              to specifically enable.  If this violates package
558              dependencies, genamke will exit with an error message.
559    
560        -standarddirs NAME | --standarddirs NAME
561          -standarddirs=NAME | --standarddirs=NAME
562              Here, "NAME" specifies a list of directories to be
563              used as the "standard" code.
564    
565        -fortran NAME | --fortran NAME | -fc NAME | --fc NAME
566          -fc=NAME | --fc=NAME
567              Use "NAME" as the fortran compiler.  By default, genmake
568              will search for a working compiler by trying a list of
569              "usual suspects" such as g77, f77, etc.
570    
571        -cc NAME | --cc NAME | -cc=NAME | --cc=NAME
572              Use "NAME" as the C compiler.  By default, genmake
573              will search for a working compiler by trying a list of
574              "usual suspects" such as gcc, c89, cc, etc.
575    
576        -[no]ieee | --[no]ieee
577              Do or don't use IEEE numerics.  Note that this option
578              *only* works if it is supported by the OPTFILE that
579              is being used.
580    
581        -ignoretime | -ignore_time | --ignoretime | --ignore_time
582              Ignore all the "wall clock" routines entirely.  This will
583              not in any way hurt the model results -- it simply means
584              that the code that checks how long the model spends in
585              various routines will give junk values.
586    
587        -ts | --ts
588              Produce timing information per timestep
589        -papis | --papis
590              Produce summary MFlop/s (and IPC) with PAPI per timestep
591        -pcls | --pcls
592              Produce summary MFlop/s etc. with PCL per timestep
593        -foolad | --foolad
594              Fool the AD code generator
595        -papi | --papi
596              Performance analysis with PAPI
597        -pcl | --pcl
598              Performance analysis with PCL
599        -hpmt | --hpmt
600              Performance analysis with the HPM Toolkit
601    
602        -gsl | --gsl
603              Use GSL to control floating point rounding and precision
604        -devel | --devel
605              Add additional warning and debugging flags for development
606    
607        -mpi | --mpi
608              Include MPI header files and link to MPI libraries
609        -mpi=PATH | --mpi=PATH
610              Include MPI header files and link to MPI libraries using MPI_ROOT
611              set to PATH. i.e. Include files from \$PATH/include, link to libraries
612              from \$PATH/lib and use binaries from \$PATH/bin.
613    
614        -es | --es | -embed-source | --embed-source
615              Embed a tarball containing the full source code
616              (including the Makefile, etc.) used to build the
617              executable [off by default]
618    
619        -bash NAME
620              Explicitly specify the Bourne or BASH shell to use
621    
622      While it is most often a single word, the "NAME" variables specified
623      above can in many cases be a space-delimited string such as:
624    
625        --enable pkg1   --enable 'pkg1 pkg2'   --enable 'pkg1 pkg2 pkg3'
626        -mods=dir1   -mods='dir1'   -mods='dir1 dir2 dir3'
627        -foptim='-Mvect=cachesize:512000,transform -xtypemap=real:64,double:64,integer:32'
628    
629      which, depending upon your shell, may need to be single-quoted.
630    
631      For more detailed genmake documentation, please see:
632    
633        http://mitgcm.org/devel_HOWTO/
634    
635    EOF
636    
637      exit 1      exit 1
638  }  }
639    
640  #eh3 # This is the generic configuration.  #  Build a CPP macro to automate calling C routines from FORTRAN
641  #eh3 set LN         = ( 'ln -s' )  get_fortran_c_namemangling()  {
642  #eh3 set CPP        = ( '/lib/cpp -P' )  
643  #eh3 set S64        = ( '$(TOOLSDIR)/set64bitConst.sh' )      #echo "FC_NAMEMANGLE = \"$FC_NAMEMANGLE\""
644  #eh3 set KPP        = (  )      if test ! "x$FC_NAMEMANGLE" = x ; then
645  #eh3 set FC         = ( 'f77' )          return 0
646  #eh3 set LINK       = $FC      fi
647  #eh3 set MAKEDEPEND = ( 'makedepend' )  
648  #eh3 set INCLUDES   = ( -I. )      default_nm="#define FC_NAMEMANGLE(X) X ## _"
649  #eh3 set FFLAGS     = (  )      
650  #eh3 set FOPTIM     = (  )      cat > genmake_test.c <<EOF
651  #eh3 set CFLAGS     = (  )  void tcall( char * string ) { tsub( string ); }
652  #eh3 set KFLAGS1    = (  )  EOF
653  #eh3 set KFLAGS2    = (  )      $MAKE genmake_test.o >> genmake_warnings 2>&1
654  #eh3 set LIBS       = (  )      RETVAL=$?
655  #eh3 set KPPFILES   = (  )      if test "x$RETVAL" != x0 ; then
656  #eh3 if (! $?NOOPTFILES ) set NOOPTFILES = (  )          FC_NAMEMANGLE=$default_nm
657  #eh3 if (! $?NOOPTFLAGS ) set NOOPTFLAGS = (  )          cat <<EOF>> genmake_errors
658    
659    WARNING: C test compile fails
660    WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
661    WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here
662    EOF
663            return 1
664        fi
665        c_tcall=`nm genmake_test.o 2>/dev/null | grep 'T ' | grep tcall | cut -d ' ' -f 3`
666        RETVAL=$?
667        if test "x$RETVAL" != x0 ; then
668            FC_NAMEMANGLE=$default_nm
669            cat <<EOF>> genmake_warnings
670    
671    WARNING: The "nm" command failed.
672    WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
673    WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here
674    EOF
675            return 1
676        fi
677        cat > genmake_tcomp.$FS <<EOF
678          subroutine tcall( string )
679          character*(*) string
680          call tsub( string )
681          end
682    EOF
683        $FC $FFLAGS -c genmake_tcomp.$FS >> genmake_warnings 2>&1
684        RETVAL=$?
685        if test "x$RETVAL" != x0 ; then
686            FC_NAMEMANGLE=$default_nm
687            cat <<EOF>> genmake_warnings
688    
689    WARNING: FORTRAN test compile fails -- please see "genmake_errors"
690    WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
691    WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here.
692    EOF
693            return 1
694        fi
695        f_tcall=`nm genmake_tcomp.o 2>/dev/null | grep 'T ' | grep tcall | cut -d ' ' -f 3`
696        RETVAL=$?
697        if test "x$RETVAL" != x0 ; then
698            FC_NAMEMANGLE=$default_nm
699            cat <<EOF>> genmake_warnings
700    
701    WARNING: The "nm" command failed.
702    WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
703    WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here.
704    EOF
705            return 1
706        fi
707    
708        c_a=`echo $c_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 1 | sed -e 's|Y||'`
709        f_a=`echo $f_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 1 | sed -e 's|Y||'`
710        c_b=`echo $c_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 2 | sed -e 's|Y||'`
711        f_b=`echo $f_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 2 | sed -e 's|Y||'`
712    
713        nmangle="X"
714        if test "x$c_a" != "x$f_a" ; then
715            comm="echo x$f_a | sed -e 's|x$c_a||'"
716            a=`eval $comm`
717            nmangle="$a ## $nmangle"
718        fi
719        if test "x$c_b" != "x$f_b" ; then
720            comm="echo x$f_b | sed -e 's|x$c_b||'"
721            b=`eval $comm`
722            nmangle="$nmangle ## $b"
723        fi
724    
725        FC_NAMEMANGLE="#define FC_NAMEMANGLE(X)  $nmangle"
726    
727        #  cleanup the testing files
728        rm -f genmake_tcomp.* genmake_test.*
729    }
730    
731    
732    check_HAVE_CLOC()  {
733        get_fortran_c_namemangling
734        cat <<EOF > genmake_tc_1.c
735    $FC_NAMEMANGLE
736    #include <stdio.h>
737    #include <stdlib.h>
738    #include <unistd.h>
739    #include <assert.h>
740    #include <sys/time.h>
741    void FC_NAMEMANGLE(cloc) ( double *curtim )
742    {
743     struct timeval tv1;
744     gettimeofday(&tv1 , (void *)NULL );
745     *curtim =  (double)((tv1.tv_usec)+(tv1.tv_sec)*1.E6);
746     *curtim = *curtim/1.E6;
747    }
748    EOF
749        COMM="$CC $CFLAGS -c genmake_tc_1.c"
750        echo $COMM >> genmake_warnings
751        $COMM >> genmake_warnings 2>&1
752        RET_C=$?
753        cat <<EOF > genmake_tc_2.$FS
754          program hello
755          REAL*8 wtime
756          external cloc
757          call cloc(wtime)
758          print *," HELLO WORLD", wtime
759          end
760    EOF
761        COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
762        echo $COMM >> genmake_warnings
763        $COMM >> genmake_warnings 2>&1
764        RET_F=$?
765        test -x ./genmake_tc  &&  ./genmake_tc >> genmake_warnings 2>&1
766        RETVAL=$?
767        if test "x$RETVAL" = x0 ; then
768            HAVE_CLOC=t
769            DEFINES="$DEFINES -DHAVE_CLOC"
770        fi
771        rm -f genmake_tc*
772    }
773    
774    
775    check_HAVE_SIGREG()  {
776        if test ! "x$HAVE_SIGREG" = x ; then
777            return
778        fi
779        get_fortran_c_namemangling
780        cat <<EOF > genmake_tc_1.c
781    $FC_NAMEMANGLE
782    #include <stdlib.h>
783    #include <stdio.h>
784    #include <signal.h>
785    #include <errno.h>
786    #include <ucontext.h>
787    
788    int * ip;
789    
790    static void killhandler(
791        unsigned int sn, siginfo_t  si, struct ucontext *sc )
792    {
793        *ip = *ip + 1;
794        return;
795    }
796    
797    void FC_NAMEMANGLE(sigreg) (int * aip)
798    {
799        struct sigaction s;
800        ip = aip;
801        s.sa_flags = SA_SIGINFO;
802        s.sa_sigaction = (void *)killhandler;
803        if(sigaction (SIGTERM,&s,(struct sigaction *)NULL)) {
804            printf("Sigaction returned error = %d\n", errno);
805            exit(0);
806        }
807        return;
808    }
809    EOF
810        COMM="$CC $CFLAGS -c genmake_tc_1.c"
811        echo $COMM >> genmake_warnings
812        $COMM >> genmake_warnings 2>&1
813        RET_C=$?
814        cat <<EOF > genmake_tc_2.$FS
815          program hello
816          integer anint
817          common /iv/ anint
818          external sigreg
819          call sigreg(anint)
820          end
821    EOF
822        echo >> genmake_warnings
823        echo "running: check_HAVE_SIGREG()" >> genmake_warnings
824        cat genmake_tc_2.$FS >> genmake_warnings
825        COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
826        echo $COMM >> genmake_warnings
827        $COMM >> genmake_warnings 2>&1
828        RETVAL=$?
829        if test "x$RETVAL" = x0 ; then
830            HAVE_SIGREG=t
831            DEFINES="$DEFINES -DHAVE_SIGREG"
832        fi
833        rm -f genmake_tc*
834    }
835    
836    
837    check_HAVE_SETRLSTK()  {
838        if test "x$HAVE_SETRLSTK" = xt ; then
839            DEFINES="$DEFINES -DHAVE_SETRLSTK"
840            return
841        fi  
842        if test ! "x$HAVE_SETRLSTK" = x ; then
843            return
844        fi
845        get_fortran_c_namemangling
846        cat <<EOF > genmake_tc_1.c
847    $FC_NAMEMANGLE
848    #include <sys/time.h>
849    #include <sys/resource.h>
850    #include <unistd.h>
851    void FC_NAMEMANGLE(setrlstk) ()
852    {
853        struct rlimit rls;
854        rls.rlim_cur = RLIM_INFINITY;
855        rls.rlim_max = RLIM_INFINITY;
856        setrlimit(RLIMIT_STACK, &rls);
857        return;
858    }
859    EOF
860        COMM="$CC $CFLAGS -c genmake_tc_1.c"
861        echo $COMM >> genmake_warnings
862        $COMM >> genmake_warnings 2>&1
863        RET_C=$?
864        cat <<EOF > genmake_tc_2.$FS
865          program hello
866          external setrlstk
867          call setrlstk()
868          end
869    EOF
870        echo >> genmake_warnings
871        echo "running: check_HAVE_SETRLSTK()" >> genmake_warnings
872        cat genmake_tc_2.$FS >> genmake_warnings
873        COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
874        echo $COMM >> genmake_warnings
875        $COMM >> genmake_warnings 2>&1
876        RETVAL=$?
877        if test "x$RETVAL" = x0 ; then
878            HAVE_SETRLSTK=t
879            DEFINES="$DEFINES -DHAVE_SETRLSTK"
880        fi
881        rm -f genmake_tc*
882    }
883    
884    
885    check_HAVE_STAT()  {
886        get_fortran_c_namemangling
887        cat <<EOF > genmake_tc_1.c
888    $FC_NAMEMANGLE
889    #include <stdio.h>
890    #include <stdlib.h>
891    #include <unistd.h>
892    #include <sys/stat.h>
893    #include <sys/types.h>
894    void FC_NAMEMANGLE(tfsize) ( int *nbyte )
895    {
896        char name[512];
897        struct stat astat;
898    
899        name[0] = 'a'; name[1] = '\0';
900        if (! stat(name, &astat))
901            *nbyte = (int)(astat.st_size);
902        else
903            *nbyte = -1;
904    }
905    EOF
906        COMM="$CC $CFLAGS -c genmake_tc_1.c"
907        echo $COMM >> genmake_warnings
908        $COMM >> genmake_tc.log 2>&1
909        RET_C=$?
910        cat <<EOF > genmake_tc_2.$FS
911          program hello
912          integer nbyte
913          call tfsize(nbyte)
914          print *," HELLO WORLD", nbyte
915          end
916    EOF
917        echo >> genmake_warnings
918        echo "running: check_HAVE_STAT()" >> genmake_warnings
919        cat genmake_tc_2.$FS >> genmake_warnings
920        COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
921        echo $COMM >> genmake_warnings
922        $COMM >> genmake_tc.log 2>&1
923        RETVAL=$?
924        if test "x$RETVAL" = x0 ; then
925            HAVE_STAT=t
926            DEFINES="$DEFINES -DHAVE_STAT"
927        fi
928        rm -f genmake_tc*
929    }
930    
931    
932    check_netcdf_libs()  {
933        if test ! "x$SKIP_NETCDF_CHECK" = x ; then
934            return
935        fi
936        echo >> genmake_warnings
937        echo "running: check_netcdf_libs()" >> genmake_warnings
938        cat <<EOF > genmake_tnc.F
939          program fgennc
940    #include "netcdf.inc"
941    EOF
942        if test ! "x$MPI" = x ; then
943            echo '#include "mpif.h"' >> genmake_tnc.F
944        fi
945        cat <<EOF >> genmake_tnc.F
946          integer iret, ncid, xid
947          iret = nf_create('genmake_tnc.nc', NF_CLOBBER, ncid)
948          IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
949          iret = nf_def_dim(ncid, 'X', 11, xid)
950          IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
951          iret = nf_close(ncid)
952          IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
953          end
954    EOF
955        echo "===  genmake_tnc.F  ===" > genmake_tnc.log
956        cat genmake_tnc.F >> genmake_tnc.log
957        echo "===  genmake_tnc.F  ===" >> genmake_tnc.log
958        RET_CPP=f
959        COMM="cat genmake_tnc.F | $CPP $DEFINES $INCLUDES"
960        echo "$COMM" >> genmake_tnc.log
961        eval $COMM > genmake_tnc.$FS 2>/dev/null  &&  RET_CPP=t
962        if test "x$RET_CPP" = xf ; then
963            echo "  WARNING: CPP failed to pre-process the netcdf test." \
964                >> genmake_tnc.log
965            echo "    Please check that \$INCLUDES is properly set." \
966                >> genmake_tnc.log
967        fi
968        echo "$FC $FFLAGS $FOPTIM -c genmake_tnc.$FS  \ " >> genmake_tnc.log
969        echo "  &&  $LINK $FFLAGS $FOPTIM -o genmake_tnc.o $LIBS" >> genmake_tnc.log
970        $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1  \
971            &&  $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS >> genmake_tnc.log 2>&1
972        RET_COMPILE=$?
973        cat genmake_tnc.log >> genmake_warnings
974    
975        #EH3  Remove test program execution for machines that either disallow
976        #EH3  execution or cannot support it (eg. cross-compilers)
977        #EH3
978        #EH3 test -x ./genmake_tnc  &&  ./genmake_tnc >> genmake_tnc.log 2>&1
979        #EH3 RETVAL=$?
980        #EH3 if test "x$RET_COMPILE" = x0 -a "x$RETVAL" = x0 ; then
981    
982        if test "x$RET_COMPILE" = x0 ; then
983            HAVE_NETCDF=t
984        else
985            # try again with "-lnetcdf" added to the libs
986            echo "try again with added '-lnetcdf'" > genmake_tnc.log
987            echo "cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS \ " >> genmake_tnc.log
988            echo " &&  $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS \ " >> genmake_tnc.log
989            echo " &&  $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf" >> genmake_tnc.log
990            cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS 2>/dev/null  \
991                &&  $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1  \
992                &&  $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf >> genmake_tnc.log 2>&1
993            RET_COMPILE=$?
994            cat genmake_tnc.log >> genmake_warnings
995            if test "x$RET_COMPILE" = x0 ; then
996                LIBS="$LIBS -lnetcdf"
997                HAVE_NETCDF=t
998            else
999            # try again with "-lnetcdff" added to the libs
1000                echo "try again with added '-lnetcdff -lnetcdf'" > genmake_tnc.log
1001                echo "cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS \ " >> genmake_tnc.log
1002                echo " &&  $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS \ " >> genmake_tnc.log
1003                echo " &&  $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf" >> genmake_tnc.log
1004                cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS 2>/dev/null  \
1005                    &&  $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1  \
1006                    &&  $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdff -lnetcdf >> genmake_tnc.log 2>&1
1007                RET_COMPILE=$?
1008                cat genmake_tnc.log >> genmake_warnings
1009                if test "x$RET_COMPILE" = x0 ; then
1010                    LIBS="$LIBS -lnetcdff -lnetcdf"
1011                    HAVE_NETCDF=t
1012                fi
1013            fi
1014        fi
1015        rm -f genmake_tnc*
1016    }
1017    
1018    
1019    
1020    ###############################################################################
1021    #   Sequential part of script starts here
1022    ###############################################################################
1023    
1024  #  Set defaults here  #  Set defaults here
1025  COMMANDL="$0 $@"  COMMANDL="$0 $@"
# Line 290  PLATFORM= Line 1028  PLATFORM=
1028  LN=  LN=
1029  S64=  S64=
1030  KPP=  KPP=
1031  FC=  #FC=
1032    #CC=gcc
1033    #CPP=
1034  LINK=  LINK=
1035  DEFINES="-DWORDLENGTH=4"  DEFINES=
1036  PACKAGES=  PACKAGES=
1037  ENABLE=  ENABLE=
1038  DISABLE=  DISABLE=
1039  MAKEFILE=  # MAKEFILE=
1040  MAKEDEPEND=  # MAKEDEPEND=
1041  PDEPEND=  PDEPEND=
1042  DUMPSTATE=t  DUMPSTATE=t
1043  PDEFAULT=  PDEFAULT=
1044  OPTFILE=  OPTFILE=
1045  INCLUDES="-I."  INCLUDES="-I. $INCLUDES"
1046  FFLAGS=  FFLAGS=
1047  FOPTIM=  FOPTIM=
1048    FEXTRAFLAGS=
1049  CFLAGS=  CFLAGS=
1050  KFLAGS1=  KFLAGS1=
1051  KFLAGS2=  KFLAGS2=
1052    #LDADD=
1053  LIBS=  LIBS=
1054  KPPFILES=  KPPFILES=
1055  NOOPTFILES=  NOOPTFILES=
1056  NOOPTFLAGS=  NOOPTFLAGS=
1057    MPI=
1058    MPIPATH=
1059    TS=
1060    PAPIS=
1061    PCLS=
1062    FOOLAD=
1063    PAPI=
1064    PCL=
1065    HPMT=
1066    GSL=
1067    DEVEL=
1068    HAVE_TEST_L=
1069    
1070    # DEFINES checked by test compilation or command-line
1071    HAVE_SYSTEM=
1072    HAVE_FDATE=
1073    FC_NAMEMANGLE=
1074    HAVE_CLOC=
1075    # HAVE_SETRLSTK=
1076    HAVE_STAT=
1077    HAVE_NETCDF=
1078    HAVE_ETIME=
1079    IGNORE_TIME=
1080    
1081  MODS=  MODS=
1082  TOOLSDIR=  TOOLSDIR=
1083  SOURCEDIRS=  SOURCEDIRS=
1084  INCLUDEDIRS=  INCLUDEDIRS=
1085  STANDARDDIRS=  STANDARDDIRS="USE_THE_DEFAULT"
1086    
1087    G2ARGS=
1088    BASH=
1089  PWD=`pwd`  PWD=`pwd`
1090  MAKE=make  test "x$MAKE" = x  &&  MAKE=make
1091  AWK=awk  test "x$AWK" = x   &&  AWK=awk
1092  THISHOSTNAME=`hostname`  EMBED_SRC=
1093    THISHOST=`hostname`
1094  THISCWD=`pwd`  THISCWD=`pwd`
1095  THISDATE=`date`  THISDATE=`date`
1096    THISUSER=`echo $USER`
1097    THISVER=
1098  MACHINE=`uname -a`  MACHINE=`uname -a`
1099  EXECUTABLE=  EXECUTABLE=
1100  EXEHOOK=  EXEHOOK=
# Line 334  IEEE= Line 1104  IEEE=
1104  if test "x$MITGCM_IEEE" != x ; then  if test "x$MITGCM_IEEE" != x ; then
1105      IEEE=$MITGCM_IEEE      IEEE=$MITGCM_IEEE
1106  fi  fi
1107    FS=
1108    FS90=
1109    
1110  AUTODIFF_PKG_USED=f  AUTODIFF_PKG_USED=f
1111  AD_OPTFILE=  AD_OPTFILE=
# Line 350  TAMC_EXTRA= Line 1122  TAMC_EXTRA=
1122    
1123    
1124  #  The following state can be set directly by command-line switches  #  The following state can be set directly by command-line switches
1125  gm_s1="OPTFILE PDEPEND PDEFAULT MAKEFILE PLATFORM ROOTDIR MODS DISABLE ENABLE NOOPT"  gm_s1="OPTFILE PDEPEND PDEFAULT MAKEFILE PLATFORM ROOTDIR MODS DISABLE ENABLE"
1126  gm_s2="FC IEEE MPI JAM DUMPSTATE STANDARDDIRS"  gm_s2="FC CPP IEEE TS PAPIS PCLS PAPI PCL HPMT GSL DEVEL MPI JAM DUMPSTATE STANDARDDIRS"
1127    
1128  #  The following state is not directly set by command-line switches  #  The following state is not directly set by command-line switches
1129  gm_s3="LN S64 KPP LINK PACKAGES MAKEDEPEND PDEPEND PDEFAULT INCLUDES FFLAGS FOPTIM "  gm_s3="LN S64 KPP LINK PACKAGES MAKEDEPEND PDEPEND PDEFAULT INCLUDES FFLAGS FOPTIM FEXTRAFLAGS"
1130  gm_s4="CFLAGS KFLAGS1 KFLAGS2 LIBS KPPFILES NOOPTFILES NOOPTFLAGS"  gm_s4="CFLAGS KFLAGS1 KFLAGS2 LIBS KPPFILES NOOPTFILES NOOPTFLAGS"
1131  gm_s5="TOOLSDIR SOURCEDIRS INCLUDEDIRS PWD MAKE THISHOSTNAME THISDATE MACHINE"  gm_s5="TOOLSDIR SOURCEDIRS INCLUDEDIRS PWD MAKE THISHOST THISUSER THISDATE THISVER MACHINE"
1132  gm_s6="EXECUTABLE EXEHOOK EXEDIR PACKAGES_CONF"  gm_s6="EXECUTABLE EXEHOOK EXEDIR PACKAGES_CONF"
1133    gm_s7="HAVE_SYSTEM HAVE_FDATE FC_NAMEMANGLE HAVE_ETIME"
1134    
1135  #  The following are all related to adjoint/tangent-linear stuff  #  The following are all related to adjoint/tangent-linear stuff
1136  gm_s7="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"
1137  gm_s8="FTL_TAMC_FLAGS FTL_TAF_FLAGS SVD_TAMC_FLAGS SVD_TAF_FLAGS"  gm_s11="FTL_TAMC_FLAGS FTL_TAF_FLAGS SVD_TAMC_FLAGS SVD_TAF_FLAGS"
1138  gm_s9="TAF_EXTRA TAMC_EXTRA"  gm_s12="TAF_EXTRA TAMC_EXTRA"
1139    
1140  gm_state="COMMANDL $gm_s1 $gm_s2 $gm_s3 $gm_s4 $gm_s5 $gm_s6 $gm_s7 $gm_s8 $gm_s9"  gm_state="COMMANDL $gm_s1 $gm_s2 $gm_s3 $gm_s4 $gm_s5 $gm_s6 $gm_s7"
1141    gm_state="$gm_state $gm_s10 $gm_s11 $gm_s12"
1142    
1143    cat <<EOF
1144    
1145    GENMAKE :
1146    
1147    A program for GENerating MAKEfiles for the MITgcm project.  For a
1148    quick list of options, use "genmake -h" or for more detail see:
1149    
1150      http://mitgcm.org/devel_HOWTO/
1151    
1152    EOF
1153    
 echo  
1154  echo "===  Processing options files and arguments  ==="  echo "===  Processing options files and arguments  ==="
1155  gm_local="genmake_local"  gm_local="genmake_local"
1156  for i in . $MODS ; do  printf "  getting local config information:  "
1157      if test -r $i/$gm_local ; then  if test -f $gm_local ; then
         source $i/$gm_local  
         break  
     fi  
 done  
 echo -n "  getting local config information:  "  
 if test -e $gm_local ; then  
1158      echo "using $gm_local"      echo "using $gm_local"
1159      source $gm_local      . $gm_local
1160      # echo "DISABLE=$DISABLE"      # echo "DISABLE=$DISABLE"
1161      # echo "ENABLE=$ENABLE"      # echo "ENABLE=$ENABLE"
1162  else  else
1163      echo "none found"      echo "none found"
1164  fi  fi
1165    
1166  #  echo "$0::$1:$2:$3:$4:$5:$6:$7:"  #echo "$0::$1:$2:$3:$4:$5:$6:$7:"
1167  #OPTIONS=  #OPTIONS=
1168  #n=0  #n=0
1169  #for i ; do  #for i ; do
# Line 398  fi Line 1175  fi
1175  #done  #done
1176  #parse_options  #parse_options
1177  ac_prev=  ac_prev=
1178  for ac_option ; do  for ac_option in "$@" ; do
1179    
1180        G2ARGS="$G2ARGS \"$ac_option\""
1181    
1182      # If the previous option needs an argument, assign it.      # If the previous option needs an argument, assign it.
1183      if test -n "$ac_prev"; then      if test -n "$ac_prev"; then
# Line 421  for ac_option ; do Line 1200  for ac_option ; do
1200          -optfile=* | --optfile=* | -of=* | --of=*)          -optfile=* | --optfile=* | -of=* | --of=*)
1201              OPTFILE=$ac_optarg ;;              OPTFILE=$ac_optarg ;;
1202                    
1203          -adoptfile | --adoptfile | -ad | --ad)          -adoptfile | --adoptfile | -adof | --adof)
1204              ac_prev=AD_OPTFILE ;;              ac_prev=AD_OPTFILE ;;
1205          -adoptfile=* | --adoptfile=* | -adof=* | --adof=*)          -adoptfile=* | --adoptfile=* | -adof=* | --adof=*)
1206              AD_OPTFILE=$ac_optarg ;;              AD_OPTFILE=$ac_optarg ;;
# Line 441  for ac_option ; do Line 1220  for ac_option ; do
1220          -make=* | --make=* | -m=* | --m=*)          -make=* | --make=* | -m=* | --m=*)
1221              MAKE=$ac_optarg ;;              MAKE=$ac_optarg ;;
1222                    
1223            -bash | --bash)
1224                ac_prev=BASH ;;
1225            -bash=* | --bash=*)
1226                BASH=$ac_optarg ;;
1227            
1228            -makedepend | --makedepend | -md | --md)
1229                ac_prev=MAKEDEPEND ;;
1230            -makedepend=* | --makedepend=* | -md=* | --md=*)
1231                MAKEDEPEND=$ac_optarg ;;
1232            
1233          -makefile | --makefile | -ma | --ma)          -makefile | --makefile | -ma | --ma)
1234              ac_prev=MAKEFILE ;;              ac_prev=MAKEFILE ;;
1235          -makefile=* | --makefile=* | -ma=* | --ma=*)          -makefile=* | --makefile=* | -ma=* | --ma=*)
1236              MAKEFILE=$ac_optarg ;;              MAKEFILE=$ac_optarg ;;
1237                    
1238          -platform | --platform | -pl | --pl)          -platform | --platform | -pl | --pl | -platform=* | --platform=* | -pl=* | --pl=*)
1239              ac_prev=PLATFORM ;;              echo "ERROR: The platform option has been removed.  Please specify"
1240          -platform=* | --platform=* | -pl=* | --pl=*)              echo "  the build options using the \"optfile\" mechanism."
1241              PLATFORM=$ac_optarg ;;              echo
1242                usage
1243                ;;
1244                    
1245          -rootdir | --rootdir | -rd | --rd)          -rootdir | --rootdir | -rd | --rd)
1246              ac_prev=ROOTDIR ;;              ac_prev=ROOTDIR ;;
# Line 476  for ac_option ; do Line 1267  for ac_option ; do
1267          -standarddirs=* | --standarddirs=*)          -standarddirs=* | --standarddirs=*)
1268              STANDARDDIRS=$ac_optarg ;;              STANDARDDIRS=$ac_optarg ;;
1269    
         -noopt | --noopt)  
             ac_prev=NOOPT ;;  
         -noopt=* | --noopt=*)  
             NOOPT=$ac_optarg ;;  
           
1270  #           -cpp | --cpp)  #           -cpp | --cpp)
1271  #               ac_prev=cpp ;;  #               ac_prev=cpp ;;
1272  #           -cpp=* | --cpp=*)  #           -cpp=* | --cpp=*)
1273  #               CPP=$ac_optarg ;;  #               CPP=$ac_optarg ;;
1274                        
1275            -cc | --cc)
1276                ac_prev=CC ;;
1277            -cc=* | --cc=*)
1278                CC=$ac_optarg ;;
1279            
1280          -fortran | --fortran | -fc | --fc)          -fortran | --fortran | -fc | --fc)
1281              ac_prev=FC ;;              ac_prev=FC ;;
1282          -fc=* | --fc=*)          -fc=* | --fc=*)
1283              FC=$ac_optarg ;;              FC=$ac_optarg ;;
1284                    
1285            -fs | --fs)
1286                ac_prev=FS ;;
1287            -fs=* | --fs=*)
1288                FS=$ac_optarg ;;
1289            
1290            -fs90 | --fs90)
1291                ac_prev=FS90 ;;
1292            -fs90=* | --fs90=*)
1293                FS90=$ac_optarg ;;
1294            
1295          -ieee | --ieee)          -ieee | --ieee)
1296              IEEE=true ;;              IEEE=true ;;
1297          -noieee | --noieee)          -noieee | --noieee)
1298              IEEE= ;;              IEEE= ;;
1299            
1300            -ts | --ts)
1301                TS=true ;;
1302            -papis | --papis)
1303                PAPIS=true ;;
1304            -pcls | --pcls)
1305                PCLS=true ;;
1306            -foolad | --foolad)
1307                FOOLAD=true ;;
1308            -papi | --papi)
1309                PAPI=true ;;
1310            -pcl | --pcl)
1311                PCL=true ;;
1312            -hpmt | --hpmt)
1313                HPMT=true ;;
1314    
1315            -gsl | --gsl)
1316                GSL=true ;;
1317    
1318            -devel | --devel)
1319                DEVEL=true ;;
1320    
1321          -mpi | --mpi)          -mpi | --mpi)
1322              MPI=true ;;              MPI=true ;;
1323          -nompi | --nompi)          -mpi=* | --mpi=*)
1324              MPI= ;;              MPIPATH=$ac_optarg
1325                MPI=true ;;
1326                    
1327          -jam | --jam)  #       -jam | --jam)
1328              JAM=1 ;;  #           JAM=1 ;;
1329          -nojam | --nojam)  #       -nojam | --nojam)
1330              JAM=0 ;;  #           JAM=0 ;;
1331                    
1332          -ds | --ds)          -ds | --ds)
1333              DUMPSTATE=t ;;              DUMPSTATE=t ;;
# Line 518  for ac_option ; do Line 1341  for ac_option ; do
1341              ac_prev=TAMC_EXTRA ;;              ac_prev=TAMC_EXTRA ;;
1342          -tamc_extra=* | --tamc_extra=*)          -tamc_extra=* | --tamc_extra=*)
1343              TAMC_EXTRA=$ac_optarg ;;              TAMC_EXTRA=$ac_optarg ;;
1344            
1345            -ignoretime | -ignore_time | --ignoretime | --ignore_time)
1346                IGNORE_TIME="-DIGNORE_TIME" ;;
1347    
1348            -es | --es | -embed-source | --embed-source)
1349                EMBED_SRC=t ;;
1350    
1351          -*)          -*)
1352              echo "Error: unrecognized option: "$ac_option              echo "Error: unrecognized option: "$ac_option
# Line 533  for ac_option ; do Line 1362  for ac_option ; do
1362            
1363  done  done
1364    
1365    
1366  if test -f ./.genmakerc ; then  if test -f ./.genmakerc ; then
1367      echo      echo
1368      echo "WARNING: genmake2 has detected a copy of the old-style \"./.genmakerc\""      echo "WARNING: genmake2 has detected a copy of the old-style \"./.genmakerc\""
1369      echo "  file.  This file format is no longer supported.  Please see:"      echo "  file.  This file format is no longer supported.  For directions on"
1370      echo      echo "  how to setup and use the new \"genmake2\" script, please see:"
1371      echo "    http://mitgcm.org/devel_HOWTO/"      echo "    http://mitgcm.org/devel_HOWTO/"
1372      echo      echo "  and send an email to MITgcm-support@mitgcm.org if you need help."
1373      echo "  for directions on how to setup and use the new \"genmake2\" input"      echo "WARNING: ignore \"./.genmakerc\" and continue."
     echo "  files and send an email to MITgcm-support@mitgcm.org if you want help."  
1374      echo      echo
1375  fi  fi
1376    
1377    #  Find the MITgcm ${ROOTDIR}
1378  if test "x${ROOTDIR}" = x ; then  if test "x${ROOTDIR}" = x ; then
1379      if test "${PWD##/*/}" = "bin" -a -d ../model -a -d ../eesup -a -d ../pkg ; then      tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1380        if test "x$tmp" = "xbin" -a -d ../model -a -d ../eesupp -a -d ../pkg ; then
1381          ROOTDIR=".."          ROOTDIR=".."
1382      else      else
1383          for d in . .. ../.. ../../.. ../../../.. ../../../../.. ; do          for d in . .. ../.. ../../.. ../../../.. ../../../../.. ; do
1384              if [ -d "$d/model" -a -d "$d/eesupp" -a -d "$d/pkg" ]; then              if [ -d "$d/model" -a -d "$d/eesupp" -a -d "$d/pkg" ]; then
1385                  ROOTDIR=$d                  ROOTDIR=$d
1386                  echo -n "Warning:  ROOTDIR was not specified but there appears to be"                  printf "Warning:  ROOTDIR was not specified but there appears to be"
1387                  echo " a copy of MITgcm at \"$ROOTDIR\" so we'll try it."                  echo " a copy of MITgcm at \"$ROOTDIR\" so we'll try it."
1388                  break                  break
1389              fi              fi
# Line 570  if test ! -d ${ROOTDIR} ; then Line 1401  if test ! -d ${ROOTDIR} ; then
1401      exit 1      exit 1
1402  fi  fi
1403    
1404    #  Find the MITgcm ${THISVER}
1405    version_file="${ROOTDIR}/doc/tag-index"
1406    if test -f $version_file ; then
1407        THISVER=`grep '^checkpoint' $version_file | head -1`
1408    #-  remove ./BUILD_INFO.h file if older than version_file
1409        if test -f ./BUILD_INFO.h -a ./BUILD_INFO.h -ot $version_file ; then
1410            echo "  remove ./BUILD_INFO.h (older than ${version_file})"
1411            rm -f ./BUILD_INFO.h
1412        fi
1413    fi
1414    
1415    if test "x$MAKEFILE" = x ; then
1416        MAKEFILE="Makefile"
1417    fi
1418    
1419  echo "  getting OPTFILE information:  "  echo "  getting OPTFILE information:  "
1420  if test "x${OPTFILE}" = x ; then  if test "x${OPTFILE}" = x ; then
1421      if test "x$MITGCM_OF" = x ; then      if test "x$MITGCM_OF" = x ; then
# Line 583  fi Line 1429  fi
1429  if test "x$OPTFILE" != xNONE ; then  if test "x$OPTFILE" != xNONE ; then
1430      if test -f "$OPTFILE" -a -r "$OPTFILE" ; then      if test -f "$OPTFILE" -a -r "$OPTFILE" ; then
1431          echo "    using OPTFILE=\"$OPTFILE\""          echo "    using OPTFILE=\"$OPTFILE\""
1432          source "$OPTFILE"          . "$OPTFILE"
1433          RETVAL=$?          RETVAL=$?
1434          if test "x$RETVAL" != x0 ; then          if test "x$RETVAL" != x0 ; then
1435              echo -n "Error: failed to source OPTFILE \"$OPTFILE\""              printf "Error: failed to source OPTFILE \"$OPTFILE\""
1436              echo "--please check that variable syntax is bash-compatible"              echo "--please check that variable syntax is bash-compatible"
1437              exit 1              exit 1
1438          fi          fi
# Line 610  fi Line 1456  fi
1456  if test "x${AD_OPTFILE}" != xNONE ; then  if test "x${AD_OPTFILE}" != xNONE ; then
1457      if test -f "$AD_OPTFILE" -a -r "$AD_OPTFILE" ; then      if test -f "$AD_OPTFILE" -a -r "$AD_OPTFILE" ; then
1458          echo "    using AD_OPTFILE=\"$AD_OPTFILE\""          echo "    using AD_OPTFILE=\"$AD_OPTFILE\""
1459          source "$AD_OPTFILE"          . "$AD_OPTFILE"
1460          RETVAL=$?          RETVAL=$?
1461          if test "x$RETVAL" != x0 ; then          if test "x$RETVAL" != x0 ; then
1462              echo -n "Error: failed to source AD_OPTFILE \"$AD_OPTFILE\""              printf "Error: failed to source AD_OPTFILE \"$AD_OPTFILE\""
1463              echo "--please check that variable syntax is bash-compatible"              echo "--please check that variable syntax is bash-compatible"
1464              exit 1              exit 1
1465          fi          fi
# Line 626  if test "x${AD_OPTFILE}" != xNONE ; then Line 1472  if test "x${AD_OPTFILE}" != xNONE ; then
1472      fi      fi
1473  fi  fi
1474    
1475  #  Check that FC, LINK, CPP, and S64 are defined.  If not, complain  #====================================================================
1476  #  and abort!  #  Set default values if not set by the optfile
1477    #
1478    #  Check that FC, CC, LINK, CPP, S64, LN, and MAKE are defined.  If not,
1479    #  either set defaults or complain and abort!
1480    if test ! "x$BASH" = x ; then
1481        # add a trailing space so that it works within the Makefile syntax (see below)
1482        BASH="$BASH "
1483    fi
1484  if test "x$FC" = x ; then  if test "x$FC" = x ; then
1485      cat <<EOF 1>&2      cat <<EOF 1>&2
1486    
1487  Error: no Fortran compiler: please specify using one of the following:  Error: no Fortran compiler: please specify using one of the following:
1488    1) within the options file ("FC=...") as specified by "-of=OPTFILE"    1) within the options file ("FC=...") as specified by "-of=OPTFILE"
1489    2) the "-fc=XXX" command-line option    2) the "-fc=XXX" command-line option
1490    3) the "./genmake_local" file    3) the "./genmake_local" file
1491    EOF
1492        exit 1
1493    fi
1494    if test "x$CC" = x ; then
1495        CC=cc
1496    #     cat <<EOF 1>&2
1497    # Error: no C compiler: please specify using one of the following:
1498    #   1) within the options file ("CC=...") as specified by "-of=OPTFILE"
1499    #   2) the "-cc=XXX" command-line option
1500    #   3) the "./genmake_local" file
1501    # EOF
1502    #     exit 1
1503    fi
1504    if test "x$LINK" = x ; then
1505        LINK=$FC
1506    fi
1507    if test "x$MAKE" = x ; then
1508        MAKE="make"
1509    fi
1510    if test "x$CPP" = x ; then
1511        CPP=cpp
1512    fi
1513    #EH3 === UGLY ===
1514    #  The following is an ugly little hack to check for $CPP in /lib/ and
1515    #  it should eventually be replaced with a more general function that
1516    #  searches a combo of the user's path and a list of "usual suspects"
1517    #  to find the correct location for binaries such as $CPP.
1518    for i in " " "/lib/" ; do
1519        echo "#define A a" | $i$CPP > test_cpp 2>&1 && CPP=$i$CPP
1520    done
1521    #EH3 === UGLY ===
1522    echo "#define A a" | $CPP > test_cpp 2>&1
1523    RETVAL=$?
1524    if test "x$RETVAL" != x0 ; then
1525        cat <<EOF 1>&2
1526    
1527    Error: C pre-processor "$CPP" failed the test case: please specify using:
1528    
1529      1) within the options file ("CPP=...") as specified by "-of=OPTFILE"
1530      2) the "./genmake_local" file
1531      3) with the CPP environment variable
1532    
1533    EOF
1534        exit 1
1535    else
1536        rm -f test_cpp
1537    fi
1538    look_for_makedepend
1539    if test "x$LN" = x ; then
1540        LN="ln -s"
1541    fi
1542    echo "test" > genmake_test_ln
1543    $LN genmake_test_ln genmake_tlink
1544    RETVAL=$?
1545    if test "x$RETVAL" != x0 ; then
1546        cat <<EOF 1>&2
1547    
1548    Error: The command "ln -s" failed -- please specify a working soft-link
1549      command in the optfile.
1550    
1551    EOF
1552        exit 1
1553    fi
1554    test -L genmake_tlink > /dev/null 2>&1
1555    RETVAL=$?
1556    if test "x$RETVAL" = x0 ; then
1557        HAVE_TEST_L=t
1558    fi
1559    rm -f genmake_test_ln genmake_tlink
1560    
1561    #  Check for broken *.F/*.f handling and fix if possible
1562    check_for_broken_Ff
1563    
1564    if test ! "x$MPI" = x ; then
1565          echo "  Turning on MPI cpp macros"
1566          DEFINES="$DEFINES -DALLOW_USE_MPI -DALWAYS_USE_MPI"
1567    fi
1568    
1569    if test ! "x$TS" = x ; then
1570          echo "  Turning on timing per timestep"
1571          if test ! "x$FOOLAD" = x ; then
1572                DEFINES="$DEFINES -DTIME_PER_TIMESTEP_SFP"
1573          else
1574                DEFINES="$DEFINES -DTIME_PER_TIMESTEP"
1575          fi
1576          PACKAGES="$PACKAGES showflops"
1577    fi
1578    if test ! "x$PAPIS" = x ; then
1579          echo "  Turning on PAPI flop summary per timestep"
1580          echo "  Please make sure PAPIINC, PAPILIB are defined"
1581          if test ! "x$FOOLAD" = x ; then
1582                DEFINES="$DEFINES -DUSE_PAPI_FLOPS_SFP"
1583          else
1584                DEFINES="$DEFINES -DUSE_PAPI_FLOPS"
1585          fi
1586          INCLUDES="$INCLUDES $PAPIINC"
1587          LIBS="$LIBS $PAPILIB"
1588          PACKAGES="$PACKAGES showflops"
1589    fi
1590    if test ! "x$PCLS" = x ; then
1591          echo "  Turning on PCL counter summary per timestep"
1592          echo "  Please make sure PCLINC, PCLLIB are defined"
1593          if test ! "x$FOOLAD" = x ; then
1594                DEFINES="$DEFINES -DUSE_PCL_FLOPS_SFP"
1595          else
1596                DEFINES="$DEFINES -DUSE_PCL_FLOPS"
1597          fi
1598          INCLUDES="$INCLUDES $PCLINC"
1599          LIBS="$LIBS $PCLLIB"
1600          PACKAGES="$PACKAGES showflops"
1601    fi
1602    if test ! "x$PAPI" = x ; then
1603          if test ! "x$PAPIS" = x ; then
1604              echo "  PAPI performance analysis and flop summary per timestep cannot co-exist!"
1605              echo "  Sticking with PAPI flop summary per timestep!"
1606          else
1607              echo "  Turning on performance analysis with PAPI"
1608              echo "  Please make sure PAPIINC, PAPILIB are defined"
1609              DEFINES="$DEFINES -DUSE_PAPI"
1610              INCLUDES="$INCLUDES $PAPIINC"
1611              LIBS="$LIBS $PAPILIB"
1612          fi
1613    fi
1614    if test ! "x$PCL" = x ; then
1615          if test ! "x$PCLS" = x ; then
1616              echo "  PCL performance analysis and flop summary per timestep cannot co-exist!"
1617              echo "  Sticking with PCL flop summary per timestep!"
1618          else
1619              echo "  Turning on performance analysis with PCL"
1620              echo "  Please make sure PCLINC, PCLLIB are defined"
1621              DEFINES="$DEFINES -DUSE_PCL"
1622              INCLUDES="$INCLUDES $PCLINC"
1623              LIBS="$LIBS $PCLLIB"
1624          fi
1625    fi
1626    if test ! "x$HPMT" = x ; then
1627          if test ! "x$PAPI" = x ; then
1628              echo "  PAPI and the HPM Toolkit cannot co-exist!"
1629              echo "  Sticking with PAPI!"
1630          else if test ! "x$PCL" = x ; then
1631              echo "  PCL and the HPM Toolkit cannot co-exist!"
1632              echo "  Sticking with PCL!"
1633          else
1634              echo "  Turning on performance analysis with the HPM Toolkit"
1635              echo "  Please make sure HPMTINC, HPMTLIB are defined"
1636              DEFINES="$DEFINES -DUSE_LIBHPM"
1637              INCLUDES="$INCLUDES $HPMTINC"
1638              LIBS="$LIBS $HPMTLIB"
1639          fi
1640          fi
1641    fi
1642    if test ! "x$GSL" = x ; then
1643          echo "  Turning on use of GSL to control floating point calculations"
1644          echo "  Please make sure GSLINC, GSLLIB are defined"
1645          DEFINES="$DEFINES -DUSE_GSL_IEEE"
1646          INCLUDES="$INCLUDES $GSLINC"
1647          LIBS="$LIBS $GSLLIB"
1648    fi
1649    
1650    printf "\n===  Checking system libraries  ===\n"
1651    printf "  Do we have the system() command using $FC...  "
1652    cat > genmake_tcomp.$FS <<EOF
1653          program hello
1654          call system('echo hi')
1655          end
1656    EOF
1657    $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1658    RETVAL=$?
1659    if test "x$RETVAL" = x0 ; then
1660        HAVE_SYSTEM=t
1661        DEFINES="$DEFINES -DHAVE_SYSTEM"
1662        echo "yes"
1663    else
1664        HAVE_SYSTEM=
1665        echo "no"
1666    fi
1667    rm -f genmake_tcomp*
1668    
1669    printf "  Do we have the fdate() command using $FC...  "
1670    cat > genmake_tcomp.$FS <<EOF
1671          program hello
1672          CHARACTER*(128) string
1673          string = ' '
1674          call fdate( string )
1675          print *, string
1676          end
1677    EOF
1678    $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1679    RETVAL=$?
1680    if test "x$RETVAL" = x0 ; then
1681        HAVE_FDATE=t
1682        DEFINES="$DEFINES -DHAVE_FDATE"
1683        echo "yes"
1684    else
1685        HAVE_FDATE=
1686        echo "no"
1687    fi
1688    rm -f genmake_tcomp*
1689    
1690    printf "  Do we have the etime() command using $FC...  "
1691    cat > genmake_tcomp.$FS <<EOF
1692          program hello
1693          REAL*4 ACTUAL, TARRAY(2)
1694          EXTERNAL ETIME
1695          REAL*4 ETIME
1696          actual = etime( tarray )
1697          print *, tarray
1698          end
1699  EOF  EOF
1700      exit 1  $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1701    RETVAL=$?
1702    if test "x$RETVAL" = x0 ; then
1703        HAVE_ETIME=t
1704        DEFINES="$DEFINES -DHAVE_ETIME"
1705        echo "yes"
1706    else
1707        HAVE_ETIME=
1708        echo "no"
1709  fi  fi
1710  if test "x$LINK" = x ; then  rm -f genmake_tcomp*
1711      LINK=$FC  
1712    printf "  Can we call simple C routines (here, \"cloc()\") using $FC...  "
1713    check_HAVE_CLOC
1714    if test "x$HAVE_CLOC" != x ; then
1715        echo "yes"
1716    else
1717        echo "no"
1718        if test "x$EMBED_SRC" = xt ; then
1719            echo "    WARNING: you requested file embedding but it has"
1720            echo "      been disabled since C code cannot be called"
1721            EMBED_SRC=
1722        fi
1723  fi  fi
1724  if test "x$CPP" = x ; then  rm -f genmake_t*
1725      CPP="cpp"  
1726    printf "  Can we unlimit the stack size using $FC...  "
1727    check_HAVE_SETRLSTK
1728    if test "x$HAVE_SETRLSTK" = xt ; then
1729        echo "yes"
1730    else
1731        echo "no"
1732  fi  fi
1733  echo "#define A a" | $CPP > test_cpp 2>&1  rm -f genmake_t*
 RETVAL=$?  
 if test "x$RETVAL" != x0 ; then  
     cat <<EOF 1>&2  
1734    
1735  Error: C pre-processor "$CPP" failed the test case: please specify using:  printf "  Can we register a signal handler using $FC...  "
1736    check_HAVE_SIGREG
1737    if test "x$HAVE_SIGREG" = xt ; then
1738        echo "yes"
1739    else
1740        echo "no"
1741    fi
1742    rm -f genmake_t*
1743    
1744    1) within the options file ("CPP=...") as specified by "-of=OPTFILE"  printf "  Can we use stat() through C calls...  "
1745    2) the "./genmake_local" file  check_HAVE_STAT
1746    if test "x$HAVE_STAT" != x ; then
1747        echo "yes"
1748    else
1749        echo "no"
1750    fi
1751    rm -f genmake_t*
1752    
1753  EOF  printf "  Can we create NetCDF-enabled binaries...  "
1754      exit 1  check_netcdf_libs
1755    if test "x$HAVE_NETCDF" != x ; then
1756        echo "yes"
1757  else  else
1758      rm -f test_cpp      echo "no"
1759    fi
1760    DEFINES="$DEFINES $IGNORE_TIME"
1761    
1762    if test "x$EMBED_SRC" = xt ; then
1763        build_embed_encode
1764  fi  fi
1765  if test "x$MAKEDEPEND" = x ; then  if test "x$EMBED_SRC" = xt ; then
1766      MAKEDEPEND=makedepend      ENABLE="$ENABLE embed_files"
1767  fi  fi
1768    
1769    
1770  printf "\n===  Setting defaults  ===\n"  printf "\n===  Setting defaults  ===\n"
1771  echo -n "  Adding MODS directories:  "  printf "  Adding MODS directories:  "
1772  for d in $MODS ; do  for d in $MODS ; do
1773      if test ! -d $d ; then      if test ! -d $d ; then
1774          echo          echo
1775          echo "Error: MODS directory \"$d\" not found!"          echo "Error: MODS directory \"$d\" not found!"
1776          exit 1          exit 1
1777      else      else
1778          echo -n " $d"          printf " $d"
1779          SOURCEDIRS="$SOURCEDIRS $d"          SOURCEDIRS="$SOURCEDIRS $d"
1780          INCLUDEDIRS="$INCLUDEDIRS $d"          INCLUDEDIRS="$INCLUDEDIRS $d"
1781      fi      fi
1782  done  done
1783  echo  echo
1784    
 if test "x$MAKEFILE" = x ; then  
     MAKEFILE="Makefile"  
 fi  
1785  if test "x${PLATFORM}" = x ; then  if test "x${PLATFORM}" = x ; then
1786      PLATFORM=$p_PLATFORM      PLATFORM=$p_PLATFORM
1787  fi  fi
1788    
1789  if test "x${EXEDIR}" = x ; then  if test "x${EXEDIR}" = x ; then
1790      if test "${PWD##/*/}" = "bin" -a -d ../exe -a $ROOTDIR = .. ; then      tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1791        if test "x$tmp" = "xbin" -a -d ../exe -a $ROOTDIR = .. ; then
1792          EXEDIR=../exe          EXEDIR=../exe
1793      else      else
1794          EXEDIR=.          EXEDIR=.
# Line 701  if test "x${TOOLSDIR}" = x ; then Line 1803  if test "x${TOOLSDIR}" = x ; then
1803      TOOLSDIR="$ROOTDIR/tools"      TOOLSDIR="$ROOTDIR/tools"
1804  fi  fi
1805  if test ! -d ${TOOLSDIR} ; then  if test ! -d ${TOOLSDIR} ; then
1806      echo "Error: the specified $TOOLSDIR (\"$TOOLSDIR\") does not exist!"      echo "Error: the specified TOOLSDIR (\"$TOOLSDIR\") does not exist!"
1807      exit 1      exit 1
1808  fi  fi
1809  if test "x$S64" = x ; then  if test "x$S64" = x ; then
1810      S64='$(TOOLSDIR)/set64bitConst.sh'      echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.sh > /dev/null 2>&1
1811        RETVAL=$?
1812        if test "x${RETVAL}" = x0 ; then
1813            S64='$(TOOLSDIR)/set64bitConst.sh'
1814        else
1815            echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.csh > /dev/null 2>&1
1816            RETVAL=$?
1817            if test "x${RETVAL}" = x0 ; then
1818                S64='$(TOOLSDIR)/set64bitConst.csh'
1819            else
1820                cat <<EOF
1821    
1822    ERROR: neither of the two default scripts:
1823    
1824        ${TOOLSDIR}/set64bitConst.sh
1825        ${TOOLSDIR}/set64bitConst.csh
1826    
1827      are working so please check paths or specify (with \$S64) a
1828      working version of this script.
1829    
1830    EOF
1831                exit 1
1832            fi
1833        fi
1834  fi  fi
1835    THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`
1836    
1837  EXECUTABLE=${EXECUTABLE:-mitgcmuv}  EXECUTABLE=${EXECUTABLE:-mitgcmuv}
1838    
# Line 715  EXECUTABLE=${EXECUTABLE:-mitgcmuv} Line 1841  EXECUTABLE=${EXECUTABLE:-mitgcmuv}
1841  #  they appear as regular source code  #  they appear as regular source code
1842  if test -r $ROOTDIR"/eesupp/src/Makefile" ; then  if test -r $ROOTDIR"/eesupp/src/Makefile" ; then
1843      echo "  Making source files in eesupp from templates"      echo "  Making source files in eesupp from templates"
1844      $MAKE -C $ROOTDIR"/eesupp/src/" > make_eesupp.errors 2>&1      ( cd $ROOTDIR"/eesupp/src/" && $MAKE ) > make_eesupp.errors 2>&1
1845      RETVAL=$?      RETVAL=$?
1846      if test "x${RETVAL}" = x0 ; then      if test "x${RETVAL}" = x0 ; then
1847          rm -f make_eesupp.errors          rm -f make_eesupp.errors
1848      else      else
1849          echo "Error: problem encountered while building source files in eesupp:"          echo "Error: problem encountered while building source files in eesupp:"
1850          cat make_eesupp.errors          cat make_eesupp.errors 1>&2
1851          exit 1          exit 1
1852      fi      fi
1853  fi  fi
1854    
1855    #same for pkg/exch2 and pkg/regrid
1856    for pdir in exch2 regrid ; do
1857        if test -r $ROOTDIR"/pkg/${pdir}/Makefile" ; then
1858            echo "  Making source files in pkg/${pdir} from templates"
1859            ( cd $ROOTDIR"/pkg/"${pdir} && $MAKE ) > make_${pdir}.errors 2>&1
1860            RETVAL=$?
1861            if test "x${RETVAL}" = x0 ; then
1862                rm -f make_${pdir}.errors
1863            else
1864                echo "Error: problem encountered while building source files in pkg/${pdir}:"
1865                cat make_${pdir}.errors 1>&2
1866                exit 1
1867            fi
1868        fi
1869    done
1870    
1871  printf "\n===  Determining package settings  ===\n"  printf "\n===  Determining package settings  ===\n"
1872  if  test "x${PDEPEND}" = x ; then  if  test "x${PDEPEND}" = x ; then
1873      tmp=$ROOTDIR"/pkg/pkg_depend"      tmp=$ROOTDIR"/pkg/pkg_depend"
# Line 752  if test ! "x${RETVAL}" = x0 ; then Line 1894  if test ! "x${RETVAL}" = x0 ; then
1894      echo "Error: unable to parse package dependencies -- please check PDEPEND=\"$PDEPEND\""      echo "Error: unable to parse package dependencies -- please check PDEPEND=\"$PDEPEND\""
1895      exit 1      exit 1
1896  fi  fi
1897  source ./.pd_tmp  . ./.pd_tmp
1898  rm -f ./.pd_tmp  rm -f ./.pd_tmp
1899    
1900  #  Search for default packages.  Note that a "$ROOTDIR/pkg/pkg_groups"  #  Search for default packages.  Note that a "$ROOTDIR/pkg/pkg_groups"
1901  #  file should eventually be added so that, for convenience, one can  #  file should eventually be added so that, for convenience, one can
1902  #  specify groups of packages using names like "ocean" and "atmosphere".  #  specify groups of packages using names like "ocean" and "atmosphere".
1903  echo  -n "  checking default package list:  "  echo "  checking default package list:  "
1904  if test "x${PDEFAULT}" = x ; then  if test "x${PDEFAULT}" = x ; then
1905      for i in "." $MODS ; do      for i in "." $MODS ; do
1906          if test -r $i"/packages.conf" ; then          if test -r $i"/packages.conf" ; then
# Line 771  if test "x${PDEFAULT}" = x ; then Line 1913  if test "x${PDEFAULT}" = x ; then
1913      PDEFAULT="$ROOTDIR/pkg/pkg_default"      PDEFAULT="$ROOTDIR/pkg/pkg_default"
1914  fi  fi
1915  if test "x${PDEFAULT}" = xNONE ; then  if test "x${PDEFAULT}" = xNONE ; then
1916      echo "default packages file disabled"      echo "    default packages file disabled"
1917  else  else
1918      if test ! -r $PDEFAULT ; then      if test ! -r $PDEFAULT ; then
         echo ""  
1919          echo "Warning:  can't read default packages from PDEFAULT=\"$PDEFAULT\""          echo "Warning:  can't read default packages from PDEFAULT=\"$PDEFAULT\""
1920      else      else
1921          echo "  using PDEFAULT=\"$PDEFAULT\""          echo "    using PDEFAULT=\"$PDEFAULT\""
1922          #  Strip the comments and add all the names          #  Strip the comments and add all the names
1923          def=`cat $PDEFAULT | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`          def=`cat $PDEFAULT | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
1924          RETVAL=$?          RETVAL=$?
1925          if test "x${RETVAL}" != x0 ; then          if test "x${RETVAL}" != x0 ; then
1926              echo -n "Error: can't parse default package list "              printf "Error: can't parse default package list "
1927              echo "-- please check PDEFAULT=\"$PDEFAULT\""              echo "-- please check PDEFAULT=\"$PDEFAULT\""
1928              exit 1              exit 1
1929          fi          fi
# Line 790  else Line 1931  else
1931              PACKAGES="$PACKAGES $i"              PACKAGES="$PACKAGES $i"
1932          done          done
1933          echo "    before group expansion packages are: $PACKAGES"          echo "    before group expansion packages are: $PACKAGES"
1934          expand_pkg_groups          RET=1
1935            while test $RET = 1 ; do expand_pkg_groups; RET=$?; done
1936          echo "    after group expansion packages are:  $PACKAGES"          echo "    after group expansion packages are:  $PACKAGES"
1937      fi      fi
1938  fi  fi
1939    
1940  echo "  applying DISABLE settings"  echo "  applying DISABLE settings"
1941    for i in $PACKAGES ; do
1942        echo $i >> ./.tmp_pack
1943    done
1944    for i in `grep  "-" ./.tmp_pack` ; do
1945        j=`echo $i | sed 's/[-]//'`
1946        DISABLE="$DISABLE $j"
1947    done
1948  pack=  pack=
1949  for p in $PACKAGES ; do  for p in $PACKAGES ; do
1950      addit="t"      addit="t"
# Line 812  PACKAGES="$pack" Line 1961  PACKAGES="$pack"
1961  echo "  applying ENABLE settings"  echo "  applying ENABLE settings"
1962  echo "" > ./.tmp_pack  echo "" > ./.tmp_pack
1963  PACKAGES="$PACKAGES $ENABLE"  PACKAGES="$PACKAGES $ENABLE"
1964    # Test if each explicitly referenced package exists
1965  for i in $PACKAGES ; do  for i in $PACKAGES ; do
1966      if test ! -d "$ROOTDIR/pkg/$i" ; then      j=`echo $i | sed 's/[-+]//'`
1967        if test ! -d "$ROOTDIR/pkg/$j" ; then
1968          echo "Error: can't find package $i at \"$ROOTDIR/pkg/$i\""          echo "Error: can't find package $i at \"$ROOTDIR/pkg/$i\""
1969          exit 1          exit 1
1970      fi      fi
1971      echo $i >> ./.tmp_pack      echo $i >> ./.tmp_pack
1972  done  done
 pack=`cat ./.tmp_pack | sort | uniq`  
 rm -f ./.tmp_pack  
1973  PACKAGES=  PACKAGES=
1974  for i in $pack ; do  for i in `grep -v "-" ./.tmp_pack | sort | uniq` ; do
1975      PACKAGES="$PACKAGES $i"      PACKAGES="$PACKAGES $i"
1976  done  done
1977    rm -f ./.tmp_pack
1978  echo "    packages are:  $PACKAGES"  echo "    packages are:  $PACKAGES"
1979    
1980    #  Check for package MNC: if NetCDF is available, then build the MNC
1981    #  template files ; otherwise, delete mnc from the list of packages.
1982    echo $PACKAGES | grep ' mnc ' > /dev/null 2>&1
1983    RETVAL=$?
1984    if test "x$RETVAL" = x0 ; then
1985        if test "x$HAVE_NETCDF" != xt ; then
1986            cat <<EOF
1987    
1988    *********************************************************************
1989    WARNING: the "mnc" package was enabled but tests failed to compile
1990      NetCDF applications.  Please check that:
1991    
1992      1) NetCDF is correctly installed for this compiler and
1993      2) the LIBS variable (within the "optfile") specifies the correct
1994           NetCDF library to link against.
1995    
1996      Due to this failure, the "mnc" package is now DISABLED.
1997    *********************************************************************
1998    
1999    EOF
2000            PACKAGES=`echo $PACKAGES | sed -e 's/mnc//g'`
2001            DISABLE="$DISABLE mnc"
2002        else
2003            ( cd $ROOTDIR"/pkg/mnc" && $MAKE testclean && $MAKE templates ) > make_mnc.errors 2>&1
2004            RETVAL=$?
2005            if test "x${RETVAL}" = x0 ; then
2006                rm -f make_mnc.errors
2007            else
2008                echo "Error: problem encountered while building source files in pkg/mnc:"
2009                cat make_mnc.errors 1>&2
2010                exit 1
2011            fi
2012        fi
2013    fi
2014    
2015    #  Check for package PROFILES: if NetCDF is not available,
2016    #  then delete profiles from the list of available packages.
2017    echo $PACKAGES | grep ' profiles ' > /dev/null 2>&1
2018    RETVAL=$?
2019    if test "x$RETVAL" = x0 ; then
2020        if test "x$HAVE_NETCDF" != xt ; then
2021            cat <<EOF
2022    
2023    *********************************************************************
2024    WARNING: the "profiles" package was enabled but tests failed to
2025      compile NetCDF applications.  Please check that:
2026    
2027      1) NetCDF is correctly installed for this compiler and
2028      2) the LIBS variable (within the "optfile") specifies the correct
2029           NetCDF library to link against.
2030    
2031      Due to this failure, the "profiles" package is now DISABLED.
2032    *********************************************************************
2033    
2034    EOF
2035            PACKAGES=`echo $PACKAGES | sed -e 's/profiles//g'`
2036            DISABLE="$DISABLE profiles"
2037        fi
2038    fi
2039    
2040  echo "  applying package dependency rules"  echo "  applying package dependency rules"
2041  ck=  ck=
2042  while test "x$ck" != xtt ; do  while test "x$ck" != xtt ; do
2043      i=0      i=0
2044      # rtot=${#PNAME[@]}      # rtot=${#PNAME[@]}
2045      rtot=$nname      rtot=$nname
2046      while test $i -lt $rtot ; do      while test $i -le $rtot ; do
2047    
2048          #  Is $pname in the current $PACKAGES list?          #  Is $pname in the current $PACKAGES list?
2049          #  pname=${PNAME[$i]}          #  pname=${PNAME[$i]}
# Line 867  while test "x$ck" != xtt ; do Line 2077  while test "x$ck" != xtt ; do
2077    
2078          #  Do we need to add $dname according to the dependency rules?          #  Do we need to add $dname according to the dependency rules?
2079          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
2080                #echo "   " $pname ": need to add :" $dname
2081              in_dis="f"              in_dis="f"
2082              for dis in $DISABLE ; do              for dis in $DISABLE ; do
2083                  if test "x$dis" = "x$dname" ; then                  if test "x$dis" = "x$dname" ; then
# Line 891  while test "x$ck" != xtt ; do Line 2102  while test "x$ck" != xtt ; do
2102              echo "  the dependency rules for \"$dname\""              echo "  the dependency rules for \"$dname\""
2103              exit 1              exit 1
2104          fi          fi
2105          i=$(( $i + 1 ))          i=`echo "$i + 1" | bc -l`
2106            #i=$(( $i + 1 ))
2107      done      done
2108      ck=$ck"t"      ck=$ck"t"
2109  done  done
# Line 910  for i in $PACKAGES ; do Line 2122  for i in $PACKAGES ; do
2122      fi      fi
2123  done  done
2124    
   
2125  # Create a list of #define and #undef to enable/disable packages  # Create a list of #define and #undef to enable/disable packages
2126  PACKAGES_DOT_H=PACKAGES_CONFIG.h  PACKAGES_DOT_H=PACKAGES_CONFIG.h
 cat <<EOF >$PACKAGES_DOT_H".tmp"  
 C=== GENMAKE v2 ===  
 C  The following defines have been set by GENMAKE, so please do not  
 C  edit anything below these comments.  In general, you should  
 C  add or remove packages by re-running genmake with different  
 C  "-enable" and/or "-disable" options.  
   
 #ifndef PACKAGES_H  
 #define PACKAGES_H  
   
 C  Packages disabled by genmake:  
 EOF  
2127  #  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
2128  #  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
2129  #  file would eventually be split up so that all package-related #define  #  file would eventually be split up so that all package-related #define
2130  #  statements could be separated and handled only by genmake.  #  statements could be separated and handled only by genmake.
2131  names=`ls -1 "$ROOTDIR/pkg"`  names=`ls -1 "$ROOTDIR/pkg"`
2132  all_pack=  all_pack=
2133    DISABLED_PACKAGES=
2134  for n in $names ; do  for n in $names ; do
2135      if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then      if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
2136          has_pack="f"          has_pack="f"
# Line 941  for n in $names ; do Line 2141  for n in $names ; do
2141              fi              fi
2142          done          done
2143          if test "x$has_pack" = xf ; then          if test "x$has_pack" = xf ; then
2144              undef=`echo "ALLOW_$n" | $AWK '{print toupper($0)}'`              undef=`echo "ALLOW_$n" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2145              echo "#undef $undef" >> $PACKAGES_DOT_H".tmp"              DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
 #           DEFINES="$DEFINES -U$undef"  
   
 #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!  
             case $n in  
                 mom_fluxform)  
                     DEFINES="$DEFINES -DDISABLE_MOM_FLUXFORM"  
                     ;;  
                 mom_vecinv)  
                     DEFINES="$DEFINES -DDISABLE_MOM_VECINV"  
                     ;;  
             esac  
 #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!  
   
2146          fi          fi
2147      fi      fi
2148  done  done
2149  cat <<EOF >>$PACKAGES_DOT_H".tmp"  ENABLED_PACKAGES=
   
 C  Packages enabled by genmake:  
 EOF  
2150  for i in $PACKAGES ; do  for i in $PACKAGES ; do
2151      def=`echo "ALLOW_$i" | $AWK '{print toupper($0)}'`      def=`echo "ALLOW_$i" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2152      echo "#define $def" >> $PACKAGES_DOT_H".tmp"      ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
2153  #eh3 DEFINES="$DEFINES -D$def"  #eh3 DEFINES="$DEFINES -D$def"
2154    
2155  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!
2156      case $i in      case $i in
2157          aim_v23)          aim_v23)
2158              echo "#define   ALLOW_AIM" >> $PACKAGES_DOT_H".tmp"              ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
2159              DEFINES="$DEFINES -DALLOW_AIM"              echo "Warning: ALLOW_AIM is set to enable aim_v23."
             echo "Warning: ALLOW_AIM is set to enable aim_v23. This is REALLY ugly Jean-Michel :-)"  
2160              ;;              ;;
2161      esac      esac
2162  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!
2163    
2164  done  done
 cat <<EOF >>$PACKAGES_DOT_H".tmp"  
   
 #endif /* PACKAGES_H */  
 EOF  
   
 if test ! -f $PACKAGES_DOT_H ; then  
     mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H  
 else  
     cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H  
     RETVAL=$?  
     if test "x$RETVAL" = x0 ; then  
         rm -f $PACKAGES_DOT_H".tmp"  
     else  
         mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"  
         mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H  
     fi  
 fi  
2165    
2166  echo "  Adding STANDARDDIRS"  echo "  Adding STANDARDDIRS"
2167  BUILDDIR=${BUILDDIR:-.}  BUILDDIR=${BUILDDIR:-.}
2168  if test "x$STANDARDDIRS" = x ; then  if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
2169      STANDARDDIRS="eesupp model"      STANDARDDIRS="eesupp model"
2170  fi  fi
2171  for d in $STANDARDDIRS ; do  if test "x$STANDARDDIRS" != x ; then
2172      adr="$ROOTDIR/$d/src"      for d in $STANDARDDIRS ; do
2173      if test ! -d $adr ; then          adr="$ROOTDIR/$d/src"
2174          echo "Error:  directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""          if test ! -d $adr ; then
2175          echo "  is correct and that you correctly specified the STANDARDDIRS option"              echo "Error:  directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2176          exit 1              echo "  is correct and that you correctly specified the STANDARDDIRS option"
2177      else              exit 1
2178          SOURCEDIRS="$SOURCEDIRS $adr"          else
2179      fi              SOURCEDIRS="$SOURCEDIRS $adr"
2180      adr="$ROOTDIR/$d/inc"          fi
2181      if test ! -d $adr ; then          adr="$ROOTDIR/$d/inc"
2182          echo "Error:  directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""          if test ! -d $adr ; then
2183          echo "  is correct and that you correctly specified the STANDARDDIRS option"              echo "Error:  directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2184          exit 1              echo "  is correct and that you correctly specified the STANDARDDIRS option"
2185      else              exit 1
2186          INCLUDEDIRS="$INCLUDEDIRS $adr"          else
2187      fi              INCLUDEDIRS="$INCLUDEDIRS $adr"
2188  done          fi
2189        done
2190    fi
2191    
2192  echo "  Searching for CPP_OPTIONS.h in order to warn about the presence"  echo "  Searching for *OPTIONS.h files in order to warn about the presence"
2193  echo "    of \"#define ALLOW_PKGNAME\"-type statements:"  echo "    of \"#define \"-type statements that are no longer allowed:"
2194  CPP_OPTIONS=  CPP_OPTIONS=
2195    CPP_EEOPTIONS=
2196  spaths=". $INCLUDEDIRS"  spaths=". $INCLUDEDIRS"
2197    names=`ls -1 "$ROOTDIR/pkg"`
2198  for i in $spaths ; do  for i in $spaths ; do
2199      try="$i/CPP_OPTIONS.h"      try="$i/CPP_OPTIONS.h"
2200      #  echo -n "    trying $try : "      if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
     if test -f $try -a -r $try ; then  
2201          echo "    found CPP_OPTIONS=\"$try\""          echo "    found CPP_OPTIONS=\"$try\""
2202          CPP_OPTIONS="$try"          CPP_OPTIONS="$try"
2203          break          # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
2204            for n in $names ; do
2205                test_for_package_in_cpp_options $CPP_OPTIONS $n
2206            done
2207        fi
2208        try="$i/CPP_EEOPTIONS.h"
2209        if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
2210            echo "    found CPP_EEOPTIONS=\"$try\""
2211            # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
2212    #**** not yet enabled ****
2213    #        test_for_mpi_in_cpp_eeoptions $try
2214    #**** not yet enabled ****
2215            CPP_EEOPTIONS="$try"
2216      fi      fi
2217  done  done
2218  if test "x$CPP_OPTIONS" = x ; then  if test "x$CPP_OPTIONS" = x ; then
2219      echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"      echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
2220      exit 1      exit 1
2221  fi  fi
 # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h  
 names=`ls -1 "$ROOTDIR/pkg"`  
 for n in $names ; do  
     test_for_package_in_cpp_options $CPP_OPTIONS $n  
 done  
   
2222    
2223  #  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
2224  #  compiler.  #  compiler.
2225  if test -f ./ad_files ; then  if test -f ./adSrcFiles.tmp ; then
2226      rm -f ./ad_files      rm -f ./adSrcFiles.tmp
2227  fi  fi
2228  echo "  Creating the list of files for the adjoint compiler."  echo "  Creating the list of files for the adjoint compiler."
2229  for i in $SOURCEDIRS ; do  for i in $SOURCEDIRS ; do
2230      list_files=`( cd $i && ls -1 *.list 2>/dev/null )`      list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
2231      for j in $list_files ; do      for j in $list_files ; do
2232          cat $i/$j >> ad_files          cat $i/$j >> adSrcFiles.tmp
2233      done      done
2234  done  done
2235    if test ! "x"$FS = "x.f" ; then
2236  cat <<EOF > adjoint_sed      cat adSrcFiles.tmp | sed -e "s/\.f/.$FS/g" > adSrcFiles.tmp_f
2237  s/call adopen(/call adopen ( mythid,\\      mv -f adSrcFiles.tmp_f adSrcFiles.tmp
2238       \&           /g  fi
 s/call adclose(/call adclose( mythid,\\  
      \&           /g  
 s/call adread(/call adread ( mythid,\\  
      \&           /g  
 s/call adwrite(/call adwrite( mythid,\\  
      \&           /g  
   
 EOF  
2239    
2240  echo  echo
2241  echo "===  Creating the Makefile  ==="  echo "===  Creating the Makefile  ==="
2242  echo "  setting INCLUDES"  echo "  setting INCLUDES"
2243  for i in $INCLUDEDIRS ; do  for i in $INCLUDEDIRS ; do
2244      if ! test -d $i ; then      if test ! -d $i ; then
 #       INCLUDES="$INCLUDES -I$i"  
 #   else  
2245          echo "Warning: can't find INCLUDEDIRS=\"$i\""          echo "Warning: can't find INCLUDEDIRS=\"$i\""
2246      fi      fi
2247  done  done
2248    
2249    if test ! "x$DIVA" = x ; then
2250        echo "  Creating the pseudo-MPI include directory"
2251        INCLUDES="-I./mpi_headers $INCLUDES"
2252        rm -rf ./mpi_headers
2253        mkdir -p ./mpi_headers
2254    
2255        if test "x$MPIINCLUDEDIR" = x ; then
2256            if test "x$MPIHOME" = x ; then
2257                MPIHOME='/usr'
2258            fi
2259            MPIINCLUDEDIR='$MPIHOME/include'
2260        fi
2261        
2262        if test -r $MPIINCLUDEDIR/mpif.h ; then
2263            for i in $MPI_HEADER_FILES; do
2264                cp -p $MPIINCLUDEDIR/$i ./mpi_headers
2265            done
2266    
2267            perl -i -pe 's/MPI_DISPLACEMENT_CURRENT=-1_8/MPI_DISPLACEMENT_CURRENT=-1/g' mpi_headers/mpif.h
2268        else
2269            echo " We cannot create a copy of mpif.h!"
2270    #       exit -1
2271        fi
2272    fi
2273    
2274  echo "  Determining the list of source and include files"  echo "  Determining the list of source and include files"
2275  rm -rf .links.tmp  rm -rf .links.tmp
2276  mkdir .links.tmp  mkdir .links.tmp
2277    touch .links.tmp/foo
2278    if test ! -r ".links.tmp/foo" ; then
2279        echo
2280        echo "ERROR : something is wrong with your directory permissions or"
2281        echo "   your user file-creation mask (\"umask\") since creating a"
2282        echo "   sub-dir, touch-ing a file within it, and then reading it is"
2283        echo "   not working.  Please try setting your umask to something"
2284        echo "   sane such as:"
2285        echo
2286        echo "      umask 0002"
2287        echo
2288        echo "   and please verify that you have the proper permissions for"
2289        echo "   creating sub-directories and then reading files created"
2290        echo "   within them."
2291        echo
2292        exit 1
2293    fi
2294    rm -f .links.tmp/foo
2295    
2296    if test "x$OPENAD" != x ; then
2297        OAD_DONT_COMPILE="/dev/null"
2298        OAD_DONT_TRANSFORM="/dev/null"
2299        OAD_KEEP_ORIGINAL="/dev/null"
2300        OAD_CB2M_FILES="/dev/null"
2301        echo "  looking for dontCompile file:  "
2302        for i in "." $MODS ; do
2303            if test -r $i"/dontCompile" ; then
2304                OAD_DONT_COMPILE=$i"/dontCompile"
2305                echo "     found $OAD_DONT_COMPILE"
2306                break
2307            fi
2308        done
2309        echo "  looking for dontTransform file:  "
2310        for i in "." $MODS ; do
2311            if test -r $i"/dontTransform" ; then
2312                OAD_DONT_TRANSFORM=$i"/dontTransform"
2313                echo "     found $OAD_DONT_TRANSFORM"
2314                break
2315            fi
2316        done
2317        echo "  looking for keepOriginal file:  "
2318        for i in "." $MODS ; do
2319            if test -r $i"/keepOriginal" ; then
2320                OAD_KEEP_ORIGINAL=$i"/keepOriginal"
2321                echo "     found $OAD_KEEP_ORIGINAL"
2322                break
2323            fi
2324        done
2325        echo "  looking for cb2mFiles:  "
2326        for i in "." $MODS ; do
2327            if test -r $i"/cb2mFiles" ; then
2328                OAD_CB2M_FILES=$i"/cb2mFiles"
2329                echo "     found $OAD_CB2M_FILES"
2330                break
2331            fi
2332        done
2333        echo "   OpenAD exceptions:  "
2334    fi
2335    
2336  echo "# This section creates symbolic links" > srclinks.tmp  echo "# This section creates symbolic links" > srclinks.tmp
2337  echo "" >> srclinks.tmp  echo "" >> srclinks.tmp
2338  echo -n 'SRCFILES = '    > srclist.inc  printf 'F77_SRC_FILES = ' > F77srclist.tmp
2339  echo -n 'CSRCFILES = '   > csrclist.inc  printf 'NON_AD_F77_SRC_FILES = ' > nonADF77srclist.tmp
2340  echo -n 'F90SRCFILES = ' > f90srclist.inc  printf 'C_SRC_FILES = '   > csrclist.tmp
2341  echo -n 'HEADERFILES = ' > hlist.inc  printf 'F90_SRC_FILES = ' > F90srclist.tmp
2342  echo -n 'AD_FLOW_FILES = ' > ad_flow_files.inc  printf 'H_SRC_FILES = '   > hsrclist.tmp
2343    printf 'AD_FLOW_FILES = ' > ad_flow_files.tmp
2344  alldirs="$SOURCEDIRS $INCLUDEDIRS ."  alldirs="$SOURCEDIRS $INCLUDEDIRS ."
2345  for d in $alldirs ; do  for d in $alldirs ; do
2346      deplist=      deplist=
2347      sfiles=`( cd $d; echo *.[h,c,F] *.flow )`      sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
2348      sfiles=`( echo $sfiles; cd $d; echo *.F90 )`      sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
2349        if test "x$OPENAD" != x ; then
2350            sfiles=`( echo $sfiles | grep -v _cb2m\. )`
2351        fi
2352      for sf in $sfiles ; do      for sf in $sfiles ; do
2353          if test ! -r ".links.tmp/$sf" ; then          if test ! -r ".links.tmp/$sf" ; then
2354              if test -f "$d/$sf" ; then              if test -f "$d/$sf" ; then
2355                  extn=`echo $sf | $AWK -F '.' '{print $NF}'`                  ignore_f=f
2356                  touch .links.tmp/$sf                  case $d/$sf in
2357                  deplist="$deplist $sf"                    ./$PACKAGES_DOT_H)
2358                  case $extn in                          ignore_f=t
2359                      F)                          ;;
2360                          echo    " \\"  >> srclist.inc                    ./AD_CONFIG.h)
2361                          echo -n " $sf" >> srclist.inc                          ignore_f=t
2362                            ;;
2363                      ./FC_NAMEMANGLE.h)
2364                            ignore_f=t
2365                            ;;
2366                      ./BUILD_INFO.h)
2367                            ignore_f=t
2368                            ;;
2369                      ./EMBEDDED_FILES.h)
2370                            ignore_f=t
2371                            ;;
2372                      *)
2373                            #  For the local directory *ONLY*,
2374                            #  ignore all soft-links
2375                            if test "x$HAVE_TEST_L" = xt -a "x$d" = x. -a -L $sf ; then
2376                                ignore_f=t
2377                            else
2378                                touch .links.tmp/$sf
2379                                deplist="$deplist $sf"
2380                            fi
2381                            ;;
2382                    esac
2383                    if test "x$ignore_f" = xf ; then
2384                        extn=`echo $sf | $AWK -F. '{print $NF}'`
2385                        case $extn in
2386                          F)
2387                            echo    " \\"  >> F77srclist.tmp
2388                            printf " $sf" >> F77srclist.tmp
2389                            if test "x$OPENAD" != x ; then
2390                                basename=${sf%%.F}
2391                                isAD=`egrep ^$basename.f'[  ]*' adSrcFiles.tmp`
2392                                if test -z "$isAD" ; then
2393                                    toBeIgnored=`egrep ^$basename'[      ]*' ${OAD_DONT_COMPILE}`
2394                                    if test -z "$toBeIgnored" ; then
2395                                        echo    " \\"  >> nonADF77srclist.tmp
2396                                        printf " $sf" >> nonADF77srclist.tmp
2397                                    else
2398                                        echo "    not to be compiled   :  $sf"
2399                                    fi
2400                                else # file is initially listed as an AD file we want to exclude it
2401                                     # or we want to retain the untransformed version
2402                                    notToBeTransformed=`egrep ^$basename'[      ]*' ${OAD_DONT_TRANSFORM}`
2403                                    untransformedVersionToBeKept=`egrep ^$basename'[      ]*' ${OAD_KEEP_ORIGINAL}`
2404                                    if test -n "$notToBeTransformed"; then
2405                                        echo "    not to be transformed:  $sf"
2406                                    fi
2407                                    if test -n "$untransformedVersionToBeKept" ; then
2408                                        echo "    original to be kept  :  $sf"
2409                                    fi    
2410                                    if test -n "$notToBeTransformed" -o -n "$untransformedVersionToBeKept" ; then
2411                                        echo    " \\"  >> nonADF77srclist.tmp
2412                                        printf " $sf" >> nonADF77srclist.tmp
2413                                    fi
2414                                fi
2415                            fi
2416                          ;;                          ;;
2417                      F90)                      F90)
2418                          echo    " \\"  >> f90srclist.inc                          echo    " \\"  >> F90srclist.tmp
2419                          echo -n " $sf" >> f90srclist.inc                          printf " $sf" >> F90srclist.tmp
2420                          ;;                          ;;
2421                      c)                      c)
2422                          echo    " \\"  >> csrclist.inc                          echo    " \\"  >> csrclist.tmp
2423                          echo -n " $sf" >> csrclist.inc                          printf " $sf" >> csrclist.tmp
2424                          ;;                          ;;
2425                      h)                      h)
2426                          echo    " \\"  >> hlist.inc                          echo    " \\"  >> hsrclist.tmp
2427                          echo -n " $sf" >> hlist.inc                          printf " $sf" >> hsrclist.tmp
2428                          ;;                          ;;
2429                      flow)                      flow)
2430                          echo    " \\"  >> ad_flow_files.inc                          echo    " \\"  >> ad_flow_files.tmp
2431                          echo -n " $sf" >> ad_flow_files.inc                          printf " $sf" >> ad_flow_files.tmp
2432                          ;;                          ;;
2433                  esac                     esac
2434                    fi
2435              fi              fi
2436          fi          fi
2437      done      done
2438      if test "x$deplist" != x ; then      if test "x$deplist" != x ; then
2439          echo "" >> srclinks.tmp        if test "$d" != "." ; then
2440            echo "" >> srclinks.tmp
2441          echo "#  These files are linked from $d" >> srclinks.tmp          echo "#  These files are linked from $d" >> srclinks.tmp
2442          echo "$deplist :" >> srclinks.tmp          echo "$deplist :" >> srclinks.tmp
2443          printf "\t\$(LN) %s/\$@ \$@\n" $d >> srclinks.tmp  # We need to make sure that the link isn't already there.
2444    # This may happen when make thinks that a header file has to be "remade"
2445    # because a module it depends on has changed.  In this case we do nothing.
2446            printf "\tif [ ! -L \$@ ]; then \$(LN) %s/\$@ \$@; fi\n" $d >> srclinks.tmp
2447          fi
2448      fi      fi
2449  done  done
2450  rm -rf .links.tmp  rm -rf .links.tmp
2451  echo "" >> srclist.inc  echo "" >> F77srclist.tmp
2452  echo "" >> csrclist.inc  echo "" >> nonADF77srclist.tmp
2453  echo "" >> f90srclist.inc  echo "" >> csrclist.tmp
2454  echo "" >> hlist.inc  echo "" >> F90srclist.tmp
2455  echo "" >> ad_flow_files.inc  echo "" >> hsrclist.tmp
2456    echo "" >> ad_flow_files.tmp
2457    
2458  if test -e $MAKEFILE ; then  if test -f $MAKEFILE ; then
2459      mv -f $MAKEFILE "$MAKEFILE.bak"      mv -f $MAKEFILE "$MAKEFILE.bak"
2460  fi  fi
2461  echo "  Writing makefile: $MAKEFILE"  echo "  Writing makefile: $MAKEFILE"
# Line 1150  echo "#    $MACHINE" >> $MAKEFILE Line 2464  echo "#    $MACHINE" >> $MAKEFILE
2464  echo "# This makefile was generated automatically on" >> $MAKEFILE  echo "# This makefile was generated automatically on" >> $MAKEFILE
2465  echo "#    $THISDATE" >> $MAKEFILE  echo "#    $THISDATE" >> $MAKEFILE
2466  echo "# by the command:" >> $MAKEFILE  echo "# by the command:" >> $MAKEFILE
2467  echo "#    $0 $@" >> $MAKEFILE  echo "#    $0 $G2ARGS" >> $MAKEFILE
2468  echo "# executed by:" >> $MAKEFILE  echo "# executed by:" >> $MAKEFILE
2469  echo "#    $USER@${THISHOSTNAME}:${THISCWD}" >> $MAKEFILE  echo "#    ${THISUSER}@${THISHOST}:${THISCWD}" >> $MAKEFILE
2470    
2471  EXE_AD=$EXECUTABLE"_ad"  EXE_AD=$EXECUTABLE"_ad"
2472  EXE_FTL=$EXECUTABLE"_ftl"  EXE_FTL=$EXECUTABLE"_ftl"
2473  EXE_SVD=$EXECUTABLE"_svd"  EXE_SVD=$EXECUTABLE"_svd"
2474    
2475  cat >>$MAKEFILE <<EOF  cat >>$MAKEFILE <<EOF
2476    #
2477    # OPTFILE="$OPTFILE"
2478  #  #
2479  # BUILDDIR     : Directory where object files are written  # BUILDDIR     : Directory where object files are written
2480  # SOURCEDIRS   : Directories containing the source (.F) files  # SOURCEDIRS   : Directories containing the source (.F) files
# Line 1192  EXE_AD      = ${EXE_AD} Line 2508  EXE_AD      = ${EXE_AD}
2508  EXE_FTL     = ${EXE_FTL}  EXE_FTL     = ${EXE_FTL}
2509  EXE_SVD     = ${EXE_SVD}  EXE_SVD     = ${EXE_SVD}
2510    
2511    ENABLED_PACKAGES = ${ENABLED_PACKAGES}
2512    DISABLED_PACKAGES = ${DISABLED_PACKAGES}
2513    
2514    # These files are created by Makefile
2515    SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h BUILD_INFO.h
2516  EOF  EOF
2517    
2518  #  Note: figure out some way to add Hyades JAM libraries here  if test "x$EMBED_SRC" = xt ; then
2519        echo "EMBEDDED_FILES = EMBEDDED_FILES.h" >>$MAKEFILE
2520    else
2521        echo "EMBEDDED_FILES = " >>$MAKEFILE
2522    fi
2523    
2524    #  Note: figure out some way to add Hyades JAM libraries here
2525  cat >>$MAKEFILE <<EOF  cat >>$MAKEFILE <<EOF
2526  # Unix ln (link)  # Unix ln (link)
2527  LN = ${LN}  LN = ${LN}
# Line 1209  KPP = ${KPP} Line 2535  KPP = ${KPP}
2535  FC = ${FC}  FC = ${FC}
2536  # Fortran compiler  # Fortran compiler
2537  F90C = ${F90C}  F90C = ${F90C}
2538    # C compiler
2539    CC = ${CC}
2540  # Link editor  # Link editor
2541  LINK = ${LINK}  LINK = ${LINK} ${LDADD}
2542    
2543  # Defines for CPP  # Defines for CPP
2544  DEFINES = ${DEFINES}  DEFINES = ${DEFINES}
# Line 1220  INCLUDES = ${INCLUDES} Line 2548  INCLUDES = ${INCLUDES}
2548  KFLAGS1 = ${KFLAGS1}  KFLAGS1 = ${KFLAGS1}
2549  KFLAGS2 = ${KFLAGS2}  KFLAGS2 = ${KFLAGS2}
2550  # Optim./debug for FC  # Optim./debug for FC
2551  FFLAGS = ${FFLAGS}  FFLAGS = ${FFLAGS} ${FEXTRAFLAGS}
2552  FOPTIM = ${FOPTIM}  FOPTIM = ${FOPTIM}
2553  # Optim./debug for FC  # Optim./debug for FC
2554  F90FLAGS = ${F90FLAGS}  F90FLAGS = ${F90FLAGS}
2555  F90OPTIM = ${F90OPTIM}  F90OPTIM = ${F90OPTIM}
2556    F90FIXEDFORMAT = ${F90FIXEDFORMAT}
2557  # Flags for CC  # Flags for CC
2558  CFLAGS = ${CFLAGS}  CFLAGS = ${CFLAGS}
2559  # Files that should not be optimized  # Files that should not be optimized
2560  NOOPTFILES = ${NOOPTFILES}  NOOPTFILES = ${NOOPTFILES}
2561  NOOPTFLAGS = ${NOOPTFLAGS}  NOOPTFLAGS = ${NOOPTFLAGS}
2562  # Flags and libraries needed for linking  # Flags and libraries needed for linking
2563  LIBS = ${LIBS} \$(XLIBS)  LIBS = ${LIBS}
2564  # Name of the Mekfile  # Name of the Mekfile
2565  MAKEFILE=${MAKEFILE}  MAKEFILE=${MAKEFILE}
2566    
2567  EOF  EOF
2568    
2569  cat srclist.inc       >> $MAKEFILE  cat F77srclist.tmp      >> $MAKEFILE
2570  cat csrclist.inc      >> $MAKEFILE  cat nonADF77srclist.tmp >> $MAKEFILE
2571  cat f90srclist.inc    >> $MAKEFILE  cat csrclist.tmp        >> $MAKEFILE
2572  cat hlist.inc         >> $MAKEFILE  cat F90srclist.tmp      >> $MAKEFILE
2573  cat ad_flow_files.inc >> $MAKEFILE  cat hsrclist.tmp        >> $MAKEFILE
2574  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  
2575    
2576  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  
2577    
2578  cat >>$MAKEFILE <<EOF  echo >> $MAKEFILE
2579    
2580  .SUFFIXES:  # add definitions for preprocessed sources
2581  .SUFFIXES: .o .f .p .F .c .F90 .f90  # and note that not all systems allow case sensitive extensions
2582    # hence the $FS and $FS90 here.
2583    # for fixed format f90 files we use ff90 or FF90 resp
2584    # but these are not expected to be the original source files
2585    
2586    echo 'F77_PP_SRC_FILES = $(F77_SRC_FILES:.F=.'$FS')'      >> $MAKEFILE
2587    echo 'F90_PP_SRC_FILES = $(F90_SRC_FILES:.F90=.'$FS90')' >> $MAKEFILE
2588    echo 'OBJFILES= $(F77_SRC_FILES:.F=.o) $(C_SRC_FILES:.c=.o) $(F90_SRC_FILES:.F90=.o)' >> $MAKEFILE
2589    echo 'FLOFILES =  $(AD_FLOW_FILES:.flow=.flowdir)' >> $MAKEFILE
2590    echo >> $MAKEFILE
2591    echo '.SUFFIXES:' >> $MAKEFILE
2592    echo '.SUFFIXES: .o .'$FS' .p .F .c .f'$FS90' .'$FS90' .FF90 .F90 .flowdir .flow' >> $MAKEFILE
2593    
2594    cat >>$MAKEFILE <<EOF
2595    
2596  all: \$(EXECUTABLE)  all: \$(EXECUTABLE)
2597  \$(EXECUTABLE): \$(OBJFILES)  \$(EXECUTABLE): \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(OBJFILES) \$(EMBEDDED_FILES)
2598            @echo Creating \$@ ...
2599          \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)          \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
2600  depend:  depend:
2601          @make links          @make links
2602          \$(MAKEDEPEND) -o .f \$(DEFINES) \$(INCLUDES) \$(SRCFILES)          \$(MAKEDEPEND) -o .$FS \$(DEFINES) \$(INCLUDES) \$(F77_SRC_FILES)
2603          ${TOOLSDIR}/f90mkdepend >> \$(MAKEFILE)          \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
2604            -rm -f makedepend.out
2605    
2606  links: \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES)  lib: libmitgcmuv.a
2607    
2608  small_f: \$(F77FILES) \$(F90FILES)  libmitgcmuv.a: \$(OBJFILES)
2609            ar rcv libmitgcmuv.a \$(OBJFILES)
2610            ar d   libmitgcmuv.a main.o
2611    
2612    links: \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(SPECIAL_FILES)
2613    
2614    small_f: \$(F77_PP_SRC_FILES) \$(F90_PP_SRC_FILES)
2615    
2616  output.txt: \$(EXECUTABLE)  output.txt: \$(EXECUTABLE)
2617          @printf 'running ... '          @printf 'running ... '
2618          @\$(EXECUTABLE) > \$@          @\$(EXECUTABLE) > \$@
2619    
2620  clean:  clean:
2621          -cat AD_CONFIG.template > AD_CONFIG.h          -rm -rf *.p *.$FS90 *.mod ${RMFILES} work.{pc,pcl} *.template
2622          -rm -rf *.o *.f *.p *.f90 *.mod ${RMFILES} work.{pc,pcl}          -rm -rf *.o
2623            -rm -rf *.$FS *.flowdir
2624            -rm -rf *.f$FS90 *_mod.h *_mod.F90 *.FF90 *.mod-whirl ad_input*
2625            -rm -rf temp.sed
2626  Clean:  Clean:
2627          @make clean          @make clean
2628          @make cleanlinks          @make cleanlinks
2629          -rm -f Makefile.bak genmake_state genmake_*optfile make.log          -rm -f \$(SPECIAL_FILES)
2630            -rm -f genmake_state genmake_*optfile genmake_warnings make.log run.log f90mkdepend.log *.bak
2631            -rm -f taf_command taf_output taf_ad.log taf_ad_flow.log
2632  CLEAN:  CLEAN:
2633          @make Clean          @make Clean
2634          -find \$(EXEDIR) -name "*.meta" -exec rm {} \;          -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
2635          -find \$(EXEDIR) -name "*.data" -exec rm {} \;          -find \$(EXEDIR) -name "*.data" -exec rm {} \;
2636          -find \$(EXEDIR) -name "fort.*" -exec rm {} \;          -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
2637          -rm -f \$(EXECUTABLE) output.txt          -rm -f \$(EXECUTABLE) \$(EXE_AD) *.txt STD* *diagnostics.log datetime
2638            -rm -f *_MIT_CE_000.opt0000 costfunction*0000
2639            -rm -rf mnc_test_*
2640    
2641  #eh3 Makefile: makefile  #eh3 Makefile: makefile
2642  makefile:  makefile:
2643          ${0} $@          $THIS_SCRIPT $G2ARGS
2644  cleanlinks:  cleanlinks:
2645          -find . -type l -exec rm {} \;          -find . -type l -exec rm {} \;
2646    
2647  # The normal chain of rules is (  .F - .f - .o  )  # Special targets (SPECIAL_FILES) which are created by make
2648  .F.f:  ${PACKAGES_DOT_H}:
2649            @echo Creating \$@ ...
2650            @$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) > \$@
2651    AD_CONFIG.h:
2652            @echo Creating \$@ ...
2653            @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN -UALLOW_ECCO_OPTIMIZATION > \$@
2654    FC_NAMEMANGLE.h:
2655            @echo Creating \$@ ...
2656            echo "$FC_NAMEMANGLE" > \$@
2657    
2658    BUILD_INFO.h:
2659            @echo Creating \$@ ...
2660    EOF
2661    
2662    test ! "x$THISVER" = x  && echo "       -echo \"#define THISVER '$THISVER'\" > \$@"   >> $MAKEFILE
2663    test ! "x$THISUSER" = x && echo "       -echo \"#define THISUSER '$THISUSER'\" >> \$@" >> $MAKEFILE
2664    test ! "x$THISDATE" = x && echo "       -echo \"#define THISDATE '$THISDATE'\" >> \$@" >> $MAKEFILE
2665    test ! "x$THISHOST" = x && echo "       -echo \"#define THISHOST '$THISHOST'\" >> \$@" >> $MAKEFILE
2666    
2667    if test "x$EMBED_SRC" = xt ; then
2668        cat >>$MAKEFILE <<EOF
2669    
2670    decode_files.o : EMBEDDED_FILES.h
2671    
2672    ##  \$(F77_PP_SRC_FILES)
2673    all_fF.tar.gz : \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(F77_PP_SRC_FILES) Makefile
2674            @echo Creating \$@ ...
2675            -tar -hcf all_fF.tar \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(F77_PP_SRC_FILES) Makefile
2676            -rm -f all_fF.tar.gz
2677            -gzip all_fF.tar
2678    
2679    EMBEDDED_FILES.h : all_fF.tar.gz
2680            @echo Creating \$@ ...
2681            -\${ROOTDIR}/tools/embed_encode/encode_files EMBEDDED_FILES.h all_fF.tar.gz
2682    
2683    EOF
2684    fi
2685    
2686    cat >>$MAKEFILE <<EOF
2687    
2688    # The normal chain of rules is (  .F - .$FS - .o  )
2689    
2690    ## This nullifies any default implicit rules concerning these two file types:
2691    ## %.o : %.F
2692    
2693    .F.$FS:
2694          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2695  .f.o:  .$FS.o:
2696          \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<          \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
2697  .F90.f90:  .F90.$FS90:
2698            \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2699    .FF90.f$FS90:
2700          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2701  .f90.o:  .$FS90.o:
2702          \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<          \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
2703    .f$FS90.o:
2704            cp \$< \$(basename  \$<).f90
2705            \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$(F90FIXEDFORMAT) \$(basename  \$<).f90
2706  .c.o:  .c.o:
2707          \$(CC) \$(CFLAGS) -c \$<          \$(CC) \$(CFLAGS) \$(DEFINES) \$(INCLUDES) -c \$<
2708    .flow.flowdir:
2709            \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2710    
2711  # Special exceptions that use the ( .F - .p - .f - .o ) rule-chain  # Special exceptions that use the ( .F - .p - .$FS - .o ) rule-chain
2712  .F.p:  .F.p:
2713          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2714  .p.f:  .p.$FS:
2715          \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<          \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
2716    
2717    EOF
2718    
2719  #=========================================  #=========================================
2720  #===  Automatic Differentiation Rules  ===  #===  Automatic Differentiation Rules  ===
2721    #===  for TAMC/TAF  ======================
2722    
2723    if test "x$OPENAD" == x ; then
2724    
2725    cat >>$MAKEFILE <<EOF
2726    
2727  TAMC           = ${TAMC}  TAMC           = ${TAMC}
2728  TAF            = ${TAF}  TAF            = ${TAF}
# Line 1325  ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF Line 2737  ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF
2737  ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"  ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
2738  for i in $ad_vars ; do  for i in $ad_vars ; do
2739      name=$i      name=$i
2740      t1="t2=\$"`echo $i`      t1="t2=\$"`echo "$i"`
2741      eval $t1      eval $t1
2742      printf "%-20s = " $name >> $MAKEFILE      printf "%-20s = " $name >> $MAKEFILE
2743      echo $t2 >> $MAKEFILE      echo "$t2" | sed -e 's| \+| |g' >> $MAKEFILE
2744  done  done
2745    
2746  echo "  Add the source list for AD code generation"  echo "  Add the source list for AD code generation"
2747  echo >> $MAKEFILE  echo >> $MAKEFILE
2748  echo -n "AD_FILES = " >> $MAKEFILE  printf "AD_FILES = " >> $MAKEFILE
2749  AD_FILES=`cat ad_files`  AD_FILES=`cat adSrcFiles.tmp`
2750  for i in $AD_FILES ; do  for i in $AD_FILES ; do
2751      echo    " \\" >> $MAKEFILE      echo    " \\" >> $MAKEFILE
2752      echo -n " $i" >> $MAKEFILE      printf " $i" >> $MAKEFILE
2753  done  done
2754  echo >> $MAKEFILE  echo >> $MAKEFILE
2755  rm -f ad_files  rm -f adSrcFiles.tmp
2756    
2757  cat >>$MAKEFILE <<EOF  cat >>$MAKEFILE <<EOF
2758    
2759  # ... AD ...  # ... AD ...
2760  adall: ad_taf  adall: \$(EXE_AD)
2761  adtaf: ad_taf_output.f  adtaf: ad_taf_output.$FS
2762  adtamc: ad_tamc_output.f  adtamc: ad_tamc_output.$FS
2763    
2764  ad_input_code.f: \$(AD_FILES) \$(HEADERFILES)  ad_input_code.$FS: \$(AD_FILES) \$(H_SRC_FILES)
2765            @$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
2766          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
2767          @make \$(F77FILES)          -rm -f ad_config.template
2768          @make \$(AD_FLOW_FILES)          @make \$(F77_PP_SRC_FILES)
2769          cat \$(AD_FLOW_FILES) \$(AD_FILES) > ad_input_code.f          @make \$(FLOFILES)
2770            cat \$(FLOFILES) \$(AD_FILES) > ad_input_code.$FS
2771  ad_taf_output.f: ad_input_code.f  
2772          \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f  ad_taf_output.$FS: ad_input_code.$FS
2773          cat ad_input_code_ad.f | sed -f adjoint_sed > ad_taf_output.f          \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2774            ls -l ad_input_code_ad.$FS
2775  ad_taf: ad_taf_output.o \$(OBJFILES)          cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2776          \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)  
2777    adtafonly:
2778  ad_tamc_output.f: ad_input_code.f          \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2779          \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.f          ls -l ad_input_code_ad.$FS
2780          cat ad_input_code_ad.f | sed -f adjoint_sed > ad_tamc_output.f          cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2781    
2782    \${EXE_AD}: ad_taf_output.o \$(OBJFILES)
2783            \$(LINK) -o \${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
2784    
2785    ad_tamc_output.$FS: ad_input_code.$FS
2786            \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.$FS
2787            cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.$FS
2788    
2789  ad_tamc: ad_tamc_output.o \$(OBJFILES)  ad_tamc: ad_tamc_output.o \$(OBJFILES)
2790          \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)          \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
2791    
2792    adonlyfwd:
2793            patch < \$(TOOLSDIR)/ad_taf_output.f.onlyfwd.diff
2794    
2795    adtrick:
2796            patch < \$(TOOLSDIR)/ad_taf_output.f.adtrick.diff
2797    
2798  # ... FTL ...  # ... FTL ...
2799  ftlall: ftl_taf  ftlall: ftl_taf
2800  ftltaf: ftl_taf_output.f  ftltaf: ftl_taf_output.$FS
2801  ftltamc: ftl_tamc_output.f  ftltamc: ftl_tamc_output.$FS
2802    
2803  ftl_input_code.f: \$(AD_FILES) \$(HEADERFILES)  ftl_input_code.$FS: \$(AD_FILES) \$(H_SRC_FILES)
2804            @$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
2805          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
2806          @make \$(F77FILES)          -rm -f ftl_config.template
2807            @make \$(F77_PP_SRC_FILES)
2808          @make \$(AD_FLOW_FILES)          @make \$(AD_FLOW_FILES)
2809          cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.f          cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.$FS
2810    
2811  ftl_taf_output.f: ftl_input_code.f  ftl_taf_output.$FS: ftl_input_code.$FS
2812          \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f          \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
2813          cat ftl_input_code_ftl.f | sed -f adjoint_sed > ftl_taf_output.f          ls -l ftl_input_code_ftl.$FS
2814            cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
2815    
2816    ftltafonly:
2817            \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
2818            ls -l ftl_input_code_ftl.$FS
2819            cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
2820    
2821  ftl_taf: ftl_taf_output.o \$(OBJFILES)  ftl_taf: ftl_taf_output.o \$(OBJFILES)
2822          \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)          \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
2823    
2824  ftl_tamc_output.f: ftl_input_code.f  ftl_tamc_output.$FS: ftl_input_code.$FS
2825          \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.f          \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.$FS
2826          cat ftl_input_code_ftl.f | sed -f adjoint_sed > ftl_tamc_output.f          cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.$FS
2827    
2828  ftl_tamc: ftl_tamc_output.o \$(OBJFILES)  ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
2829          \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)          \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
2830    
2831    
2832  # ... SVD ...  # ... SVD ...
2833  svd: svd_taf  svdtaf: ad_taf_output.$FS ftl_taf_output.$FS
2834  svd_taf_f: svd_taf_output.f          @echo "--->>> Only ran TAF to generate SVD code!    <<<---"
2835            @echo "--->>> Do make svdall afterwards to compile. <<<---"
2836    svdall: svd_touch svd_taf
2837    
2838    svd_taf: \$(OBJFILES)
2839            \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
2840    
2841            @echo "--->>> Only COMPILE svd code! <<<---"
2842            @echo "--->>> Assumes you previously <<<---"
2843            @echo "--->>> did make svdtaf        <<<---"
2844    
2845    svd_touch:
2846            @echo "--->>> Only COMPILE svd code! <<<---"
2847            @echo "--->>> Assumes you previously <<<---"
2848            @echo "--->>> did make svdtaf        <<<---"
2849            touch ad_taf_output.$FS ftl_taf_output.$FS
2850            \$(FC) \$(FFLAGS) \$(FOPTIM) -c ad_taf_output.$FS
2851            \$(FC) \$(FFLAGS) \$(FOPTIM) -c ftl_taf_output.$FS
2852            @$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
2853            cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
2854            -rm -f ftl_config.template
2855    
2856  svd_input_code.f: \$(SRCFILES)  EOF
         cmp svd_config.template AD_CONFIG.h || cat svd_config.template > AD_CONFIG.h  
         @make \$(F77FILES)  
         @make \$(AD_FLOW_FILES)  
         cat \$(AD_FLOW_FILES) \$(AD_FILES) > svd_input_code.f  
2857    
2858  svd_taf_output.f: svd_input_code.f  fi
         \$(TAF) \$(SVD_TAF_FLAGS) \$(TAF_EXTRA) svd_input_code.f  
         cat svd_input_code_ad.f | sed -f adjoint_sed > svd_taf_output.f  
2859    
2860  svd_taf: svd_taf_output.o \$(OBJFILES)  #===  for OpenAD  ========================
         \$(LINK) -o ${EXE_SVD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) svd_taf_output.o \$(LIBS)  
2861    
2862    if test "x$OPENAD" != x ; then
2863    
2864  #=========================================  # ============ begin OpenAD specific section ==============
2865    
2866    cat >>$MAKEFILE <<EOF
2867    
2868    # all the source files linked from the various locations:
2869    ALL_LINKED_FILES= \
2870    \$(F77_SRC_FILES) \
2871    \$(C_SRC_FILES) \
2872    \$(H_SRC_FILES) \
2873    \$(F90_SRC_FILES) \
2874    \$(SPECIAL_FILES)
2875    
2876    ifndef OPENADROOT
2877      \$(error "Error:  environment variable OPENADROOT not defined!")
2878    endif
2879    
2880    ifndef XAIFSCHEMAROOT
2881      \$(error "Error:  environment variable XAIFSCHEMAROOT not defined!")
2882    endif
2883    
2884    ifndef XAIFBOOSTERROOT
2885      \$(error "Error:  environment variable XAIFBOOSTERROOT not defined!")
2886    endif
2887    
2888    EOF
2889    
2890    echo "  Add the source list for common block to module conversion "
2891    echo >> $MAKEFILE
2892    printf "CB2M_F90_SRC_NAMES = " >> $MAKEFILE
2893    for i in `cat ${OAD_CB2M_FILES}` ; do
2894      echo    " \\" >> $MAKEFILE
2895      printf " $i" >> $MAKEFILE
2896    done
2897    echo >> $MAKEFILE
2898    
2899    echo "  Add the source list for AD code generation"
2900    echo >> $MAKEFILE
2901    printf "AD_FILES = " >> $MAKEFILE
2902    for i in `cat ${OAD_CB2M_FILES}` ; do
2903      echo    " \\" >> $MAKEFILE
2904      printf " ${i}_mod.f$FS90" >> $MAKEFILE
2905    done
2906    AD_FILES=`cat adSrcFiles.tmp`
2907    for i in $AD_FILES ; do
2908      basename=${i%%.f}
2909      toBeIgnored=`egrep ^$basename'[      ]*' ${OAD_DONT_COMPILE} ${OAD_DONT_TRANSFORM}`
2910      if test -z "$toBeIgnored" ; then
2911        echo    " \\" >> $MAKEFILE
2912        printf " $i" >> $MAKEFILE
2913      fi
2914    done
2915    echo >> $MAKEFILE
2916    rm -f adSrcFiles.tmp
2917    
2918    cat >>$MAKEFILE <<EOF
2919    
2920    adAll: \$(EXE_AD)
2921    .PHONY: adAll
2922    
2923    CB2M_F90_PP_SRC_FILES=\$(addsuffix _mod.f$FS90, \$(CB2M_F90_SRC_NAMES))
2924    
2925    .PRECIOUS: \$(CB2M_F90_PP_SRC_FILES) \$(NON_AD_F77_SRC_FILES:.F=_cb2m.f$FS90)
2926    
2927    .PHONY: adDepend
2928    adDepend: \$(ALL_LINKED_FILES) \$(addsuffix _mod.h, \$(CB2M_F90_SRC_NAMES)) \$(addsuffix _mod.FF90, \$(CB2M_F90_SRC_NAMES)) \$(F77_SRC_FILES:.F=_cb2m.FF90)
2929            \$(MAKEDEPEND) -o .$FS \$(DEFINES) \$(INCLUDES) \$(F77_SRC_FILES)
2930            \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
2931            -rm -f makedepend.out
2932    
2933    OPENAD_SUPPORT_F90_SRC_FILES = \
2934    w2f__types.F90 \
2935    OAD_active.F90 \
2936    OAD_cp.F90 \
2937    OAD_rev.F90 \
2938    OAD_tape.F90        
2939    
2940    OPENAD_SUPPORT_C_SRC_FILES = \
2941    iaddr.c \
2942    timeRatio.c
2943    
2944    f95_test_mods.f90: \$(OPENAD_SUPPORT_F90_SRC_FILES:F90=$FS90)
2945            cat \$^ > \$@
2946    
2947    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
2948            cat \$^ > \$@
2949    
2950    f95_test.out: f95_test_mods.f90 f95_test.f90
2951            f95 -fixed -w=unused -maxcontin=132 -c f95_test_mods.f90 > \$@ 2>&1
2952            f95 -fixed -w=unused -maxcontin=132 -c -fixed f95_test.f90 >> \$@ 2>&1
2953    
2954    AD_OBJ_FILES=\$(OPENAD_SUPPORT_F90_SRC_FILES:.F90=.o) \$(OPENAD_SUPPORT_C_SRC_FILES:.c=.o) all_mods.xb.x2w.w2f.pp.o  ad_input_code.w2f.pre.xb.x2w.w2f.td.pp.o \$(NON_AD_F77_SRC_FILES:.F=_cb2m.o) \$(C_SRC_FILES:.c=.o) \$(F90_SRC_FILES:.F90=.o)
2955    
2956    \$(EXE_AD): \$(ALL_LINKED_FILES) \$(addsuffix _mod.h, \$(CB2M_F90_SRC_NAMES)) \$(AD_OBJ_FILES)
2957            @echo Creating \$@ ...
2958            \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(AD_OBJ_FILES) \$(LIBS)
2959    
2960    # makefile debug rule
2961    openad: ad_input_code.w2f.pre.xb.x2w.w2f.td.pp.f$FS90
2962    .PHONY: openad
2963    
2964    # create the module files
2965    %_mod.FF90 : %.h ../OAD_support/cb2mGetModules.csh ../OAD_support/cb2mGetModules.awk
2966            ../OAD_support/cb2mGetModules.csh $< ../OAD_support/cb2mGetModules.awk
2967    
2968    # create the header files
2969    %_mod.h : %.h ../OAD_support/cb2mGetHeaders.csh ../OAD_support/cb2mGetHeaders.awk
2970            ../OAD_support/cb2mGetHeaders.csh $< ../OAD_support/cb2mGetHeaders.awk \$(CB2M_F90_SRC_NAMES)
2971    
2972    # change everybody else to use the new module files:
2973    %_cb2m.FF90 : %.F ../OAD_support/cb2mUseModules.bash
2974            ../OAD_support/cb2mUseModules.bash $< ${MPI}
2975    
2976    # makefile debug rule
2977    small_f: \$(CB2M_F90_PP_SRC_FILES)
2978    .PHONY: small_f
2979    
2980    ad_output.txt: \$(EXE_AD)
2981            @printf 'linking data files ... '
2982            \$(LN) -f ../input_ad/data* ../input_ad/eedata .
2983            \$(LN) -f ../../global_ocean.90x40x15/input/*.bin .
2984            @printf 'running ... '
2985            @./\$(EXE_AD) > \$@
2986    
2987    CB2M_AD_FILES=\$(AD_FILES:.f=_cb2m.f$FS90)
2988    ad_input_code.f$FS90: ../OAD_support/maxMinDefs.f \$(CB2M_AD_FILES)
2989            cat \$^ > \$@
2990    
2991    # strip all comments and blanks to reduce
2992    # the file size in order to reduce perl's memory requirements
2993    ad_input_code_sf.f$FS90 : ad_input_code.f$FS90
2994            cat \$^ | sed -f ../OAD_support/strip.sed | sed -f ../OAD_support/stop2print.sed > \$@
2995    
2996    # mfef90 preprocessing
2997    # expand statement functions
2998    # expose mfef90 specific substring handling
2999    # add the w2f__types module
3000    ad_input_code_sf.w2f.f$FS90: ad_input_code_sf.f$FS90 mfef90 whirl2f whirl2f_be w2f__types.f90
3001            ./mfef90 -r8 -z -F -N132 \$<
3002            mv \$<.B \$(basename \$<).B
3003            ./whirl2f -openad \$(basename \$<).B
3004            cat w2f__types.f90 \$(basename \$<).w2f.f > \$@
3005    
3006    # canonicalizer
3007    ad_input_code_sf.w2f.pre.f$FS90: ad_input_code_sf.w2f.f$FS90 preProcess.py
3008            ./preProcess.py --mode=reverse \$< -o \$@
3009    
3010    # F -> WHIRL
3011    # note that the canonicalized version cuts off at col 72
3012    # doing this also for string constants which is ok as long
3013    # as we are in fixed mode and cut of exactly there.
3014    # Otherwise mfef90 patches in spaces to fill up to 72 (or 132)
3015    # characters respectively.
3016    ad_input_code_sf.w2f.pre.B: ad_input_code_sf.w2f.pre.f$FS90 mfef90
3017            ./mfef90 -r8 -z -F \$<
3018            mv \$<.B \$@
3019    
3020    # WHIRL -> XAIF
3021    ad_input_code_sf.w2f.pre.xaif : ad_input_code_sf.w2f.pre.B whirl2xaif
3022            ./whirl2xaif -s -n --debug 1 -o \$@ \$<
3023    
3024    # XAIF -> XAIF'
3025    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 openad_adm
3026            ./openad_adm -f -t forward_step -i \$< -c \${XAIFSCHEMAROOT}/schema/examples/inlinable_intrinsics.xaif -o \$@ -I -r
3027    
3028    # XAIF' -> WHIRL'
3029    ad_input_code_sf.w2f.pre.xb.x2w.B : ad_input_code_sf.w2f.pre.xb.xaif xaif2whirl
3030            ./xaif2whirl --debug 1 --structured ad_input_code_sf.w2f.pre.B \$<
3031    
3032    # WHIRL' -> F'
3033    ad_input_code_sf.w2f.pre.xb.x2w.w2f.f$FS90: ad_input_code_sf.w2f.pre.xb.x2w.B whirl2f whirl2f_be
3034            ./whirl2f -FLIST:ftn_file=\$@ -openad \$<
3035    
3036    # insert template directives
3037    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
3038            ../OAD_support/insertTemplateDir.bash \$< \$@
3039    
3040    # postprocess F'
3041    ad_input_code_sf.w2f.pre.xb.x2w.w2f.td.pp.f$FS90: ad_input_code_sf.w2f.pre.xb.x2w.w2f.td.f$FS90 multi-pp.pl ../OAD_support/ad_inline.f \$(wildcard ../OAD_support/ad_template.*.f)
3042            perl multi-pp.pl -inline=../OAD_support/ad_inline.f \$<
3043            # the postprocessor still gets the name wrong
3044            cat \$<.pp | sed 's/RETURN//' > \$@
3045    
3046    # extract all transformed modules
3047    all_mods.xb.x2w.w2f.pp.f$FS90: ad_input_code_sf.w2f.pre.xb.x2w.w2f.td.pp.f$FS90
3048            cat \$< | sed -n '/MODULE /,/END MODULE/p' > \$@
3049    
3050    # remove the transformed globals module from the
3051    # transformed ad_input_code file
3052    # and remove for now the duplicate variables
3053    # and fix 2 data statements
3054    ad_input_code.w2f.pre.xb.x2w.w2f.td.pp.f$FS90: ad_input_code_sf.w2f.pre.xb.x2w.w2f.td.pp.f$FS90
3055            cat \$< | sed '/MODULE /,/END MODULE/d' | sed '/^      INTEGER(w2f__i4) DOLOOP_UB/d' > \$@
3056    
3057    # setup some links
3058    %.xsd:
3059            \$(LN) \${XAIFSCHEMAROOT}/schema/\$@ .
3060    
3061    mfef90:
3062            \$(LN) \${OPEN64ROOT}/crayf90/sgi/mfef90 .
3063    
3064    # link the support files:
3065    \$(OPENAD_SUPPORT_F90_SRC_FILES) \$(OPENAD_SUPPORT_C_SRC_FILES):
3066            \$(LN) ../OAD_support/\$@ .
3067    
3068    whirl2xaif xaif2whirl:
3069            \$(LN) \${OPENADFORTTK}/bin/\$@ .
3070    
3071    %.pl:
3072            \$(LN) \${OPENADFORTTK}/bin/\$@ .
3073    
3074    preProcess.py:
3075            \$(LN) \${OPENADFORTTK_BASE}/tools/SourceProcessing/\$@ .
3076    
3077    whirl2f whirl2f_be:
3078            \$(LN) \${OPEN64ROOT}/whirl2f/\$@ .
3079    
3080    openad_adm:
3081            \$(LN) \${XAIFBOOSTERROOT}/xaifBooster/algorithms/BasicBlockPreaccumulationReverse/test/t \$@
3082    
3083    # ============ end OpenAD specific section ==============
3084    
3085  EOF  EOF
3086    
3087    fi
3088    
3089    #=========================================
3090    
3091  if test "x$EXEHOOK" != x ; then  if test "x$EXEHOOK" != x ; then
3092      printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE      printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE
3093  fi  fi
# Line 1429  for i in $KPPFILES ; do Line 3099  for i in $KPPFILES ; do
3099      if test "x$RETVAL" != x0 ; then      if test "x$RETVAL" != x0 ; then
3100          echo "Error: unable to add file \"$i\" to the exceptions list"          echo "Error: unable to add file \"$i\" to the exceptions list"
3101      fi      fi
3102      echo "$base.f: $base.p" >> $MAKEFILE      echo "$base.$FS: $base.p" >> $MAKEFILE
3103  done  done
3104    
3105  echo "  Making list of NOOPTFILES"  echo "  Making list of NOOPTFILES"
# Line 1439  for i in $NOOPTFILES ; do Line 3109  for i in $NOOPTFILES ; do
3109      if test "x$RETVAL" != x0 ; then      if test "x$RETVAL" != x0 ; then
3110          echo "Error: unable to add file \"$i\" to the exceptions list"          echo "Error: unable to add file \"$i\" to the exceptions list"
3111      fi      fi
3112      echo "$base.o: $base.f" >> $MAKEFILE      echo "$base.o: $base.$FS" >> $MAKEFILE
3113      printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE      printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE
3114  done  done
3115    
# Line 1452  printf "\n\n# DO NOT DELETE\n" >> $MAKEF Line 3122  printf "\n\n# DO NOT DELETE\n" >> $MAKEF
3122    
3123  printf "\n===  Done  ===\n"  printf "\n===  Done  ===\n"
3124    
3125  #  Write the "template" files for the adjoint builds  # Create special header files
3126  cat >AD_CONFIG.template <<EOF  $BASH $TOOLSDIR/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -bPACKAGES_CONFIG_H "Disabled packages:" $DISABLED_PACKAGES " " "Enabled packages:" $ENABLED_PACKAGES > $PACKAGES_DOT_H".tmp"
3127  C  WARNING: This file is automatically generated by genmake2 and  if test ! -f $PACKAGES_DOT_H ; then
3128  C    used by the Makefile rules.  Please DO NOT EDIT this file      mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
3129  C    unless you are CERTAIN that you know what you are doing.  else
3130        cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H > /dev/null 2>&1
3131  #undef ALLOW_ADJOINT_RUN      RETVAL=$?
3132  #undef ALLOW_TANGENTLINEAR_RUN      if test "x$RETVAL" = x0 ; then
3133  #undef ALLOW_ECCO_OPTIMIZATION          rm -f $PACKAGES_DOT_H".tmp"
3134  EOF      else
3135  cat >ad_config.template <<EOF          mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"
3136  C  WARNING: This file is automatically generated by genmake2 and          mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
3137  C    used by the Makefile rules.  Please DO NOT EDIT this file      fi
3138  C    unless you are CERTAIN that you know what you are doing.  fi
3139    if test ! -f AD_CONFIG.h ; then
3140  #define ALLOW_ADJOINT_RUN      $BASH $TOOLSDIR/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -UALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN -UALLOW_ECCO_OPTIMIZATION > AD_CONFIG.h
3141  #undef ALLOW_TANGENTLINEAR_RUN  fi
 #undef ALLOW_ECCO_OPTIMIZATION  
 EOF  
 cat >ftl_config.template <<EOF  
 C  WARNING: This file is automatically generated by genmake2 and  
 C    used by the Makefile rules.  Please DO NOT EDIT this file  
 C    unless you are CERTAIN that you know what you are doing.  
   
 #undef ALLOW_ADJOINT_RUN  
 #define ALLOW_TANGENTLINEAR_RUN  
 #undef ALLOW_ECCO_OPTIMIZATION  
 EOF  
 cat >svd_config.template <<EOF  
 C  WARNING: This file is automatically generated by genmake2 and  
 C    used by the Makefile rules.  Please DO NOT EDIT this file  
 C    unless you are CERTAIN that you know what you are doing.  
   
 #undef ALLOW_ADJOINT_RUN  
 #undef ALLOW_TANGENTLINEAR_RUN  
 #undef ALLOW_ECCO_OPTIMIZATION  
 EOF  
 cp AD_CONFIG.template AD_CONFIG.h  
3142    
3143    
3144  #  Write the "state" for future records  #  Write the "state" for future records
3145  if test "x$DUMPSTATE" != xf ; then  if test "x$DUMPSTATE" != xf ; then
3146      echo -n "" > genmake_state      printf "" > genmake_state
3147      for i in $gm_state ; do      for i in $gm_state ; do
3148          t1="t2=\$$i"          t1="t2=\$$i"
3149          eval $t1          eval $t1

Legend:
Removed from v.1.27  
changed lines
  Added in v.1.180

  ViewVC Help
Powered by ViewVC 1.1.22