/[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.150 - (hide annotations) (download)
Mon May 22 22:11:11 2006 UTC (17 years, 10 months ago) by edhill
Branch: MAIN
CVS Tags: checkpoint58h_post, checkpoint58f_post, checkpoint58g_post
Changes since 1.149: +5 -2 lines
make it easier to remove signal registration using HAVE_SIGREG=f within
  optfiles

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

  ViewVC Help
Powered by ViewVC 1.1.22