/[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.75 by edhill, Wed Apr 7 20:28:09 2004 UTC revision 1.204 by jmc, Wed Mar 10 15:49:54 2010 UTC
# Line 13  Line 13 
13  test_for_package_in_cpp_options() {  test_for_package_in_cpp_options() {
14      cpp_options=$1      cpp_options=$1
15      pkg=$2      pkg=$2
16      test_for_string_in_file $cpp_options "^[ ]*#define.*ALLOW_$pkg" || exit 99      test_for_string_in_file $cpp_options "^[ ]*#define.*ALLOW_$pkg[ ]"
17      test_for_string_in_file $cpp_options "^[ ]*#undef.*ALLOW_$pkg" || exit 99      test_for_string_in_file $cpp_options "^[ ]*#undef.*ALLOW_$pkg[ ]"
18      test_for_string_in_file $cpp_options "^[ ]*#define.*DISABLE_$pkg" || exit 99      test_for_string_in_file $cpp_options "^[ ]*#define.*DISABLE_$pkg[ ]"
19      test_for_string_in_file $cpp_options "^[ ]*#undef.*DISABLE_$pkg" || exit 99      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  # Search for particular CPP #cmds associated with MPI
27  # usage: test_for_mpi_in_cpp_eeoptions CPP_file  # usage: test_for_mpi_in_cpp_eeoptions CPP_file
28  test_for_mpi_in_cpp_eeoptions() {  test_for_mpi_in_cpp_eeoptions() {
29      cpp_options=$1      cpp_options=$1
30      test_for_string_in_file $cpp_options "^[ ]*#define.*ALLOW_USE_MPI" || exit 99      test_for_string_in_file $cpp_options "^[ ]*#define.*ALLOW_USE_MPI[ ]"
31      test_for_string_in_file $cpp_options "^[ ]*#undef.*ALLOW_USE_MPI" || exit 99      test_for_string_in_file $cpp_options "^[ ]*#undef.*ALLOW_USE_MPI[ ]"
32      test_for_string_in_file $cpp_options "^[ ]*#define.*ALWAYS_USE_MPI" || exit 99      test_for_string_in_file $cpp_options "^[ ]*#define.*ALWAYS_USE_MPI[ ]"
33      test_for_string_in_file $cpp_options "^[ ]*#undef.*ALWAYS_USE_MPI" || exit 99      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  # Search for particular string in a file. Return 1 if detected, 0 if not
# Line 39  test_for_string_in_file() { Line 47  test_for_string_in_file() {
47      if test "x${RETVAL}" = x0 ; then      if test "x${RETVAL}" = x0 ; then
48          printf "Error: In $file there is an illegal line: "          printf "Error: In $file there is an illegal line: "
49          grep -i "$strng" $file          grep -i "$strng" $file
50          return 1          exit 99
51      fi      fi
52      return 0      return 0
53  }  }
# Line 76  expand_pkg_groups() { Line 84  expand_pkg_groups() {
84  #  Check for broken environments (eg. cygwin, MacOSX w/HFS+) that  #  Check for broken environments (eg. cygwin, MacOSX w/HFS+) that
85  #  cannot distinguish [*.F/*.F90] from [*.f/*.f90] files.  #  cannot distinguish [*.F/*.F90] from [*.f/*.f90] files.
86  check_for_broken_Ff()  {  check_for_broken_Ff()  {
87        #  Do we have defaults for $FS and/or $FS90 ?
88        tfs=f
89        tfs9=f90
90        if test "x$FS" != x ; then
91            tfs="$FS"
92        fi
93        if test "x$FS90" != x ; then
94            tfs9="$FS90"
95        fi
96    
97      #  First check the ability to create a *.F/.f pair.      #  First check the ability to create a *.F/.f pair.
98      cat <<EOF >> ./hello.F      cat <<EOF >> genmake_hello.F
99        program hello        program hello
100        write(*,*) 'hi'        write(*,*) 'hi'
101        stop        stop
102        end        end
103  EOF  EOF
104      cp ./hello.F ./hello.f      cp genmake_hello.F "genmake_hello."$tfs > /dev/null 2>&1
105      RETVAL=$?      RETVAL=$?
106      if test "x$RETVAL" != x0 ; then      if test "x$RETVAL" != x0 ; then
107          FEXT='fp'          if test "x$FS" = x ; then
108          F90EXT='fp90'              FS='for'
109                FS90='fr9'
110                check_for_broken_Ff
111            else
112                cat <<EOF 2>&1
113    ERROR: Your file system cannot distinguish between *.F and *.f files
114      (fails the "cp" test) and this program cannot find a suitable
115      replacement extension.  Please try a different build environment or
116      contact the <MITgcm-support@mitgcm.org> list for help.
117    
118    EOF
119                exit -1
120            fi
121          return          return
122      fi      fi
123      rm -f ./hello.f      rm -f genmake_hello.*
124    
125      #  Then check the ability of ${MAKE} to use the two.      #  Check the ability of ${MAKE} and ${LN} to use the current set
126      test -e Makefile  &&  mv -f Makefile Makefile.bak      #  of extensions.
127      cat <<EOF >> Makefile      cat <<EOF >> genmake_hello.F
128          program hello
129          write(*,*) 'hi'
130          stop
131          end
132    EOF
133        test -f $MAKEFILE  &&  mv -f $MAKEFILE $MAKEFILE".tst"
134        cat <<EOF >> $MAKEFILE
135  .SUFFIXES:  .SUFFIXES:
136  hello.f: hello.F  .SUFFIXES: .$tfs .F
137          cp -f hello.F hello.f  .F.$tfs:
138            $LN \$< \$@
139  EOF  EOF
140      ( $MAKE hello.f ) > /dev/null 2>&1      $MAKE "genmake_hello."$tfs > /dev/null 2>&1
141      RETVAL=$?      RETVAL=$?
142      if test "x$RETVAL" != x0 -o ! -f ./hello.f ; then      if test "x$RETVAL" != x0 -o ! -f "genmake_hello."$tfs ; then
143          FEXT='fp'          if test "x$FS" = x ; then
144          F90EXT='fp90'              FS='for'
145          return              FS90='fr9'
146                check_for_broken_Ff
147            else
148                cat <<EOF 2>&1
149    ERROR: Your file system cannot distinguish between *.F and *.f files
150      (fails the "make/ln" test) and this program cannot find a suitable
151      replacement extension.  Please try a different build environment or
152      contact the <MITgcm-support@mitgcm.org> list for help.
153    
154    EOF
155                exit -1
156                return
157            fi
158        fi
159        rm -f genmake_hello.* $MAKEFILE
160        test -f $MAKEFILE".tst"  &&  mv -f $MAKEFILE".tst" $MAKEFILE
161    
162        #  If we make it here, use the extensions
163        FS=$tfs
164        FS90=$tfs9
165        return
166    }
167    
168    
169    look_for_makedepend()  {
170    
171        #  The "original" makedepend is part of the Imake system that is
172        #  most often distributed with XFree86 or with an XFree86 source
173        #  package.  As a result, many machines (eg. generic Linux) do not
174        #  have a system-default "makedepend" available.  For those
175        #  systems, we have two fall-back options:
176        #
177        #    1) a makedepend implementation shipped with the cyrus-imapd
178        #       package:  ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/
179        #
180        #    2) a known-buggy xmakedpend shell script
181        #
182        #  So the choices are, in order:
183        #
184        #    1) use the user-specified program
185        #    2) use a system-wide default
186        #    3) locally build and use the cyrus implementation
187        #    4) fall back to the buggy local xmakedpend script
188        #
189        if test "x${MAKEDEPEND}" = x ; then
190            which makedepend > /dev/null 2>&1
191            RV0=$?
192            test -f $MAKEFILE  &&  mv -f $MAKEFILE $MAKEFILE".tst"
193            #  echo 'MAKEFILE="'$MAKEFILE'"'
194            cat <<EOF >> $MAKEFILE
195    #   THIS IS A TEST MAKEFILE GENERATED BY "genmake2"
196    #
197    #   Some "makedepend" implementations will die if they cannot
198    #   find a Makefile -- so this file is here to gives them an
199    #   empty one to find and parse.
200    EOF
201            cat <<EOF >> genmake_tc.f
202          program test
203          write(*,*) 'test'
204          stop
205          end
206    EOF
207            makedepend genmake_tc.f > /dev/null 2>&1
208            RV1=$?
209            test -f $MAKEFILE  &&  rm -f $MAKEFILE
210            test -f $MAKEFILE".tst"  &&  mv -f $MAKEFILE".tst" $MAKEFILE
211            if test "x${RV0}${RV1}" = x00 ; then
212                MAKEDEPEND=makedepend
213            else
214                echo "    a system-default makedepend was not found."
215                
216                #  Try to build the cyrus implementation
217                build_cyrus_makedepend
218                RETVAL=$?
219                if test "x$RETVAL" != x0 ; then
220                    MAKEDEPEND='$(TOOLSDIR)/xmakedepend'
221                fi
222                rm -f ./genmake_cy_md
223            fi
224        else
225            #  echo "MAKEDEPEND=${MAKEDEPEND}"
226            echo "${MAKEDEPEND}" | grep -i cyrus > /dev/null 2>&1
227            RETVAL=$?
228            if test x"$RETVAL" = x0 ; then
229                build_cyrus_makedepend
230            fi
231        fi
232    }
233    
234    
235    build_cyrus_makedepend()  {
236        rm -f ./genmake_cy_md
237        (
238            cd $ROOTDIR/tools/cyrus-imapd-makedepend  \
239                &&  ./configure > /dev/null 2>&1  \
240                &&  make > /dev/null 2>&1
241            if test -x ./makedepend.exe ; then
242                $LN ./makedepend.exe ./makedepend
243            fi
244            ./makedepend ifparser.c > /dev/null 2>&1  \
245                &&  echo "true"
246        ) > ./genmake_cy_md
247        grep true ./genmake_cy_md > /dev/null 2>&1
248        RETVAL=$?
249        rm -f ./genmake_cy_md
250        if test "x$RETVAL" = x0 ; then
251            MAKEDEPEND='$(TOOLSDIR)/cyrus-imapd-makedepend/makedepend'
252            return 0
253        else
254            echo "WARNING: unable to build cyrus-imapd-makedepend"
255            return 1
256      fi      fi
257      rm -f ./hello.f ./hello.F Makefile  }
258      test -e Makefile  &&  mv -f Makefile.bak Makefile  
259    
260      #  Both tests passed, so use the default.  build_embed_encode()
261      FEXT='F'  {
262      F90EXT='F90'      printf "  building the embed-encode utility...  "
263        if test ! -e "$ROOTDIR/tools/embed_encode/encode_files" ; then
264            if test ! -d "$ROOTDIR/tools/embed_encode" ; then
265                echo
266                echo "    Error: can't locate \"$ROOTDIR/tools/embed_encode\""
267                echo
268                EMBED_SRC=f
269                return 1
270            fi
271            clist="cc gcc c89 $CC"
272            for ic in $clist ; do
273                comm="$ic -o encode_files encode_files.c"
274                ( cd $ROOTDIR/tools/embed_encode && $comm ) > /dev/null 2>&1
275                RETVAL=$?
276                if test "x$RETVAL" = x0 ; then
277                    echo "OK"
278                    DEFINES="$DEFINES -DHAVE_EMBED_SRC"
279                    return 0
280                fi
281            done
282            echo
283            echo "    Error: unable to build $ROOTDIR/embed_encode/encode_files"
284            echo "      so it has been disabled"
285            echo
286            EMBED_SRC=f
287            return 1
288        fi
289        echo "OK"
290        DEFINES="$DEFINES -DHAVE_EMBED_SRC"
291  }  }
292    
293    
# Line 125  find_possible_configs()  { Line 301  find_possible_configs()  {
301      tmp2=`echo $tmp1 | sed -e 's/i[3-6]86/ia32/' | sed -e 's/athlon/ia32/'`      tmp2=`echo $tmp1 | sed -e 's/i[3-6]86/ia32/' | sed -e 's/athlon/ia32/'`
302      tmp3=`echo $tmp2 | sed -e 's/cray sv1/craysv1/'`      tmp3=`echo $tmp2 | sed -e 's/cray sv1/craysv1/'`
303      PLATFORM=$tmp3      PLATFORM=$tmp3
304        echo $PLATFORM | grep cygwin > /dev/null 2>&1  &&  PLATFORM=cygwin_ia32
305      OFLIST=`(cd $ROOTDIR/tools/build_options; ls | grep "^$PLATFORM")`      OFLIST=`(cd $ROOTDIR/tools/build_options; ls | grep "^$PLATFORM")`
306      echo "  The platform appears to be:  $PLATFORM"      echo "  The platform appears to be:  $PLATFORM"
307            
# Line 144  find_possible_configs()  { Line 321  find_possible_configs()  {
321          CPP="cpp -traditional -P"          CPP="cpp -traditional -P"
322      fi      fi
323    
324      #  The "original" makedepend is part of the Imake system that is      look_for_makedepend
325      #  most often distributed with XFree86 or with an XFree86 source  
326      #  package.  As a result, many machines (eg. generic Linux) do not      #================================================================
327      #  have a system-default "makedepend" available.  For those      #  look for possible C compilers
328      #  systems, we have two fall-back options:      tmp="$MITGCM_CC $CC gcc c89 cc c99 mpicc icc"
329      #      p_CC=
330      #    1) a makedepend implementation shipped with the cyrus-imapd      for c in $tmp ; do
331      #       package:  ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/          rm -f ./genmake_hello.c  ./genmake_hello
332      #          cat >> genmake_hello.c << EOF
333      #    2) a known-buggy xmakedpend shell script  #include <stdio.h>
334      #  int main(int argc, char **argv) {
335      #  So the choices are, in order:    printf("Hello!\n");
336      #    return 0;
337      #    1) use the user-specified program  }
338      #    2) use a system-wide default  EOF
339      #    3) locally build and use the cyrus implementation          $c -o genmake_hello genmake_hello.c > /dev/null 2>&1
340      #    4) fall back to the buggy local xmakedpend script          RETVAL=$?
341      #          if test "x${RETVAL}" = x0 ; then
342      if test "x${MAKEDEPEND}" = x ; then              p_CC="$p_CC $c"
343        which makedepend > /dev/null 2>&1          fi
344        RETVAL=$?      done
345        if test ! "x${RETVAL}" = x0 ; then      rm -f ./genmake_hello.c ./genmake_hello
346           echo "    a system-default makedepend was not found."      if test "x${p_CC}" = x ; then
347            cat 1>&2 <<EOF
348           #  Try to build the cyrus impl  
349           rm -f ./genmake_cy_md  Error: No C compilers were found in your path.  Please specify one using:
350           (  
351               cd $ROOTDIR/tools/cyrus-imapd-makedepend  \      1) an "optfile" on (eg. "-optfile=path/to/OPTFILE"),
352                   &&  ./configure > /dev/null 2>&1  \      2) the CC or MITGCM_CC environment variables.
353                   &&  make > /dev/null 2>&1  \  
354                   &&  ./makedepend ifparser.c > /dev/null 2>&1  \  EOF
355                   &&  echo "true"          exit 1
356           ) > ./genmake_cy_md      else
357           grep true ./genmake_cy_md > /dev/null 2>&1          echo "  The possible C compilers found in your path are:"
358           RETVAL=$?          echo "   "$p_CC
359           if test "x$RETVAL" = x0 ; then          if test "x$CC" = x ; then
360               MAKEDEPEND='$(TOOLSDIR)/cyrus-imapd-makedepend/makedepend'              CC=`echo $p_CC | $AWK '{print $1}'`
361           else              echo "  Setting C compiler to: "$CC
362               MAKEDEPEND='$(TOOLSDIR)/xmakedepend'          fi
          fi  
          rm -f ./genmake_cy_md  
       fi  
363      fi      fi
364    
365      # look for possible fortran compilers      #================================================================
366      tmp="$MITGCM_FC $FC efc g77 f77 pgf77 pgf95 ifc f90 f95 mpif77 mpf77 mpxlf95"      #  look for possible FORTRAN compilers
367        tmp="$MITGCM_FC $FC efc g77 f77 pgf77 pgf95 ifc ifort f90 f95 mpif77 mpf77 mpxlf95 gfortran g95"
368      p_FC=      p_FC=
369      for c in $tmp ; do      for c in $tmp ; do
370          rm -f ./hello.f ./hello          rm -f ./hello.f ./hello
# Line 214  Error: No Fortran compilers were found i Line 389  Error: No Fortran compilers were found i
389    
390      1) an "optfile" on (eg. "-optfile=path/to/OPTFILE"),      1) an "optfile" on (eg. "-optfile=path/to/OPTFILE"),
391      2) a command-line option (eg. "-fc NAME"), or      2) a command-line option (eg. "-fc NAME"), or
392      3) the MITGCM_FC environment variable.      3) the FC or MITGCM_FC environment variables.
393    
394  EOF  EOF
395          exit 1          exit 1
396      else      else
397          echo "  The possible FORTRAN compilers found in your path are:"          echo "  The possible FORTRAN compilers found in your path are:"
398          echo "   "$p_FC          echo "   "$p_FC
399          if test "x$FC" = x ; then      fi
400              FC=`echo $p_FC | $AWK '{print $1}'`  
401              echo "  Setting FORTRAN compiler to: "$FC      #  Use the first of the compilers found in the current PATH
402          fi      #  that has a correctly-named optfile
403        if test "x$OPTFILE" = x  -a  "x$FC" = x ; then
404            for i in $p_FC ; do
405                OPTFILE=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$i
406                if test -r $OPTFILE ; then
407                    echo "  Setting OPTFILE to: "$OPTFILE
408                    break
409                fi
410            done
411      fi      fi
412    
413      if test "x$OPTFILE" = x ; then      if test "x$OPTFILE" = x ; then
# Line 316  Usage: "$0" [OPTIONS] Line 499  Usage: "$0" [OPTIONS]
499      -help | --help | -h | --h      -help | --help | -h | --h
500            Print this help message and exit.            Print this help message and exit.
501    
502        -adoptfile NAME | --adoptfile NAME | -adof NAME | --adof NAME
503          -adoptfile=NAME | --adoptfile=NAME | -adof=NAME | --adof=NAME
504              Use "NAME" as the adoptfile.  By default, the file at
505              "tools/adjoint_options/adjoint_default" will be used.
506    
507      -nooptfile | --nooptfile      -nooptfile | --nooptfile
508        -optfile NAME | --optfile NAME | -of NAME | --of NAME        -optfile NAME | --optfile NAME | -of NAME | --of NAME
509        -optfile=NAME | --optfile=NAME | -of=NAME | --of=NAME        -optfile=NAME | --optfile=NAME | -of=NAME | --of=NAME
# Line 331  Usage: "$0" [OPTIONS] Line 519  Usage: "$0" [OPTIONS]
519        -pdefault=NAME | --pdefault=NAME        -pdefault=NAME | --pdefault=NAME
520            Get the default package list from "NAME".            Get the default package list from "NAME".
521    
522        -bash NAME
523              Explicitly specify the Bourne or BASH shell to use
524    
525      -make NAME | -m NAME      -make NAME | -m NAME
526        --make=NAME | -m=NAME        --make=NAME | -m=NAME
527            Use "NAME" for the MAKE program. The default is "make" but            Use "NAME" for the MAKE program. The default is "make" but
# Line 380  Usage: "$0" [OPTIONS] Line 571  Usage: "$0" [OPTIONS]
571            will search for a working compiler by trying a list of            will search for a working compiler by trying a list of
572            "usual suspects" such as g77, f77, etc.            "usual suspects" such as g77, f77, etc.
573    
574        -cc NAME | --cc NAME | -cc=NAME | --cc=NAME
575              Use "NAME" as the C compiler.  By default, genmake
576              will search for a working compiler by trying a list of
577              "usual suspects" such as gcc, c89, cc, etc.
578    
579      -[no]ieee | --[no]ieee      -[no]ieee | --[no]ieee
580            Do or don't use IEEE numerics.  Note that this option            Do or don't use IEEE numerics.  Note that this option
581            *only* works if it is supported by the OPTFILE that            *only* works if it is supported by the OPTFILE that
582            is being used.            is being used.
583    
584        -use_real4 | -use_r4 | -ur4 | --use_real4 | --use_r4 | --ur4
585              Use "real*4" type for _RS variable (#undef REAL4_IS_SLOW)
586              *only* works if CPP_EEOPTIONS.h allows this.
587    
588        -ignoretime | -ignore_time | --ignoretime | --ignore_time
589              Ignore all the "wall clock" routines entirely.  This will
590              not in any way hurt the model results -- it simply means
591              that the code that checks how long the model spends in
592              various routines will give junk values.
593    
594        -ts | --ts
595              Produce timing information per timestep
596        -papis | --papis
597              Produce summary MFlop/s (and IPC) with PAPI per timestep
598        -pcls | --pcls
599              Produce summary MFlop/s etc. with PCL per timestep
600        -foolad | --foolad
601              Fool the AD code generator
602        -papi | --papi
603              Performance analysis with PAPI
604        -pcl | --pcl
605              Performance analysis with PCL
606        -hpmt | --hpmt
607              Performance analysis with the HPM Toolkit
608    
609        -gsl | --gsl
610              Use GSL to control floating point rounding and precision
611        -devel | --devel
612              Add additional warning and debugging flags for development
613    
614      -mpi | --mpi      -mpi | --mpi
615            Include MPI header files and link to MPI libraries            Include MPI header files and link to MPI libraries
616      -mpi=PATH | --mpi=PATH      -mpi=PATH | --mpi=PATH
617            Include MPI header files and link to MPI libraries using MPI_ROOT            Include MPI header files and link to MPI libraries using MPI_ROOT
618            set to PATH. i.e. Include files from $PATH/include, link to libraries            set to PATH. i.e. Include files from \$PATH/include, link to libraries
619            from $PATH/lib and use binaries from $PATH/bin.            from \$PATH/lib and use binaries from \$PATH/bin.
620    
621      -bash NAME      -omp | --omp
622            Explicitly specify the Bourne or BASH shell to use            Activate OpenMP code + use Compiler option OMPFLAG
623        -omp=OMPFLAG | --omp=OMPFLAG
624              Activate OpenMP code + use Compiler option OMPFLAG
625    
626        -es | --es | -embed-source | --embed-source
627              Embed a tarball containing the full source code
628              (including the Makefile, etc.) used to build the
629              executable [off by default]
630    
631    While it is most often a single word, the "NAME" variables specified    While it is most often a single word, the "NAME" variables specified
632    above can in many cases be a space-delimited string such as:    above can in many cases be a space-delimited string such as:
# Line 406  Usage: "$0" [OPTIONS] Line 639  Usage: "$0" [OPTIONS]
639    
640    For more detailed genmake documentation, please see:    For more detailed genmake documentation, please see:
641    
642      http://mitgcm.org/devel_HOWTO/      http://mitgcm.org/public/devel_HOWTO/
643    
644  EOF  EOF
645    
# Line 415  EOF Line 648  EOF
648    
649  #  Build a CPP macro to automate calling C routines from FORTRAN  #  Build a CPP macro to automate calling C routines from FORTRAN
650  get_fortran_c_namemangling()  {  get_fortran_c_namemangling()  {
651    
652        #echo "FC_NAMEMANGLE = \"$FC_NAMEMANGLE\""
653        if test ! "x$FC_NAMEMANGLE" = x ; then
654            return 0
655        fi
656    
657      default_nm="#define FC_NAMEMANGLE(X) X ## _"      default_nm="#define FC_NAMEMANGLE(X) X ## _"
658            
659      cat > genmake_test.c <<EOF      cat > genmake_test.c <<EOF
# Line 432  WARNING: Please contact <MITgcm-support@ Line 671  WARNING: Please contact <MITgcm-support@
671  EOF  EOF
672          return 1          return 1
673      fi      fi
674      c_tcall=`nm genmake_test.o | grep 'T ' | grep tcall | cut -d ' ' -f 3`      c_tcall=`nm genmake_test.o 2>/dev/null | grep 'T ' | grep tcall | cut -d ' ' -f 3`
675      RETVAL=$?      RETVAL=$?
676      if test "x$RETVAL" != x0 ; then      if test "x$RETVAL" != x0 ; then
677          FC_NAMEMANGLE=$default_nm          FC_NAMEMANGLE=$default_nm
# Line 444  WARNING: Please contact <MITgcm-support@ Line 683  WARNING: Please contact <MITgcm-support@
683  EOF  EOF
684          return 1          return 1
685      fi      fi
686      cat > genmake_tcomp.f <<EOF      cat > genmake_tcomp.$FS <<EOF
687        subroutine tcall( string )        subroutine tcall( string )
688        character*(*) string        character*(*) string
689        call tsub( string )        call tsub( string )
690        end        end
691  EOF  EOF
692      $FC $FFLAGS $DEFINES -c genmake_tcomp.f >> genmake_warnings 2>&1      $FC $FFLAGS -c genmake_tcomp.$FS >> genmake_warnings 2>&1
693      RETVAL=$?      RETVAL=$?
694      if test "x$RETVAL" != x0 ; then      if test "x$RETVAL" != x0 ; then
695          FC_NAMEMANGLE=$default_nm          FC_NAMEMANGLE=$default_nm
# Line 462  WARNING: Please contact <MITgcm-support@ Line 701  WARNING: Please contact <MITgcm-support@
701  EOF  EOF
702          return 1          return 1
703      fi      fi
704      f_tcall=`nm genmake_tcomp.o | grep 'T ' | grep tcall | cut -d ' ' -f 3`      f_tcall=`nm genmake_tcomp.o 2>/dev/null | grep 'T ' | grep tcall | cut -d ' ' -f 3`
705      RETVAL=$?      RETVAL=$?
706      if test "x$RETVAL" != x0 ; then      if test "x$RETVAL" != x0 ; then
707          FC_NAMEMANGLE=$default_nm          FC_NAMEMANGLE=$default_nm
# Line 516  void FC_NAMEMANGLE(cloc) ( double *curti Line 755  void FC_NAMEMANGLE(cloc) ( double *curti
755   *curtim = *curtim/1.E6;   *curtim = *curtim/1.E6;
756  }  }
757  EOF  EOF
758      make genmake_tc_1.o >> genmake_tc.log 2>&1      COMM="$CC $CFLAGS -c genmake_tc_1.c"
759        echo $COMM >> genmake_warnings
760        $COMM >> genmake_warnings 2>&1
761      RET_C=$?      RET_C=$?
762      cat <<EOF > genmake_tc_2.f      cat <<EOF > genmake_tc_2.$FS
763        program hello        program hello
764        Real*8 wtime        REAL*8 wtime
765        external cloc        external cloc
766        call cloc(wtime)        call cloc(wtime)
767        print *," HELLO WORLD", wtime        print *," HELLO WORLD", wtime
768        end program hello        end
769  EOF  EOF
770      $FC $FFLAGS -o genmake_tc genmake_tc_2.f genmake_tc_1.o >> genmake_tc.log 2>&1      COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
771        echo $COMM >> genmake_warnings
772        $COMM >> genmake_warnings 2>&1
773      RET_F=$?      RET_F=$?
774      test -x ./genmake_tc  &&  ./genmake_tc >> genmake_tc.log 2>&1      test -x ./genmake_tc  &&  ./genmake_tc >> genmake_warnings 2>&1
775      RETVAL=$?      RETVAL=$?
776      if test "x$RETVAL" = x0 ; then      if test "x$RETVAL" = x0 ; then
777          HAVE_CLOC=t          HAVE_CLOC=t
# Line 538  EOF Line 781  EOF
781  }  }
782    
783    
784    check_HAVE_SIGREG()  {
785        if test ! "x$HAVE_SIGREG" = x ; then
786            return
787        fi
788        get_fortran_c_namemangling
789        cat <<EOF > genmake_tc_1.c
790    $FC_NAMEMANGLE
791    #include <stdlib.h>
792    #include <stdio.h>
793    #include <signal.h>
794    #include <errno.h>
795    #include <ucontext.h>
796    
797    int * ip;
798    
799    static void killhandler(
800        unsigned int sn, siginfo_t  si, struct ucontext *sc )
801    {
802        *ip = *ip + 1;
803        return;
804    }
805    
806    void FC_NAMEMANGLE(sigreg) (int * aip)
807    {
808        struct sigaction s;
809        ip = aip;
810        s.sa_flags = SA_SIGINFO;
811        s.sa_sigaction = (void *)killhandler;
812        if(sigaction (SIGTERM,&s,(struct sigaction *)NULL)) {
813            printf("Sigaction returned error = %d\n", errno);
814            exit(0);
815        }
816        return;
817    }
818    EOF
819        COMM="$CC $CFLAGS -c genmake_tc_1.c"
820        echo $COMM >> genmake_warnings
821        $COMM >> genmake_warnings 2>&1
822        RET_C=$?
823        cat <<EOF > genmake_tc_2.$FS
824          program hello
825          integer anint
826          common /iv/ anint
827          external sigreg
828          call sigreg(anint)
829          end
830    EOF
831        echo >> genmake_warnings
832        echo "running: check_HAVE_SIGREG()" >> genmake_warnings
833        cat genmake_tc_2.$FS >> genmake_warnings
834        COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
835        echo $COMM >> genmake_warnings
836        $COMM >> genmake_warnings 2>&1
837        RETVAL=$?
838        if test "x$RETVAL" = x0 ; then
839            HAVE_SIGREG=t
840            DEFINES="$DEFINES -DHAVE_SIGREG"
841        fi
842        rm -f genmake_tc*
843    }
844    
845    
846    check_HAVE_SETRLSTK()  {
847        if test "x$HAVE_SETRLSTK" = xt ; then
848            DEFINES="$DEFINES -DHAVE_SETRLSTK"
849            return
850        fi  
851        if test ! "x$HAVE_SETRLSTK" = x ; then
852            return
853        fi
854        get_fortran_c_namemangling
855        cat <<EOF > genmake_tc_1.c
856    $FC_NAMEMANGLE
857    #include <sys/time.h>
858    #include <sys/resource.h>
859    #include <unistd.h>
860    void FC_NAMEMANGLE(setrlstk) ()
861    {
862        struct rlimit rls;
863        rls.rlim_cur = RLIM_INFINITY;
864        rls.rlim_max = RLIM_INFINITY;
865        setrlimit(RLIMIT_STACK, &rls);
866        return;
867    }
868    EOF
869        COMM="$CC $CFLAGS -c genmake_tc_1.c"
870        echo $COMM >> genmake_warnings
871        $COMM >> genmake_warnings 2>&1
872        RET_C=$?
873        cat <<EOF > genmake_tc_2.$FS
874          program hello
875          external setrlstk
876          call setrlstk()
877          end
878    EOF
879        echo >> genmake_warnings
880        echo "running: check_HAVE_SETRLSTK()" >> genmake_warnings
881        cat genmake_tc_2.$FS >> genmake_warnings
882        COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
883        echo $COMM >> genmake_warnings
884        $COMM >> genmake_warnings 2>&1
885        RETVAL=$?
886        if test "x$RETVAL" = x0 ; then
887            HAVE_SETRLSTK=t
888            DEFINES="$DEFINES -DHAVE_SETRLSTK"
889        fi
890        rm -f genmake_tc*
891    }
892    
893    
894    check_HAVE_STAT()  {
895        get_fortran_c_namemangling
896        cat <<EOF > genmake_tc_1.c
897    $FC_NAMEMANGLE
898    #include <stdio.h>
899    #include <stdlib.h>
900    #include <unistd.h>
901    #include <sys/stat.h>
902    #include <sys/types.h>
903    void FC_NAMEMANGLE(tfsize) ( int *nbyte )
904    {
905        char name[512];
906        struct stat astat;
907    
908        name[0] = 'a'; name[1] = '\0';
909        if (! stat(name, &astat))
910            *nbyte = (int)(astat.st_size);
911        else
912            *nbyte = -1;
913    }
914    EOF
915        COMM="$CC $CFLAGS -c genmake_tc_1.c"
916        echo $COMM >> genmake_warnings
917        $COMM >> genmake_tc.log 2>&1
918        RET_C=$?
919        cat <<EOF > genmake_tc_2.$FS
920          program hello
921          integer nbyte
922          call tfsize(nbyte)
923          print *," HELLO WORLD", nbyte
924          end
925    EOF
926        echo >> genmake_warnings
927        echo "running: check_HAVE_STAT()" >> genmake_warnings
928        cat genmake_tc_2.$FS >> genmake_warnings
929        COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
930        echo $COMM >> genmake_warnings
931        $COMM >> genmake_tc.log 2>&1
932        RETVAL=$?
933        if test "x$RETVAL" = x0 ; then
934            HAVE_STAT=t
935            DEFINES="$DEFINES -DHAVE_STAT"
936        fi
937        rm -f genmake_tc*
938    }
939    
940    
941  check_netcdf_libs()  {  check_netcdf_libs()  {
942      cat <<EOF > genmake_tnc.for      if test ! "x$SKIP_NETCDF_CHECK" = x ; then
943            return
944        fi
945        echo >> genmake_warnings
946        echo "running: check_netcdf_libs()" >> genmake_warnings
947        cat <<EOF > genmake_tnc.F
948        program fgennc        program fgennc
949  #include "netcdf.inc"  #include "netcdf.inc"
950    EOF
951        if test ! "x$MPI" = x ; then
952            echo '#include "mpif.h"' >> genmake_tnc.F
953        fi
954        cat <<EOF >> genmake_tnc.F
955        integer iret, ncid, xid        integer iret, ncid, xid
956        iret = nf_create('genmake_tnc.nc', NF_CLOBBER, ncid)        iret = nf_create('genmake_tnc.nc', NF_CLOBBER, ncid)
957        IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)        IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
# Line 551  check_netcdf_libs()  { Line 961  check_netcdf_libs()  {
961        IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)        IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
962        end        end
963  EOF  EOF
964      $CPP genmake_tnc.for > genmake_tnc.f  \      echo "===  genmake_tnc.F  ===" > genmake_tnc.log
965          &&  $FC $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.f $LIBS >> genmake_tnc.log 2>&1      cat genmake_tnc.F >> genmake_tnc.log
966        echo "===  genmake_tnc.F  ===" >> genmake_tnc.log
967        RET_CPP=f
968        COMM="cat genmake_tnc.F | $CPP $DEFINES $INCLUDES"
969        echo "$COMM" >> genmake_tnc.log
970        eval $COMM > genmake_tnc.$FS 2>/dev/null  &&  RET_CPP=t
971        if test "x$RET_CPP" = xf ; then
972            echo "  WARNING: CPP failed to pre-process the netcdf test." \
973                >> genmake_tnc.log
974            echo "    Please check that \$INCLUDES is properly set." \
975                >> genmake_tnc.log
976        fi
977        echo "$FC $FFLAGS $FOPTIM -c genmake_tnc.$FS  \ " >> genmake_tnc.log
978        echo "  &&  $LINK $FFLAGS $FOPTIM -o genmake_tnc.o $LIBS" >> genmake_tnc.log
979        $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1  \
980            &&  $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS >> genmake_tnc.log 2>&1
981      RET_COMPILE=$?      RET_COMPILE=$?
982      test -x ./genmake_tnc  &&  ./genmake_tnc >> genmake_tnc.log 2>&1      cat genmake_tnc.log >> genmake_warnings
983      RETVAL=$?  
984      if test "x$RET_COMPILE" = x0 -a "x$RETVAL" = x0 ; then      #EH3  Remove test program execution for machines that either disallow
985        #EH3  execution or cannot support it (eg. cross-compilers)
986        #EH3
987        #EH3 test -x ./genmake_tnc  &&  ./genmake_tnc >> genmake_tnc.log 2>&1
988        #EH3 RETVAL=$?
989        #EH3 if test "x$RET_COMPILE" = x0 -a "x$RETVAL" = x0 ; then
990    
991        if test "x$RET_COMPILE" = x0 ; then
992          HAVE_NETCDF=t          HAVE_NETCDF=t
993      else      else
994          # try again with "-lnetcdf" added to the libs          # try again with "-lnetcdf" added to the libs
995          $CPP genmake_tnc.for > genmake_tnc.f  \          echo "try again with added '-lnetcdf'" > genmake_tnc.log
996              &&  $FC $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.f \          echo "cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS \ " >> genmake_tnc.log
997              $LIBS -lnetcdf >> genmake_tnc_2.log 2>&1          echo " &&  $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS \ " >> genmake_tnc.log
998            echo " &&  $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf" >> genmake_tnc.log
999            cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS 2>/dev/null  \
1000                &&  $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1  \
1001                &&  $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf >> genmake_tnc.log 2>&1
1002          RET_COMPILE=$?          RET_COMPILE=$?
1003          test -x ./genmake_tnc  &&  ./genmake_tnc >> genmake_tnc.log 2>&1          cat genmake_tnc.log >> genmake_warnings
1004          RETVAL=$?          if test "x$RET_COMPILE" = x0 ; then
         if test "x$RET_COMPILE" = x0 -a "x$RETVAL" = x0 ; then  
