/[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.207 - (hide annotations) (download)
Wed May 26 00:08:18 2010 UTC (8 years, 11 months ago) by jmc
Branch: MAIN
Changes since 1.206: +6 -3 lines
add "make clean_old" before making files from templates (eesupp, exch2 & regrid)

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