/[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.3 by cnh, Fri Aug 22 20:50:40 2003 UTC revision 1.216 by jmc, Mon Dec 13 22:07:20 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        -help | --help | -h | --h
20              Print this help message and exit.
21    
22        -adoptfile NAME | --adoptfile NAME | -adof NAME | --adof NAME
23          -adoptfile=NAME | --adoptfile=NAME | -adof=NAME | --adof=NAME
24              Use "NAME" as the adoptfile.  By default, the file at
25              "tools/adjoint_options/adjoint_default" will be used.
26    
27        -nooptfile | --nooptfile
28          -optfile NAME | --optfile NAME | -of NAME | --of NAME
29          -optfile=NAME | --optfile=NAME | -of=NAME | --of=NAME
30              Use "NAME" as the optfile.  By default, an attempt will be
31              made to find an appropriate "standard" optfile in the
32              tools/build_options/ directory.
33    
34        -pdepend NAME | --pdepend NAME
35          -pdepend=NAME | --pdepend=NAME
36              Get package dependency information from "NAME".
37    
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      p_PLATFORM=`uname`"-"`uname -m`  # Search for particular CPP #cmds associated with packages
174      echo "The platform appears to be:"  # usage: test_for_package_in_cpp_options CPP_file package_name
175      echo "  "$p_PLATFORM  test_for_package_in_cpp_options() {
176        cpp_options=$1
177      p_LN=      pkg=$2
178      echo "test" > test      test_for_string_in_file $cpp_options "^[ ]*#define.*ALLOW_$pkg[ ]"
179      ln -s ./test link      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          p_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
241            echo "Warning: can't read package groups definition file: $PKG_GROUPS"
242        fi
243    }
244    
245    #  Check for broken environments (eg. cygwin, MacOSX w/HFS+) that
246    #  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
257    
258        #  First check the ability to create a *.F/.f pair.
259        cat <<EOF >> genmake_hello.F
260          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      fi
284      rm -f test link      rm -f genmake_hello.*
285    
286      p_CPP=`which cpp`      #  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=$?      RETVAL=$?
303      if test "x${RETVAL}" = x0 ; then      if test "x$RETVAL" != x0 -o ! -f "genmake_hello."$tfs ; then
304          p_LN="ln -s"          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      fi
320      rm -f test link      rm -f genmake_hello.* $MAKEFILE
321        test -f $MAKEFILE".tst"  &&  mv -f $MAKEFILE".tst" $MAKEFILE
322    
323      # look for possible fortran compilers      #  If we make it here, use the extensions
324      p_FC=      FS=$tfs
325      for c in f77 g77 pgf77 pgf95 ifc f90 f95 mpif77 mpf77 mpxlf95 ; do      FS90=$tfs9
326          which $c > /dev/null 2>&1      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
465            COMM="$c $CFLAGS -o genmake_hello genmake_hello.c"
466            echo $COMM >> $LOGFILE
467            $COMM >> $LOGFILE 2>&1
468          RETVAL=$?          RETVAL=$?
469          if test "x${RETVAL}" = x0 ; then          if test "x${RETVAL}" = x0 ; then
470              p_FC="$p_FC $c"              echo " $c test successful" >> $LOGFILE
471                p_CC="$p_CC $c"
472          fi          fi
473      done      done
474      echo "Possible FORTRAN compilers appear to be:  "      rm -f ./genmake_hello.c ./genmake_hello
475      if test "x${p_FC}" = x ; then      if test "x${p_CC}" = x ; then
476          echo "  None found!!!"          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      else
486          echo "  "$p_FC          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      fi
492        echo " --> set CC='$CC'" >> $LOGFILE
493    }
494    
495      # look for possible MPI libraries  # Guess possible config options for this host
496      mpi_libs=  find_possible_optfile()  {
497      mpi_fort=`which mpif77 2>/dev/null`  
498      RETVAL=$?      echo >> $LOGFILE
499      if test "x${RETVAL}" = x0 ; then      echo "running: find_possible_optfile()" >> $LOGFILE
500          cat >>test.f <<EOF      tmp1=`uname`"_"`uname -m`
501        PROGRAM HELLO      tmp2=`echo $tmp1 | sed -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
502        DO 10, I=1,10      tmp3=`echo $tmp2 | sed -e 's/power macintosh/ppc/'`
503        PRINT *,'Hello World'      tmp1=`echo $tmp3 | sed -e 's|x86_64|amd64|'`
504     10 CONTINUE      tmp2=`echo $tmp1 | sed -e 's/i[3-6]86/ia32/' | sed -e 's/athlon/ia32/'`
505        STOP      tmp3=`echo $tmp2 | sed -e 's/cray sv1/craysv1/'`
506        END      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
519          do i=1,3
520            print *, 'hello world : ', i
521          enddo
522          end
523  EOF  EOF
524          eval "$mpi_fort -showme test.f > out"      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              a=`cat out`              echo " $f test successful" >> $LOGFILE
531              for i in $a ; do              p_FC="$p_FC $f"
                 case $i in  
                     -*)  
                         mpi_libs="$mpi_libs $i" ;;  
                 esac  
             done  
             echo "The MPI libs appear to be:"  
             echo "  "$mpi_libs  
532          fi          fi
533          rm -f test.f out      done
534        rm -f ./genmake_hello.f ./genmake_hello
535        if test "x${p_FC}" = x ; then
536            cat 1>&2 <<EOF
537    
538    Error: No Fortran compilers were found in your path.  Please specify one using:
539    
540        1) an "optfile" on (eg. "-optfile=path/to/OPTFILE"),
541        2) a command-line option (eg. "-fc NAME"), or
542        3) the FC or MITGCM_FC environment variables.
543    
544    EOF
545            exit 1
546        else
547            echo "  The possible FORTRAN compilers found in your path are: $p_FC" | tee -a $LOGFILE
548      fi      fi
549    
550  }      #  Use the first of the compilers found in the current PATH
551        #  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  parse_options()  {      if test "x$OPTFILE" = x ; then
563            OPTFILE=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$FC
564      ac_prev=          if test ! -r $OPTFILE ; then
565      for ac_option in "${OPTIONS[@]}" ; do               echo "  I looked for the file "$OPTFILE" but did not find it"
566            fi
567          # echo "ac_option = :$ac_option:"      fi
568            
569          # If the previous option needs an argument, assign it.      if test "x$OPTFILE" = x ; then
570          if test -n "$ac_prev"; then          cat 1>&2 <<EOF
571              eval "$ac_prev=\$ac_option"  
572              ac_prev=  Error: No options file was found in:  $ROOTDIR/tools/build_options/
573              continue    that matches this platform ("$PLATFORM") and the compilers found in
574          fi    your path.  Please specify an "optfile" using:
575            
576          ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`      1) the command line (eg. "-optfile=path/to/OPTFILE"), or
577                2) the MITGCM_OF environment variable.
578          case $ac_option in  
579                  If you need help, please contact the developers at <MITgcm-support@mitgcm.org>.
580              -help | --help | -h | --h)  
581                  usage ;;  EOF
582                        exit 1
583              -nooptfile | --nooptfile)      fi
584                  OPTFILE="NONE" ;;  
585              -optfile | --optfile | -of | --of)  #     # look for possible MPI libraries
586                  ac_prev=optfile ;;  #     mpi_libs=
587              -optfile=* | --optfile=* | -of=* | --of=*)  #     mpi_fort=`which mpif77 2>/dev/null`
588                  OPTFILE=$ac_optarg ;;  #     RETVAL=$?
589                #     if test "x${RETVAL}" = x0 ; then
590              -pdepend | --pdepend)  #       cat >>test.f <<EOF
591                  ac_prev=pdepend ;;  #       PROGRAM HELLO
592              -pdepend=* | --pdepend=*)  #       DO 10, I=1,10
593                  PDEPEND=$ac_optarg ;;  #       PRINT *,'Hello World'
594                #    10 CONTINUE
595              -pdefault | --pdefault)  #       STOP
596                  ac_prev=pdefault ;;  #       END
597              -pdefault=* | --pdefault=*)  # EOF
598                  PDEFAULT=$ac_optarg ;;  #       eval "$mpi_fort -showme test.f > out"
599                #       RETVAL=$?
600              -makefile | -ma)  #       if test "x${RETVAL}" = x0 ; then
601                  ac_prev=makefile ;;  #           a=`cat out`
602              --makefile=* | -ma=*)  #           for i in $a ; do
603                  MAKEFILE=$ac_optarg ;;  #               case $i in
604                #                   -*)
605              -platform | --platform | -pl | --pl)  #                       mpi_libs="$mpi_libs $i" ;;
606                  ac_prev=platform ;;  #               esac
607              -platform=* | --platform=* | -pl=* | --pl=*)  #           done
608                  PLATFORM=$ac_optarg ;;  #           echo "The MPI libs appear to be:"
609    #           echo "  "$mpi_libs
610              -rootdir | --rootdir | -rd | --rd)  #       fi
611                  ac_prev=rootdir ;;  #       rm -f test.f out
612              -rootdir=* | --rootdir=* | -rd=* | --rd=*)  #     fi
                 ROOTDIR=$ac_optarg ;;  
               
             -mods | --mods | -mo | --mo)  
                 ac_prev=mods ;;  
             -mods=* | --mods=* | -mo=* | --mo=*)  
                 MODS=$ac_optarg ;;  
               
             -disable | --disable)  
                 ac_prev=disable ;;  
             -disable=* | --disable=*)  
                 DISABLE=$ac_optarg ;;  
               
             -enable | --enable)  
                 ac_prev=enable ;;  
             -enable=* | --enable=*)  
                 ENABLE=$ac_optarg ;;  
               
             -noopt | --noopt)  
                 ac_prev=noopt ;;  
             -noopt=* | --noopt=*)  
                 NOOPT=$ac_optarg ;;  
               
 #           -cpp | --cpp)  
 #               ac_prev=cpp ;;  
 #           -cpp=* | --cpp=*)  
 #               CPP=$ac_optarg ;;  
               
             -fortran | --fortran | -fc | --fc)  
                 ac_prev=fc ;;  
             -fc=* | --fc=*)  
                 FC=$ac_optarg ;;  
               
             -ieee | --ieee)  
                 IEEE=1 ;;  
             -noieee | --noieee)  
                 IEEE=0 ;;  
               
             -mpi | --mpi)  
                 MPI=1 ;;  
             -nompi | --nompi)  
                 MPI=0 ;;  
               
             -jam | --jam)  
                 JAM=1 ;;  
             -nojam | --nojam)  
                 JAM=0 ;;  
               
             -*)  
                 echo "Error: unrecognized option: "$ac_option  
                 usage  
                 ;;  
               
             *)  
                 echo "Error: unrecognized argument: "$ac_option  
                 usage  
                 ;;  
               
         esac  
           
     done  
