/[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.202 - (hide annotations) (download)
Wed Mar 3 19:19:39 2010 UTC (9 years, 6 months ago) by jmc
Branch: MAIN
Changes since 1.201: +2 -2 lines
fix link to devel_HOWTO web page

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