/[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.186 - (hide annotations) (download)
Sun Mar 29 19:09:24 2009 UTC (10 years, 7 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint61l
Changes since 1.185: +7 -5 lines
improve previous modif.

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