/[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.166 - (hide annotations) (download)
Mon Oct 29 20:47:42 2007 UTC (16 years, 4 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint59j
Changes since 1.165: +3 -1 lines
add some taf temporary files to the Makefile "Clean" command.

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

  ViewVC Help
Powered by ViewVC 1.1.22