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

Legend:
Removed from v.1.31  
changed lines
  Added in v.1.210

  ViewVC Help
Powered by ViewVC 1.1.22