1005              LIBS="$LIBS -lnetcdf"              LIBS="$LIBS -lnetcdf"
1006              HAVE_NETCDF=t              HAVE_NETCDF=t
1007          else          else
1008            # try again with "-lnetcdff" added to the libs
1009                echo "try again with added '-lnetcdff -lnetcdf'" > genmake_tnc.log
1010                echo "cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS \ " >> genmake_tnc.log
1011                echo " &&  $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS \ " >> genmake_tnc.log
1012                echo " &&  $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf" >> genmake_tnc.log
1013                cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS 2>/dev/null  \
1014                    &&  $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1  \
1015                    &&  $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdff -lnetcdf >> genmake_tnc.log 2>&1
1016                RET_COMPILE=$?
1017              cat genmake_tnc.log >> genmake_warnings              cat genmake_tnc.log >> genmake_warnings
1018                if test "x$RET_COMPILE" = x0 ; then
1019                    LIBS="$LIBS -lnetcdff -lnetcdf"
1020                    HAVE_NETCDF=t
1021                fi
1022          fi          fi
1023      fi      fi
1024      rm -f genmake_tnc*      rm -f genmake_tnc*
# Line 589  PLATFORM= Line 1037  PLATFORM=
1037  LN=  LN=
1038  S64=  S64=
1039  KPP=  KPP=
1040  FC=  #FC=
1041  CPP=  #CC=gcc
1042    #CPP=
1043  LINK=  LINK=
1044  DEFINES=  DEFINES=
1045  PACKAGES=  PACKAGES=
1046  ENABLE=  ENABLE=
1047  DISABLE=  DISABLE=
1048  MAKEFILE=  # MAKEFILE=
1049  MAKEDEPEND=  # MAKEDEPEND=
1050  PDEPEND=  PDEPEND=
1051  DUMPSTATE=t  DUMPSTATE=t
1052  PDEFAULT=  PDEFAULT=
1053  OPTFILE=  OPTFILE=
1054  INCLUDES="-I."  INCLUDES="-I. $INCLUDES"
1055  FFLAGS=  FFLAGS=
1056  FOPTIM=  FOPTIM=
1057    FEXTRAFLAGS=
1058    USE_EXTENDED_SRC=
1059    EXTENDED_SRC_FLAG=
1060  CFLAGS=  CFLAGS=
1061  KFLAGS1=  KFLAGS1=
1062  KFLAGS2=  KFLAGS2=
# Line 615  NOOPTFILES= Line 1067  NOOPTFILES=
1067  NOOPTFLAGS=  NOOPTFLAGS=
1068  MPI=  MPI=
1069  MPIPATH=  MPIPATH=
1070    OMP=
1071    OMPFLAG=
1072    USE_R4=
1073    TS=
1074    PAPIS=
1075    PCLS=
1076    FOOLAD=
1077    PAPI=
1078    PCL=
1079    HPMT=
1080    GSL=
1081    DEVEL=
1082    HAVE_TEST_L=
1083    
1084  # DEFINES checked by test compilation  # DEFINES checked by test compilation or command-line
1085  HAVE_SYSTEM=  HAVE_SYSTEM=
1086  HAVE_FDATE=  HAVE_FDATE=
1087  FC_NAMEMANGLE=  FC_NAMEMANGLE=
1088  HAVE_CLOC=  HAVE_CLOC=
1089    # HAVE_SETRLSTK=
1090    HAVE_STAT=
1091  HAVE_NETCDF=  HAVE_NETCDF=
1092    HAVE_ETIME=
1093    IGNORE_TIME=
1094    
1095  MODS=  MODS=
1096  TOOLSDIR=  TOOLSDIR=
# Line 632  STANDARDDIRS="USE_THE_DEFAULT" Line 1101  STANDARDDIRS="USE_THE_DEFAULT"
1101  G2ARGS=  G2ARGS=
1102  BASH=  BASH=
1103  PWD=`pwd`  PWD=`pwd`
1104  MAKE=make  test "x$MAKE" = x  &&  MAKE=make
1105  AWK=awk  test "x$AWK" = x   &&  AWK=awk
1106  THISHOSTNAME=`hostname`  EMBED_SRC=
1107    THISHOST=`hostname`
1108  THISCWD=`pwd`  THISCWD=`pwd`
1109  THISDATE=`date`  THISDATE=`date`
1110    THISUSER=`echo $USER`
1111    THISVER=
1112  MACHINE=`uname -a`  MACHINE=`uname -a`
1113  EXECUTABLE=  EXECUTABLE=
1114  EXEHOOK=  EXEHOOK=
# Line 646  IEEE= Line 1118  IEEE=
1118  if test "x$MITGCM_IEEE" != x ; then  if test "x$MITGCM_IEEE" != x ; then
1119      IEEE=$MITGCM_IEEE      IEEE=$MITGCM_IEEE
1120  fi  fi
1121  FEXT=  FS=
1122  F90EXT=  FS90=
1123    
1124  AUTODIFF_PKG_USED=f  AUTODIFF_PKG_USED=f
1125  AD_OPTFILE=  AD_OPTFILE=
# Line 665  TAMC_EXTRA= Line 1137  TAMC_EXTRA=
1137    
1138  #  The following state can be set directly by command-line switches  #  The following state can be set directly by command-line switches
1139  gm_s1="OPTFILE PDEPEND PDEFAULT MAKEFILE PLATFORM ROOTDIR MODS DISABLE ENABLE"  gm_s1="OPTFILE PDEPEND PDEFAULT MAKEFILE PLATFORM ROOTDIR MODS DISABLE ENABLE"
1140  gm_s2="FC CPP IEEE MPI JAM DUMPSTATE STANDARDDIRS"  gm_s2="FC IEEE USE_R4 TS PAPIS PCLS PAPI PCL HPMT GSL DEVEL MPI OMP DUMPSTATE STANDARDDIRS"
1141    
1142  #  The following state is not directly set by command-line switches  #  The following state is not directly set by command-line switches
1143  gm_s3="LN S64 KPP LINK PACKAGES MAKEDEPEND PDEPEND PDEFAULT INCLUDES FFLAGS FOPTIM "  gm_s3="LN S64 KPP LINK PACKAGES MAKEDEPEND PDEPEND PDEFAULT INCLUDES FFLAGS FOPTIM FEXTRAFLAGS"
1144  gm_s4="CFLAGS KFLAGS1 KFLAGS2 LIBS KPPFILES NOOPTFILES NOOPTFLAGS"  gm_s4="CFLAGS KFLAGS1 KFLAGS2 LIBS KPPFILES NOOPTFILES NOOPTFLAGS"
1145  gm_s5="TOOLSDIR SOURCEDIRS INCLUDEDIRS PWD MAKE THISHOSTNAME THISDATE MACHINE"  gm_s5="TOOLSDIR SOURCEDIRS INCLUDEDIRS PWD MAKE THISHOST THISUSER THISDATE THISVER MACHINE"
1146  gm_s6="EXECUTABLE EXEHOOK EXEDIR PACKAGES_CONF"  gm_s6="EXECUTABLE EXEHOOK EXEDIR PACKAGES_CONF"
1147  gm_s7="HAVE_SYSTEM HAVE_FDATE FC_NAMEMANGLE"  gm_s7="HAVE_SYSTEM HAVE_FDATE FC_NAMEMANGLE HAVE_ETIME"
1148    
1149  #  The following are all related to adjoint/tangent-linear stuff  #  The following are all related to adjoint/tangent-linear stuff
1150  gm_s10="AUTODIFF_PKG_USED AD_OPTFILE TAMC TAF AD_TAMC_FLAGS AD_TAF_FLAGS"  gm_s10="AUTODIFF_PKG_USED AD_OPTFILE TAMC TAF AD_TAMC_FLAGS AD_TAF_FLAGS"
# Line 695  EOF Line 1167  EOF
1167    
1168  echo "===  Processing options files and arguments  ==="  echo "===  Processing options files and arguments  ==="
1169  gm_local="genmake_local"  gm_local="genmake_local"
 for i in . $MODS ; do  
     if test -r $i/$gm_local ; then  
         . $i/$gm_local  
         break  
     fi  
 done  