613  }  }
614    
615  #  Parse the package dependency information  #  Parse the package dependency information
# Line 199  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    #  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      echo -n "PNAME = "${}      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 "    -makefile NAME | -ma NAME"  
790      echo "      --makefile=NAME | -ma=NAME"  int * ip;
791      echo "    -platform NAME | --platform NAME | -pl NAME | --pl NAME"  
792      echo "      -platform=NAME | --platform=NAME | -pl=NAME | --pl=NAME"  static void killhandler(
793      echo "    -rootdir NAME | --rootdir NAME | -rd NAME | --rd NAME"      unsigned int sn, siginfo_t  si, struct ucontext *sc )
794      echo "      -rootdir=NAME | --rootdir=NAME | -rd=NAME | --rd=NAME"  {
795      echo "    -mods NAME | --mods NAME | -mo NAME | --mo NAME"      *ip = *ip + 1;
796      echo "      -mods=NAME | --mods=NAME | -mo=NAME | --mo=NAME"      return;
     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  # Dump all important state  void FC_NAMEMANGLE(sigreg) (int * aip)
800  dump_state()  {  {
801      fname=$1      struct sigaction s;
802      echo " " > $fname      ip = aip;
803        s.sa_flags = SA_SIGINFO;
804        s.sa_sigaction = (void *)killhandler;
805        if(sigaction (SIGTERM,&s,(struct sigaction *)NULL)) {
806            printf("Sigaction returned error = %d\n", errno);
807            exit(0);
808        }
809        return;
810    }
811    EOF
812        COMM="$CC $CFLAGS -c genmake_tc_1.c"
813        echo $COMM >> $LOGFILE
814        $COMM >> $LOGFILE 2>&1
815        RET_C=$?
816        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=$?      RETVAL=$?
829      if test "x${RETVAL}" = x ; then      if test "x$RETVAL" = x0 ; then
830          echo "Error: cannot write to $fname"          HAVE_SIGREG=t
831          exit 1          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      fi
945      echo "makefile "$makefile > $fname      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  #eh3 # This is the generic configuration.  ###############################################################################
1026  #eh3 set LN         = ( 'ln -s' )  #   Sequential part of script starts here
1027  #eh3 set CPP        = ( '/lib/cpp -P' )  ###############################################################################
 #eh3 set S64        = ( '$(TOOLSDIR)/set64bitConst.sh' )  
 #eh3 set KPP        = (  )  
 #eh3 set FC         = ( 'f77' )  
 #eh3 set LINK       = $FC  
 #eh3 set MAKEDEPEND = ( 'makedepend' )  
 #eh3 set INCLUDES   = ( -I. )  
 #eh3 set FFLAGS     = (  )  
 #eh3 set FOPTIM     = (  )  
 #eh3 set CFLAGS     = (  )  
 #eh3 set KFLAGS1    = (  )  
 #eh3 set KFLAGS2    = (  )  
 #eh3 set LIBS       = (  )  
 #eh3 set KPPFILES   = (  )  
 #eh3 if (! $?NOOPTFILES ) set NOOPTFILES = (  )  
 #eh3 if (! $?NOOPTFLAGS ) set NOOPTFLAGS = (  )  
1028    
1029  #  Set defaults here  #  Set defaults here
1030    COMMANDL="$0 $@"
1031    
1032  PLATFORM=  PLATFORM=
1033  LN=  LN=
1034  S64=  S64=
1035  KPP=  KPP=
1036  FC=  #FC=
1037    #CC=gcc
1038    #CPP=
1039  LINK=  LINK=
1040    DEFINES=
1041  PACKAGES=  PACKAGES=
1042  ENABLE=  ENABLE=
1043  DISABLE=  DISABLE=
1044  MAKEFILE=  # MAKEFILE=
1045  MAKEDEPEND=  # MAKEDEPEND=
1046  PDEPEND=  PKG_DEPEND=
1047  PDEFAULT=  PKG_GROUPS=
1048    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=
1111    EXEHOOK=
1112    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
1135    gm_s1="OPTFILE PKG_DEPEND PKG_GROUPS MAKEFILE MAKEDEPEND PLATFORM ROOTDIR MODS DISABLE ENABLE"
1136    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
1139    gm_s3="LN S64 LINK MAKE PACKAGES INCLUDES FFLAGS FOPTIM FEXTRAFLAGS"
1140    gm_s4="CFLAGS LIBS KPP KFLAGS1 KFLAGS2 KPPFILES NOOPTFILES NOOPTFLAGS"
1141    gm_s5="TOOLSDIR SOURCEDIRS INCLUDEDIRS PWD THISHOST THISUSER THISDATE THISVER MACHINE"
1142    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    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 359  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 370  for ac_option ; do Line 1201  for ac_option ; do
1201          -nooptfile | --nooptfile)          -nooptfile | --nooptfile)
1202              OPTFILE="NONE" ;;              OPTFILE="NONE" ;;
1203          -optfile | --optfile | -of | --of)          -optfile | --optfile | -of | --of)
1204              ac_prev=optfile ;;              ac_prev=OPTFILE ;;
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          -makefile | -ma)          -make | --make | -m | --m)
1224              ac_prev=makefile ;;              ac_prev=MAKE ;;
1225          --makefile=* | -ma=*)          -make=* | --make=* | -m=* | --m=*)
1226                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)
1239                ac_prev=MAKEFILE ;;
1240            -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 ;;
1252          -rootdir=* | --rootdir=* | -rd=* | --rd=*)          -rootdir=* | --rootdir=* | -rd=* | --rd=*)
1253              ROOTDIR=$ac_optarg ;;              ROOTDIR=$ac_optarg ;;
1254                    
1255          -mods | --mods | -mo | --mo)          -mods | --mods | -mo | --mo)
1256              ac_prev=mods ;;              ac_prev=MODS ;;
1257          -mods=* | --mods=* | -mo=* | --mo=*)          -mods=* | --mods=* | -mo=* | --mo=*)
1258              MODS=$ac_optarg ;;              MODS=$ac_optarg ;;
1259                    
1260          -disable | --disable)          -disable | --disable)
1261              ac_prev=disable ;;              ac_prev=DISABLE ;;
1262          -disable=* | --disable=*)          -disable=* | --disable=*)
1263              DISABLE=$ac_optarg ;;              DISABLE=$ac_optarg ;;
1264                    
1265          -enable | --enable)          -enable | --enable)
1266              ac_prev=enable ;;              ac_prev=ENABLE ;;
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)
1342                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 455  for ac_option ; do Line 1368  for ac_option ; do
1368              ;;              ;;
1369                    
1370      esac      esac
       
 done  
   
 echo "  getting OPTFILE information:  "  
 if test "x${OPTFILE}" = x ; then  
     echo "Warning: no OPTFILE specified so we'll look for possible settings"  
     printf "\n===  Searching for possible settings for OPTFILE  ===\n"  
     find_possible_configs  
 else  
     if test "x$OPTFILE" = xNONE ; then  
         echo "    OPTFILE=NONE so we'll try to use default settings"  
     else  
         if test -f "$OPTFILE" -a -r "$OPTFILE" ; then  
             echo "    using OPTFILE=\"$OPTFILE\""  
             source "$OPTFILE"  
             RETVAL=$?  
             if test "x$RETVAL" != x0 ; then  
                 echo -n "Error: failed to source OPTFILE \"$OPTFILE\""  
                 echo "--please check that variable syntax is bash-compatible"  
                 exit 1  
             fi  
         else  
             echo "Error: can't read OPTFILE=\"$OPTFILE\""  
             exit 1  
         fi  
     fi  
 fi  
