/[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.160 - (hide annotations) (download)
Wed Jan 31 21:28:10 2007 UTC (12 years, 7 months ago) by ce107
Branch: MAIN
CVS Tags: checkpoint58v_post
Changes since 1.159: +23 -2 lines
Added support for the --devel flag & more support for NetCDF libraries with a
separate Fortran library component.

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

  ViewVC Help
Powered by ViewVC 1.1.22