1170  printf "  getting local config information:  "  printf "  getting local config information:  "
1171  if test -e $gm_local ; then  if test -f $gm_local ; then
1172      echo "using $gm_local"      echo "using $gm_local"
1173      . $gm_local      . $gm_local
1174      # echo "DISABLE=$DISABLE"      # echo "DISABLE=$DISABLE"
# Line 711  else Line 1177  else
1177      echo "none found"      echo "none found"
1178  fi  fi
1179    
1180  #  echo "$0::$1:$2:$3:$4:$5:$6:$7:"  #echo "$0::$1:$2:$3:$4:$5:$6:$7:"
 #OPTIONS=  
 #n=0  
 #for i ; do  
 #   echo "$i  $n"  
 #   setvar="OPTIONS[$n]='$i'"  
 #   #  echo "  $setvar"  
 #   eval "$setvar"  
 #   n=$(( $n + 1 ))  
 #done  
1181  #parse_options  #parse_options
1182  ac_prev=  ac_prev=
1183  for ac_option ; do  for ac_option in "$@" ; do
1184    
1185      G2ARGS="$G2ARGS \"$ac_option\""      G2ARGS="$G2ARGS \"$ac_option\""
1186    
# Line 819  for ac_option ; do Line 1276  for ac_option ; do
1276  #               ac_prev=cpp ;;  #               ac_prev=cpp ;;
1277  #           -cpp=* | --cpp=*)  #           -cpp=* | --cpp=*)
1278  #               CPP=$ac_optarg ;;  #               CPP=$ac_optarg ;;
1279                        
1280            -cc | --cc)
1281                ac_prev=CC ;;
1282            -cc=* | --cc=*)
1283                CC=$ac_optarg ;;
1284            
1285          -fortran | --fortran | -fc | --fc)          -fortran | --fortran | -fc | --fc)
1286              ac_prev=FC ;;              ac_prev=FC ;;
1287          -fc=* | --fc=*)          -fc=* | --fc=*)
1288              FC=$ac_optarg ;;              FC=$ac_optarg ;;
1289                    
1290            -fs | --fs)
1291                ac_prev=FS ;;
1292            -fs=* | --fs=*)
1293                FS=$ac_optarg ;;
1294            
1295            -fs90 | --fs90)
1296                ac_prev=FS90 ;;
1297            -fs90=* | --fs90=*)
1298                FS90=$ac_optarg ;;
1299            
1300          -ieee | --ieee)          -ieee | --ieee)
1301              IEEE=true ;;              IEEE=true ;;
1302          -noieee | --noieee)          -noieee | --noieee)
1303              IEEE= ;;              IEEE= ;;
1304    
1305            -use_real4 | -use_r4 | -ur4 | --use_real4 | --use_r4 | --ur4 )
1306                USE_R4=true ;;
1307    
1308            -ts | --ts)
1309                TS=true ;;
1310            -papis | --papis)
1311                PAPIS=true ;;
1312            -pcls | --pcls)
1313                PCLS=true ;;
1314            -foolad | --foolad)
1315                FOOLAD=true ;;
1316            -papi | --papi)
1317                PAPI=true ;;
1318            -pcl | --pcl)
1319                PCL=true ;;
1320            -hpmt | --hpmt)
1321                HPMT=true ;;
1322    
1323            -gsl | --gsl)
1324                GSL=true ;;
1325    
1326            -devel | --devel)
1327                DEVEL=true ;;
1328    
1329          -mpi | --mpi)          -mpi | --mpi)
1330              MPI=true ;;              MPI=true ;;
1331          -mpi=* | --mpi=*)          -mpi=* | --mpi=*)
1332              MPIPATH=$ac_optarg              MPIPATH=$ac_optarg
1333              MPI=true ;;              MPI=true ;;
1334                    
1335  #       -jam | --jam)          -omp | --omp)
1336  #           JAM=1 ;;              OMP=true ;;
1337  #       -nojam | --nojam)          -omp=* | --omp=*)
1338  #           JAM=0 ;;              OMPFLAG=$ac_optarg
1339                OMP=true ;;
1340                    
1341          -ds | --ds)          -ds | --ds)
1342              DUMPSTATE=t ;;              DUMPSTATE=t ;;
# Line 853  for ac_option ; do Line 1350  for ac_option ; do
1350              ac_prev=TAMC_EXTRA ;;              ac_prev=TAMC_EXTRA ;;
1351          -tamc_extra=* | --tamc_extra=*)          -tamc_extra=* | --tamc_extra=*)
1352              TAMC_EXTRA=$ac_optarg ;;              TAMC_EXTRA=$ac_optarg ;;
1353            
1354            -ignoretime | -ignore_time | --ignoretime | --ignore_time)
1355                IGNORE_TIME="-DIGNORE_TIME" ;;
1356    
1357            -es | --es | -embed-source | --embed-source)
1358                EMBED_SRC=t ;;
1359    
1360          -*)          -*)
1361              echo "Error: unrecognized option: "$ac_option              echo "Error: unrecognized option: "$ac_option
# Line 868  for ac_option ; do Line 1371  for ac_option ; do
1371            
1372  done  done
1373    
1374    
1375  if test -f ./.genmakerc ; then  if test -f ./.genmakerc ; then
1376      echo      echo
1377      echo "WARNING: genmake2 has detected a copy of the old-style \"./.genmakerc\""      echo "WARNING: genmake2 has detected a copy of the old-style \"./.genmakerc\""
1378      echo "  file.  This file format is no longer supported.  Please see:"      echo "  file.  This file format is no longer supported.  For directions on"
1379      echo      echo "  how to setup and use the new \"genmake2\" script, please see:"
1380      echo "    http://mitgcm.org/devel_HOWTO/"      echo "    http://mitgcm.org/devel_HOWTO/"
1381      echo      echo "  and send an email to MITgcm-support@mitgcm.org if you need help."
1382      echo "  for directions on how to setup and use the new \"genmake2\" input"      echo "WARNING: ignore \"./.genmakerc\" and continue."
     echo "  files and send an email to MITgcm-support@mitgcm.org if you want help."  
