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

Legend:
Removed from v.1.11  
changed lines
  Added in v.1.217

  ViewVC Help
Powered by ViewVC 1.1.22