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

Legend:
Removed from v.1.11.2.3  
changed lines
  Added in v.1.213

  ViewVC Help
Powered by ViewVC 1.1.22