/[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.129 - (hide annotations) (download)
Mon Sep 5 14:56:47 2005 UTC (18 years, 6 months ago) by edhill
Branch: MAIN
CVS Tags: checkpoint57r_post
Changes since 1.128: +3 -3 lines
 o another Fortran syntax fix

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

  ViewVC Help
Powered by ViewVC 1.1.22