1383      echo      echo
1384  fi  fi
1385    
1386    #  Find the MITgcm ${ROOTDIR}
1387  if test "x${ROOTDIR}" = x ; then  if test "x${ROOTDIR}" = x ; then
1388      if test "${PWD##/*/}" = "bin" -a -d ../model -a -d ../eesup -a -d ../pkg ; then      tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1389        if test "x$tmp" = "xbin" -a -d ../model -a -d ../eesupp -a -d ../pkg ; then
1390          ROOTDIR=".."          ROOTDIR=".."
1391      else      else
1392          for d in . .. ../.. ../../.. ../../../.. ../../../../.. ; do          for d in . .. ../.. ../../.. ../../../.. ../../../../.. ; do
# Line 905  if test ! -d ${ROOTDIR} ; then Line 1410  if test ! -d ${ROOTDIR} ; then
1410      exit 1      exit 1
1411  fi  fi
1412    
1413    #  Find the MITgcm ${THISVER}
1414    version_file="${ROOTDIR}/doc/tag-index"
1415    if test -f $version_file ; then
1416        THISVER=`$AWK '/^checkpoint/{print $1; exit}' $version_file`
1417    #-  remove ./BUILD_INFO.h file if older than version_file
1418        if test -f ./BUILD_INFO.h -a ./BUILD_INFO.h -ot $version_file ; then
1419            echo "  remove ./BUILD_INFO.h (older than ${version_file})"
1420            rm -f ./BUILD_INFO.h
1421        fi
1422    fi
1423    
1424    if test "x$MAKEFILE" = x ; then
1425        MAKEFILE="Makefile"
1426    fi
1427    
1428  echo "  getting OPTFILE information:  "  echo "  getting OPTFILE information:  "
1429  if test "x${OPTFILE}" = x ; then  if test "x${OPTFILE}" = x ; then
1430      if test "x$MITGCM_OF" = x ; then      if test "x$MITGCM_OF" = x ; then
# Line 934  if test "x$OPTFILE" != xNONE ; then Line 1454  if test "x$OPTFILE" != xNONE ; then
1454      fi      fi
1455  fi  fi
1456    
 #  Check for broken systems that cannot correctly distinguish *.F and *.f files  
 if test "x$FEXT" = x -a "x$F90EXT" = x ; then  
     check_for_broken_Ff  
 fi  
   
1457  echo "  getting AD_OPTFILE information:  "  echo "  getting AD_OPTFILE information:  "
1458  if test "x${AD_OPTFILE}" = x ; then  if test "x${AD_OPTFILE}" = x ; then
1459      if test "x$MITGCM_AD_OF" = x ; then      if test "x$MITGCM_AD_OF" = x ; then
# Line 966  if test "x${AD_OPTFILE}" != xNONE ; then Line 1481  if test "x${AD_OPTFILE}" != xNONE ; then
1481      fi      fi
1482  fi  fi
1483    
1484  #  Check that FC, LINK, CPP, S64, LN, and MAKE are defined.  If not,  #====================================================================
1485    #  Set default values if not set by the optfile
1486    #
1487    #  Check that FC, CC, LINK, CPP, S64, LN, and MAKE are defined.  If not,
1488  #  either set defaults or complain and abort!  #  either set defaults or complain and abort!
1489  if test ! "x$BASH" = x ; then  if test ! "x$BASH" = x ; then
1490      # add a trailing space so that it works within the Makefile syntax (see below)      # add a trailing space so that it works within the Makefile syntax (see below)
# Line 982  Error: no Fortran compiler: please speci Line 1500  Error: no Fortran compiler: please speci
1500  EOF  EOF
1501      exit 1      exit 1
1502  fi  fi
1503    if test "x$CC" = x ; then
1504        CC=cc
1505    #     cat <<EOF 1>&2
1506    # Error: no C compiler: please specify using one of the following:
1507    #   1) within the options file ("CC=...") as specified by "-of=OPTFILE"
1508    #   2) the "-cc=XXX" command-line option
1509    #   3) the "./genmake_local" file
1510    # EOF
1511    #     exit 1
1512    fi
1513  if test "x$LINK" = x ; then  if test "x$LINK" = x ; then
1514      LINK=$FC      LINK=$FC
1515  fi  fi
# Line 992  if test "x$CPP" = x ; then Line 1520  if test "x$CPP" = x ; then
1520      CPP=cpp      CPP=cpp
1521  fi  fi
1522  #EH3 === UGLY ===  #EH3 === UGLY ===
1523  #  The following an ugly little hack to check for $CPP in /lib/ and it  #  The following is an ugly little hack to check for $CPP in /lib/ and
1524  #  should eventually be replaced with a more general function that  #  it should eventually be replaced with a more general function that
1525  #  searches a combo of the user's path and a list of "usual suspects"  #  searches a combo of the user's path and a list of "usual suspects"
1526  #  to find the correct location for binaries such as $CPP.  #  to find the correct location for binaries such as $CPP.
1527  for i in " " "/lib/" ; do  for i in " " "/lib/" ; do
# Line 1016  EOF Line 1544  EOF
1544  else  else
1545      rm -f test_cpp      rm -f test_cpp
1546  fi  fi
1547  if test "x$MAKEDEPEND" = x ; then  look_for_makedepend
     MAKEDEPEND=makedepend  
 fi  
1548  if test "x$LN" = x ; then  if test "x$LN" = x ; then
1549      LN="ln -s"      LN="ln -s"
1550  fi  fi
# Line 1034  Error: The command "ln -s" failed -- ple Line 1560  Error: The command "ln -s" failed -- ple
1560  EOF  EOF
1561      exit 1      exit 1
1562  fi  fi
1563    test -L genmake_tlink > /dev/null 2>&1
1564    RETVAL=$?
1565    if test "x$RETVAL" = x0 ; then
1566        HAVE_TEST_L=t
1567    fi
1568  rm -f genmake_test_ln genmake_tlink  rm -f genmake_test_ln genmake_tlink
1569    
1570    #  Check for broken *.F/*.f handling and fix if possible
1571    check_for_broken_Ff
1572    
1573  if test ! "x$MPI" = x ; then  if test ! "x$MPI" = x ; then
1574        echo "  Turning on MPI cpp macros"        echo "  Turning on MPI cpp macros"
1575        DEFINES="$DEFINES -DALLOW_USE_MPI -DALWAYS_USE_MPI"        DEFINES="$DEFINES -DALLOW_USE_MPI -DALWAYS_USE_MPI"
1576  fi  fi
1577    if test ! "x$OMP" = x ; then
1578          echo "  Add OMPFLAG and turn on OpenMP cpp macros"
1579          FFLAGS="$FFLAGS $OMPFLAG"
1580          F90FLAGS="$F90FLAGS $OMPFLAG"
1581          DEFINES="$DEFINES -DUSE_OMP_THREADING"
1582    fi
1583    
1584    if test ! "x$USE_R4" = x ; then
1585          echo "  Turning on LET_RS_BE_REAL4 cpp flag"
1586          DEFINES="$DEFINES -DLET_RS_BE_REAL4"
1587    fi
1588    
1589    if test ! "x$TS" = x ; then
1590          echo "  Turning on timing per timestep"
1591          if test ! "x$FOOLAD" = x ; then
1592                DEFINES="$DEFINES -DTIME_PER_TIMESTEP_SFP"
1593          else
1594                DEFINES="$DEFINES -DTIME_PER_TIMESTEP"
1595          fi
1596          PACKAGES="$PACKAGES showflops"
1597    fi
1598    if test ! "x$PAPIS" = x ; then
1599          echo "  Turning on PAPI flop summary per timestep"
1600          echo "  Please make sure PAPIINC, PAPILIB are defined"
1601          if test ! "x$FOOLAD" = x ; then
1602                DEFINES="$DEFINES -DUSE_PAPI_FLOPS_SFP"
1603          else
1604                DEFINES="$DEFINES -DUSE_PAPI_FLOPS"
1605          fi
1606          INCLUDES="$INCLUDES $PAPIINC"
1607          LIBS="$LIBS $PAPILIB"
1608          PACKAGES="$PACKAGES showflops"
1609    fi
1610    if test ! "x$PCLS" = x ; then
1611          echo "  Turning on PCL counter summary per timestep"
1612          echo "  Please make sure PCLINC, PCLLIB are defined"
1613          if test ! "x$FOOLAD" = x ; then
1614                DEFINES="$DEFINES -DUSE_PCL_FLOPS_SFP"
1615          else
1616                DEFINES="$DEFINES -DUSE_PCL_FLOPS"
1617          fi
1618          INCLUDES="$INCLUDES $PCLINC"
1619          LIBS="$LIBS $PCLLIB"
1620          PACKAGES="$PACKAGES showflops"
1621    fi
1622    if test ! "x$PAPI" = x ; then
1623          if test ! "x$PAPIS" = x ; then
1624              echo "  PAPI performance analysis and flop summary per timestep cannot co-exist!"
1625              echo "  Sticking with PAPI flop summary per timestep!"
1626          else
1627              echo "  Turning on performance analysis with PAPI"
1628              echo "  Please make sure PAPIINC, PAPILIB are defined"
1629              DEFINES="$DEFINES -DUSE_PAPI"
1630              INCLUDES="$INCLUDES $PAPIINC"
1631              LIBS="$LIBS $PAPILIB"
1632          fi
1633    fi
1634    if test ! "x$PCL" = x ; then
1635          if test ! "x$PCLS" = x ; then
1636              echo "  PCL performance analysis and flop summary per timestep cannot co-exist!"
1637              echo "  Sticking with PCL flop summary per timestep!"
1638          else
1639              echo "  Turning on performance analysis with PCL"
1640              echo "  Please make sure PCLINC, PCLLIB are defined"
1641              DEFINES="$DEFINES -DUSE_PCL"
1642              INCLUDES="$INCLUDES $PCLINC"
1643              LIBS="$LIBS $PCLLIB"
1644          fi
1645    fi
1646    if test ! "x$HPMT" = x ; then
1647          if test ! "x$PAPI" = x ; then
1648              echo "  PAPI and the HPM Toolkit cannot co-exist!"
1649              echo "  Sticking with PAPI!"
1650          else if test ! "x$PCL" = x ; then
1651              echo "  PCL and the HPM Toolkit cannot co-exist!"
1652              echo "  Sticking with PCL!"
1653          else
1654              echo "  Turning on performance analysis with the HPM Toolkit"
1655              echo "  Please make sure HPMTINC, HPMTLIB are defined"
1656              DEFINES="$DEFINES -DUSE_LIBHPM"
1657              INCLUDES="$INCLUDES $HPMTINC"
1658              LIBS="$LIBS $HPMTLIB"
1659          fi
1660          fi
1661    fi
1662    if test ! "x$GSL" = x ; then
1663          echo "  Turning on use of GSL to control floating point calculations"
1664          echo "  Please make sure GSLINC, GSLLIB are defined"
1665          DEFINES="$DEFINES -DUSE_GSL_IEEE"
1666          INCLUDES="$INCLUDES $GSLINC"
1667          LIBS="$LIBS $GSLLIB"
1668    fi
1669    #- if USE_EXTENDED_SRC is set, add EXTENDED_SRC_FLAG to FFLAGS :
1670    if test ! "x$USE_EXTENDED_SRC" = x ; then
1671          FFLAGS="$FFLAGS $EXTENDED_SRC_FLAG"
1672          F90FIXEDFORMAT="$F90FIXEDFORMAT $EXTENDED_SRC_FLAG"
1673    fi
1674    
1675  printf "\n===  Checking system libraries  ===\n"  printf "\n===  Checking system libraries  ===\n"
1676  printf "  Do we have the system() command using $FC...  "  printf "  Do we have the system() command using $FC...  "
1677  cat > genmake_tcomp.f <<EOF  cat > genmake_tcomp.$FS <<EOF
1678        program hello        program hello
1679        call system('echo hi')        call system('echo hi')
1680        end        end
1681  EOF  EOF
1682  $FC $FFLAGS $DEFINES -o genmake_tcomp genmake_tcomp.f > genmake_tcomp.log 2>&1  $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1683  RETVAL=$?  RETVAL=$?
1684  if test "x$RETVAL" = x0 ; then  if test "x$RETVAL" = x0 ; then
1685      HAVE_SYSTEM=t      HAVE_SYSTEM=t
# Line 1061  fi Line 1692  fi
1692  rm -f genmake_tcomp*  rm -f genmake_tcomp*
1693    
1694  printf "  Do we have the fdate() command using $FC...  "  printf "  Do we have the fdate() command using $FC...  "
1695  cat > genmake_tcomp.f <<EOF  cat > genmake_tcomp.$FS <<EOF
1696        program hello        program hello
1697        CHARACTER(128) string        CHARACTER*(128) string
1698        string = ' '        string = ' '
1699        call fdate( string )        call fdate( string )
1700        print *, string        print *, string
1701        end        end
1702  EOF  EOF
1703  $FC $FFLAGS $DEFINES -o genmake_tcomp genmake_tcomp.f > genmake_tcomp.log 2>&1  $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1704  RETVAL=$?  RETVAL=$?
1705  if test "x$RETVAL" = x0 ; then  if test "x$RETVAL" = x0 ; then
1706      HAVE_FDATE=t      HAVE_FDATE=t
# Line 1081  else Line 1712  else
1712  fi  fi
1713  rm -f genmake_tcomp*  rm -f genmake_tcomp*
1714    
1715    printf "  Do we have the etime() command using $FC...  "
1716    cat > genmake_tcomp.$FS <<EOF
1717          program hello
1718          REAL*4 ACTUAL, TARRAY(2)
1719          EXTERNAL ETIME
1720          REAL*4 ETIME
1721          actual = etime( tarray )
1722          print *, tarray
1723          end
1724    EOF
1725    $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1726    RETVAL=$?
1727    if test "x$RETVAL" = x0 ; then
1728        HAVE_ETIME=t
1729        DEFINES="$DEFINES -DHAVE_ETIME"
1730        echo "yes"
1731    else
1732        HAVE_ETIME=
1733        echo "no"
1734    fi
1735    rm -f genmake_tcomp*
1736    
1737  printf "  Can we call simple C routines (here, \"cloc()\") using $FC...  "  printf "  Can we call simple C routines (here, \"cloc()\") using $FC...  "
1738  check_HAVE_CLOC  check_HAVE_CLOC
1739  if test "x$HAVE_CLOC" != x ; then  if test "x$HAVE_CLOC" != x ; then
1740      echo "yes"      echo "yes"
1741  else  else
1742      echo "no"      echo "no"
1743        if test "x$EMBED_SRC" = xt ; then
1744            echo "    WARNING: you requested file embedding but it has"
1745            echo "      been disabled since C code cannot be called"
1746            EMBED_SRC=
1747        fi
1748    fi
1749    rm -f genmake_t*
1750    
1751    printf "  Can we unlimit the stack size using $FC...  "
1752    check_HAVE_SETRLSTK
1753    if test "x$HAVE_SETRLSTK" = xt ; then
1754        echo "yes"
1755    else
1756        echo "no"
1757    fi
1758    rm -f genmake_t*
1759    
1760    printf "  Can we register a signal handler using $FC...  "
1761    check_HAVE_SIGREG
1762    if test "x$HAVE_SIGREG" = xt ; then
1763        echo "yes"
1764    else
1765        echo "no"
1766    fi
1767    rm -f genmake_t*
1768    
1769    printf "  Can we use stat() through C calls...  "
1770    check_HAVE_STAT
1771    if test "x$HAVE_STAT" != x ; then
1772        echo "yes"
1773    else
1774        echo "no"
1775  fi  fi
1776  rm -f genmake_t*  rm -f genmake_t*
1777    
# Line 1097  if test "x$HAVE_NETCDF" != x ; then Line 1782  if test "x$HAVE_NETCDF" != x ; then
1782  else  else
1783      echo "no"      echo "no"
1784  fi  fi
1785    DEFINES="$DEFINES $IGNORE_TIME"
1786    
1787    if test "x$EMBED_SRC" = xt ; then
1788        build_embed_encode
1789    fi
1790    if test "x$EMBED_SRC" = xt ; then
1791        ENABLE="$ENABLE embed_files"
1792    fi
1793    
1794    
1795  printf "\n===  Setting defaults  ===\n"  printf "\n===  Setting defaults  ===\n"
1796  printf "  Adding MODS directories:  "  printf "  Adding MODS directories: "
1797  for d in $MODS ; do  for d in $MODS ; do
1798      if test ! -d $d ; then      if test ! -d $d ; then
1799          echo          echo
1800          echo "Error: MODS directory \"$d\" not found!"          echo "Error: MODS directory \"$d\" not found!"
1801          exit 1          exit 1
1802      else      else
1803          printf " $d"          printf "$d "
1804          SOURCEDIRS="$SOURCEDIRS $d"          SOURCEDIRS="$SOURCEDIRS $d"
1805          INCLUDEDIRS="$INCLUDEDIRS $d"          INCLUDEDIRS="$INCLUDEDIRS $d"
1806      fi      fi
1807  done  done
1808  echo  echo
1809    
 if test "x$MAKEFILE" = x ; then  
     MAKEFILE="Makefile"  
 fi  
