/[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.190 - (hide annotations) (download)
Wed Apr 22 18:35:00 2009 UTC (10 years, 3 months ago) by utke
Branch: MAIN
Changes since 1.189: +6 -11 lines
new postprocessor

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