/[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.206 - (hide annotations) (download)
Sun May 23 18:34:43 2010 UTC (9 years, 5 months ago) by jmc
Branch: MAIN
Changes since 1.205: +124 -113 lines
fix checking for mnc & profiles pkg (if one pkg depends on them)

1 edhill 1.86 #! /usr/bin/env bash
2 edhill 1.1 #
3 jmc 1.206 # $Header: /u/gcmpack/MITgcm/tools/genmake2,v 1.205 2010/05/23 03:45:58 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 jmc 1.206 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 edhill 1.76 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 jmc 1.206 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 edhill 1.76 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 jmc 1.206 # Some "makedepend" implementations will die if they cannot
198     # find a Makefile -- so this file is here to gives them an
199 edhill 1.119 # 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 jmc 1.206
216 edhill 1.85 # 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 jmc 1.206 for ic in $clist ; do
273 edhill 1.141 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 jmc 1.206
308 edhill 1.84 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 jmc 1.206
446 edhill 1.11 # # 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 jmc 1.206 # case $i in
465 edhill 1.11 # -*)
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 jmc 1.206 made to find an appropriate "standard" optfile in the
516 edhill 1.41 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 jmc 1.206 Use "NAME" for the MAKE program. The default is "make" but
532 edhill 1.41 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 jmc 1.206 By default, genamke will try to find the location by
546 edhill 1.41 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 jmc 1.206 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 edhill 1.41 name found elsewhere.
554    
555     -disable NAME | --disable NAME
556     -disable=NAME | --disable=NAME
557 jmc 1.206 Here "NAME" specifies a list of packages that we don't
558     want to use. If this violates package dependencies,
559 edhill 1.41 genamke will exit with an error message.
560    
561     -enable NAME | --enable NAME
562     -enable=NAME | --enable=NAME
563 jmc 1.206 Here "NAME" specifies a list of packages that we wish
564     to specifically enable. If this violates package
565 edhill 1.41 dependencies, genamke will exit with an error message.
566    
567     -standarddirs NAME | --standarddirs NAME
568     -standarddirs=NAME | --standarddirs=NAME
569 jmc 1.206 Here, "NAME" specifies a list of directories to be
570 edhill 1.41 used as the "standard" code.
571    
572     -fortran NAME | --fortran NAME | -fc NAME | --fc NAME
573     -fc=NAME | --fc=NAME
574 jmc 1.206 Use "NAME" as the fortran compiler. By default, genmake
575 edhill 1.41 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 jmc 1.206 Use "NAME" as the C compiler. By default, genmake
580 edhill 1.91 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 jmc 1.206 Do or don't use IEEE numerics. Note that this option
585     *only* works if it is supported by the OPTFILE that
586 edhill 1.41 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 jmc 1.206 not in any way hurt the model results -- it simply means
595     that the code that checks how long the model spends in
596 edhill 1.143 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 jmc 1.206 Embed a tarball containing the full source code
632     (including the Makefile, etc.) used to build the
633 edhill 1.141 executable [off by default]
634    
635 jmc 1.206 While it is most often a single word, the "NAME" variables specified
636 edhill 1.41 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 jmc 1.206
663 edhill 1.31 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 jmc 1.206
1198 edhill 1.2 ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
1199 jmc 1.206
1200 edhill 1.2 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 jmc 1.206
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 jmc 1.206 echo
1388 edhill 1.12 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 jmc 1.206 are working so please check paths or specify (with \$S64) a
1857 edhill 1.104 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 jmc 1.206 if test $ckM = 0 -a $ckE = 1 ; then
1878 jmc 1.205 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.206 # file has been added so that, for convenience, one can specify
1935 jmc 1.205 # 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.206 # Check for package MNC: if NetCDF is available, then build the MNC
2015 jmc 1.161 # template files ; otherwise, delete mnc from the list of packages.
2016 jmc 1.205 echo " $PACKAGES " | grep ' mnc ' > /dev/null 2>&1
2017 jmc 1.206 mnc_in=$?
2018     if test "x$HAVE_NETCDF" != xt ; then
2019     if test "x$mnc_in" = x0 ; then
2020 edhill 1.100 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 jmc 1.206 2) the LIBS variable (within the "optfile") specifies the correct
2028 edhill 1.100 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 jmc 1.206 # this prevent to add mnc (due to pdepend rules) if not available
2038     DISABLE="$DISABLE mnc"
2039     fi
2040     else
2041     # we have NetCDF, we try to build MNC template files
2042     ( cd $ROOTDIR"/pkg/mnc" && $MAKE testclean && $MAKE templates ) > make_mnc.errors 2>&1
2043     RETVAL=$?
2044     if test "x${RETVAL}" = x0 ; then
2045     rm -f make_mnc.errors
2046     else
2047     echo "Error: problem encountered while building source files in pkg/mnc:"
2048     cat make_mnc.errors 1>&2
2049     if test "x$mnc_in" = x0 ; then
2050     exit 1
2051 edhill 1.100 else
2052 jmc 1.206 DISABLE="$DISABLE mnc"
2053 edhill 1.100 fi
2054     fi
2055     fi
2056    
2057 jmc 1.161 # Check for package PROFILES: if NetCDF is not available,
2058     # then delete profiles from the list of available packages.
2059 jmc 1.206 if test "x$HAVE_NETCDF" != xt ; then
2060     echo " $PACKAGES " | grep ' profiles ' > /dev/null 2>&1
2061     RETVAL=$?
2062     if test "x$RETVAL" = x0 ; then
2063 jmc 1.161 cat <<EOF
2064    
2065     *********************************************************************
2066     WARNING: the "profiles" package was enabled but tests failed to
2067     compile NetCDF applications. Please check that:
2068    
2069     1) NetCDF is correctly installed for this compiler and
2070 jmc 1.206 2) the LIBS variable (within the "optfile") specifies the correct
2071 jmc 1.161 NetCDF library to link against.
2072    
2073     Due to this failure, the "profiles" package is now DISABLED.
2074     *********************************************************************
2075    
2076     EOF
2077     PACKAGES=`echo $PACKAGES | sed -e 's/profiles//g'`
2078     DISABLE="$DISABLE profiles"
2079 jmc 1.206 else
2080     # this prevent to add profiles (due to pdepend rules) if not available
2081     DISABLE="$DISABLE profiles"
2082 jmc 1.161 fi
2083     fi
2084    
2085 edhill 1.1 echo " applying package dependency rules"
2086     ck=
2087     while test "x$ck" != xtt ; do
2088     i=0
2089 edhill 1.2 # rtot=${#PNAME[@]}
2090     rtot=$nname
2091 jmc 1.162 while test $i -le $rtot ; do
2092 edhill 1.1
2093     # Is $pname in the current $PACKAGES list?
2094 edhill 1.2 # pname=${PNAME[$i]}
2095     tmp="pname=\"\$PNAME_$i\""
2096     eval $tmp
2097 edhill 1.1 pin="f"
2098     for p in $PACKAGES ; do
2099     if test "x$p" = "x$pname" ; then
2100     pin="t"
2101     fi
2102     done
2103 jmc 1.205 # or in the current $STANDARDDIRS list?
2104     for p in $STANDARDDIRS ; do
2105     if test "x$p" = "x$pname" ; then pin="t" ; fi
2106     done
2107 edhill 1.1
2108     # Is the DNAME entry a (+) or (-) rule ?
2109 edhill 1.2 tmp="dname=\"\$DNAME_$i\""
2110     eval $tmp
2111 edhill 1.1 plus="-"
2112 edhill 1.2 echo $dname | grep '^+' > /dev/null 2>&1
2113 edhill 1.1 RETVAL=$?
2114     if test "x$RETVAL" = x0 ; then
2115     plus="+"
2116     fi
2117    
2118     # Is $dname in the current $PACKAGES list?
2119 edhill 1.2 dname=`echo $dname | sed -e 's/^[+-]//'`
2120 edhill 1.1 din="f"
2121     for p in $PACKAGES ; do
2122     if test "x$p" = "x$dname" ; then
2123     din="t"
2124     fi
2125     done
2126    
2127     # Do we need to add $dname according to the dependency rules?
2128     if test "x$pin" = xt -a "x$plus" = "x+" -a "x$din" = xf ; then
2129 jmc 1.162 #echo " " $pname ": need to add :" $dname
2130 edhill 1.1 in_dis="f"
2131     for dis in $DISABLE ; do
2132     if test "x$dis" = "x$dname" ; then
2133     in_dis="t"
2134     fi
2135     done
2136     if test "x$in_dis" = xt ; then
2137     echo "Error: can't satisfy package dependencies:"
2138     echo " \"$dname\" is required by the dependency rules"
2139     echo " but is disallowed by the DISABLE settings"
2140     exit 1
2141     else
2142     PACKAGES="$PACKAGES $dname"
2143     ck=
2144     fi
2145     fi
2146    
2147     # Do we need to get rid of $dname according to the dependency rules?
2148     if test "x$pin" = xt -a "x$plus" = "x-" -a "x$din" = xt; then
2149     echo "Error: can't satisfy package dependencies:"
2150 jmc 1.206 echo " \"$pname\" was requested but is disallowed by"
2151 edhill 1.1 echo " the dependency rules for \"$dname\""
2152     exit 1
2153     fi
2154 edhill 1.87 i=`echo "$i + 1" | bc -l`
2155     #i=$(( $i + 1 ))
2156 edhill 1.1 done
2157     ck=$ck"t"
2158     done
2159 jmc 1.205 echo " packages are: $PACKAGES"
2160 edhill 1.1 for i in $PACKAGES ; do
2161     adr="$ROOTDIR/pkg/$i"
2162     if test -d $adr ; then
2163     SOURCEDIRS="$SOURCEDIRS $adr"
2164     INCLUDEDIRS="$INCLUDEDIRS $adr"
2165 edhill 1.14 if test "x$i" = xautodiff ; then
2166     AUTODIFF_PKG_USED=t
2167     fi
2168 edhill 1.1 else
2169     echo "Error: the directory \"$adr\" for package $i doesn't exist"
2170     exit 1
2171     fi
2172     done
2173    
2174 edhill 1.12 # Create a list of #define and #undef to enable/disable packages
2175     PACKAGES_DOT_H=PACKAGES_CONFIG.h
2176 jmc 1.206 # The following UGLY HACK sets multiple "#undef"s and it needs to go
2177     # away. On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h
2178 edhill 1.1 # file would eventually be split up so that all package-related #define
2179     # statements could be separated and handled only by genmake.
2180     names=`ls -1 "$ROOTDIR/pkg"`
2181     all_pack=
2182 adcroft 1.44 DISABLED_PACKAGES=
2183 edhill 1.1 for n in $names ; do
2184     if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
2185     has_pack="f"
2186     for pack in $PACKAGES ; do
2187     if test "x$pack" = "x$n" ; then
2188     has_pack="t"
2189     break
2190     fi
2191     done
2192     if test "x$has_pack" = xf ; then
2193 edhill 1.116 undef=`echo "ALLOW_$n" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2194 adcroft 1.44 DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
2195 edhill 1.1 fi
2196     fi
2197     done
2198 adcroft 1.44 ENABLED_PACKAGES=
2199 edhill 1.1 for i in $PACKAGES ; do
2200 edhill 1.116 def=`echo "ALLOW_$i" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2201 adcroft 1.44 ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
2202 edhill 1.12 #eh3 DEFINES="$DEFINES -D$def"
2203 edhill 1.1
2204     #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
2205 jmc 1.206 case $i in
2206 edhill 1.1 aim_v23)
2207 adcroft 1.46 ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
2208 jmc 1.55 echo "Warning: ALLOW_AIM is set to enable aim_v23."
2209 edhill 1.1 ;;
2210     esac
2211     #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
2212    
2213     done
2214    
2215 jmc 1.205 echo " Adding STANDARDDIRS='$STANDARDDIRS'"
2216 edhill 1.1 BUILDDIR=${BUILDDIR:-.}
2217 edhill 1.57 if test "x$STANDARDDIRS" != x ; then
2218     for d in $STANDARDDIRS ; do
2219     adr="$ROOTDIR/$d/src"
2220     if test ! -d $adr ; then
2221     echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2222     echo " is correct and that you correctly specified the STANDARDDIRS option"
2223     exit 1
2224     else
2225     SOURCEDIRS="$SOURCEDIRS $adr"
2226     fi
2227     adr="$ROOTDIR/$d/inc"
2228     if test ! -d $adr ; then
2229     echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2230     echo " is correct and that you correctly specified the STANDARDDIRS option"
2231     exit 1
2232     else
2233     INCLUDEDIRS="$INCLUDEDIRS $adr"
2234     fi
2235     done
2236     fi
2237 edhill 1.1
2238 adcroft 1.52 echo " Searching for *OPTIONS.h files in order to warn about the presence"
2239     echo " of \"#define \"-type statements that are no longer allowed:"
2240 edhill 1.12 CPP_OPTIONS=
2241 adcroft 1.52 CPP_EEOPTIONS=
2242 edhill 1.12 spaths=". $INCLUDEDIRS"
2243 adcroft 1.52 names=`ls -1 "$ROOTDIR/pkg"`
2244 edhill 1.12 for i in $spaths ; do
2245     try="$i/CPP_OPTIONS.h"
2246 edhill 1.54 if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
2247 edhill 1.12 echo " found CPP_OPTIONS=\"$try\""
2248     CPP_OPTIONS="$try"
2249 adcroft 1.52 # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
2250     for n in $names ; do
2251     test_for_package_in_cpp_options $CPP_OPTIONS $n
2252     done
2253     fi
2254     try="$i/CPP_EEOPTIONS.h"
2255 edhill 1.54 if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
2256 adcroft 1.52 echo " found CPP_EEOPTIONS=\"$try\""
2257     # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
2258     #**** not yet enabled ****
2259     # test_for_mpi_in_cpp_eeoptions $try
2260     #**** not yet enabled ****
2261     CPP_EEOPTIONS="$try"
2262 edhill 1.12 fi
2263     done
2264     if test "x$CPP_OPTIONS" = x ; then
2265     echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
2266     exit 1
2267     fi
2268 edhill 1.1
2269 edhill 1.14 # Here, we build the list of files to be "run through" the adjoint
2270     # compiler.
2271 jmc 1.176 if test -f ./adSrcFiles.tmp ; then
2272     rm -f ./adSrcFiles.tmp
2273 edhill 1.14 fi
2274     echo " Creating the list of files for the adjoint compiler."
2275     for i in $SOURCEDIRS ; do
2276     list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
2277     for j in $list_files ; do
2278 jmc 1.176 cat $i/$j >> adSrcFiles.tmp
2279 edhill 1.14 done
2280     done
2281 edhill 1.121 if test ! "x"$FS = "x.f" ; then
2282 jmc 1.176 cat adSrcFiles.tmp | sed -e "s/\.f/.$FS/g" > adSrcFiles.tmp_f
2283     mv -f adSrcFiles.tmp_f adSrcFiles.tmp
2284 edhill 1.121 fi
2285 edhill 1.14
2286 edhill 1.2 echo
2287     echo "=== Creating the Makefile ==="
2288 edhill 1.1 echo " setting INCLUDES"
2289     for i in $INCLUDEDIRS ; do
2290 edhill 1.87 if test ! -d $i ; then
2291 edhill 1.1 echo "Warning: can't find INCLUDEDIRS=\"$i\""
2292     fi
2293     done
2294    
2295 ce107 1.139 if test ! "x$DIVA" = x ; then
2296 ce107 1.140 echo " Creating the pseudo-MPI include directory"
2297 ce107 1.139 INCLUDES="-I./mpi_headers $INCLUDES"
2298     rm -rf ./mpi_headers
2299     mkdir -p ./mpi_headers
2300    
2301     if test "x$MPIINCLUDEDIR" = x ; then
2302     if test "x$MPIHOME" = x ; then
2303     MPIHOME='/usr'
2304     fi
2305     MPIINCLUDEDIR='$MPIHOME/include'
2306     fi
2307 jmc 1.206
2308 ce107 1.139 if test -r $MPIINCLUDEDIR/mpif.h ; then
2309     for i in $MPI_HEADER_FILES; do
2310     cp -p $MPIINCLUDEDIR/$i ./mpi_headers
2311     done
2312    
2313     perl -i -pe 's/MPI_DISPLACEMENT_CURRENT=-1_8/MPI_DISPLACEMENT_CURRENT=-1/g' mpi_headers/mpif.h
2314     else
2315     echo " We cannot create a copy of mpif.h!"
2316 heimbach 1.156 # exit -1
2317 ce107 1.139 fi
2318     fi
2319    
2320 edhill 1.1 echo " Determining the list of source and include files"
2321     rm -rf .links.tmp
2322     mkdir .links.tmp
2323 edhill 1.142 touch .links.tmp/foo
2324     if test ! -r ".links.tmp/foo" ; then
2325     echo
2326     echo "ERROR : something is wrong with your directory permissions or"
2327     echo " your user file-creation mask (\"umask\") since creating a"
2328     echo " sub-dir, touch-ing a file within it, and then reading it is"
2329     echo " not working. Please try setting your umask to something"
2330     echo " sane such as:"
2331     echo
2332     echo " umask 0002"
2333     echo
2334     echo " and please verify that you have the proper permissions for"
2335     echo " creating sub-directories and then reading files created"
2336     echo " within them."
2337     echo
2338     exit 1
2339     fi
2340     rm -f .links.tmp/foo
2341 jmc 1.176
2342 jmc 1.206 if test "x$OPENAD" != x ; then
2343 jmc 1.176 OAD_DONT_COMPILE="/dev/null"
2344     OAD_DONT_TRANSFORM="/dev/null"
2345     OAD_KEEP_ORIGINAL="/dev/null"
2346     OAD_CB2M_FILES="/dev/null"
2347     echo " looking for dontCompile file: "
2348     for i in "." $MODS ; do
2349     if test -r $i"/dontCompile" ; then
2350     OAD_DONT_COMPILE=$i"/dontCompile"
2351     echo " found $OAD_DONT_COMPILE"
2352     break
2353     fi
2354     done
2355     echo " looking for dontTransform file: "
2356     for i in "." $MODS ; do
2357     if test -r $i"/dontTransform" ; then
2358     OAD_DONT_TRANSFORM=$i"/dontTransform"
2359     echo " found $OAD_DONT_TRANSFORM"
2360     break
2361     fi
2362     done
2363     echo " looking for keepOriginal file: "
2364     for i in "." $MODS ; do
2365     if test -r $i"/keepOriginal" ; then
2366     OAD_KEEP_ORIGINAL=$i"/keepOriginal"
2367     echo " found $OAD_KEEP_ORIGINAL"
2368     break
2369     fi
2370     done
2371     echo " looking for cb2mFiles: "
2372     for i in "." $MODS ; do
2373     if test -r $i"/cb2mFiles" ; then
2374     OAD_CB2M_FILES=$i"/cb2mFiles"
2375     echo " found $OAD_CB2M_FILES"
2376     break
2377     fi
2378     done
2379     echo " OpenAD exceptions: "
2380     fi
2381    
2382 edhill 1.1 echo "# This section creates symbolic links" > srclinks.tmp
2383     echo "" >> srclinks.tmp
2384 jmc 1.176 printf 'F77_SRC_FILES = ' > F77srclist.tmp
2385     printf 'NON_AD_F77_SRC_FILES = ' > nonADF77srclist.tmp
2386     printf 'C_SRC_FILES = ' > csrclist.tmp
2387     printf 'F90_SRC_FILES = ' > F90srclist.tmp
2388     printf 'H_SRC_FILES = ' > hsrclist.tmp
2389     printf 'AD_FLOW_FILES = ' > ad_flow_files.tmp
2390 adcroft 1.9 alldirs="$SOURCEDIRS $INCLUDEDIRS ."
2391 edhill 1.1 for d in $alldirs ; do
2392     deplist=
2393 edhill 1.14 sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
2394 cnh 1.3 sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
2395 jmc 1.206 if test "x$OPENAD" != x ; then
2396 jmc 1.176 sfiles=`( echo $sfiles | grep -v _cb2m\. )`
2397     fi
2398 edhill 1.1 for sf in $sfiles ; do
2399     if test ! -r ".links.tmp/$sf" ; then
2400     if test -f "$d/$sf" ; then
2401 edhill 1.131 ignore_f=f
2402 adcroft 1.44 case $d/$sf in
2403     ./$PACKAGES_DOT_H)
2404 edhill 1.141 ignore_f=t
2405 adcroft 1.44 ;;
2406     ./AD_CONFIG.h)
2407 edhill 1.141 ignore_f=t
2408 adcroft 1.44 ;;
2409     ./FC_NAMEMANGLE.h)
2410 edhill 1.141 ignore_f=t
2411 adcroft 1.44 ;;
2412 edhill 1.98 ./BUILD_INFO.h)
2413 edhill 1.141 ignore_f=t
2414     ;;
2415     ./EMBEDDED_FILES.h)
2416     ignore_f=t
2417 edhill 1.98 ;;
2418 adcroft 1.44 *)
2419 edhill 1.131 # For the local directory *ONLY*,
2420     # ignore all soft-links
2421     if test "x$HAVE_TEST_L" = xt -a "x$d" = x. -a -L $sf ; then
2422     ignore_f=t
2423     else
2424     touch .links.tmp/$sf
2425     deplist="$deplist $sf"
2426     fi
2427 adcroft 1.44 ;;
2428     esac
2429 edhill 1.131 if test "x$ignore_f" = xf ; then
2430     extn=`echo $sf | $AWK -F. '{print $NF}'`
2431     case $extn in
2432 jmc 1.176 F)
2433     echo " \\" >> F77srclist.tmp
2434     printf " $sf" >> F77srclist.tmp
2435 jmc 1.206 if test "x$OPENAD" != x ; then
2436 jmc 1.176 basename=${sf%%.F}
2437     isAD=`egrep ^$basename.f'[ ]*' adSrcFiles.tmp`
2438 jmc 1.206 if test -z "$isAD" ; then
2439 jmc 1.176 toBeIgnored=`egrep ^$basename'[ ]*' ${OAD_DONT_COMPILE}`
2440 jmc 1.206 if test -z "$toBeIgnored" ; then
2441 jmc 1.176 echo " \\" >> nonADF77srclist.tmp
2442     printf " $sf" >> nonADF77srclist.tmp
2443 jmc 1.206 else
2444 jmc 1.176 echo " not to be compiled : $sf"
2445     fi
2446 jmc 1.206 else # file is initially listed as an AD file we want to exclude it
2447 jmc 1.176 # or we want to retain the untransformed version
2448     notToBeTransformed=`egrep ^$basename'[ ]*' ${OAD_DONT_TRANSFORM}`
2449     untransformedVersionToBeKept=`egrep ^$basename'[ ]*' ${OAD_KEEP_ORIGINAL}`
2450 jmc 1.206 if test -n "$notToBeTransformed"; then
2451 jmc 1.176 echo " not to be transformed: $sf"
2452     fi
2453     if test -n "$untransformedVersionToBeKept" ; then
2454     echo " original to be kept : $sf"
2455 jmc 1.206 fi
2456 jmc 1.176 if test -n "$notToBeTransformed" -o -n "$untransformedVersionToBeKept" ; then
2457     echo " \\" >> nonADF77srclist.tmp
2458     printf " $sf" >> nonADF77srclist.tmp
2459     fi
2460     fi
2461     fi
2462     ;;
2463     F90)
2464     echo " \\" >> F90srclist.tmp
2465     printf " $sf" >> F90srclist.tmp
2466     ;;
2467     c)
2468     echo " \\" >> csrclist.tmp
2469     printf " $sf" >> csrclist.tmp
2470     ;;
2471     h)
2472     echo " \\" >> hsrclist.tmp
2473     printf " $sf" >> hsrclist.tmp
2474     ;;
2475     flow)
2476     echo " \\" >> ad_flow_files.tmp
2477     printf " $sf" >> ad_flow_files.tmp
2478     ;;
2479     esac
2480     fi
2481 edhill 1.1 fi
2482     fi
2483     done
2484     if test "x$deplist" != x ; then
2485 jmc 1.176 if test "$d" != "." ; then
2486     echo "" >> srclinks.tmp
2487 edhill 1.2 echo "# These files are linked from $d" >> srclinks.tmp
2488 edhill 1.1 echo "$deplist :" >> srclinks.tmp
2489 jahn 1.170 # We need to make sure that the link isn't already there.
2490     # This may happen when make thinks that a header file has to be "remade"
2491     # because a module it depends on has changed. In this case we do nothing.
2492     printf "\tif [ ! -L \$@ ]; then \$(LN) %s/\$@ \$@; fi\n" $d >> srclinks.tmp
2493 jmc 1.176 fi
2494 edhill 1.1 fi
2495     done
2496     rm -rf .links.tmp
2497 jmc 1.176 echo "" >> F77srclist.tmp
2498     echo "" >> nonADF77srclist.tmp
2499     echo "" >> csrclist.tmp
2500     echo "" >> F90srclist.tmp
2501     echo "" >> hsrclist.tmp
2502     echo "" >> ad_flow_files.tmp
2503 edhill 1.1
2504 jmc 1.192 CMDLINE=$0
2505     for xx in "$@" ; do nw=`echo $xx | wc -w`
2506     if test $nw = '1' ; then CMDLINE="$CMDLINE $xx"
2507     else CMDLINE="$CMDLINE '$xx'" ; fi
2508     done
2509    
2510 edhill 1.88 if test -f $MAKEFILE ; then
2511 jmc 1.205 mv -f $MAKEFILE "$MAKEFILE.old"
2512 edhill 1.1 fi
2513     echo " Writing makefile: $MAKEFILE"
2514     echo "# Multithreaded + multi-processing makefile for:" > $MAKEFILE
2515     echo "# $MACHINE" >> $MAKEFILE
2516     echo "# This makefile was generated automatically on" >> $MAKEFILE
2517     echo "# $THISDATE" >> $MAKEFILE
2518     echo "# by the command:" >> $MAKEFILE
2519 jmc 1.192 echo "# $CMDLINE" >> $MAKEFILE
2520 edhill 1.1 echo "# executed by:" >> $MAKEFILE
2521 edhill 1.97 echo "# ${THISUSER}@${THISHOST}:${THISCWD}" >> $MAKEFILE
2522 edhill 1.21
2523     EXE_AD=$EXECUTABLE"_ad"
2524     EXE_FTL=$EXECUTABLE"_ftl"
2525     EXE_SVD=$EXECUTABLE"_svd"
2526    
2527 edhill 1.1 cat >>$MAKEFILE <<EOF
2528 edhill 1.53 #
2529     # OPTFILE="$OPTFILE"
2530 jmc 1.205 #
2531 edhill 1.1 # BUILDDIR : Directory where object files are written
2532     # SOURCEDIRS : Directories containing the source (.F) files
2533     # INCLUDEDIRS : Directories containing the header-source (.h) files
2534     # EXEDIR : Directory where executable that is generated is written
2535     # EXECUTABLE : Full path of executable binary
2536     #
2537     # CPP : C-preprocessor command
2538     # INCLUDES : Directories searched for header files
2539     # DEFINES : Macro definitions for CPP
2540     # MAKEDEPEND : Dependency generator
2541     # KPP : Special preprocessor command (specific to platform)
2542     # KFLAGS : Flags for KPP
2543     # FC : Fortran compiler command
2544     # FFLAGS : Configuration/debugging options for FC
2545     # FOPTIM : Optimization options for FC
2546     # LINK : Command for link editor program
2547     # LIBS : Library flags /or/ additional optimization/debugging flags
2548    
2549     ROOTDIR = ${ROOTDIR}
2550 jmc 1.205 BUILDDIR = ${BUILDDIR}
2551 edhill 1.1 SOURCEDIRS = ${SOURCEDIRS}
2552     INCLUDEDIRS = ${INCLUDEDIRS}
2553     EXEDIR = ${EXEDIR}
2554     EXECUTABLE = \$(EXEDIR)/${EXECUTABLE}
2555     TOOLSDIR = ${TOOLSDIR}
2556    
2557 edhill 1.14 #eh3 new defines for the adjoint work
2558     AUTODIFF = ${ROOTDIR}/pkg/autodiff
2559 edhill 1.21 EXE_AD = ${EXE_AD}
2560     EXE_FTL = ${EXE_FTL}
2561     EXE_SVD = ${EXE_SVD}
2562 edhill 1.14
2563 adcroft 1.44 ENABLED_PACKAGES = ${ENABLED_PACKAGES}
2564     DISABLED_PACKAGES = ${DISABLED_PACKAGES}
2565    
2566 adcroft 1.52 # These files are created by Makefile
2567 edhill 1.97 SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h BUILD_INFO.h
2568 edhill 1.141 EOF
2569 adcroft 1.52
2570 edhill 1.141 if test "x$EMBED_SRC" = xt ; then
2571     echo "EMBEDDED_FILES = EMBEDDED_FILES.h" >>$MAKEFILE
2572     else
2573     echo "EMBEDDED_FILES = " >>$MAKEFILE
2574     fi
2575 edhill 1.1
2576     cat >>$MAKEFILE <<EOF
2577     # Unix ln (link)
2578     LN = ${LN}
2579     # C preprocessor
2580     CPP = cat \$< | ${S64} | ${CPP}
2581     # Dependency generator
2582     MAKEDEPEND = ${MAKEDEPEND}
2583     # Special preprocessor (KAP on DECs, FPP on Crays)
2584     KPP = ${KPP}
2585     # Fortran compiler
2586 edhill 1.94 FC = ${FC}
2587 cnh 1.3 # Fortran compiler
2588     F90C = ${F90C}
2589 edhill 1.92 # C compiler
2590     CC = ${CC}
2591 edhill 1.1 # Link editor
2592 edhill 1.70 LINK = ${LINK} ${LDADD}
2593 edhill 1.1
2594     # Defines for CPP
2595     DEFINES = ${DEFINES}
2596     # Includes for CPP
2597     INCLUDES = ${INCLUDES}
2598     # Flags for KPP
2599     KFLAGS1 = ${KFLAGS1}
2600     KFLAGS2 = ${KFLAGS2}
2601     # Optim./debug for FC
2602 mlosch 1.165 FFLAGS = ${FFLAGS} ${FEXTRAFLAGS}
2603 edhill 1.1 FOPTIM = ${FOPTIM}
2604 cnh 1.3 # Optim./debug for FC
2605     F90FLAGS = ${F90FLAGS}
2606     F90OPTIM = ${F90OPTIM}
2607 jmc 1.176 F90FIXEDFORMAT = ${F90FIXEDFORMAT}
2608 edhill 1.1 # Flags for CC
2609     CFLAGS = ${CFLAGS}
2610     # Files that should not be optimized
2611     NOOPTFILES = ${NOOPTFILES}
2612     NOOPTFLAGS = ${NOOPTFLAGS}
2613     # Flags and libraries needed for linking
2614 edhill 1.107 LIBS = ${LIBS}
2615 cnh 1.3 # Name of the Mekfile
2616     MAKEFILE=${MAKEFILE}
2617 edhill 1.1
2618     EOF
2619    
2620 jmc 1.176 cat F77srclist.tmp >> $MAKEFILE
2621     cat nonADF77srclist.tmp >> $MAKEFILE
2622     cat csrclist.tmp >> $MAKEFILE
2623     cat F90srclist.tmp >> $MAKEFILE
2624     cat hsrclist.tmp >> $MAKEFILE
2625     cat ad_flow_files.tmp >> $MAKEFILE
2626    
2627     rm -f F77srclist.tmp nonADF77srclist.tmp csrclist.tmp F90srclist.tmp hsrclist.tmp ad_flow_files.tmp
2628    
2629 edhill 1.75 echo >> $MAKEFILE
2630 jmc 1.176
2631 jmc 1.205 # add definitions for preprocessed sources
2632     # and note that not all systems allow case sensitive extensions
2633     # hence the $FS and $FS90 here.
2634     # for fixed format f90 files we use ff90 or FF90 resp
2635 jmc 1.176 # but these are not expected to be the original source files
2636    
2637     echo 'F77_PP_SRC_FILES = $(F77_SRC_FILES:.F=.'$FS')' >> $MAKEFILE
2638     echo 'F90_PP_SRC_FILES = $(F90_SRC_FILES:.F90=.'$FS90')' >> $MAKEFILE
2639     echo 'OBJFILES= $(F77_SRC_FILES:.F=.o) $(C_SRC_FILES:.c=.o) $(F90_SRC_FILES:.F90=.o)' >> $MAKEFILE
2640 dfer 1.172 echo 'FLOFILES = $(AD_FLOW_FILES:.flow=.flowdir)' >> $MAKEFILE
2641 edhill 1.75 echo >> $MAKEFILE
2642     echo '.SUFFIXES:' >> $MAKEFILE
2643 jmc 1.176 echo '.SUFFIXES: .o .'$FS' .p .F .c .f'$FS90' .'$FS90' .FF90 .F90 .flowdir .flow' >> $MAKEFILE
2644 edhill 1.1
2645     cat >>$MAKEFILE <<EOF
2646    
2647     all: \$(EXECUTABLE)
2648 jmc 1.176 \$(EXECUTABLE): \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(OBJFILES) \$(EMBEDDED_FILES)
2649 adcroft 1.44 @echo Creating \$@ ...
2650 edhill 1.1 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
2651     depend:
2652     @make links
2653 jmc 1.176 \$(MAKEDEPEND) -o .$FS \$(DEFINES) \$(INCLUDES) \$(F77_SRC_FILES)
2654 adcroft 1.44 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
2655 edhill 1.72 -rm -f makedepend.out
2656 edhill 1.1
2657 cnh 1.132 lib: libmitgcmuv.a
2658    
2659     libmitgcmuv.a: \$(OBJFILES)
2660     ar rcv libmitgcmuv.a \$(OBJFILES)
2661 cnh 1.159 ar d libmitgcmuv.a main.o
2662 cnh 1.132
2663 jmc 1.176 links: \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(SPECIAL_FILES)
2664 edhill 1.1
2665 jmc 1.176 small_f: \$(F77_PP_SRC_FILES) \$(F90_PP_SRC_FILES)
2666 edhill 1.1
2667     output.txt: \$(EXECUTABLE)
2668     @printf 'running ... '
2669     @\$(EXECUTABLE) > \$@
2670    
2671     clean:
2672 heimbach 1.157 -rm -rf *.p *.$FS90 *.mod ${RMFILES} work.{pc,pcl} *.template
2673     -rm -rf *.o
2674 dfer 1.172 -rm -rf *.$FS *.flowdir
2675 utke 1.193 -rm -rf *.f$FS90 \$(AD_CLEAN) ad_input*
2676 edhill 1.1 Clean:
2677     @make clean
2678     @make cleanlinks
2679 adcroft 1.52 -rm -f \$(SPECIAL_FILES)
2680 jmc 1.204 -rm -f genmake_state genmake_*optfile genmake_warnings genmake_errors
2681 jmc 1.205 -rm -f make.log run.log f90mkdepend.log *.bak "$MAKEFILE.old"
2682 jmc 1.166 -rm -f taf_command taf_output taf_ad.log taf_ad_flow.log
2683 edhill 1.1 CLEAN:
2684     @make Clean
2685     -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
2686     -find \$(EXEDIR) -name "*.data" -exec rm {} \;
2687     -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
2688 jmc 1.152 -rm -f \$(EXECUTABLE) \$(EXE_AD) *.txt STD* *diagnostics.log datetime
2689 jmc 1.166 -rm -f *_MIT_CE_000.opt0000 costfunction*0000
2690 edhill 1.144 -rm -rf mnc_test_*
2691 edhill 1.1
2692 edhill 1.18 #eh3 Makefile: makefile
2693 edhill 1.1 makefile:
2694 edhill 1.73 $THIS_SCRIPT $G2ARGS
2695 edhill 1.1 cleanlinks:
2696     -find . -type l -exec rm {} \;
2697    
2698 jmc 1.176 # Special targets (SPECIAL_FILES) which are created by make
2699 adcroft 1.44 ${PACKAGES_DOT_H}:
2700     @echo Creating \$@ ...
2701 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) > \$@
2702 adcroft 1.44 AD_CONFIG.h:
2703     @echo Creating \$@ ...
2704 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 > \$@
2705 adcroft 1.52 FC_NAMEMANGLE.h:
2706     @echo Creating \$@ ...
2707     echo "$FC_NAMEMANGLE" > \$@
2708 adcroft 1.44
2709 edhill 1.97 BUILD_INFO.h:
2710     @echo Creating \$@ ...
2711     EOF
2712    
2713     test ! "x$THISVER" = x && echo " -echo \"#define THISVER '$THISVER'\" > \$@" >> $MAKEFILE
2714     test ! "x$THISUSER" = x && echo " -echo \"#define THISUSER '$THISUSER'\" >> \$@" >> $MAKEFILE
2715     test ! "x$THISDATE" = x && echo " -echo \"#define THISDATE '$THISDATE'\" >> \$@" >> $MAKEFILE
2716     test ! "x$THISHOST" = x && echo " -echo \"#define THISHOST '$THISHOST'\" >> \$@" >> $MAKEFILE
2717    
2718 edhill 1.141 if test "x$EMBED_SRC" = xt ; then
2719     cat >>$MAKEFILE <<EOF
2720    
2721     decode_files.o : EMBEDDED_FILES.h
2722    
2723 jmc 1.205 ## \$(F77_PP_SRC_FILES)
2724 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
2725 edhill 1.141 @echo Creating \$@ ...
2726 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
2727 edhill 1.141 -rm -f all_fF.tar.gz
2728     -gzip all_fF.tar
2729    
2730     EMBEDDED_FILES.h : all_fF.tar.gz
2731     @echo Creating \$@ ...
2732     -\${ROOTDIR}/tools/embed_encode/encode_files EMBEDDED_FILES.h all_fF.tar.gz
2733    
2734     EOF
2735     fi
2736    
2737 edhill 1.97 cat >>$MAKEFILE <<EOF
2738    
2739 edhill 1.76 # The normal chain of rules is ( .F - .$FS - .o )
2740    
2741 edhill 1.101 ## This nullifies any default implicit rules concerning these two file types:
2742 jmc 1.177 ## %.o : %.F
2743 edhill 1.76
2744     .F.$FS:
2745 edhill 1.1 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2746 edhill 1.76 .$FS.o:
2747 edhill 1.1 \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
2748 jmc 1.176 .F90.$FS90:
2749     \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2750     .FF90.f$FS90:
2751     \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2752     .$FS90.o:
2753 cnh 1.3 \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
2754 jmc 1.176 .f$FS90.o:
2755     cp \$< \$(basename \$<).f90
2756     \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$(F90FIXEDFORMAT) \$(basename \$<).f90
2757 edhill 1.1 .c.o:
2758 ce107 1.139 \$(CC) \$(CFLAGS) \$(DEFINES) \$(INCLUDES) -c \$<
2759 dfer 1.172 .flow.flowdir:
2760 heimbach 1.171 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2761 edhill 1.1
2762 edhill 1.76 # Special exceptions that use the ( .F - .p - .$FS - .o ) rule-chain
2763     .F.p:
2764 edhill 1.1 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2765 edhill 1.76 .p.$FS:
2766 edhill 1.1 \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
2767 edhill 1.14
2768 jmc 1.176 EOF
2769    
2770 edhill 1.14 #=========================================
2771     #=== Automatic Differentiation Rules ===
2772 jmc 1.176 #=== for TAMC/TAF ======================
2773    
2774 jmc 1.206 if test "x$OPENAD" = x ; then
2775 jmc 1.176
2776     cat >>$MAKEFILE <<EOF
2777 edhill 1.14
2778     TAMC = ${TAMC}
2779     TAF = ${TAF}
2780    
2781 edhill 1.17 TAF_EXTRA = ${TAF_EXTRA}
2782     TAMC_EXTRA = ${TAMC_EXTRA}
2783    
2784 edhill 1.14 EOF
2785    
2786     ad_vars="AD_TAMC_FLAGS AD_TAF_FLAGS"
2787     ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF_FLAGS"
2788     ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
2789     for i in $ad_vars ; do
2790     name=$i
2791 edhill 1.151 t1="t2=\$"`echo "$i"`
2792 edhill 1.14 eval $t1
2793     printf "%-20s = " $name >> $MAKEFILE
2794 edhill 1.151 echo "$t2" | sed -e 's| \+| |g' >> $MAKEFILE
2795 edhill 1.14 done
2796    
2797     echo " Add the source list for AD code generation"
2798     echo >> $MAKEFILE
2799 edhill 1.71 printf "AD_FILES = " >> $MAKEFILE
2800 jmc 1.176 AD_FILES=`cat adSrcFiles.tmp`
2801 edhill 1.14 for i in $AD_FILES ; do
2802     echo " \\" >> $MAKEFILE
2803 edhill 1.71 printf " $i" >> $MAKEFILE
2804 edhill 1.14 done
2805     echo >> $MAKEFILE
2806 jmc 1.176 rm -f adSrcFiles.tmp
2807 edhill 1.14
2808     cat >>$MAKEFILE <<EOF
2809    
2810 edhill 1.16 # ... AD ...
2811 jmc 1.152 adall: \$(EXE_AD)
2812 edhill 1.121 adtaf: ad_taf_output.$FS
2813     adtamc: ad_tamc_output.$FS
2814 edhill 1.21
2815 jmc 1.189 ad_input_code.$FS: \$(AD_FILES) \$(H_SRC_FILES) \$(AD_FLOW_FILES)
2816 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
2817 edhill 1.23 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
2818 adcroft 1.44 -rm -f ad_config.template
2819 jmc 1.176 @make \$(F77_PP_SRC_FILES)
2820 heimbach 1.171 @make \$(FLOFILES)
2821 mlosch 1.198 cat \$(FLOFILES) \$(AD_FILES) | sed -f \$(TOOLSDIR)/remove_comments_sed > ad_input_code.$FS
2822 edhill 1.22
2823 edhill 1.121 ad_taf_output.$FS: ad_input_code.$FS
2824     \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2825 jmc 1.173 ls -l ad_input_code_ad.$FS
2826 edhill 1.121 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2827 heimbach 1.37
2828     adtafonly:
2829 edhill 1.121 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2830 jmc 1.173 ls -l ad_input_code_ad.$FS
2831 edhill 1.121 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2832 edhill 1.14
2833 jmc 1.152 \${EXE_AD}: ad_taf_output.o \$(OBJFILES)
2834 jmc 1.206 \$(LINK) -o \${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
2835 edhill 1.14
2836 edhill 1.121 ad_tamc_output.$FS: ad_input_code.$FS
2837     \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.$FS
2838     cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.$FS
2839 edhill 1.14
2840     ad_tamc: ad_tamc_output.o \$(OBJFILES)
2841 jmc 1.206 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
2842 edhill 1.14
2843 heimbach 1.105 adonlyfwd:
2844 edhill 1.106 patch < \$(TOOLSDIR)/ad_taf_output.f.onlyfwd.diff
2845 jmc 1.206
2846 heimbach 1.105 adtrick:
2847 edhill 1.106 patch < \$(TOOLSDIR)/ad_taf_output.f.adtrick.diff
2848 edhill 1.14
2849 edhill 1.19 # ... FTL ...
2850 edhill 1.23 ftlall: ftl_taf
2851 edhill 1.121 ftltaf: ftl_taf_output.$FS
2852     ftltamc: ftl_tamc_output.$FS
2853 edhill 1.21
2854 jmc 1.176 ftl_input_code.$FS: \$(AD_FILES) \$(H_SRC_FILES)
2855 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
2856 edhill 1.23 cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
2857 adcroft 1.44 -rm -f ftl_config.template
2858 jmc 1.176 @make \$(F77_PP_SRC_FILES)
2859 edhill 1.22 @make \$(AD_FLOW_FILES)
2860 edhill 1.121 cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.$FS
2861 edhill 1.22
2862 edhill 1.121 ftl_taf_output.$FS: ftl_input_code.$FS
2863     \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
2864 jmc 1.173 ls -l ftl_input_code_ftl.$FS
2865 edhill 1.121 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
2866 edhill 1.14
2867 heimbach 1.40 ftltafonly:
2868 edhill 1.121 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
2869 jmc 1.173 ls -l ftl_input_code_ftl.$FS
2870 edhill 1.121 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
2871 heimbach 1.40
2872 edhill 1.19 ftl_taf: ftl_taf_output.o \$(OBJFILES)
2873 jmc 1.206 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
2874 edhill 1.14
2875 edhill 1.121 ftl_tamc_output.$FS: ftl_input_code.$FS
2876     \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.$FS
2877     cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.$FS
2878 edhill 1.16
2879 edhill 1.19 ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
2880 jmc 1.206 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
2881 edhill 1.16
2882    
2883     # ... SVD ...
2884 edhill 1.121 svdtaf: ad_taf_output.$FS ftl_taf_output.$FS
2885 heimbach 1.109 @echo "--->>> Only ran TAF to generate SVD code! <<<---"
2886     @echo "--->>> Do make svdall afterwards to compile. <<<---"
2887     svdall: svd_touch svd_taf
2888 edhill 1.16
2889 heimbach 1.109 svd_taf: \$(OBJFILES)
2890 heimbach 1.40 \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
2891 edhill 1.14
2892 heimbach 1.109 @echo "--->>> Only COMPILE svd code! <<<---"
2893     @echo "--->>> Assumes you previously <<<---"
2894     @echo "--->>> did make svdtaf <<<---"
2895    
2896     svd_touch:
2897     @echo "--->>> Only COMPILE svd code! <<<---"
2898     @echo "--->>> Assumes you previously <<<---"
2899     @echo "--->>> did make svdtaf <<<---"
2900 edhill 1.121 touch ad_taf_output.$FS ftl_taf_output.$FS
2901     \$(FC) \$(FFLAGS) \$(FOPTIM) -c ad_taf_output.$FS
2902     \$(FC) \$(FFLAGS) \$(FOPTIM) -c ftl_taf_output.$FS
2903 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
2904     cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
2905     -rm -f ftl_config.template
2906 edhill 1.14
2907 jmc 1.176 EOF
2908    
2909 jmc 1.206 fi
2910 jmc 1.176
2911     #=== for OpenAD ========================
2912    
2913 jmc 1.206 if test "x$OPENAD" != x ; then
2914 jmc 1.176
2915     # ============ begin OpenAD specific section ==============
2916    
2917     cat >>$MAKEFILE <<EOF
2918    
2919 jmc 1.206 # all the source files linked from the various locations:
2920 jmc 1.176 ALL_LINKED_FILES= \
2921     \$(F77_SRC_FILES) \
2922     \$(C_SRC_FILES) \
2923     \$(H_SRC_FILES) \
2924     \$(F90_SRC_FILES) \
2925     \$(SPECIAL_FILES)
2926    
2927     ifndef OPENADROOT
2928     \$(error "Error: environment variable OPENADROOT not defined!")
2929     endif
2930    
2931     ifndef XAIFSCHEMAROOT
2932