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

Legend:
Removed from v.1.36  
changed lines
  Added in v.1.209

  ViewVC Help
Powered by ViewVC 1.1.22