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

Annotation of /MITgcm/tools/genmake2

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


Revision 1.180 - (hide annotations) (download)
Thu Dec 11 17:50:56 2008 UTC (10 years, 9 months ago) by utke
Branch: MAIN
CVS Tags: checkpoint61g
Changes since 1.179: +2 -2 lines
updated flag

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