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

Legend:
Removed from v.1.9  
changed lines
  Added in v.1.218

  ViewVC Help
Powered by ViewVC 1.1.22