/[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.32 by edhill, Wed Nov 12 22:05:47 2003 UTC revision 1.206 by jmc, Sun May 23 18:34:43 2010 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"
307  #     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  
       
308      echo "test" > test      echo "test" > test
309      ln -s ./test link      ln -s ./test link
310      RETVAL=$?      RETVAL=$?
# 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 166  Error: No options file was found in:  $R Line 442  Error: No options file was found in:  $R
442  EOF  EOF
443          exit 1          exit 1
444      fi      fi
445        
446  #     # look for possible MPI libraries  #     # look for possible MPI libraries
447  #     mpi_libs=  #     mpi_libs=
448  #     mpi_fort=`which mpif77 2>/dev/null`  #     mpi_fort=`which mpif77 2>/dev/null`
# Line 185  EOF Line 461  EOF
461  #       if test "x${RETVAL}" = x0 ; then  #       if test "x${RETVAL}" = x0 ; then
462  #           a=`cat out`  #           a=`cat out`
463  #           for i in $a ; do  #           for i in $a ; do
464  #               case $i in  #               case $i in
465  #                   -*)  #                   -*)
466  #                       mpi_libs="$mpi_libs $i" ;;  #                       mpi_libs="$mpi_libs $i" ;;
467  #               esac  #               esac
# Line 204  get_pdepend_list()  { Line 480  get_pdepend_list()  {
480      #  strip the comments and then convert the dependency file into      #  strip the comments and then convert the dependency file into
481      #  two arrays: PNAME, DNAME      #  two arrays: PNAME, DNAME
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=-1;} (NF>0){ for(i=2;i<=NF;i++){nn++; print "PNAME_"nn"="$1"\nDNAME_"nn"="$i}} END{print "nname="nn}' \
484          > ./.pd_tmp          > ./.pd_tmp
485      source ./.pd_tmp      RETVAL=$?
486        if test ! "x${RETVAL}" = x0 ; then
487          echo "Error: unable to parse package dependencies -- please check PDEPEND=\"$1\""
488          exit 1
489        fi
490        . ./.pd_tmp
491      rm -f ./.pd_tmp      rm -f ./.pd_tmp
492    
     echo -n "PNAME = "${}  
