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

Legend:
Removed from v.1.4  
changed lines
  Added in v.1.208

  ViewVC Help
Powered by ViewVC 1.1.22