1371    
 printf "\n===  Setting defaults  ===\n"  
 echo -n "  Adding MODS directories:  "  
 for d in $MODS ; do  
     if test ! -d $d ; then  
         echo  
         echo "Error: MODS directory \"$d\" not found!"  
         exit 1  
     else  
         echo -n " $d"  
         SOURCEDIRS="$SOURCEDIRS $d"  
         INCLUDEDIRS="$INCLUDEDIRS $d"  
     fi  
1372  done  done
 echo  
1373    
1374  if test "x$MAKEFILE" = x ; then  if test -f ./.genmakerc ; then
1375      MAKEFILE="Makefile"      echo
1376  fi      echo "WARNING: genmake2 has detected a copy of the old-style \"./.genmakerc\""
1377  if test "x${PLATFORM}" = x ; then      echo "  file.  This file format is no longer supported.  For directions on"
1378      PLATFORM=$p_PLATFORM      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  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 530  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:  "
1428    if test "x${OPTFILE}" = x ; then
1429        if test "x$MITGCM_OF" = x ; then
1430            echo "Warning: no OPTFILE specified so we'll look for possible settings"
1431            printf "\n===  Searching for possible settings for OPTFILE  ===\n"
1432            find_possible_optfile
1433        else
1434            OPTFILE=$MITGCM_OF
1435        fi
1436    fi
1437    if test "x$OPTFILE" != xNONE ; then
1438        if test -f "$OPTFILE" -a -r "$OPTFILE" ; then
1439            echo "    using OPTFILE=\"$OPTFILE\""
1440            . "$OPTFILE"
1441            RETVAL=$?
1442            if test "x$RETVAL" != x0 ; then
1443                printf "Error: failed to source OPTFILE \"$OPTFILE\""
1444                echo "--please check that variable syntax is bash-compatible"
1445                exit 1
1446            fi
1447            if test "x$DUMPSTATE" = xt ; then
1448                cp -f $OPTFILE "genmake_optfile"
1449            fi
1450        else
1451            echo "Error: can't read OPTFILE=\"$OPTFILE\""
1452            exit 1
1453        fi
1454    fi
1455    
1456    echo "  getting AD_OPTFILE information:  "
1457    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
1493        cat <<EOF 1>&2
1494    
1495    Error: no Fortran compiler: please specify using one of the following:
1496      1) within the options file ("FC=...") as specified by "-of=OPTFILE"
1497      2) the "-fc=XXX" command-line option
1498      3) the "./genmake_local" file
1499    EOF
1500        exit 1
1501    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
1513        LINK=$FC
1514    fi
1515    if test "x$MAKE" = x ; then
1516        MAKE="make"
1517    fi
1518    if test "x$CPP" = x ; then
1519        CPP="cpp -traditional -P"
1520    fi
1521    #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=$?
1532    if test "x$RETVAL" != x0 ; then
1533        cat <<EOF 1>&2
1534    
1535    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"
1538      2) the "./genmake_local" file
1539      3) with the CPP environment variable
1540    
1541    EOF
1542        exit 1
1543    else
1544        rm -f test_cpp
1545    fi
1546    
1547    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
1795    
1796    printf "\n===  Setting defaults  ===\n"
1797    printf "  Adding MODS directories: "
1798    for d in $MODS ; do
1799        if test ! -d $d ; then
1800            echo
1801            echo "Error: MODS directory \"$d\" not found!"
1802            exit 1
1803        else
1804            printf "$d "
1805            SOURCEDIRS="$SOURCEDIRS $d"
1806            INCLUDEDIRS="$INCLUDEDIRS $d"
1807        fi
1808    done
1809    echo
1810    
1811    #if test "x${PLATFORM}" = x ; then
1812    #    PLATFORM=$p_PLATFORM
1813    #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=.
1821      fi      fi
1822  fi  fi
1823  if test ! -d ${EXEDIR} ; then  if test ! -d ${EXEDIR} ; then
1824      echo "Error:  the specified EXEDIR (\"$EXEDIR\") does not exist!"      echo "Error:  the specified EXEDIR (\"$EXEDIR\") does not exist!"
1825      exit 1      exit 1
1826  fi  fi
1827    
1828    if test "x${TOOLSDIR}" = x ; then
1829        TOOLSDIR="$ROOTDIR/tools"
1830    fi
1831    if test ! -d ${TOOLSDIR} ; then
1832        echo "Error: the specified TOOLSDIR (\"$TOOLSDIR\") does not exist!"
1833        exit 1
1834    fi
1835    if test "x$S64" = x ; then
1836        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
1861    THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`
1862    
1863  if test "x${TOOLSDIR}" = x ; then  EXECUTABLE=${EXECUTABLE:-mitgcmuv}
1864      TOOLSDIR="$ROOTDIR/tools"  
1865    #  Set Standard Code Directories:
1866    if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
1867        STANDARDDIRS="eesupp model"
1868  fi  fi
1869  if test ! -d ${TOOLSDIR} ; then  #  if model in Standard-Code-Dir, add eesupp (needed to compile model)
1870      echo "Error: the specified $TOOLSDIR (\"$TOOLSDIR\") does not exist!"  echo " $STANDARDDIRS " | grep ' model ' > /dev/null 2>&1
1871      exit 1  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  fi
1877    
 EXECUTABLE=${EXECUTABLE:-mitgcmuv}  
   
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 639  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 674  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 696  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 716  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 "  Setting package-specific CPP flags in CPP_OPTIONS.h:"  
 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 edit  
 C  them only if you know what you're doing.  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 807  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  alldirs=". $SOURCEDIRS $INCLUDEDIRS"  printf 'H_SRC_FILES = '   > hsrclist.tmp
2406    printf 'AD_FLOW_FILES = ' > ad_flow_files.tmp
2407    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 946  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 970  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 994  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 1005  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          ../../../tools/f90mkdepend >> \$(MAKEFILE)          \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
2672            -rm -f makedepend.out
2673    
2674    lib: libmitgcmuv.a
2675    
2676    libmitgcmuv.a: \$(OBJFILES)
2677            ar rcv libmitgcmuv.a \$(OBJFILES)
2678            ar d   libmitgcmuv.a main.o
2679    
2680  links: \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES)  links: \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(SPECIAL_FILES)
2681    
2682  small_f: \$(F77FILES) \$(F90FILES)  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
3179        printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE
3180    fi
3181    
3182  echo "  Making list of \"exceptions\" that need \".p\" files"  echo "  Making list of \"exceptions\" that need \".p\" files"
3183  for i in $KPPFILES ; do  for i in $KPPFILES ; do
3184      base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`      base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
# Line 1098  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 1108  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 1120  echo "  Adding makedepend marker" Line 3208  echo "  Adding makedepend marker"
3208  printf "\n\n# DO NOT DELETE\n" >> $MAKEFILE  printf "\n\n# DO NOT DELETE\n" >> $MAKEFILE
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
3231    if test "x$DUMPSTATE" = xt ; then
3232        printf "" > genmake_state
3233        for i in $gm_state ; do
3234            t1="t2=\$$i"
3235            eval $t1
3236            echo "$i='$t2'" >> genmake_state
3237        done
3238    fi

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.216

  ViewVC Help
Powered by ViewVC 1.1.22