/[MITgcm]/MITgcm_contrib/mlosch/tools/genmake2
ViewVC logotype

Annotation of /MITgcm_contrib/mlosch/tools/genmake2

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.1 - (hide annotations) (download)
Wed Dec 10 08:37:48 2014 UTC (10 years, 7 months ago) by mlosch
Branch: MAIN
This version of genmake2 handles the new type of output of TAF v2,
i.e. the fact that the forward code that TAF thinks relevant is
returned together with the derivative code, in a different way than
the original genmake2: Instead of concatenating all fortran sources
and sending one monolithic ad_input_code.f to TAF, the sources are
sent to TAF directly: staf [options] $(FLOWFILES) $(AD_FILES). This
makes it faster to compile the returned sources because you can use
the "parallel" capabilities of (g)make (with option -j n); also you
can modify individual sources (that have been returned by TAF) without
having to recompile a large ad_taf_output.f making debugging a little
easier.

This version of genmake2 works with both testreport -adm and testreport -tlm.

genmake2_patch.diff patches the "official" genmake2 until hopefully
this version makes into the main repository.  Usage:
patch -p1 your_genmake2 genmake2_patch.diff

In order to make this work I had to modify the target ad_taf_output.f
(and similarly ftl_taf_output.f) and introduce new targets:

- remove_comments applies \$(TOOLSDIR)/remove_comments_sed to all
$(AD_FILES) will remove the comments, this may be annoying, if you are
used to working with the *.f files and need to comments for
orientation within the file, but I think that the *.f files can be
generated so easily, that this does not matter much. This target is
really only needed if you have a slow uplink and want to sent smaller
files to staf

- adj_sed and ftl_sed apply $(TOOLSDIR)/adjoint_sed to
  $(AD_FILES:.$FS=_ad/tl.$FS)

- adjobjfiles and ftlobjfiles force compiling the taf-generated files
  after the $(TAF) command

The TAMC related target are not touched, but I did not test the result

Issues:
>>>> The Makefile still generates ad_taf_output.f and ftl_taf_output.f to
be used for svd_taf (although I am not sure, if this will work,
because I don't know how it is supposed to work). <<<<

>>>> The targets adonlyfwd, adtrick will probably not work, but do we
still need them? <<<<

>>>> The $(EXE_AD/FTL) targets now depends on ad/ftl_taf_output.$FS
(not .o anymore), which is generated after making adjobjfiles. This is
a bit of a hack and potentially fragile, but I couldn't think of
anything else to trick "make" into compiling in two separate
steps. <<<<

>>>> Another weakness is the "inplace" use of sed, (sed -i), which
will not work with some sed implementations (POSIX?). Alternatively
one could modify the .F.$FS and .$FS.o rules like this:

.F.$FS:
	sed -f \$(TOOLSDIR)/remove_comments_sed \$< > \$<.tmp && mv \$<.tmp \$<
	\$(CPPCMD) > \$@
.$FS.o:
	sed -f \$(TOOLSDIR)/adjoint_sed \$< > \$<.tmp && mv \$<.tmp \$<
 	$(FC) $(FFLAGS) $(FOPTIM) -c $<

but these would then be applied to all files and not only
the $(AD_FILES). Any suggestion how to improve this is very welcome. <<<<

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

  ViewVC Help
Powered by ViewVC 1.1.22