493  }  }
494    
495    
496  #  Explain usage  #  Explain usage
497  usage()  {  usage()  {
498      echo  cat <<EOF
499      echo "Usage: "$0" [OPTIONS]"  
500      echo "  where [OPTIONS] can be:"  Usage: "$0" [OPTIONS]
501      echo    where [OPTIONS] can be:
502      echo "    -help | --help | -h | --h"  
503      echo "    -nooptfile | --nooptfile"      -help | --help | -h | --h
504      echo "      -optfile NAME | --optfile NAME | -of NAME | --of NAME"            Print this help message and exit.
505      echo "      -optfile=NAME | --optfile=NAME | -of=NAME | --of=NAME"  
506      echo "    -pdepend NAME | --pdepend NAME"      -adoptfile NAME | --adoptfile NAME | -adof NAME | --adof NAME
507      echo "      -pdepend=NAME | --pdepend=NAME"        -adoptfile=NAME | --adoptfile=NAME | -adof=NAME | --adof=NAME
508      echo "    -pdefault NAME | --pdefault NAME"            Use "NAME" as the adoptfile.  By default, the file at
509      echo "      -pdefault=NAME | --pdefault=NAME"            "tools/adjoint_options/adjoint_default" will be used.
510      echo "    -make NAME | -m NAME"  
511      echo "      --make=NAME | -m=NAME"      -nooptfile | --nooptfile
512      echo "    -makefile NAME | -mf NAME"        -optfile NAME | --optfile NAME | -of NAME | --of NAME
513      echo "      --makefile=NAME | -mf=NAME"        -optfile=NAME | --optfile=NAME | -of=NAME | --of=NAME
514      echo "    -platform NAME | --platform NAME | -pl NAME | --pl NAME"            Use "NAME" as the optfile.  By default, an attempt will be
515      echo "      -platform=NAME | --platform=NAME | -pl=NAME | --pl=NAME"            made to find an appropriate "standard" optfile in the
516      echo "    -rootdir NAME | --rootdir NAME | -rd NAME | --rd NAME"            tools/build_options/ directory.
517      echo "      -rootdir=NAME | --rootdir=NAME | -rd=NAME | --rd=NAME"  
518      echo "    -mods NAME | --mods NAME | -mo NAME | --mo NAME"      -pdepend NAME | --pdepend NAME
519      echo "      -mods=NAME | --mods=NAME | -mo=NAME | --mo=NAME"        -pdepend=NAME | --pdepend=NAME
520      echo "    -disable NAME | --disable NAME"            Get package dependency information from "NAME".
521      echo "      -disable=NAME | --disable=NAME"  
522      echo "    -enable NAME | --enable NAME"      -pdefault NAME | --pdefault NAME
523      echo "      -enable=NAME | --enable=NAME"        -pdefault=NAME | --pdefault=NAME
524      echo "    -standarddirs NAME | --standarddirs NAME"            Get the default package list from "NAME".
525      echo "      -standarddirs=NAME | --standarddirs=NAME"  
526      echo "    -noopt NAME | --noopt NAME"      -bash NAME
527      echo "      -noopt=NAME | --noopt=NAME"            Explicitly specify the Bourne or BASH shell to use
528  #    echo "    -cpp NAME | --cpp NAME"  
529  #    echo "      -cpp=NAME | --cpp=NAME"      -make NAME | -m NAME
530      echo "    -fortran NAME | --fortran NAME | -fc NAME | --fc NAME"        --make=NAME | -m=NAME
531      echo "      -fc=NAME | --fc=NAME"            Use "NAME" for the MAKE program. The default is "make" but
532      echo "    -[no]ieee | --[no]ieee"            many platforms, "gmake" is the preferred choice.
533      echo "    -[no]mpi | --[no]mpi"  
534      echo "    -[no]jam | --[no]jam"      -makefile NAME | -mf NAME
535      echo        --makefile=NAME | -mf=NAME
536      echo "  and NAME is a string such as:"            Call the makefile "NAME".  The default is "Makefile".
537      echo  
538      echo "    --enable pkg1   --enable 'pkg1 pkg2'   --enable 'pkg1 pkg2 pkg3'"      -makedepend NAME | -md NAME
539      echo "    -mods=dir1   -mods='dir1'   -mods='dir1 dir2 dir3'"        --makedepend=NAME | -md=NAME
540      echo "    -foptim='-Mvect=cachesize:512000,transform -xtypemap=real:64,double:64,integer:32'"            Use "NAME" for the MAKEDEPEND program.
541      echo  
542      echo "  which, depending upon your shell, may need to be single-quoted"      -rootdir NAME | --rootdir NAME | -rd NAME | --rd NAME
543      echo "  if it contains spaces, dashes, or other special characters."        -rootdir=NAME | --rootdir=NAME | -rd=NAME | --rd=NAME
544              Specify the location of the MITgcm ROOTDIR as "NAME".
545              By default, genamke will try to find the location by
546              looking in parent directories (up to the 5th parent).
547    
548        -mods NAME | --mods NAME | -mo NAME | --mo NAME
549          -mods=NAME | --mods=NAME | -mo=NAME | --mo=NAME
550              Here, "NAME" specifies a list of directories that are
551              used for additional source code.  Files found in the
552              "mods list" are given preference over files of the same
553              name found elsewhere.
554    
555        -disable NAME | --disable NAME
556          -disable=NAME | --disable=NAME
557              Here "NAME" specifies a list of packages that we don't
558              want to use.  If this violates package dependencies,
559              genamke will exit with an error message.
560    
561        -enable NAME | --enable NAME
562          -enable=NAME | --enable=NAME
563              Here "NAME" specifies a list of packages that we wish
564              to specifically enable.  If this violates package
565              dependencies, genamke will exit with an error message.
566    
567        -standarddirs NAME | --standarddirs NAME
568          -standarddirs=NAME | --standarddirs=NAME
569              Here, "NAME" specifies a list of directories to be
570              used as the "standard" code.
571    
572        -fortran NAME | --fortran NAME | -fc NAME | --fc NAME
573          -fc=NAME | --fc=NAME
574              Use "NAME" as the fortran compiler.  By default, genmake
575              will search for a working compiler by trying a list of
576              "usual suspects" such as g77, f77, etc.
577    
578        -cc NAME | --cc NAME | -cc=NAME | --cc=NAME
579              Use "NAME" as the C compiler.  By default, genmake
580              will search for a working compiler by trying a list of
581              "usual suspects" such as gcc, c89, cc, etc.
582    
583        -[no]ieee | --[no]ieee
584              Do or don't use IEEE numerics.  Note that this option
585              *only* works if it is supported by the OPTFILE that
586              is being used.
587    
588        -use_real4 | -use_r4 | -ur4 | --use_real4 | --use_r4 | --ur4
589              Use "real*4" type for _RS variable (#undef REAL4_IS_SLOW)
590              *only* works if CPP_EEOPTIONS.h allows this.
591    
592        -ignoretime | -ignore_time | --ignoretime | --ignore_time
593              Ignore all the "wall clock" routines entirely.  This will
594              not in any way hurt the model results -- it simply means
595              that the code that checks how long the model spends in
596              various routines will give junk values.
597    
598        -ts | --ts
599              Produce timing information per timestep
600        -papis | --papis
601              Produce summary MFlop/s (and IPC) with PAPI per timestep
602        -pcls | --pcls
603              Produce summary MFlop/s etc. with PCL per timestep
604        -foolad | --foolad
605              Fool the AD code generator
606        -papi | --papi
607              Performance analysis with PAPI
608        -pcl | --pcl
609              Performance analysis with PCL
610        -hpmt | --hpmt
611              Performance analysis with the HPM Toolkit
612    
613        -gsl | --gsl
614              Use GSL to control floating point rounding and precision
615        -devel | --devel
616              Add additional warning and debugging flags for development
617    
618        -mpi | --mpi
619              Include MPI header files and link to MPI libraries
620        -mpi=PATH | --mpi=PATH
621              Include MPI header files and link to MPI libraries using MPI_ROOT
622              set to PATH. i.e. Include files from \$PATH/include, link to libraries
623              from \$PATH/lib and use binaries from \$PATH/bin.
624    
625        -omp | --omp
626              Activate OpenMP code + use Compiler option OMPFLAG
627        -omp=OMPFLAG | --omp=OMPFLAG
628              Activate OpenMP code + use Compiler option OMPFLAG
629    
630        -es | --es | -embed-source | --embed-source
631              Embed a tarball containing the full source code
632              (including the Makefile, etc.) used to build the
633              executable [off by default]
634    
635      While it is most often a single word, the "NAME" variables specified
636      above can in many cases be a space-delimited string such as:
637    
638        --enable pkg1   --enable 'pkg1 pkg2'   --enable 'pkg1 pkg2 pkg3'
639        -mods=dir1   -mods='dir1'   -mods='dir1 dir2 dir3'
640        -foptim='-Mvect=cachesize:512000,transform -xtypemap=real:64,double:64,integer:32'
641    
642      which, depending upon your shell, may need to be single-quoted.
643    
644      For more detailed genmake documentation, please see:
645    
646        http://mitgcm.org/public/devel_HOWTO/
647    
648    EOF
649    
650      exit 1      exit 1
651  }  }
652    
653  #  Build a CPP macro to automate calling C routines from FORTRAN  #  Build a CPP macro to automate calling C routines from FORTRAN
654  get_fortran_c_namemangling()  {  get_fortran_c_namemangling()  {
655    
656        #echo "FC_NAMEMANGLE = \"$FC_NAMEMANGLE\""
657        if test ! "x$FC_NAMEMANGLE" = x ; then
658            return 0
659        fi
660    
661      default_nm="#define FC_NAMEMANGLE(X) X ## _"      default_nm="#define FC_NAMEMANGLE(X) X ## _"
662        
663      cat > genmake_test.c <<EOF      cat > genmake_test.c <<EOF
664  void tcall( char * string ) { tsub( string ); }  void tcall( char * string ) { tsub( string ); }
665  EOF  EOF
666      $MAKE genmake_test.o > genmake_test.log 2>&1      $MAKE genmake_test.o >> genmake_warnings 2>&1
667      RETVAL=$?      RETVAL=$?
668      if test "x$RETVAL" != x0 ; then      if test "x$RETVAL" != x0 ; then
         cat genmake_test.log >> genmake_errors  
669          FC_NAMEMANGLE=$default_nm          FC_NAMEMANGLE=$default_nm
670          echo          cat <<EOF>> genmake_errors
671          echo "WARNING: C test compile fails -- please see \"genmake_errors\""  
672          echo "WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'"  WARNING: C test compile fails
673          echo "WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here."  WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
674    WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here
675    EOF
676          return 1          return 1
677      fi      fi
678      c_tcall=`nm genmake_test.o | grep tcall | cut -d ' ' -f 3`      c_tcall=`nm genmake_test.o 2>/dev/null | grep 'T ' | grep tcall | cut -d ' ' -f 3`
679      RETVAL=$?      RETVAL=$?
680      if test "x$RETVAL" != x0 ; then      if test "x$RETVAL" != x0 ; then
681          FC_NAMEMANGLE=$default_nm          FC_NAMEMANGLE=$default_nm
682          echo          cat <<EOF>> genmake_warnings
683          echo "WARNING: The \"nm\" command failed."  
684          echo "WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'"  WARNING: The "nm" command failed.
685          echo "WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here."  WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
686    WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here
687    EOF
688          return 1          return 1
689      fi      fi
690      cat > genmake_tcomp.f <<EOF      cat > genmake_tcomp.$FS <<EOF
691        subroutine tcall( string )        subroutine tcall( string )
692        character*(*) string        character*(*) string
693        call tsub( string )        call tsub( string )
694        end        end
695  EOF  EOF
696      $FC $FFLAGS $DEFINES -c genmake_tcomp.f > genmake_tcomp.log 2>&1      $FC $FFLAGS -c genmake_tcomp.$FS >> genmake_warnings 2>&1
697      RETVAL=$?      RETVAL=$?
698      if test "x$RETVAL" != x0 ; then      if test "x$RETVAL" != x0 ; then
         cat genmake_tcomp.log >> genmake_errors  
699          FC_NAMEMANGLE=$default_nm          FC_NAMEMANGLE=$default_nm
700          echo          cat <<EOF>> genmake_warnings
701          echo "WARNING: FORTRAN test compile fails -- please see \"genmake_errors\""  
702          echo "WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'"  WARNING: FORTRAN test compile fails -- please see "genmake_errors"
703          echo "WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here."  WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
704    WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here.
705    EOF
706          return 1          return 1
707      fi      fi
708      f_tcall=`nm genmake_tcomp.o | grep tcall | cut -d ' ' -f 3`      f_tcall=`nm genmake_tcomp.o 2>/dev/null | grep 'T ' | grep tcall | cut -d ' ' -f 3`
709      RETVAL=$?      RETVAL=$?
710      if test "x$RETVAL" != x0 ; then      if test "x$RETVAL" != x0 ; then
711          FC_NAMEMANGLE=$default_nm          FC_NAMEMANGLE=$default_nm
712          echo          cat <<EOF>> genmake_warnings
713          echo "WARNING: The \"nm\" command failed."  
714          echo "WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'"  WARNING: The "nm" command failed.
715          echo "WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here."  WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
716    WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here.
717    EOF
718          return 1          return 1
719      fi      fi
720    
# Line 343  EOF Line 741  EOF
741      rm -f genmake_tcomp.* genmake_test.*      rm -f genmake_tcomp.* genmake_test.*
742  }  }
743    
744    
745    check_HAVE_CLOC()  {
746        get_fortran_c_namemangling
747        cat <<EOF > genmake_tc_1.c
748    $FC_NAMEMANGLE
749    #include <stdio.h>
750    #include <stdlib.h>
751    #include <unistd.h>
752    #include <assert.h>
753    #include <sys/time.h>
754    void FC_NAMEMANGLE(cloc) ( double *curtim )
755    {
756     struct timeval tv1;
757     gettimeofday(&tv1 , (void *)NULL );
758     *curtim =  (double)((tv1.tv_usec)+(tv1.tv_sec)*1.E6);
759     *curtim = *curtim/1.E6;
760    }
761    EOF
762        COMM="$CC $CFLAGS -c genmake_tc_1.c"
763        echo $COMM >> genmake_warnings
764        $COMM >> genmake_warnings 2>&1
765        RET_C=$?
766        cat <<EOF > genmake_tc_2.$FS
767          program hello
768          REAL*8 wtime
769          external cloc
770          call cloc(wtime)
771          print *," HELLO WORLD", wtime
772          end
773    EOF
774        COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
775        echo $COMM >> genmake_warnings
776        $COMM >> genmake_warnings 2>&1
777        RET_F=$?
778        test -x ./genmake_tc  &&  ./genmake_tc >> genmake_warnings 2>&1
779        RETVAL=$?
780        if test "x$RETVAL" = x0 ; then
781            HAVE_CLOC=t
782            DEFINES="$DEFINES -DHAVE_CLOC"
783        fi
784        rm -f genmake_tc*
785    }
786    
787    
788    check_HAVE_SIGREG()  {
789        if test ! "x$HAVE_SIGREG" = x ; then
790            return
791        fi
792        get_fortran_c_namemangling
793        cat <<EOF > genmake_tc_1.c
794    $FC_NAMEMANGLE
795    #include <stdlib.h>
796    #include <stdio.h>
797    #include <signal.h>
798    #include <errno.h>
799    #include <ucontext.h>
800    
801    int * ip;
802    
803    static void killhandler(
804        unsigned int sn, siginfo_t  si, struct ucontext *sc )
805    {
806        *ip = *ip + 1;
807        return;
808    }
809    
810    void FC_NAMEMANGLE(sigreg) (int * aip)
811    {
812        struct sigaction s;
813        ip = aip;
814        s.sa_flags = SA_SIGINFO;
815        s.sa_sigaction = (void *)killhandler;
816        if(sigaction (SIGTERM,&s,(struct sigaction *)NULL)) {
817            printf("Sigaction returned error = %d\n", errno);
818            exit(0);
819        }
820        return;
821    }
822    EOF
823        COMM="$CC $CFLAGS -c genmake_tc_1.c"
824        echo $COMM >> genmake_warnings
825        $COMM >> genmake_warnings 2>&1
826        RET_C=$?
827        cat <<EOF > genmake_tc_2.$FS
828          program hello
829          integer anint
830          common /iv/ anint
831          external sigreg
832          call sigreg(anint)
833          end
834    EOF
835        echo >> genmake_warnings
836        echo "running: check_HAVE_SIGREG()" >> genmake_warnings
837        cat genmake_tc_2.$FS >> genmake_warnings
838        COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
839        echo $COMM >> genmake_warnings
840        $COMM >> genmake_warnings 2>&1
841        RETVAL=$?
842        if test "x$RETVAL" = x0 ; then
843            HAVE_SIGREG=t
844            DEFINES="$DEFINES -DHAVE_SIGREG"
845        fi
846        rm -f genmake_tc*
847    }
848    
849    
850    check_HAVE_SETRLSTK()  {
851        if test "x$HAVE_SETRLSTK" = xt ; then
852            DEFINES="$DEFINES -DHAVE_SETRLSTK"
853            return
854        fi  
855        if test ! "x$HAVE_SETRLSTK" = x ; then
856            return
857        fi
858        get_fortran_c_namemangling
859        cat <<EOF > genmake_tc_1.c
860    $FC_NAMEMANGLE
861    #include <sys/time.h>
862    #include <sys/resource.h>
863    #include <unistd.h>
864    void FC_NAMEMANGLE(setrlstk) ()
865    {
866        struct rlimit rls;
867        rls.rlim_cur = RLIM_INFINITY;
868        rls.rlim_max = RLIM_INFINITY;
869        setrlimit(RLIMIT_STACK, &rls);
870        return;
871    }
872    EOF
873        COMM="$CC $CFLAGS -c genmake_tc_1.c"
874        echo $COMM >> genmake_warnings
875        $COMM >> genmake_warnings 2>&1
876        RET_C=$?
877        cat <<EOF > genmake_tc_2.$FS
878          program hello
879          external setrlstk
880          call setrlstk()
881          end
882    EOF
883        echo >> genmake_warnings
884        echo "running: check_HAVE_SETRLSTK()" >> genmake_warnings
885        cat genmake_tc_2.$FS >> genmake_warnings
886        COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
887        echo $COMM >> genmake_warnings
888        $COMM >> genmake_warnings 2>&1
889        RETVAL=$?
890        if test "x$RETVAL" = x0 ; then
891            HAVE_SETRLSTK=t
892            DEFINES="$DEFINES -DHAVE_SETRLSTK"
893        fi
894        rm -f genmake_tc*
895    }
896    
897    
898    check_HAVE_STAT()  {
899        get_fortran_c_namemangling
900        cat <<EOF > genmake_tc_1.c
901    $FC_NAMEMANGLE
902    #include <stdio.h>
903    #include <stdlib.h>
904    #include <unistd.h>
905    #include <sys/stat.h>
906    #include <sys/types.h>
907    void FC_NAMEMANGLE(tfsize) ( int *nbyte )
908    {
909        char name[512];
910        struct stat astat;
911    
912        name[0] = 'a'; name[1] = '\0';
913        if (! stat(name, &astat))
914            *nbyte = (int)(astat.st_size);
915        else
916            *nbyte = -1;
917    }
918    EOF
919        COMM="$CC $CFLAGS -c genmake_tc_1.c"
920        echo $COMM >> genmake_warnings
921        $COMM >> genmake_tc.log 2>&1
922        RET_C=$?
923        cat <<EOF > genmake_tc_2.$FS
924          program hello
925          integer nbyte
926          call tfsize(nbyte)
927          print *," HELLO WORLD", nbyte
928          end
929    EOF
930        echo >> genmake_warnings
931        echo "running: check_HAVE_STAT()" >> genmake_warnings
932        cat genmake_tc_2.$FS >> genmake_warnings
933        COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
934        echo $COMM >> genmake_warnings
935        $COMM >> genmake_tc.log 2>&1
936        RETVAL=$?
937        if test "x$RETVAL" = x0 ; then
938            HAVE_STAT=t
939            DEFINES="$DEFINES -DHAVE_STAT"
940        fi
941        rm -f genmake_tc*
942    }
943    
944    
945    check_netcdf_libs()  {
946        if test ! "x$SKIP_NETCDF_CHECK" = x ; then
947            return
948        fi
949        echo >> genmake_warnings
950        echo "running: check_netcdf_libs()" >> genmake_warnings
951        cat <<EOF > genmake_tnc.F
952          program fgennc
953    #include "netcdf.inc"
954    EOF
955        if test ! "x$MPI" = x ; then
956            echo '#include "mpif.h"' >> genmake_tnc.F
957        fi
958        cat <<EOF >> genmake_tnc.F
959          integer iret, ncid, xid
960          iret = nf_create('genmake_tnc.nc', NF_CLOBBER, ncid)
961          IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
962          iret = nf_def_dim(ncid, 'X', 11, xid)
963          IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
964          iret = nf_close(ncid)
965          IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
966          end
967    EOF
968        echo "===  genmake_tnc.F  ===" > genmake_tnc.log
969        cat genmake_tnc.F >> genmake_tnc.log
970        echo "===  genmake_tnc.F  ===" >> genmake_tnc.log
971        RET_CPP=f
972        COMM="cat genmake_tnc.F | $CPP $DEFINES $INCLUDES"
973        echo "$COMM" >> genmake_tnc.log
974        eval $COMM > genmake_tnc.$FS 2>/dev/null  &&  RET_CPP=t
975        if test "x$RET_CPP" = xf ; then
976            echo "  WARNING: CPP failed to pre-process the netcdf test." \
977                >> genmake_tnc.log
978            echo "    Please check that \$INCLUDES is properly set." \
979                >> genmake_tnc.log
980        fi
981        echo "$FC $FFLAGS $FOPTIM -c genmake_tnc.$FS  \ " >> genmake_tnc.log
982        echo "  &&  $LINK $FFLAGS $FOPTIM -o genmake_tnc.o $LIBS" >> genmake_tnc.log
983        $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1  \
984            &&  $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS >> genmake_tnc.log 2>&1
985        RET_COMPILE=$?
986        cat genmake_tnc.log >> genmake_warnings
987    
988        #EH3  Remove test program execution for machines that either disallow
989        #EH3  execution or cannot support it (eg. cross-compilers)
990        #EH3
991        #EH3 test -x ./genmake_tnc  &&  ./genmake_tnc >> genmake_tnc.log 2>&1
992        #EH3 RETVAL=$?
993        #EH3 if test "x$RET_COMPILE" = x0 -a "x$RETVAL" = x0 ; then
994    
995        if test "x$RET_COMPILE" = x0 ; then
996            HAVE_NETCDF=t
997        else
998            # try again with "-lnetcdf" added to the libs
999            echo "try again with added '-lnetcdf'" > genmake_tnc.log
1000            echo "cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS \ " >> genmake_tnc.log
1001            echo " &&  $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS \ " >> genmake_tnc.log
1002            echo " &&  $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf" >> genmake_tnc.log
1003            cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS 2>/dev/null  \
1004                &&  $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1  \
1005                &&  $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf >> genmake_tnc.log 2>&1
1006            RET_COMPILE=$?
1007            cat genmake_tnc.log >> genmake_warnings
1008            if test "x$RET_COMPILE" = x0 ; then
1009                LIBS="$LIBS -lnetcdf"
1010                HAVE_NETCDF=t
1011            else
1012            # try again with "-lnetcdff" added to the libs
1013                echo "try again with added '-lnetcdff -lnetcdf'" > genmake_tnc.log
1014                echo "cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS \ " >> genmake_tnc.log
1015                echo " &&  $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS \ " >> genmake_tnc.log
1016                echo " &&  $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf" >> genmake_tnc.log
1017                cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS 2>/dev/null  \
1018                    &&  $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1  \
1019                    &&  $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdff -lnetcdf >> genmake_tnc.log 2>&1
1020                RET_COMPILE=$?
1021                cat genmake_tnc.log >> genmake_warnings
1022                if test "x$RET_COMPILE" = x0 ; then
1023                    LIBS="$LIBS -lnetcdff -lnetcdf"
1024                    HAVE_NETCDF=t
1025                fi
1026            fi
1027        fi
1028        rm -f genmake_tnc*
1029    }
1030    
1031    
1032    
1033    ###############################################################################
1034    #   Sequential part of script starts here
1035    ###############################################################################
1036    
1037  #  Set defaults here  #  Set defaults here
1038  COMMANDL="$0 $@"  COMMANDL="$0 $@"
1039    
# Line 350  PLATFORM= Line 1041  PLATFORM=
1041  LN=  LN=
1042  S64=  S64=
1043  KPP=  KPP=
1044  FC=  #FC=
1045    #CC=gcc
1046    #CPP=
1047  LINK=  LINK=
 # DEFINES="-DWORDLENGTH=4"  
1048  DEFINES=  DEFINES=
1049  PACKAGES=  PACKAGES=
1050  ENABLE=  ENABLE=
1051  DISABLE=  DISABLE=
1052  MAKEFILE=  # MAKEFILE=
1053  MAKEDEPEND=  # MAKEDEPEND=
1054  PDEPEND=  PDEPEND=
1055  DUMPSTATE=t  DUMPSTATE=t
1056  PDEFAULT=  PDEFAULT=
1057  OPTFILE=  OPTFILE=
1058  INCLUDES="-I."  INCLUDES="-I. $INCLUDES"
1059  FFLAGS=  FFLAGS=
1060  FOPTIM=  FOPTIM=
1061    FEXTRAFLAGS=
1062    USE_EXTENDED_SRC=
1063    EXTENDED_SRC_FLAG=
1064  CFLAGS=  CFLAGS=
1065  KFLAGS1=  KFLAGS1=
1066  KFLAGS2=  KFLAGS2=
1067    #LDADD=
1068  LIBS=  LIBS=
1069  KPPFILES=  KPPFILES=
1070  NOOPTFILES=  NOOPTFILES=
1071  NOOPTFLAGS=  NOOPTFLAGS=
1072    MPI=
1073    MPIPATH=
1074    OMP=
1075    OMPFLAG=
1076    USE_R4=
1077    TS=
1078    PAPIS=
1079    PCLS=
1080    FOOLAD=
1081    PAPI=
1082    PCL=
1083    HPMT=
1084    GSL=
1085    DEVEL=
1086    HAVE_TEST_L=
1087    
1088  # DEFINES checked by test compilation  # DEFINES checked by test compilation or command-line
1089  HAVE_SYSTEM=  HAVE_SYSTEM=
1090  HAVE_FDATE=  HAVE_FDATE=
1091  FC_NAMEMANGLE=  FC_NAMEMANGLE=
1092    HAVE_CLOC=
1093    # HAVE_SETRLSTK=
1094    HAVE_STAT=
1095    HAVE_NETCDF=
1096    HAVE_ETIME=
1097    IGNORE_TIME=
1098    
1099  MODS=  MODS=
1100  TOOLSDIR=  TOOLSDIR=
1101  SOURCEDIRS=  SOURCEDIRS=
1102  INCLUDEDIRS=  INCLUDEDIRS=
1103  STANDARDDIRS=  STANDARDDIRS="USE_THE_DEFAULT"
1104    
1105    G2ARGS=
1106    BASH=
1107  PWD=`pwd`  PWD=`pwd`
1108  MAKE=make  test "x$MAKE" = x  &&  MAKE=make
1109  AWK=awk  test "x$AWK" = x   &&  AWK=awk
1110  THISHOSTNAME=`hostname`  EMBED_SRC=
1111    THISHOST=`hostname`
1112  THISCWD=`pwd`  THISCWD=`pwd`
1113  THISDATE=`date`  THISDATE=`date`
1114    THISUSER=`echo $USER`
1115    THISVER=
1116  MACHINE=`uname -a`  MACHINE=`uname -a`
1117  EXECUTABLE=  EXECUTABLE=
1118  EXEHOOK=  EXEHOOK=
# Line 400  IEEE= Line 1122  IEEE=
1122  if test "x$MITGCM_IEEE" != x ; then  if test "x$MITGCM_IEEE" != x ; then
1123      IEEE=$MITGCM_IEEE      IEEE=$MITGCM_IEEE
1124  fi  fi
1125    FS=
1126    FS90=
1127    
1128  AUTODIFF_PKG_USED=f  AUTODIFF_PKG_USED=f
1129  AD_OPTFILE=  AD_OPTFILE=
# Line 416  TAMC_EXTRA= Line 1140  TAMC_EXTRA=
1140    
1141    
1142  #  The following state can be set directly by command-line switches  #  The following state can be set directly by command-line switches
1143  gm_s1="OPTFILE PDEPEND PDEFAULT MAKEFILE PLATFORM ROOTDIR MODS DISABLE ENABLE NOOPT"  gm_s1="OPTFILE PDEPEND PDEFAULT MAKEFILE PLATFORM ROOTDIR MODS DISABLE ENABLE"
1144  gm_s2="FC IEEE MPI JAM DUMPSTATE STANDARDDIRS"  gm_s2="FC IEEE USE_R4 TS PAPIS PCLS PAPI PCL HPMT GSL DEVEL MPI OMP DUMPSTATE STANDARDDIRS"
1145    
1146  #  The following state is not directly set by command-line switches  #  The following state is not directly set by command-line switches
1147  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"
1148  gm_s4="CFLAGS KFLAGS1 KFLAGS2 LIBS KPPFILES NOOPTFILES NOOPTFLAGS"  gm_s4="CFLAGS KFLAGS1 KFLAGS2 LIBS KPPFILES NOOPTFILES NOOPTFLAGS"
1149  gm_s5="TOOLSDIR SOURCEDIRS INCLUDEDIRS PWD MAKE THISHOSTNAME THISDATE MACHINE"  gm_s5="TOOLSDIR SOURCEDIRS INCLUDEDIRS PWD MAKE THISHOST THISUSER THISDATE THISVER MACHINE"
1150  gm_s6="EXECUTABLE EXEHOOK EXEDIR PACKAGES_CONF"  gm_s6="EXECUTABLE EXEHOOK EXEDIR PACKAGES_CONF"
1151  gm_s7="HAVE_SYSTEM HAVE_FDATE FC_NAMEMANGLE"  gm_s7="HAVE_SYSTEM HAVE_FDATE FC_NAMEMANGLE HAVE_ETIME"
1152    
1153  #  The following are all related to adjoint/tangent-linear stuff  #  The following are all related to adjoint/tangent-linear stuff
1154  gm_s10="AUTODIFF_PKG_USED AD_OPTFILE TAMC TAF AD_TAMC_FLAGS AD_TAF_FLAGS"  gm_s10="AUTODIFF_PKG_USED AD_OPTFILE TAMC TAF AD_TAMC_FLAGS AD_TAF_FLAGS"
# Line 434  gm_s12="TAF_EXTRA TAMC_EXTRA" Line 1158  gm_s12="TAF_EXTRA TAMC_EXTRA"
1158  gm_state="COMMANDL $gm_s1 $gm_s2 $gm_s3 $gm_s4 $gm_s5 $gm_s6 $gm_s7"  gm_state="COMMANDL $gm_s1 $gm_s2 $gm_s3 $gm_s4 $gm_s5 $gm_s6 $gm_s7"
1159  gm_state="$gm_state $gm_s10 $gm_s11 $gm_s12"  gm_state="$gm_state $gm_s10 $gm_s11 $gm_s12"
1160    
1161    cat <<EOF
1162    
1163    GENMAKE :
1164    
1165    A program for GENerating MAKEfiles for the MITgcm project.  For a
1166    quick list of options, use "genmake -h" or for more detail see:
1167    
1168      http://mitgcm.org/devel_HOWTO/
1169    
1170    EOF
1171    
 echo  
1172  echo "===  Processing options files and arguments  ==="  echo "===  Processing options files and arguments  ==="
1173  gm_local="genmake_local"  gm_local="genmake_local"
1174  for i in . $MODS ; do  printf "  getting local config information:  "
1175      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  
1176      echo "using $gm_local"      echo "using $gm_local"
1177      source $gm_local      . $gm_local
1178      # echo "DISABLE=$DISABLE"      # echo "DISABLE=$DISABLE"
1179      # echo "ENABLE=$ENABLE"      # echo "ENABLE=$ENABLE"
1180  else  else
1181      echo "none found"      echo "none found"
1182  fi  fi
1183    
1184  #  echo "$0::$1:$2:$3:$4:$5:$6:$7:"  #echo "$0::$1:$2:$3:$4:$5:$6:$7:"
 #OPTIONS=  
 #n=0  
 #for i ; do  
 #   echo "$i  $n"  
 #   setvar="OPTIONS[$n]='$i'"  
 #   #  echo "  $setvar"  
 #   eval "$setvar"  
 #   n=$(( $n + 1 ))  
 #done  
1185  #parse_options  #parse_options
1186  ac_prev=  ac_prev=
1187  for ac_option ; do  for ac_option in "$@" ; do
1188    
1189        G2ARGS="$G2ARGS \"$ac_option\""
1190    
1191      # If the previous option needs an argument, assign it.      # If the previous option needs an argument, assign it.
1192      if test -n "$ac_prev"; then      if test -n "$ac_prev"; then
# Line 474  for ac_option ; do Line 1194  for ac_option ; do
1194          ac_prev=          ac_prev=
1195          continue          continue
1196      fi      fi
1197        
1198      ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`      ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
1199        
1200      case $ac_option in      case $ac_option in
1201                    
1202          -help | --help | -h | --h)          -help | --help | -h | --h)
# Line 489  for ac_option ; do Line 1209  for ac_option ; do
1209          -optfile=* | --optfile=* | -of=* | --of=*)          -optfile=* | --optfile=* | -of=* | --of=*)
1210              OPTFILE=$ac_optarg ;;              OPTFILE=$ac_optarg ;;
1211                    
1212          -adoptfile | --adoptfile | -ad | --ad)          -adoptfile | --adoptfile | -adof | --adof)
1213              ac_prev=AD_OPTFILE ;;              ac_prev=AD_OPTFILE ;;
1214          -adoptfile=* | --adoptfile=* | -adof=* | --adof=*)          -adoptfile=* | --adoptfile=* | -adof=* | --adof=*)
1215              AD_OPTFILE=$ac_optarg ;;              AD_OPTFILE=$ac_optarg ;;
# Line 509  for ac_option ; do Line 1229  for ac_option ; do
1229          -make=* | --make=* | -m=* | --m=*)          -make=* | --make=* | -m=* | --m=*)
1230              MAKE=$ac_optarg ;;              MAKE=$ac_optarg ;;
1231                    
1232            -bash | --bash)
1233                ac_prev=BASH ;;
1234            -bash=* | --bash=*)
1235                BASH=$ac_optarg ;;
1236            
1237            -makedepend | --makedepend | -md | --md)
1238                ac_prev=MAKEDEPEND ;;
1239            -makedepend=* | --makedepend=* | -md=* | --md=*)
1240                MAKEDEPEND=$ac_optarg ;;
1241            
1242          -makefile | --makefile | -ma | --ma)          -makefile | --makefile | -ma | --ma)
1243              ac_prev=MAKEFILE ;;              ac_prev=MAKEFILE ;;
1244          -makefile=* | --makefile=* | -ma=* | --ma=*)          -makefile=* | --makefile=* | -ma=* | --ma=*)
1245              MAKEFILE=$ac_optarg ;;              MAKEFILE=$ac_optarg ;;
1246                    
1247          -platform | --platform | -pl | --pl)          -platform | --platform | -pl | --pl | -platform=* | --platform=* | -pl=* | --pl=*)
1248              ac_prev=PLATFORM ;;              echo "ERROR: The platform option has been removed.  Please specify"
1249          -platform=* | --platform=* | -pl=* | --pl=*)              echo "  the build options using the \"optfile\" mechanism."
1250              PLATFORM=$ac_optarg ;;              echo
1251                usage
1252                ;;
1253                    
1254          -rootdir | --rootdir | -rd | --rd)          -rootdir | --rootdir | -rd | --rd)
1255              ac_prev=ROOTDIR ;;              ac_prev=ROOTDIR ;;
# Line 544  for ac_option ; do Line 1276  for ac_option ; do
1276          -standarddirs=* | --standarddirs=*)          -standarddirs=* | --standarddirs=*)
1277              STANDARDDIRS=$ac_optarg ;;              STANDARDDIRS=$ac_optarg ;;
1278    
         -noopt | --noopt)  
             ac_prev=NOOPT ;;  
         -noopt=* | --noopt=*)  
             NOOPT=$ac_optarg ;;  
           
1279  #           -cpp | --cpp)  #           -cpp | --cpp)
1280  #               ac_prev=cpp ;;  #               ac_prev=cpp ;;
1281  #           -cpp=* | --cpp=*)  #           -cpp=* | --cpp=*)
1282  #               CPP=$ac_optarg ;;  #               CPP=$ac_optarg ;;
1283                        
1284            -cc | --cc)
1285                ac_prev=CC ;;
1286            -cc=* | --cc=*)
1287                CC=$ac_optarg ;;
1288            
1289          -fortran | --fortran | -fc | --fc)          -fortran | --fortran | -fc | --fc)
1290              ac_prev=FC ;;              ac_prev=FC ;;
1291          -fc=* | --fc=*)          -fc=* | --fc=*)
1292              FC=$ac_optarg ;;              FC=$ac_optarg ;;
1293                    
1294            -fs | --fs)
1295                ac_prev=FS ;;
1296            -fs=* | --fs=*)
1297                FS=$ac_optarg ;;
1298            
1299            -fs90 | --fs90)
1300                ac_prev=FS90 ;;
1301            -fs90=* | --fs90=*)
1302                FS90=$ac_optarg ;;
1303            
1304          -ieee | --ieee)          -ieee | --ieee)
1305              IEEE=true ;;              IEEE=true ;;
1306          -noieee | --noieee)          -noieee | --noieee)
1307              IEEE= ;;              IEEE= ;;
1308            
1309            -use_real4 | -use_r4 | -ur4 | --use_real4 | --use_r4 | --ur4 )
1310                USE_R4=true ;;
1311    
1312            -ts | --ts)
1313                TS=true ;;
1314            -papis | --papis)
1315                PAPIS=true ;;
1316            -pcls | --pcls)
1317                PCLS=true ;;
1318            -foolad | --foolad)
1319                FOOLAD=true ;;
1320            -papi | --papi)
1321                PAPI=true ;;
1322            -pcl | --pcl)
1323                PCL=true ;;
1324            -hpmt | --hpmt)
1325                HPMT=true ;;
1326    
1327            -gsl | --gsl)
1328                GSL=true ;;
1329    
1330            -devel | --devel)
1331                DEVEL=true ;;
1332    
1333          -mpi | --mpi)          -mpi | --mpi)
1334              MPI=true ;;              MPI=true ;;
1335          -nompi | --nompi)          -mpi=* | --mpi=*)
1336              MPI= ;;              MPIPATH=$ac_optarg
1337                MPI=true ;;
1338                    
1339          -jam | --jam)          -omp | --omp)
1340              JAM=1 ;;              OMP=true ;;
1341          -nojam | --nojam)          -omp=* | --omp=*)
1342              JAM=0 ;;              OMPFLAG=$ac_optarg
1343                OMP=true ;;
1344                    
1345          -ds | --ds)          -ds | --ds)
1346              DUMPSTATE=t ;;              DUMPSTATE=t ;;
# Line 586  for ac_option ; do Line 1354  for ac_option ; do
1354              ac_prev=TAMC_EXTRA ;;              ac_prev=TAMC_EXTRA ;;
1355          -tamc_extra=* | --tamc_extra=*)          -tamc_extra=* | --tamc_extra=*)
1356              TAMC_EXTRA=$ac_optarg ;;              TAMC_EXTRA=$ac_optarg ;;
1357            
1358            -ignoretime | -ignore_time | --ignoretime | --ignore_time)
1359                IGNORE_TIME="-DIGNORE_TIME" ;;
1360    
1361            -es | --es | -embed-source | --embed-source)
1362                EMBED_SRC=t ;;
1363    
1364          -*)          -*)
1365              echo "Error: unrecognized option: "$ac_option              echo "Error: unrecognized option: "$ac_option
# Line 598  for ac_option ; do Line 1372  for ac_option ; do
1372              ;;              ;;
1373                    
1374      esac      esac
1375        
1376  done  done
1377    
1378    
1379  if test -f ./.genmakerc ; then  if test -f ./.genmakerc ; then
1380      echo      echo
1381      echo "WARNING: genmake2 has detected a copy of the old-style \"./.genmakerc\""      echo "WARNING: genmake2 has detected a copy of the old-style \"./.genmakerc\""
1382      echo "  file.  This file format is no longer supported.  Please see:"      echo "  file.  This file format is no longer supported.  For directions on"
1383      echo      echo "  how to setup and use the new \"genmake2\" script, please see:"
1384      echo "    http://mitgcm.org/devel_HOWTO/"      echo "    http://mitgcm.org/devel_HOWTO/"
1385        echo "  and send an email to MITgcm-support@mitgcm.org if you need help."
1386        echo "WARNING: ignore \"./.genmakerc\" and continue."
1387      echo      echo
     echo "  for directions on how to setup and use the new \"genmake2\" input"  
     echo "  files and send an email to MITgcm-support@mitgcm.org if you want help."  
     echo  
1388  fi  fi
1389    
1390    #  Find the MITgcm ${ROOTDIR}
1391  if test "x${ROOTDIR}" = x ; then  if test "x${ROOTDIR}" = x ; then
1392      if test "${PWD##/*/}" = "bin" -a -d ../model -a -d ../eesup -a -d ../pkg ; then      tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1393        if test "x$tmp" = "xbin" -a -d ../model -a -d ../eesupp -a -d ../pkg ; then
1394          ROOTDIR=".."          ROOTDIR=".."
1395      else      else
1396          for d in . .. ../.. ../../.. ../../../.. ../../../../.. ; do          for d in . .. ../.. ../../.. ../../../.. ../../../../.. ; do
1397              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
1398                  ROOTDIR=$d                  ROOTDIR=$d
1399                  echo -n "Warning:  ROOTDIR was not specified but there appears to be"                  printf "Warning:  ROOTDIR was not specified but there appears to be"
1400                  echo " a copy of MITgcm at \"$ROOTDIR\" so we'll try it."                  echo " a copy of MITgcm at \"$ROOTDIR\" so we'll try it."
1401                  break                  break
1402              fi              fi
# Line 638  if test ! -d ${ROOTDIR} ; then Line 1414  if test ! -d ${ROOTDIR} ; then
1414      exit 1      exit 1
1415  fi  fi
1416    
1417    #  Find the MITgcm ${THISVER}
1418    version_file="${ROOTDIR}/doc/tag-index"
1419    if test -f $version_file ; then
1420        THISVER=`$AWK '/^checkpoint/{print $1; exit}' $version_file`
1421    #-  remove ./BUILD_INFO.h file if older than version_file
1422        if test -f ./BUILD_INFO.h -a ./BUILD_INFO.h -ot $version_file ; then
1423            echo "  remove ./BUILD_INFO.h (older than ${version_file})"
1424            rm -f ./BUILD_INFO.h
1425        fi
1426    fi
1427    
1428    if test "x$MAKEFILE" = x ; then
1429        MAKEFILE="Makefile"
1430    fi
1431    
1432  echo "  getting OPTFILE information:  "  echo "  getting OPTFILE information:  "
1433  if test "x${OPTFILE}" = x ; then  if test "x${OPTFILE}" = x ; then
1434      if test "x$MITGCM_OF" = x ; then      if test "x$MITGCM_OF" = x ; then
# Line 651  fi Line 1442  fi
1442  if test "x$OPTFILE" != xNONE ; then  if test "x$OPTFILE" != xNONE ; then
1443      if test -f "$OPTFILE" -a -r "$OPTFILE" ; then      if test -f "$OPTFILE" -a -r "$OPTFILE" ; then
1444          echo "    using OPTFILE=\"$OPTFILE\""          echo "    using OPTFILE=\"$OPTFILE\""
1445          source "$OPTFILE"          . "$OPTFILE"
1446          RETVAL=$?          RETVAL=$?
1447          if test "x$RETVAL" != x0 ; then          if test "x$RETVAL" != x0 ; then
1448              echo -n "Error: failed to source OPTFILE \"$OPTFILE\""              printf "Error: failed to source OPTFILE \"$OPTFILE\""
1449              echo "--please check that variable syntax is bash-compatible"              echo "--please check that variable syntax is bash-compatible"
1450              exit 1              exit 1
1451          fi          fi
# Line 678  fi Line 1469  fi
1469  if test "x${AD_OPTFILE}" != xNONE ; then  if test "x${AD_OPTFILE}" != xNONE ; then
1470      if test -f "$AD_OPTFILE" -a -r "$AD_OPTFILE" ; then      if test -f "$AD_OPTFILE" -a -r "$AD_OPTFILE" ; then
1471          echo "    using AD_OPTFILE=\"$AD_OPTFILE\""          echo "    using AD_OPTFILE=\"$AD_OPTFILE\""
1472          source "$AD_OPTFILE"          . "$AD_OPTFILE"
1473          RETVAL=$?          RETVAL=$?
1474          if test "x$RETVAL" != x0 ; then          if test "x$RETVAL" != x0 ; then
1475              echo -n "Error: failed to source AD_OPTFILE \"$AD_OPTFILE\""              printf "Error: failed to source AD_OPTFILE \"$AD_OPTFILE\""
1476              echo "--please check that variable syntax is bash-compatible"              echo "--please check that variable syntax is bash-compatible"
1477              exit 1              exit 1
1478          fi          fi
# Line 694  if test "x${AD_OPTFILE}" != xNONE ; then Line 1485  if test "x${AD_OPTFILE}" != xNONE ; then
1485      fi      fi
1486  fi  fi
1487    
1488  #  Check that FC, LINK, CPP, and S64 are defined.  If not, complain  #====================================================================
1489  #  and abort!  #  Set default values if not set by the optfile
1490    #
1491    #  Check that FC, CC, LINK, CPP, S64, LN, and MAKE are defined.  If not,
1492    #  either set defaults or complain and abort!
1493    if test ! "x$BASH" = x ; then
1494        # add a trailing space so that it works within the Makefile syntax (see below)
1495        BASH="$BASH "
1496    fi
1497  if test "x$FC" = x ; then  if test "x$FC" = x ; then
1498      cat <<EOF 1>&2      cat <<EOF 1>&2
1499    
# Line 706  Error: no Fortran compiler: please speci Line 1504  Error: no Fortran compiler: please speci
1504  EOF  EOF
1505      exit 1      exit 1
1506  fi  fi
1507    if test "x$CC" = x ; then
1508        CC=cc
1509    #     cat <<EOF 1>&2
1510    # Error: no C compiler: please specify using one of the following:
1511    #   1) within the options file ("CC=...") as specified by "-of=OPTFILE"
1512    #   2) the "-cc=XXX" command-line option
1513    #   3) the "./genmake_local" file
1514    # EOF
1515    #     exit 1
1516    fi
1517  if test "x$LINK" = x ; then  if test "x$LINK" = x ; then
1518      LINK=$FC      LINK=$FC
1519  fi  fi
1520    if test "x$MAKE" = x ; then
1521        MAKE="make"
1522    fi
1523  if test "x$CPP" = x ; then  if test "x$CPP" = x ; then
1524      CPP="cpp"      CPP=cpp
1525  fi  fi
1526    #EH3 === UGLY ===
1527    #  The following is an ugly little hack to check for $CPP in /lib/ and
1528    #  it should eventually be replaced with a more general function that
1529    #  searches a combo of the user's path and a list of "usual suspects"
1530    #  to find the correct location for binaries such as $CPP.
1531    for i in " " "/lib/" ; do
1532        echo "#define A a" | $i$CPP > test_cpp 2>&1 && CPP=$i$CPP
1533    done
1534    #EH3 === UGLY ===
1535  echo "#define A a" | $CPP > test_cpp 2>&1  echo "#define A a" | $CPP > test_cpp 2>&1
1536  RETVAL=$?  RETVAL=$?
1537  if test "x$RETVAL" != x0 ; then  if test "x$RETVAL" != x0 ; then
# Line 728  EOF Line 1548  EOF
1548  else  else
1549      rm -f test_cpp      rm -f test_cpp
1550  fi  fi
1551  if test "x$MAKEDEPEND" = x ; then  look_for_makedepend
1552      MAKEDEPEND=makedepend  if test "x$LN" = x ; then
1553        LN="ln -s"
1554  fi  fi
1555    echo "test" > genmake_test_ln
1556    $LN genmake_test_ln genmake_tlink
1557    RETVAL=$?
1558    if test "x$RETVAL" != x0 ; then
1559        cat <<EOF 1>&2
1560    
1561    Error: The command "ln -s" failed -- please specify a working soft-link
1562      command in the optfile.
1563    
1564    EOF
1565        exit 1
1566    fi
1567    test -L genmake_tlink > /dev/null 2>&1
1568    RETVAL=$?
1569    if test "x$RETVAL" = x0 ; then
1570        HAVE_TEST_L=t
1571    fi
1572    rm -f genmake_test_ln genmake_tlink
1573    
1574    #  Check for broken *.F/*.f handling and fix if possible
1575    check_for_broken_Ff
1576    
1577    if test ! "x$MPI" = x ; then
1578          echo "  Turning on MPI cpp macros"
1579          DEFINES="$DEFINES -DALLOW_USE_MPI -DALWAYS_USE_MPI"
1580    fi
1581    if test ! "x$OMP" = x ; then
1582          echo "  Add OMPFLAG and turn on OpenMP cpp macros"
1583          FFLAGS="$FFLAGS $OMPFLAG"
1584          F90FLAGS="$F90FLAGS $OMPFLAG"
1585          DEFINES="$DEFINES -DUSE_OMP_THREADING"
1586    fi
1587    
1588    if test ! "x$USE_R4" = x ; then
1589          echo "  Turning on LET_RS_BE_REAL4 cpp flag"
1590          DEFINES="$DEFINES -DLET_RS_BE_REAL4"
1591    fi
1592    
1593    if test ! "x$TS" = x ; then
1594          echo "  Turning on timing per timestep"
1595          if test ! "x$FOOLAD" = x ; then
1596                DEFINES="$DEFINES -DTIME_PER_TIMESTEP_SFP"
1597          else
1598                DEFINES="$DEFINES -DTIME_PER_TIMESTEP"
1599          fi
1600          PACKAGES="$PACKAGES showflops"
1601    fi
1602    if test ! "x$PAPIS" = x ; then
1603          echo "  Turning on PAPI flop summary per timestep"
1604          echo "  Please make sure PAPIINC, PAPILIB are defined"
1605          if test ! "x$FOOLAD" = x ; then
1606                DEFINES="$DEFINES -DUSE_PAPI_FLOPS_SFP"
1607          else
1608                DEFINES="$DEFINES -DUSE_PAPI_FLOPS"
1609          fi
1610          INCLUDES="$INCLUDES $PAPIINC"
1611          LIBS="$LIBS $PAPILIB"
1612          PACKAGES="$PACKAGES showflops"
1613    fi
1614    if test ! "x$PCLS" = x ; then
1615          echo "  Turning on PCL counter summary per timestep"
1616          echo "  Please make sure PCLINC, PCLLIB are defined"
1617          if test ! "x$FOOLAD" = x ; then
1618                DEFINES="$DEFINES -DUSE_PCL_FLOPS_SFP"
1619          else
1620                DEFINES="$DEFINES -DUSE_PCL_FLOPS"
1621          fi
1622          INCLUDES="$INCLUDES $PCLINC"
1623          LIBS="$LIBS $PCLLIB"
1624          PACKAGES="$PACKAGES showflops"
1625    fi
1626    if test ! "x$PAPI" = x ; then
1627          if test ! "x$PAPIS" = x ; then
1628              echo "  PAPI performance analysis and flop summary per timestep cannot co-exist!"
1629              echo "  Sticking with PAPI flop summary per timestep!"
1630          else
1631              echo "  Turning on performance analysis with PAPI"
1632              echo "  Please make sure PAPIINC, PAPILIB are defined"
1633              DEFINES="$DEFINES -DUSE_PAPI"
1634              INCLUDES="$INCLUDES $PAPIINC"
1635              LIBS="$LIBS $PAPILIB"
1636          fi
1637    fi
1638    if test ! "x$PCL" = x ; then
1639          if test ! "x$PCLS" = x ; then
1640              echo "  PCL performance analysis and flop summary per timestep cannot co-exist!"
1641              echo "  Sticking with PCL flop summary per timestep!"
1642          else
1643              echo "  Turning on performance analysis with PCL"
1644              echo "  Please make sure PCLINC, PCLLIB are defined"
1645              DEFINES="$DEFINES -DUSE_PCL"
1646              INCLUDES="$INCLUDES $PCLINC"
1647              LIBS="$LIBS $PCLLIB"
1648          fi
1649    fi
1650    if test ! "x$HPMT" = x ; then
1651          if test ! "x$PAPI" = x ; then
1652              echo "  PAPI and the HPM Toolkit cannot co-exist!"
1653              echo "  Sticking with PAPI!"
1654          else if test ! "x$PCL" = x ; then
1655              echo "  PCL and the HPM Toolkit cannot co-exist!"
1656              echo "  Sticking with PCL!"
1657          else
1658              echo "  Turning on performance analysis with the HPM Toolkit"
1659              echo "  Please make sure HPMTINC, HPMTLIB are defined"
1660              DEFINES="$DEFINES -DUSE_LIBHPM"
1661              INCLUDES="$INCLUDES $HPMTINC"
1662              LIBS="$LIBS $HPMTLIB"
1663          fi
1664          fi
1665    fi
1666    if test ! "x$GSL" = x ; then
1667          echo "  Turning on use of GSL to control floating point calculations"
1668          echo "  Please make sure GSLINC, GSLLIB are defined"
1669          DEFINES="$DEFINES -DUSE_GSL_IEEE"
1670          INCLUDES="$INCLUDES $GSLINC"
1671          LIBS="$LIBS $GSLLIB"
1672    fi
1673    #- if USE_EXTENDED_SRC is set, add EXTENDED_SRC_FLAG to FFLAGS :
1674    if test ! "x$USE_EXTENDED_SRC" = x ; then
1675          FFLAGS="$FFLAGS $EXTENDED_SRC_FLAG"
1676          F90FIXEDFORMAT="$F90FIXEDFORMAT $EXTENDED_SRC_FLAG"
1677    fi
1678    
1679  printf "\n===  Checking system libraries  ===\n"  printf "\n===  Checking system libraries  ===\n"
1680  echo -n "  Do we have the system() command using $FC...  "  printf "  Do we have the system() command using $FC...  "
1681  cat > genmake_tcomp.f <<EOF  cat > genmake_tcomp.$FS <<EOF
1682        program hello        program hello
1683        call system('echo hi')        call system('echo hi')
1684        end        end
1685  EOF  EOF
1686  $FC $FFLAGS $DEFINES -o genmake_tcomp genmake_tcomp.f > genmake_tcomp.log 2>&1  $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1687  RETVAL=$?  RETVAL=$?
1688  if test "x$RETVAL" = x0 ; then  if test "x$RETVAL" = x0 ; then
1689      HAVE_SYSTEM=t      HAVE_SYSTEM=t
1690      DEFINES="$DEFINES -DHAVE_SYSTEM"      DEFINES="$DEFINES -DHAVE_SYSTEM"
1691      echo "yes"      echo "yes"
1692  else  else
1693      HAVE_SYSTEM=      HAVE_SYSTEM=
1694        echo "no"
1695    fi
1696    rm -f genmake_tcomp*
1697    
1698    printf "  Do we have the fdate() command using $FC...  "
1699    cat > genmake_tcomp.$FS <<EOF
1700          program hello
1701          CHARACTER*(128) string
1702          string = ' '
1703          call fdate( string )
1704          print *, string
1705          end
1706    EOF
1707    $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1708    RETVAL=$?
1709    if test "x$RETVAL" = x0 ; then
1710        HAVE_FDATE=t
1711        DEFINES="$DEFINES -DHAVE_FDATE"
1712        echo "yes"
1713    else
1714        HAVE_FDATE=
1715        echo "no"
1716    fi
1717    rm -f genmake_tcomp*
1718    
1719    printf "  Do we have the etime() command using $FC...  "
1720    cat > genmake_tcomp.$FS <<EOF
1721          program hello
1722          REAL*4 ACTUAL, TARRAY(2)
1723          EXTERNAL ETIME
1724          REAL*4 ETIME
1725          actual = etime( tarray )
1726          print *, tarray
1727          end
1728    EOF
1729    $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1730    RETVAL=$?
1731    if test "x$RETVAL" = x0 ; then
1732        HAVE_ETIME=t
1733        DEFINES="$DEFINES -DHAVE_ETIME"
1734        echo "yes"
1735    else
1736        HAVE_ETIME=
1737        echo "no"
1738    fi
1739    rm -f genmake_tcomp*
1740    
1741    printf "  Can we call simple C routines (here, \"cloc()\") using $FC...  "
1742    check_HAVE_CLOC
1743    if test "x$HAVE_CLOC" != x ; then
1744        echo "yes"
1745    else
1746        echo "no"
1747        if test "x$EMBED_SRC" = xt ; then
1748            echo "    WARNING: you requested file embedding but it has"
1749            echo "      been disabled since C code cannot be called"
1750            EMBED_SRC=
1751        fi
1752    fi
1753    rm -f genmake_t*
1754    
1755    printf "  Can we unlimit the stack size using $FC...  "
1756    check_HAVE_SETRLSTK
1757    if test "x$HAVE_SETRLSTK" = xt ; then
1758        echo "yes"
1759    else
1760        echo "no"
1761    fi
1762    rm -f genmake_t*
1763    
1764    printf "  Can we register a signal handler using $FC...  "
1765    check_HAVE_SIGREG
1766    if test "x$HAVE_SIGREG" = xt ; then
1767        echo "yes"
1768    else
1769        echo "no"
1770    fi
1771    rm -f genmake_t*
1772    
1773    printf "  Can we use stat() through C calls...  "
1774    check_HAVE_STAT
1775    if test "x$HAVE_STAT" != x ; then
1776        echo "yes"
1777    else
1778      echo "no"      echo "no"
1779  fi  fi
1780  rm -f genmake_tcomp*  rm -f genmake_t*
1781    
1782  echo -n "  Do we have the fdate() command using $FC...  "  printf "  Can we create NetCDF-enabled binaries...  "
1783  cat > genmake_tcomp.f <<EOF  check_netcdf_libs
1784        program hello  if test "x$HAVE_NETCDF" != x ; then
       CHARACTER(128) string  
       string = ' '  
       call fdate( string )  
       print *, string  
       end  
 EOF  
 $FC $FFLAGS $DEFINES -o genmake_tcomp genmake_tcomp.f > genmake_tcomp.log 2>&1  
 RETVAL=$?  
 if test "x$RETVAL" = x0 ; then  
     HAVE_FDATE=t  
     DEFINES="$DEFINES -DHAVE_FDATE"  
1785      echo "yes"      echo "yes"
1786  else  else
     HAVE_FDATE=  
1787      echo "no"      echo "no"
1788  fi  fi
1789  rm -f genmake_tcomp*  DEFINES="$DEFINES $IGNORE_TIME"
1790    
1791  echo "  The name mangling convention for $FC is...  "  if test "x$EMBED_SRC" = xt ; then
1792  #FC_NAMEMANGLE="#define FC_NAMEMANGLE(X) X ## _"      build_embed_encode
 if test "x$FC_NAMEMANGLE" = x ; then  
     get_fortran_c_namemangling  
1793  fi  fi
1794  echo "    '$FC_NAMEMANGLE'"  if test "x$EMBED_SRC" = xt ; then
1795  echo "$FC_NAMEMANGLE" > FC_NAMEMANGLE.h.template      ENABLE="$ENABLE embed_files"
 cmp FC_NAMEMANGLE.h FC_NAMEMANGLE.h.template > /dev/null 2>&1  
 RETVAL=$?  
 if test "x$RETVAL" != x0 ; then  
     mv -f FC_NAMEMANGLE.h.template FC_NAMEMANGLE.h  
1796  fi  fi
1797    
1798    
1799  printf "\n===  Setting defaults  ===\n"  printf "\n===  Setting defaults  ===\n"
1800  echo -n "  Adding MODS directories:  "  printf "  Adding MODS directories: "
1801  for d in $MODS ; do  for d in $MODS ; do
1802      if test ! -d $d ; then      if test ! -d $d ; then
1803          echo          echo
1804          echo "Error: MODS directory \"$d\" not found!"          echo "Error: MODS directory \"$d\" not found!"
1805          exit 1          exit 1
1806      else      else
1807          echo -n " $d"          printf "$d "
1808          SOURCEDIRS="$SOURCEDIRS $d"          SOURCEDIRS="$SOURCEDIRS $d"
1809          INCLUDEDIRS="$INCLUDEDIRS $d"          INCLUDEDIRS="$INCLUDEDIRS $d"
1810      fi      fi
1811  done  done
1812  echo  echo
1813    
 if test "x$MAKEFILE" = x ; then  
     MAKEFILE="Makefile"  
 fi  
1814  if test "x${PLATFORM}" = x ; then  if test "x${PLATFORM}" = x ; then
1815      PLATFORM=$p_PLATFORM      PLATFORM=$p_PLATFORM
1816  fi  fi
1817    
1818  if test "x${EXEDIR}" = x ; then  if test "x${EXEDIR}" = x ; then
1819      if test "${PWD##/*/}" = "bin" -a -d ../exe -a $ROOTDIR = .. ; then      tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1820        if test "x$tmp" = "xbin" -a -d ../exe -a $ROOTDIR = .. ; then
1821          EXEDIR=../exe          EXEDIR=../exe
1822      else      else
1823          EXEDIR=.          EXEDIR=.
# Line 825  if test "x${TOOLSDIR}" = x ; then Line 1832  if test "x${TOOLSDIR}" = x ; then
1832      TOOLSDIR="$ROOTDIR/tools"      TOOLSDIR="$ROOTDIR/tools"
1833  fi  fi
1834  if test ! -d ${TOOLSDIR} ; then  if test ! -d ${TOOLSDIR} ; then
1835      echo "Error: the specified $TOOLSDIR (\"$TOOLSDIR\") does not exist!"      echo "Error: the specified TOOLSDIR (\"$TOOLSDIR\") does not exist!"
1836      exit 1      exit 1
1837  fi  fi
1838  if test "x$S64" = x ; then  if test "x$S64" = x ; then
1839      S64='$(TOOLSDIR)/set64bitConst.sh'      echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.sh > /dev/null 2>&1
1840        RETVAL=$?
1841        if test "x${RETVAL}" = x0 ; then
1842            S64='$(TOOLSDIR)/set64bitConst.sh'
1843        else
1844            echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.csh > /dev/null 2>&1
1845            RETVAL=$?
1846            if test "x${RETVAL}" = x0 ; then
1847                S64='$(TOOLSDIR)/set64bitConst.csh'
1848            else
1849                cat <<EOF
1850    
1851    ERROR: neither of the two default scripts:
1852    
1853        ${TOOLSDIR}/set64bitConst.sh
1854        ${TOOLSDIR}/set64bitConst.csh
1855    
1856      are working so please check paths or specify (with \$S64) a
1857      working version of this script.
1858    
1859    EOF
1860                exit 1
1861            fi
1862        fi
1863  fi  fi
1864    THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`
1865    
1866  EXECUTABLE=${EXECUTABLE:-mitgcmuv}  EXECUTABLE=${EXECUTABLE:-mitgcmuv}
1867    
1868    #  Set Standard Code Directories:
1869    if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
1870        STANDARDDIRS="eesupp model"
1871    fi
1872    #  if model in Standard-Code-Dir, add eesupp (needed to compile model)
1873    echo " $STANDARDDIRS " | grep ' model ' > /dev/null 2>&1
1874    ckM=$?
1875    echo " $STANDARDDIRS " | grep ' eesupp ' > /dev/null 2>&1
1876    ckE=$?
1877    if test $ckM = 0 -a $ckE = 1 ; then
1878        STANDARDDIRS="$STANDARDDIRS eesupp"
1879    fi
1880    
1881  #  We have a special set of source files in eesupp/src which are  #  We have a special set of source files in eesupp/src which are
1882  #  generated from some template source files. We'll make them first so  #  generated from some template source files. We'll make them first so
1883  #  they appear as regular source code  #  they appear as regular source code
1884  if test -r $ROOTDIR"/eesupp/src/Makefile" ; then  if test -r $ROOTDIR"/eesupp/src/Makefile" ; then
1885      echo "  Making source files in eesupp from templates"      echo "  Making source files in eesupp from templates"
1886      $MAKE -C $ROOTDIR"/eesupp/src/" > make_eesupp.errors 2>&1      ( cd $ROOTDIR"/eesupp/src/" && $MAKE ) > make_eesupp.errors 2>&1
1887      RETVAL=$?      RETVAL=$?
1888      if test "x${RETVAL}" = x0 ; then      if test "x${RETVAL}" = x0 ; then
1889          rm -f make_eesupp.errors          rm -f make_eesupp.errors
1890      else      else
1891          echo "Error: problem encountered while building source files in eesupp:"          echo "Error: problem encountered while building source files in eesupp:"
1892          cat make_eesupp.errors          cat make_eesupp.errors 1>&2
1893          exit 1          exit 1
1894      fi      fi
1895  fi  fi
1896    
1897    #same for pkg/exch2 and pkg/regrid
1898    for pdir in exch2 regrid ; do
1899        if test -r $ROOTDIR"/pkg/${pdir}/Makefile" ; then
1900            echo "  Making source files in pkg/${pdir} from templates"
1901            ( cd $ROOTDIR"/pkg/"${pdir} && $MAKE ) > make_${pdir}.errors 2>&1
1902            RETVAL=$?
1903            if test "x${RETVAL}" = x0 ; then
1904                rm -f make_${pdir}.errors
1905            else
1906                echo "Error: problem encountered while building source files in pkg/${pdir}:"
1907                cat make_${pdir}.errors 1>&2
1908                exit 1
1909            fi
1910        fi
1911    done
1912    
1913  printf "\n===  Determining package settings  ===\n"  printf "\n===  Determining package settings  ===\n"
1914  if  test "x${PDEPEND}" = x ; then  if  test "x${PDEPEND}" = x ; then
1915      tmp=$ROOTDIR"/pkg/pkg_depend"      tmp=$ROOTDIR"/pkg/pkg_depend"
# Line 868  fi Line 1928  fi
1928  echo "  getting package dependency info from  $PDEPEND"  echo "  getting package dependency info from  $PDEPEND"
1929  #  Strip the comments and then convert the dependency file into  #  Strip the comments and then convert the dependency file into
1930  #  two arrays: PNAME, DNAME  #  two arrays: PNAME, DNAME
1931  cat $PDEPEND | sed -e 's/#.*$//g' \  get_pdepend_list $PDEPEND
     | $AWK 'BEGIN{nn=-1;} (NF>0){ for(i=2;i<=NF;i++){nn++; print "PNAME_"nn"="$1"\nDNAME_"nn"="$i}} END{print "nname="nn}' \  
     > ./.pd_tmp  
 RETVAL=$?  
 if test ! "x${RETVAL}" = x0 ; then  
     echo "Error: unable to parse package dependencies -- please check PDEPEND=\"$PDEPEND\""  
     exit 1  
 fi  
 source ./.pd_tmp  
 rm -f ./.pd_tmp  
1932    
1933  #  Search for default packages.  Note that a "$ROOTDIR/pkg/pkg_groups"  #  Search for default packages.  Note that a "$ROOTDIR/pkg/pkg_groups"
1934  #  file should eventually be added so that, for convenience, one can  #  file has been added so that, for convenience, one can specify
1935  #  specify groups of packages using names like "ocean" and "atmosphere".  #  groups of packages using names like "ocean" and "atmosphere".
1936  echo  -n "  checking default package list:  "  echo "  checking default package list:  "
1937  if test "x${PDEFAULT}" = x ; then  if test "x${PDEFAULT}" = x ; then
1938      for i in "." $MODS ; do      for i in "." $MODS ; do
1939          if test -r $i"/packages.conf" ; then          if test -r $i"/packages.conf" ; then
# Line 895  if test "x${PDEFAULT}" = x ; then Line 1946  if test "x${PDEFAULT}" = x ; then
1946      PDEFAULT="$ROOTDIR/pkg/pkg_default"      PDEFAULT="$ROOTDIR/pkg/pkg_default"
1947  fi  fi
1948  if test "x${PDEFAULT}" = xNONE ; then  if test "x${PDEFAULT}" = xNONE ; then
1949      echo "default packages file disabled"      echo "    default packages file disabled"
1950  else  else
1951      if test ! -r $PDEFAULT ; then      if test ! -r $PDEFAULT ; then
         echo ""  
1952          echo "Warning:  can't read default packages from PDEFAULT=\"$PDEFAULT\""          echo "Warning:  can't read default packages from PDEFAULT=\"$PDEFAULT\""
1953      else      else
1954          echo "  using PDEFAULT=\"$PDEFAULT\""          echo "    using PDEFAULT=\"$PDEFAULT\""
1955          #  Strip the comments and add all the names          #  Strip the comments and add all the names
1956          def=`cat $PDEFAULT | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`          def=`cat $PDEFAULT | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
1957          RETVAL=$?          RETVAL=$?
1958          if test "x${RETVAL}" != x0 ; then          if test "x${RETVAL}" != x0 ; then
1959              echo -n "Error: can't parse default package list "              printf "Error: can't parse default package list "
1960              echo "-- please check PDEFAULT=\"$PDEFAULT\""              echo "-- please check PDEFAULT=\"$PDEFAULT\""
1961              exit 1              exit 1
1962          fi          fi
1963          for i in $def ; do          for i in $def ; do
1964              PACKAGES="$PACKAGES $i"              PACKAGES="$PACKAGES $i"
1965          done          done
1966          echo "    before group expansion packages are: $PACKAGES"          echo "    before group expansion packages are:$PACKAGES"
1967          expand_pkg_groups          RET=1
1968          echo "    after group expansion packages are:  $PACKAGES"          while test $RET = 1 ; do expand_pkg_groups; RET=$?; done
1969            echo "    after group expansion packages are: $PACKAGES"
1970      fi      fi
1971  fi  fi
1972    
1973  echo "  applying DISABLE settings"  echo "  applying DISABLE settings"
1974    echo "" > ./.tmp_pack
1975    for i in $PACKAGES ; do
1976        echo $i >> ./.tmp_pack
1977    done
1978    for i in `grep  "-" ./.tmp_pack` ; do
1979        j=`echo $i | sed 's/[-]//'`
1980        DISABLE="$DISABLE $j"
1981    done
1982  pack=  pack=
1983  for p in $PACKAGES ; do  for p in $PACKAGES ; do
1984      addit="t"      addit="t"
# Line 936  PACKAGES="$pack" Line 1995  PACKAGES="$pack"
1995  echo "  applying ENABLE settings"  echo "  applying ENABLE settings"
1996  echo "" > ./.tmp_pack  echo "" > ./.tmp_pack
1997  PACKAGES="$PACKAGES $ENABLE"  PACKAGES="$PACKAGES $ENABLE"
1998    # Test if each explicitly referenced package exists
1999  for i in $PACKAGES ; do  for i in $PACKAGES ; do
2000      if test ! -d "$ROOTDIR/pkg/$i" ; then      j=`echo $i | sed 's/[-+]//'`
2001        if test ! -d "$ROOTDIR/pkg/$j" ; then
2002          echo "Error: can't find package $i at \"$ROOTDIR/pkg/$i\""          echo "Error: can't find package $i at \"$ROOTDIR/pkg/$i\""
2003          exit 1          exit 1
2004      fi      fi
2005      echo $i >> ./.tmp_pack      echo $i >> ./.tmp_pack
2006  done  done
 pack=`cat ./.tmp_pack | sort | uniq`  
 rm -f ./.tmp_pack  
2007  PACKAGES=  PACKAGES=
2008  for i in $pack ; do  for i in `grep -v "-" ./.tmp_pack | sort | uniq` ; do
2009      PACKAGES="$PACKAGES $i"      PACKAGES="$PACKAGES $i"
2010  done  done
2011  echo "    packages are:  $PACKAGES"  rm -f ./.tmp_pack
2012    echo "    packages are: $PACKAGES"
2013    
2014    #  Check for package MNC: if NetCDF is available, then build the MNC
2015    #  template files ; otherwise, delete mnc from the list of packages.
2016    echo " $PACKAGES " | grep ' mnc ' > /dev/null 2>&1
2017    mnc_in=$?
2018    if test "x$HAVE_NETCDF" != xt ; then
2019        if test "x$mnc_in" = x0 ; then
2020            cat <<EOF
2021    
2022    *********************************************************************
2023    WARNING: the "mnc" package was enabled but tests failed to compile
2024      NetCDF applications.  Please check that:
2025    
2026      1) NetCDF is correctly installed for this compiler and
2027      2) the LIBS variable (within the "optfile") specifies the correct
2028           NetCDF library to link against.
2029    
2030      Due to this failure, the "mnc" package is now DISABLED.
2031    *********************************************************************
2032    
2033    EOF
2034            PACKAGES=`echo $PACKAGES | sed -e 's/mnc//g'`
2035            DISABLE="$DISABLE mnc"
2036        else
2037        #  this prevent to add mnc (due to pdepend rules) if not available
2038            DISABLE="$DISABLE mnc"
2039        fi
2040    else
2041        # we have NetCDF, we try to build MNC template files
2042        ( cd $ROOTDIR"/pkg/mnc" && $MAKE testclean && $MAKE templates ) > make_mnc.errors 2>&1
2043        RETVAL=$?
2044        if test "x${RETVAL}" = x0 ; then
2045            rm -f make_mnc.errors
2046        else
2047            echo "Error: problem encountered while building source files in pkg/mnc:"
2048            cat make_mnc.errors 1>&2
2049            if test "x$mnc_in" = x0 ; then
2050                exit 1
2051            else
2052                DISABLE="$DISABLE mnc"
2053            fi
2054        fi
2055    fi
2056    
2057    #  Check for package PROFILES: if NetCDF is not available,
2058    #  then delete profiles from the list of available packages.
2059    if test "x$HAVE_NETCDF" != xt ; then
2060        echo " $PACKAGES " | grep ' profiles ' > /dev/null 2>&1
2061        RETVAL=$?
2062        if test "x$RETVAL" = x0 ; then
2063            cat <<EOF
2064    
2065    *********************************************************************
2066    WARNING: the "profiles" package was enabled but tests failed to
2067      compile NetCDF applications.  Please check that:
2068    
2069      1) NetCDF is correctly installed for this compiler and
2070      2) the LIBS variable (within the "optfile") specifies the correct
2071           NetCDF library to link against.
2072    
2073      Due to this failure, the "profiles" package is now DISABLED.
2074    *********************************************************************
2075    
2076    EOF
2077            PACKAGES=`echo $PACKAGES | sed -e 's/profiles//g'`
2078            DISABLE="$DISABLE profiles"
2079        else
2080        #  this prevent to add profiles (due to pdepend rules) if not available
2081            DISABLE="$DISABLE profiles"
2082        fi
2083    fi
2084    
2085  echo "  applying package dependency rules"  echo "  applying package dependency rules"
2086  ck=  ck=
# Line 957  while test "x$ck" != xtt ; do Line 2088  while test "x$ck" != xtt ; do
2088      i=0      i=0
2089      # rtot=${#PNAME[@]}      # rtot=${#PNAME[@]}
2090      rtot=$nname      rtot=$nname
2091      while test $i -lt $rtot ; do      while test $i -le $rtot ; do
2092    
2093          #  Is $pname in the current $PACKAGES list?          #  Is $pname in the current $PACKAGES list?
2094          #  pname=${PNAME[$i]}          #  pname=${PNAME[$i]}
# Line 969  while test "x$ck" != xtt ; do Line 2100  while test "x$ck" != xtt ; do
2100                  pin="t"                  pin="t"
2101              fi              fi
2102          done          done
2103            #  or in the current $STANDARDDIRS list?
2104            for p in $STANDARDDIRS ; do
2105                if test "x$p" = "x$pname" ; then pin="t" ; fi
2106            done
2107    
2108          #  Is the DNAME entry a (+) or (-) rule ?          #  Is the DNAME entry a (+) or (-) rule ?
2109          tmp="dname=\"\$DNAME_$i\""          tmp="dname=\"\$DNAME_$i\""
# Line 991  while test "x$ck" != xtt ; do Line 2126  while test "x$ck" != xtt ; do
2126    
2127          #  Do we need to add $dname according to the dependency rules?          #  Do we need to add $dname according to the dependency rules?
2128          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
2129                #echo "   " $pname ": need to add :" $dname
2130              in_dis="f"              in_dis="f"
2131              for dis in $DISABLE ; do              for dis in $DISABLE ; do
2132                  if test "x$dis" = "x$dname" ; then                  if test "x$dis" = "x$dname" ; then
# Line 1011  while test "x$ck" != xtt ; do Line 2147  while test "x$ck" != xtt ; do
2147          #  Do we need to get rid of $dname according to the dependency rules?          #  Do we need to get rid of $dname according to the dependency rules?
2148          if test "x$pin" = xt -a "x$plus" = "x-" -a "x$din" = xt; then          if test "x$pin" = xt -a "x$plus" = "x-" -a "x$din" = xt; then
2149              echo "Error: can't satisfy package dependencies:"              echo "Error: can't satisfy package dependencies:"
2150              echo "  \"$pname\" was requested but is disallowed by"              echo "  \"$pname\" was requested but is disallowed by"
2151              echo "  the dependency rules for \"$dname\""              echo "  the dependency rules for \"$dname\""
2152              exit 1              exit 1
2153          fi          fi
2154          i=$(( $i + 1 ))          i=`echo "$i + 1" | bc -l`
2155            #i=$(( $i + 1 ))
2156      done      done
2157      ck=$ck"t"      ck=$ck"t"
2158  done  done
2159  echo "    packages are:  $PACKAGES"  echo "    packages are: $PACKAGES"
2160  for i in $PACKAGES ; do  for i in $PACKAGES ; do
2161      adr="$ROOTDIR/pkg/$i"      adr="$ROOTDIR/pkg/$i"
2162      if test -d $adr ; then      if test -d $adr ; then
# Line 1034  for i in $PACKAGES ; do Line 2171  for i in $PACKAGES ; do
2171      fi      fi
2172  done  done
2173    
   
2174  # Create a list of #define and #undef to enable/disable packages  # Create a list of #define and #undef to enable/disable packages
2175  PACKAGES_DOT_H=PACKAGES_CONFIG.h  PACKAGES_DOT_H=PACKAGES_CONFIG.h
2176  cat <<EOF >$PACKAGES_DOT_H".tmp"  #  The following UGLY HACK sets multiple "#undef"s and it needs to go
2177  C=== GENMAKE v2 ===  #  away.  On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h
 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  
 #  The following UGLY HACK sets multiple "#undef"s and it needs to go  
 #  away.  On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h  
2178  #  file would eventually be split up so that all package-related #define  #  file would eventually be split up so that all package-related #define
2179  #  statements could be separated and handled only by genmake.  #  statements could be separated and handled only by genmake.
2180  names=`ls -1 "$ROOTDIR/pkg"`  names=`ls -1 "$ROOTDIR/pkg"`
2181  all_pack=  all_pack=
2182    DISABLED_PACKAGES=
2183  for n in $names ; do  for n in $names ; do
2184      if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then      if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
2185          has_pack="f"          has_pack="f"
# Line 1065  for n in $names ; do Line 2190  for n in $names ; do
2190              fi              fi
2191          done          done
2192          if test "x$has_pack" = xf ; then          if test "x$has_pack" = xf ; then
2193              undef=`echo "ALLOW_$n" | $AWK '{print toupper($0)}'`              undef=`echo "ALLOW_$n" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2194              echo "#undef $undef" >> $PACKAGES_DOT_H".tmp"              DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
2195          fi          fi
2196      fi      fi
2197  done  done
2198  cat <<EOF >>$PACKAGES_DOT_H".tmp"  ENABLED_PACKAGES=
   
 C  Packages enabled by genmake:  
 EOF  
2199  for i in $PACKAGES ; do  for i in $PACKAGES ; do
2200      def=`echo "ALLOW_$i" | $AWK '{print toupper($0)}'`      def=`echo "ALLOW_$i" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2201      echo "#define $def" >> $PACKAGES_DOT_H".tmp"      ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
2202  #eh3 DEFINES="$DEFINES -D$def"  #eh3 DEFINES="$DEFINES -D$def"
2203    
2204  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!
2205      case $i in      case $i in
2206          aim_v23)          aim_v23)
2207              echo "#define   ALLOW_AIM" >> $PACKAGES_DOT_H".tmp"              ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
2208              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 :-)"  
2209              ;;              ;;
2210      esac      esac
2211  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!  #EH3  WARNING :  This is an UGLY HACK that needs to be removed!!!
2212    
2213  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  
2214    
2215  echo "  Adding STANDARDDIRS"  echo "  Adding STANDARDDIRS='$STANDARDDIRS'"
2216  BUILDDIR=${BUILDDIR:-.}  BUILDDIR=${BUILDDIR:-.}
2217  if test "x$STANDARDDIRS" = x ; then  if test "x$STANDARDDIRS" != x ; then
2218      STANDARDDIRS="eesupp model"      for d in $STANDARDDIRS ; do
2219            adr="$ROOTDIR/$d/src"
2220            if test ! -d $adr ; then
2221                echo "Error:  directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2222                echo "  is correct and that you correctly specified the STANDARDDIRS option"
2223                exit 1
2224            else
2225                SOURCEDIRS="$SOURCEDIRS $adr"
2226            fi
2227            adr="$ROOTDIR/$d/inc"
2228            if test ! -d $adr ; then
2229                echo "Error:  directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2230                echo "  is correct and that you correctly specified the STANDARDDIRS option"
2231                exit 1
2232            else
2233                INCLUDEDIRS="$INCLUDEDIRS $adr"
2234            fi
2235        done
2236  fi  fi
 for d in $STANDARDDIRS ; do  
     adr="$ROOTDIR/$d/src"  
     if test ! -d $adr ; then  
         echo "Error:  directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""  
         echo "  is correct and that you correctly specified the STANDARDDIRS option"  
         exit 1  
     else  
         SOURCEDIRS="$SOURCEDIRS $adr"  
     fi  
     adr="$ROOTDIR/$d/inc"  
     if test ! -d $adr ; then  
         echo "Error:  directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""  
         echo "  is correct and that you correctly specified the STANDARDDIRS option"  
         exit 1  
     else  
         INCLUDEDIRS="$INCLUDEDIRS $adr"  
     fi  
 done  
2237    
2238  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"
2239  echo "    of \"#define ALLOW_PKGNAME\"-type statements:"  echo "    of \"#define \"-type statements that are no longer allowed:"
2240  CPP_OPTIONS=  CPP_OPTIONS=
2241    CPP_EEOPTIONS=
2242  spaths=". $INCLUDEDIRS"  spaths=". $INCLUDEDIRS"
2243    names=`ls -1 "$ROOTDIR/pkg"`
2244  for i in $spaths ; do  for i in $spaths ; do
2245      try="$i/CPP_OPTIONS.h"      try="$i/CPP_OPTIONS.h"
2246      #  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  
2247          echo "    found CPP_OPTIONS=\"$try\""          echo "    found CPP_OPTIONS=\"$try\""
2248          CPP_OPTIONS="$try"          CPP_OPTIONS="$try"
2249          break          # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
2250            for n in $names ; do
2251                test_for_package_in_cpp_options $CPP_OPTIONS $n
2252            done
2253        fi
2254        try="$i/CPP_EEOPTIONS.h"
2255        if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
2256            echo "    found CPP_EEOPTIONS=\"$try\""
2257            # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
2258    #**** not yet enabled ****
2259    #        test_for_mpi_in_cpp_eeoptions $try
2260    #**** not yet enabled ****
2261            CPP_EEOPTIONS="$try"
2262      fi      fi
2263  done  done
2264  if test "x$CPP_OPTIONS" = x ; then  if test "x$CPP_OPTIONS" = x ; then
2265      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"
2266      exit 1      exit 1
2267  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  
   
2268    
2269  #  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
2270  #  compiler.  #  compiler.
2271  if test -f ./ad_files ; then  if test -f ./adSrcFiles.tmp ; then
2272      rm -f ./ad_files      rm -f ./adSrcFiles.tmp
2273  fi  fi
2274  echo "  Creating the list of files for the adjoint compiler."  echo "  Creating the list of files for the adjoint compiler."
2275  for i in $SOURCEDIRS ; do  for i in $SOURCEDIRS ; do
2276      list_files=`( cd $i && ls -1 *.list 2>/dev/null )`      list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
2277      for j in $list_files ; do      for j in $list_files ; do
2278          cat $i/$j >> ad_files          cat $i/$j >> adSrcFiles.tmp
2279      done      done
2280  done  done
2281    if test ! "x"$FS = "x.f" ; then
2282  cat <<EOF > adjoint_sed      cat adSrcFiles.tmp | sed -e "s/\.f/.$FS/g" > adSrcFiles.tmp_f
2283  s/call adopen(/call adopen ( mythid,\\      mv -f adSrcFiles.tmp_f adSrcFiles.tmp
2284       \&           /g  fi
 s/call adclose(/call adclose( mythid,\\  
      \&           /g  
 s/call adread(/call adread ( mythid,\\  
      \&           /g  
 s/call adwrite(/call adwrite( mythid,\\  
      \&           /g  
   
 EOF  
2285    
2286  echo  echo
2287  echo "===  Creating the Makefile  ==="  echo "===  Creating the Makefile  ==="
2288  echo "  setting INCLUDES"  echo "  setting INCLUDES"
2289  for i in $INCLUDEDIRS ; do  for i in $INCLUDEDIRS ; do
2290      if ! test -d $i ; then      if test ! -d $i ; then
 #       INCLUDES="$INCLUDES -I$i"  
 #   else  
2291          echo "Warning: can't find INCLUDEDIRS=\"$i\""          echo "Warning: can't find INCLUDEDIRS=\"$i\""
2292      fi      fi
2293  done  done
2294    
2295    if test ! "x$DIVA" = x ; then
2296        echo "  Creating the pseudo-MPI include directory"
2297        INCLUDES="-I./mpi_headers $INCLUDES"
2298        rm -rf ./mpi_headers
2299        mkdir -p ./mpi_headers
2300    
2301        if test "x$MPIINCLUDEDIR" = x ; then
2302            if test "x$MPIHOME" = x ; then
2303                MPIHOME='/usr'
2304            fi
2305            MPIINCLUDEDIR='$MPIHOME/include'
2306        fi
2307    
2308        if test -r $MPIINCLUDEDIR/mpif.h ; then
2309            for i in $MPI_HEADER_FILES; do
2310                cp -p $MPIINCLUDEDIR/$i ./mpi_headers
2311            done
2312    
2313            perl -i -pe 's/MPI_DISPLACEMENT_CURRENT=-1_8/MPI_DISPLACEMENT_CURRENT=-1/g' mpi_headers/mpif.h
2314        else
2315            echo " We cannot create a copy of mpif.h!"
2316    #       exit -1
2317        fi
2318    fi
2319    
2320  echo "  Determining the list of source and include files"  echo "  Determining the list of source and include files"
2321  rm -rf .links.tmp  rm -rf .links.tmp
2322  mkdir .links.tmp  mkdir .links.tmp
2323    touch .links.tmp/foo
2324    if test ! -r ".links.tmp/foo" ; then
2325        echo
2326        echo "ERROR : something is wrong with your directory permissions or"
2327        echo "   your user file-creation mask (\"umask\") since creating a"
2328        echo "   sub-dir, touch-ing a file within it, and then reading it is"
2329        echo "   not working.  Please try setting your umask to something"
2330        echo "   sane such as:"
2331        echo
2332        echo "      umask 0002"
2333        echo
2334        echo "   and please verify that you have the proper permissions for"
2335        echo "   creating sub-directories and then reading files created"
2336        echo "   within them."
2337        echo
2338        exit 1
2339    fi
2340    rm -f .links.tmp/foo
2341    
2342    if test "x$OPENAD" != x ; then
2343        OAD_DONT_COMPILE="/dev/null"
2344        OAD_DONT_TRANSFORM="/dev/null"
2345        OAD_KEEP_ORIGINAL="/dev/null"
2346        OAD_CB2M_FILES="/dev/null"
2347        echo "  looking for dontCompile file:  "
2348        for i in "." $MODS ; do
2349            if test -r $i"/dontCompile" ; then
2350                OAD_DONT_COMPILE=$i"/dontCompile"
2351                echo "     found $OAD_DONT_COMPILE"
2352                break
2353            fi
2354        done
2355        echo "  looking for dontTransform file:  "
2356        for i in "." $MODS ; do
2357            if test -r $i"/dontTransform" ; then
2358                OAD_DONT_TRANSFORM=$i"/dontTransform"
2359                echo "     found $OAD_DONT_TRANSFORM"
2360                break
2361            fi
2362        done
2363        echo "  looking for keepOriginal file:  "
2364        for i in "." $MODS ; do
2365            if test -r $i"/keepOriginal" ; then
2366                OAD_KEEP_ORIGINAL=$i"/keepOriginal"
2367                echo "     found $OAD_KEEP_ORIGINAL"
2368                break
2369            fi
2370        done
2371        echo "  looking for cb2mFiles:  "
2372        for i in "." $MODS ; do
2373            if test -r $i"/cb2mFiles" ; then
2374                OAD_CB2M_FILES=$i"/cb2mFiles"
2375                echo "     found $OAD_CB2M_FILES"
2376                break
2377            fi
2378        done
2379        echo "   OpenAD exceptions:  "
2380    fi
2381    
2382  echo "# This section creates symbolic links" > srclinks.tmp  echo "# This section creates symbolic links" > srclinks.tmp
2383  echo "" >> srclinks.tmp  echo "" >> srclinks.tmp
2384  echo -n 'SRCFILES = '    > srclist.inc  printf 'F77_SRC_FILES = ' > F77srclist.tmp
2385  echo -n 'CSRCFILES = '   > csrclist.inc  printf 'NON_AD_F77_SRC_FILES = ' > nonADF77srclist.tmp
2386  echo -n 'F90SRCFILES = ' > f90srclist.inc  printf 'C_SRC_FILES = '   > csrclist.tmp
2387  echo -n 'HEADERFILES = ' > hlist.inc  printf 'F90_SRC_FILES = ' > F90srclist.tmp
2388  echo -n 'AD_FLOW_FILES = ' > ad_flow_files.inc  printf 'H_SRC_FILES = '   > hsrclist.tmp
2389    printf 'AD_FLOW_FILES = ' > ad_flow_files.tmp
2390  alldirs="$SOURCEDIRS $INCLUDEDIRS ."  alldirs="$SOURCEDIRS $INCLUDEDIRS ."
2391  for d in $alldirs ; do  for d in $alldirs ; do
2392      deplist=      deplist=
2393      sfiles=`( cd $d; echo *.[h,c,F] *.flow )`      sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
2394      sfiles=`( echo $sfiles; cd $d; echo *.F90 )`      sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
2395        if test "x$OPENAD" != x ; then
2396            sfiles=`( echo $sfiles | grep -v _cb2m\. )`
2397        fi
2398      for sf in $sfiles ; do      for sf in $sfiles ; do
2399          if test ! -r ".links.tmp/$sf" ; then          if test ! -r ".links.tmp/$sf" ; then
2400              if test -f "$d/$sf" ; then              if test -f "$d/$sf" ; then
2401                  extn=`echo $sf | $AWK -F '.' '{print $NF}'`                  ignore_f=f
2402                  touch .links.tmp/$sf                  case $d/$sf in
2403                  deplist="$deplist $sf"                    ./$PACKAGES_DOT_H)
2404                  case $extn in                          ignore_f=t
2405                      F)                          ;;
2406                          echo    " \\"  >> srclist.inc                    ./AD_CONFIG.h)
2407                          echo -n " $sf" >> srclist.inc                          ignore_f=t
2408                            ;;
2409                      ./FC_NAMEMANGLE.h)
2410                            ignore_f=t
2411                            ;;
2412                      ./BUILD_INFO.h)
2413                            ignore_f=t
2414                            ;;
2415                      ./EMBEDDED_FILES.h)
2416                            ignore_f=t
2417                            ;;
2418                      *)
2419                            #  For the local directory *ONLY*,
2420                            #  ignore all soft-links
2421                            if test "x$HAVE_TEST_L" = xt -a "x$d" = x. -a -L $sf ; then
2422                                ignore_f=t
2423                            else
2424                                touch .links.tmp/$sf
2425                                deplist="$deplist $sf"
2426                            fi
2427                            ;;
2428                    esac
2429                    if test "x$ignore_f" = xf ; then
2430                        extn=`echo $sf | $AWK -F. '{print $NF}'`
2431                        case $extn in
2432                          F)
2433                            echo    " \\"  >> F77srclist.tmp
2434                            printf " $sf" >> F77srclist.tmp
2435                            if test "x$OPENAD" != x ; then
2436                                basename=${sf%%.F}
2437                                isAD=`egrep ^$basename.f'[  ]*' adSrcFiles.tmp`
2438                                if test -z "$isAD" ; then
2439                                    toBeIgnored=`egrep ^$basename'[      ]*' ${OAD_DONT_COMPILE}`
2440                                    if test -z "$toBeIgnored" ; then
2441                                        echo    " \\"  >> nonADF77srclist.tmp
2442                                        printf " $sf" >> nonADF77srclist.tmp
2443                                    else
2444                                        echo "    not to be compiled   :  $sf"
2445                                    fi
2446                                else # file is initially listed as an AD file we want to exclude it
2447                                     # or we want to retain the untransformed version
2448                                    notToBeTransformed=`egrep ^$basename'[      ]*' ${OAD_DONT_TRANSFORM}`
2449                                    untransformedVersionToBeKept=`egrep ^$basename'[      ]*' ${OAD_KEEP_ORIGINAL}`
2450                                    if test -n "$notToBeTransformed"; then
2451                                        echo "    not to be transformed:  $sf"
2452                                    fi
2453                                    if test -n "$untransformedVersionToBeKept" ; then
2454                                        echo "    original to be kept  :  $sf"
2455                                    fi
2456                                    if test -n "$notToBeTransformed" -o -n "$untransformedVersionToBeKept" ; then
2457                                        echo    " \\"  >> nonADF77srclist.tmp
2458                                        printf " $sf" >> nonADF77srclist.tmp
2459                                    fi
2460                                fi
2461                            fi
2462                          ;;                          ;;
2463                      F90)                      F90)
2464                          echo    " \\"  >> f90srclist.inc                          echo    " \\"  >> F90srclist.tmp
2465                          echo -n " $sf" >> f90srclist.inc                          printf " $sf" >> F90srclist.tmp
2466                          ;;                          ;;
2467                      c)                      c)
2468                          echo    " \\"  >> csrclist.inc                          echo    " \\"  >> csrclist.tmp
2469                          echo -n " $sf" >> csrclist.inc                          printf " $sf" >> csrclist.tmp
2470                          ;;                          ;;
2471                      h)                      h)
2472                          echo    " \\"  >> hlist.inc                          echo    " \\"  >> hsrclist.tmp
2473                          echo -n " $sf" >> hlist.inc                          printf " $sf" >> hsrclist.tmp
2474                          ;;                          ;;
2475                      flow)                      flow)
2476                          echo    " \\"  >> ad_flow_files.inc                          echo    " \\"  >> ad_flow_files.tmp
2477                          echo -n " $sf" >> ad_flow_files.inc                          printf " $sf" >> ad_flow_files.tmp
2478                          ;;                          ;;
2479                  esac                     esac
2480                    fi
2481              fi              fi
2482          fi          fi
2483      done      done
2484      if test "x$deplist" != x ; then      if test "x$deplist" != x ; then
2485          echo "" >> srclinks.tmp        if test "$d" != "." ; then
2486            echo "" >> srclinks.tmp
2487          echo "#  These files are linked from $d" >> srclinks.tmp          echo "#  These files are linked from $d" >> srclinks.tmp
2488          echo "$deplist :" >> srclinks.tmp          echo "$deplist :" >> srclinks.tmp
2489          printf "\t\$(LN) %s/\$@ \$@\n" $d >> srclinks.tmp  # We need to make sure that the link isn't already there.
2490    # This may happen when make thinks that a header file has to be "remade"
2491    # because a module it depends on has changed.  In this case we do nothing.
2492            printf "\tif [ ! -L \$@ ]; then \$(LN) %s/\$@ \$@; fi\n" $d >> srclinks.tmp
2493          fi
2494      fi      fi
2495  done  done
2496  rm -rf .links.tmp  rm -rf .links.tmp
2497  echo "" >> srclist.inc  echo "" >> F77srclist.tmp
2498  echo "" >> csrclist.inc  echo "" >> nonADF77srclist.tmp
2499  echo "" >> f90srclist.inc  echo "" >> csrclist.tmp
2500  echo "" >> hlist.inc  echo "" >> F90srclist.tmp
2501  echo "" >> ad_flow_files.inc  echo "" >> hsrclist.tmp
2502    echo "" >> ad_flow_files.tmp
2503    
2504    CMDLINE=$0
2505    for xx in "$@" ; do nw=`echo $xx | wc -w`
2506        if test $nw = '1' ; then CMDLINE="$CMDLINE $xx"
2507                            else CMDLINE="$CMDLINE '$xx'" ; fi
2508    done
2509    
2510  if test -e $MAKEFILE ; then  if test -f $MAKEFILE ; then
2511      mv -f $MAKEFILE "$MAKEFILE.bak"      mv -f $MAKEFILE "$MAKEFILE.old"
2512  fi  fi
2513  echo "  Writing makefile: $MAKEFILE"  echo "  Writing makefile: $MAKEFILE"
2514  echo "# Multithreaded + multi-processing makefile for:" > $MAKEFILE  echo "# Multithreaded + multi-processing makefile for:" > $MAKEFILE
# Line 1261  echo "#    $MACHINE" >> $MAKEFILE Line 2516  echo "#    $MACHINE" >> $MAKEFILE
2516  echo "# This makefile was generated automatically on" >> $MAKEFILE  echo "# This makefile was generated automatically on" >> $MAKEFILE
2517  echo "#    $THISDATE" >> $MAKEFILE  echo "#    $THISDATE" >> $MAKEFILE
2518  echo "# by the command:" >> $MAKEFILE  echo "# by the command:" >> $MAKEFILE
2519  echo "#    $0 $@" >> $MAKEFILE  echo "#    $CMDLINE"  >> $MAKEFILE
2520  echo "# executed by:" >> $MAKEFILE  echo "# executed by:" >> $MAKEFILE
2521  echo "#    $USER@${THISHOSTNAME}:${THISCWD}" >> $MAKEFILE  echo "#    ${THISUSER}@${THISHOST}:${THISCWD}" >> $MAKEFILE
2522    
2523  EXE_AD=$EXECUTABLE"_ad"  EXE_AD=$EXECUTABLE"_ad"
2524  EXE_FTL=$EXECUTABLE"_ftl"  EXE_FTL=$EXECUTABLE"_ftl"
2525  EXE_SVD=$EXECUTABLE"_svd"  EXE_SVD=$EXECUTABLE"_svd"
2526    
2527  cat >>$MAKEFILE <<EOF  cat >>$MAKEFILE <<EOF
2528  #  #
2529    # OPTFILE="$OPTFILE"
2530    #
2531  # BUILDDIR     : Directory where object files are written  # BUILDDIR     : Directory where object files are written
2532  # SOURCEDIRS   : Directories containing the source (.F) files  # SOURCEDIRS   : Directories containing the source (.F) files
2533  # INCLUDEDIRS  : Directories containing the header-source (.h) files  # INCLUDEDIRS  : Directories containing the header-source (.h) files
# Line 1290  cat >>$MAKEFILE <<EOF Line 2547  cat >>$MAKEFILE <<EOF
2547  # LIBS         : Library flags /or/ additional optimization/debugging flags  # LIBS         : Library flags /or/ additional optimization/debugging flags
2548    
2549  ROOTDIR     = ${ROOTDIR}  ROOTDIR     = ${ROOTDIR}
2550  BUILDDIR    = ${BUILDDIR}    BUILDDIR    = ${BUILDDIR}
2551  SOURCEDIRS  = ${SOURCEDIRS}  SOURCEDIRS  = ${SOURCEDIRS}
2552  INCLUDEDIRS = ${INCLUDEDIRS}  INCLUDEDIRS = ${INCLUDEDIRS}
2553  EXEDIR      = ${EXEDIR}  EXEDIR      = ${EXEDIR}
# Line 1303  EXE_AD      = ${EXE_AD} Line 2560  EXE_AD      = ${EXE_AD}
2560  EXE_FTL     = ${EXE_FTL}  EXE_FTL     = ${EXE_FTL}
2561  EXE_SVD     = ${EXE_SVD}  EXE_SVD     = ${EXE_SVD}
2562    
2563    ENABLED_PACKAGES = ${ENABLED_PACKAGES}
2564    DISABLED_PACKAGES = ${DISABLED_PACKAGES}
2565    
2566    # These files are created by Makefile
2567    SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h BUILD_INFO.h
2568  EOF  EOF
2569    
2570  #  Note: figure out some way to add Hyades JAM libraries here  if test "x$EMBED_SRC" = xt ; then
2571        echo "EMBEDDED_FILES = EMBEDDED_FILES.h" >>$MAKEFILE
2572    else
2573        echo "EMBEDDED_FILES = " >>$MAKEFILE
2574    fi
2575    
2576  cat >>$MAKEFILE <<EOF  cat >>$MAKEFILE <<EOF
2577  # Unix ln (link)  # Unix ln (link)
2578  LN = ${LN}  LN = ${LN}
# Line 1320  KPP = ${KPP} Line 2586  KPP = ${KPP}
2586  FC = ${FC}  FC = ${FC}
2587  # Fortran compiler  # Fortran compiler
2588  F90C = ${F90C}  F90C = ${F90C}
2589    # C compiler
2590    CC = ${CC}
2591  # Link editor  # Link editor
2592  LINK = ${LINK}  LINK = ${LINK} ${LDADD}
2593    
2594  # Defines for CPP  # Defines for CPP
2595  DEFINES = ${DEFINES}  DEFINES = ${DEFINES}
# Line 1331  INCLUDES = ${INCLUDES} Line 2599  INCLUDES = ${INCLUDES}
2599  KFLAGS1 = ${KFLAGS1}  KFLAGS1 = ${KFLAGS1}
2600  KFLAGS2 = ${KFLAGS2}  KFLAGS2 = ${KFLAGS2}
2601  # Optim./debug for FC  # Optim./debug for FC
2602  FFLAGS = ${FFLAGS}  FFLAGS = ${FFLAGS} ${FEXTRAFLAGS}
2603  FOPTIM = ${FOPTIM}  FOPTIM = ${FOPTIM}
2604  # Optim./debug for FC  # Optim./debug for FC
2605  F90FLAGS = ${F90FLAGS}  F90FLAGS = ${F90FLAGS}
2606  F90OPTIM = ${F90OPTIM}  F90OPTIM = ${F90OPTIM}
2607    F90FIXEDFORMAT = ${F90FIXEDFORMAT}
2608  # Flags for CC  # Flags for CC
2609  CFLAGS = ${CFLAGS}  CFLAGS = ${CFLAGS}
2610  # Files that should not be optimized  # Files that should not be optimized
2611  NOOPTFILES = ${NOOPTFILES}  NOOPTFILES = ${NOOPTFILES}
2612  NOOPTFLAGS = ${NOOPTFLAGS}  NOOPTFLAGS = ${NOOPTFLAGS}
2613  # Flags and libraries needed for linking  # Flags and libraries needed for linking
2614  LIBS = ${LIBS} \$(XLIBS)  LIBS = ${LIBS}
2615  # Name of the Mekfile  # Name of the Mekfile
2616  MAKEFILE=${MAKEFILE}  MAKEFILE=${MAKEFILE}
2617    
2618  EOF  EOF
2619    
2620  cat srclist.inc       >> $MAKEFILE  cat F77srclist.tmp      >> $MAKEFILE
2621  cat csrclist.inc      >> $MAKEFILE  cat nonADF77srclist.tmp >> $MAKEFILE
2622  cat f90srclist.inc    >> $MAKEFILE  cat csrclist.tmp        >> $MAKEFILE
2623  cat hlist.inc         >> $MAKEFILE  cat F90srclist.tmp      >> $MAKEFILE
2624  cat ad_flow_files.inc >> $MAKEFILE  cat hsrclist.tmp        >> $MAKEFILE
2625  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  
2626    
2627  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  
2628    
2629  cat >>$MAKEFILE <<EOF  echo >> $MAKEFILE
2630    
2631  .SUFFIXES:  # add definitions for preprocessed sources
2632  .SUFFIXES: .o .f .p .F .c .F90 .f90  # and note that not all systems allow case sensitive extensions
2633    # hence the $FS and $FS90 here.
2634    # for fixed format f90 files we use ff90 or FF90 resp
2635    # but these are not expected to be the original source files
2636    
2637    echo 'F77_PP_SRC_FILES = $(F77_SRC_FILES:.F=.'$FS')'      >> $MAKEFILE
2638    echo 'F90_PP_SRC_FILES = $(F90_SRC_FILES:.F90=.'$FS90')' >> $MAKEFILE
2639    echo 'OBJFILES= $(F77_SRC_FILES:.F=.o) $(C_SRC_FILES:.c=.o) $(F90_SRC_FILES:.F90=.o)' >> $MAKEFILE
2640    echo 'FLOFILES =  $(AD_FLOW_FILES:.flow=.flowdir)' >> $MAKEFILE
2641    echo >> $MAKEFILE
2642    echo '.SUFFIXES:' >> $MAKEFILE
2643    echo '.SUFFIXES: .o .'$FS' .p .F .c .f'$FS90' .'$FS90' .FF90 .F90 .flowdir .flow' >> $MAKEFILE
2644    
2645    cat >>$MAKEFILE <<EOF
2646    
2647  all: \$(EXECUTABLE)  all: \$(EXECUTABLE)
2648  \$(EXECUTABLE): \$(OBJFILES)  \$(EXECUTABLE): \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(OBJFILES) \$(EMBEDDED_FILES)
2649            @echo Creating \$@ ...
2650          \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)          \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
2651  depend:  depend:
2652          @make links          @make links
2653          \$(MAKEDEPEND) -o .f \$(DEFINES) \$(INCLUDES) \$(SRCFILES)          \$(MAKEDEPEND) -o .$FS \$(DEFINES) \$(INCLUDES) \$(F77_SRC_FILES)
2654          ${TOOLSDIR}/f90mkdepend >> \$(MAKEFILE)          \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
2655            -rm -f makedepend.out
2656    
2657    lib: libmitgcmuv.a
2658    
2659  links: \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES)  libmitgcmuv.a: \$(OBJFILES)
2660            ar rcv libmitgcmuv.a \$(OBJFILES)
2661            ar d   libmitgcmuv.a main.o
2662    
2663  small_f: \$(F77FILES) \$(F90FILES)  links: \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(SPECIAL_FILES)
2664    
2665    small_f: \$(F77_PP_SRC_FILES) \$(F90_PP_SRC_FILES)
2666    
2667  output.txt: \$(EXECUTABLE)  output.txt: \$(EXECUTABLE)
2668          @printf 'running ... '          @printf 'running ... '
2669          @\$(EXECUTABLE) > \$@          @\$(EXECUTABLE) > \$@
2670    
2671  clean:  clean:
2672          -cat AD_CONFIG.template > AD_CONFIG.h          -rm -rf *.p *.$FS90 *.mod ${RMFILES} work.{pc,pcl} *.template
2673          -rm -rf *.o *.f *.p *.f90 *.mod ${RMFILES} work.{pc,pcl}          -rm -rf *.o
2674            -rm -rf *.$FS *.flowdir
2675            -rm -rf *.f$FS90 \$(AD_CLEAN) ad_input*
2676  Clean:  Clean:
2677          @make clean          @make clean
2678          @make cleanlinks          @make cleanlinks
2679          -rm -f Makefile.bak genmake_state genmake_*optfile make.log          -rm -f \$(SPECIAL_FILES)
2680            -rm -f genmake_state genmake_*optfile genmake_warnings genmake_errors
2681            -rm -f make.log run.log f90mkdepend.log *.bak "$MAKEFILE.old"
2682            -rm -f taf_command taf_output taf_ad.log taf_ad_flow.log
2683  CLEAN:  CLEAN:
2684          @make Clean          @make Clean
2685          -find \$(EXEDIR) -name "*.meta" -exec rm {} \;          -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
2686          -find \$(EXEDIR) -name "*.data" -exec rm {} \;          -find \$(EXEDIR) -name "*.data" -exec rm {} \;
2687          -find \$(EXEDIR) -name "fort.*" -exec rm {} \;          -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
2688          -rm -f \$(EXECUTABLE) output.txt          -rm -f \$(EXECUTABLE) \$(EXE_AD) *.txt STD* *diagnostics.log datetime
2689            -rm -f *_MIT_CE_000.opt0000 costfunction*0000
2690            -rm -rf mnc_test_*
2691    
2692  #eh3 Makefile: makefile  #eh3 Makefile: makefile
2693  makefile:  makefile:
2694          ${0} $@          $THIS_SCRIPT $G2ARGS
2695  cleanlinks:  cleanlinks:
2696          -find . -type l -exec rm {} \;          -find . -type l -exec rm {} \;
2697    
2698  # The normal chain of rules is (  .F - .f - .o  )  # Special targets (SPECIAL_FILES) which are created by make
2699  .F.f:  ${PACKAGES_DOT_H}:
2700            @echo Creating \$@ ...
2701            @$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) > \$@
2702    AD_CONFIG.h:
2703            @echo Creating \$@ ...
2704            @$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 > \$@
2705    FC_NAMEMANGLE.h:
2706            @echo Creating \$@ ...
2707            echo "$FC_NAMEMANGLE" > \$@
2708    
2709    BUILD_INFO.h:
2710            @echo Creating \$@ ...
2711    EOF
2712    
2713    test ! "x$THISVER" = x  && echo "       -echo \"#define THISVER '$THISVER'\" > \$@"   >> $MAKEFILE
2714    test ! "x$THISUSER" = x && echo "       -echo \"#define THISUSER '$THISUSER'\" >> \$@" >> $MAKEFILE
2715    test ! "x$THISDATE" = x && echo "       -echo \"#define THISDATE '$THISDATE'\" >> \$@" >> $MAKEFILE
2716    test ! "x$THISHOST" = x && echo "       -echo \"#define THISHOST '$THISHOST'\" >> \$@" >> $MAKEFILE
2717    
2718    if test "x$EMBED_SRC" = xt ; then
2719        cat >>$MAKEFILE <<EOF
2720    
2721    decode_files.o : EMBEDDED_FILES.h
2722    
2723    ##  \$(F77_PP_SRC_FILES)
2724    all_fF.tar.gz : \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(F77_PP_SRC_FILES) Makefile
2725            @echo Creating \$@ ...
2726            -tar -hcf all_fF.tar \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(F77_PP_SRC_FILES) Makefile
2727            -rm -f all_fF.tar.gz
2728            -gzip all_fF.tar
2729    
2730    EMBEDDED_FILES.h : all_fF.tar.gz
2731            @echo Creating \$@ ...
2732            -\${ROOTDIR}/tools/embed_encode/encode_files EMBEDDED_FILES.h all_fF.tar.gz
2733    
2734    EOF
2735    fi
2736    
2737    cat >>$MAKEFILE <<EOF
2738    
2739    # The normal chain of rules is (  .F - .$FS - .o  )
2740    
2741    ## This nullifies any default implicit rules concerning these two file types:
2742    ## %.o : %.F
2743    
2744    .F.$FS:
2745          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2746  .f.o:  .$FS.o:
2747          \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<          \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
2748  .F90.f90:  .F90.$FS90:
2749            \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2750    .FF90.f$FS90:
2751          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2752  .f90.o:  .$FS90.o:
2753          \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<          \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
2754    .f$FS90.o:
2755            cp \$< \$(basename  \$<).f90
2756            \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$(F90FIXEDFORMAT) \$(basename  \$<).f90
2757  .c.o:  .c.o:
2758          \$(CC) \$(CFLAGS) -c \$<          \$(CC) \$(CFLAGS) \$(DEFINES) \$(INCLUDES) -c \$<
2759    .flow.flowdir:
2760            \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2761    
2762  # Special exceptions that use the ( .F - .p - .f - .o ) rule-chain  # Special exceptions that use the ( .F - .p - .$FS - .o ) rule-chain
2763  .F.p:  .F.p:
2764          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2765  .p.f:  .p.$FS:
2766          \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<          \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
2767    
2768    EOF
2769    
2770  #=========================================  #=========================================
2771  #===  Automatic Differentiation Rules  ===  #===  Automatic Differentiation Rules  ===
2772    #===  for TAMC/TAF  ======================
2773    
2774    if test "x$OPENAD" = x ; then
2775    
2776    cat >>$MAKEFILE <<EOF
2777    
2778  TAMC           = ${TAMC}  TAMC           = ${TAMC}
2779  TAF            = ${TAF}  TAF            = ${TAF}
# Line 1436  ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF Line 2788  ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF
2788  ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"  ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
2789  for i in $ad_vars ; do  for i in $ad_vars ; do
2790      name=$i      name=$i
2791      t1="t2=\$"`echo $i`      t1="t2=\$"`echo "$i"`
2792      eval $t1      eval $t1
2793      printf "%-20s = " $name >> $MAKEFILE      printf "%-20s = " $name >> $MAKEFILE
2794      echo $t2 >> $MAKEFILE      echo "$t2" | sed -e 's| \+| |g' >> $MAKEFILE
2795  done  done
2796    
2797  echo "  Add the source list for AD code generation"  echo "  Add the source list for AD code generation"
2798  echo >> $MAKEFILE  echo >> $MAKEFILE
2799  echo -n "AD_FILES = " >> $MAKEFILE  printf "AD_FILES = " >> $MAKEFILE
2800  AD_FILES=`cat ad_files`  AD_FILES=`cat adSrcFiles.tmp`
2801  for i in $AD_FILES ; do  for i in $AD_FILES ; do
2802      echo    " \\" >> $MAKEFILE      echo    " \\" >> $MAKEFILE
2803      echo -n " $i" >> $MAKEFILE      printf " $i" >> $MAKEFILE
2804  done  done
2805  echo >> $MAKEFILE  echo >> $MAKEFILE
2806  rm -f ad_files  rm -f adSrcFiles.tmp
2807    
2808  cat >>$MAKEFILE <<EOF  cat >>$MAKEFILE <<EOF
2809    
2810  # ... AD ...  # ... AD ...
2811  adall: ad_taf  adall: \$(EXE_AD)
2812  adtaf: ad_taf_output.f  adtaf: ad_taf_output.$FS
2813  adtamc: ad_tamc_output.f  adtamc: ad_tamc_output.$FS
2814    
2815  ad_input_code.f: \$(AD_FILES) \$(HEADERFILES)  ad_input_code.$FS: \$(AD_FILES) \$(H_SRC_FILES) \$(AD_FLOW_FILES)
2816            @$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
2817          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
2818          @make \$(F77FILES)          -rm -f ad_config.template
2819          @make \$(AD_FLOW_FILES)          @make \$(F77_PP_SRC_FILES)
2820          cat \$(AD_FLOW_FILES) \$(AD_FILES) > ad_input_code.f          @make \$(FLOFILES)
2821            cat \$(FLOFILES) \$(AD_FILES) | sed -f \$(TOOLSDIR)/remove_comments_sed > ad_input_code.$FS
2822  ad_taf_output.f: ad_input_code.f  
2823          \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f  ad_taf_output.$FS: ad_input_code.$FS
2824          cat ad_input_code_ad.f | sed -f adjoint_sed > ad_taf_output.f          \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2825            ls -l ad_input_code_ad.$FS
2826  ad_taf: ad_taf_output.o \$(OBJFILES)          cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2827          \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)  
2828    adtafonly:
2829  ad_tamc_output.f: ad_input_code.f          \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2830          \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.f          ls -l ad_input_code_ad.$FS
2831          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
2832    
2833    \${EXE_AD}: ad_taf_output.o \$(OBJFILES)
2834            \$(LINK) -o \${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
2835    
2836    ad_tamc_output.$FS: ad_input_code.$FS
2837            \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.$FS
2838            cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.$FS
2839    
2840  ad_tamc: ad_tamc_output.o \$(OBJFILES)  ad_tamc: ad_tamc_output.o \$(OBJFILES)
2841          \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)          \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
2842    
2843    adonlyfwd:
2844            patch < \$(TOOLSDIR)/ad_taf_output.f.onlyfwd.diff
2845    
2846    adtrick:
2847            patch < \$(TOOLSDIR)/ad_taf_output.f.adtrick.diff
2848    
2849  # ... FTL ...  # ... FTL ...
2850  ftlall: ftl_taf  ftlall: ftl_taf
2851  ftltaf: ftl_taf_output.f  ftltaf: ftl_taf_output.$FS
2852  ftltamc: ftl_tamc_output.f  ftltamc: ftl_tamc_output.$FS
2853    
2854  ftl_input_code.f: \$(AD_FILES) \$(HEADERFILES)  ftl_input_code.$FS: \$(AD_FILES) \$(H_SRC_FILES)
2855            @$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
2856          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
2857          @make \$(F77FILES)          -rm -f ftl_config.template
2858            @make \$(F77_PP_SRC_FILES)
2859          @make \$(AD_FLOW_FILES)          @make \$(AD_FLOW_FILES)
2860          cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.f          cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.$FS
2861    
2862  ftl_taf_output.f: ftl_input_code.f  ftl_taf_output.$FS: ftl_input_code.$FS
2863          \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f          \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
2864          cat ftl_input_code_ftl.f | sed -f adjoint_sed > ftl_taf_output.f          ls -l ftl_input_code_ftl.$FS
2865            cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
2866    
2867    ftltafonly:
2868            \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
2869            ls -l ftl_input_code_ftl.$FS
2870            cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
2871    
2872  ftl_taf: ftl_taf_output.o \$(OBJFILES)  ftl_taf: ftl_taf_output.o \$(OBJFILES)
2873          \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)          \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
2874    
2875  ftl_tamc_output.f: ftl_input_code.f  ftl_tamc_output.$FS: ftl_input_code.$FS
2876          \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.f          \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.$FS
2877          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
2878    
2879  ftl_tamc: ftl_tamc_output.o \$(OBJFILES)  ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
2880          \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)          \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
2881    
2882    
2883  # ... SVD ...  # ... SVD ...
2884  svd: svd_taf  svdtaf: ad_taf_output.$FS ftl_taf_output.$FS
2885  svd_taf_f: svd_taf_output.f          @echo "--->>> Only ran TAF to generate SVD code!    <<<---"
2886            @echo "--->>> Do make svdall afterwards to compile. <<<---"
2887    svdall: svd_touch svd_taf
2888    
2889    svd_taf: \$(OBJFILES)
2890            \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
2891    
2892            @echo "--->>> Only COMPILE svd code! <<<---"
2893            @echo "--->>> Assumes you previously <<<---"
2894            @echo "--->>> did make svdtaf        <<<---"
2895    
2896    svd_touch:
2897            @echo "--->>> Only COMPILE svd code! <<<---"
2898            @echo "--->>> Assumes you previously <<<---"
2899            @echo "--->>> did make svdtaf        <<<---"
2900            touch ad_taf_output.$FS ftl_taf_output.$FS
2901            \$(FC) \$(FFLAGS) \$(FOPTIM) -c ad_taf_output.$FS
2902            \$(FC) \$(FFLAGS) \$(FOPTIM) -c ftl_taf_output.$FS
2903            @$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
2904            cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
2905            -rm -f ftl_config.template
2906    
2907  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  
2908    
2909  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  
2910    
2911  svd_taf: svd_taf_output.o \$(OBJFILES)  #===  for OpenAD  ========================
         \$(LINK) -o ${EXE_SVD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) svd_taf_output.o \$(LIBS)  
2912    
2913    if test "x$OPENAD" != x ; then
2914    
2915  #=========================================  # ============ begin OpenAD specific section ==============
2916    
2917    cat >>$MAKEFILE <<EOF
2918    
2919    # all the source files linked from the various locations:
2920    ALL_LINKED_FILES= \
2921    \$(F77_SRC_FILES) \
2922    \$(C_SRC_FILES) \
2923    \$(H_SRC_FILES) \
2924    \$(F90_SRC_FILES) \
2925    \$(SPECIAL_FILES)
2926    
2927    ifndef OPENADROOT
2928      \$(error "Error:  environment variable OPENADROOT not defined!")
2929    endif
2930    
2931    ifndef XAIFSCHEMAROOT
2932      \$(error "Error:  environment variable XAIFSCHEMAROOT not defined!")
2933    endif
2934    
2935    ifndef XAIFBOOSTERROOT
2936      \$(error "Error:  environment variable XAIFBOOSTERROOT not defined!")
2937    endif
2938    
2939    EOF
2940    
2941    echo "  Add the source list for common block to module conversion "
2942    echo >> $MAKEFILE
2943    printf "CB2M_F90_SRC_NAMES = " >> $MAKEFILE
2944    for i in `cat ${OAD_CB2M_FILES}` ; do
2945      echo    " \\" >> $MAKEFILE
2946      printf " $i" >> $MAKEFILE
2947    done
2948    echo >> $MAKEFILE
2949    
2950    echo "  Add the source list for AD code generation"
2951    echo >> $MAKEFILE
2952    printf "AD_FILES = " >> $MAKEFILE
2953    for i in `cat ${OAD_CB2M_FILES}` ; do
2954      echo    " \\" >> $MAKEFILE
2955      printf " ${i}_mod.f$FS90" >> $MAKEFILE
2956    done
2957    AD_FILES=`cat adSrcFiles.tmp`
2958    for i in $AD_FILES ; do
2959      basename=${i%%.f}
2960      toBeIgnored=`egrep ^$basename'[      ]*' ${OAD_DONT_COMPILE} ${OAD_DONT_TRANSFORM}`
2961      if test -z "$toBeIgnored" ; then
2962        echo    " \\" >> $MAKEFILE
2963        printf " $i" >> $MAKEFILE
2964      fi
2965    done
2966    echo >> $MAKEFILE
2967    rm -f adSrcFiles.tmp
2968    
2969    cat >>$MAKEFILE <<EOF
2970    
2971    adAll: \$(EXE_AD)
2972    .PHONY: adAll
2973    
2974    CB2M_F90_PP_SRC_FILES=\$(addsuffix _mod.f$FS90, \$(CB2M_F90_SRC_NAMES))
2975    
2976    .PRECIOUS: \$(CB2M_F90_PP_SRC_FILES) \$(NON_AD_F77_SRC_FILES:.F=_cb2m.f$FS90)
2977    
2978    .PHONY: adDepend
2979    adDepend: \$(ALL_LINKED_FILES) \$(addsuffix _mod.h, \$(CB2M_F90_SRC_NAMES)) \$(addsuffix _mod.FF90, \$(CB2M_F90_SRC_NAMES)) \$(F77_SRC_FILES:.F=_cb2m.FF90)
2980            \$(MAKEDEPEND) -o .$FS \$(DEFINES) \$(INCLUDES) \$(F77_SRC_FILES)
2981            \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
2982            -rm -f makedepend.out
2983    
2984    OPENAD_SUPPORT_F90_SRC_FILES = \
2985    w2f__types.F90 \
2986    OAD_active.F90 \
2987    OAD_cp.F90 \
2988    OAD_rev.F90 \
2989    OAD_tape.F90
2990    
2991    OPENAD_SUPPORT_C_SRC_FILES = \
2992    iaddr.c \
2993    timeRatio.c
2994    
2995    f95_test_mods.f90: \$(OPENAD_SUPPORT_F90_SRC_FILES:F90=$FS90)
2996            cat \$^ > \$@
2997    
2998    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
2999            cat \$^ > \$@
3000    
3001    f95_test.out: f95_test_mods.f90 f95_test.f90
3002            f95 -fixed -w=unused -maxcontin=132 -c f95_test_mods.f90 > \$@ 2>&1
3003            f95 -fixed -w=unused -maxcontin=132 -c -fixed f95_test.f90 >> \$@ 2>&1
3004    
3005    # the file included below is created by the
3006    # postProcessor and its inclusion sets the
3007    # variable POSTPROCESSEDFILES
3008    # used below. Because the file is made during
3009    # make it won't be read until the second (recursive)
3010    # invocation in the rule below
3011    -include postProcess.make
3012    
3013    AD_OBJ_FILES_S1=\$(OPENAD_SUPPORT_F90_SRC_FILES:.F90=.o) \$(OPENAD_SUPPORT_C_SRC_FILES:.c=.o) \$(POSTPROCESSEDFILES:.f$FS90=.o)
3014    
3015    AD_OBJ_FILES_S2=\$(AD_OBJ_FILES_S1) \$(NON_AD_F77_SRC_FILES:.F=_cb2m.o) \$(C_SRC_FILES:.c=.o) \$(F90_SRC_FILES:.F90=.o)
3016    
3017    postProcess.comp: \$(ALL_LINKED_FILES) \$(addsuffix _mod.h, \$(CB2M_F90_SRC_NAMES)) postProcess.tag \$(AD_OBJ_FILES_S1)
3018    ifeq (\$(MAKELEVEL),0)
3019            \$(MAKE) adAll
3020    else
3021            touch \$@
3022    endif
3023    
3024    \$(EXE_AD): \$(ALL_LINKED_FILES) \$(addsuffix _mod.h, \$(CB2M_F90_SRC_NAMES)) postProcess.comp \$(AD_OBJ_FILES_S2)
3025    ifeq (\$(MAKELEVEL),1)
3026            \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(AD_OBJ_FILES_S2) \$(LIBS)
3027    else
3028            touch \$@
3029    endif
3030    
3031    # makefile debug rule
3032    openad: ad_input_code.w2f.pre.xb.x2w.w2f.td.pp.f$FS90
3033    .PHONY: openad
3034    
3035    # create the module files
3036    %_mod.FF90 : %.h ../OAD_support/cb2mGetModules.csh ../OAD_support/cb2mGetModules.awk
3037            ../OAD_support/cb2mGetModules.csh $< ../OAD_support/cb2mGetModules.awk
3038    
3039    # create the header files
3040    %_mod.h : %.h ../OAD_support/cb2mGetHeaders.csh ../OAD_support/cb2mGetHeaders.awk
3041            ../OAD_support/cb2mGetHeaders.csh $< ../OAD_support/cb2mGetHeaders.awk \$(CB2M_F90_SRC_NAMES)
3042    
3043    # change everybody else to use the new module files:
3044    %_cb2m.FF90 : %.F ../OAD_support/cb2mUseModules.bash
3045            ../OAD_support/cb2mUseModules.bash $< ${MPI}
3046    
3047    # makefile debug rule
3048    small_f: \$(CB2M_F90_PP_SRC_FILES)
3049    .PHONY: small_f
3050    
3051    ad_output.txt: \$(EXE_AD)
3052            @printf 'linking data files ... '
3053            \$(LN) -f ../input_ad/data* ../input_ad/eedata .
3054            \$(LN) -f ../../global_ocean.90x40x15/input/*.bin .
3055            @printf 'running ... '
3056            @./\$(EXE_AD) > \$@
3057    
3058    CB2M_AD_FILES=\$(AD_FILES:.f=_cb2m.f$FS90)
3059    ad_input_code.f$FS90:  \$(CB2M_AD_FILES)
3060            cat \$^ > \$@
3061    
3062    # strip all comments and blanks to reduce
3063    # the file size in order to reduce perl's memory requirements
3064    ad_input_code_sf.f$FS90 : ad_input_code.f$FS90
3065            cat \$^ | sed -f ../OAD_support/strip.sed | sed -f ../OAD_support/stop2print.sed > \$@
3066    
3067    # mfef90 preprocessing
3068    # expand statement functions
3069    # expose mfef90 specific substring handling
3070    # add the w2f__types module
3071    ad_input_code_sf.w2f.f$FS90: ad_input_code_sf.f$FS90 mfef90 whirl2f whirl2f_be w2f__types.f90
3072            ./mfef90 -r8 -z -F -N132 \$<
3073            mv \$<.B \$(basename \$<).B
3074            ./whirl2f -openad \$(basename \$<).B
3075            cat w2f__types.f90 \$(basename \$<).w2f.f > \$@
3076    
3077    # canonicalizer
3078    ad_input_code_sf.w2f.pre.f$FS90: ad_input_code_sf.w2f.f$FS90 preProcess.py
3079            ./preProcess.py --timing --r8 -H -S \$< -o \$@
3080    
3081    # F -> WHIRL
3082    # note that the canonicalized version cuts off at col 72
3083    # doing this also for string constants which is ok as long
3084    # as we are in fixed mode and cut of exactly there.
3085    # Otherwise mfef90 patches in spaces to fill up to 72 (or 132)
3086    # characters respectively.
3087    ad_input_code_sf.w2f.pre.B: ad_input_code_sf.w2f.pre.f$FS90 mfef90
3088            ./mfef90 -r8 -z -F \$<
3089            mv \$<.B \$@
3090    
3091    # WHIRL -> XAIF
3092    ad_input_code_sf.w2f.pre.xaif : ad_input_code_sf.w2f.pre.B whirl2xaif
3093            ./whirl2xaif -s -n --debug 1 -o \$@ \$<
3094    
3095    # XAIF -> XAIF'
3096    ad_input_code_sf.w2f.pre.xb.xaif : ad_input_code_sf.w2f.pre.xaif xaif.xsd xaif_base.xsd xaif_inlinable_intrinsics.xsd xaif_derivative_propagator.xsd xaif_output.xsd oadDriver
3097            ./oadDriver -f -t forward_step -i \$< -c \${XAIFSCHEMAROOT}/schema/examples/inlinable_intrinsics.xaif -o \$@ -I -r
3098    
3099    # XAIF' -> WHIRL'
3100    ad_input_code_sf.w2f.pre.xb.x2w.B : ad_input_code_sf.w2f.pre.xb.xaif xaif2whirl
3101            ./xaif2whirl --debug 1 ad_input_code_sf.w2f.pre.B \$<
3102    
3103    # WHIRL' -> F'
3104    ad_input_code_sf.w2f.pre.xb.x2w.w2f.f$FS90: ad_input_code_sf.w2f.pre.xb.x2w.B whirl2f whirl2f_be
3105            ./whirl2f -FLIST:ftn_file=\$@ -openad \$<
3106    
3107    # insert template directives
3108    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
3109            ../OAD_support/insertTemplateDir.bash \$< \$@
3110    
3111    PPEXTRAS=\$(wildcard ../OAD_support/ad_template.*.F) ../OAD_support/ad_inline.F
3112    # postprocess F'
3113    postProcess.tag: ad_input_code_sf.w2f.pre.xb.x2w.w2f.td.f$FS90 postProcess.py \$(PPEXTRAS:.F=.f)
3114            # the target is a placeholder to signal execution of the rule
3115            touch \$@
3116            # this step also creates the file postProcess.make but we cannot
3117            # name it as the target or else make will try to remake it for
3118            # the include directive above for any rule, e.g. make clean
3119            ./postProcess.py --progress --timing --outputFormat=fixed -m r -i ../OAD_support/ad_inline.f --width 4 \$<
3120    
3121    # setup some links
3122    %.xsd:
3123            \$(LN) \${XAIFSCHEMAROOT}/schema/\$@ .
3124    
3125    mfef90:
3126            \$(LN) \${OPEN64ROOT}/crayf90/sgi/mfef90 .
3127    
3128    # link the support files:
3129    \$(OPENAD_SUPPORT_F90_SRC_FILES) \$(OPENAD_SUPPORT_C_SRC_FILES):
3130            \$(LN) ../OAD_support/\$@ .
3131    
3132    whirl2xaif xaif2whirl:
3133            \$(LN) \${OPENADFORTTK}/bin/\$@ .
3134    
3135    preProcess.py postProcess.py:
3136            \$(LN) \${OPENADFORTTK_BASE}/tools/SourceProcessing/\$@ .
3137    
3138    whirl2f whirl2f_be:
3139            \$(LN) \${OPEN64ROOT}/whirl2f/\$@ .
3140    
3141    oadDriver:
3142            \$(LN) \${XAIFBOOSTERROOT}/xaifBooster/algorithms/BasicBlockPreaccumulationReverse/driver/oadDriver \$@
3143    
3144    AD_CLEAN += *_mod.h *_mod.F90 *.FF90 *.mod-whirl temp.sed oad_cp.* postProcess.make postProcess.tag postProcess.comp \$(PPEXTRAS:.F=.f)
3145    
3146    # ============ end OpenAD specific section ==============
3147    
3148  EOF  EOF
3149    
3150    fi
3151    
3152    #=========================================
3153    
3154  if test "x$EXEHOOK" != x ; then  if test "x$EXEHOOK" != x ; then
3155      printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE      printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE
3156  fi  fi
# Line 1540  for i in $KPPFILES ; do Line 3162  for i in $KPPFILES ; do
3162      if test "x$RETVAL" != x0 ; then      if test "x$RETVAL" != x0 ; then
3163          echo "Error: unable to add file \"$i\" to the exceptions list"          echo "Error: unable to add file \"$i\" to the exceptions list"
3164      fi      fi
3165      echo "$base.f: $base.p" >> $MAKEFILE      echo "$base.$FS: $base.p" >> $MAKEFILE
3166  done  done
3167    
3168  echo "  Making list of NOOPTFILES"  echo "  Making list of NOOPTFILES"
# Line 1550  for i in $NOOPTFILES ; do Line 3172  for i in $NOOPTFILES ; do
3172      if test "x$RETVAL" != x0 ; then      if test "x$RETVAL" != x0 ; then
3173          echo "Error: unable to add file \"$i\" to the exceptions list"          echo "Error: unable to add file \"$i\" to the exceptions list"
3174      fi      fi
3175      echo "$base.o: $base.f" >> $MAKEFILE      echo "$base.o: $base.$FS" >> $MAKEFILE
3176      printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE      printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE
3177  done  done
3178    
# Line 1563  printf "\n\n# DO NOT DELETE\n" >> $MAKEF Line 3185  printf "\n\n# DO NOT DELETE\n" >> $MAKEF
3185    
3186  printf "\n===  Done  ===\n"  printf "\n===  Done  ===\n"
3187    
3188  #  Write the "template" files for the adjoint builds  # Create special header files
3189  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"
3190  C  WARNING: This file is automatically generated by genmake2 and  if test ! -f $PACKAGES_DOT_H ; then
3191  C    used by the Makefile rules.  Please DO NOT EDIT this file      mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
3192  C    unless you are CERTAIN that you know what you are doing.  else
3193        cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H > /dev/null 2>&1
3194  #undef ALLOW_ADJOINT_RUN      RETVAL=$?
3195  #undef ALLOW_TANGENTLINEAR_RUN      if test "x$RETVAL" = x0 ; then
3196  #undef ALLOW_ECCO_OPTIMIZATION          rm -f $PACKAGES_DOT_H".tmp"
3197  EOF      else
3198  cat >ad_config.template <<EOF          mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"
3199  C  WARNING: This file is automatically generated by genmake2 and          mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
3200  C    used by the Makefile rules.  Please DO NOT EDIT this file      fi
3201  C    unless you are CERTAIN that you know what you are doing.  fi
3202    if test ! -f AD_CONFIG.h ; then
3203  #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
3204  #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  
3205    
3206    
3207  #  Write the "state" for future records  #  Write the "state" for future records
3208  if test "x$DUMPSTATE" != xf ; then  if test "x$DUMPSTATE" != xf ; then
3209      echo -n "" > genmake_state      printf "" > genmake_state
3210      for i in $gm_state ; do      for i in $gm_state ; do
3211          t1="t2=\$$i"          t1="t2=\$$i"
3212          eval $t1          eval $t1

Legend:
Removed from v.1.32  
changed lines
  Added in v.1.206

  ViewVC Help
Powered by ViewVC 1.1.22