/[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.205 - (hide annotations) (download)
Sun May 23 03:45:58 2010 UTC (9 years, 3 months ago) by jmc
Branch: MAIN
Changes since 1.204: +44 -34 lines
- move previous Makefile to Makefile.old
- extend pkg_depend rules to model & eesupp
- fix checking for mnc & profiles pkg (if 1rst of last in the list)

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