/[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.149 - (hide annotations) (download)
Thu May 11 20:28:50 2006 UTC (17 years, 10 months ago) by edhill
Branch: MAIN
CVS Tags: checkpoint58e_post
Changes since 1.148: +4 -4 lines
Use CPP more consistently -- *always* read CPP input from a pipe
  (stdin) and never from an actual file.  This makes it easier to use
  "gcc -E -traditional -P -" as our CPP implementation.

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

  ViewVC Help
Powered by ViewVC 1.1.22