/[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.191 - (hide annotations) (download)
Wed Apr 22 19:21:18 2009 UTC (10 years, 7 months ago) by jmc
Branch: MAIN
Changes since 1.190: +1 -45 lines
delete modifs from March 27-29 2009 (with option "-mpi": link *_mpi files
 from "MODS" dir) to return to a strait-forward behavior.

1 edhill 1.86 #! /usr/bin/env bash
2 edhill 1.1 #
3 jmc 1.191 # $Header: /u/gcmpack/MITgcm/tools/genmake2,v 1.190 2009/04/22 18:35:00 utke Exp $
4 edhill 1.1 #
5     # Makefile generator for MITgcm UV codes
6     # created by cnh 03/98
7     # adapted by aja 06/98
8     # modified by aja 01/00
9     # rewritten in bash by eh3 08/03
10    
11 edhill 1.12 # Search for particular CPP #cmds associated with packages
12     # usage: test_for_package_in_cpp_options CPP_file package_name
13     test_for_package_in_cpp_options() {
14     cpp_options=$1
15     pkg=$2
16 edhill 1.146 test_for_string_in_file $cpp_options "^[ ]*#define.*ALLOW_$pkg[ ]"
17     test_for_string_in_file $cpp_options "^[ ]*#undef.*ALLOW_$pkg[ ]"
18     test_for_string_in_file $cpp_options "^[ ]*#define.*DISABLE_$pkg[ ]"
19     test_for_string_in_file $cpp_options "^[ ]*#undef.*DISABLE_$pkg[ ]"
20     test_for_string_in_file $cpp_options "^[ ]*#define.*ALLOW_$pkg$"
21     test_for_string_in_file $cpp_options "^[ ]*#undef.*ALLOW_$pkg$"
22     test_for_string_in_file $cpp_options "^[ ]*#define.*DISABLE_$pkg$"
23     test_for_string_in_file $cpp_options "^[ ]*#undef.*DISABLE_$pkg$"
24 adcroft 1.52 }
25    
26     # Search for particular CPP #cmds associated with MPI
27     # usage: test_for_mpi_in_cpp_eeoptions CPP_file
28     test_for_mpi_in_cpp_eeoptions() {
29     cpp_options=$1
30 edhill 1.146 test_for_string_in_file $cpp_options "^[ ]*#define.*ALLOW_USE_MPI[ ]"
31     test_for_string_in_file $cpp_options "^[ ]*#undef.*ALLOW_USE_MPI[ ]"
32     test_for_string_in_file $cpp_options "^[ ]*#define.*ALWAYS_USE_MPI[ ]"
33     test_for_string_in_file $cpp_options "^[ ]*#undef.*ALWAYS_USE_MPI[ ]"
34     test_for_string_in_file $cpp_options "^[ ]*#define.*ALLOW_USE_MPI$"
35     test_for_string_in_file $cpp_options "^[ ]*#undef.*ALLOW_USE_MPI$"
36     test_for_string_in_file $cpp_options "^[ ]*#define.*ALWAYS_USE_MPI$"
37     test_for_string_in_file $cpp_options "^[ ]*#undef.*ALWAYS_USE_MPI$"
38 adcroft 1.52 }
39    
40     # Search for particular string in a file. Return 1 if detected, 0 if not
41     # usage: test_for_string_in_file file string
42     test_for_string_in_file() {
43     file=$1
44     strng=$2
45     grep -i "$strng" $file > /dev/null 2>&1
46 edhill 1.12 RETVAL=$?
47     if test "x${RETVAL}" = x0 ; then
48 edhill 1.71 printf "Error: In $file there is an illegal line: "
49 adcroft 1.52 grep -i "$strng" $file
50 edhill 1.146 exit 99
51 edhill 1.12 fi
52 adcroft 1.52 return 0
53 edhill 1.12 }
54    
55     # Read the $ROOTDIR/pkg/pkg_groups file and expand any references to
56     # the package list.
57     expand_pkg_groups() {
58     new_packages=
59     PKG_GROUPS=$ROOTDIR"/pkg/pkg_groups"
60     if test -r $PKG_GROUPS ; then
61     cat $PKG_GROUPS | sed -e 's/#.*$//g' | sed -e 's/:/ : /g' > ./p1.tmp
62 edhill 1.15 cat ./p1.tmp | $AWK '(NF>2 && $2==":"){ print $0 }' > ./p2.tmp
63 edhill 1.12 matched=0
64     for i in $PACKAGES ; do
65     line=`grep "^ *$i" ./p2.tmp`
66     RETVAL=$?
67     if test "x$RETVAL" = x0 ; then
68     matched=1
69 edhill 1.15 replace=`echo $line | $AWK '{ $1=""; $2=""; print $0 }'`
70 edhill 1.12 echo " replacing \"$i\" with: $replace"
71     new_packages="$new_packages $replace"
72     else
73     new_packages="$new_packages $i"
74     fi
75     done
76     PACKAGES=$new_packages
77     rm -f ./p[1,2].tmp
78 adcroft 1.74 return $matched
79 edhill 1.12 else
80     echo "Warning: can't read package groups definition file: $PKG_GROUPS"
81     fi
82     }
83 edhill 1.1
84 edhill 1.75 # Check for broken environments (eg. cygwin, MacOSX w/HFS+) that
85     # cannot distinguish [*.F/*.F90] from [*.f/*.f90] files.
86     check_for_broken_Ff() {
87 edhill 1.76 # Do we have defaults for $FS and/or $FS90 ?
88     tfs=f
89     tfs9=f90
90     if test "x$FS" != x ; then
91     tfs="$FS"
92     fi
93     if test "x$FS90" != x ; then
94     tfs9="$FS90"
95     fi
96    
97 edhill 1.75 # First check the ability to create a *.F/.f pair.
98 edhill 1.76 cat <<EOF >> genmake_hello.F
99 edhill 1.75 program hello
100     write(*,*) 'hi'
101     stop
102     end
103     EOF
104 edhill 1.76 cp genmake_hello.F "genmake_hello."$tfs > /dev/null 2>&1
105 edhill 1.75 RETVAL=$?
106     if test "x$RETVAL" != x0 ; then
107 edhill 1.76 if test "x$FS" = x ; then
108 edhill 1.77 FS='for'
109     FS90='fr9'
110 edhill 1.76 check_for_broken_Ff
111     else
112     cat <<EOF 2>&1
113     ERROR: Your file system cannot distinguish between *.F and *.f files
114     (fails the "cp" test) and this program cannot find a suitable
115     replacement extension. Please try a different build environment or
116     contact the <MITgcm-support@mitgcm.org> list for help.
117    
118     EOF
119     exit -1
120     fi
121 edhill 1.75 return
122     fi
123 edhill 1.76 rm -f genmake_hello.*
124 edhill 1.75
125 edhill 1.76 # Check the ability of ${MAKE} and ${LN} to use the current set
126     # of extensions.
127     cat <<EOF >> genmake_hello.F
128     program hello
129     write(*,*) 'hi'
130     stop
131     end
132     EOF
133 edhill 1.119 test -f $MAKEFILE && mv -f $MAKEFILE $MAKEFILE".tst"
134     cat <<EOF >> $MAKEFILE
135 edhill 1.75 .SUFFIXES:
136 edhill 1.101 .SUFFIXES: .$tfs .F
137     .F.$tfs:
138     $LN \$< \$@
139 edhill 1.75 EOF
140 edhill 1.76 $MAKE "genmake_hello."$tfs > /dev/null 2>&1
141 edhill 1.75 RETVAL=$?
142 edhill 1.88 if test "x$RETVAL" != x0 -o ! -f "genmake_hello."$tfs ; then
143 edhill 1.76 if test "x$FS" = x ; then
144 edhill 1.77 FS='for'
145     FS90='fr9'
146 edhill 1.76 check_for_broken_Ff
147     else
148     cat <<EOF 2>&1
149     ERROR: Your file system cannot distinguish between *.F and *.f files
150     (fails the "make/ln" test) and this program cannot find a suitable
151     replacement extension. Please try a different build environment or
152     contact the <MITgcm-support@mitgcm.org> list for help.
153    
154     EOF
155     exit -1
156     return
157     fi
158 edhill 1.75 fi
159 edhill 1.119 rm -f genmake_hello.* $MAKEFILE
160     test -f $MAKEFILE".tst" && mv -f $MAKEFILE".tst" $MAKEFILE
161 edhill 1.75
162 edhill 1.76 # If we make it here, use the extensions
163     FS=$tfs
164     FS90=$tfs9
165     return
166 edhill 1.75 }
167    
168    
169 edhill 1.84 look_for_makedepend() {
170 adcroft 1.33
171 edhill 1.69 # The "original" makedepend is part of the Imake system that is
172     # most often distributed with XFree86 or with an XFree86 source
173     # package. As a result, many machines (eg. generic Linux) do not
174     # have a system-default "makedepend" available. For those
175     # systems, we have two fall-back options:
176     #
177     # 1) a makedepend implementation shipped with the cyrus-imapd
178     # package: ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/
179     #
180     # 2) a known-buggy xmakedpend shell script
181     #
182     # So the choices are, in order:
183     #
184     # 1) use the user-specified program
185     # 2) use a system-wide default
186     # 3) locally build and use the cyrus implementation
187     # 4) fall back to the buggy local xmakedpend script
188     #
189 adcroft 1.33 if test "x${MAKEDEPEND}" = x ; then
190 edhill 1.85 which makedepend > /dev/null 2>&1
191     RV0=$?
192 edhill 1.119 test -f $MAKEFILE && mv -f $MAKEFILE $MAKEFILE".tst"
193     # echo 'MAKEFILE="'$MAKEFILE'"'
194     cat <<EOF >> $MAKEFILE
195     # THIS IS A TEST MAKEFILE GENERATED BY "genmake2"
196     #
197     # Some "makedepend" implementations will die if they cannot
198     # find a Makefile -- so this file is here to gives them an
199     # empty one to find and parse.
200     EOF
201 edhill 1.85 cat <<EOF >> genmake_tc.f
202 edhill 1.77 program test
203     write(*,*) 'test'
204     stop
205     end
206     EOF
207 edhill 1.85 makedepend genmake_tc.f > /dev/null 2>&1
208 mlosch 1.120 RV1=$?
209 edhill 1.119 test -f $MAKEFILE && rm -f $MAKEFILE
210     test -f $MAKEFILE".tst" && mv -f $MAKEFILE".tst" $MAKEFILE
211 edhill 1.85 if test "x${RV0}${RV1}" = x00 ; then
212     MAKEDEPEND=makedepend
213     else
214     echo " a system-default makedepend was not found."
215    
216     # Try to build the cyrus implementation
217 edhill 1.90 build_cyrus_makedepend
218 edhill 1.85 RETVAL=$?
219 edhill 1.90 if test "x$RETVAL" != x0 ; then
220 edhill 1.85 MAKEDEPEND='$(TOOLSDIR)/xmakedepend'
221     fi
222     rm -f ./genmake_cy_md
223     fi
224 edhill 1.90 else
225     # echo "MAKEDEPEND=${MAKEDEPEND}"
226     echo "${MAKEDEPEND}" | grep -i cyrus > /dev/null 2>&1
227     RETVAL=$?
228     if test x"$RETVAL" = x0 ; then
229     build_cyrus_makedepend
230     fi
231 edhill 1.1 fi
232 edhill 1.84 }
233    
234    
235 edhill 1.90 build_cyrus_makedepend() {
236     rm -f ./genmake_cy_md
237     (
238     cd $ROOTDIR/tools/cyrus-imapd-makedepend \
239     && ./configure > /dev/null 2>&1 \
240     && make > /dev/null 2>&1
241     if test -x ./makedepend.exe ; then
242     $LN ./makedepend.exe ./makedepend
243     fi
244     ./makedepend ifparser.c > /dev/null 2>&1 \
245     && echo "true"
246     ) > ./genmake_cy_md
247     grep true ./genmake_cy_md > /dev/null 2>&1
248     RETVAL=$?
249     rm -f ./genmake_cy_md
250     if test "x$RETVAL" = x0 ; then
251     MAKEDEPEND='$(TOOLSDIR)/cyrus-imapd-makedepend/makedepend'
252     return 0
253     else
254     echo "WARNING: unable to build cyrus-imapd-makedepend"
255     return 1
256     fi
257     }
258    
259 edhill 1.141
260     build_embed_encode()
261     {
262     printf " building the embed-encode utility... "
263     if test ! -e "$ROOTDIR/tools/embed_encode/encode_files" ; then
264     if test ! -d "$ROOTDIR/tools/embed_encode" ; then
265     echo
266     echo " Error: can't locate \"$ROOTDIR/tools/embed_encode\""
267     echo
268     EMBED_SRC=f
269     return 1
270     fi
271     clist="cc gcc c89 $CC"
272     for ic in $clist ; do
273     comm="$ic -o encode_files encode_files.c"
274     ( cd $ROOTDIR/tools/embed_encode && $comm ) > /dev/null 2>&1
275     RETVAL=$?
276     if test "x$RETVAL" = x0 ; then
277     echo "OK"
278     DEFINES="$DEFINES -DHAVE_EMBED_SRC"
279     return 0
280     fi
281     done
282     echo
283     echo " Error: unable to build $ROOTDIR/embed_encode/encode_files"
284     echo " so it has been disabled"
285     echo
286     EMBED_SRC=f
287     return 1
288     fi
289     echo "OK"
290     DEFINES="$DEFINES -DHAVE_EMBED_SRC"
291     }
292    
293    
294 edhill 1.84 # Guess possible config options for this host
295     find_possible_configs() {
296    
297     tmp1=`uname`"_"`uname -m`
298     tmp2=`echo $tmp1 | sed -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
299     tmp3=`echo $tmp2 | sed -e 's/power macintosh/ppc/'`
300     tmp1=`echo $tmp3 | sed -e 's|x86_64|amd64|'`
301     tmp2=`echo $tmp1 | sed -e 's/i[3-6]86/ia32/' | sed -e 's/athlon/ia32/'`
302     tmp3=`echo $tmp2 | sed -e 's/cray sv1/craysv1/'`
303     PLATFORM=$tmp3
304     echo $PLATFORM | grep cygwin > /dev/null 2>&1 && PLATFORM=cygwin_ia32
305     OFLIST=`(cd $ROOTDIR/tools/build_options; ls | grep "^$PLATFORM")`
306     echo " The platform appears to be: $PLATFORM"
307    
308     echo "test" > test
309     ln -s ./test link
310     RETVAL=$?
311     if test "x${RETVAL}" = x0 ; then
312     LN="ln -s"
313     else
314     echo "Error: \"ln -s\" does not appear to work on this system!"
315     echo " For help, please contact <MITgcm-support@mitgcm.org>."
316     exit 1
317     fi
318     rm -f test link
319    
320     if test "x$CPP" = x ; then
321     CPP="cpp -traditional -P"
322     fi
323    
324     look_for_makedepend
325 edhill 1.1
326 edhill 1.91 #================================================================
327     # look for possible C compilers
328 heimbach 1.158 tmp="$MITGCM_CC $CC gcc c89 cc c99 mpicc icc"
329 edhill 1.91 p_CC=
330     for c in $tmp ; do
331     rm -f ./genmake_hello.c ./genmake_hello
332     cat >> genmake_hello.c << EOF
333     #include <stdio.h>
334     int main(int argc, char **argv) {
335     printf("Hello!\n");
336     return 0;
337     }
338     EOF
339     $c -o genmake_hello genmake_hello.c > /dev/null 2>&1
340     RETVAL=$?
341     if test "x${RETVAL}" = x0 ; then
342     p_CC="$p_CC $c"
343     fi
344     done
345     rm -f ./genmake_hello.c ./genmake_hello
346     if test "x${p_CC}" = x ; then
347     cat 1>&2 <<EOF
348    
349     Error: No C compilers were found in your path. Please specify one using:
350    
351     1) an "optfile" on (eg. "-optfile=path/to/OPTFILE"),
352     2) the CC or MITGCM_CC environment variables.
353    
354     EOF
355     exit 1
356     else
357     echo " The possible C compilers found in your path are:"
358     echo " "$p_CC
359     if test "x$CC" = x ; then
360     CC=`echo $p_CC | $AWK '{print $1}'`
361     echo " Setting C compiler to: "$CC
362     fi
363     fi
364    
365     #================================================================
366     # look for possible FORTRAN compilers
367 heimbach 1.158 tmp="$MITGCM_FC $FC efc g77 f77 pgf77 pgf95 ifc ifort f90 f95 mpif77 mpf77 mpxlf95 gfortran g95"
368 edhill 1.1 p_FC=
369 edhill 1.11 for c in $tmp ; do
370     rm -f ./hello.f ./hello
371     cat >> hello.f <<EOF
372     program hello
373     do i=1,3
374     print *, 'hello world : ', i
375     enddo
376     end
377     EOF
378     $c -o hello hello.f > /dev/null 2>&1
379 edhill 1.1 RETVAL=$?
380     if test "x${RETVAL}" = x0 ; then
381     p_FC="$p_FC $c"
382     fi
383     done
384 edhill 1.21 rm -f ./hello.f ./hello
385 edhill 1.1 if test "x${p_FC}" = x ; then
386 edhill 1.11 cat 1>&2 <<EOF
387    
388     Error: No Fortran compilers were found in your path. Please specify one using:
389    
390     1) an "optfile" on (eg. "-optfile=path/to/OPTFILE"),
391     2) a command-line option (eg. "-fc NAME"), or
392 edhill 1.91 3) the FC or MITGCM_FC environment variables.
393 edhill 1.11
394     EOF
395     exit 1
396 edhill 1.1 else
397 edhill 1.11 echo " The possible FORTRAN compilers found in your path are:"
398     echo " "$p_FC
399 edhill 1.136 fi
400    
401     # Use the first of the compilers found in the current PATH
402     # that has a correctly-named optfile
403     if test "x$OPTFILE" = x -a "x$FC" = x ; then
404     for i in $p_FC ; do
405     OPTFILE=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$i
406     if test -r $OPTFILE ; then
407     echo " Setting OPTFILE to: "$OPTFILE
408     break
409     fi
410     done
411 edhill 1.1 fi
412    
413 adcroft 1.67 if test "x$OPTFILE" = x ; then
414     OPTFILE=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$FC
415     if test ! -r $OPTFILE ; then
416     echo " I looked for the file "$OPTFILE" but did not find it"
417     fi
418     fi
419     # echo " The options file: $p_OF"
420     # echo " appears to match so we'll use it."
421     # for i in $p_FC ; do
422     #p_OF=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$i
423     #if test -r $p_OF ; then
424     # OPTFILE=$p_OF
425     # echo " The options file: $p_OF"
426     # echo " appears to match so we'll use it."
427     # break
428     #fi
429     # done
430 edhill 1.11 if test "x$OPTFILE" = x ; then
431     cat 1>&2 <<EOF
432    
433     Error: No options file was found in: $ROOTDIR/tools/build_options/
434     that matches this platform ("$PLATFORM") and the compilers found in
435     your path. Please specify an "optfile" using:
436    
437     1) the command line (eg. "-optfile=path/to/OPTFILE"), or
438     2) the MITGCM_OF environment variable.
439    
440     If you need help, please contact the developers at <MITgcm-support@mitgcm.org>.
441    
442 edhill 1.1 EOF
443 edhill 1.11 exit 1
444 edhill 1.1 fi
445 edhill 1.11
446     # # look for possible MPI libraries
447     # mpi_libs=
448     # mpi_fort=`which mpif77 2>/dev/null`
449     # RETVAL=$?
450     # if test "x${RETVAL}" = x0 ; then
451     # cat >>test.f <<EOF
452     # PROGRAM HELLO
453     # DO 10, I=1,10
454     # PRINT *,'Hello World'
455     # 10 CONTINUE
456     # STOP
457     # END
458     # EOF
459     # eval "$mpi_fort -showme test.f > out"
460     # RETVAL=$?
461     # if test "x${RETVAL}" = x0 ; then
462     # a=`cat out`
463     # for i in $a ; do
464     # case $i in
465     # -*)
466     # mpi_libs="$mpi_libs $i" ;;
467     # esac
468     # done
469     # echo "The MPI libs appear to be:"
470     # echo " "$mpi_libs
471     # fi
472     # rm -f test.f out
473     # fi
474 edhill 1.1
475     }
476    
477     # Parse the package dependency information
478     get_pdepend_list() {
479    
480     # strip the comments and then convert the dependency file into
481     # two arrays: PNAME, DNAME
482     cat $1 | sed -e 's/#.*$//g' \
483 edhill 1.15 | $AWK 'BEGIN{nn=0;} (NF>0){ for(i=2;i<=NF;i++){nn++; print "PNAME["nn"]="$1"\nDNAME["nn"]="$i} }' \
484 edhill 1.1 > ./.pd_tmp
485 edhill 1.34 . ./.pd_tmp
486 edhill 1.1 rm -f ./.pd_tmp
487    
488 edhill 1.71 printf "PNAME = "${}
489 edhill 1.1 }
490    
491    
492     # Explain usage
493     usage() {
494 edhill 1.41 cat <<EOF
495    
496     Usage: "$0" [OPTIONS]
497     where [OPTIONS] can be:
498    
499     -help | --help | -h | --h
500     Print this help message and exit.
501 edhill 1.79
502     -adoptfile NAME | --adoptfile NAME | -adof NAME | --adof NAME
503     -adoptfile=NAME | --adoptfile=NAME | -adof=NAME | --adof=NAME
504     Use "NAME" as the adoptfile. By default, the file at
505     "tools/adjoint_options/adjoint_default" will be used.
506 edhill 1.41
507     -nooptfile | --nooptfile
508     -optfile NAME | --optfile NAME | -of NAME | --of NAME
509     -optfile=NAME | --optfile=NAME | -of=NAME | --of=NAME
510     Use "NAME" as the optfile. By default, an attempt will be
511     made to find an appropriate "standard" optfile in the
512     tools/build_options/ directory.
513    
514     -pdepend NAME | --pdepend NAME
515     -pdepend=NAME | --pdepend=NAME
516     Get package dependency information from "NAME".
517    
518     -pdefault NAME | --pdefault NAME
519     -pdefault=NAME | --pdefault=NAME
520     Get the default package list from "NAME".
521    
522     -make NAME | -m NAME
523     --make=NAME | -m=NAME
524     Use "NAME" for the MAKE program. The default is "make" but
525     many platforms, "gmake" is the preferred choice.
526    
527     -makefile NAME | -mf NAME
528     --makefile=NAME | -mf=NAME
529     Call the makefile "NAME". The default is "Makefile".
530    
531 edhill 1.69 -makedepend NAME | -md NAME
532     --makedepend=NAME | -md=NAME
533     Use "NAME" for the MAKEDEPEND program.
534    
535 edhill 1.41 -rootdir NAME | --rootdir NAME | -rd NAME | --rd NAME
536     -rootdir=NAME | --rootdir=NAME | -rd=NAME | --rd=NAME
537     Specify the location of the MITgcm ROOTDIR as "NAME".
538     By default, genamke will try to find the location by
539     looking in parent directories (up to the 5th parent).
540    
541     -mods NAME | --mods NAME | -mo NAME | --mo NAME
542     -mods=NAME | --mods=NAME | -mo=NAME | --mo=NAME
543     Here, "NAME" specifies a list of directories that are
544     used for additional source code. Files found in the
545     "mods list" are given preference over files of the same
546     name found elsewhere.
547    
548     -disable NAME | --disable NAME
549     -disable=NAME | --disable=NAME
550     Here "NAME" specifies a list of packages that we don't
551     want to use. If this violates package dependencies,
552     genamke will exit with an error message.
553    
554     -enable NAME | --enable NAME
555     -enable=NAME | --enable=NAME
556     Here "NAME" specifies a list of packages that we wish
557     to specifically enable. If this violates package
558     dependencies, genamke will exit with an error message.
559    
560     -standarddirs NAME | --standarddirs NAME
561     -standarddirs=NAME | --standarddirs=NAME
562     Here, "NAME" specifies a list of directories to be
563     used as the "standard" code.
564    
565     -fortran NAME | --fortran NAME | -fc NAME | --fc NAME
566     -fc=NAME | --fc=NAME
567     Use "NAME" as the fortran compiler. By default, genmake
568     will search for a working compiler by trying a list of
569     "usual suspects" such as g77, f77, etc.
570    
571 edhill 1.91 -cc NAME | --cc NAME | -cc=NAME | --cc=NAME
572     Use "NAME" as the C compiler. By default, genmake
573     will search for a working compiler by trying a list of
574     "usual suspects" such as gcc, c89, cc, etc.
575    
576 edhill 1.41 -[no]ieee | --[no]ieee
577     Do or don't use IEEE numerics. Note that this option
578     *only* works if it is supported by the OPTFILE that
579     is being used.
580    
581 edhill 1.143 -ignoretime | -ignore_time | --ignoretime | --ignore_time
582     Ignore all the "wall clock" routines entirely. This will
583     not in any way hurt the model results -- it simply means
584     that the code that checks how long the model spends in
585     various routines will give junk values.
586    
587 ce107 1.126 -ts | --ts
588     Produce timing information per timestep
589 ce107 1.139 -papis | --papis
590 ce107 1.147 Produce summary MFlop/s (and IPC) with PAPI per timestep
591     -pcls | --pcls
592     Produce summary MFlop/s etc. with PCL per timestep
593 ce107 1.139 -foolad | --foolad
594     Fool the AD code generator
595     -papi | --papi
596     Performance analysis with PAPI
597 ce107 1.147 -pcl | --pcl
598     Performance analysis with PCL
599 ce107 1.139 -hpmt | --hpmt
600     Performance analysis with the HPM Toolkit
601    
602     -gsl | --gsl
603     Use GSL to control floating point rounding and precision
604 ce107 1.160 -devel | --devel
605     Add additional warning and debugging flags for development
606 ce107 1.126
607 adcroft 1.67 -mpi | --mpi
608     Include MPI header files and link to MPI libraries
609     -mpi=PATH | --mpi=PATH
610     Include MPI header files and link to MPI libraries using MPI_ROOT
611 edhill 1.95 set to PATH. i.e. Include files from \$PATH/include, link to libraries
612     from \$PATH/lib and use binaries from \$PATH/bin.
613 adcroft 1.67
614 jmc 1.187 -omp | --omp
615     Activate OpenMP code + use Compiler option OMPFLAG
616     -omp=OMPFLAG | --omp=OMPFLAG
617     Activate OpenMP code + use Compiler option OMPFLAG
618    
619 edhill 1.141 -es | --es | -embed-source | --embed-source
620     Embed a tarball containing the full source code
621     (including the Makefile, etc.) used to build the
622     executable [off by default]
623    
624 edhill 1.71 -bash NAME
625     Explicitly specify the Bourne or BASH shell to use
626    
627 edhill 1.41 While it is most often a single word, the "NAME" variables specified
628     above can in many cases be a space-delimited string such as:
629    
630     --enable pkg1 --enable 'pkg1 pkg2' --enable 'pkg1 pkg2 pkg3'
631     -mods=dir1 -mods='dir1' -mods='dir1 dir2 dir3'
632     -foptim='-Mvect=cachesize:512000,transform -xtypemap=real:64,double:64,integer:32'
633    
634     which, depending upon your shell, may need to be single-quoted.
635    
636     For more detailed genmake documentation, please see:
637    
638     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 edhill 1.1 for d in $MODS ; do
1794     if test ! -d $d ; then
1795 edhill 1.2 echo
1796     echo "Error: MODS directory \"$d\" not found!"
1797 edhill 1.1 exit 1
1798     else
1799 jmc 1.185 printf "$d "
1800 edhill 1.1 SOURCEDIRS="$SOURCEDIRS $d"
1801     INCLUDEDIRS="$INCLUDEDIRS $d"
1802     fi
1803     done
1804     echo
1805    
1806     if test "x${PLATFORM}" = x ; then
1807     PLATFORM=$p_PLATFORM
1808     fi
1809    
1810     if test "x${EXEDIR}" = x ; then
1811 edhill 1.112 tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1812 edhill 1.87 if test "x$tmp" = "xbin" -a -d ../exe -a $ROOTDIR = .. ; then
1813 edhill 1.1 EXEDIR=../exe
1814     else
1815     EXEDIR=.
1816     fi
1817     fi
1818     if test ! -d ${EXEDIR} ; then
1819     echo "Error: the specified EXEDIR (\"$EXEDIR\") does not exist!"
1820     exit 1
1821     fi
1822    
1823     if test "x${TOOLSDIR}" = x ; then
1824     TOOLSDIR="$ROOTDIR/tools"
1825     fi
1826     if test ! -d ${TOOLSDIR} ; then
1827 cnh 1.65 echo "Error: the specified TOOLSDIR (\"$TOOLSDIR\") does not exist!"
1828 edhill 1.1 exit 1
1829     fi
1830 edhill 1.11 if test "x$S64" = x ; then
1831 edhill 1.104 echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.sh > /dev/null 2>&1
1832     RETVAL=$?
1833     if test "x${RETVAL}" = x0 ; then
1834     S64='$(TOOLSDIR)/set64bitConst.sh'
1835     else
1836     echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.csh > /dev/null 2>&1
1837     RETVAL=$?
1838     if test "x${RETVAL}" = x0 ; then
1839     S64='$(TOOLSDIR)/set64bitConst.csh'
1840     else
1841     cat <<EOF
1842    
1843     ERROR: neither of the two default scripts:
1844    
1845     ${TOOLSDIR}/set64bitConst.sh
1846     ${TOOLSDIR}/set64bitConst.csh
1847    
1848     are working so please check paths or specify (with \$S64) a
1849     working version of this script.
1850    
1851     EOF
1852     exit 1
1853     fi
1854     fi
1855 edhill 1.11 fi
1856 adcroft 1.44 THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`
1857 edhill 1.1
1858     EXECUTABLE=${EXECUTABLE:-mitgcmuv}
1859    
1860     # We have a special set of source files in eesupp/src which are
1861     # generated from some template source files. We'll make them first so
1862     # they appear as regular source code
1863     if test -r $ROOTDIR"/eesupp/src/Makefile" ; then
1864     echo " Making source files in eesupp from templates"
1865 edhill 1.36 ( cd $ROOTDIR"/eesupp/src/" && $MAKE ) > make_eesupp.errors 2>&1
1866 edhill 1.1 RETVAL=$?
1867 edhill 1.2 if test "x${RETVAL}" = x0 ; then
1868 edhill 1.1 rm -f make_eesupp.errors
1869     else
1870     echo "Error: problem encountered while building source files in eesupp:"
1871 edhill 1.62 cat make_eesupp.errors 1>&2
1872 edhill 1.1 exit 1
1873 afe 1.58 fi
1874     fi
1875    
1876 edhill 1.154 #same for pkg/exch2 and pkg/regrid
1877     for pdir in exch2 regrid ; do
1878     if test -r $ROOTDIR"/pkg/${pdir}/Makefile" ; then
1879     echo " Making source files in pkg/${pdir} from templates"
1880     ( cd $ROOTDIR"/pkg/"${pdir} && $MAKE ) > make_${pdir}.errors 2>&1
1881     RETVAL=$?
1882     if test "x${RETVAL}" = x0 ; then
1883     rm -f make_${pdir}.errors
1884     else
1885     echo "Error: problem encountered while building source files in pkg/${pdir}:"
1886     cat make_${pdir}.errors 1>&2
1887     exit 1
1888     fi
1889 edhill 1.1 fi
1890 edhill 1.154 done
1891 edhill 1.1
1892 edhill 1.2 printf "\n=== Determining package settings ===\n"
1893 edhill 1.1 if test "x${PDEPEND}" = x ; then
1894     tmp=$ROOTDIR"/pkg/pkg_depend"
1895     if test -r $tmp ; then
1896     PDEPEND=$tmp
1897     else
1898     echo "Warning: No package dependency information was specified."
1899     echo " Please check that ROOTDIR/pkg/pkg_depend exists."
1900     fi
1901     else
1902     if test ! -r ${PDEPEND} ; then
1903     echo "Error: can't read package dependency info from PDEPEND=\"$PDEPEND\""
1904     exit 1
1905     fi
1906     fi
1907     echo " getting package dependency info from $PDEPEND"
1908     # Strip the comments and then convert the dependency file into
1909     # two arrays: PNAME, DNAME
1910     cat $PDEPEND | sed -e 's/#.*$//g' \
1911 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}' \
1912 edhill 1.1 > ./.pd_tmp
1913     RETVAL=$?
1914     if test ! "x${RETVAL}" = x0 ; then
1915     echo "Error: unable to parse package dependencies -- please check PDEPEND=\"$PDEPEND\""
1916     exit 1
1917     fi
1918 edhill 1.34 . ./.pd_tmp
1919 edhill 1.1 rm -f ./.pd_tmp
1920    
1921 edhill 1.12 # Search for default packages. Note that a "$ROOTDIR/pkg/pkg_groups"
1922     # file should eventually be added so that, for convenience, one can
1923     # specify groups of packages using names like "ocean" and "atmosphere".
1924 edhill 1.41 echo " checking default package list: "
1925 edhill 1.1 if test "x${PDEFAULT}" = x ; then
1926 edhill 1.12 for i in "." $MODS ; do
1927     if test -r $i"/packages.conf" ; then
1928     PDEFAULT=$i"/packages.conf"
1929     break
1930     fi
1931     done
1932     fi
1933     if test "x${PDEFAULT}" = x ; then
1934 edhill 1.1 PDEFAULT="$ROOTDIR/pkg/pkg_default"
1935     fi
1936     if test "x${PDEFAULT}" = xNONE ; then
1937 edhill 1.41 echo " default packages file disabled"
1938 edhill 1.1 else
1939     if test ! -r $PDEFAULT ; then
1940     echo "Warning: can't read default packages from PDEFAULT=\"$PDEFAULT\""
1941     else
1942 edhill 1.41 echo " using PDEFAULT=\"$PDEFAULT\""
1943 edhill 1.1 # Strip the comments and add all the names
1944 edhill 1.15 def=`cat $PDEFAULT | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
1945 edhill 1.1 RETVAL=$?
1946     if test "x${RETVAL}" != x0 ; then
1947 edhill 1.71 printf "Error: can't parse default package list "
1948 edhill 1.1 echo "-- please check PDEFAULT=\"$PDEFAULT\""
1949     exit 1
1950     fi
1951     for i in $def ; do
1952     PACKAGES="$PACKAGES $i"
1953     done
1954 edhill 1.12 echo " before group expansion packages are: $PACKAGES"
1955 edhill 1.87 RET=1
1956     while test $RET = 1 ; do expand_pkg_groups; RET=$?; done
1957 edhill 1.12 echo " after group expansion packages are: $PACKAGES"
1958 edhill 1.1 fi
1959     fi
1960    
1961     echo " applying DISABLE settings"
1962 adcroft 1.74 for i in $PACKAGES ; do
1963     echo $i >> ./.tmp_pack
1964     done
1965     for i in `grep "-" ./.tmp_pack` ; do
1966     j=`echo $i | sed 's/[-]//'`
1967     DISABLE="$DISABLE $j"
1968     done
1969 edhill 1.1 pack=
1970     for p in $PACKAGES ; do
1971     addit="t"
1972     for d in $DISABLE ; do
1973     if test "x$p" = "x$d" ; then
1974     addit="f"
1975     fi
1976     done
1977     if test "x$addit" = xt ; then
1978     pack="$pack $p"
1979     fi
1980     done
1981     PACKAGES="$pack"
1982     echo " applying ENABLE settings"
1983 edhill 1.12 echo "" > ./.tmp_pack
1984 edhill 1.1 PACKAGES="$PACKAGES $ENABLE"
1985 adcroft 1.74 # Test if each explicitly referenced package exists
1986 edhill 1.1 for i in $PACKAGES ; do
1987 adcroft 1.74 j=`echo $i | sed 's/[-+]//'`
1988     if test ! -d "$ROOTDIR/pkg/$j" ; then
1989 edhill 1.1 echo "Error: can't find package $i at \"$ROOTDIR/pkg/$i\""
1990 adcroft 1.74 exit 1
1991 edhill 1.1 fi
1992     echo $i >> ./.tmp_pack
1993     done
1994     PACKAGES=
1995 adcroft 1.74 for i in `grep -v "-" ./.tmp_pack | sort | uniq` ; do
1996 edhill 1.1 PACKAGES="$PACKAGES $i"
1997     done
1998 adcroft 1.74 rm -f ./.tmp_pack
1999 edhill 1.1 echo " packages are: $PACKAGES"
2000    
2001 jmc 1.161 # Check for package MNC: if NetCDF is available, then build the MNC
2002     # template files ; otherwise, delete mnc from the list of packages.
2003 edhill 1.100 echo $PACKAGES | grep ' mnc ' > /dev/null 2>&1
2004     RETVAL=$?
2005     if test "x$RETVAL" = x0 ; then
2006     if test "x$HAVE_NETCDF" != xt ; then
2007     cat <<EOF
2008    
2009     *********************************************************************
2010     WARNING: the "mnc" package was enabled but tests failed to compile
2011     NetCDF applications. Please check that:
2012    
2013     1) NetCDF is correctly installed for this compiler and
2014     2) the LIBS variable (within the "optfile") specifies the correct
2015     NetCDF library to link against.
2016    
2017     Due to this failure, the "mnc" package is now DISABLED.
2018     *********************************************************************
2019    
2020     EOF
2021     PACKAGES=`echo $PACKAGES | sed -e 's/mnc//g'`
2022     DISABLE="$DISABLE mnc"
2023     else
2024 edhill 1.110 ( cd $ROOTDIR"/pkg/mnc" && $MAKE testclean && $MAKE templates ) > make_mnc.errors 2>&1
2025 edhill 1.100 RETVAL=$?
2026     if test "x${RETVAL}" = x0 ; then
2027     rm -f make_mnc.errors
2028     else
2029     echo "Error: problem encountered while building source files in pkg/mnc:"
2030     cat make_mnc.errors 1>&2
2031     exit 1
2032     fi
2033     fi
2034     fi
2035    
2036 jmc 1.161 # Check for package PROFILES: if NetCDF is not available,
2037     # then delete profiles from the list of available packages.
2038     echo $PACKAGES | grep ' profiles ' > /dev/null 2>&1
2039     RETVAL=$?
2040     if test "x$RETVAL" = x0 ; then
2041     if test "x$HAVE_NETCDF" != xt ; then
2042     cat <<EOF
2043    
2044     *********************************************************************
2045     WARNING: the "profiles" package was enabled but tests failed to
2046     compile NetCDF applications. Please check that:
2047    
2048     1) NetCDF is correctly installed for this compiler and
2049     2) the LIBS variable (within the "optfile") specifies the correct
2050     NetCDF library to link against.
2051    
2052     Due to this failure, the "profiles" package is now DISABLED.
2053     *********************************************************************
2054    
2055     EOF
2056     PACKAGES=`echo $PACKAGES | sed -e 's/profiles//g'`
2057     DISABLE="$DISABLE profiles"
2058     fi
2059     fi
2060    
2061 edhill 1.1 echo " applying package dependency rules"
2062     ck=
2063     while test "x$ck" != xtt ; do
2064     i=0
2065 edhill 1.2 # rtot=${#PNAME[@]}
2066     rtot=$nname
2067 jmc 1.162 while test $i -le $rtot ; do
2068 edhill 1.1
2069     # Is $pname in the current $PACKAGES list?
2070 edhill 1.2 # pname=${PNAME[$i]}
2071     tmp="pname=\"\$PNAME_$i\""
2072     eval $tmp
2073 edhill 1.1 pin="f"
2074     for p in $PACKAGES ; do
2075     if test "x$p" = "x$pname" ; then
2076     pin="t"
2077     fi
2078     done
2079    
2080     # Is the DNAME entry a (+) or (-) rule ?
2081 edhill 1.2 tmp="dname=\"\$DNAME_$i\""
2082     eval $tmp
2083 edhill 1.1 plus="-"
2084 edhill 1.2 echo $dname | grep '^+' > /dev/null 2>&1
2085 edhill 1.1 RETVAL=$?
2086     if test "x$RETVAL" = x0 ; then
2087     plus="+"
2088     fi
2089    
2090     # Is $dname in the current $PACKAGES list?
2091 edhill 1.2 dname=`echo $dname | sed -e 's/^[+-]//'`
2092 edhill 1.1 din="f"
2093     for p in $PACKAGES ; do
2094     if test "x$p" = "x$dname" ; then
2095     din="t"
2096     fi
2097     done
2098    
2099     # Do we need to add $dname according to the dependency rules?
2100     if test "x$pin" = xt -a "x$plus" = "x+" -a "x$din" = xf ; then
2101 jmc 1.162 #echo " " $pname ": need to add :" $dname
2102 edhill 1.1 in_dis="f"
2103     for dis in $DISABLE ; do
2104     if test "x$dis" = "x$dname" ; then
2105     in_dis="t"
2106     fi
2107     done
2108     if test "x$in_dis" = xt ; then
2109     echo "Error: can't satisfy package dependencies:"
2110     echo " \"$dname\" is required by the dependency rules"
2111     echo " but is disallowed by the DISABLE settings"
2112     exit 1
2113     else
2114     PACKAGES="$PACKAGES $dname"
2115     ck=
2116     fi
2117     fi
2118    
2119     # Do we need to get rid of $dname according to the dependency rules?
2120     if test "x$pin" = xt -a "x$plus" = "x-" -a "x$din" = xt; then
2121     echo "Error: can't satisfy package dependencies:"
2122     echo " \"$pname\" was requested but is disallowed by"
2123     echo " the dependency rules for \"$dname\""
2124     exit 1
2125     fi
2126 edhill 1.87 i=`echo "$i + 1" | bc -l`
2127     #i=$(( $i + 1 ))
2128 edhill 1.1 done
2129     ck=$ck"t"
2130     done
2131     echo " packages are: $PACKAGES"
2132     for i in $PACKAGES ; do
2133     adr="$ROOTDIR/pkg/$i"
2134     if test -d $adr ; then
2135     SOURCEDIRS="$SOURCEDIRS $adr"
2136     INCLUDEDIRS="$INCLUDEDIRS $adr"
2137 edhill 1.14 if test "x$i" = xautodiff ; then
2138     AUTODIFF_PKG_USED=t
2139     fi
2140 edhill 1.1 else
2141     echo "Error: the directory \"$adr\" for package $i doesn't exist"
2142     exit 1
2143     fi
2144     done
2145    
2146 edhill 1.12 # Create a list of #define and #undef to enable/disable packages
2147     PACKAGES_DOT_H=PACKAGES_CONFIG.h
2148 edhill 1.1 # The following UGLY HACK sets multiple "#undef"s and it needs to go
2149     # away. On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h
2150     # file would eventually be split up so that all package-related #define
2151     # statements could be separated and handled only by genmake.
2152     names=`ls -1 "$ROOTDIR/pkg"`
2153     all_pack=
2154 adcroft 1.44 DISABLED_PACKAGES=
2155 edhill 1.1 for n in $names ; do
2156     if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
2157     has_pack="f"
2158     for pack in $PACKAGES ; do
2159     if test "x$pack" = "x$n" ; then
2160     has_pack="t"
2161     break
2162     fi
2163     done
2164     if test "x$has_pack" = xf ; then
2165 edhill 1.116 undef=`echo "ALLOW_$n" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2166 adcroft 1.44 DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
2167 edhill 1.1 fi
2168     fi
2169     done
2170 adcroft 1.44 ENABLED_PACKAGES=
2171 edhill 1.1 for i in $PACKAGES ; do
2172 edhill 1.116 def=`echo "ALLOW_$i" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2173 adcroft 1.44 ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
2174 edhill 1.12 #eh3 DEFINES="$DEFINES -D$def"
2175 edhill 1.1
2176     #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
2177     case $i in
2178     aim_v23)
2179 adcroft 1.46 ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
2180 jmc 1.55 echo "Warning: ALLOW_AIM is set to enable aim_v23."
2181 edhill 1.1 ;;
2182     esac
2183     #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
2184    
2185     done
2186    
2187     echo " Adding STANDARDDIRS"
2188     BUILDDIR=${BUILDDIR:-.}
2189 edhill 1.57 if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
2190 edhill 1.12 STANDARDDIRS="eesupp model"
2191     fi
2192 edhill 1.57 if test "x$STANDARDDIRS" != x ; then
2193     for d in $STANDARDDIRS ; do
2194     adr="$ROOTDIR/$d/src"
2195     if test ! -d $adr ; then
2196     echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2197     echo " is correct and that you correctly specified the STANDARDDIRS option"
2198     exit 1
2199     else
2200     SOURCEDIRS="$SOURCEDIRS $adr"
2201     fi
2202     adr="$ROOTDIR/$d/inc"
2203     if test ! -d $adr ; then
2204     echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2205     echo " is correct and that you correctly specified the STANDARDDIRS option"
2206     exit 1
2207     else
2208     INCLUDEDIRS="$INCLUDEDIRS $adr"
2209     fi
2210     done
2211     fi
2212 edhill 1.1
2213 adcroft 1.52 echo " Searching for *OPTIONS.h files in order to warn about the presence"
2214     echo " of \"#define \"-type statements that are no longer allowed:"
2215 edhill 1.12 CPP_OPTIONS=
2216 adcroft 1.52 CPP_EEOPTIONS=
2217 edhill 1.12 spaths=". $INCLUDEDIRS"
2218 adcroft 1.52 names=`ls -1 "$ROOTDIR/pkg"`
2219 edhill 1.12 for i in $spaths ; do
2220     try="$i/CPP_OPTIONS.h"
2221 edhill 1.54 if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
2222 edhill 1.12 echo " found CPP_OPTIONS=\"$try\""
2223     CPP_OPTIONS="$try"
2224 adcroft 1.52 # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
2225     for n in $names ; do
2226     test_for_package_in_cpp_options $CPP_OPTIONS $n
2227     done
2228     fi
2229     try="$i/CPP_EEOPTIONS.h"
2230 edhill 1.54 if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
2231 adcroft 1.52 echo " found CPP_EEOPTIONS=\"$try\""
2232     # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
2233     #**** not yet enabled ****
2234     # test_for_mpi_in_cpp_eeoptions $try
2235     #**** not yet enabled ****
2236     CPP_EEOPTIONS="$try"
2237 edhill 1.12 fi
2238     done
2239     if test "x$CPP_OPTIONS" = x ; then
2240     echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
2241     exit 1
2242     fi
2243 edhill 1.1
2244 edhill 1.14 # Here, we build the list of files to be "run through" the adjoint
2245     # compiler.
2246 jmc 1.176 if test -f ./adSrcFiles.tmp ; then
2247     rm -f ./adSrcFiles.tmp
2248 edhill 1.14 fi
2249     echo " Creating the list of files for the adjoint compiler."
2250     for i in $SOURCEDIRS ; do
2251     list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
2252     for j in $list_files ; do
2253 jmc 1.176 cat $i/$j >> adSrcFiles.tmp
2254 edhill 1.14 done
2255     done
2256 edhill 1.121 if test ! "x"$FS = "x.f" ; then
2257 jmc 1.176 cat adSrcFiles.tmp | sed -e "s/\.f/.$FS/g" > adSrcFiles.tmp_f
2258     mv -f adSrcFiles.tmp_f adSrcFiles.tmp
2259 edhill 1.121 fi
2260 edhill 1.14
2261 edhill 1.2 echo
2262     echo "=== Creating the Makefile ==="
2263 edhill 1.1 echo " setting INCLUDES"
2264     for i in $INCLUDEDIRS ; do
2265 edhill 1.87 if test ! -d $i ; then
2266 edhill 1.1 echo "Warning: can't find INCLUDEDIRS=\"$i\""
2267     fi
2268     done
2269    
2270 ce107 1.139 if test ! "x$DIVA" = x ; then
2271 ce107 1.140 echo " Creating the pseudo-MPI include directory"
2272 ce107 1.139 INCLUDES="-I./mpi_headers $INCLUDES"
2273     rm -rf ./mpi_headers
2274     mkdir -p ./mpi_headers
2275    
2276     if test "x$MPIINCLUDEDIR" = x ; then
2277     if test "x$MPIHOME" = x ; then
2278     MPIHOME='/usr'
2279     fi
2280     MPIINCLUDEDIR='$MPIHOME/include'
2281     fi
2282    
2283     if test -r $MPIINCLUDEDIR/mpif.h ; then
2284     for i in $MPI_HEADER_FILES; do
2285     cp -p $MPIINCLUDEDIR/$i ./mpi_headers
2286     done
2287    
2288     perl -i -pe 's/MPI_DISPLACEMENT_CURRENT=-1_8/MPI_DISPLACEMENT_CURRENT=-1/g' mpi_headers/mpif.h
2289     else
2290     echo " We cannot create a copy of mpif.h!"
2291 heimbach 1.156 # exit -1
2292 ce107 1.139 fi
2293     fi
2294    
2295 edhill 1.1 echo " Determining the list of source and include files"
2296     rm -rf .links.tmp
2297     mkdir .links.tmp
2298 edhill 1.142 touch .links.tmp/foo
2299     if test ! -r ".links.tmp/foo" ; then
2300     echo
2301     echo "ERROR : something is wrong with your directory permissions or"
2302     echo " your user file-creation mask (\"umask\") since creating a"
2303     echo " sub-dir, touch-ing a file within it, and then reading it is"
2304     echo " not working. Please try setting your umask to something"
2305     echo " sane such as:"
2306     echo
2307     echo " umask 0002"
2308     echo
2309     echo " and please verify that you have the proper permissions for"
2310     echo " creating sub-directories and then reading files created"
2311     echo " within them."
2312     echo
2313     exit 1
2314     fi
2315     rm -f .links.tmp/foo
2316 jmc 1.176
2317     if test "x$OPENAD" != x ; then
2318     OAD_DONT_COMPILE="/dev/null"
2319     OAD_DONT_TRANSFORM="/dev/null"
2320     OAD_KEEP_ORIGINAL="/dev/null"
2321     OAD_CB2M_FILES="/dev/null"
2322     echo " looking for dontCompile file: "
2323     for i in "." $MODS ; do
2324     if test -r $i"/dontCompile" ; then
2325     OAD_DONT_COMPILE=$i"/dontCompile"
2326     echo " found $OAD_DONT_COMPILE"
2327     break
2328     fi
2329     done
2330     echo " looking for dontTransform file: "
2331     for i in "." $MODS ; do
2332     if test -r $i"/dontTransform" ; then
2333     OAD_DONT_TRANSFORM=$i"/dontTransform"
2334     echo " found $OAD_DONT_TRANSFORM"
2335     break
2336     fi
2337     done
2338     echo " looking for keepOriginal file: "
2339     for i in "." $MODS ; do
2340     if test -r $i"/keepOriginal" ; then
2341     OAD_KEEP_ORIGINAL=$i"/keepOriginal"
2342     echo " found $OAD_KEEP_ORIGINAL"
2343     break
2344     fi
2345     done
2346     echo " looking for cb2mFiles: "
2347     for i in "." $MODS ; do
2348     if test -r $i"/cb2mFiles" ; then
2349     OAD_CB2M_FILES=$i"/cb2mFiles"
2350     echo " found $OAD_CB2M_FILES"
2351     break
2352     fi
2353     done
2354     echo " OpenAD exceptions: "
2355     fi
2356    
2357 edhill 1.1 echo "# This section creates symbolic links" > srclinks.tmp
2358     echo "" >> srclinks.tmp
2359 jmc 1.176 printf 'F77_SRC_FILES = ' > F77srclist.tmp
2360     printf 'NON_AD_F77_SRC_FILES = ' > nonADF77srclist.tmp
2361     printf 'C_SRC_FILES = ' > csrclist.tmp
2362     printf 'F90_SRC_FILES = ' > F90srclist.tmp
2363     printf 'H_SRC_FILES = ' > hsrclist.tmp
2364     printf 'AD_FLOW_FILES = ' > ad_flow_files.tmp
2365 adcroft 1.9 alldirs="$SOURCEDIRS $INCLUDEDIRS ."
2366 edhill 1.1 for d in $alldirs ; do
2367     deplist=
2368 edhill 1.14 sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
2369 cnh 1.3 sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
2370 jmc 1.176 if test "x$OPENAD" != x ; then
2371     sfiles=`( echo $sfiles | grep -v _cb2m\. )`
2372     fi
2373 edhill 1.1 for sf in $sfiles ; do
2374     if test ! -r ".links.tmp/$sf" ; then
2375     if test -f "$d/$sf" ; then
2376 edhill 1.131 ignore_f=f
2377 adcroft 1.44 case $d/$sf in
2378     ./$PACKAGES_DOT_H)
2379 edhill 1.141 ignore_f=t
2380 adcroft 1.44 ;;
2381     ./AD_CONFIG.h)
2382 edhill 1.141 ignore_f=t
2383 adcroft 1.44 ;;
2384     ./FC_NAMEMANGLE.h)
2385 edhill 1.141 ignore_f=t
2386 adcroft 1.44 ;;
2387 edhill 1.98 ./BUILD_INFO.h)
2388 edhill 1.141 ignore_f=t
2389     ;;
2390     ./EMBEDDED_FILES.h)
2391     ignore_f=t
2392 edhill 1.98 ;;
2393 adcroft 1.44 *)
2394 edhill 1.131 # For the local directory *ONLY*,
2395     # ignore all soft-links
2396     if test "x$HAVE_TEST_L" = xt -a "x$d" = x. -a -L $sf ; then
2397     ignore_f=t
2398     else
2399     touch .links.tmp/$sf
2400     deplist="$deplist $sf"
2401     fi
2402 adcroft 1.44 ;;
2403     esac
2404 edhill 1.131 if test "x$ignore_f" = xf ; then
2405     extn=`echo $sf | $AWK -F. '{print $NF}'`
2406     case $extn in
2407 jmc 1.176 F)
2408     echo " \\" >> F77srclist.tmp
2409     printf " $sf" >> F77srclist.tmp
2410     if test "x$OPENAD" != x ; then
2411     basename=${sf%%.F}
2412     isAD=`egrep ^$basename.f'[ ]*' adSrcFiles.tmp`
2413     if test -z "$isAD" ; then
2414     toBeIgnored=`egrep ^$basename'[ ]*' ${OAD_DONT_COMPILE}`
2415     if test -z "$toBeIgnored" ; then
2416     echo " \\" >> nonADF77srclist.tmp
2417     printf " $sf" >> nonADF77srclist.tmp
2418     else
2419     echo " not to be compiled : $sf"
2420     fi
2421     else # file is initially listed as an AD file we want to exclude it
2422     # or we want to retain the untransformed version
2423     notToBeTransformed=`egrep ^$basename'[ ]*' ${OAD_DONT_TRANSFORM}`
2424     untransformedVersionToBeKept=`egrep ^$basename'[ ]*' ${OAD_KEEP_ORIGINAL}`
2425     if test -n "$notToBeTransformed"; then
2426     echo " not to be transformed: $sf"
2427     fi
2428     if test -n "$untransformedVersionToBeKept" ; then
2429     echo " original to be kept : $sf"
2430     fi
2431     if test -n "$notToBeTransformed" -o -n "$untransformedVersionToBeKept" ; then
2432     echo " \\" >> nonADF77srclist.tmp
2433     printf " $sf" >> nonADF77srclist.tmp
2434     fi
2435     fi
2436     fi
2437     ;;
2438     F90)
2439     echo " \\" >> F90srclist.tmp
2440     printf " $sf" >> F90srclist.tmp
2441     ;;
2442     c)
2443     echo " \\" >> csrclist.tmp
2444     printf " $sf" >> csrclist.tmp
2445     ;;
2446     h)
2447     echo " \\" >> hsrclist.tmp
2448     printf " $sf" >> hsrclist.tmp
2449     ;;
2450     flow)
2451     echo " \\" >> ad_flow_files.tmp
2452     printf " $sf" >> ad_flow_files.tmp
2453     ;;
2454     esac
2455     fi
2456 edhill 1.1 fi
2457     fi
2458     done
2459     if test "x$deplist" != x ; then
2460 jmc 1.176 if test "$d" != "." ; then
2461     echo "" >> srclinks.tmp
2462 edhill 1.2 echo "# These files are linked from $d" >> srclinks.tmp
2463 edhill 1.1 echo "$deplist :" >> srclinks.tmp
2464 jahn 1.170 # We need to make sure that the link isn't already there.
2465     # This may happen when make thinks that a header file has to be "remade"
2466     # because a module it depends on has changed. In this case we do nothing.
2467     printf "\tif [ ! -L \$@ ]; then \$(LN) %s/\$@ \$@; fi\n" $d >> srclinks.tmp
2468 jmc 1.176 fi
2469 edhill 1.1 fi
2470     done
2471     rm -rf .links.tmp
2472 jmc 1.176 echo "" >> F77srclist.tmp
2473     echo "" >> nonADF77srclist.tmp
2474     echo "" >> csrclist.tmp
2475     echo "" >> F90srclist.tmp
2476     echo "" >> hsrclist.tmp
2477     echo "" >> ad_flow_files.tmp
2478 edhill 1.1
2479 edhill 1.88 if test -f $MAKEFILE ; then
2480 edhill 1.1 mv -f $MAKEFILE "$MAKEFILE.bak"
2481     fi
2482     echo " Writing makefile: $MAKEFILE"
2483     echo "# Multithreaded + multi-processing makefile for:" > $MAKEFILE
2484     echo "# $MACHINE" >> $MAKEFILE
2485     echo "# This makefile was generated automatically on" >> $MAKEFILE
2486     echo "# $THISDATE" >> $MAKEFILE
2487     echo "# by the command:" >> $MAKEFILE
2488 edhill 1.73 echo "# $0 $G2ARGS" >> $MAKEFILE
2489 edhill 1.1 echo "# executed by:" >> $MAKEFILE
2490 edhill 1.97 echo "# ${THISUSER}@${THISHOST}:${THISCWD}" >> $MAKEFILE
2491 edhill 1.21
2492     EXE_AD=$EXECUTABLE"_ad"
2493     EXE_FTL=$EXECUTABLE"_ftl"
2494     EXE_SVD=$EXECUTABLE"_svd"
2495    
2496 edhill 1.1 cat >>$MAKEFILE <<EOF
2497 edhill 1.53 #
2498     # OPTFILE="$OPTFILE"
2499 edhill 1.1 #
2500     # BUILDDIR : Directory where object files are written
2501     # SOURCEDIRS : Directories containing the source (.F) files
2502     # INCLUDEDIRS : Directories containing the header-source (.h) files
2503     # EXEDIR : Directory where executable that is generated is written
2504     # EXECUTABLE : Full path of executable binary
2505     #
2506     # CPP : C-preprocessor command
2507     # INCLUDES : Directories searched for header files
2508     # DEFINES : Macro definitions for CPP
2509     # MAKEDEPEND : Dependency generator
2510     # KPP : Special preprocessor command (specific to platform)
2511     # KFLAGS : Flags for KPP
2512     # FC : Fortran compiler command
2513     # FFLAGS : Configuration/debugging options for FC
2514     # FOPTIM : Optimization options for FC
2515     # LINK : Command for link editor program
2516     # LIBS : Library flags /or/ additional optimization/debugging flags
2517    
2518     ROOTDIR = ${ROOTDIR}
2519     BUILDDIR = ${BUILDDIR}
2520     SOURCEDIRS = ${SOURCEDIRS}
2521     INCLUDEDIRS = ${INCLUDEDIRS}
2522     EXEDIR = ${EXEDIR}
2523     EXECUTABLE = \$(EXEDIR)/${EXECUTABLE}
2524     TOOLSDIR = ${TOOLSDIR}
2525    
2526 edhill 1.14 #eh3 new defines for the adjoint work
2527     AUTODIFF = ${ROOTDIR}/pkg/autodiff
2528 edhill 1.21 EXE_AD = ${EXE_AD}
2529     EXE_FTL = ${EXE_FTL}
2530     EXE_SVD = ${EXE_SVD}
2531 edhill 1.14
2532 adcroft 1.44 ENABLED_PACKAGES = ${ENABLED_PACKAGES}
2533     DISABLED_PACKAGES = ${DISABLED_PACKAGES}
2534    
2535 adcroft 1.52 # These files are created by Makefile
2536 edhill 1.97 SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h BUILD_INFO.h
2537 edhill 1.141 EOF
2538 adcroft 1.52
2539 edhill 1.141 if test "x$EMBED_SRC" = xt ; then
2540     echo "EMBEDDED_FILES = EMBEDDED_FILES.h" >>$MAKEFILE
2541     else
2542     echo "EMBEDDED_FILES = " >>$MAKEFILE
2543     fi
2544 edhill 1.1
2545     cat >>$MAKEFILE <<EOF
2546     # Unix ln (link)
2547     LN = ${LN}
2548     # C preprocessor
2549     CPP = cat \$< | ${S64} | ${CPP}
2550     # Dependency generator
2551     MAKEDEPEND = ${MAKEDEPEND}
2552     # Special preprocessor (KAP on DECs, FPP on Crays)
2553     KPP = ${KPP}
2554     # Fortran compiler
2555 edhill 1.94 FC = ${FC}
2556 cnh 1.3 # Fortran compiler
2557     F90C = ${F90C}
2558 edhill 1.92 # C compiler
2559     CC = ${CC}
2560 edhill 1.1 # Link editor
2561 edhill 1.70 LINK = ${LINK} ${LDADD}
2562 edhill 1.1
2563     # Defines for CPP
2564     DEFINES = ${DEFINES}
2565     # Includes for CPP
2566     INCLUDES = ${INCLUDES}
2567     # Flags for KPP
2568     KFLAGS1 = ${KFLAGS1}
2569     KFLAGS2 = ${KFLAGS2}
2570     # Optim./debug for FC
2571 mlosch 1.165 FFLAGS = ${FFLAGS} ${FEXTRAFLAGS}
2572 edhill 1.1 FOPTIM = ${FOPTIM}
2573 cnh 1.3 # Optim./debug for FC
2574     F90FLAGS = ${F90FLAGS}
2575     F90OPTIM = ${F90OPTIM}
2576 jmc 1.176 F90FIXEDFORMAT = ${F90FIXEDFORMAT}
2577 edhill 1.1 # Flags for CC
2578     CFLAGS = ${CFLAGS}
2579     # Files that should not be optimized
2580     NOOPTFILES = ${NOOPTFILES}
2581     NOOPTFLAGS = ${NOOPTFLAGS}
2582     # Flags and libraries needed for linking
2583 edhill 1.107 LIBS = ${LIBS}
2584 cnh 1.3 # Name of the Mekfile
2585     MAKEFILE=${MAKEFILE}
2586 edhill 1.1
2587     EOF
2588    
2589 jmc 1.176 cat F77srclist.tmp >> $MAKEFILE
2590     cat nonADF77srclist.tmp >> $MAKEFILE
2591     cat csrclist.tmp >> $MAKEFILE
2592     cat F90srclist.tmp >> $MAKEFILE
2593     cat hsrclist.tmp >> $MAKEFILE
2594     cat ad_flow_files.tmp >> $MAKEFILE
2595    
2596     rm -f F77srclist.tmp nonADF77srclist.tmp csrclist.tmp F90srclist.tmp hsrclist.tmp ad_flow_files.tmp
2597    
2598 edhill 1.75 echo >> $MAKEFILE
2599 jmc 1.176
2600     # add definitions for preprocessed sources
2601     # and note that not all systems allow case sensitive extensions
2602     # hence the $FS and $FS90 here.
2603     # for fixed format f90 files we use ff90 or FF90 resp
2604     # but these are not expected to be the original source files
2605    
2606     echo 'F77_PP_SRC_FILES = $(F77_SRC_FILES:.F=.'$FS')' >> $MAKEFILE
2607     echo 'F90_PP_SRC_FILES = $(F90_SRC_FILES:.F90=.'$FS90')' >> $MAKEFILE
2608     echo 'OBJFILES= $(F77_SRC_FILES:.F=.o) $(C_SRC_FILES:.c=.o) $(F90_SRC_FILES:.F90=.o)' >> $MAKEFILE
2609 dfer 1.172 echo 'FLOFILES = $(AD_FLOW_FILES:.flow=.flowdir)' >> $MAKEFILE
2610 edhill 1.75 echo >> $MAKEFILE
2611     echo '.SUFFIXES:' >> $MAKEFILE
2612 jmc 1.176 echo '.SUFFIXES: .o .'$FS' .p .F .c .f'$FS90' .'$FS90' .FF90 .F90 .flowdir .flow' >> $MAKEFILE
2613 edhill 1.1
2614     cat >>$MAKEFILE <<EOF
2615    
2616     all: \$(EXECUTABLE)
2617 jmc 1.176 \$(EXECUTABLE): \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(OBJFILES) \$(EMBEDDED_FILES)
2618 adcroft 1.44 @echo Creating \$@ ...
2619 edhill 1.1 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
2620     depend:
2621     @make links
2622 jmc 1.176 \$(MAKEDEPEND) -o .$FS \$(DEFINES) \$(INCLUDES) \$(F77_SRC_FILES)
2623 adcroft 1.44 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
2624 edhill 1.72 -rm -f makedepend.out
2625 edhill 1.1
2626 cnh 1.132 lib: libmitgcmuv.a
2627    
2628     libmitgcmuv.a: \$(OBJFILES)
2629     ar rcv libmitgcmuv.a \$(OBJFILES)
2630 cnh 1.159 ar d libmitgcmuv.a main.o
2631 cnh 1.132
2632 jmc 1.176 links: \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(SPECIAL_FILES)
2633 edhill 1.1
2634 jmc 1.176 small_f: \$(F77_PP_SRC_FILES) \$(F90_PP_SRC_FILES)
2635 edhill 1.1
2636     output.txt: \$(EXECUTABLE)
2637     @printf 'running ... '
2638     @\$(EXECUTABLE) > \$@
2639    
2640     clean:
2641 heimbach 1.157 -rm -rf *.p *.$FS90 *.mod ${RMFILES} work.{pc,pcl} *.template
2642     -rm -rf *.o
2643 dfer 1.172 -rm -rf *.$FS *.flowdir
2644 jmc 1.176 -rm -rf *.f$FS90 *_mod.h *_mod.F90 *.FF90 *.mod-whirl ad_input*
2645 utke 1.178 -rm -rf temp.sed
2646 edhill 1.1 Clean:
2647     @make clean
2648     @make cleanlinks
2649 adcroft 1.52 -rm -f \$(SPECIAL_FILES)
2650 dfer 1.172 -rm -f genmake_state genmake_*optfile genmake_warnings make.log run.log f90mkdepend.log *.bak
2651 jmc 1.166 -rm -f taf_command taf_output taf_ad.log taf_ad_flow.log
2652 edhill 1.1 CLEAN:
2653     @make Clean
2654     -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
2655     -find \$(EXEDIR) -name "*.data" -exec rm {} \;
2656     -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
2657 jmc 1.152 -rm -f \$(EXECUTABLE) \$(EXE_AD) *.txt STD* *diagnostics.log datetime
2658 jmc 1.166 -rm -f *_MIT_CE_000.opt0000 costfunction*0000
2659 edhill 1.144 -rm -rf mnc_test_*
2660 edhill 1.1
2661 edhill 1.18 #eh3 Makefile: makefile
2662 edhill 1.1 makefile:
2663 edhill 1.73 $THIS_SCRIPT $G2ARGS
2664 edhill 1.1 cleanlinks:
2665     -find . -type l -exec rm {} \;
2666    
2667 jmc 1.176 # Special targets (SPECIAL_FILES) which are created by make
2668 adcroft 1.44 ${PACKAGES_DOT_H}:
2669     @echo Creating \$@ ...
2670 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) > \$@
2671 adcroft 1.44 AD_CONFIG.h:
2672     @echo Creating \$@ ...
2673 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 > \$@
2674 adcroft 1.52 FC_NAMEMANGLE.h:
2675     @echo Creating \$@ ...
2676     echo "$FC_NAMEMANGLE" > \$@
2677 adcroft 1.44
2678 edhill 1.97 BUILD_INFO.h:
2679     @echo Creating \$@ ...
2680     EOF
2681    
2682     test ! "x$THISVER" = x && echo " -echo \"#define THISVER '$THISVER'\" > \$@" >> $MAKEFILE
2683     test ! "x$THISUSER" = x && echo " -echo \"#define THISUSER '$THISUSER'\" >> \$@" >> $MAKEFILE
2684     test ! "x$THISDATE" = x && echo " -echo \"#define THISDATE '$THISDATE'\" >> \$@" >> $MAKEFILE
2685     test ! "x$THISHOST" = x && echo " -echo \"#define THISHOST '$THISHOST'\" >> \$@" >> $MAKEFILE
2686    
2687 edhill 1.141 if test "x$EMBED_SRC" = xt ; then
2688     cat >>$MAKEFILE <<EOF
2689    
2690     decode_files.o : EMBEDDED_FILES.h
2691    
2692 jmc 1.176 ## \$(F77_PP_SRC_FILES)
2693     all_fF.tar.gz : \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(F77_PP_SRC_FILES) Makefile
2694 edhill 1.141 @echo Creating \$@ ...
2695 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
2696 edhill 1.141 -rm -f all_fF.tar.gz
2697     -gzip all_fF.tar
2698    
2699     EMBEDDED_FILES.h : all_fF.tar.gz
2700     @echo Creating \$@ ...
2701     -\${ROOTDIR}/tools/embed_encode/encode_files EMBEDDED_FILES.h all_fF.tar.gz
2702    
2703     EOF
2704     fi
2705    
2706 edhill 1.97 cat >>$MAKEFILE <<EOF
2707    
2708 edhill 1.76 # The normal chain of rules is ( .F - .$FS - .o )
2709    
2710 edhill 1.101 ## This nullifies any default implicit rules concerning these two file types:
2711 jmc 1.177 ## %.o : %.F
2712 edhill 1.76
2713     .F.$FS:
2714 edhill 1.1 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2715 edhill 1.76 .$FS.o:
2716 edhill 1.1 \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
2717 jmc 1.176 .F90.$FS90:
2718     \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2719     .FF90.f$FS90:
2720     \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2721     .$FS90.o:
2722 cnh 1.3 \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
2723 jmc 1.176 .f$FS90.o:
2724     cp \$< \$(basename \$<).f90
2725     \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$(F90FIXEDFORMAT) \$(basename \$<).f90
2726 edhill 1.1 .c.o:
2727 ce107 1.139 \$(CC) \$(CFLAGS) \$(DEFINES) \$(INCLUDES) -c \$<
2728 dfer 1.172 .flow.flowdir:
2729 heimbach 1.171 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2730 edhill 1.1
2731 edhill 1.76 # Special exceptions that use the ( .F - .p - .$FS - .o ) rule-chain
2732     .F.p:
2733 edhill 1.1 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2734 edhill 1.76 .p.$FS:
2735 edhill 1.1 \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
2736 edhill 1.14
2737 jmc 1.176 EOF
2738    
2739 edhill 1.14 #=========================================
2740     #=== Automatic Differentiation Rules ===
2741 jmc 1.176 #=== for TAMC/TAF ======================
2742    
2743 jmc 1.186 if test "x$OPENAD" = x ; then
2744 jmc 1.176
2745     cat >>$MAKEFILE <<EOF
2746 edhill 1.14
2747     TAMC = ${TAMC}
2748     TAF = ${TAF}
2749    
2750 edhill 1.17 TAF_EXTRA = ${TAF_EXTRA}
2751     TAMC_EXTRA = ${TAMC_EXTRA}
2752    
2753 edhill 1.14 EOF
2754    
2755     ad_vars="AD_TAMC_FLAGS AD_TAF_FLAGS"
2756     ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF_FLAGS"
2757     ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
2758     for i in $ad_vars ; do
2759     name=$i
2760 edhill 1.151 t1="t2=\$"`echo "$i"`
2761 edhill 1.14 eval $t1
2762     printf "%-20s = " $name >> $MAKEFILE
2763 edhill 1.151 echo "$t2" | sed -e 's| \+| |g' >> $MAKEFILE
2764 edhill 1.14 done
2765    
2766     echo " Add the source list for AD code generation"
2767     echo >> $MAKEFILE
2768 edhill 1.71 printf "AD_FILES = " >> $MAKEFILE
2769 jmc 1.176 AD_FILES=`cat adSrcFiles.tmp`
2770 edhill 1.14 for i in $AD_FILES ; do
2771     echo " \\" >> $MAKEFILE
2772 edhill 1.71 printf " $i" >> $MAKEFILE
2773 edhill 1.14 done
2774     echo >> $MAKEFILE
2775 jmc 1.176 rm -f adSrcFiles.tmp
2776 edhill 1.14
2777     cat >>$MAKEFILE <<EOF
2778    
2779 edhill 1.16 # ... AD ...
2780 jmc 1.152 adall: \$(EXE_AD)
2781 edhill 1.121 adtaf: ad_taf_output.$FS
2782     adtamc: ad_tamc_output.$FS
2783 edhill 1.21
2784 jmc 1.189 ad_input_code.$FS: \$(AD_FILES) \$(H_SRC_FILES) \$(AD_FLOW_FILES)
2785 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
2786 edhill 1.23 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
2787 adcroft 1.44 -rm -f ad_config.template
2788 jmc 1.176 @make \$(F77_PP_SRC_FILES)
2789 heimbach 1.171 @make \$(FLOFILES)
2790     cat \$(FLOFILES) \$(AD_FILES) > ad_input_code.$FS
2791 edhill 1.22
2792 edhill 1.121 ad_taf_output.$FS: ad_input_code.$FS
2793     \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2794 jmc 1.173 ls -l ad_input_code_ad.$FS
2795 edhill 1.121 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2796 heimbach 1.37
2797     adtafonly:
2798 edhill 1.121 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2799 jmc 1.173 ls -l ad_input_code_ad.$FS
2800 edhill 1.121 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2801 edhill 1.14
2802 jmc 1.152 \${EXE_AD}: ad_taf_output.o \$(OBJFILES)
2803     \$(LINK) -o \${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
2804 edhill 1.14
2805 edhill 1.121 ad_tamc_output.$FS: ad_input_code.$FS
2806     \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.$FS
2807     cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.$FS
2808 edhill 1.14
2809     ad_tamc: ad_tamc_output.o \$(OBJFILES)
2810 edhill 1.21 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
2811 edhill 1.14
2812 heimbach 1.105 adonlyfwd:
2813 edhill 1.106 patch < \$(TOOLSDIR)/ad_taf_output.f.onlyfwd.diff
2814 heimbach 1.105
2815     adtrick:
2816 edhill 1.106 patch < \$(TOOLSDIR)/ad_taf_output.f.adtrick.diff
2817 edhill 1.14
2818 edhill 1.19 # ... FTL ...
2819 edhill 1.23 ftlall: ftl_taf
2820 edhill 1.121 ftltaf: ftl_taf_output.$FS
2821     ftltamc: ftl_tamc_output.$FS
2822 edhill 1.21
2823 jmc 1.176 ftl_input_code.$FS: \$(AD_FILES) \$(H_SRC_FILES)
2824 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
2825 edhill 1.23 cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
2826 adcroft 1.44 -rm -f ftl_config.template
2827 jmc 1.176 @make \$(F77_PP_SRC_FILES)
2828 edhill 1.22 @make \$(AD_FLOW_FILES)
2829 edhill 1.121 cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.$FS
2830 edhill 1.22
2831 edhill 1.121 ftl_taf_output.$FS: ftl_input_code.$FS
2832     \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
2833 jmc 1.173 ls -l ftl_input_code_ftl.$FS
2834 edhill 1.121 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
2835 edhill 1.14
2836 heimbach 1.40 ftltafonly:
2837 edhill 1.121 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
2838 jmc 1.173 ls -l ftl_input_code_ftl.$FS
2839 edhill 1.121 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
2840 heimbach 1.40
2841 edhill 1.19 ftl_taf: ftl_taf_output.o \$(OBJFILES)
2842 edhill 1.21 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
2843 edhill 1.14
2844 edhill 1.121 ftl_tamc_output.$FS: ftl_input_code.$FS
2845     \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.$FS
2846     cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.$FS
2847 edhill 1.16
2848 edhill 1.19 ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
2849 edhill 1.21 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
2850 edhill 1.16
2851    
2852     # ... SVD ...
2853 edhill 1.121 svdtaf: ad_taf_output.$FS ftl_taf_output.$FS
2854 heimbach 1.109 @echo "--->>> Only ran TAF to generate SVD code! <<<---"
2855     @echo "--->>> Do make svdall afterwards to compile. <<<---"
2856     svdall: svd_touch svd_taf
2857 edhill 1.16
2858 heimbach 1.109 svd_taf: \$(OBJFILES)
2859 heimbach 1.40 \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
2860 edhill 1.14
2861 heimbach 1.109 @echo "--->>> Only COMPILE svd code! <<<---"
2862     @echo "--->>> Assumes you previously <<<---"
2863     @echo "--->>> did make svdtaf <<<---"
2864    
2865     svd_touch:
2866     @echo "--->>> Only COMPILE svd code! <<<---"
2867     @echo "--->>> Assumes you previously <<<---"
2868     @echo "--->>> did make svdtaf <<<---"
2869 edhill 1.121 touch ad_taf_output.$FS ftl_taf_output.$FS
2870     \$(FC) \$(FFLAGS) \$(FOPTIM) -c ad_taf_output.$FS
2871     \$(FC) \$(FFLAGS) \$(FOPTIM) -c ftl_taf_output.$FS
2872 heimbach 1.109 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -UALLOW_ADJOINT_RUN -DALLOW_TANGENTLINEAR_RUN -UALLOW_ECCO_OPTIMIZATION > ftl_config.template
2873     cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
2874     -rm -f ftl_config.template
2875 edhill 1.14
2876 jmc 1.176 EOF
2877    
2878     fi
2879    
2880     #=== for OpenAD ========================
2881    
2882     if test "x$OPENAD" != x ; then
2883    
2884     # ============ begin OpenAD specific section ==============
2885    
2886     cat >>$MAKEFILE <<EOF
2887    
2888     # all the source files linked from the various locations:
2889     ALL_LINKED_FILES= \
2890     \$(F77_SRC_FILES) \
2891     \$(C_SRC_FILES) \
2892     \$(H_SRC_FILES) \
2893     \$(F90_SRC_FILES) \
2894     \$(SPECIAL_FILES)
2895    
2896     ifndef OPENADROOT
2897     \$(error "Error: environment variable OPENADROOT not defined!")
2898     endif
2899    
2900     ifndef XAIFSCHEMAROOT
2901     \$(error "Error: environment variable XAIFSCHEMAROOT not defined!")
2902     endif
2903    
2904     ifndef XAIFBOOSTERROOT
2905     \$(error "Error: environment variable XAIFBOOSTERROOT not defined!")
2906     endif
2907    
2908     EOF
2909    
2910     echo " Add the source list for common block to module conversion "
2911     echo >> $MAKEFILE
2912     printf "CB2M_F90_SRC_NAMES = " >> $MAKEFILE
2913     for i in `cat ${OAD_CB2M_FILES}` ; do
2914     echo " \\" >> $MAKEFILE
2915     printf " $i" >> $MAKEFILE
2916     done
2917     echo >> $MAKEFILE
2918    
2919     echo " Add the source list for AD code generation"
2920     echo >> $MAKEFILE
2921     printf "AD_FILES = " >> $MAKEFILE
2922     for i in `cat ${OAD_CB2M_FILES}` ; do
2923     echo " \\" >> $MAKEFILE
2924     printf " ${i}_mod.f$FS90" >> $MAKEFILE
2925     done
2926     AD_FILES=`cat adSrcFiles.tmp`
2927     for i in $AD_FILES ; do
2928     basename=${i%%.f}
2929     toBeIgnored=`egrep ^$basename'[ ]*' ${OAD_DONT_COMPILE} ${OAD_DONT_TRANSFORM}`
2930     if test -z "$toBeIgnored" ; then
2931     echo " \\" >> $MAKEFILE
2932     printf " $i" >> $MAKEFILE
2933     fi
2934     done
2935     echo >> $MAKEFILE
2936     rm -f adSrcFiles.tmp
2937    
2938     cat >>$MAKEFILE <<EOF
2939    
2940     adAll: \$(EXE_AD)
2941     .PHONY: adAll
2942    
2943     CB2M_F90_PP_SRC_FILES=\$(addsuffix _mod.f$FS90, \$(CB2M_F90_SRC_NAMES))
2944    
2945     .PRECIOUS: \$(CB2M_F90_PP_SRC_FILES) \$(NON_AD_F77_SRC_FILES:.F=_cb2m.f$FS90)
2946    
2947     .PHONY: adDepend
2948     adDepend: \$(ALL_LINKED_FILES) \$(addsuffix _mod.h, \$(CB2M_F90_SRC_NAMES)) \$(addsuffix _mod.FF90, \$(CB2M_F90_SRC_NAMES)) \$(F77_SRC_FILES:.F=_cb2m.FF90)
2949     \$(MAKEDEPEND) -o .$FS \$(DEFINES) \$(INCLUDES) \$(F77_SRC_FILES)
2950     \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
2951     -rm -f makedepend.out
2952    
2953     OPENAD_SUPPORT_F90_SRC_FILES = \
2954     w2f__types.F90 \
2955     OAD_active.F90 \
2956     OAD_cp.F90 \
2957     OAD_rev.F90 \
2958     OAD_tape.F90
2959    
2960     OPENAD_SUPPORT_C_SRC_FILES = \
2961     iaddr.c \
2962     timeRatio.c
2963    
2964     f95_test_mods.f90: \$(OPENAD_SUPPORT_F90_SRC_FILES:F90=$FS90)
2965     cat \$^ > \$@
2966    
2967 utke 1.178 f95_test.f90: all_mods.xb.x2w.w2f.pp.f$FS90 \$(NON_AD_F77_SRC_FILES:.F=_cb2m.f$FS90) ad_input_code.w2f.pre.xb.x2w.w2f.td.pp.f$FS90
2968 jmc 1.176 cat \$^ > \$@
2969    
2970     f95_test.out: f95_test_mods.f90 f95_test.f90
2971     f95 -fixed -w=unused -maxcontin=132 -c f95_test_mods.f90 > \$@ 2>&1
2972