1810  if test "x${PLATFORM}" = x ; then  if test "x${PLATFORM}" = x ; then
1811      PLATFORM=$p_PLATFORM      PLATFORM=$p_PLATFORM
1812  fi  fi
1813    
1814  if test "x${EXEDIR}" = x ; then  if test "x${EXEDIR}" = x ; then
1815      if test "${PWD##/*/}" = "bin" -a -d ../exe -a $ROOTDIR = .. ; then      tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1816        if test "x$tmp" = "xbin" -a -d ../exe -a $ROOTDIR = .. ; then
1817          EXEDIR=../exe          EXEDIR=../exe
1818      else      else
1819          EXEDIR=.          EXEDIR=.
# Line 1141  if test ! -d ${TOOLSDIR} ; then Line 1832  if test ! -d ${TOOLSDIR} ; then
1832      exit 1      exit 1
1833  fi  fi
1834  if test "x$S64" = x ; then  if test "x$S64" = x ; then
1835      S64='$(TOOLSDIR)/set64bitConst.sh'      echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.sh > /dev/null 2>&1
1836        RETVAL=$?
1837        if test "x${RETVAL}" = x0 ; then
1838            S64='$(TOOLSDIR)/set64bitConst.sh'
1839        else
1840            echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.csh > /dev/null 2>&1
1841            RETVAL=$?
1842            if test "x${RETVAL}" = x0 ; then
1843                S64='$(TOOLSDIR)/set64bitConst.csh'
1844            else
1845                cat <<EOF
1846    
1847    ERROR: neither of the two default scripts:
1848    
1849        ${TOOLSDIR}/set64bitConst.sh
1850        ${TOOLSDIR}/set64bitConst.csh
1851    
1852      are working so please check paths or specify (with \$S64) a
1853      working version of this script.
1854    
1855    EOF
1856                exit 1
1857            fi
1858        fi
1859  fi  fi
1860  THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`  THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`
1861    
# Line 1163  if test -r $ROOTDIR"/eesupp/src/Makefile Line 1877  if test -r $ROOTDIR"/eesupp/src/Makefile
1877      fi      fi
1878  fi  fi
1879    
1880  #same for exch2  #same for pkg/exch2 and pkg/regrid
1881  if test -r $ROOTDIR"/pkg/exch2/Makefile" ; then  for pdir in exch2 regrid ; do
1882      echo "  Making source files in exch2 from  templates"      if test -r $ROOTDIR"/pkg/${pdir}/Makefile" ; then
1883      ( cd $ROOTDIR"/pkg/exch2/" && $MAKE ) > make_exch2.errors 2>&1          echo "  Making source files in pkg/${pdir} from templates"
1884      RETVAL=$?          ( cd $ROOTDIR"/pkg/"${pdir} && $MAKE ) > make_${pdir}.errors 2>&1
1885      if test "x${RETVAL}" = x0 ; then          RETVAL=$?
1886          rm -f make_exch2.errors          if test "x${RETVAL}" = x0 ; then
1887      else              rm -f make_${pdir}.errors
1888          echo "Error: problem encountered while building source files in exch2:"          else
1889          cat make_exch2.errors 1>&2              echo "Error: problem encountered while building source files in pkg/${pdir}:"
1890          exit 1              cat make_${pdir}.errors 1>&2
1891                exit 1
1892            fi
1893      fi      fi
1894  fi  done
1895    
1896  printf "\n===  Determining package settings  ===\n"  printf "\n===  Determining package settings  ===\n"
1897  if  test "x${PDEPEND}" = x ; then  if  test "x${PDEPEND}" = x ; then
# Line 1240  else Line 1956  else
1956              PACKAGES="$PACKAGES $i"              PACKAGES="$PACKAGES $i"
1957          done          done
1958          echo "    before group expansion packages are: $PACKAGES"          echo "    before group expansion packages are: $PACKAGES"
1959          while ! expand_pkg_groups; do echo > /dev/null; done          RET=1
1960            while test $RET = 1 ; do expand_pkg_groups; RET=$?; done
1961          echo "    after group expansion packages are:  $PACKAGES"          echo "    after group expansion packages are:  $PACKAGES"
1962      fi      fi
1963  fi  fi
# Line 1285  done Line 2002  done
2002  rm -f ./.tmp_pack  rm -f ./.tmp_pack
2003  echo "    packages are:  $PACKAGES"  echo "    packages are:  $PACKAGES"
2004    
2005    #  Check for package MNC: if NetCDF is available, then build the MNC
2006    #  template files ; otherwise, delete mnc from the list of packages.
2007    echo $PACKAGES | grep ' mnc ' > /dev/null 2>&1
2008    RETVAL=$?
2009    if test "x$RETVAL" = x0 ; then
2010        if test "x$HAVE_NETCDF" != xt ; then
2011            cat <<EOF
2012    
2013    *********************************************************************
2014    WARNING: the "mnc" package was enabled but tests failed to compile
2015      NetCDF applications.  Please check that:
2016    
2017      1) NetCDF is correctly installed for this compiler and
2018      2) the LIBS variable (within the "optfile") specifies the correct
2019           NetCDF library to link against.
2020    
2021      Due to this failure, the "mnc" package is now DISABLED.
2022    *********************************************************************
2023    
2024    EOF
2025            PACKAGES=`echo $PACKAGES | sed -e 's/mnc//g'`
2026            DISABLE="$DISABLE mnc"
2027        else
2028            ( cd $ROOTDIR"/pkg/mnc" && $MAKE testclean && $MAKE templates ) > make_mnc.errors 2>&1
2029            RETVAL=$?
2030            if test "x${RETVAL}" = x0 ; then
2031                rm -f make_mnc.errors
2032            else
2033                echo "Error: problem encountered while building source files in pkg/mnc:"
2034                cat make_mnc.errors 1>&2
2035                exit 1
2036            fi
2037        fi
2038    fi
2039    
2040    #  Check for package PROFILES: if NetCDF is not available,
2041    #  then delete profiles from the list of available packages.
2042    echo $PACKAGES | grep ' profiles ' > /dev/null 2>&1
2043    RETVAL=$?
2044    if test "x$RETVAL" = x0 ; then
2045        if test "x$HAVE_NETCDF" != xt ; then
2046            cat <<EOF
2047    
2048    *********************************************************************
2049    WARNING: the "profiles" package was enabled but tests failed to
2050      compile NetCDF applications.  Please check that:
2051    
2052      1) NetCDF is correctly installed for this compiler and
2053      2) the LIBS variable (within the "optfile") specifies the correct
2054           NetCDF library to link against.
2055    
2056      Due to this failure, the "profiles" package is now DISABLED.
2057    *********************************************************************
2058    
2059    EOF
2060            PACKAGES=`echo $PACKAGES | sed -e 's/profiles//g'`
2061            DISABLE="$DISABLE profiles"
2062        fi
2063    fi
2064    
2065  echo "  applying package dependency rules"  echo "  applying package dependency rules"
2066  ck=  ck=
2067  while test "x$ck" != xtt ; do  while test "x$ck" != xtt ; do
2068      i=0      i=0
2069      # rtot=${#PNAME[@]}      # rtot=${#PNAME[@]}
2070      rtot=$nname      rtot=$nname
2071      while test $i -lt $rtot ; do      while test $i -le $rtot ; do
2072    
2073          #  Is $pname in the current $PACKAGES list?          #  Is $pname in the current $PACKAGES list?
2074          #  pname=${PNAME[$i]}          #  pname=${PNAME[$i]}
# Line 1325  while test "x$ck" != xtt ; do Line 2102  while test "x$ck" != xtt ; do
2102    
2103          #  Do we need to add $dname according to the dependency rules?          #  Do we need to add $dname according to the dependency rules?
2104          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
2105                #echo "   " $pname ": need to add :" $dname
2106              in_dis="f"              in_dis="f"
2107              for dis in $DISABLE ; do              for dis in $DISABLE ; do
2108                  if test "x$dis" = "x$dname" ; then                  if test "x$dis" = "x$dname" ; then
# Line 1349  while test "x$ck" != xtt ; do Line 2127  while test "x$ck" != xtt ; do
2127              echo "  the dependency rules for \"$dname\""              echo "  the dependency rules for \"$dname\""
2128              exit 1              exit 1
2129          fi          fi
2130          i=$(( $i + 1 ))          i=`echo "$i + 1" | bc -l`
2131            #i=$(( $i + 1 ))
2132      done      done
2133      ck=$ck"t"      ck=$ck"t"
2134  done  done
# Line 1368  for i in $PACKAGES ; do Line 2147  for i in $PACKAGES ; do
2147      fi      fi
2148  done  done
2149    
 #  Build MNC templates and check for ability to build and use NetCDF  
 echo $PACKAGES | grep ' mnc ' > /dev/null 2>&1  
 RETVAL=$?  
 if test "x$RETVAL" = x0 ; then  
     ( cd $ROOTDIR"/pkg/mnc" && $MAKE templates ) > make_mnc.errors 2>&1  
     RETVAL=$?  
     if test "x${RETVAL}" = x0 ; then  
         rm -f make_mnc.errors  
     else  
         echo "Error: problem encountered while building source files in pkg/mnc:"  
         cat make_mnc.errors 1>&2  
         exit 1  
     fi  
     if test "x$HAVE_NETCDF" != xt ; then  
         cat <<EOF  
   
 WARNING: the "mnc" package has been enabled but tests failed to  
   compile and/or execute NetCDF applications.  Please check that:  
   
   1) NetCDF is installed for your compiler and  
   2) the LIBS variable (within the 'optfile") specifies the correct  
        NetCDF library to link against.  
     
 EOF  
     fi  
 fi  
   
2150  # Create a list of #define and #undef to enable/disable packages  # Create a list of #define and #undef to enable/disable packages
2151  PACKAGES_DOT_H=PACKAGES_CONFIG.h  PACKAGES_DOT_H=PACKAGES_CONFIG.h
2152  #  The following UGLY HACK sets multiple "#undef"s and it needs to go  #  The following UGLY HACK sets multiple "#undef"s and it needs to go
# Line 1414  for n in $names ; do Line 2166  for n in $names ; do
2166              fi              fi
2167          done          done
2168          if test "x$has_pack" = xf ; then          if test "x$has_pack" = xf ; then
2169              undef=`echo "ALLOW_$n" | $AWK '{print toupper($0)}'`              undef=`echo "ALLOW_$n" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2170              DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"              DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
2171          fi          fi
2172      fi      fi
2173  done  done
2174  ENABLED_PACKAGES=  ENABLED_PACKAGES=
2175  for i in $PACKAGES ; do  for i in $PACKAGES ; do
2176      def=`echo "ALLOW_$i" | $AWK '{print toupper($0)}'`      def=`echo "ALLOW_$i" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2177      ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"      ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
2178  #eh3 DEFINES="$DEFINES -D$def"  #eh3 DEFINES="$DEFINES -D$def"
2179    
# Line 1495  fi Line 2247  fi
2247    
2248  #  Here, we build the list of files to be "run through" the adjoint  #  Here, we build the list of files to be "run through" the adjoint
2249  #  compiler.  #  compiler.
2250  if test -f ./ad_files ; then  if test -f ./adSrcFiles.tmp ; then
2251      rm -f ./ad_files      rm -f ./adSrcFiles.tmp
2252  fi  fi
2253  echo "  Creating the list of files for the adjoint compiler."  echo "  Creating the list of files for the adjoint compiler."
2254  for i in $SOURCEDIRS ; do  for i in $SOURCEDIRS ; do
2255      list_files=`( cd $i && ls -1 *.list 2>/dev/null )`      list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
2256      for j in $list_files ; do      for j in $list_files ; do
2257          cat $i/$j >> ad_files          cat $i/$j >> adSrcFiles.tmp
2258      done      done
2259  done  done
2260    if test ! "x"$FS = "x.f" ; then
2261        cat adSrcFiles.tmp | sed -e "s/\.f/.$FS/g" > adSrcFiles.tmp_f
2262        mv -f adSrcFiles.tmp_f adSrcFiles.tmp
2263    fi
2264    
2265  echo  echo
2266  echo "===  Creating the Makefile  ==="  echo "===  Creating the Makefile  ==="
2267  echo "  setting INCLUDES"  echo "  setting INCLUDES"
2268  for i in $INCLUDEDIRS ; do  for i in $INCLUDEDIRS ; do
2269      if ! test -d $i ; then      if test ! -d $i ; then
 #       INCLUDES="$INCLUDES -I$i"  
 #   else  
2270          echo "Warning: can't find INCLUDEDIRS=\"$i\""          echo "Warning: can't find INCLUDEDIRS=\"$i\""
2271      fi      fi
2272  done  done
2273    
2274    if test ! "x$DIVA" = x ; then
2275        echo "  Creating the pseudo-MPI include directory"
2276        INCLUDES="-I./mpi_headers $INCLUDES"
2277        rm -rf ./mpi_headers
2278        mkdir -p ./mpi_headers
2279    
2280        if test "x$MPIINCLUDEDIR" = x ; then
2281            if test "x$MPIHOME" = x ; then
2282                MPIHOME='/usr'
2283            fi
2284            MPIINCLUDEDIR='$MPIHOME/include'
2285        fi
2286        
2287        if test -r $MPIINCLUDEDIR/mpif.h ; then
2288            for i in $MPI_HEADER_FILES; do
2289                cp -p $MPIINCLUDEDIR/$i ./mpi_headers
2290            done
2291    
2292            perl -i -pe 's/MPI_DISPLACEMENT_CURRENT=-1_8/MPI_DISPLACEMENT_CURRENT=-1/g' mpi_headers/mpif.h
2293        else
2294            echo " We cannot create a copy of mpif.h!"
2295    #       exit -1
2296        fi
2297    fi
2298    
2299  echo "  Determining the list of source and include files"  echo "  Determining the list of source and include files"
2300  rm -rf .links.tmp  rm -rf .links.tmp
2301  mkdir .links.tmp  mkdir .links.tmp
2302    touch .links.tmp/foo
2303    if test ! -r ".links.tmp/foo" ; then
2304        echo
2305        echo "ERROR : something is wrong with your directory permissions or"
2306        echo "   your user file-creation mask (\"umask\") since creating a"
2307        echo "   sub-dir, touch-ing a file within it, and then reading it is"
2308        echo "   not working.  Please try setting your umask to something"
2309        echo "   sane such as:"
2310        echo
2311        echo "      umask 0002"
2312        echo
2313        echo "   and please verify that you have the proper permissions for"
2314        echo "   creating sub-directories and then reading files created"
2315        echo "   within them."
2316        echo
2317        exit 1
2318    fi
2319    rm -f .links.tmp/foo
2320    
2321    if test "x$OPENAD" != x ; then
2322        OAD_DONT_COMPILE="/dev/null"
2323        OAD_DONT_TRANSFORM="/dev/null"
2324        OAD_KEEP_ORIGINAL="/dev/null"
2325        OAD_CB2M_FILES="/dev/null"
2326        echo "  looking for dontCompile file:  "
2327        for i in "." $MODS ; do
2328            if test -r $i"/dontCompile" ; then
2329                OAD_DONT_COMPILE=$i"/dontCompile"
2330                echo "     found $OAD_DONT_COMPILE"
2331                break
2332            fi
2333        done
2334        echo "  looking for dontTransform file:  "
2335        for i in "." $MODS ; do
2336            if test -r $i"/dontTransform" ; then
2337                OAD_DONT_TRANSFORM=$i"/dontTransform"
2338                echo "     found $OAD_DONT_TRANSFORM"
2339                break
2340            fi
2341        done
2342        echo "  looking for keepOriginal file:  "
2343        for i in "." $MODS ; do
2344            if test -r $i"/keepOriginal" ; then
2345                OAD_KEEP_ORIGINAL=$i"/keepOriginal"
2346                echo "     found $OAD_KEEP_ORIGINAL"
2347                break
2348            fi
2349        done
2350        echo "  looking for cb2mFiles:  "
2351        for i in "." $MODS ; do
2352            if test -r $i"/cb2mFiles" ; then
2353                OAD_CB2M_FILES=$i"/cb2mFiles"
2354                echo "     found $OAD_CB2M_FILES"
2355                break
2356            fi
2357        done
2358        echo "   OpenAD exceptions:  "
2359    fi
2360    
2361  echo "# This section creates symbolic links" > srclinks.tmp  echo "# This section creates symbolic links" > srclinks.tmp
2362  echo "" >> srclinks.tmp  echo "" >> srclinks.tmp
2363  printf 'SRCFILES = '    > srclist.inc  printf 'F77_SRC_FILES = ' > F77srclist.tmp
2364  printf 'CSRCFILES = '   > csrclist.inc  printf 'NON_AD_F77_SRC_FILES = ' > nonADF77srclist.tmp
2365  printf 'F90SRCFILES = ' > f90srclist.inc  printf 'C_SRC_FILES = '   > csrclist.tmp
2366  printf 'HEADERFILES = ' > hlist.inc  printf 'F90_SRC_FILES = ' > F90srclist.tmp
2367  printf 'AD_FLOW_FILES = ' > ad_flow_files.inc  printf 'H_SRC_FILES = '   > hsrclist.tmp
2368    printf 'AD_FLOW_FILES = ' > ad_flow_files.tmp
2369  alldirs="$SOURCEDIRS $INCLUDEDIRS ."  alldirs="$SOURCEDIRS $INCLUDEDIRS ."
2370  for d in $alldirs ; do  for d in $alldirs ; do
2371      deplist=      deplist=
2372      sfiles=`( cd $d; echo *.[h,c,F] *.flow )`      sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
2373      sfiles=`( echo $sfiles; cd $d; echo *.F90 )`      sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
2374        if test "x$OPENAD" != x ; then
2375            sfiles=`( echo $sfiles | grep -v _cb2m\. )`
2376        fi
2377      for sf in $sfiles ; do      for sf in $sfiles ; do
2378          if test ! -r ".links.tmp/$sf" ; then          if test ! -r ".links.tmp/$sf" ; then
2379              if test -f "$d/$sf" ; then              if test -f "$d/$sf" ; then
2380                    ignore_f=f
2381                  case $d/$sf in                  case $d/$sf in
2382                    ./$PACKAGES_DOT_H)                    ./$PACKAGES_DOT_H)
2383                            ignore_f=t
2384                          ;;                          ;;
2385                    ./AD_CONFIG.h)                    ./AD_CONFIG.h)
2386                            ignore_f=t
2387                          ;;                          ;;
2388                    ./FC_NAMEMANGLE.h)                    ./FC_NAMEMANGLE.h)
2389                            ignore_f=t
2390                            ;;
2391                      ./BUILD_INFO.h)
2392                            ignore_f=t
2393                            ;;
2394                      ./EMBEDDED_FILES.h)
2395                            ignore_f=t
2396                          ;;                          ;;
2397                    *)                    *)
2398                          touch .links.tmp/$sf                          #  For the local directory *ONLY*,
2399                          deplist="$deplist $sf"                          #  ignore all soft-links
2400                            if test "x$HAVE_TEST_L" = xt -a "x$d" = x. -a -L $sf ; then
2401                                ignore_f=t
2402                            else
2403                                touch .links.tmp/$sf
2404                                deplist="$deplist $sf"
2405                            fi
2406                          ;;                          ;;
2407                  esac                  esac
2408                  extn=`echo $sf | $AWK -F '.' '{print $NF}'`                  if test "x$ignore_f" = xf ; then
2409                  case $extn in                      extn=`echo $sf | $AWK -F. '{print $NF}'`
2410                      F)                      case $extn in
2411                          echo    " \\"  >> srclist.inc                        F)
2412                          printf " $sf" >> srclist.inc                          echo    " \\"  >> F77srclist.tmp
2413                            printf " $sf" >> F77srclist.tmp
2414                            if test "x$OPENAD" != x ; then
2415                                basename=${sf%%.F}
2416                                isAD=`egrep ^$basename.f'[  ]*' adSrcFiles.tmp`
2417                                if test -z "$isAD" ; then
2418                                    toBeIgnored=`egrep ^$basename'[      ]*' ${OAD_DONT_COMPILE}`
2419                                    if test -z "$toBeIgnored" ; then
2420                                        echo    " \\"  >> nonADF77srclist.tmp
2421                                        printf " $sf" >> nonADF77srclist.tmp
2422                                    else
2423                                        echo "    not to be compiled   :  $sf"
2424                                    fi
2425                                else # file is initially listed as an AD file we want to exclude it
2426                                     # or we want to retain the untransformed version
2427                                    notToBeTransformed=`egrep ^$basename'[      ]*' ${OAD_DONT_TRANSFORM}`
2428                                    untransformedVersionToBeKept=`egrep ^$basename'[      ]*' ${OAD_KEEP_ORIGINAL}`
2429                                    if test -n "$notToBeTransformed"; then
2430                                        echo "    not to be transformed:  $sf"
2431                                    fi
2432                                    if test -n "$untransformedVersionToBeKept" ; then
2433                                        echo "    original to be kept  :  $sf"
2434                                    fi    
2435                                    if test -n "$notToBeTransformed" -o -n "$untransformedVersionToBeKept" ; then
2436                                        echo    " \\"  >> nonADF77srclist.tmp
2437                                        printf " $sf" >> nonADF77srclist.tmp
2438                                    fi
2439                                fi
2440                            fi
2441                          ;;                          ;;
2442                      F90)                      F90)
2443                          echo    " \\"  >> f90srclist.inc                          echo    " \\"  >> F90srclist.tmp
2444                          printf " $sf" >> f90srclist.inc                          printf " $sf" >> F90srclist.tmp
2445                          ;;                          ;;
2446                      c)                      c)
2447                          echo    " \\"  >> csrclist.inc                          echo    " \\"  >> csrclist.tmp
2448                          printf " $sf" >> csrclist.inc                          printf " $sf" >> csrclist.tmp
2449                          ;;                          ;;
2450                      h)                      h)
2451                          echo    " \\"  >> hlist.inc                          echo    " \\"  >> hsrclist.tmp
2452                          printf " $sf" >> hlist.inc                          printf " $sf" >> hsrclist.tmp
2453                          ;;                          ;;
2454                      flow)                      flow)
2455                          echo    " \\"  >> ad_flow_files.inc                          echo    " \\"  >> ad_flow_files.tmp
2456                          printf " $sf" >> ad_flow_files.inc                          printf " $sf" >> ad_flow_files.tmp
2457                          ;;                          ;;
2458                  esac                     esac
2459                    fi
2460              fi              fi
2461          fi          fi
2462      done      done
2463      if test "x$deplist" != x ; then      if test "x$deplist" != x ; then
2464          echo "" >> srclinks.tmp        if test "$d" != "." ; then
2465            echo "" >> srclinks.tmp
2466          echo "#  These files are linked from $d" >> srclinks.tmp          echo "#  These files are linked from $d" >> srclinks.tmp
2467          echo "$deplist :" >> srclinks.tmp          echo "$deplist :" >> srclinks.tmp
2468          printf "\t\$(LN) %s/\$@ \$@\n" $d >> srclinks.tmp  # We need to make sure that the link isn't already there.
2469    # This may happen when make thinks that a header file has to be "remade"
2470    # because a module it depends on has changed.  In this case we do nothing.
2471            printf "\tif [ ! -L \$@ ]; then \$(LN) %s/\$@ \$@; fi\n" $d >> srclinks.tmp
2472          fi
2473      fi      fi
2474  done  done
2475  rm -rf .links.tmp  rm -rf .links.tmp
2476  echo "" >> srclist.inc  echo "" >> F77srclist.tmp
2477  echo "" >> csrclist.inc  echo "" >> nonADF77srclist.tmp
2478  echo "" >> f90srclist.inc  echo "" >> csrclist.tmp
2479  echo "" >> hlist.inc  echo "" >> F90srclist.tmp
2480  echo "" >> ad_flow_files.inc  echo "" >> hsrclist.tmp
2481    echo "" >> ad_flow_files.tmp
2482    
2483    CMDLINE=$0
2484    for xx in "$@" ; do nw=`echo $xx | wc -w`
2485        if test $nw = '1' ; then CMDLINE="$CMDLINE $xx"
2486                            else CMDLINE="$CMDLINE '$xx'" ; fi
2487    done
2488    
2489  if test -e $MAKEFILE ; then  if test -f $MAKEFILE ; then
2490      mv -f $MAKEFILE "$MAKEFILE.bak"      mv -f $MAKEFILE "$MAKEFILE.bak"
2491  fi  fi
2492  echo "  Writing makefile: $MAKEFILE"  echo "  Writing makefile: $MAKEFILE"
# Line 1597  echo "#    $MACHINE" >> $MAKEFILE Line 2495  echo "#    $MACHINE" >> $MAKEFILE
2495  echo "# This makefile was generated automatically on" >> $MAKEFILE  echo "# This makefile was generated automatically on" >> $MAKEFILE
2496  echo "#    $THISDATE" >> $MAKEFILE  echo "#    $THISDATE" >> $MAKEFILE
2497  echo "# by the command:" >> $MAKEFILE  echo "# by the command:" >> $MAKEFILE
2498  echo "#    $0 $G2ARGS" >> $MAKEFILE  echo "#    $CMDLINE"  >> $MAKEFILE
2499  echo "# executed by:" >> $MAKEFILE  echo "# executed by:" >> $MAKEFILE
2500  echo "#    $USER@${THISHOSTNAME}:${THISCWD}" >> $MAKEFILE  echo "#    ${THISUSER}@${THISHOST}:${THISCWD}" >> $MAKEFILE
2501    
2502  EXE_AD=$EXECUTABLE"_ad"  EXE_AD=$EXECUTABLE"_ad"
2503  EXE_FTL=$EXECUTABLE"_ftl"  EXE_FTL=$EXECUTABLE"_ftl"
# Line 1645  ENABLED_PACKAGES = ${ENABLED_PACKAGES} Line 2543  ENABLED_PACKAGES = ${ENABLED_PACKAGES}
2543  DISABLED_PACKAGES = ${DISABLED_PACKAGES}  DISABLED_PACKAGES = ${DISABLED_PACKAGES}
2544    
2545  # These files are created by Makefile  # These files are created by Makefile
2546  SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h  SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h BUILD_INFO.h
   
