/[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.158 - (hide annotations) (download)
Thu Nov 23 05:23:05 2006 UTC (17 years, 3 months ago) by heimbach
Branch: MAIN
Changes since 1.157: +3 -3 lines
Adding icc to C compiler search, adding ifort, g95 to F compiler search.

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

  ViewVC Help
Powered by ViewVC 1.1.22