/[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.164 - (hide annotations) (download)
Tue Jul 31 22:27:01 2007 UTC (11 years, 9 months ago) by ce107
Branch: MAIN
CVS Tags: checkpoint59g, checkpoint59f, checkpoint59h
Changes since 1.163: +4 -1 lines
Fixed for proper setup of the showflops timing package

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

  ViewVC Help
Powered by ViewVC 1.1.22