2547  EOF  EOF
2548    
2549  #  Note: figure out some way to add Hyades JAM libraries here  if test "x$EMBED_SRC" = xt ; then
2550        echo "EMBEDDED_FILES = EMBEDDED_FILES.h" >>$MAKEFILE
2551    else
2552        echo "EMBEDDED_FILES = " >>$MAKEFILE
2553    fi
2554    
2555  cat >>$MAKEFILE <<EOF  cat >>$MAKEFILE <<EOF
2556  # Unix ln (link)  # Unix ln (link)
2557  LN = ${LN}  LN = ${LN}
# Line 1664  KPP = ${KPP} Line 2565  KPP = ${KPP}
2565  FC = ${FC}  FC = ${FC}
2566  # Fortran compiler  # Fortran compiler
2567  F90C = ${F90C}  F90C = ${F90C}
2568    # C compiler
2569    CC = ${CC}
2570  # Link editor  # Link editor
2571  LINK = ${LINK} ${LDADD}  LINK = ${LINK} ${LDADD}
2572    
# Line 1675  INCLUDES = ${INCLUDES} Line 2578  INCLUDES = ${INCLUDES}
2578  KFLAGS1 = ${KFLAGS1}  KFLAGS1 = ${KFLAGS1}
2579  KFLAGS2 = ${KFLAGS2}  KFLAGS2 = ${KFLAGS2}
2580  # Optim./debug for FC  # Optim./debug for FC
2581  FFLAGS = ${FFLAGS}  FFLAGS = ${FFLAGS} ${FEXTRAFLAGS}
2582  FOPTIM = ${FOPTIM}  FOPTIM = ${FOPTIM}
2583  # Optim./debug for FC  # Optim./debug for FC
2584  F90FLAGS = ${F90FLAGS}  F90FLAGS = ${F90FLAGS}
2585  F90OPTIM = ${F90OPTIM}  F90OPTIM = ${F90OPTIM}
2586    F90FIXEDFORMAT = ${F90FIXEDFORMAT}
2587  # Flags for CC  # Flags for CC
2588  CFLAGS = ${CFLAGS}  CFLAGS = ${CFLAGS}
2589  # Files that should not be optimized  # Files that should not be optimized
2590  NOOPTFILES = ${NOOPTFILES}  NOOPTFILES = ${NOOPTFILES}
2591  NOOPTFLAGS = ${NOOPTFLAGS}  NOOPTFLAGS = ${NOOPTFLAGS}
2592  # Flags and libraries needed for linking  # Flags and libraries needed for linking
2593  LIBS = ${LIBS} \$(XLIBS)  LIBS = ${LIBS}
2594  # Name of the Mekfile  # Name of the Mekfile
2595  MAKEFILE=${MAKEFILE}  MAKEFILE=${MAKEFILE}
2596    
2597  EOF  EOF
2598    
2599  cat srclist.inc       >> $MAKEFILE  cat F77srclist.tmp      >> $MAKEFILE
2600  cat csrclist.inc      >> $MAKEFILE  cat nonADF77srclist.tmp >> $MAKEFILE
2601  cat f90srclist.inc    >> $MAKEFILE  cat csrclist.tmp        >> $MAKEFILE
2602  cat hlist.inc         >> $MAKEFILE  cat F90srclist.tmp      >> $MAKEFILE
2603  cat ad_flow_files.inc >> $MAKEFILE  cat hsrclist.tmp        >> $MAKEFILE
2604    cat ad_flow_files.tmp   >> $MAKEFILE
2605    
2606    rm -f F77srclist.tmp nonADF77srclist.tmp csrclist.tmp F90srclist.tmp hsrclist.tmp ad_flow_files.tmp
2607    
2608  echo >> $MAKEFILE  echo >> $MAKEFILE
2609  echo 'F77FILES =  $(SRCFILES:.'$FEXT'=.f)'        >> $MAKEFILE  
2610  echo 'F90FILES =  $(F90SRCFILES:.'$F90EXT'=.f90)' >> $MAKEFILE  # add definitions for preprocessed sources
2611  echo 'OBJFILES =  $(SRCFILES:.'$FEXT'=.o) $(CSRCFILES:.c=.o) $(F90SRCFILES:.'$F90EXT'=.o)' >> $MAKEFILE  # and note that not all systems allow case sensitive extensions
2612    # hence the $FS and $FS90 here.
2613    # for fixed format f90 files we use ff90 or FF90 resp
2614    # but these are not expected to be the original source files
2615    
2616    echo 'F77_PP_SRC_FILES = $(F77_SRC_FILES:.F=.'$FS')'      >> $MAKEFILE
2617    echo 'F90_PP_SRC_FILES = $(F90_SRC_FILES:.F90=.'$FS90')' >> $MAKEFILE
2618    echo 'OBJFILES= $(F77_SRC_FILES:.F=.o) $(C_SRC_FILES:.c=.o) $(F90_SRC_FILES:.F90=.o)' >> $MAKEFILE
2619    echo 'FLOFILES =  $(AD_FLOW_FILES:.flow=.flowdir)' >> $MAKEFILE
2620  echo >> $MAKEFILE  echo >> $MAKEFILE
2621  echo '.SUFFIXES:' >> $MAKEFILE  echo '.SUFFIXES:' >> $MAKEFILE
2622  echo '.SUFFIXES: .o .f .p .'$FEXT' .c .'$F90EXT' .f90' >> $MAKEFILE  echo '.SUFFIXES: .o .'$FS' .p .F .c .f'$FS90' .'$FS90' .FF90 .F90 .flowdir .flow' >> $MAKEFILE
   
 rm -f srclist.inc csrclist.inc hlist.inc flist.tmp clist.tmp f90srclist.inc  
 rm -f ad_flow_files.inc  
