/[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.175 - (hide annotations) (download)
Thu Nov 6 11:56:20 2008 UTC (10 years, 10 months ago) by cnh
Branch: MAIN
Changes since 1.174: +67 -400 lines
Restoring previous genmake2 since Jean's new one
appears to fail in _all_ adjoint test.
Works OK in forward though!

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

  ViewVC Help
Powered by ViewVC 1.1.22