/[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.167 - (hide annotations) (download)
Mon Nov 26 21:39:58 2007 UTC (12 years ago) by jmc
Branch: MAIN
CVS Tags: checkpoint59m, checkpoint59l, checkpoint59n, checkpoint59k
Changes since 1.166: +1 -7 lines
if exits, "source" genmake_local only once
(was originaly the case, until version 1.11, no idea why it was done twice
 in version 1.12 and newer)

1 edhill 1.86 #! /usr/bin/env bash
2 edhill 1.1 #
3 jmc 1.167 # $Header: /u/gcmpack/MITgcm/tools/genmake2,v 1.166 2007/10/29 20:47:42 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 edhill 1.118 make genmake_tc_1.o >> genmake_warnings 2>&1
750 edhill 1.39 RET_C=$?
751 edhill 1.118 cat <<EOF > genmake_tc_2.$FS
752 edhill 1.39 program hello
753 edhill 1.129 REAL*8 wtime
754 edhill 1.39 external cloc
755     call cloc(wtime)
756     print *," HELLO WORLD", wtime
757 edhill 1.128 end
758 edhill 1.39 EOF
759 mlosch 1.163 COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
760     echo $COMM >> genmake_warnings
761     $COMM >> genmake_warnings 2>&1
762 edhill 1.39 RET_F=$?
763 edhill 1.118 test -x ./genmake_tc && ./genmake_tc >> genmake_warnings 2>&1
764 edhill 1.39 RETVAL=$?
765     if test "x$RETVAL" = x0 ; then
766     HAVE_CLOC=t
767     DEFINES="$DEFINES -DHAVE_CLOC"
768     fi
769     rm -f genmake_tc*
770     }
771    
772    
773 edhill 1.137 check_HAVE_SIGREG() {
774 edhill 1.150 if test ! "x$HAVE_SIGREG" = x ; then
775     return
776     fi
777 edhill 1.137 get_fortran_c_namemangling
778     cat <<EOF > genmake_tc_1.c
779     $FC_NAMEMANGLE
780     #include <stdlib.h>
781     #include <stdio.h>
782     #include <signal.h>
783     #include <errno.h>
784     #include <ucontext.h>
785    
786     int * ip;
787    
788     static void killhandler(
789     unsigned int sn, siginfo_t si, struct ucontext *sc )
790     {
791     *ip = *ip + 1;
792     return;
793     }
794    
795     void FC_NAMEMANGLE(sigreg) (int * aip)
796     {
797 edhill 1.138 struct sigaction s;
798 edhill 1.137 ip = aip;
799     s.sa_flags = SA_SIGINFO;
800     s.sa_sigaction = (void *)killhandler;
801     if(sigaction (SIGTERM,&s,(struct sigaction *)NULL)) {
802     printf("Sigaction returned error = %d\n", errno);
803     exit(0);
804     }
805     return;
806     }
807     EOF
808     make genmake_tc_1.o >> genmake_warnings 2>&1
809     RET_C=$?
810     cat <<EOF > genmake_tc_2.$FS
811     program hello
812     integer anint
813     common /iv/ anint
814     external sigreg
815     call sigreg(anint)
816     end
817     EOF
818     echo >> genmake_warnings
819     echo "running: check_HAVE_SIGREG()" >> genmake_warnings
820     cat genmake_tc_2.$FS >> genmake_warnings
821     COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
822     echo $COMM >> genmake_warnings
823     $COMM >> genmake_warnings 2>&1
824     RETVAL=$?
825     if test "x$RETVAL" = x0 ; then
826     HAVE_SIGREG=t
827     DEFINES="$DEFINES -DHAVE_SIGREG"
828     fi
829     rm -f genmake_tc*
830     }
831    
832    
833 edhill 1.130 check_HAVE_SETRLSTK() {
834 edhill 1.151 if test "x$HAVE_SETRLSTK" = xt ; then
835     DEFINES="$DEFINES -DHAVE_SETRLSTK"
836     return
837     fi
838     if test ! "x$HAVE_SETRLSTK" = x ; then
839     return
840     fi
841 edhill 1.130 get_fortran_c_namemangling
842     cat <<EOF > genmake_tc_1.c
843     $FC_NAMEMANGLE
844     #include <sys/time.h>
845     #include <sys/resource.h>
846     #include <unistd.h>
847     void FC_NAMEMANGLE(setrlstk) ()
848     {
849     struct rlimit rls;
850     rls.rlim_cur = RLIM_INFINITY;
851     rls.rlim_max = RLIM_INFINITY;
852     setrlimit(RLIMIT_STACK, &rls);
853     return;
854     }
855     EOF
856     make genmake_tc_1.o >> genmake_warnings 2>&1
857     RET_C=$?
858     cat <<EOF > genmake_tc_2.$FS
859     program hello
860     external setrlstk
861     call setrlstk()
862     end
863     EOF
864 edhill 1.135 echo >> genmake_warnings
865     echo "running: check_HAVE_SETRLSTK()" >> genmake_warnings
866     cat genmake_tc_2.$FS >> genmake_warnings
867     COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
868     echo $COMM >> genmake_warnings
869     $COMM >> genmake_warnings 2>&1
870 edhill 1.130 RETVAL=$?
871     if test "x$RETVAL" = x0 ; then
872     HAVE_SETRLSTK=t
873     DEFINES="$DEFINES -DHAVE_SETRLSTK"
874     fi
875     rm -f genmake_tc*
876     }
877    
878    
879 edhill 1.108 check_HAVE_STAT() {
880     get_fortran_c_namemangling
881     cat <<EOF > genmake_tc_1.c
882     $FC_NAMEMANGLE
883     #include <stdio.h>
884     #include <stdlib.h>
885     #include <unistd.h>
886     #include <sys/stat.h>
887     #include <sys/types.h>
888     void FC_NAMEMANGLE(tfsize) ( int *nbyte )
889     {
890     char name[512];
891     struct stat astat;
892    
893     name[0] = 'a'; name[1] = '\0';
894     if (! stat(name, &astat))
895     *nbyte = (int)(astat.st_size);
896     else
897     *nbyte = -1;
898     }
899     EOF
900     make genmake_tc_1.o >> genmake_tc.log 2>&1
901     RET_C=$?
902 edhill 1.118 cat <<EOF > genmake_tc_2.$FS
903 edhill 1.108 program hello
904     integer nbyte
905     call tfsize(nbyte)
906     print *," HELLO WORLD", nbyte
907 edhill 1.128 end
908 edhill 1.108 EOF
909 edhill 1.135 echo >> genmake_warnings
910     echo "running: check_HAVE_STAT()" >> genmake_warnings
911     cat genmake_tc_2.$FS >> genmake_warnings
912     COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
913     echo $COMM >> genmake_warnings
914     $COMM >> genmake_tc.log 2>&1
915 edhill 1.108 RETVAL=$?
916     if test "x$RETVAL" = x0 ; then
917     HAVE_STAT=t
918     DEFINES="$DEFINES -DHAVE_STAT"
919     fi
920     rm -f genmake_tc*
921     }
922    
923    
924 edhill 1.60 check_netcdf_libs() {
925 edhill 1.113 if test ! "x$SKIP_NETCDF_CHECK" = x ; then
926     return
927     fi
928 edhill 1.135 echo >> genmake_warnings
929     echo "running: check_netcdf_libs()" >> genmake_warnings
930 edhill 1.117 cat <<EOF > genmake_tnc.F
931 edhill 1.60 program fgennc
932     #include "netcdf.inc"
933 edhill 1.113 EOF
934     if test ! "x$MPI" = x ; then
935 edhill 1.117 echo '#include "mpif.h"' >> genmake_tnc.F
936 edhill 1.113 fi
937 edhill 1.117 cat <<EOF >> genmake_tnc.F
938 edhill 1.60 integer iret, ncid, xid
939     iret = nf_create('genmake_tnc.nc', NF_CLOBBER, ncid)
940     IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
941     iret = nf_def_dim(ncid, 'X', 11, xid)
942     IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
943     iret = nf_close(ncid)
944     IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
945     end
946     EOF
947 edhill 1.135 echo "=== genmake_tnc.F ===" > genmake_tnc.log
948     cat genmake_tnc.F >> genmake_tnc.log
949     echo "=== genmake_tnc.F ===" >> genmake_tnc.log
950 edhill 1.111 RET_CPP=f
951 edhill 1.149 COMM="cat genmake_tnc.F | $CPP $DEFINES $INCLUDES"
952 edhill 1.135 echo "$COMM" >> genmake_tnc.log
953 dfer 1.155 eval $COMM > genmake_tnc.$FS 2>/dev/null && RET_CPP=t
954 edhill 1.111 if test "x$RET_CPP" = xf ; then
955     echo " WARNING: CPP failed to pre-process the netcdf test." \
956 edhill 1.133 >> genmake_tnc.log
957 edhill 1.111 echo " Please check that \$INCLUDES is properly set." \
958 edhill 1.133 >> genmake_tnc.log
959 edhill 1.111 fi
960 edhill 1.135 echo "$FC $FFLAGS $FOPTIM -c genmake_tnc.$FS \ " >> genmake_tnc.log
961 edhill 1.153 echo " && $LINK $FFLAGS $FOPTIM -o genmake_tnc.o $LIBS" >> genmake_tnc.log
962 edhill 1.117 $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1 \
963 edhill 1.153 && $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS >> genmake_tnc.log 2>&1
964 edhill 1.60 RET_COMPILE=$?
965 edhill 1.135 cat genmake_tnc.log >> genmake_warnings
966 edhill 1.99
967     #EH3 Remove test program execution for machines that either disallow
968     #EH3 execution or cannot support it (eg. cross-compilers)
969     #EH3
970     #EH3 test -x ./genmake_tnc && ./genmake_tnc >> genmake_tnc.log 2>&1
971     #EH3 RETVAL=$?
972     #EH3 if test "x$RET_COMPILE" = x0 -a "x$RETVAL" = x0 ; then
973    
974     if test "x$RET_COMPILE" = x0 ; then
975 edhill 1.60 HAVE_NETCDF=t
976     else
977 edhill 1.66 # try again with "-lnetcdf" added to the libs
978 edhill 1.135 echo "try again with added '-lnetcdf'" > genmake_tnc.log
979 edhill 1.149 echo "cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS \ " >> genmake_tnc.log
980 edhill 1.133 echo " && $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS \ " >> genmake_tnc.log
981 edhill 1.153 echo " && $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf" >> genmake_tnc.log
982 edhill 1.149 cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS 2>/dev/null \
983 edhill 1.117 && $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1 \
984 edhill 1.153 && $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf >> genmake_tnc.log 2>&1
985 edhill 1.66 RET_COMPILE=$?
986 edhill 1.135 cat genmake_tnc.log >> genmake_warnings
987 edhill 1.99 if test "x$RET_COMPILE" = x0 ; then
988 edhill 1.66 LIBS="$LIBS -lnetcdf"
989     HAVE_NETCDF=t
990 ce107 1.160 else
991     # try again with "-lnetcdff" added to the libs
992     echo "try again with added '-lnetcdff -lnetcdf'" > genmake_tnc.log
993     echo "cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS \ " >> genmake_tnc.log
994     echo " && $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS \ " >> genmake_tnc.log
995     echo " && $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf" >> genmake_tnc.log
996     cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS 2>/dev/null \
997     && $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1 \
998     && $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdff -lnetcdf >> genmake_tnc.log 2>&1
999     RET_COMPILE=$?
1000     cat genmake_tnc.log >> genmake_warnings
1001     if test "x$RET_COMPILE" = x0 ; then
1002     LIBS="$LIBS -lnetcdff -lnetcdf"
1003     HAVE_NETCDF=t
1004     fi
1005 edhill 1.66 fi
1006 edhill 1.60 fi
1007     rm -f genmake_tnc*
1008     }
1009    
1010    
1011 adcroft 1.67
1012     ###############################################################################
1013     # Sequential part of script starts here
1014     ###############################################################################
1015    
1016 edhill 1.1 # Set defaults here
1017 edhill 1.5 COMMANDL="$0 $@"
1018    
1019 edhill 1.1 PLATFORM=
1020     LN=
1021     S64=
1022     KPP=
1023 edhill 1.114 #FC=
1024 edhill 1.93 #CC=gcc
1025 edhill 1.114 #CPP=
1026 edhill 1.1 LINK=
1027 edhill 1.31 DEFINES=
1028 edhill 1.1 PACKAGES=
1029     ENABLE=
1030     DISABLE=
1031 edhill 1.119 # MAKEFILE=
1032     # MAKEDEPEND=
1033 edhill 1.1 PDEPEND=
1034 edhill 1.11 DUMPSTATE=t
1035 edhill 1.1 PDEFAULT=
1036     OPTFILE=
1037 edhill 1.111 INCLUDES="-I. $INCLUDES"
1038 edhill 1.1 FFLAGS=
1039     FOPTIM=
1040 mlosch 1.165 FEXTRAFLAGS=
1041 edhill 1.1 CFLAGS=
1042     KFLAGS1=
1043     KFLAGS2=
1044 edhill 1.70 #LDADD=
1045 edhill 1.1 LIBS=
1046     KPPFILES=
1047     NOOPTFILES=
1048     NOOPTFLAGS=
1049 adcroft 1.67 MPI=
1050     MPIPATH=
1051 ce107 1.126 TS=
1052 ce107 1.139 PAPIS=
1053 ce107 1.147 PCLS=
1054 ce107 1.139 FOOLAD=
1055     PAPI=
1056 ce107 1.147 PCL=
1057 ce107 1.139 HPMT=
1058     GSL=
1059 ce107 1.160 DEVEL=
1060 edhill 1.131 HAVE_TEST_L=
1061 edhill 1.1
1062 edhill 1.124 # DEFINES checked by test compilation or command-line
1063 edhill 1.29 HAVE_SYSTEM=
1064     HAVE_FDATE=
1065     FC_NAMEMANGLE=
1066 edhill 1.39 HAVE_CLOC=
1067 edhill 1.151 # HAVE_SETRLSTK=
1068 edhill 1.108 HAVE_STAT=
1069 edhill 1.60 HAVE_NETCDF=
1070 cnh 1.81 HAVE_ETIME=
1071 edhill 1.124 IGNORE_TIME=
1072 edhill 1.29
1073 edhill 1.1 MODS=
1074     TOOLSDIR=
1075     SOURCEDIRS=
1076     INCLUDEDIRS=
1077 edhill 1.57 STANDARDDIRS="USE_THE_DEFAULT"
1078 edhill 1.1
1079 edhill 1.73 G2ARGS=
1080 edhill 1.71 BASH=
1081 edhill 1.1 PWD=`pwd`
1082 edhill 1.114 test "x$MAKE" = x && MAKE=make
1083     test "x$AWK" = x && AWK=awk
1084 edhill 1.141 EMBED_SRC=
1085 edhill 1.97 THISHOST=`hostname`
1086 edhill 1.1 THISCWD=`pwd`
1087     THISDATE=`date`
1088 edhill 1.97 THISUSER=`echo $USER`
1089     THISVER=
1090 edhill 1.1 MACHINE=`uname -a`
1091 edhill 1.7 EXECUTABLE=
1092     EXEHOOK=
1093     EXEDIR=
1094 edhill 1.12 PACKAGES_CONF=
1095     IEEE=
1096     if test "x$MITGCM_IEEE" != x ; then
1097     IEEE=$MITGCM_IEEE
1098     fi
1099 edhill 1.76 FS=
1100     FS90=
1101 edhill 1.1
1102 edhill 1.14 AUTODIFF_PKG_USED=f
1103     AD_OPTFILE=
1104 edhill 1.17 TAF=
1105     AD_TAF_FLAGS=
1106     FTL_TAF_FLAGS=
1107     SVD_TAF_FLAGS=
1108     TAF_EXTRA=
1109     TAMC=
1110     AD_TAMC_FLAGS=
1111     FTL_TAF_FLAGS=
1112     SVD_TAMC_FLAGS=
1113     TAMC_EXTRA=
1114    
1115 edhill 1.14
1116 edhill 1.5 # The following state can be set directly by command-line switches
1117 edhill 1.41 gm_s1="OPTFILE PDEPEND PDEFAULT MAKEFILE PLATFORM ROOTDIR MODS DISABLE ENABLE"
1118 ce107 1.160 gm_s2="FC CPP IEEE TS PAPIS PCLS PAPI PCL HPMT GSL DEVEL MPI JAM DUMPSTATE STANDARDDIRS"
1119 edhill 1.5
1120     # The following state is not directly set by command-line switches
1121 mlosch 1.165 gm_s3="LN S64 KPP LINK PACKAGES MAKEDEPEND PDEPEND PDEFAULT INCLUDES FFLAGS FOPTIM FEXTRAFLAGS"
1122 edhill 1.5 gm_s4="CFLAGS KFLAGS1 KFLAGS2 LIBS KPPFILES NOOPTFILES NOOPTFLAGS"
1123 edhill 1.97 gm_s5="TOOLSDIR SOURCEDIRS INCLUDEDIRS PWD MAKE THISHOST THISUSER THISDATE THISVER MACHINE"
1124 edhill 1.12 gm_s6="EXECUTABLE EXEHOOK EXEDIR PACKAGES_CONF"
1125 cnh 1.81 gm_s7="HAVE_SYSTEM HAVE_FDATE FC_NAMEMANGLE HAVE_ETIME"
1126 edhill 1.5
1127 edhill 1.14 # The following are all related to adjoint/tangent-linear stuff
1128 edhill 1.29 gm_s10="AUTODIFF_PKG_USED AD_OPTFILE TAMC TAF AD_TAMC_FLAGS AD_TAF_FLAGS"
1129     gm_s11="FTL_TAMC_FLAGS FTL_TAF_FLAGS SVD_TAMC_FLAGS SVD_TAF_FLAGS"
1130     gm_s12="TAF_EXTRA TAMC_EXTRA"
1131 edhill 1.14
1132 edhill 1.29 gm_state="COMMANDL $gm_s1 $gm_s2 $gm_s3 $gm_s4 $gm_s5 $gm_s6 $gm_s7"
1133     gm_state="$gm_state $gm_s10 $gm_s11 $gm_s12"
1134 edhill 1.5
1135 edhill 1.41 cat <<EOF
1136    
1137     GENMAKE :
1138    
1139     A program for GENerating MAKEfiles for the MITgcm project. For a
1140     quick list of options, use "genmake -h" or for more detail see:
1141    
1142     http://mitgcm.org/devel_HOWTO/
1143    
1144     EOF
1145 edhill 1.5
1146 edhill 1.2 echo "=== Processing options files and arguments ==="
1147 edhill 1.12 gm_local="genmake_local"
1148 edhill 1.71 printf " getting local config information: "
1149 edhill 1.88 if test -f $gm_local ; then
1150 edhill 1.1 echo "using $gm_local"
1151 edhill 1.34 . $gm_local
1152 edhill 1.2 # echo "DISABLE=$DISABLE"
1153     # echo "ENABLE=$ENABLE"
1154 edhill 1.1 else
1155     echo "none found"
1156     fi
1157    
1158 edhill 1.103 #echo "$0::$1:$2:$3:$4:$5:$6:$7:"
1159 edhill 1.2 #OPTIONS=
1160     #n=0
1161     #for i ; do
1162     # echo "$i $n"
1163     # setvar="OPTIONS[$n]='$i'"
1164     # # echo " $setvar"
1165     # eval "$setvar"
1166     # n=$(( $n + 1 ))
1167     #done
1168     #parse_options
1169     ac_prev=
1170 edhill 1.102 for ac_option in "$@" ; do
1171 edhill 1.2
1172 edhill 1.73 G2ARGS="$G2ARGS \"$ac_option\""
1173    
1174 edhill 1.2 # If the previous option needs an argument, assign it.
1175     if test -n "$ac_prev"; then
1176     eval "$ac_prev=\$ac_option"
1177     ac_prev=
1178     continue
1179     fi
1180    
1181     ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
1182    
1183     case $ac_option in
1184    
1185     -help | --help | -h | --h)
1186     usage ;;
1187    
1188     -nooptfile | --nooptfile)
1189     OPTFILE="NONE" ;;
1190     -optfile | --optfile | -of | --of)
1191 edhill 1.4 ac_prev=OPTFILE ;;
1192 edhill 1.2 -optfile=* | --optfile=* | -of=* | --of=*)
1193     OPTFILE=$ac_optarg ;;
1194    
1195 edhill 1.50 -adoptfile | --adoptfile | -adof | --adof)
1196 edhill 1.14 ac_prev=AD_OPTFILE ;;
1197     -adoptfile=* | --adoptfile=* | -adof=* | --adof=*)
1198     AD_OPTFILE=$ac_optarg ;;
1199    
1200 edhill 1.2 -pdepend | --pdepend)
1201 edhill 1.4 ac_prev=PDEPEND ;;
1202 edhill 1.2 -pdepend=* | --pdepend=*)
1203     PDEPEND=$ac_optarg ;;
1204    
1205     -pdefault | --pdefault)
1206 edhill 1.4 ac_prev=PDEFAULT ;;
1207 edhill 1.2 -pdefault=* | --pdefault=*)
1208     PDEFAULT=$ac_optarg ;;
1209    
1210 edhill 1.6 -make | --make | -m | --m)
1211     ac_prev=MAKE ;;
1212     -make=* | --make=* | -m=* | --m=*)
1213     MAKE=$ac_optarg ;;
1214 edhill 1.69
1215 edhill 1.71 -bash | --bash)
1216     ac_prev=BASH ;;
1217     -bash=* | --bash=*)
1218     BASH=$ac_optarg ;;
1219    
1220 edhill 1.69 -makedepend | --makedepend | -md | --md)
1221     ac_prev=MAKEDEPEND ;;
1222     -makedepend=* | --makedepend=* | -md=* | --md=*)
1223     MAKEDEPEND=$ac_optarg ;;
1224 edhill 1.6
1225     -makefile | --makefile | -ma | --ma)
1226 edhill 1.4 ac_prev=MAKEFILE ;;
1227 edhill 1.6 -makefile=* | --makefile=* | -ma=* | --ma=*)
1228 edhill 1.2 MAKEFILE=$ac_optarg ;;
1229    
1230 edhill 1.41 -platform | --platform | -pl | --pl | -platform=* | --platform=* | -pl=* | --pl=*)
1231     echo "ERROR: The platform option has been removed. Please specify"
1232     echo " the build options using the \"optfile\" mechanism."
1233     echo
1234     usage
1235     ;;
1236 edhill 1.2
1237     -rootdir | --rootdir | -rd | --rd)
1238 edhill 1.4 ac_prev=ROOTDIR ;;
1239 edhill 1.2 -rootdir=* | --rootdir=* | -rd=* | --rd=*)
1240     ROOTDIR=$ac_optarg ;;
1241    
1242     -mods | --mods | -mo | --mo)
1243 edhill 1.4 ac_prev=MODS ;;
1244 edhill 1.2 -mods=* | --mods=* | -mo=* | --mo=*)
1245     MODS=$ac_optarg ;;
1246    
1247     -disable | --disable)
1248 edhill 1.4 ac_prev=DISABLE ;;
1249 edhill 1.2 -disable=* | --disable=*)
1250     DISABLE=$ac_optarg ;;
1251    
1252     -enable | --enable)
1253 edhill 1.4 ac_prev=ENABLE ;;
1254 edhill 1.2 -enable=* | --enable=*)
1255     ENABLE=$ac_optarg ;;
1256    
1257 edhill 1.12 -standarddirs | --standarddirs)
1258     ac_prev=STANDARDDIRS ;;
1259     -standarddirs=* | --standarddirs=*)
1260     STANDARDDIRS=$ac_optarg ;;
1261    
1262 edhill 1.2 # -cpp | --cpp)
1263     # ac_prev=cpp ;;
1264     # -cpp=* | --cpp=*)
1265     # CPP=$ac_optarg ;;
1266 edhill 1.91
1267     -cc | --cc)
1268     ac_prev=CC ;;
1269     -cc=* | --cc=*)
1270     CC=$ac_optarg ;;
1271    
1272 edhill 1.2 -fortran | --fortran | -fc | --fc)
1273 edhill 1.4 ac_prev=FC ;;
1274 edhill 1.2 -fc=* | --fc=*)
1275     FC=$ac_optarg ;;
1276    
1277 edhill 1.76 -fs | --fs)
1278     ac_prev=FS ;;
1279     -fs=* | --fs=*)
1280     FS=$ac_optarg ;;
1281    
1282     -fs90 | --fs90)
1283     ac_prev=FS90 ;;
1284     -fs90=* | --fs90=*)
1285     FS90=$ac_optarg ;;
1286    
1287 edhill 1.2 -ieee | --ieee)
1288 edhill 1.12 IEEE=true ;;
1289 edhill 1.2 -noieee | --noieee)
1290 edhill 1.12 IEEE= ;;
1291 adcroft 1.67
1292 ce107 1.126 -ts | --ts)
1293     TS=true ;;
1294 ce107 1.139 -papis | --papis)
1295     PAPIS=true ;;
1296 ce107 1.147 -pcls | --pcls)
1297     PCLS=true ;;
1298 ce107 1.139 -foolad | --foolad)
1299     FOOLAD=true ;;
1300     -papi | --papi)
1301     PAPI=true ;;
1302 ce107 1.147 -pcl | --pcl)
1303     PCL=true ;;
1304 ce107 1.139 -hpmt | --hpmt)
1305     HPMT=true ;;
1306    
1307     -gsl | --gsl)
1308     GSL=true ;;
1309 ce107 1.126
1310 ce107 1.160 -devel | --devel)
1311     DEVEL=true ;;
1312    
1313 adcroft 1.67 -mpi | --mpi)
1314     MPI=true ;;
1315     -mpi=* | --mpi=*)
1316     MPIPATH=$ac_optarg
1317     MPI=true ;;
1318 edhill 1.2
1319 edhill 1.41 # -jam | --jam)
1320     # JAM=1 ;;
1321     # -nojam | --nojam)
1322     # JAM=0 ;;
1323 edhill 1.2
1324 edhill 1.5 -ds | --ds)
1325     DUMPSTATE=t ;;
1326    
1327 edhill 1.17 -taf_extra | --taf_extra)
1328     ac_prev=TAF_EXTRA ;;
1329     -taf_extra=* | --taf_extra=*)
1330     TAF_EXTRA=$ac_optarg ;;
1331    
1332     -tamc_extra | --tamc_extra)
1333     ac_prev=TAMC_EXTRA ;;
1334     -tamc_extra=* | --tamc_extra=*)
1335     TAMC_EXTRA=$ac_optarg ;;
1336 edhill 1.124
1337     -ignoretime | -ignore_time | --ignoretime | --ignore_time)
1338     IGNORE_TIME="-DIGNORE_TIME" ;;
1339 edhill 1.17
1340 edhill 1.141 -es | --es | -embed-source | --embed-source)
1341     EMBED_SRC=t ;;
1342    
1343 edhill 1.2 -*)
1344     echo "Error: unrecognized option: "$ac_option
1345     usage
1346     ;;
1347    
1348     *)
1349     echo "Error: unrecognized argument: "$ac_option
1350     usage
1351     ;;
1352    
1353     esac
1354    
1355 edhill 1.1 done
1356    
1357 edhill 1.119
1358 edhill 1.12 if test -f ./.genmakerc ; then
1359     echo
1360     echo "WARNING: genmake2 has detected a copy of the old-style \"./.genmakerc\""
1361 jmc 1.161 echo " file. This file format is no longer supported. For directions on"
1362     echo " how to setup and use the new \"genmake2\" script, please see:"
1363 edhill 1.12 echo " http://mitgcm.org/devel_HOWTO/"
1364 jmc 1.161 echo " and send an email to MITgcm-support@mitgcm.org if you need help."
1365     echo "WARNING: ignore \"./.genmakerc\" and continue."
1366 edhill 1.12 echo
1367     fi
1368    
1369 edhill 1.97 # Find the MITgcm ${ROOTDIR}
1370 edhill 1.11 if test "x${ROOTDIR}" = x ; then
1371 edhill 1.112 tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1372 edhill 1.154 if test "x$tmp" = "xbin" -a -d ../model -a -d ../eesupp -a -d ../pkg ; then
1373 edhill 1.11 ROOTDIR=".."
1374     else
1375     for d in . .. ../.. ../../.. ../../../.. ../../../../.. ; do
1376     if [ -d "$d/model" -a -d "$d/eesupp" -a -d "$d/pkg" ]; then
1377     ROOTDIR=$d
1378 edhill 1.71 printf "Warning: ROOTDIR was not specified but there appears to be"
1379 edhill 1.11 echo " a copy of MITgcm at \"$ROOTDIR\" so we'll try it."
1380     break
1381     fi
1382     done
1383     fi
1384     fi
1385     if test "x${ROOTDIR}" = x ; then
1386     echo "Error: Cannot determine ROOTDIR for MITgcm code."
1387     echo " Please specify a ROOTDIR using either an options "
1388     echo " file or a command-line option."
1389     exit 1
1390     fi
1391     if test ! -d ${ROOTDIR} ; then
1392     echo "Error: the specified ROOTDIR (\"$ROOTDIR\") does not exist!"
1393     exit 1
1394     fi
1395    
1396 edhill 1.97 # Find the MITgcm ${THISVER}
1397     if test -f "${ROOTDIR}/doc/tag-index" ; then
1398 edhill 1.125 THISVER=`grep '^checkpoint' ${ROOTDIR}/doc/tag-index | head -1`
1399 edhill 1.97 fi
1400    
1401 edhill 1.119 if test "x$MAKEFILE" = x ; then
1402     MAKEFILE="Makefile"
1403     fi
1404    
1405 edhill 1.1 echo " getting OPTFILE information: "
1406     if test "x${OPTFILE}" = x ; then
1407 edhill 1.11 if test "x$MITGCM_OF" = x ; then
1408     echo "Warning: no OPTFILE specified so we'll look for possible settings"
1409     printf "\n=== Searching for possible settings for OPTFILE ===\n"
1410     find_possible_configs
1411 edhill 1.1 else
1412 edhill 1.11 OPTFILE=$MITGCM_OF
1413     fi
1414     fi
1415     if test "x$OPTFILE" != xNONE ; then
1416     if test -f "$OPTFILE" -a -r "$OPTFILE" ; then
1417     echo " using OPTFILE=\"$OPTFILE\""
1418 edhill 1.34 . "$OPTFILE"
1419 edhill 1.11 RETVAL=$?
1420     if test "x$RETVAL" != x0 ; then
1421 edhill 1.71 printf "Error: failed to source OPTFILE \"$OPTFILE\""
1422 edhill 1.11 echo "--please check that variable syntax is bash-compatible"
1423 edhill 1.1 exit 1
1424     fi
1425 edhill 1.11 if test "x$DUMPSTATE" != xf ; then
1426 edhill 1.12 cp -f $OPTFILE "genmake_optfile"
1427 edhill 1.11 fi
1428     else
1429     echo "Error: can't read OPTFILE=\"$OPTFILE\""
1430     exit 1
1431 edhill 1.1 fi
1432     fi
1433 edhill 1.8
1434 edhill 1.14 echo " getting AD_OPTFILE information: "
1435     if test "x${AD_OPTFILE}" = x ; then
1436     if test "x$MITGCM_AD_OF" = x ; then
1437     AD_OPTFILE=$ROOTDIR/tools/adjoint_options/adjoint_default
1438     else
1439     AD_OPTFILE=$MITGCM_AD_OF
1440     fi
1441     fi
1442     if test "x${AD_OPTFILE}" != xNONE ; then
1443     if test -f "$AD_OPTFILE" -a -r "$AD_OPTFILE" ; then
1444     echo " using AD_OPTFILE=\"$AD_OPTFILE\""
1445 edhill 1.34 . "$AD_OPTFILE"
1446 edhill 1.14 RETVAL=$?
1447     if test "x$RETVAL" != x0 ; then
1448 edhill 1.71 printf "Error: failed to source AD_OPTFILE \"$AD_OPTFILE\""
1449 edhill 1.14 echo "--please check that variable syntax is bash-compatible"
1450     exit 1
1451     fi
1452     if test "x$DUMPSTATE" != xf ; then
1453     cp -f $AD_OPTFILE "genmake_ad_optfile"
1454     fi
1455     else
1456     echo "Error: can't read AD_OPTFILE=\"$AD_OPTFILE\""
1457     exit 1
1458     fi
1459     fi
1460    
1461 edhill 1.119 #====================================================================
1462     # Set default values if not set by the optfile
1463     #
1464 edhill 1.91 # Check that FC, CC, LINK, CPP, S64, LN, and MAKE are defined. If not,
1465 edhill 1.39 # either set defaults or complain and abort!
1466 edhill 1.71 if test ! "x$BASH" = x ; then
1467     # add a trailing space so that it works within the Makefile syntax (see below)
1468     BASH="$BASH "
1469     fi
1470 edhill 1.8 if test "x$FC" = x ; then
1471     cat <<EOF 1>&2
1472    
1473     Error: no Fortran compiler: please specify using one of the following:
1474     1) within the options file ("FC=...") as specified by "-of=OPTFILE"
1475     2) the "-fc=XXX" command-line option
1476 edhill 1.12 3) the "./genmake_local" file
1477 edhill 1.8 EOF
1478     exit 1
1479     fi
1480 edhill 1.91 if test "x$CC" = x ; then
1481 edhill 1.93 CC=cc
1482     # cat <<EOF 1>&2
1483     # Error: no C compiler: please specify using one of the following:
1484     # 1) within the options file ("CC=...") as specified by "-of=OPTFILE"
1485     # 2) the "-cc=XXX" command-line option
1486     # 3) the "./genmake_local" file
1487     # EOF
1488     # exit 1
1489 edhill 1.91 fi
1490 edhill 1.8 if test "x$LINK" = x ; then
1491     LINK=$FC
1492     fi
1493 edhill 1.39 if test "x$MAKE" = x ; then
1494     MAKE="make"
1495     fi
1496 edhill 1.63 if test "x$CPP" = x ; then
1497     CPP=cpp
1498     fi
1499     #EH3 === UGLY ===
1500 edhill 1.76 # The following is an ugly little hack to check for $CPP in /lib/ and
1501     # it should eventually be replaced with a more general function that
1502 edhill 1.63 # searches a combo of the user's path and a list of "usual suspects"
1503     # to find the correct location for binaries such as $CPP.
1504     for i in " " "/lib/" ; do
1505     echo "#define A a" | $i$CPP > test_cpp 2>&1 && CPP=$i$CPP
1506     done
1507     #EH3 === UGLY ===
1508 edhill 1.13 echo "#define A a" | $CPP > test_cpp 2>&1
1509 edhill 1.11 RETVAL=$?
1510     if test "x$RETVAL" != x0 ; then
1511 edhill 1.8 cat <<EOF 1>&2
1512    
1513 edhill 1.11 Error: C pre-processor "$CPP" failed the test case: please specify using:
1514    
1515 edhill 1.8 1) within the options file ("CPP=...") as specified by "-of=OPTFILE"
1516 edhill 1.12 2) the "./genmake_local" file
1517 edhill 1.30 3) with the CPP environment variable
1518 edhill 1.11
1519 edhill 1.8 EOF
1520     exit 1
1521 edhill 1.11 else
1522     rm -f test_cpp
1523 edhill 1.8 fi
1524 edhill 1.84 look_for_makedepend
1525 edhill 1.35 if test "x$LN" = x ; then
1526     LN="ln -s"
1527     fi
1528     echo "test" > genmake_test_ln
1529     $LN genmake_test_ln genmake_tlink
1530     RETVAL=$?
1531     if test "x$RETVAL" != x0 ; then
1532     cat <<EOF 1>&2
1533 edhill 1.29
1534 edhill 1.35 Error: The command "ln -s" failed -- please specify a working soft-link
1535     command in the optfile.
1536    
1537     EOF
1538     exit 1
1539     fi
1540 edhill 1.131 test -L genmake_tlink > /dev/null 2>&1
1541     RETVAL=$?
1542     if test "x$RETVAL" = x0 ; then
1543     HAVE_TEST_L=t
1544     fi
1545 edhill 1.35 rm -f genmake_test_ln genmake_tlink
1546 edhill 1.77
1547     # Check for broken *.F/*.f handling and fix if possible
1548     check_for_broken_Ff
1549 edhill 1.29
1550 adcroft 1.67 if test ! "x$MPI" = x ; then
1551     echo " Turning on MPI cpp macros"
1552 adcroft 1.68 DEFINES="$DEFINES -DALLOW_USE_MPI -DALWAYS_USE_MPI"
1553 adcroft 1.67 fi
1554 edhill 1.39
1555 ce107 1.126 if test ! "x$TS" = x ; then
1556     echo " Turning on timing per timestep"
1557 ce107 1.139 if test ! "x$FOOLAD" = x ; then
1558     DEFINES="$DEFINES -DTIME_PER_TIMESTEP_SFP"
1559     else
1560     DEFINES="$DEFINES -DTIME_PER_TIMESTEP"
1561     fi
1562 ce107 1.164 PACKAGES="$PACKAGES showflops"
1563 ce107 1.139 fi
1564     if test ! "x$PAPIS" = x ; then
1565     echo " Turning on PAPI flop summary per timestep"
1566     echo " Please make sure PAPIINC, PAPILIB are defined"
1567     if test ! "x$FOOLAD" = x ; then
1568     DEFINES="$DEFINES -DUSE_PAPI_FLOPS_SFP"
1569     else
1570     DEFINES="$DEFINES -DUSE_PAPI_FLOPS"
1571     fi
1572     INCLUDES="$INCLUDES $PAPIINC"
1573     LIBS="$LIBS $PAPILIB"
1574 ce107 1.164 PACKAGES="$PACKAGES showflops"
1575 ce107 1.139 fi
1576 ce107 1.147 if test ! "x$PCLS" = x ; then
1577     echo " Turning on PCL counter summary per timestep"
1578     echo " Please make sure PCLINC, PCLLIB are defined"
1579     if test ! "x$FOOLAD" = x ; then
1580     DEFINES="$DEFINES -DUSE_PCL_FLOPS_SFP"
1581     else
1582     DEFINES="$DEFINES -DUSE_PCL_FLOPS"
1583     fi
1584     INCLUDES="$INCLUDES $PCLINC"
1585     LIBS="$LIBS $PCLLIB"
1586 ce107 1.164 PACKAGES="$PACKAGES showflops"
1587 ce107 1.147 fi
1588 ce107 1.139 if test ! "x$PAPI" = x ; then
1589     if test ! "x$PAPIS" = x ; then
1590     echo " PAPI performance analysis and flop summary per timestep cannot co-exist!"
1591     echo " Sticking with PAPI flop summary per timestep!"
1592     else
1593     echo " Turning on performance analysis with PAPI"
1594     echo " Please make sure PAPIINC, PAPILIB are defined"
1595     DEFINES="$DEFINES -DUSE_PAPI"
1596     INCLUDES="$INCLUDES $PAPIINC"
1597     LIBS="$LIBS $PAPILIB"
1598     fi
1599     fi
1600 ce107 1.147 if test ! "x$PCL" = x ; then
1601     if test ! "x$PCLS" = x ; then
1602     echo " PCL performance analysis and flop summary per timestep cannot co-exist!"
1603     echo " Sticking with PCL flop summary per timestep!"
1604     else
1605     echo " Turning on performance analysis with PCL"
1606     echo " Please make sure PCLINC, PCLLIB are defined"
1607     DEFINES="$DEFINES -DUSE_PCL"
1608     INCLUDES="$INCLUDES $PCLINC"
1609     LIBS="$LIBS $PCLLIB"
1610     fi
1611     fi
1612 ce107 1.139 if test ! "x$HPMT" = x ; then
1613     if test ! "x$PAPI" = x ; then
1614     echo " PAPI and the HPM Toolkit cannot co-exist!"
1615     echo " Sticking with PAPI!"
1616 ce107 1.147 else if test ! "x$PCL" = x ; then
1617     echo " PCL and the HPM Toolkit cannot co-exist!"
1618     echo " Sticking with PCL!"
1619 ce107 1.139 else
1620     echo " Turning on performance analysis with the HPM Toolkit"
1621     echo " Please make sure HPMTINC, HPMTLIB are defined"
1622     DEFINES="$DEFINES -DUSE_LIBHPM"
1623     INCLUDES="$INCLUDES $HPMTINC"
1624     LIBS="$LIBS $HPMTLIB"
1625     fi
1626 ce107 1.148 fi
1627 ce107 1.139 fi
1628     if test ! "x$GSL" = x ; then
1629     echo " Turning on use of GSL to control floating point calculations"
1630     echo " Please make sure GSLINC, GSLLIB are defined"
1631     DEFINES="$DEFINES -DUSE_GSL_IEEE"
1632     INCLUDES="$INCLUDES $GSLINC"
1633     LIBS="$LIBS $GSLLIB"
1634 ce107 1.126 fi
1635    
1636 edhill 1.29 printf "\n=== Checking system libraries ===\n"
1637 edhill 1.71 printf " Do we have the system() command using $FC... "
1638 edhill 1.118 cat > genmake_tcomp.$FS <<EOF
1639 edhill 1.29 program hello
1640     call system('echo hi')
1641     end
1642     EOF
1643 edhill 1.134 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1644 edhill 1.29 RETVAL=$?
1645     if test "x$RETVAL" = x0 ; then
1646     HAVE_SYSTEM=t
1647     DEFINES="$DEFINES -DHAVE_SYSTEM"
1648     echo "yes"
1649     else
1650     HAVE_SYSTEM=
1651     echo "no"
1652     fi
1653     rm -f genmake_tcomp*
1654    
1655 edhill 1.71 printf " Do we have the fdate() command using $FC... "
1656 edhill 1.118 cat > genmake_tcomp.$FS <<EOF
1657 edhill 1.29 program hello
1658 edhill 1.129 CHARACTER*(128) string
1659 edhill 1.29 string = ' '
1660     call fdate( string )
1661     print *, string
1662     end
1663     EOF
1664 edhill 1.134 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1665 edhill 1.29 RETVAL=$?
1666     if test "x$RETVAL" = x0 ; then
1667     HAVE_FDATE=t
1668     DEFINES="$DEFINES -DHAVE_FDATE"
1669     echo "yes"
1670     else
1671     HAVE_FDATE=
1672     echo "no"
1673     fi
1674     rm -f genmake_tcomp*
1675    
1676 cnh 1.81 printf " Do we have the etime() command using $FC... "
1677 edhill 1.118 cat > genmake_tcomp.$FS <<EOF
1678 cnh 1.81 program hello
1679 cnh 1.82 REAL*4 ACTUAL, TARRAY(2)
1680     EXTERNAL ETIME
1681     REAL*4 ETIME
1682     actual = etime( tarray )
1683 cnh 1.81 print *, tarray
1684     end
1685     EOF
1686 edhill 1.134 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1687 cnh 1.81 RETVAL=$?
1688     if test "x$RETVAL" = x0 ; then
1689     HAVE_ETIME=t
1690     DEFINES="$DEFINES -DHAVE_ETIME"
1691     echo "yes"
1692     else
1693     HAVE_ETIME=
1694     echo "no"
1695     fi
1696     rm -f genmake_tcomp*
1697    
1698 edhill 1.71 printf " Can we call simple C routines (here, \"cloc()\") using $FC... "
1699 edhill 1.39 check_HAVE_CLOC
1700     if test "x$HAVE_CLOC" != x ; then
1701     echo "yes"
1702     else
1703     echo "no"
1704 edhill 1.141 if test "x$EMBED_SRC" = xt ; then
1705     echo " WARNING: you requested file embedding but it has"
1706     echo " been disabled since C code cannot be called"
1707     EMBED_SRC=
1708     fi
1709 edhill 1.29 fi
1710 edhill 1.39 rm -f genmake_t*
1711 edhill 1.29
1712 edhill 1.130 printf " Can we unlimit the stack size using $FC... "
1713     check_HAVE_SETRLSTK
1714 edhill 1.151 if test "x$HAVE_SETRLSTK" = xt ; then
1715 edhill 1.130 echo "yes"
1716     else
1717     echo "no"
1718     fi
1719     rm -f genmake_t*
1720    
1721 edhill 1.137 printf " Can we register a signal handler using $FC... "
1722     check_HAVE_SIGREG
1723 edhill 1.150 if test "x$HAVE_SIGREG" = xt ; then
1724 edhill 1.137 echo "yes"
1725     else
1726     echo "no"
1727     fi
1728     rm -f genmake_t*
1729    
1730 edhill 1.108 printf " Can we use stat() through C calls... "
1731     check_HAVE_STAT
1732     if test "x$HAVE_STAT" != x ; then
1733     echo "yes"
1734     else
1735     echo "no"
1736     fi
1737     rm -f genmake_t*
1738    
1739 edhill 1.71 printf " Can we create NetCDF-enabled binaries... "
1740 edhill 1.60 check_netcdf_libs
1741     if test "x$HAVE_NETCDF" != x ; then
1742     echo "yes"
1743     else
1744     echo "no"
1745     fi
1746 edhill 1.124 DEFINES="$DEFINES $IGNORE_TIME"
1747 edhill 1.8
1748 edhill 1.141 if test "x$EMBED_SRC" = xt ; then
1749     build_embed_encode
1750     fi
1751     if test "x$EMBED_SRC" = xt ; then
1752     ENABLE="$ENABLE embed_files"
1753     fi
1754    
1755    
1756 edhill 1.2 printf "\n=== Setting defaults ===\n"
1757 edhill 1.71 printf " Adding MODS directories: "
1758 edhill 1.1 for d in $MODS ; do
1759     if test ! -d $d ; then
1760 edhill 1.2 echo
1761     echo "Error: MODS directory \"$d\" not found!"
1762 edhill 1.1 exit 1
1763     else
1764 edhill 1.71 printf " $d"
1765 edhill 1.1 SOURCEDIRS="$SOURCEDIRS $d"
1766     INCLUDEDIRS="$INCLUDEDIRS $d"
1767     fi
1768     done
1769     echo
1770    
1771     if test "x${PLATFORM}" = x ; then
1772     PLATFORM=$p_PLATFORM
1773     fi
1774    
1775     if test "x${EXEDIR}" = x ; then
1776 edhill 1.112 tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1777 edhill 1.87 if test "x$tmp" = "xbin" -a -d ../exe -a $ROOTDIR = .. ; then
1778 edhill 1.1 EXEDIR=../exe
1779     else
1780     EXEDIR=.
1781     fi
1782     fi
1783     if test ! -d ${EXEDIR} ; then
1784     echo "Error: the specified EXEDIR (\"$EXEDIR\") does not exist!"
1785     exit 1
1786     fi
1787    
1788     if test "x${TOOLSDIR}" = x ; then
1789     TOOLSDIR="$ROOTDIR/tools"
1790     fi
1791     if test ! -d ${TOOLSDIR} ; then
1792 cnh 1.65 echo "Error: the specified TOOLSDIR (\"$TOOLSDIR\") does not exist!"
1793 edhill 1.1 exit 1
1794     fi
1795 edhill 1.11 if test "x$S64" = x ; then
1796 edhill 1.104 echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.sh > /dev/null 2>&1
1797     RETVAL=$?
1798     if test "x${RETVAL}" = x0 ; then
1799     S64='$(TOOLSDIR)/set64bitConst.sh'
1800     else
1801     echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.csh > /dev/null 2>&1
1802     RETVAL=$?
1803     if test "x${RETVAL}" = x0 ; then
1804     S64='$(TOOLSDIR)/set64bitConst.csh'
1805     else
1806     cat <<EOF
1807    
1808     ERROR: neither of the two default scripts:
1809    
1810     ${TOOLSDIR}/set64bitConst.sh
1811     ${TOOLSDIR}/set64bitConst.csh
1812    
1813     are working so please check paths or specify (with \$S64) a
1814     working version of this script.
1815    
1816     EOF
1817     exit 1
1818     fi
1819     fi
1820 edhill 1.11 fi
1821 adcroft 1.44 THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`
1822 edhill 1.1
1823     EXECUTABLE=${EXECUTABLE:-mitgcmuv}
1824    
1825     # We have a special set of source files in eesupp/src which are
1826     # generated from some template source files. We'll make them first so
1827     # they appear as regular source code
1828     if test -r $ROOTDIR"/eesupp/src/Makefile" ; then
1829     echo " Making source files in eesupp from templates"
1830 edhill 1.36 ( cd $ROOTDIR"/eesupp/src/" && $MAKE ) > make_eesupp.errors 2>&1
1831 edhill 1.1 RETVAL=$?
1832 edhill 1.2 if test "x${RETVAL}" = x0 ; then
1833 edhill 1.1 rm -f make_eesupp.errors
1834     else
1835     echo "Error: problem encountered while building source files in eesupp:"
1836 edhill 1.62 cat make_eesupp.errors 1>&2
1837 edhill 1.1 exit 1
1838 afe 1.58 fi
1839     fi
1840    
1841 edhill 1.154 #same for pkg/exch2 and pkg/regrid
1842     for pdir in exch2 regrid ; do
1843     if test -r $ROOTDIR"/pkg/${pdir}/Makefile" ; then
1844     echo " Making source files in pkg/${pdir} from templates"
1845     ( cd $ROOTDIR"/pkg/"${pdir} && $MAKE ) > make_${pdir}.errors 2>&1
1846     RETVAL=$?
1847     if test "x${RETVAL}" = x0 ; then
1848     rm -f make_${pdir}.errors
1849     else
1850     echo "Error: problem encountered while building source files in pkg/${pdir}:"
1851     cat make_${pdir}.errors 1>&2
1852     exit 1
1853     fi
1854 edhill 1.1 fi
1855 edhill 1.154 done
1856 edhill 1.1
1857 edhill 1.2 printf "\n=== Determining package settings ===\n"
1858 edhill 1.1 if test "x${PDEPEND}" = x ; then
1859     tmp=$ROOTDIR"/pkg/pkg_depend"
1860     if test -r $tmp ; then
1861     PDEPEND=$tmp
1862     else
1863     echo "Warning: No package dependency information was specified."
1864     echo " Please check that ROOTDIR/pkg/pkg_depend exists."
1865     fi
1866     else
1867     if test ! -r ${PDEPEND} ; then
1868     echo "Error: can't read package dependency info from PDEPEND=\"$PDEPEND\""
1869     exit 1
1870     fi
1871     fi
1872     echo " getting package dependency info from $PDEPEND"
1873     # Strip the comments and then convert the dependency file into
1874     # two arrays: PNAME, DNAME
1875     cat $PDEPEND | sed -e 's/#.*$//g' \
1876 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}' \
1877 edhill 1.1 > ./.pd_tmp
1878     RETVAL=$?
1879     if test ! "x${RETVAL}" = x0 ; then
1880     echo "Error: unable to parse package dependencies -- please check PDEPEND=\"$PDEPEND\""
1881     exit 1
1882     fi
1883 edhill 1.34 . ./.pd_tmp
1884 edhill 1.1 rm -f ./.pd_tmp
1885    
1886 edhill 1.12 # Search for default packages. Note that a "$ROOTDIR/pkg/pkg_groups"
1887     # file should eventually be added so that, for convenience, one can
1888     # specify groups of packages using names like "ocean" and "atmosphere".
1889 edhill 1.41 echo " checking default package list: "
1890 edhill 1.1 if test "x${PDEFAULT}" = x ; then
1891 edhill 1.12 for i in "." $MODS ; do
1892     if test -r $i"/packages.conf" ; then
1893     PDEFAULT=$i"/packages.conf"
1894     break
1895     fi
1896     done
1897     fi
1898     if test "x${PDEFAULT}" = x ; then
1899 edhill 1.1 PDEFAULT="$ROOTDIR/pkg/pkg_default"
1900     fi
1901     if test "x${PDEFAULT}" = xNONE ; then
1902 edhill 1.41 echo " default packages file disabled"
1903 edhill 1.1 else
1904     if test ! -r $PDEFAULT ; then
1905     echo "Warning: can't read default packages from PDEFAULT=\"$PDEFAULT\""
1906     else
1907 edhill 1.41 echo " using PDEFAULT=\"$PDEFAULT\""
1908 edhill 1.1 # Strip the comments and add all the names
1909 edhill 1.15 def=`cat $PDEFAULT | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
1910 edhill 1.1 RETVAL=$?
1911     if test "x${RETVAL}" != x0 ; then
1912 edhill 1.71 printf "Error: can't parse default package list "
1913 edhill 1.1 echo "-- please check PDEFAULT=\"$PDEFAULT\""
1914     exit 1
1915     fi
1916     for i in $def ; do
1917     PACKAGES="$PACKAGES $i"
1918     done
1919 edhill 1.12 echo " before group expansion packages are: $PACKAGES"
1920 edhill 1.87 RET=1
1921     while test $RET = 1 ; do expand_pkg_groups; RET=$?; done
1922 edhill 1.12 echo " after group expansion packages are: $PACKAGES"
1923 edhill 1.1 fi
1924     fi
1925    
1926     echo " applying DISABLE settings"
1927 adcroft 1.74 for i in $PACKAGES ; do
1928     echo $i >> ./.tmp_pack
1929     done
1930     for i in `grep "-" ./.tmp_pack` ; do
1931     j=`echo $i | sed 's/[-]//'`
1932     DISABLE="$DISABLE $j"
1933     done
1934 edhill 1.1 pack=
1935     for p in $PACKAGES ; do
1936     addit="t"
1937     for d in $DISABLE ; do
1938     if test "x$p" = "x$d" ; then
1939     addit="f"
1940     fi
1941     done
1942     if test "x$addit" = xt ; then
1943     pack="$pack $p"
1944     fi
1945     done
1946     PACKAGES="$pack"
1947     echo " applying ENABLE settings"
1948 edhill 1.12 echo "" > ./.tmp_pack
1949 edhill 1.1 PACKAGES="$PACKAGES $ENABLE"
1950 adcroft 1.74 # Test if each explicitly referenced package exists
1951 edhill 1.1 for i in $PACKAGES ; do
1952 adcroft 1.74 j=`echo $i | sed 's/[-+]//'`
1953     if test ! -d "$ROOTDIR/pkg/$j" ; then
1954 edhill 1.1 echo "Error: can't find package $i at \"$ROOTDIR/pkg/$i\""
1955 adcroft 1.74 exit 1
1956 edhill 1.1 fi
1957     echo $i >> ./.tmp_pack
1958     done
1959     PACKAGES=
1960 adcroft 1.74 for i in `grep -v "-" ./.tmp_pack | sort | uniq` ; do
1961 edhill 1.1 PACKAGES="$PACKAGES $i"
1962     done
1963 adcroft 1.74 rm -f ./.tmp_pack
1964 edhill 1.1 echo " packages are: $PACKAGES"
1965    
1966 jmc 1.161 # Check for package MNC: if NetCDF is available, then build the MNC
1967     # template files ; otherwise, delete mnc from the list of packages.
1968 edhill 1.100 echo $PACKAGES | grep ' mnc ' > /dev/null 2>&1
1969     RETVAL=$?
1970     if test "x$RETVAL" = x0 ; then
1971     if test "x$HAVE_NETCDF" != xt ; then
1972     cat <<EOF
1973    
1974     *********************************************************************
1975     WARNING: the "mnc" package was enabled but tests failed to compile
1976     NetCDF applications. Please check that:
1977    
1978     1) NetCDF is correctly installed for this compiler and
1979     2) the LIBS variable (within the "optfile") specifies the correct
1980     NetCDF library to link against.
1981    
1982     Due to this failure, the "mnc" package is now DISABLED.
1983     *********************************************************************
1984    
1985     EOF
1986     PACKAGES=`echo $PACKAGES | sed -e 's/mnc//g'`
1987     DISABLE="$DISABLE mnc"
1988     else
1989 edhill 1.110 ( cd $ROOTDIR"/pkg/mnc" && $MAKE testclean && $MAKE templates ) > make_mnc.errors 2>&1
1990 edhill 1.100 RETVAL=$?
1991     if test "x${RETVAL}" = x0 ; then
1992     rm -f make_mnc.errors
1993     else
1994     echo "Error: problem encountered while building source files in pkg/mnc:"
1995     cat make_mnc.errors 1>&2
1996     exit 1
1997     fi
1998     fi
1999     fi
2000    
2001 jmc 1.161 # Check for package PROFILES: if NetCDF is not available,
2002     # then delete profiles from the list of available packages.
2003     echo $PACKAGES | grep ' profiles ' > /dev/null 2>&1
2004     RETVAL=$?
2005     if test "x$RETVAL" = x0 ; then
2006     if test "x$HAVE_NETCDF" != xt ; then
2007     cat <<EOF
2008    
2009     *********************************************************************
2010     WARNING: the "profiles" package was enabled but tests failed to
2011     compile NetCDF applications. Please check that:
2012    
2013     1) NetCDF is correctly installed for this compiler and
2014     2) the LIBS variable (within the "optfile") specifies the correct
2015     NetCDF library to link against.
2016    
2017     Due to this failure, the "profiles" package is now DISABLED.
2018     *********************************************************************
2019    
2020     EOF
2021     PACKAGES=`echo $PACKAGES | sed -e 's/profiles//g'`
2022     DISABLE="$DISABLE profiles"
2023     fi
2024     fi
2025    
2026 edhill 1.1 echo " applying package dependency rules"
2027     ck=
2028     while test "x$ck" != xtt ; do
2029     i=0
2030 edhill 1.2 # rtot=${#PNAME[@]}
2031     rtot=$nname
2032 jmc 1.162 while test $i -le $rtot ; do
2033 edhill 1.1
2034     # Is $pname in the current $PACKAGES list?
2035 edhill 1.2 # pname=${PNAME[$i]}
2036     tmp="pname=\"\$PNAME_$i\""
2037     eval $tmp
2038 edhill 1.1 pin="f"
2039     for p in $PACKAGES ; do
2040     if test "x$p" = "x$pname" ; then
2041     pin="t"
2042     fi
2043     done
2044    
2045     # Is the DNAME entry a (+) or (-) rule ?
2046 edhill 1.2 tmp="dname=\"\$DNAME_$i\""
2047     eval $tmp
2048 edhill 1.1 plus="-"
2049 edhill 1.2 echo $dname | grep '^+' > /dev/null 2>&1
2050 edhill 1.1 RETVAL=$?
2051     if test "x$RETVAL" = x0 ; then
2052     plus="+"
2053     fi
2054    
2055     # Is $dname in the current $PACKAGES list?
2056 edhill 1.2 dname=`echo $dname | sed -e 's/^[+-]//'`
2057 edhill 1.1 din="f"
2058     for p in $PACKAGES ; do
2059     if test "x$p" = "x$dname" ; then
2060     din="t"
2061     fi
2062     done
2063    
2064     # Do we need to add $dname according to the dependency rules?
2065     if test "x$pin" = xt -a "x$plus" = "x+" -a "x$din" = xf ; then
2066 jmc 1.162 #echo " " $pname ": need to add :" $dname
2067 edhill 1.1 in_dis="f"
2068     for dis in $DISABLE ; do
2069     if test "x$dis" = "x$dname" ; then
2070     in_dis="t"
2071     fi
2072     done
2073     if test "x$in_dis" = xt ; then
2074     echo "Error: can't satisfy package dependencies:"
2075     echo " \"$dname\" is required by the dependency rules"
2076     echo " but is disallowed by the DISABLE settings"
2077     exit 1
2078     else
2079     PACKAGES="$PACKAGES $dname"
2080     ck=
2081     fi
2082     fi
2083    
2084     # Do we need to get rid of $dname according to the dependency rules?
2085     if test "x$pin" = xt -a "x$plus" = "x-" -a "x$din" = xt; then
2086     echo "Error: can't satisfy package dependencies:"
2087     echo " \"$pname\" was requested but is disallowed by"
2088     echo " the dependency rules for \"$dname\""
2089     exit 1
2090     fi
2091 edhill 1.87 i=`echo "$i + 1" | bc -l`
2092     #i=$(( $i + 1 ))
2093 edhill 1.1 done
2094     ck=$ck"t"
2095     done
2096     echo " packages are: $PACKAGES"
2097     for i in $PACKAGES ; do
2098     adr="$ROOTDIR/pkg/$i"
2099     if test -d $adr ; then
2100     SOURCEDIRS="$SOURCEDIRS $adr"
2101     INCLUDEDIRS="$INCLUDEDIRS $adr"
2102 edhill 1.14 if test "x$i" = xautodiff ; then
2103     AUTODIFF_PKG_USED=t
2104     fi
2105 edhill 1.1 else
2106     echo "Error: the directory \"$adr\" for package $i doesn't exist"
2107     exit 1
2108     fi
2109     done
2110    
2111 edhill 1.12 # Create a list of #define and #undef to enable/disable packages
2112     PACKAGES_DOT_H=PACKAGES_CONFIG.h
2113 edhill 1.1 # The following UGLY HACK sets multiple "#undef"s and it needs to go
2114     # away. On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h
2115     # file would eventually be split up so that all package-related #define
2116     # statements could be separated and handled only by genmake.
2117     names=`ls -1 "$ROOTDIR/pkg"`
2118     all_pack=
2119 adcroft 1.44 DISABLED_PACKAGES=
2120 edhill 1.1 for n in $names ; do
2121     if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
2122     has_pack="f"
2123     for pack in $PACKAGES ; do
2124     if test "x$pack" = "x$n" ; then
2125     has_pack="t"
2126     break
2127     fi
2128     done
2129     if test "x$has_pack" = xf ; then
2130 edhill 1.116 undef=`echo "ALLOW_$n" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2131 adcroft 1.44 DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
2132 edhill 1.1 fi
2133     fi
2134     done
2135 adcroft 1.44 ENABLED_PACKAGES=
2136 edhill 1.1 for i in $PACKAGES ; do
2137 edhill 1.116 def=`echo "ALLOW_$i" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2138 adcroft 1.44 ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
2139 edhill 1.12 #eh3 DEFINES="$DEFINES -D$def"
2140 edhill 1.1
2141     #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
2142     case $i in
2143     aim_v23)
2144 adcroft 1.46 ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
2145 jmc 1.55 echo "Warning: ALLOW_AIM is set to enable aim_v23."
2146 edhill 1.1 ;;
2147     esac
2148     #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
2149    
2150     done
2151    
2152     echo " Adding STANDARDDIRS"
2153     BUILDDIR=${BUILDDIR:-.}
2154 edhill 1.57 if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
2155 edhill 1.12 STANDARDDIRS="eesupp model"
2156     fi
2157 edhill 1.57 if test "x$STANDARDDIRS" != x ; then
2158     for d in $STANDARDDIRS ; do
2159     adr="$ROOTDIR/$d/src"
2160     if test ! -d $adr ; then
2161     echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2162     echo " is correct and that you correctly specified the STANDARDDIRS option"
2163     exit 1
2164     else
2165     SOURCEDIRS="$SOURCEDIRS $adr"
2166     fi
2167     adr="$ROOTDIR/$d/inc"
2168     if test ! -d $adr ; then
2169     echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2170     echo " is correct and that you correctly specified the STANDARDDIRS option"
2171     exit 1
2172     else
2173     INCLUDEDIRS="$INCLUDEDIRS $adr"
2174     fi
2175     done
2176     fi
2177 edhill 1.1
2178 adcroft 1.52 echo " Searching for *OPTIONS.h files in order to warn about the presence"
2179     echo " of \"#define \"-type statements that are no longer allowed:"
2180 edhill 1.12 CPP_OPTIONS=
2181 adcroft 1.52 CPP_EEOPTIONS=
2182 edhill 1.12 spaths=". $INCLUDEDIRS"
2183 adcroft 1.52 names=`ls -1 "$ROOTDIR/pkg"`
2184 edhill 1.12 for i in $spaths ; do
2185     try="$i/CPP_OPTIONS.h"
2186 edhill 1.54 if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
2187 edhill 1.12 echo " found CPP_OPTIONS=\"$try\""
2188     CPP_OPTIONS="$try"
2189 adcroft 1.52 # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
2190     for n in $names ; do
2191     test_for_package_in_cpp_options $CPP_OPTIONS $n
2192     done
2193     fi
2194     try="$i/CPP_EEOPTIONS.h"
2195 edhill 1.54 if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
2196 adcroft 1.52 echo " found CPP_EEOPTIONS=\"$try\""
2197     # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
2198     #**** not yet enabled ****
2199     # test_for_mpi_in_cpp_eeoptions $try
2200     #**** not yet enabled ****
2201     CPP_EEOPTIONS="$try"
2202 edhill 1.12 fi
2203     done
2204     if test "x$CPP_OPTIONS" = x ; then
2205     echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
2206     exit 1
2207     fi
2208 edhill 1.1
2209 edhill 1.14 # Here, we build the list of files to be "run through" the adjoint
2210     # compiler.
2211     if test -f ./ad_files ; then
2212     rm -f ./ad_files
2213     fi
2214     echo " Creating the list of files for the adjoint compiler."
2215     for i in $SOURCEDIRS ; do
2216     list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
2217     for j in $list_files ; do
2218     cat $i/$j >> ad_files
2219     done
2220     done
2221 edhill 1.121 if test ! "x"$FS = "x.f" ; then
2222 edhill 1.122 cat ad_files | sed -e "s/\.f/.$FS/g" > ad_files_f
2223 edhill 1.121 mv -f ad_files_f ad_files
2224     fi
2225 edhill 1.14
2226 edhill 1.2 echo
2227     echo "=== Creating the Makefile ==="
2228 edhill 1.1 echo " setting INCLUDES"
2229     for i in $INCLUDEDIRS ; do
2230 edhill 1.87 if test ! -d $i ; then
2231 edhill 1.1 echo "Warning: can't find INCLUDEDIRS=\"$i\""
2232     fi
2233     done
2234    
2235 ce107 1.139 if test ! "x$DIVA" = x ; then
2236 ce107 1.140 echo " Creating the pseudo-MPI include directory"
2237 ce107 1.139 INCLUDES="-I./mpi_headers $INCLUDES"
2238     rm -rf ./mpi_headers
2239     mkdir -p ./mpi_headers
2240    
2241     if test "x$MPIINCLUDEDIR" = x ; then
2242     if test "x$MPIHOME" = x ; then
2243     MPIHOME='/usr'
2244     fi
2245     MPIINCLUDEDIR='$MPIHOME/include'
2246     fi
2247    
2248     if test -r $MPIINCLUDEDIR/mpif.h ; then
2249     for i in $MPI_HEADER_FILES; do
2250     cp -p $MPIINCLUDEDIR/$i ./mpi_headers
2251     done
2252    
2253     perl -i -pe 's/MPI_DISPLACEMENT_CURRENT=-1_8/MPI_DISPLACEMENT_CURRENT=-1/g' mpi_headers/mpif.h
2254     else
2255     echo " We cannot create a copy of mpif.h!"
2256 heimbach 1.156 # exit -1
2257 ce107 1.139 fi
2258     fi
2259    
2260 edhill 1.1 echo " Determining the list of source and include files"
2261     rm -rf .links.tmp
2262     mkdir .links.tmp
2263 edhill 1.142 touch .links.tmp/foo
2264     if test ! -r ".links.tmp/foo" ; then
2265     echo
2266     echo "ERROR : something is wrong with your directory permissions or"
2267     echo " your user file-creation mask (\"umask\") since creating a"
2268     echo " sub-dir, touch-ing a file within it, and then reading it is"
2269     echo " not working. Please try setting your umask to something"
2270     echo " sane such as:"
2271     echo
2272     echo " umask 0002"
2273     echo
2274     echo " and please verify that you have the proper permissions for"
2275     echo " creating sub-directories and then reading files created"
2276     echo " within them."
2277     echo
2278     exit 1
2279     fi
2280     rm -f .links.tmp/foo
2281 edhill 1.1 echo "# This section creates symbolic links" > srclinks.tmp
2282     echo "" >> srclinks.tmp
2283 edhill 1.71 printf 'SRCFILES = ' > srclist.inc
2284     printf 'CSRCFILES = ' > csrclist.inc
2285     printf 'F90SRCFILES = ' > f90srclist.inc
2286     printf 'HEADERFILES = ' > hlist.inc
2287     printf 'AD_FLOW_FILES = ' > ad_flow_files.inc
2288 adcroft 1.9 alldirs="$SOURCEDIRS $INCLUDEDIRS ."
2289 edhill 1.1 for d in $alldirs ; do
2290     deplist=
2291 edhill 1.14 sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
2292 cnh 1.3 sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
2293 edhill 1.1 for sf in $sfiles ; do
2294     if test ! -r ".links.tmp/$sf" ; then
2295     if test -f "$d/$sf" ; then
2296 edhill 1.131 ignore_f=f
2297 adcroft 1.44 case $d/$sf in
2298     ./$PACKAGES_DOT_H)
2299 edhill 1.141 ignore_f=t
2300 adcroft 1.44 ;;
2301     ./AD_CONFIG.h)
2302 edhill 1.141 ignore_f=t
2303 adcroft 1.44 ;;
2304     ./FC_NAMEMANGLE.h)
2305 edhill 1.141 ignore_f=t
2306 adcroft 1.44 ;;
2307 edhill 1.98 ./BUILD_INFO.h)
2308 edhill 1.141 ignore_f=t
2309     ;;
2310     ./EMBEDDED_FILES.h)
2311     ignore_f=t
2312 edhill 1.98 ;;
2313 adcroft 1.44 *)
2314 edhill 1.131 # For the local directory *ONLY*,
2315     # ignore all soft-links
2316     if test "x$HAVE_TEST_L" = xt -a "x$d" = x. -a -L $sf ; then
2317     ignore_f=t
2318     else
2319     touch .links.tmp/$sf
2320     deplist="$deplist $sf"
2321     fi
2322 adcroft 1.44 ;;
2323     esac
2324 edhill 1.131 if test "x$ignore_f" = xf ; then
2325     extn=`echo $sf | $AWK -F. '{print $NF}'`
2326     case $extn in
2327     F)
2328     echo " \\" >> srclist.inc
2329     printf " $sf" >> srclist.inc
2330     ;;
2331     F90)
2332     echo " \\" >> f90srclist.inc
2333     printf " $sf" >> f90srclist.inc
2334     ;;
2335     c)
2336     echo " \\" >> csrclist.inc
2337     printf " $sf" >> csrclist.inc
2338     ;;
2339     h)
2340     echo " \\" >> hlist.inc
2341     printf " $sf" >> hlist.inc
2342     ;;
2343     flow)
2344     echo " \\" >> ad_flow_files.inc
2345     printf " $sf" >> ad_flow_files.inc
2346     ;;
2347     esac
2348     fi
2349 edhill 1.1 fi
2350     fi
2351     done
2352     if test "x$deplist" != x ; then
2353 edhill 1.2 echo "" >> srclinks.tmp
2354     echo "# These files are linked from $d" >> srclinks.tmp
2355 edhill 1.1 echo "$deplist :" >> srclinks.tmp
2356 edhill 1.2 printf "\t\$(LN) %s/\$@ \$@\n" $d >> srclinks.tmp
2357 edhill 1.1 fi
2358     done
2359     rm -rf .links.tmp
2360     echo "" >> srclist.inc
2361     echo "" >> csrclist.inc
2362 cnh 1.3 echo "" >> f90srclist.inc
2363 edhill 1.1 echo "" >> hlist.inc
2364 edhill 1.14 echo "" >> ad_flow_files.inc
2365 edhill 1.1
2366 edhill 1.88 if test -f $MAKEFILE ; then
2367 edhill 1.1 mv -f $MAKEFILE "$MAKEFILE.bak"
2368     fi
2369     echo " Writing makefile: $MAKEFILE"
2370     echo "# Multithreaded + multi-processing makefile for:" > $MAKEFILE
2371     echo "# $MACHINE" >> $MAKEFILE
2372     echo "# This makefile was generated automatically on" >> $MAKEFILE
2373     echo "# $THISDATE" >> $MAKEFILE
2374     echo "# by the command:" >> $MAKEFILE
2375 edhill 1.73 echo "# $0 $G2ARGS" >> $MAKEFILE
2376 edhill 1.1 echo "# executed by:" >> $MAKEFILE
2377 edhill 1.97 echo "# ${THISUSER}@${THISHOST}:${THISCWD}" >> $MAKEFILE
2378 edhill 1.21
2379     EXE_AD=$EXECUTABLE"_ad"
2380     EXE_FTL=$EXECUTABLE"_ftl"
2381     EXE_SVD=$EXECUTABLE"_svd"
2382    
2383 edhill 1.1 cat >>$MAKEFILE <<EOF
2384 edhill 1.53 #
2385     # OPTFILE="$OPTFILE"
2386 edhill 1.1 #
2387     # BUILDDIR : Directory where object files are written
2388     # SOURCEDIRS : Directories containing the source (.F) files
2389     # INCLUDEDIRS : Directories containing the header-source (.h) files
2390     # EXEDIR : Directory where executable that is generated is written
2391     # EXECUTABLE : Full path of executable binary
2392     #
2393     # CPP : C-preprocessor command
2394     # INCLUDES : Directories searched for header files
2395     # DEFINES : Macro definitions for CPP
2396     # MAKEDEPEND : Dependency generator
2397     # KPP : Special preprocessor command (specific to platform)
2398     # KFLAGS : Flags for KPP
2399     # FC : Fortran compiler command
2400     # FFLAGS : Configuration/debugging options for FC
2401     # FOPTIM : Optimization options for FC
2402     # LINK : Command for link editor program
2403     # LIBS : Library flags /or/ additional optimization/debugging flags
2404    
2405     ROOTDIR = ${ROOTDIR}
2406     BUILDDIR = ${BUILDDIR}
2407     SOURCEDIRS = ${SOURCEDIRS}
2408     INCLUDEDIRS = ${INCLUDEDIRS}
2409     EXEDIR = ${EXEDIR}
2410     EXECUTABLE = \$(EXEDIR)/${EXECUTABLE}
2411     TOOLSDIR = ${TOOLSDIR}
2412    
2413 edhill 1.14 #eh3 new defines for the adjoint work
2414     AUTODIFF = ${ROOTDIR}/pkg/autodiff
2415 edhill 1.21 EXE_AD = ${EXE_AD}
2416     EXE_FTL = ${EXE_FTL}
2417     EXE_SVD = ${EXE_SVD}
2418 edhill 1.14
2419 adcroft 1.44 ENABLED_PACKAGES = ${ENABLED_PACKAGES}
2420     DISABLED_PACKAGES = ${DISABLED_PACKAGES}
2421    
2422 adcroft 1.52 # These files are created by Makefile
2423 edhill 1.97 SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h BUILD_INFO.h
2424 edhill 1.141 EOF
2425 adcroft 1.52
2426 edhill 1.141 if test "x$EMBED_SRC" = xt ; then
2427     echo "EMBEDDED_FILES = EMBEDDED_FILES.h" >>$MAKEFILE
2428     else
2429     echo "EMBEDDED_FILES = " >>$MAKEFILE
2430     fi
2431 edhill 1.1
2432 edhill 1.141 # Note: figure out some way to add Hyades JAM libraries here
2433 edhill 1.1 cat >>$MAKEFILE <<EOF
2434     # Unix ln (link)
2435     LN = ${LN}
2436     # C preprocessor
2437     CPP = cat \$< | ${S64} | ${CPP}
2438     # Dependency generator
2439     MAKEDEPEND = ${MAKEDEPEND}
2440     # Special preprocessor (KAP on DECs, FPP on Crays)
2441     KPP = ${KPP}
2442     # Fortran compiler
2443 edhill 1.94 FC = ${FC}
2444 cnh 1.3 # Fortran compiler
2445     F90C = ${F90C}
2446 edhill 1.92 # C compiler
2447     CC = ${CC}
2448 edhill 1.1 # Link editor
2449 edhill 1.70 LINK = ${LINK} ${LDADD}
2450 edhill 1.1
2451     # Defines for CPP
2452     DEFINES = ${DEFINES}
2453     # Includes for CPP
2454     INCLUDES = ${INCLUDES}
2455     # Flags for KPP
2456     KFLAGS1 = ${KFLAGS1}
2457     KFLAGS2 = ${KFLAGS2}
2458     # Optim./debug for FC
2459 mlosch 1.165 FFLAGS = ${FFLAGS} ${FEXTRAFLAGS}
2460 edhill 1.1 FOPTIM = ${FOPTIM}
2461 cnh 1.3 # Optim./debug for FC
2462     F90FLAGS = ${F90FLAGS}
2463     F90OPTIM = ${F90OPTIM}
2464 edhill 1.1 # Flags for CC
2465     CFLAGS = ${CFLAGS}
2466     # Files that should not be optimized
2467     NOOPTFILES = ${NOOPTFILES}
2468     NOOPTFLAGS = ${NOOPTFLAGS}
2469     # Flags and libraries needed for linking
2470 edhill 1.107 LIBS = ${LIBS}
2471 cnh 1.3 # Name of the Mekfile
2472     MAKEFILE=${MAKEFILE}
2473 edhill 1.1
2474     EOF
2475    
2476 edhill 1.14 cat srclist.inc >> $MAKEFILE
2477     cat csrclist.inc >> $MAKEFILE
2478     cat f90srclist.inc >> $MAKEFILE
2479     cat hlist.inc >> $MAKEFILE
2480     cat ad_flow_files.inc >> $MAKEFILE
2481 edhill 1.75 echo >> $MAKEFILE
2482 edhill 1.76 echo 'F77FILES = $(SRCFILES:.F=.'$FS')' >> $MAKEFILE
2483 heimbach 1.127 echo 'F90FILES = $(F90SRCFILES:.F90=.'$FS90')' >> $MAKEFILE
2484 edhill 1.76 echo 'OBJFILES = $(SRCFILES:.F=.o) $(CSRCFILES:.c=.o) $(F90SRCFILES:.F90=.o)' >> $MAKEFILE
2485 edhill 1.75 echo >> $MAKEFILE
2486     echo '.SUFFIXES:' >> $MAKEFILE
2487 adcroft 1.83 echo '.SUFFIXES: .o .'$FS' .p .F .c .'$FS90' .F90' >> $MAKEFILE
2488 cnh 1.3 rm -f srclist.inc csrclist.inc hlist.inc flist.tmp clist.tmp f90srclist.inc
2489 edhill 1.14 rm -f ad_flow_files.inc
2490 edhill 1.1
2491     cat >>$MAKEFILE <<EOF
2492    
2493     all: \$(EXECUTABLE)
2494 edhill 1.141 \$(EXECUTABLE): \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(OBJFILES) \$(EMBEDDED_FILES)
2495 adcroft 1.44 @echo Creating \$@ ...
2496 edhill 1.1 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
2497     depend:
2498     @make links
2499 edhill 1.76 \$(MAKEDEPEND) -o .$FS \$(DEFINES) \$(INCLUDES) \$(SRCFILES)
2500 adcroft 1.44 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
2501 edhill 1.72 -rm -f makedepend.out
2502 edhill 1.1
2503 cnh 1.132 lib: libmitgcmuv.a
2504    
2505     libmitgcmuv.a: \$(OBJFILES)
2506     ar rcv libmitgcmuv.a \$(OBJFILES)
2507 cnh 1.159 ar d libmitgcmuv.a main.o
2508 cnh 1.132
2509 adcroft 1.52 links: \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(SPECIAL_FILES)
2510 edhill 1.1
2511 cnh 1.3 small_f: \$(F77FILES) \$(F90FILES)
2512 edhill 1.1
2513     output.txt: \$(EXECUTABLE)
2514     @printf 'running ... '
2515     @\$(EXECUTABLE) > \$@
2516    
2517     clean:
2518 heimbach 1.157 -rm -rf *.p *.$FS90 *.mod ${RMFILES} work.{pc,pcl} *.template
2519     -rm -rf *.o
2520     -rm -rf *.$FS
2521 edhill 1.1 Clean:
2522     @make clean
2523     @make cleanlinks
2524 adcroft 1.52 -rm -f \$(SPECIAL_FILES)
2525 jmc 1.145 -rm -f genmake_state genmake_*optfile genmake_warnings make.log run.log *.bak
2526 jmc 1.166 -rm -f taf_command taf_output taf_ad.log taf_ad_flow.log
2527 edhill 1.1 CLEAN:
2528     @make Clean
2529     -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
2530     -find \$(EXEDIR) -name "*.data" -exec rm {} \;
2531     -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
2532 jmc 1.152 -rm -f \$(EXECUTABLE) \$(EXE_AD) *.txt STD* *diagnostics.log datetime
2533 jmc 1.166 -rm -f *_MIT_CE_000.opt0000 costfunction*0000
2534 edhill 1.144 -rm -rf mnc_test_*
2535 edhill 1.1
2536 edhill 1.18 #eh3 Makefile: makefile
2537 edhill 1.1 makefile:
2538 edhill 1.73 $THIS_SCRIPT $G2ARGS
2539 edhill 1.1 cleanlinks:
2540     -find . -type l -exec rm {} \;
2541    
2542 edhill 1.97 # Special targets (SPECIAL_FILES) which are create by make
2543 adcroft 1.44 ${PACKAGES_DOT_H}:
2544     @echo Creating \$@ ...
2545 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) > \$@
2546 adcroft 1.44 AD_CONFIG.h:
2547     @echo Creating \$@ ...
2548 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 > \$@
2549 adcroft 1.52 FC_NAMEMANGLE.h:
2550     @echo Creating \$@ ...
2551     echo "$FC_NAMEMANGLE" > \$@
2552 adcroft 1.44
2553 edhill 1.97 BUILD_INFO.h:
2554     @echo Creating \$@ ...
2555     EOF
2556    
2557     test ! "x$THISVER" = x && echo " -echo \"#define THISVER '$THISVER'\" > \$@" >> $MAKEFILE
2558     test ! "x$THISUSER" = x && echo " -echo \"#define THISUSER '$THISUSER'\" >> \$@" >> $MAKEFILE
2559     test ! "x$THISDATE" = x && echo " -echo \"#define THISDATE '$THISDATE'\" >> \$@" >> $MAKEFILE
2560     test ! "x$THISHOST" = x && echo " -echo \"#define THISHOST '$THISHOST'\" >> \$@" >> $MAKEFILE
2561    
2562 edhill 1.141 if test "x$EMBED_SRC" = xt ; then
2563     cat >>$MAKEFILE <<EOF
2564    
2565     decode_files.o : EMBEDDED_FILES.h
2566    
2567     ## \$(F77FILES)
2568     all_fF.tar.gz : \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(F77FILES) Makefile
2569     @echo Creating \$@ ...
2570     -tar -hcf all_fF.tar \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(F77FILES) Makefile
2571     -rm -f all_fF.tar.gz
2572     -gzip all_fF.tar
2573    
2574     EMBEDDED_FILES.h : all_fF.tar.gz
2575     @echo Creating \$@ ...
2576     -\${ROOTDIR}/tools/embed_encode/encode_files EMBEDDED_FILES.h all_fF.tar.gz
2577    
2578     EOF
2579     fi
2580    
2581 edhill 1.97 cat >>$MAKEFILE <<EOF
2582    
2583 edhill 1.76 # The normal chain of rules is ( .F - .$FS - .o )
2584    
2585 edhill 1.101 ## This nullifies any default implicit rules concerning these two file types:
2586     ## %.o : %.F
2587 edhill 1.76
2588     .F.$FS:
2589 edhill 1.1 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2590 edhill 1.76 .$FS.o:
2591 edhill 1.1 \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
2592 cnh 1.159 .F90.o:
2593 cnh 1.3 \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
2594 edhill 1.1 .c.o:
2595 ce107 1.139 \$(CC) \$(CFLAGS) \$(DEFINES) \$(INCLUDES) -c \$<
2596 edhill 1.1
2597 edhill 1.76 # Special exceptions that use the ( .F - .p - .$FS - .o ) rule-chain
2598     .F.p:
2599 edhill 1.1 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2600 edhill 1.76 .p.$FS:
2601 edhill 1.1 \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
2602 edhill 1.14
2603     #=========================================
2604     #=== Automatic Differentiation Rules ===
2605    
2606     TAMC = ${TAMC}
2607     TAF = ${TAF}
2608    
2609 edhill 1.17 TAF_EXTRA = ${TAF_EXTRA}
2610     TAMC_EXTRA = ${TAMC_EXTRA}
2611    
2612 edhill 1.14 EOF
2613    
2614     ad_vars="AD_TAMC_FLAGS AD_TAF_FLAGS"
2615     ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF_FLAGS"
2616     ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
2617     for i in $ad_vars ; do
2618     name=$i
2619 edhill 1.151 t1="t2=\$"`echo "$i"`
2620 edhill 1.14 eval $t1
2621     printf "%-20s = " $name >> $MAKEFILE
2622 edhill 1.151 echo "$t2" | sed -e 's| \+| |g' >> $MAKEFILE
2623 edhill 1.14 done
2624    
2625     echo " Add the source list for AD code generation"
2626     echo >> $MAKEFILE
2627 edhill 1.71 printf "AD_FILES = " >> $MAKEFILE
2628 edhill 1.14 AD_FILES=`cat ad_files`
2629     for i in $AD_FILES ; do
2630     echo " \\" >> $MAKEFILE
2631 edhill 1.71 printf " $i" >> $MAKEFILE
2632 edhill 1.14 done
2633     echo >> $MAKEFILE
2634 edhill 1.21 rm -f ad_files
2635 edhill 1.14
2636     cat >>$MAKEFILE <<EOF
2637    
2638 edhill 1.16 # ... AD ...
2639 jmc 1.152 adall: \$(EXE_AD)
2640 edhill 1.121 adtaf: ad_taf_output.$FS
2641     adtamc: ad_tamc_output.$FS
2642 edhill 1.21
2643 edhill 1.121 ad_input_code.$FS: \$(AD_FILES) \$(HEADERFILES)
2644 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
2645 edhill 1.23 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
2646 adcroft 1.44 -rm -f ad_config.template
2647 edhill 1.22 @make \$(F77FILES)
2648     @make \$(AD_FLOW_FILES)
2649 edhill 1.121 cat \$(AD_FLOW_FILES) \$(AD_FILES) > ad_input_code.$FS
2650 edhill 1.22
2651 edhill 1.121 ad_taf_output.$FS: ad_input_code.$FS
2652     \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2653     cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2654 heimbach 1.37
2655     adtafonly:
2656 edhill 1.121 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2657     cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2658 edhill 1.14
2659 jmc 1.152 \${EXE_AD}: ad_taf_output.o \$(OBJFILES)
2660     \$(LINK) -o \${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
2661 edhill 1.14
2662 edhill 1.121 ad_tamc_output.$FS: ad_input_code.$FS
2663     \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.$FS
2664     cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.$FS
2665 edhill 1.14
2666     ad_tamc: ad_tamc_output.o \$(OBJFILES)
2667 edhill 1.21 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
2668 edhill 1.14
2669 heimbach 1.105 adonlyfwd:
2670 edhill 1.106 patch < \$(TOOLSDIR)/ad_taf_output.f.onlyfwd.diff
2671 heimbach 1.105
2672     adtrick:
2673 edhill 1.106 patch < \$(TOOLSDIR)/ad_taf_output.f.adtrick.diff
2674 edhill 1.14
2675 edhill 1.19 # ... FTL ...
2676 edhill 1.23 ftlall: ftl_taf
2677 edhill 1.121 ftltaf: ftl_taf_output.$FS
2678     ftltamc: ftl_tamc_output.$FS
2679 edhill 1.21
2680 edhill 1.121 ftl_input_code.$FS: \$(AD_FILES) \$(HEADERFILES)
2681 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
2682 edhill 1.23 cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
2683 adcroft 1.44 -rm -f ftl_config.template
2684 edhill 1.23 @make \$(F77FILES)
2685 edhill 1.22 @make \$(AD_FLOW_FILES)
2686 edhill 1.121 cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.$FS
2687 edhill 1.22
2688 edhill 1.121 ftl_taf_output.$FS: ftl_input_code.$FS
2689     \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
2690     cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
2691 edhill 1.14
2692 heimbach 1.40 ftltafonly:
2693 edhill 1.121 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
2694     cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
2695 heimbach 1.40
2696 edhill 1.19 ftl_taf: ftl_taf_output.o \$(OBJFILES)
2697 edhill 1.21 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
2698 edhill 1.14
2699 edhill 1.121 ftl_tamc_output.$FS: ftl_input_code.$FS
2700     \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.$FS
2701     cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.$FS
2702 edhill 1.16
2703 edhill 1.19 ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
2704 edhill 1.21 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
2705 edhill 1.16
2706    
2707     # ... SVD ...
2708 edhill 1.121 svdtaf: ad_taf_output.$FS ftl_taf_output.$FS
2709 heimbach 1.109 @echo "--->>> Only ran TAF to generate SVD code! <<<---"
2710     @echo "--->>> Do make svdall afterwards to compile. <<<---"
2711     svdall: svd_touch svd_taf
2712 edhill 1.16
2713 heimbach 1.109 svd_taf: \$(OBJFILES)
2714 heimbach 1.40 \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
2715 edhill 1.14
2716 heimbach 1.109 @echo "--->>> Only COMPILE svd code! <<<---"
2717     @echo "--->>> Assumes you previously <<<---"
2718     @echo "--->>> did make svdtaf <<<---"
2719    
2720     svd_touch:
2721     @echo "--->>> Only COMPILE svd code! <<<---"
2722     @echo "--->>> Assumes you previously <<<---"
2723     @echo "--->>> did make svdtaf <<<---"
2724 edhill 1.121 touch ad_taf_output.$FS ftl_taf_output.$FS
2725     \$(FC) \$(FFLAGS) \$(FOPTIM) -c ad_taf_output.$FS
2726     \$(FC) \$(FFLAGS) \$(FOPTIM) -c ftl_taf_output.$FS
2727 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
2728     cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
2729     -rm -f ftl_config.template
2730 edhill 1.14
2731     #=========================================
2732 edhill 1.1
2733     EOF
2734 edhill 1.7
2735     if test "x$EXEHOOK" != x ; then
2736     printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE
2737     fi
2738 edhill 1.1
2739     echo " Making list of \"exceptions\" that need \".p\" files"
2740     for i in $KPPFILES ; do
2741     base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
2742     RETVAL=$?
2743     if test "x$RETVAL" != x0 ; then
2744     echo "Error: unable to add file \"$i\" to the exceptions list"
2745     fi
2746 edhill 1.76 echo "$base.$FS: $base.p" >> $MAKEFILE
2747 edhill 1.1 done
2748    
2749     echo " Making list of NOOPTFILES"
2750     for i in $NOOPTFILES ; do
2751     base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
2752     RETVAL=$?
2753     if test "x$RETVAL" != x0 ; then
2754     echo "Error: unable to add file \"$i\" to the exceptions list"
2755     fi
2756 edhill 1.76 echo "$base.o: $base.$FS" >> $MAKEFILE
2757 edhill 1.2 printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE
2758 edhill 1.1 done
2759    
2760     echo " Add rules for links"
2761     cat srclinks.tmp >> $MAKEFILE
2762     rm -f srclinks.tmp
2763    
2764     echo " Adding makedepend marker"
2765 edhill 1.2 printf "\n\n# DO NOT DELETE\n" >> $MAKEFILE
2766 edhill 1.1
2767 edhill 1.2 printf "\n=== Done ===\n"
2768 adcroft 1.47
2769     # Create special header files
2770 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 > $PACKAGES_DOT_H".tmp"
2771 adcroft 1.47 if test ! -f $PACKAGES_DOT_H ; then
2772     mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
2773     else
2774 edhill 1.61 cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H > /dev/null 2>&1
2775 adcroft 1.47 RETVAL=$?
2776     if test "x$RETVAL" = x0 ; then
2777     rm -f $PACKAGES_DOT_H".tmp"
2778     else
2779     mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"
2780     mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
2781     fi
2782     fi
2783     if test ! -f AD_CONFIG.h ; then
2784 edhill 1.71 $BASH $TOOLSDIR/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -UALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN -UALLOW_ECCO_OPTIMIZATION > AD_CONFIG.h
2785 adcroft 1.47 fi
2786 edhill 1.5
2787    
2788     # Write the "state" for future records
2789     if test "x$DUMPSTATE" != xf ; then
2790 edhill 1.71 printf "" > genmake_state
2791 edhill 1.5 for i in $gm_state ; do
2792     t1="t2=\$$i"
2793     eval $t1
2794 edhill 1.12 echo "$i='$t2'" >> genmake_state
2795 edhill 1.5 done
2796     fi

  ViewVC Help
Powered by ViewVC 1.1.22