2623    
2624  cat >>$MAKEFILE <<EOF  cat >>$MAKEFILE <<EOF
2625    
2626  all: \$(EXECUTABLE)  all: \$(EXECUTABLE)
2627  \$(EXECUTABLE): \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(OBJFILES)  \$(EXECUTABLE): \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(OBJFILES) \$(EMBEDDED_FILES)
2628          @echo Creating \$@ ...          @echo Creating \$@ ...
2629          \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)          \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
2630  depend:  depend:
2631          @make links          @make links
2632          \$(MAKEDEPEND) -o .f \$(DEFINES) \$(INCLUDES) \$(SRCFILES)          \$(MAKEDEPEND) -o .$FS \$(DEFINES) \$(INCLUDES) \$(F77_SRC_FILES)
2633          \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)          \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
2634          -rm -f makedepend.out          -rm -f makedepend.out
2635    
2636  links: \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(SPECIAL_FILES)  lib: libmitgcmuv.a
2637    
2638    libmitgcmuv.a: \$(OBJFILES)
2639            ar rcv libmitgcmuv.a \$(OBJFILES)
2640            ar d   libmitgcmuv.a main.o
2641    
2642  small_f: \$(F77FILES) \$(F90FILES)  links: \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(SPECIAL_FILES)
2643    
2644    small_f: \$(F77_PP_SRC_FILES) \$(F90_PP_SRC_FILES)
2645    
2646  output.txt: \$(EXECUTABLE)  output.txt: \$(EXECUTABLE)
2647          @printf 'running ... '          @printf 'running ... '
2648          @\$(EXECUTABLE) > \$@          @\$(EXECUTABLE) > \$@
2649    
2650  clean:  clean:
2651          -rm -rf *.o *.f *.p *.f90 *.mod ${RMFILES} work.{pc,pcl} *.template          -rm -rf *.p *.$FS90 *.mod ${RMFILES} work.{pc,pcl} *.template
2652            -rm -rf *.o
2653            -rm -rf *.$FS *.flowdir
2654            -rm -rf *.f$FS90 \$(AD_CLEAN) ad_input*
2655  Clean:  Clean:
2656          @make clean          @make clean
2657          @make cleanlinks          @make cleanlinks
2658          -rm -f \$(SPECIAL_FILES)          -rm -f \$(SPECIAL_FILES)
2659          -rm -f genmake_state genmake_*optfile genmake_warnings make.log run.log *.bak          -rm -f genmake_state genmake_*optfile genmake_warnings genmake_errors
2660            -rm -f make.log run.log f90mkdepend.log *.bak
2661            -rm -f taf_command taf_output taf_ad.log taf_ad_flow.log
2662  CLEAN:  CLEAN:
2663          @make Clean          @make Clean
2664          -find \$(EXEDIR) -name "*.meta" -exec rm {} \;          -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
2665          -find \$(EXEDIR) -name "*.data" -exec rm {} \;          -find \$(EXEDIR) -name "*.data" -exec rm {} \;
2666          -find \$(EXEDIR) -name "fort.*" -exec rm {} \;          -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
2667          -rm -f \$(EXECUTABLE) output.txt          -rm -f \$(EXECUTABLE) \$(EXE_AD) *.txt STD* *diagnostics.log datetime
2668            -rm -f *_MIT_CE_000.opt0000 costfunction*0000
2669            -rm -rf mnc_test_*
2670    
2671  #eh3 Makefile: makefile  #eh3 Makefile: makefile
2672  makefile:  makefile:
# Line 1748  makefile: Line 2674  makefile:
2674  cleanlinks:  cleanlinks:
2675          -find . -type l -exec rm {} \;          -find . -type l -exec rm {} \;
2676    
2677  # Special targets ($SPECIAL_FILES) which are create by make  # Special targets (SPECIAL_FILES) which are created by make
2678  ${PACKAGES_DOT_H}:  ${PACKAGES_DOT_H}:
2679          @echo Creating \$@ ...          @echo Creating \$@ ...
2680          @$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) > \$@          @$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) > \$@
# Line 1759  FC_NAMEMANGLE.h: Line 2685  FC_NAMEMANGLE.h:
2685          @echo Creating \$@ ...          @echo Creating \$@ ...
2686          echo "$FC_NAMEMANGLE" > \$@          echo "$FC_NAMEMANGLE" > \$@
2687    
2688  # The normal chain of rules is (  .$FEXT - .f - .o  )  BUILD_INFO.h:
2689  .$FEXT.f:          @echo Creating \$@ ...
2690    EOF
2691    
2692    test ! "x$THISVER" = x  && echo "       -echo \"#define THISVER '$THISVER'\" > \$@"   >> $MAKEFILE
2693    test ! "x$THISUSER" = x && echo "       -echo \"#define THISUSER '$THISUSER'\" >> \$@" >> $MAKEFILE
2694    test ! "x$THISDATE" = x && echo "       -echo \"#define THISDATE '$THISDATE'\" >> \$@" >> $MAKEFILE
2695    test ! "x$THISHOST" = x && echo "       -echo \"#define THISHOST '$THISHOST'\" >> \$@" >> $MAKEFILE
2696    
2697    if test "x$EMBED_SRC" = xt ; then
2698        cat >>$MAKEFILE <<EOF
2699    
2700    decode_files.o : EMBEDDED_FILES.h
2701    
2702    ##  \$(F77_PP_SRC_FILES)
2703    all_fF.tar.gz : \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(F77_PP_SRC_FILES) Makefile
2704            @echo Creating \$@ ...
2705            -tar -hcf all_fF.tar \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(F77_PP_SRC_FILES) Makefile
2706            -rm -f all_fF.tar.gz
2707            -gzip all_fF.tar
2708    
2709    EMBEDDED_FILES.h : all_fF.tar.gz
2710            @echo Creating \$@ ...
2711            -\${ROOTDIR}/tools/embed_encode/encode_files EMBEDDED_FILES.h all_fF.tar.gz
2712    
2713    EOF
2714    fi
2715    
2716    cat >>$MAKEFILE <<EOF
2717    
2718    # The normal chain of rules is (  .F - .$FS - .o  )
2719    
2720    ## This nullifies any default implicit rules concerning these two file types:
2721    ## %.o : %.F
2722    
2723    .F.$FS:
2724          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2725  .f.o:  .$FS.o:
2726          \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<          \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
2727  .$F90EXT.f90:  .F90.$FS90:
2728          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2729  .f90.o:  .FF90.f$FS90:
2730            \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2731    .$FS90.o:
2732          \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<          \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
2733    .f$FS90.o:
2734            cp \$< \$(basename  \$<).f90
2735            \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$(F90FIXEDFORMAT) \$(basename  \$<).f90
2736  .c.o:  .c.o:
2737          \$(CC) \$(CFLAGS) -c \$<          \$(CC) \$(CFLAGS) \$(DEFINES) \$(INCLUDES) -c \$<
2738    .flow.flowdir:
2739            \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2740    
2741  # Special exceptions that use the ( .$FEXT - .p - .f - .o ) rule-chain  # Special exceptions that use the ( .F - .p - .$FS - .o ) rule-chain
2742  .$FEXT.p:  .F.p:
2743          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@          \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2744  .p.f:  .p.$FS:
2745          \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<          \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
2746    
2747    EOF
2748    
2749  #=========================================  #=========================================
2750  #===  Automatic Differentiation Rules  ===  #===  Automatic Differentiation Rules  ===
2751    #===  for TAMC/TAF  ======================
2752    
2753    if test "x$OPENAD" = x ; then
2754    
2755    cat >>$MAKEFILE <<EOF
2756    
2757  TAMC           = ${TAMC}  TAMC           = ${TAMC}
2758  TAF            = ${TAF}  TAF            = ${TAF}
# Line 1793  ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF Line 2767  ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF
2767  ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"  ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
2768  for i in $ad_vars ; do  for i in $ad_vars ; do
2769      name=$i      name=$i
2770      t1="t2=\$"`echo $i`      t1="t2=\$"`echo "$i"`
2771      eval $t1      eval $t1
2772      printf "%-20s = " $name >> $MAKEFILE      printf "%-20s = " $name >> $MAKEFILE
2773      echo $t2 >> $MAKEFILE      echo "$t2" | sed -e 's| \+| |g' >> $MAKEFILE
2774  done  done
2775    
2776  echo "  Add the source list for AD code generation"  echo "  Add the source list for AD code generation"
2777  echo >> $MAKEFILE  echo >> $MAKEFILE
2778  printf "AD_FILES = " >> $MAKEFILE  printf "AD_FILES = " >> $MAKEFILE
2779  AD_FILES=`cat ad_files`  AD_FILES=`cat adSrcFiles.tmp`
2780  for i in $AD_FILES ; do  for i in $AD_FILES ; do
2781      echo    " \\" >> $MAKEFILE      echo    " \\" >> $MAKEFILE
2782      printf " $i" >> $MAKEFILE      printf " $i" >> $MAKEFILE
2783  done  done
2784  echo >> $MAKEFILE  echo >> $MAKEFILE
2785  rm -f ad_files  rm -f adSrcFiles.tmp
2786    
2787  cat >>$MAKEFILE <<EOF  cat >>$MAKEFILE <<EOF
2788    
2789  # ... AD ...  # ... AD ...
2790  adall: ad_taf  adall: \$(EXE_AD)
2791  adtaf: ad_taf_output.f  adtaf: ad_taf_output.$FS
2792  adtamc: ad_tamc_output.f  adtamc: ad_tamc_output.$FS
2793    
2794  ad_input_code.f: \$(AD_FILES) \$(HEADERFILES)  ad_input_code.$FS: \$(AD_FILES) \$(H_SRC_FILES) \$(AD_FLOW_FILES)
2795          @$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          @$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
2796          cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h          cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
2797          -rm -f ad_config.template          -rm -f ad_config.template
2798          @make \$(F77FILES)          @make \$(F77_PP_SRC_FILES)
2799          @make \$(AD_FLOW_FILES)          @make \$(FLOFILES)
2800          cat \$(AD_FLOW_FILES) \$(AD_FILES) > ad_input_code.f          cat \$(FLOFILES) \$(AD_FILES) | sed -f \$(TOOLSDIR)/remove_comments_sed > ad_input_code.$FS
2801    
2802  ad_taf_output.f: ad_input_code.f  ad_taf_output.$FS: ad_input_code.$FS
2803          \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f          \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2804          cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f          ls -l ad_input_code_ad.$FS
2805            cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2806    
2807  adtafonly:  adtafonly:
2808          \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f          \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2809          cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f          ls -l ad_input_code_ad.$FS
2810            cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2811  ad_taf: ad_taf_output.o \$(OBJFILES)  
2812          \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)  \${EXE_AD}: ad_taf_output.o \$(OBJFILES)
2813            \$(LINK) -o \${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
2814  ad_tamc_output.f: ad_input_code.f  
2815          \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.f  ad_tamc_output.$FS: ad_input_code.$FS
2816          cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.f          \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.$FS
2817            cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.$FS
2818    
2819  ad_tamc: ad_tamc_output.o \$(OBJFILES)  ad_tamc: ad_tamc_output.o \$(OBJFILES)
2820          \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)          \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
2821    
2822    adonlyfwd:
2823            patch < \$(TOOLSDIR)/ad_taf_output.f.onlyfwd.diff
2824    
2825    adtrick:
2826            patch < \$(TOOLSDIR)/ad_taf_output.f.adtrick.diff
2827    
2828  # ... FTL ...  # ... FTL ...
2829  ftlall: ftl_taf  ftlall: ftl_taf
2830  ftltaf: ftl_taf_output.f  ftltaf: ftl_taf_output.$FS
2831  ftltamc: ftl_tamc_output.f  ftltamc: ftl_tamc_output.$FS
2832    
2833  ftl_input_code.f: \$(AD_FILES) \$(HEADERFILES)  ftl_input_code.$FS: \$(AD_FILES) \$(H_SRC_FILES)
2834          @$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          @$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
2835          cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h          cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
2836          -rm -f ftl_config.template          -rm -f ftl_config.template
2837          @make \$(F77FILES)          @make \$(F77_PP_SRC_FILES)
2838          @make \$(AD_FLOW_FILES)          @make \$(AD_FLOW_FILES)
2839          cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.f          cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.$FS
2840    
2841  ftl_taf_output.f: ftl_input_code.f  ftl_taf_output.$FS: ftl_input_code.$FS
2842          \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f          \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
2843          cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f          ls -l ftl_input_code_ftl.$FS
2844            cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
2845    
2846  ftltafonly:  ftltafonly:
2847          \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f          \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
2848          cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f          ls -l ftl_input_code_ftl.$FS
2849            cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
2850    
2851  ftl_taf: ftl_taf_output.o \$(OBJFILES)  ftl_taf: ftl_taf_output.o \$(OBJFILES)
2852          \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)          \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
2853    
2854  ftl_tamc_output.f: ftl_input_code.f  ftl_tamc_output.$FS: ftl_input_code.$FS
2855          \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.f          \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.$FS
2856          cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.f          cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.$FS
2857    
2858  ftl_tamc: ftl_tamc_output.o \$(OBJFILES)  ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
2859          \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)          \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
2860    
2861    
2862  # ... SVD ...  # ... SVD ...
2863  svdtaf: ad_taf_output.f ftl_taf_output.f  svdtaf: ad_taf_output.$FS ftl_taf_output.$FS
2864  svdall: svd_taf          @echo "--->>> Only ran TAF to generate SVD code!    <<<---"
2865            @echo "--->>> Do make svdall afterwards to compile. <<<---"
2866    svdall: svd_touch svd_taf
2867    
2868  svd_taf: ad_taf_output.o ftl_taf_output.o \$(OBJFILES)  svd_taf: \$(OBJFILES)
2869          \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)          \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
2870    
2871            @echo "--->>> Only COMPILE svd code! <<<---"
2872            @echo "--->>> Assumes you previously <<<---"
2873            @echo "--->>> did make svdtaf        <<<---"
2874    
2875    svd_touch:
2876            @echo "--->>> Only COMPILE svd code! <<<---"
2877            @echo "--->>> Assumes you previously <<<---"
2878            @echo "--->>> did make svdtaf        <<<---"
2879            touch ad_taf_output.$FS ftl_taf_output.$FS
2880            \$(FC) \$(FFLAGS) \$(FOPTIM) -c ad_taf_output.$FS
2881            \$(FC) \$(FFLAGS) \$(FOPTIM) -c ftl_taf_output.$FS
2882            @$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
2883            cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
2884            -rm -f ftl_config.template
2885    
2886    EOF
2887    
2888    fi
2889    
2890  #=========================================  #===  for OpenAD  ========================
2891    
2892    if test "x$OPENAD" != x ; then
2893    
2894    # ============ begin OpenAD specific section ==============
2895    
2896    cat >>$MAKEFILE <<EOF
2897    
2898    # all the source files linked from the various locations:
2899    ALL_LINKED_FILES= \
2900    \$(F77_SRC_FILES) \
2901    \$(C_SRC_FILES) \
2902    \$(H_SRC_FILES) \
2903    \$(F90_SRC_FILES) \
2904    \$(SPECIAL_FILES)
2905    
2906    ifndef OPENADROOT
2907      \$(error "Error:  environment variable OPENADROOT not defined!")
2908    endif
2909    
2910    ifndef XAIFSCHEMAROOT
2911      \$(error "Error:  environment variable XAIFSCHEMAROOT not defined!")
2912    endif
2913    
2914    ifndef XAIFBOOSTERROOT
2915      \$(error "Error:  environment variable XAIFBOOSTERROOT not defined!")
2916    endif
2917    
2918    EOF
2919    
2920    echo "  Add the source list for common block to module conversion "
2921    echo >> $MAKEFILE
2922    printf "CB2M_F90_SRC_NAMES = " >> $MAKEFILE
2923    for i in `cat ${OAD_CB2M_FILES}` ; do
2924      echo    " \\" >> $MAKEFILE
2925      printf " $i" >> $MAKEFILE
2926    done
2927    echo >> $MAKEFILE
2928    
2929    echo "  Add the source list for AD code generation"
2930    echo >> $MAKEFILE
2931    printf "AD_FILES = " >> $MAKEFILE
2932    for i in `cat ${OAD_CB2M_FILES}` ; do
2933      echo    " \\" >> $MAKEFILE
2934      printf " ${i}_mod.f$FS90" >> $MAKEFILE
2935    done
2936    AD_FILES=`cat adSrcFiles.tmp`
2937    for i in $AD_FILES ; do
2938      basename=${i%%.f}
2939      toBeIgnored=`egrep ^$basename'[      ]*' ${OAD_DONT_COMPILE} ${OAD_DONT_TRANSFORM}`
2940      if test -z "$toBeIgnored" ; then
2941        echo    " \\" >> $MAKEFILE
2942        printf " $i" >> $MAKEFILE
2943      fi
2944    done
2945    echo >> $MAKEFILE
2946    rm -f adSrcFiles.tmp
2947    
2948    cat >>$MAKEFILE <<EOF
2949    
2950    adAll: \$(EXE_AD)
2951    .PHONY: adAll
2952    
2953    CB2M_F90_PP_SRC_FILES=\$(addsuffix _mod.f$FS90, \$(CB2M_F90_SRC_NAMES))
2954    
2955    .PRECIOUS: \$(CB2M_F90_PP_SRC_FILES) \$(NON_AD_F77_SRC_FILES:.F=_cb2m.f$FS90)
2956    
2957    .PHONY: adDepend
2958    adDepend: \$(ALL_LINKED_FILES) \$(addsuffix _mod.h, \$(CB2M_F90_SRC_NAMES)) \$(addsuffix _mod.FF90, \$(CB2M_F90_SRC_NAMES)) \$(F77_SRC_FILES:.F=_cb2m.FF90)
2959            \$(MAKEDEPEND) -o .$FS \$(DEFINES) \$(INCLUDES) \$(F77_SRC_FILES)
2960            \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
2961            -rm -f makedepend.out
2962    
2963    OPENAD_SUPPORT_F90_SRC_FILES = \
2964    w2f__types.F90 \
2965    OAD_active.F90 \
2966    OAD_cp.F90 \
2967    OAD_rev.F90 \
2968    OAD_tape.F90        
2969    
2970    OPENAD_SUPPORT_C_SRC_FILES = \
2971    iaddr.c \
2972    timeRatio.c
2973    
2974    f95_test_mods.f90: \$(OPENAD_SUPPORT_F90_SRC_FILES:F90=$FS90)
2975            cat \$^ > \$@
2976    
2977    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
2978            cat \$^ > \$@
2979    
2980    f95_test.out: f95_test_mods.f90 f95_test.f90
2981            f95 -fixed -w=unused -maxcontin=132 -c f95_test_mods.f90 > \$@ 2>&1
2982            f95 -fixed -w=unused -maxcontin=132 -c -fixed f95_test.f90 >> \$@ 2>&1
2983    
2984    # the file included below is created by the
2985    # postProcessor and its inclusion sets the
2986    # variable POSTPROCESSEDFILES
2987    # used below. Because the file is made during
2988    # make it won't be read until the second (recursive)
2989    # invocation in the rule below
2990    -include postProcess.make
2991    
2992    AD_OBJ_FILES_S1=\$(OPENAD_SUPPORT_F90_SRC_FILES:.F90=.o) \$(OPENAD_SUPPORT_C_SRC_FILES:.c=.o) \$(POSTPROCESSEDFILES:.f$FS90=.o)
2993    
2994    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)
2995    
2996    postProcess.comp: \$(ALL_LINKED_FILES) \$(addsuffix _mod.h, \$(CB2M_F90_SRC_NAMES)) postProcess.tag \$(AD_OBJ_FILES_S1)
2997    ifeq (\$(MAKELEVEL),0)
2998            \$(MAKE) adAll
2999    else
3000            touch \$@
3001    endif
3002    
3003    \$(EXE_AD): \$(ALL_LINKED_FILES) \$(addsuffix _mod.h, \$(CB2M_F90_SRC_NAMES)) postProcess.comp \$(AD_OBJ_FILES_S2)
3004    ifeq (\$(MAKELEVEL),1)
3005            \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(AD_OBJ_FILES_S2) \$(LIBS)
3006    else
3007            touch \$@
3008    endif
3009    
3010    # makefile debug rule
3011    openad: ad_input_code.w2f.pre.xb.x2w.w2f.td.pp.f$FS90
3012    .PHONY: openad
3013    
3014    # create the module files
3015    %_mod.FF90 : %.h ../OAD_support/cb2mGetModules.csh ../OAD_support/cb2mGetModules.awk
3016            ../OAD_support/cb2mGetModules.csh $< ../OAD_support/cb2mGetModules.awk
3017    
3018    # create the header files
3019    %_mod.h : %.h ../OAD_support/cb2mGetHeaders.csh ../OAD_support/cb2mGetHeaders.awk
3020            ../OAD_support/cb2mGetHeaders.csh $< ../OAD_support/cb2mGetHeaders.awk \$(CB2M_F90_SRC_NAMES)
3021    
3022    # change everybody else to use the new module files:
3023    %_cb2m.FF90 : %.F ../OAD_support/cb2mUseModules.bash
3024            ../OAD_support/cb2mUseModules.bash $< ${MPI}
3025    
3026    # makefile debug rule
3027    small_f: \$(CB2M_F90_PP_SRC_FILES)
3028    .PHONY: small_f
3029    
3030    ad_output.txt: \$(EXE_AD)
3031            @printf 'linking data files ... '
3032            \$(LN) -f ../input_ad/data* ../input_ad/eedata .
3033            \$(LN) -f ../../global_ocean.90x40x15/input/*.bin .
3034            @printf 'running ... '
3035            @./\$(EXE_AD) > \$@
3036    
3037    CB2M_AD_FILES=\$(AD_FILES:.f=_cb2m.f$FS90)
3038    ad_input_code.f$FS90:  \$(CB2M_AD_FILES)
3039            cat \$^ > \$@
3040    
3041    # strip all comments and blanks to reduce
3042    # the file size in order to reduce perl's memory requirements
3043    ad_input_code_sf.f$FS90 : ad_input_code.f$FS90
3044            cat \$^ | sed -f ../OAD_support/strip.sed | sed -f ../OAD_support/stop2print.sed > \$@
3045    
3046    # mfef90 preprocessing
3047    # expand statement functions
3048    # expose mfef90 specific substring handling
3049    # add the w2f__types module
3050    ad_input_code_sf.w2f.f$FS90: ad_input_code_sf.f$FS90 mfef90 whirl2f whirl2f_be w2f__types.f90
3051            ./mfef90 -r8 -z -F -N132 \$<
3052            mv \$<.B \$(basename \$<).B
3053            ./whirl2f -openad \$(basename \$<).B
3054            cat w2f__types.f90 \$(basename \$<).w2f.f > \$@
3055    
3056    # canonicalizer
3057    ad_input_code_sf.w2f.pre.f$FS90: ad_input_code_sf.w2f.f$FS90 preProcess.py
3058            ./preProcess.py --timing --r8 -H -S \$< -o \$@
3059    
3060    # F -> WHIRL
3061    # note that the canonicalized version cuts off at col 72
3062    # doing this also for string constants which is ok as long
3063    # as we are in fixed mode and cut of exactly there.
3064    # Otherwise mfef90 patches in spaces to fill up to 72 (or 132)
3065    # characters respectively.
3066    ad_input_code_sf.w2f.pre.B: ad_input_code_sf.w2f.pre.f$FS90 mfef90
3067            ./mfef90 -r8 -z -F \$<
3068            mv \$<.B \$@
3069    
3070    # WHIRL -> XAIF
3071    ad_input_code_sf.w2f.pre.xaif : ad_input_code_sf.w2f.pre.B whirl2xaif
3072            ./whirl2xaif -s -n --debug 1 -o \$@ \$<
3073    
3074    # XAIF -> XAIF'
3075    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
3076            ./oadDriver -f -t forward_step -i \$< -c \${XAIFSCHEMAROOT}/schema/examples/inlinable_intrinsics.xaif -o \$@ -I -r
3077    
3078    # XAIF' -> WHIRL'
3079    ad_input_code_sf.w2f.pre.xb.x2w.B : ad_input_code_sf.w2f.pre.xb.xaif xaif2whirl
3080            ./xaif2whirl --debug 1 ad_input_code_sf.w2f.pre.B \$<
3081    
3082    # WHIRL' -> F'
3083    ad_input_code_sf.w2f.pre.xb.x2w.w2f.f$FS90: ad_input_code_sf.w2f.pre.xb.x2w.B whirl2f whirl2f_be
3084            ./whirl2f -FLIST:ftn_file=\$@ -openad \$<
3085    
3086    # insert template directives
3087    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
3088            ../OAD_support/insertTemplateDir.bash \$< \$@
3089    
3090    PPEXTRAS=\$(wildcard ../OAD_support/ad_template.*.F) ../OAD_support/ad_inline.F
3091    # postprocess F'
3092    postProcess.tag: ad_input_code_sf.w2f.pre.xb.x2w.w2f.td.f$FS90 postProcess.py \$(PPEXTRAS:.F=.f)
3093            # the target is a placeholder to signal execution of the rule
3094            touch \$@
3095            # this step also creates the file postProcess.make but we cannot
3096            # name it as the target or else make will try to remake it for
3097            # the include directive above for any rule, e.g. make clean
3098            ./postProcess.py --progress --timing --outputFormat=fixed -m r -i ../OAD_support/ad_inline.f --width 4 \$<
3099    
3100    # setup some links
3101    %.xsd:
3102            \$(LN) \${XAIFSCHEMAROOT}/schema/\$@ .
3103    
3104    mfef90:
3105            \$(LN) \${OPEN64ROOT}/crayf90/sgi/mfef90 .
3106    
3107    # link the support files:
3108    \$(OPENAD_SUPPORT_F90_SRC_FILES) \$(OPENAD_SUPPORT_C_SRC_FILES):
3109            \$(LN) ../OAD_support/\$@ .
3110    
3111    whirl2xaif xaif2whirl:
3112            \$(LN) \${OPENADFORTTK}/bin/\$@ .
3113    
3114    preProcess.py postProcess.py:
3115            \$(LN) \${OPENADFORTTK_BASE}/tools/SourceProcessing/\$@ .
3116    
3117    whirl2f whirl2f_be:
3118            \$(LN) \${OPEN64ROOT}/whirl2f/\$@ .
3119    
3120    oadDriver:
3121            \$(LN) \${XAIFBOOSTERROOT}/xaifBooster/algorithms/BasicBlockPreaccumulationReverse/driver/oadDriver \$@
3122    
3123    AD_CLEAN += *_mod.h *_mod.F90 *.FF90 *.mod-whirl temp.sed oad_cp.* postProcess.make postProcess.tag postProcess.comp \$(PPEXTRAS:.F=.f)
3124    
3125    # ============ end OpenAD specific section ==============
3126    
3127  EOF  EOF
3128    
3129    fi
3130    
3131    #=========================================
3132    
3133  if test "x$EXEHOOK" != x ; then  if test "x$EXEHOOK" != x ; then
3134      printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE      printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE
3135  fi  fi
# Line 1899  for i in $KPPFILES ; do Line 3141  for i in $KPPFILES ; do
3141      if test "x$RETVAL" != x0 ; then      if test "x$RETVAL" != x0 ; then
3142          echo "Error: unable to add file \"$i\" to the exceptions list"          echo "Error: unable to add file \"$i\" to the exceptions list"
3143      fi      fi
3144      echo "$base.f: $base.p" >> $MAKEFILE      echo "$base.$FS: $base.p" >> $MAKEFILE
3145  done  done
3146    
3147  echo "  Making list of NOOPTFILES"  echo "  Making list of NOOPTFILES"
# Line 1909  for i in $NOOPTFILES ; do Line 3151  for i in $NOOPTFILES ; do
3151      if test "x$RETVAL" != x0 ; then      if test "x$RETVAL" != x0 ; then
3152          echo "Error: unable to add file \"$i\" to the exceptions list"          echo "Error: unable to add file \"$i\" to the exceptions list"
3153      fi      fi
3154      echo "$base.o: $base.f" >> $MAKEFILE      echo "$base.o: $base.$FS" >> $MAKEFILE
3155      printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE      printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE
3156  done  done
3157    

Legend:
Removed from v.1.75  
changed lines
  Added in v.1.204

  ViewVC Help
Powered by ViewVC 1.1.22