/[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.71 - (hide annotations) (download)
Wed Mar 10 23:34:04 2004 UTC (15 years, 6 months ago) by edhill
Branch: MAIN
CVS Tags: checkpoint52l_pre, checkpoint52l_post
Changes since 1.70: +46 -33 lines
 o fixes for baroque-n CRAY systems
   - replace all "echo -n" commands with the more portable "printf"
   - add a "-bash /path/to/shell" option so that a Bourne- or
     BASH-compatible shell can be explicitly specified within
     the Makefile

1 edhill 1.49 #! /usr/bin/env bash
2 edhill 1.1 #
3 edhill 1.71 # $Header: /u/u3/gcmpack/MITgcm/tools/genmake2,v 1.70 2004/02/28 05:01:12 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     else
71     echo "Warning: can't read package groups definition file: $PKG_GROUPS"
72     fi
73     }
74 edhill 1.1
75     # Guess possible config options for this host
76     find_possible_configs() {
77    
78 edhill 1.11 tmp1=`uname`"_"`uname -m`
79     tmp2=`echo $tmp1 | sed -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
80 edhill 1.25 tmp3=`echo $tmp2 | sed -e 's/power macintosh/ppc/'`
81 edhill 1.56 tmp1=`echo $tmp3 | sed -e 's|x86_64|amd64|'`
82     tmp2=`echo $tmp1 | sed -e 's/i[3-6]86/ia32/' | sed -e 's/athlon/ia32/'`
83     PLATFORM=$tmp2
84 edhill 1.11 OFLIST=`(cd $ROOTDIR/tools/build_options; ls | grep "^$PLATFORM")`
85     echo " The platform appears to be: $PLATFORM"
86    
87 edhill 1.1 echo "test" > test
88     ln -s ./test link
89     RETVAL=$?
90     if test "x${RETVAL}" = x0 ; then
91 edhill 1.11 LN="ln -s"
92     else
93     echo "Error: \"ln -s\" does not appear to work on this system!"
94     echo " For help, please contact <MITgcm-support@mitgcm.org>."
95     exit 1
96 edhill 1.1 fi
97     rm -f test link
98    
99 edhill 1.11 if test "x$CPP" = x ; then
100     CPP="cpp -traditional -P"
101 adcroft 1.33 fi
102    
103 edhill 1.69 # The "original" makedepend is part of the Imake system that is
104     # most often distributed with XFree86 or with an XFree86 source
105     # package. As a result, many machines (eg. generic Linux) do not
106     # have a system-default "makedepend" available. For those
107     # systems, we have two fall-back options:
108     #
109     # 1) a makedepend implementation shipped with the cyrus-imapd
110     # package: ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/
111     #
112     # 2) a known-buggy xmakedpend shell script
113     #
114     # So the choices are, in order:
115     #
116     # 1) use the user-specified program
117     # 2) use a system-wide default
118     # 3) locally build and use the cyrus implementation
119     # 4) fall back to the buggy local xmakedpend script
120     #
121 adcroft 1.33 if test "x${MAKEDEPEND}" = x ; then
122     which makedepend >& /dev/null
123     RETVAL=$?
124 edhill 1.69 if test ! "x${RETVAL}" = x0 ; then
125     echo " a system-default makedepend was not found."
126    
127     # Try to build the cyrus impl
128     rm -f ./genmake_cy_md
129     (
130     cd $ROOTDIR/tools/cyrus-imapd-makedepend \
131     && ./configure > /dev/null 2>&1 \
132     && make > /dev/null 2>&1 \
133     && ./makedepend ifparser.c > /dev/null 2>&1 \
134     && echo "true"
135     ) > ./genmake_cy_md
136     grep true ./genmake_cy_md > /dev/null 2>&1
137     RETVAL=$?
138     if test "x$RETVAL" = x0 ; then
139     MAKEDEPEND='$(TOOLSDIR)/cyrus-imapd-makedepend/makedepend'
140     else
141     MAKEDEPEND='$(TOOLSDIR)/xmakedepend'
142     fi
143     rm -f ./genmake_cy_md
144 adcroft 1.33 fi
145 edhill 1.1 fi
146    
147     # look for possible fortran compilers
148 cnh 1.24 tmp="$MITGCM_FC $FC efc g77 f77 pgf77 pgf95 ifc f90 f95 mpif77 mpf77 mpxlf95"
149 edhill 1.1 p_FC=
150 edhill 1.11 for c in $tmp ; do
151     rm -f ./hello.f ./hello
152     cat >> hello.f <<EOF
153     program hello
154     do i=1,3
155     print *, 'hello world : ', i
156     enddo
157     end
158     EOF
159     $c -o hello hello.f > /dev/null 2>&1
160 edhill 1.1 RETVAL=$?
161     if test "x${RETVAL}" = x0 ; then
162     p_FC="$p_FC $c"
163     fi
164     done
165 edhill 1.21 rm -f ./hello.f ./hello
166 edhill 1.1 if test "x${p_FC}" = x ; then
167 edhill 1.11 cat 1>&2 <<EOF
168    
169     Error: No Fortran compilers were found in your path. Please specify one using:
170    
171     1) an "optfile" on (eg. "-optfile=path/to/OPTFILE"),
172     2) a command-line option (eg. "-fc NAME"), or
173     3) the MITGCM_FC environment variable.
174    
175     EOF
176     exit 1
177 edhill 1.1 else
178 edhill 1.11 echo " The possible FORTRAN compilers found in your path are:"
179     echo " "$p_FC
180     if test "x$FC" = x ; then
181 edhill 1.15 FC=`echo $p_FC | $AWK '{print $1}'`
182 adcroft 1.67 echo " Setting FORTRAN compiler to: "$FC
183 edhill 1.11 fi
184 edhill 1.1 fi
185    
186 adcroft 1.67 if test "x$OPTFILE" = x ; then
187     OPTFILE=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$FC
188     if test ! -r $OPTFILE ; then
189     echo " I looked for the file "$OPTFILE" but did not find it"
190     fi
191     fi
192     # echo " The options file: $p_OF"
193     # echo " appears to match so we'll use it."
194     # for i in $p_FC ; do
195     #p_OF=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$i
196     #if test -r $p_OF ; then
197     # OPTFILE=$p_OF
198     # echo " The options file: $p_OF"
199     # echo " appears to match so we'll use it."
200     # break
201     #fi
202     # done
203 edhill 1.11 if test "x$OPTFILE" = x ; then
204     cat 1>&2 <<EOF
205    
206     Error: No options file was found in: $ROOTDIR/tools/build_options/
207     that matches this platform ("$PLATFORM") and the compilers found in
208     your path. Please specify an "optfile" using:
209    
210     1) the command line (eg. "-optfile=path/to/OPTFILE"), or
211     2) the MITGCM_OF environment variable.
212    
213     If you need help, please contact the developers at <MITgcm-support@mitgcm.org>.
214    
215 edhill 1.1 EOF
216 edhill 1.11 exit 1
217 edhill 1.1 fi
218 edhill 1.11
219     # # look for possible MPI libraries
220     # mpi_libs=
221     # mpi_fort=`which mpif77 2>/dev/null`
222     # RETVAL=$?
223     # if test "x${RETVAL}" = x0 ; then
224     # cat >>test.f <<EOF
225     # PROGRAM HELLO
226     # DO 10, I=1,10
227     # PRINT *,'Hello World'
228     # 10 CONTINUE
229     # STOP
230     # END
231     # EOF
232     # eval "$mpi_fort -showme test.f > out"
233     # RETVAL=$?
234     # if test "x${RETVAL}" = x0 ; then
235     # a=`cat out`
236     # for i in $a ; do
237     # case $i in
238     # -*)
239     # mpi_libs="$mpi_libs $i" ;;
240     # esac
241     # done
242     # echo "The MPI libs appear to be:"
243     # echo " "$mpi_libs
244     # fi
245     # rm -f test.f out
246     # fi
247 edhill 1.1
248     }
249    
250     # Parse the package dependency information
251     get_pdepend_list() {
252    
253     # strip the comments and then convert the dependency file into
254     # two arrays: PNAME, DNAME
255     cat $1 | sed -e 's/#.*$//g' \
256 edhill 1.15 | $AWK 'BEGIN{nn=0;} (NF>0){ for(i=2;i<=NF;i++){nn++; print "PNAME["nn"]="$1"\nDNAME["nn"]="$i} }' \
257 edhill 1.1 > ./.pd_tmp
258 edhill 1.34 . ./.pd_tmp
259 edhill 1.1 rm -f ./.pd_tmp
260    
261 edhill 1.71 printf "PNAME = "${}
262 edhill 1.1 }
263    
264    
265     # Explain usage
266     usage() {
267 edhill 1.41 cat <<EOF
268    
269     Usage: "$0" [OPTIONS]
270     where [OPTIONS] can be:
271    
272     -help | --help | -h | --h
273     Print this help message and exit.
274    
275     -nooptfile | --nooptfile
276     -optfile NAME | --optfile NAME | -of NAME | --of NAME
277     -optfile=NAME | --optfile=NAME | -of=NAME | --of=NAME
278     Use "NAME" as the optfile. By default, an attempt will be
279     made to find an appropriate "standard" optfile in the
280     tools/build_options/ directory.
281    
282     -pdepend NAME | --pdepend NAME
283     -pdepend=NAME | --pdepend=NAME
284     Get package dependency information from "NAME".
285    
286     -pdefault NAME | --pdefault NAME
287     -pdefault=NAME | --pdefault=NAME
288     Get the default package list from "NAME".
289    
290     -make NAME | -m NAME
291     --make=NAME | -m=NAME
292     Use "NAME" for the MAKE program. The default is "make" but
293     many platforms, "gmake" is the preferred choice.
294    
295     -makefile NAME | -mf NAME
296     --makefile=NAME | -mf=NAME
297     Call the makefile "NAME". The default is "Makefile".
298    
299 edhill 1.69 -makedepend NAME | -md NAME
300     --makedepend=NAME | -md=NAME
301     Use "NAME" for the MAKEDEPEND program.
302    
303 edhill 1.41 -rootdir NAME | --rootdir NAME | -rd NAME | --rd NAME
304     -rootdir=NAME | --rootdir=NAME | -rd=NAME | --rd=NAME
305     Specify the location of the MITgcm ROOTDIR as "NAME".
306     By default, genamke will try to find the location by
307     looking in parent directories (up to the 5th parent).
308    
309     -mods NAME | --mods NAME | -mo NAME | --mo NAME
310     -mods=NAME | --mods=NAME | -mo=NAME | --mo=NAME
311     Here, "NAME" specifies a list of directories that are
312     used for additional source code. Files found in the
313     "mods list" are given preference over files of the same
314     name found elsewhere.
315    
316     -disable NAME | --disable NAME
317     -disable=NAME | --disable=NAME
318     Here "NAME" specifies a list of packages that we don't
319     want to use. If this violates package dependencies,
320     genamke will exit with an error message.
321    
322     -enable NAME | --enable NAME
323     -enable=NAME | --enable=NAME
324     Here "NAME" specifies a list of packages that we wish
325     to specifically enable. If this violates package
326     dependencies, genamke will exit with an error message.
327    
328     -standarddirs NAME | --standarddirs NAME
329     -standarddirs=NAME | --standarddirs=NAME
330     Here, "NAME" specifies a list of directories to be
331     used as the "standard" code.
332    
333     -fortran NAME | --fortran NAME | -fc NAME | --fc NAME
334     -fc=NAME | --fc=NAME
335     Use "NAME" as the fortran compiler. By default, genmake
336     will search for a working compiler by trying a list of
337     "usual suspects" such as g77, f77, etc.
338    
339     -[no]ieee | --[no]ieee
340     Do or don't use IEEE numerics. Note that this option
341     *only* works if it is supported by the OPTFILE that
342     is being used.
343    
344 adcroft 1.67 -mpi | --mpi
345     Include MPI header files and link to MPI libraries
346     -mpi=PATH | --mpi=PATH
347     Include MPI header files and link to MPI libraries using MPI_ROOT
348     set to PATH. i.e. Include files from $PATH/include, link to libraries
349     from $PATH/lib and use binaries from $PATH/bin.
350    
351 edhill 1.71 -bash NAME
352     Explicitly specify the Bourne or BASH shell to use
353    
354 edhill 1.41 While it is most often a single word, the "NAME" variables specified
355     above can in many cases be a space-delimited string such as:
356    
357     --enable pkg1 --enable 'pkg1 pkg2' --enable 'pkg1 pkg2 pkg3'
358     -mods=dir1 -mods='dir1' -mods='dir1 dir2 dir3'
359     -foptim='-Mvect=cachesize:512000,transform -xtypemap=real:64,double:64,integer:32'
360    
361     which, depending upon your shell, may need to be single-quoted.
362    
363     For more detailed genmake documentation, please see:
364    
365     http://mitgcm.org/devel_HOWTO/
366    
367     EOF
368    
369 edhill 1.1 exit 1
370     }
371    
372 edhill 1.31 # Build a CPP macro to automate calling C routines from FORTRAN
373     get_fortran_c_namemangling() {
374     default_nm="#define FC_NAMEMANGLE(X) X ## _"
375    
376     cat > genmake_test.c <<EOF
377     void tcall( char * string ) { tsub( string ); }
378     EOF
379 edhill 1.39 $MAKE genmake_test.o >> genmake_warnings 2>&1
380 edhill 1.31 RETVAL=$?
381     if test "x$RETVAL" != x0 ; then
382     FC_NAMEMANGLE=$default_nm
383 edhill 1.39 cat <<EOF>> genmake_errors
384    
385     WARNING: C test compile fails
386     WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
387     WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here
388     EOF
389 edhill 1.31 return 1
390     fi
391 edhill 1.43 c_tcall=`nm genmake_test.o | grep 'T ' | grep tcall | cut -d ' ' -f 3`
392 edhill 1.31 RETVAL=$?
393     if test "x$RETVAL" != x0 ; then
394     FC_NAMEMANGLE=$default_nm
395 edhill 1.39 cat <<EOF>> genmake_warnings
396    
397     WARNING: The "nm" command failed.
398     WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
399     WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here
400     EOF
401 edhill 1.31 return 1
402     fi
403     cat > genmake_tcomp.f <<EOF
404     subroutine tcall( string )
405     character*(*) string
406     call tsub( string )
407     end
408     EOF
409 edhill 1.39 $FC $FFLAGS $DEFINES -c genmake_tcomp.f >> genmake_warnings 2>&1
410 edhill 1.31 RETVAL=$?
411     if test "x$RETVAL" != x0 ; then
412     FC_NAMEMANGLE=$default_nm
413 edhill 1.39 cat <<EOF>> genmake_warnings
414    
415     WARNING: FORTRAN test compile fails -- please see "genmake_errors"
416     WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
417     WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here.
418     EOF
419 edhill 1.31 return 1
420     fi
421 edhill 1.43 f_tcall=`nm genmake_tcomp.o | grep 'T ' | grep tcall | cut -d ' ' -f 3`
422 edhill 1.31 RETVAL=$?
423     if test "x$RETVAL" != x0 ; then
424     FC_NAMEMANGLE=$default_nm
425 edhill 1.39 cat <<EOF>> genmake_warnings
426    
427     WARNING: The "nm" command failed.
428     WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
429     WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here.
430     EOF
431 edhill 1.31 return 1
432     fi
433    
434     c_a=`echo $c_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 1 | sed -e 's|Y||'`
435     f_a=`echo $f_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 1 | sed -e 's|Y||'`
436     c_b=`echo $c_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 2 | sed -e 's|Y||'`
437     f_b=`echo $f_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 2 | sed -e 's|Y||'`
438    
439     nmangle="X"
440     if test "x$c_a" != "x$f_a" ; then
441     comm="echo x$f_a | sed -e 's|x$c_a||'"
442     a=`eval $comm`
443     nmangle="$a ## $nmangle"
444     fi
445     if test "x$c_b" != "x$f_b" ; then
446     comm="echo x$f_b | sed -e 's|x$c_b||'"
447     b=`eval $comm`
448     nmangle="$nmangle ## $b"
449     fi
450    
451     FC_NAMEMANGLE="#define FC_NAMEMANGLE(X) $nmangle"
452 edhill 1.32
453     # cleanup the testing files
454     rm -f genmake_tcomp.* genmake_test.*
455 edhill 1.31 }
456 edhill 1.1
457 edhill 1.39
458     check_HAVE_CLOC() {
459     get_fortran_c_namemangling
460     cat <<EOF > genmake_tc_1.c
461     $FC_NAMEMANGLE
462     #include <stdio.h>
463     #include <stdlib.h>
464     #include <unistd.h>
465     #include <assert.h>
466     #include <sys/time.h>
467     void FC_NAMEMANGLE(cloc) ( double *curtim )
468     {
469     struct timeval tv1;
470     gettimeofday(&tv1 , (void *)NULL );
471     *curtim = (double)((tv1.tv_usec)+(tv1.tv_sec)*1.E6);
472     *curtim = *curtim/1.E6;
473     }
474     EOF
475     make genmake_tc_1.o >> genmake_tc.log 2>&1
476     RET_C=$?
477     cat <<EOF > genmake_tc_2.f
478     program hello
479     Real*8 wtime
480     external cloc
481     call cloc(wtime)
482     print *," HELLO WORLD", wtime
483     end program hello
484     EOF
485     $FC $FFLAGS -o genmake_tc genmake_tc_2.f genmake_tc_1.o >> genmake_tc.log 2>&1
486     RET_F=$?
487     test -x ./genmake_tc && ./genmake_tc >> genmake_tc.log 2>&1
488     RETVAL=$?
489     if test "x$RETVAL" = x0 ; then
490     HAVE_CLOC=t
491     DEFINES="$DEFINES -DHAVE_CLOC"
492     fi
493     rm -f genmake_tc*
494     }
495    
496    
497 edhill 1.60 check_netcdf_libs() {
498     cat <<EOF > genmake_tnc.F
499     program fgennc
500     #include "netcdf.inc"
501     integer iret, ncid, xid
502     iret = nf_create('genmake_tnc.nc', NF_CLOBBER, ncid)
503     IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
504     iret = nf_def_dim(ncid, 'X', 11, xid)
505     IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
506     iret = nf_close(ncid)
507     IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
508     end
509     EOF
510     $CPP genmake_tnc.F > genmake_tnc.f \
511     && $FC $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.f $LIBS >> genmake_tnc.log 2>&1
512     RET_COMPILE=$?
513     test -x ./genmake_tnc && ./genmake_tnc >> genmake_tnc.log 2>&1
514     RETVAL=$?
515     if test "x$RET_COMPILE" = x0 -a "x$RETVAL" = x0 ; then
516     HAVE_NETCDF=t
517     else
518 edhill 1.66 # try again with "-lnetcdf" added to the libs
519     $CPP genmake_tnc.F > genmake_tnc.f \
520     && $FC $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.f \
521     $LIBS -lnetcdf >> genmake_tnc_2.log 2>&1
522     RET_COMPILE=$?
523     test -x ./genmake_tnc && ./genmake_tnc >> genmake_tnc.log 2>&1
524     RETVAL=$?
525     if test "x$RET_COMPILE" = x0 -a "x$RETVAL" = x0 ; then
526     LIBS="$LIBS -lnetcdf"
527     HAVE_NETCDF=t
528     else
529     cat genmake_tnc.log >> genmake_warnings
530     fi
531 edhill 1.60 fi
532     rm -f genmake_tnc*
533     }
534    
535    
536 adcroft 1.67
537     ###############################################################################
538     # Sequential part of script starts here
539     ###############################################################################
540    
541 edhill 1.1 # Set defaults here
542 edhill 1.5 COMMANDL="$0 $@"
543    
544 edhill 1.1 PLATFORM=
545     LN=
546     S64=
547     KPP=
548     FC=
549 edhill 1.60 CPP=
550 edhill 1.1 LINK=
551 edhill 1.31 DEFINES=
552 edhill 1.1 PACKAGES=
553     ENABLE=
554     DISABLE=
555     MAKEFILE=
556     MAKEDEPEND=
557     PDEPEND=
558 edhill 1.11 DUMPSTATE=t
559 edhill 1.1 PDEFAULT=
560     OPTFILE=
561 edhill 1.2 INCLUDES="-I."
562 edhill 1.1 FFLAGS=
563     FOPTIM=
564     CFLAGS=
565     KFLAGS1=
566     KFLAGS2=
567 edhill 1.70 #LDADD=
568 edhill 1.1 LIBS=
569     KPPFILES=
570     NOOPTFILES=
571     NOOPTFLAGS=
572 adcroft 1.67 MPI=
573     MPIPATH=
574 edhill 1.1
575 edhill 1.29 # DEFINES checked by test compilation
576     HAVE_SYSTEM=
577     HAVE_FDATE=
578     FC_NAMEMANGLE=
579 edhill 1.39 HAVE_CLOC=
580 edhill 1.60 HAVE_NETCDF=
581 edhill 1.29
582 edhill 1.1 MODS=
583     TOOLSDIR=
584     SOURCEDIRS=
585     INCLUDEDIRS=
586 edhill 1.57 STANDARDDIRS="USE_THE_DEFAULT"
587 edhill 1.1
588 edhill 1.71 BASH=
589 edhill 1.1 PWD=`pwd`
590     MAKE=make
591 edhill 1.15 AWK=awk
592 edhill 1.1 THISHOSTNAME=`hostname`
593     THISCWD=`pwd`
594     THISDATE=`date`
595     MACHINE=`uname -a`
596 edhill 1.7 EXECUTABLE=
597     EXEHOOK=
598     EXEDIR=
599 edhill 1.12 PACKAGES_CONF=
600     IEEE=
601     if test "x$MITGCM_IEEE" != x ; then
602     IEEE=$MITGCM_IEEE
603     fi
604 edhill 1.1
605 edhill 1.14 AUTODIFF_PKG_USED=f
606     AD_OPTFILE=
607 edhill 1.17 TAF=
608     AD_TAF_FLAGS=
609     FTL_TAF_FLAGS=
610     SVD_TAF_FLAGS=
611     TAF_EXTRA=
612     TAMC=
613     AD_TAMC_FLAGS=
614     FTL_TAF_FLAGS=
615     SVD_TAMC_FLAGS=
616     TAMC_EXTRA=
617    
618 edhill 1.14
619 edhill 1.5 # The following state can be set directly by command-line switches
620 edhill 1.41 gm_s1="OPTFILE PDEPEND PDEFAULT MAKEFILE PLATFORM ROOTDIR MODS DISABLE ENABLE"
621 edhill 1.60 gm_s2="FC CPP IEEE MPI JAM DUMPSTATE STANDARDDIRS"
622 edhill 1.5
623     # The following state is not directly set by command-line switches
624     gm_s3="LN S64 KPP LINK PACKAGES MAKEDEPEND PDEPEND PDEFAULT INCLUDES FFLAGS FOPTIM "
625     gm_s4="CFLAGS KFLAGS1 KFLAGS2 LIBS KPPFILES NOOPTFILES NOOPTFLAGS"
626     gm_s5="TOOLSDIR SOURCEDIRS INCLUDEDIRS PWD MAKE THISHOSTNAME THISDATE MACHINE"
627 edhill 1.12 gm_s6="EXECUTABLE EXEHOOK EXEDIR PACKAGES_CONF"
628 edhill 1.29 gm_s7="HAVE_SYSTEM HAVE_FDATE FC_NAMEMANGLE"
629 edhill 1.5
630 edhill 1.14 # The following are all related to adjoint/tangent-linear stuff
631 edhill 1.29 gm_s10="AUTODIFF_PKG_USED AD_OPTFILE TAMC TAF AD_TAMC_FLAGS AD_TAF_FLAGS"
632     gm_s11="FTL_TAMC_FLAGS FTL_TAF_FLAGS SVD_TAMC_FLAGS SVD_TAF_FLAGS"
633     gm_s12="TAF_EXTRA TAMC_EXTRA"
634 edhill 1.14
635 edhill 1.29 gm_state="COMMANDL $gm_s1 $gm_s2 $gm_s3 $gm_s4 $gm_s5 $gm_s6 $gm_s7"
636     gm_state="$gm_state $gm_s10 $gm_s11 $gm_s12"
637 edhill 1.5
638 edhill 1.41 cat <<EOF
639    
640     GENMAKE :
641    
642     A program for GENerating MAKEfiles for the MITgcm project. For a
643     quick list of options, use "genmake -h" or for more detail see:
644    
645     http://mitgcm.org/devel_HOWTO/
646    
647     EOF
648 edhill 1.5
649 edhill 1.2 echo "=== Processing options files and arguments ==="
650 edhill 1.12 gm_local="genmake_local"
651     for i in . $MODS ; do
652     if test -r $i/$gm_local ; then
653 edhill 1.34 . $i/$gm_local
654 edhill 1.12 break
655     fi
656     done
657 edhill 1.71 printf " getting local config information: "
658 edhill 1.1 if test -e $gm_local ; then
659     echo "using $gm_local"
660 edhill 1.34 . $gm_local
661 edhill 1.2 # echo "DISABLE=$DISABLE"
662     # echo "ENABLE=$ENABLE"
663 edhill 1.1 else
664     echo "none found"
665     fi
666    
667     # echo "$0::$1:$2:$3:$4:$5:$6:$7:"
668 edhill 1.2 #OPTIONS=
669     #n=0
670     #for i ; do
671     # echo "$i $n"
672     # setvar="OPTIONS[$n]='$i'"
673     # # echo " $setvar"
674     # eval "$setvar"
675     # n=$(( $n + 1 ))
676     #done
677     #parse_options
678     ac_prev=
679     for ac_option ; do
680    
681     # If the previous option needs an argument, assign it.
682     if test -n "$ac_prev"; then
683     eval "$ac_prev=\$ac_option"
684     ac_prev=
685     continue
686     fi
687    
688     ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
689    
690     case $ac_option in
691    
692     -help | --help | -h | --h)
693     usage ;;
694    
695     -nooptfile | --nooptfile)
696     OPTFILE="NONE" ;;
697     -optfile | --optfile | -of | --of)
698 edhill 1.4 ac_prev=OPTFILE ;;
699 edhill 1.2 -optfile=* | --optfile=* | -of=* | --of=*)
700     OPTFILE=$ac_optarg ;;
701    
702 edhill 1.50 -adoptfile | --adoptfile | -adof | --adof)
703 edhill 1.14 ac_prev=AD_OPTFILE ;;
704     -adoptfile=* | --adoptfile=* | -adof=* | --adof=*)
705     AD_OPTFILE=$ac_optarg ;;
706    
707 edhill 1.2 -pdepend | --pdepend)
708 edhill 1.4 ac_prev=PDEPEND ;;
709 edhill 1.2 -pdepend=* | --pdepend=*)
710     PDEPEND=$ac_optarg ;;
711    
712     -pdefault | --pdefault)
713 edhill 1.4 ac_prev=PDEFAULT ;;
714 edhill 1.2 -pdefault=* | --pdefault=*)
715     PDEFAULT=$ac_optarg ;;
716    
717 edhill 1.6 -make | --make | -m | --m)
718     ac_prev=MAKE ;;
719     -make=* | --make=* | -m=* | --m=*)
720     MAKE=$ac_optarg ;;
721 edhill 1.69
722 edhill 1.71 -bash | --bash)
723     ac_prev=BASH ;;
724     -bash=* | --bash=*)
725     BASH=$ac_optarg ;;
726    
727 edhill 1.69 -makedepend | --makedepend | -md | --md)
728     ac_prev=MAKEDEPEND ;;
729     -makedepend=* | --makedepend=* | -md=* | --md=*)
730     MAKEDEPEND=$ac_optarg ;;
731 edhill 1.6
732     -makefile | --makefile | -ma | --ma)
733 edhill 1.4 ac_prev=MAKEFILE ;;
734 edhill 1.6 -makefile=* | --makefile=* | -ma=* | --ma=*)
735 edhill 1.2 MAKEFILE=$ac_optarg ;;
736    
737 edhill 1.41 -platform | --platform | -pl | --pl | -platform=* | --platform=* | -pl=* | --pl=*)
738     echo "ERROR: The platform option has been removed. Please specify"
739     echo " the build options using the \"optfile\" mechanism."
740     echo
741     usage
742     ;;
743 edhill 1.2
744     -rootdir | --rootdir | -rd | --rd)
745 edhill 1.4 ac_prev=ROOTDIR ;;
746 edhill 1.2 -rootdir=* | --rootdir=* | -rd=* | --rd=*)
747     ROOTDIR=$ac_optarg ;;
748    
749     -mods | --mods | -mo | --mo)
750 edhill 1.4 ac_prev=MODS ;;
751 edhill 1.2 -mods=* | --mods=* | -mo=* | --mo=*)
752     MODS=$ac_optarg ;;
753    
754     -disable | --disable)
755 edhill 1.4 ac_prev=DISABLE ;;
756 edhill 1.2 -disable=* | --disable=*)
757     DISABLE=$ac_optarg ;;
758    
759     -enable | --enable)
760 edhill 1.4 ac_prev=ENABLE ;;
761 edhill 1.2 -enable=* | --enable=*)
762     ENABLE=$ac_optarg ;;
763    
764 edhill 1.12 -standarddirs | --standarddirs)
765     ac_prev=STANDARDDIRS ;;
766     -standarddirs=* | --standarddirs=*)
767     STANDARDDIRS=$ac_optarg ;;
768    
769 edhill 1.2 # -cpp | --cpp)
770     # ac_prev=cpp ;;
771     # -cpp=* | --cpp=*)
772     # CPP=$ac_optarg ;;
773    
774     -fortran | --fortran | -fc | --fc)
775 edhill 1.4 ac_prev=FC ;;
776 edhill 1.2 -fc=* | --fc=*)
777     FC=$ac_optarg ;;
778    
779     -ieee | --ieee)
780 edhill 1.12 IEEE=true ;;
781 edhill 1.2 -noieee | --noieee)
782 edhill 1.12 IEEE= ;;
783 adcroft 1.67
784     -mpi | --mpi)
785     MPI=true ;;
786     -mpi=* | --mpi=*)
787     MPIPATH=$ac_optarg
788     MPI=true ;;
789 edhill 1.2
790 edhill 1.41 # -jam | --jam)
791     # JAM=1 ;;
792     # -nojam | --nojam)
793     # JAM=0 ;;
794 edhill 1.2
795 edhill 1.5 -ds | --ds)
796     DUMPSTATE=t ;;
797    
798 edhill 1.17 -taf_extra | --taf_extra)
799     ac_prev=TAF_EXTRA ;;
800     -taf_extra=* | --taf_extra=*)
801     TAF_EXTRA=$ac_optarg ;;
802    
803     -tamc_extra | --tamc_extra)
804     ac_prev=TAMC_EXTRA ;;
805     -tamc_extra=* | --tamc_extra=*)
806     TAMC_EXTRA=$ac_optarg ;;
807    
808 edhill 1.2 -*)
809     echo "Error: unrecognized option: "$ac_option
810     usage
811     ;;
812    
813     *)
814     echo "Error: unrecognized argument: "$ac_option
815     usage
816     ;;
817    
818     esac
819    
820 edhill 1.1 done
821    
822 edhill 1.12 if test -f ./.genmakerc ; then
823     echo
824     echo "WARNING: genmake2 has detected a copy of the old-style \"./.genmakerc\""
825     echo " file. This file format is no longer supported. Please see:"
826     echo
827     echo " http://mitgcm.org/devel_HOWTO/"
828     echo
829     echo " for directions on how to setup and use the new \"genmake2\" input"
830     echo " files and send an email to MITgcm-support@mitgcm.org if you want help."
831     echo
832     fi
833    
834 edhill 1.11 if test "x${ROOTDIR}" = x ; then
835     if test "${PWD##/*/}" = "bin" -a -d ../model -a -d ../eesup -a -d ../pkg ; then
836     ROOTDIR=".."
837     else
838     for d in . .. ../.. ../../.. ../../../.. ../../../../.. ; do
839     if [ -d "$d/model" -a -d "$d/eesupp" -a -d "$d/pkg" ]; then
840     ROOTDIR=$d
841 edhill 1.71 printf "Warning: ROOTDIR was not specified but there appears to be"
842 edhill 1.11 echo " a copy of MITgcm at \"$ROOTDIR\" so we'll try it."
843     break
844     fi
845     done
846     fi
847     fi
848     if test "x${ROOTDIR}" = x ; then
849     echo "Error: Cannot determine ROOTDIR for MITgcm code."
850     echo " Please specify a ROOTDIR using either an options "
851     echo " file or a command-line option."
852     exit 1
853     fi
854     if test ! -d ${ROOTDIR} ; then
855     echo "Error: the specified ROOTDIR (\"$ROOTDIR\") does not exist!"
856     exit 1
857     fi
858    
859 edhill 1.1 echo " getting OPTFILE information: "
860     if test "x${OPTFILE}" = x ; then
861 edhill 1.11 if test "x$MITGCM_OF" = x ; then
862     echo "Warning: no OPTFILE specified so we'll look for possible settings"
863     printf "\n=== Searching for possible settings for OPTFILE ===\n"
864     find_possible_configs
865 edhill 1.1 else
866 edhill 1.11 OPTFILE=$MITGCM_OF
867     fi
868     fi
869     if test "x$OPTFILE" != xNONE ; then
870     if test -f "$OPTFILE" -a -r "$OPTFILE" ; then
871     echo " using OPTFILE=\"$OPTFILE\""
872 edhill 1.34 . "$OPTFILE"
873 edhill 1.11 RETVAL=$?
874     if test "x$RETVAL" != x0 ; then
875 edhill 1.71 printf "Error: failed to source OPTFILE \"$OPTFILE\""
876 edhill 1.11 echo "--please check that variable syntax is bash-compatible"
877 edhill 1.1 exit 1
878     fi
879 edhill 1.11 if test "x$DUMPSTATE" != xf ; then
880 edhill 1.12 cp -f $OPTFILE "genmake_optfile"
881 edhill 1.11 fi
882     else
883     echo "Error: can't read OPTFILE=\"$OPTFILE\""
884     exit 1
885 edhill 1.1 fi
886     fi
887 edhill 1.8
888 edhill 1.14 echo " getting AD_OPTFILE information: "
889     if test "x${AD_OPTFILE}" = x ; then
890     if test "x$MITGCM_AD_OF" = x ; then
891     AD_OPTFILE=$ROOTDIR/tools/adjoint_options/adjoint_default
892     else
893     AD_OPTFILE=$MITGCM_AD_OF
894     fi
895     fi
896     if test "x${AD_OPTFILE}" != xNONE ; then
897     if test -f "$AD_OPTFILE" -a -r "$AD_OPTFILE" ; then
898     echo " using AD_OPTFILE=\"$AD_OPTFILE\""
899 edhill 1.34 . "$AD_OPTFILE"
900 edhill 1.14 RETVAL=$?
901     if test "x$RETVAL" != x0 ; then
902 edhill 1.71 printf "Error: failed to source AD_OPTFILE \"$AD_OPTFILE\""
903 edhill 1.14 echo "--please check that variable syntax is bash-compatible"
904     exit 1
905     fi
906     if test "x$DUMPSTATE" != xf ; then
907     cp -f $AD_OPTFILE "genmake_ad_optfile"
908     fi
909     else
910     echo "Error: can't read AD_OPTFILE=\"$AD_OPTFILE\""
911     exit 1
912     fi
913     fi
914    
915 edhill 1.39 # Check that FC, LINK, CPP, S64, LN, and MAKE are defined. If not,
916     # either set defaults or complain and abort!
917 edhill 1.71 if test ! "x$BASH" = x ; then
918     # add a trailing space so that it works within the Makefile syntax (see below)
919     BASH="$BASH "
920     fi
921 edhill 1.8 if test "x$FC" = x ; then
922     cat <<EOF 1>&2
923    
924     Error: no Fortran compiler: please specify using one of the following:
925     1) within the options file ("FC=...") as specified by "-of=OPTFILE"
926     2) the "-fc=XXX" command-line option
927 edhill 1.12 3) the "./genmake_local" file
928 edhill 1.8 EOF
929     exit 1
930     fi
931     if test "x$LINK" = x ; then
932     LINK=$FC
933     fi
934 edhill 1.39 if test "x$MAKE" = x ; then
935     MAKE="make"
936     fi
937 edhill 1.63 if test "x$CPP" = x ; then
938     CPP=cpp
939     fi
940     #EH3 === UGLY ===
941     # The following an ugly little hack to check for $CPP in /lib/ and it
942     # should eventually be replaced with a more general function that
943     # searches a combo of the user's path and a list of "usual suspects"
944     # to find the correct location for binaries such as $CPP.
945     for i in " " "/lib/" ; do
946     echo "#define A a" | $i$CPP > test_cpp 2>&1 && CPP=$i$CPP
947     done
948     #EH3 === UGLY ===
949 edhill 1.13 echo "#define A a" | $CPP > test_cpp 2>&1
950 edhill 1.11 RETVAL=$?
951     if test "x$RETVAL" != x0 ; then
952 edhill 1.8 cat <<EOF 1>&2
953    
954 edhill 1.11 Error: C pre-processor "$CPP" failed the test case: please specify using:
955    
956 edhill 1.8 1) within the options file ("CPP=...") as specified by "-of=OPTFILE"
957 edhill 1.12 2) the "./genmake_local" file
958 edhill 1.30 3) with the CPP environment variable
959 edhill 1.11
960 edhill 1.8 EOF
961     exit 1
962 edhill 1.11 else
963     rm -f test_cpp
964 edhill 1.8 fi
965 edhill 1.11 if test "x$MAKEDEPEND" = x ; then
966     MAKEDEPEND=makedepend
967 edhill 1.8 fi
968 edhill 1.35 if test "x$LN" = x ; then
969     LN="ln -s"
970     fi
971     echo "test" > genmake_test_ln
972     $LN genmake_test_ln genmake_tlink
973     RETVAL=$?
974     if test "x$RETVAL" != x0 ; then
975     cat <<EOF 1>&2
976 edhill 1.29
977 edhill 1.35 Error: The command "ln -s" failed -- please specify a working soft-link
978     command in the optfile.
979    
980     EOF
981     exit 1
982     fi
983     rm -f genmake_test_ln genmake_tlink
984 edhill 1.29
985 adcroft 1.67 if test ! "x$MPI" = x ; then
986     echo " Turning on MPI cpp macros"
987 adcroft 1.68 DEFINES="$DEFINES -DALLOW_USE_MPI -DALWAYS_USE_MPI"
988 adcroft 1.67 fi
989 edhill 1.39
990 edhill 1.29 printf "\n=== Checking system libraries ===\n"
991 edhill 1.71 printf " Do we have the system() command using $FC... "
992 edhill 1.29 cat > genmake_tcomp.f <<EOF
993     program hello
994     call system('echo hi')
995     end
996     EOF
997     $FC $FFLAGS $DEFINES -o genmake_tcomp genmake_tcomp.f > genmake_tcomp.log 2>&1
998     RETVAL=$?
999     if test "x$RETVAL" = x0 ; then
1000     HAVE_SYSTEM=t
1001     DEFINES="$DEFINES -DHAVE_SYSTEM"
1002     echo "yes"
1003     else
1004     HAVE_SYSTEM=
1005     echo "no"
1006     fi
1007     rm -f genmake_tcomp*
1008    
1009 edhill 1.71 printf " Do we have the fdate() command using $FC... "
1010 edhill 1.29 cat > genmake_tcomp.f <<EOF
1011     program hello
1012     CHARACTER(128) string
1013     string = ' '
1014     call fdate( string )
1015     print *, string
1016     end
1017     EOF
1018     $FC $FFLAGS $DEFINES -o genmake_tcomp genmake_tcomp.f > genmake_tcomp.log 2>&1
1019     RETVAL=$?
1020     if test "x$RETVAL" = x0 ; then
1021     HAVE_FDATE=t
1022     DEFINES="$DEFINES -DHAVE_FDATE"
1023     echo "yes"
1024     else
1025     HAVE_FDATE=
1026     echo "no"
1027     fi
1028     rm -f genmake_tcomp*
1029    
1030 edhill 1.71 printf " Can we call simple C routines (here, \"cloc()\") using $FC... "
1031 edhill 1.39 check_HAVE_CLOC
1032     if test "x$HAVE_CLOC" != x ; then
1033     echo "yes"
1034     else
1035     echo "no"
1036 edhill 1.29 fi
1037 edhill 1.39 rm -f genmake_t*
1038 edhill 1.29
1039 edhill 1.71 printf " Can we create NetCDF-enabled binaries... "
1040 edhill 1.60 check_netcdf_libs
1041     if test "x$HAVE_NETCDF" != x ; then
1042     echo "yes"
1043     else
1044     echo "no"
1045     fi
1046    
1047 edhill 1.8
1048 edhill 1.2 printf "\n=== Setting defaults ===\n"
1049 edhill 1.71 printf " Adding MODS directories: "
1050 edhill 1.1 for d in $MODS ; do
1051     if test ! -d $d ; then
1052 edhill 1.2 echo
1053     echo "Error: MODS directory \"$d\" not found!"
1054 edhill 1.1 exit 1
1055     else
1056 edhill 1.71 printf " $d"
1057 edhill 1.1 SOURCEDIRS="$SOURCEDIRS $d"
1058     INCLUDEDIRS="$INCLUDEDIRS $d"
1059     fi
1060     done
1061     echo
1062    
1063     if test "x$MAKEFILE" = x ; then
1064     MAKEFILE="Makefile"
1065     fi
1066     if test "x${PLATFORM}" = x ; then
1067     PLATFORM=$p_PLATFORM
1068     fi
1069    
1070     if test "x${EXEDIR}" = x ; then
1071     if test "${PWD##/*/}" = "bin" -a -d ../exe -a $ROOTDIR = .. ; then
1072     EXEDIR=../exe
1073     else
1074     EXEDIR=.
1075     fi
1076     fi
1077     if test ! -d ${EXEDIR} ; then
1078     echo "Error: the specified EXEDIR (\"$EXEDIR\") does not exist!"
1079     exit 1
1080     fi
1081    
1082     if test "x${TOOLSDIR}" = x ; then
1083     TOOLSDIR="$ROOTDIR/tools"
1084     fi
1085     if test ! -d ${TOOLSDIR} ; then
1086 cnh 1.65 echo "Error: the specified TOOLSDIR (\"$TOOLSDIR\") does not exist!"
1087 edhill 1.1 exit 1
1088     fi
1089 edhill 1.11 if test "x$S64" = x ; then
1090     S64='$(TOOLSDIR)/set64bitConst.sh'
1091     fi
1092 adcroft 1.44 THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`
1093 edhill 1.1
1094     EXECUTABLE=${EXECUTABLE:-mitgcmuv}
1095    
1096     # We have a special set of source files in eesupp/src which are
1097     # generated from some template source files. We'll make them first so
1098     # they appear as regular source code
1099     if test -r $ROOTDIR"/eesupp/src/Makefile" ; then
1100     echo " Making source files in eesupp from templates"
1101 edhill 1.36 ( cd $ROOTDIR"/eesupp/src/" && $MAKE ) > make_eesupp.errors 2>&1
1102 edhill 1.1 RETVAL=$?
1103 edhill 1.2 if test "x${RETVAL}" = x0 ; then
1104 edhill 1.1 rm -f make_eesupp.errors
1105     else
1106     echo "Error: problem encountered while building source files in eesupp:"
1107 edhill 1.62 cat make_eesupp.errors 1>&2
1108 edhill 1.1 exit 1
1109 afe 1.58 fi
1110     fi
1111    
1112     #same for exch2
1113     if test -r $ROOTDIR"/pkg/exch2/Makefile" ; then
1114     echo " Making source files in exch2 from templates"
1115     ( cd $ROOTDIR"/pkg/exch2/" && $MAKE ) > make_exch2.errors 2>&1
1116     RETVAL=$?
1117     if test "x${RETVAL}" = x0 ; then
1118     rm -f make_exch2.errors
1119     else
1120 edhill 1.59 echo "Error: problem encountered while building source files in exch2:"
1121 edhill 1.62 cat make_exch2.errors 1>&2
1122 afe 1.58 exit 1
1123 edhill 1.1 fi
1124     fi
1125    
1126 edhill 1.2 printf "\n=== Determining package settings ===\n"
1127 edhill 1.1 if test "x${PDEPEND}" = x ; then
1128     tmp=$ROOTDIR"/pkg/pkg_depend"
1129     if test -r $tmp ; then
1130     PDEPEND=$tmp
1131     else
1132     echo "Warning: No package dependency information was specified."
1133     echo " Please check that ROOTDIR/pkg/pkg_depend exists."
1134     fi
1135     else
1136     if test ! -r ${PDEPEND} ; then
1137     echo "Error: can't read package dependency info from PDEPEND=\"$PDEPEND\""
1138     exit 1
1139     fi
1140     fi
1141     echo " getting package dependency info from $PDEPEND"
1142     # Strip the comments and then convert the dependency file into
1143     # two arrays: PNAME, DNAME
1144     cat $PDEPEND | sed -e 's/#.*$//g' \
1145 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}' \
1146 edhill 1.1 > ./.pd_tmp
1147     RETVAL=$?
1148     if test ! "x${RETVAL}" = x0 ; then
1149     echo "Error: unable to parse package dependencies -- please check PDEPEND=\"$PDEPEND\""
1150     exit 1
1151     fi
1152 edhill 1.34 . ./.pd_tmp
1153 edhill 1.1 rm -f ./.pd_tmp
1154    
1155 edhill 1.12 # Search for default packages. Note that a "$ROOTDIR/pkg/pkg_groups"
1156     # file should eventually be added so that, for convenience, one can
1157     # specify groups of packages using names like "ocean" and "atmosphere".
1158 edhill 1.41 echo " checking default package list: "
1159 edhill 1.1 if test "x${PDEFAULT}" = x ; then
1160 edhill 1.12 for i in "." $MODS ; do
1161     if test -r $i"/packages.conf" ; then
1162     PDEFAULT=$i"/packages.conf"
1163     break
1164     fi
1165     done
1166     fi
1167     if test "x${PDEFAULT}" = x ; then
1168 edhill 1.1 PDEFAULT="$ROOTDIR/pkg/pkg_default"
1169     fi
1170     if test "x${PDEFAULT}" = xNONE ; then
1171 edhill 1.41 echo " default packages file disabled"
1172 edhill 1.1 else
1173     if test ! -r $PDEFAULT ; then
1174     echo "Warning: can't read default packages from PDEFAULT=\"$PDEFAULT\""
1175     else
1176 edhill 1.41 echo " using PDEFAULT=\"$PDEFAULT\""
1177 edhill 1.1 # Strip the comments and add all the names
1178 edhill 1.15 def=`cat $PDEFAULT | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
1179 edhill 1.1 RETVAL=$?
1180     if test "x${RETVAL}" != x0 ; then
1181 edhill 1.71 printf "Error: can't parse default package list "
1182 edhill 1.1 echo "-- please check PDEFAULT=\"$PDEFAULT\""
1183     exit 1
1184     fi
1185     for i in $def ; do
1186     PACKAGES="$PACKAGES $i"
1187     done
1188 edhill 1.12 echo " before group expansion packages are: $PACKAGES"
1189     expand_pkg_groups
1190     echo " after group expansion packages are: $PACKAGES"
1191 edhill 1.1 fi
1192     fi
1193    
1194     echo " applying DISABLE settings"
1195     pack=
1196     for p in $PACKAGES ; do
1197     addit="t"
1198     for d in $DISABLE ; do
1199     if test "x$p" = "x$d" ; then
1200     addit="f"
1201     fi
1202     done
1203     if test "x$addit" = xt ; then
1204     pack="$pack $p"
1205     fi
1206     done
1207     PACKAGES="$pack"
1208     echo " applying ENABLE settings"
1209 edhill 1.12 echo "" > ./.tmp_pack
1210 edhill 1.1 PACKAGES="$PACKAGES $ENABLE"
1211     for i in $PACKAGES ; do
1212     if test ! -d "$ROOTDIR/pkg/$i" ; then
1213     echo "Error: can't find package $i at \"$ROOTDIR/pkg/$i\""
1214     exit 1
1215     fi
1216     echo $i >> ./.tmp_pack
1217     done
1218     pack=`cat ./.tmp_pack | sort | uniq`
1219     rm -f ./.tmp_pack
1220     PACKAGES=
1221     for i in $pack ; do
1222     PACKAGES="$PACKAGES $i"
1223     done
1224     echo " packages are: $PACKAGES"
1225    
1226     echo " applying package dependency rules"
1227     ck=
1228     while test "x$ck" != xtt ; do
1229     i=0
1230 edhill 1.2 # rtot=${#PNAME[@]}
1231     rtot=$nname
1232 edhill 1.1 while test $i -lt $rtot ; do
1233    
1234     # Is $pname in the current $PACKAGES list?
1235 edhill 1.2 # pname=${PNAME[$i]}
1236     tmp="pname=\"\$PNAME_$i\""
1237     eval $tmp
1238 edhill 1.1 pin="f"
1239     for p in $PACKAGES ; do
1240     if test "x$p" = "x$pname" ; then
1241     pin="t"
1242     fi
1243     done
1244    
1245     # Is the DNAME entry a (+) or (-) rule ?
1246 edhill 1.2 tmp="dname=\"\$DNAME_$i\""
1247     eval $tmp
1248 edhill 1.1 plus="-"
1249 edhill 1.2 echo $dname | grep '^+' > /dev/null 2>&1
1250 edhill 1.1 RETVAL=$?
1251     if test "x$RETVAL" = x0 ; then
1252     plus="+"
1253     fi
1254    
1255     # Is $dname in the current $PACKAGES list?
1256 edhill 1.2 dname=`echo $dname | sed -e 's/^[+-]//'`
1257 edhill 1.1 din="f"
1258     for p in $PACKAGES ; do
1259     if test "x$p" = "x$dname" ; then
1260     din="t"
1261     fi
1262     done
1263    
1264     # Do we need to add $dname according to the dependency rules?
1265     if test "x$pin" = xt -a "x$plus" = "x+" -a "x$din" = xf ; then
1266     in_dis="f"
1267     for dis in $DISABLE ; do
1268     if test "x$dis" = "x$dname" ; then
1269     in_dis="t"
1270     fi
1271     done
1272     if test "x$in_dis" = xt ; then
1273     echo "Error: can't satisfy package dependencies:"
1274     echo " \"$dname\" is required by the dependency rules"
1275     echo " but is disallowed by the DISABLE settings"
1276     exit 1
1277     else
1278     PACKAGES="$PACKAGES $dname"
1279     ck=
1280     fi
1281     fi
1282    
1283     # Do we need to get rid of $dname according to the dependency rules?
1284     if test "x$pin" = xt -a "x$plus" = "x-" -a "x$din" = xt; then
1285     echo "Error: can't satisfy package dependencies:"
1286     echo " \"$pname\" was requested but is disallowed by"
1287     echo " the dependency rules for \"$dname\""
1288     exit 1
1289     fi
1290     i=$(( $i + 1 ))
1291     done
1292     ck=$ck"t"
1293     done
1294     echo " packages are: $PACKAGES"
1295     for i in $PACKAGES ; do
1296     adr="$ROOTDIR/pkg/$i"
1297     if test -d $adr ; then
1298     SOURCEDIRS="$SOURCEDIRS $adr"
1299     INCLUDEDIRS="$INCLUDEDIRS $adr"
1300 edhill 1.14 if test "x$i" = xautodiff ; then
1301     AUTODIFF_PKG_USED=t
1302     fi
1303 edhill 1.1 else
1304     echo "Error: the directory \"$adr\" for package $i doesn't exist"
1305     exit 1
1306     fi
1307     done
1308    
1309 edhill 1.62 # Build MNC templates and check for ability to build and use NetCDF
1310 edhill 1.60 echo $PACKAGES | grep ' mnc ' > /dev/null 2>&1
1311     RETVAL=$?
1312 edhill 1.62 if test "x$RETVAL" = x0 ; then
1313     ( cd $ROOTDIR"/pkg/mnc" && $MAKE templates ) > make_mnc.errors 2>&1
1314     RETVAL=$?
1315     if test "x${RETVAL}" = x0 ; then
1316     rm -f make_mnc.errors
1317     else
1318     echo "Error: problem encountered while building source files in pkg/mnc:"
1319     cat make_mnc.errors 1>&2
1320     exit 1
1321     fi
1322 edhill 1.64 if test "x$HAVE_NETCDF" != xt ; then
1323 edhill 1.62 cat <<EOF
1324 edhill 1.60
1325     WARNING: the "mnc" package has been enabled but tests failed to
1326     compile and/or execute NetCDF applications. Please check that:
1327    
1328     1) NetCDF is installed for your compiler and
1329     2) the LIBS variable (within the 'optfile") specifies the correct
1330     NetCDF library to link against.
1331    
1332     EOF
1333 edhill 1.62 fi
1334 edhill 1.60 fi
1335 edhill 1.1
1336 edhill 1.12 # Create a list of #define and #undef to enable/disable packages
1337     PACKAGES_DOT_H=PACKAGES_CONFIG.h
1338 edhill 1.1 # The following UGLY HACK sets multiple "#undef"s and it needs to go
1339     # away. On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h
1340     # file would eventually be split up so that all package-related #define
1341     # statements could be separated and handled only by genmake.
1342     names=`ls -1 "$ROOTDIR/pkg"`
1343     all_pack=
1344 adcroft 1.44 DISABLED_PACKAGES=
1345 edhill 1.1 for n in $names ; do
1346     if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
1347     has_pack="f"
1348     for pack in $PACKAGES ; do
1349     if test "x$pack" = "x$n" ; then
1350     has_pack="t"
1351     break
1352     fi
1353     done
1354     if test "x$has_pack" = xf ; then
1355 edhill 1.15 undef=`echo "ALLOW_$n" | $AWK '{print toupper($0)}'`
1356 adcroft 1.44 DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
1357 edhill 1.1 fi
1358     fi
1359     done
1360 adcroft 1.44 ENABLED_PACKAGES=
1361 edhill 1.1 for i in $PACKAGES ; do
1362 edhill 1.15 def=`echo "ALLOW_$i" | $AWK '{print toupper($0)}'`
1363 adcroft 1.44 ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
1364 edhill 1.12 #eh3 DEFINES="$DEFINES -D$def"
1365 edhill 1.1
1366     #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
1367     case $i in
1368     aim_v23)
1369 adcroft 1.46 ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
1370 jmc 1.55 echo "Warning: ALLOW_AIM is set to enable aim_v23."
1371 edhill 1.1 ;;
1372     esac
1373     #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
1374    
1375     done
1376    
1377     echo " Adding STANDARDDIRS"
1378     BUILDDIR=${BUILDDIR:-.}
1379 edhill 1.57 if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
1380 edhill 1.12 STANDARDDIRS="eesupp model"
1381     fi
1382 edhill 1.57 if test "x$STANDARDDIRS" != x ; then
1383     for d in $STANDARDDIRS ; do
1384     adr="$ROOTDIR/$d/src"
1385     if test ! -d $adr ; then
1386     echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1387     echo " is correct and that you correctly specified the STANDARDDIRS option"
1388     exit 1
1389     else
1390     SOURCEDIRS="$SOURCEDIRS $adr"
1391     fi
1392     adr="$ROOTDIR/$d/inc"
1393     if test ! -d $adr ; then
1394     echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1395     echo " is correct and that you correctly specified the STANDARDDIRS option"
1396     exit 1
1397     else
1398     INCLUDEDIRS="$INCLUDEDIRS $adr"
1399     fi
1400     done
1401     fi
1402 edhill 1.1
1403 adcroft 1.52 echo " Searching for *OPTIONS.h files in order to warn about the presence"
1404     echo " of \"#define \"-type statements that are no longer allowed:"
1405 edhill 1.12 CPP_OPTIONS=
1406 adcroft 1.52 CPP_EEOPTIONS=
1407 edhill 1.12 spaths=". $INCLUDEDIRS"
1408 adcroft 1.52 names=`ls -1 "$ROOTDIR/pkg"`
1409 edhill 1.12 for i in $spaths ; do
1410     try="$i/CPP_OPTIONS.h"
1411 edhill 1.54 if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
1412 edhill 1.12 echo " found CPP_OPTIONS=\"$try\""
1413     CPP_OPTIONS="$try"
1414 adcroft 1.52 # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
1415     for n in $names ; do
1416     test_for_package_in_cpp_options $CPP_OPTIONS $n
1417     done
1418     fi
1419     try="$i/CPP_EEOPTIONS.h"
1420 edhill 1.54 if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
1421 adcroft 1.52 echo " found CPP_EEOPTIONS=\"$try\""
1422     # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
1423     #**** not yet enabled ****
1424     # test_for_mpi_in_cpp_eeoptions $try
1425     #**** not yet enabled ****
1426     CPP_EEOPTIONS="$try"
1427 edhill 1.12 fi
1428     done
1429     if test "x$CPP_OPTIONS" = x ; then
1430     echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
1431     exit 1
1432     fi
1433 edhill 1.1
1434 edhill 1.14 # Here, we build the list of files to be "run through" the adjoint
1435     # compiler.
1436     if test -f ./ad_files ; then
1437     rm -f ./ad_files
1438     fi
1439     echo " Creating the list of files for the adjoint compiler."
1440     for i in $SOURCEDIRS ; do
1441     list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
1442     for j in $list_files ; do
1443     cat $i/$j >> ad_files
1444     done
1445     done
1446 edhill 1.60
1447 edhill 1.14
1448 edhill 1.2 echo
1449     echo "=== Creating the Makefile ==="
1450 edhill 1.1 echo " setting INCLUDES"
1451     for i in $INCLUDEDIRS ; do
1452 edhill 1.12 if ! test -d $i ; then
1453     # INCLUDES="$INCLUDES -I$i"
1454     # else
1455 edhill 1.1 echo "Warning: can't find INCLUDEDIRS=\"$i\""
1456     fi
1457     done
1458    
1459     echo " Determining the list of source and include files"
1460     rm -rf .links.tmp
1461     mkdir .links.tmp
1462     echo "# This section creates symbolic links" > srclinks.tmp
1463     echo "" >> srclinks.tmp
1464 edhill 1.71 printf 'SRCFILES = ' > srclist.inc
1465     printf 'CSRCFILES = ' > csrclist.inc
1466     printf 'F90SRCFILES = ' > f90srclist.inc
1467     printf 'HEADERFILES = ' > hlist.inc
1468     printf 'AD_FLOW_FILES = ' > ad_flow_files.inc
1469 adcroft 1.9 alldirs="$SOURCEDIRS $INCLUDEDIRS ."
1470 edhill 1.1 for d in $alldirs ; do
1471     deplist=
1472 edhill 1.14 sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
1473 cnh 1.3 sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
1474 edhill 1.1 for sf in $sfiles ; do
1475     if test ! -r ".links.tmp/$sf" ; then
1476     if test -f "$d/$sf" ; then
1477 adcroft 1.44 case $d/$sf in
1478     ./$PACKAGES_DOT_H)
1479     ;;
1480     ./AD_CONFIG.h)
1481     ;;
1482     ./FC_NAMEMANGLE.h)
1483     ;;
1484     *)
1485     touch .links.tmp/$sf
1486     deplist="$deplist $sf"
1487     ;;
1488     esac
1489 edhill 1.15 extn=`echo $sf | $AWK -F '.' '{print $NF}'`
1490 edhill 1.1 case $extn in
1491     F)
1492     echo " \\" >> srclist.inc
1493 edhill 1.71 printf " $sf" >> srclist.inc
1494 edhill 1.1 ;;
1495 cnh 1.3 F90)
1496     echo " \\" >> f90srclist.inc
1497 edhill 1.71 printf " $sf" >> f90srclist.inc
1498 cnh 1.3 ;;
1499 edhill 1.1 c)
1500     echo " \\" >> csrclist.inc
1501 edhill 1.71 printf " $sf" >> csrclist.inc
1502 edhill 1.1 ;;
1503     h)
1504     echo " \\" >> hlist.inc
1505 edhill 1.71 printf " $sf" >> hlist.inc
1506 edhill 1.1 ;;
1507 edhill 1.14 flow)
1508     echo " \\" >> ad_flow_files.inc
1509 edhill 1.71 printf " $sf" >> ad_flow_files.inc
1510 edhill 1.14 ;;
1511 edhill 1.1 esac
1512     fi
1513     fi
1514     done
1515     if test "x$deplist" != x ; then
1516 edhill 1.2 echo "" >> srclinks.tmp
1517     echo "# These files are linked from $d" >> srclinks.tmp
1518 edhill 1.1 echo "$deplist :" >> srclinks.tmp
1519 edhill 1.2 printf "\t\$(LN) %s/\$@ \$@\n" $d >> srclinks.tmp
1520 edhill 1.1 fi
1521     done
1522     rm -rf .links.tmp
1523     echo "" >> srclist.inc
1524     echo "" >> csrclist.inc
1525 cnh 1.3 echo "" >> f90srclist.inc
1526 edhill 1.1 echo "" >> hlist.inc
1527 edhill 1.14 echo "" >> ad_flow_files.inc
1528 edhill 1.1
1529     if test -e $MAKEFILE ; then
1530     mv -f $MAKEFILE "$MAKEFILE.bak"
1531     fi
1532     echo " Writing makefile: $MAKEFILE"
1533     echo "# Multithreaded + multi-processing makefile for:" > $MAKEFILE
1534     echo "# $MACHINE" >> $MAKEFILE
1535     echo "# This makefile was generated automatically on" >> $MAKEFILE
1536     echo "# $THISDATE" >> $MAKEFILE
1537     echo "# by the command:" >> $MAKEFILE
1538     echo "# $0 $@" >> $MAKEFILE
1539     echo "# executed by:" >> $MAKEFILE
1540     echo "# $USER@${THISHOSTNAME}:${THISCWD}" >> $MAKEFILE
1541 edhill 1.21
1542     EXE_AD=$EXECUTABLE"_ad"
1543     EXE_FTL=$EXECUTABLE"_ftl"
1544     EXE_SVD=$EXECUTABLE"_svd"
1545    
1546 edhill 1.1 cat >>$MAKEFILE <<EOF
1547 edhill 1.53 #
1548     # OPTFILE="$OPTFILE"
1549 edhill 1.1 #
1550     # BUILDDIR : Directory where object files are written
1551     # SOURCEDIRS : Directories containing the source (.F) files
1552     # INCLUDEDIRS : Directories containing the header-source (.h) files
1553     # EXEDIR : Directory where executable that is generated is written
1554     # EXECUTABLE : Full path of executable binary
1555     #
1556     # CPP : C-preprocessor command
1557     # INCLUDES : Directories searched for header files
1558     # DEFINES : Macro definitions for CPP
1559     # MAKEDEPEND : Dependency generator
1560     # KPP : Special preprocessor command (specific to platform)
1561     # KFLAGS : Flags for KPP
1562     # FC : Fortran compiler command
1563     # FFLAGS : Configuration/debugging options for FC
1564     # FOPTIM : Optimization options for FC
1565     # LINK : Command for link editor program
1566     # LIBS : Library flags /or/ additional optimization/debugging flags
1567    
1568     ROOTDIR = ${ROOTDIR}
1569     BUILDDIR = ${BUILDDIR}
1570     SOURCEDIRS = ${SOURCEDIRS}
1571     INCLUDEDIRS = ${INCLUDEDIRS}
1572     EXEDIR = ${EXEDIR}
1573     EXECUTABLE = \$(EXEDIR)/${EXECUTABLE}
1574     TOOLSDIR = ${TOOLSDIR}
1575    
1576 edhill 1.14 #eh3 new defines for the adjoint work
1577     AUTODIFF = ${ROOTDIR}/pkg/autodiff
1578 edhill 1.21 EXE_AD = ${EXE_AD}
1579     EXE_FTL = ${EXE_FTL}
1580     EXE_SVD = ${EXE_SVD}
1581 edhill 1.14
1582 adcroft 1.44 ENABLED_PACKAGES = ${ENABLED_PACKAGES}
1583     DISABLED_PACKAGES = ${DISABLED_PACKAGES}
1584    
1585 adcroft 1.52 # These files are created by Makefile
1586     SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h
1587    
1588 edhill 1.1 EOF
1589    
1590     # Note: figure out some way to add Hyades JAM libraries here
1591    
1592     cat >>$MAKEFILE <<EOF
1593     # Unix ln (link)
1594     LN = ${LN}
1595     # C preprocessor
1596     CPP = cat \$< | ${S64} | ${CPP}
1597     # Dependency generator
1598     MAKEDEPEND = ${MAKEDEPEND}
1599     # Special preprocessor (KAP on DECs, FPP on Crays)
1600     KPP = ${KPP}
1601     # Fortran compiler
1602     FC = ${FC}
1603 cnh 1.3 # Fortran compiler
1604     F90C = ${F90C}
1605 edhill 1.1 # Link editor
1606 edhill 1.70 LINK = ${LINK} ${LDADD}
1607 edhill 1.1
1608     # Defines for CPP
1609     DEFINES = ${DEFINES}
1610     # Includes for CPP
1611     INCLUDES = ${INCLUDES}
1612     # Flags for KPP
1613     KFLAGS1 = ${KFLAGS1}
1614     KFLAGS2 = ${KFLAGS2}
1615     # Optim./debug for FC
1616     FFLAGS = ${FFLAGS}
1617     FOPTIM = ${FOPTIM}
1618 cnh 1.3 # Optim./debug for FC
1619     F90FLAGS = ${F90FLAGS}
1620     F90OPTIM = ${F90OPTIM}
1621 edhill 1.1 # Flags for CC
1622     CFLAGS = ${CFLAGS}
1623     # Files that should not be optimized
1624     NOOPTFILES = ${NOOPTFILES}
1625     NOOPTFLAGS = ${NOOPTFLAGS}
1626     # Flags and libraries needed for linking
1627     LIBS = ${LIBS} \$(XLIBS)
1628 cnh 1.3 # Name of the Mekfile
1629     MAKEFILE=${MAKEFILE}
1630 edhill 1.1
1631     EOF
1632    
1633 edhill 1.14 cat srclist.inc >> $MAKEFILE
1634     cat csrclist.inc >> $MAKEFILE
1635     cat f90srclist.inc >> $MAKEFILE
1636     cat hlist.inc >> $MAKEFILE
1637     cat ad_flow_files.inc >> $MAKEFILE
1638     echo >> $MAKEFILE
1639 cnh 1.3 echo 'F77FILES = $(SRCFILES:.F=.f)' >> $MAKEFILE
1640     echo 'F90FILES = $(F90SRCFILES:.F90=.f90)' >> $MAKEFILE
1641     echo 'OBJFILES = $(SRCFILES:.F=.o) $(CSRCFILES:.c=.o) $(F90SRCFILES:.F90=.o)' >> $MAKEFILE
1642 edhill 1.1
1643 cnh 1.3 rm -f srclist.inc csrclist.inc hlist.inc flist.tmp clist.tmp f90srclist.inc
1644 edhill 1.14 rm -f ad_flow_files.inc
1645 edhill 1.1
1646     cat >>$MAKEFILE <<EOF
1647    
1648     .SUFFIXES:
1649 cnh 1.3 .SUFFIXES: .o .f .p .F .c .F90 .f90
1650 edhill 1.1
1651     all: \$(EXECUTABLE)
1652 adcroft 1.52 \$(EXECUTABLE): \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(OBJFILES)
1653 adcroft 1.44 @echo Creating \$@ ...
1654 edhill 1.1 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
1655     depend:
1656     @make links
1657     \$(MAKEDEPEND) -o .f \$(DEFINES) \$(INCLUDES) \$(SRCFILES)
1658 adcroft 1.44 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
1659 edhill 1.1
1660 adcroft 1.52 links: \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(SPECIAL_FILES)
1661 edhill 1.1
1662 cnh 1.3 small_f: \$(F77FILES) \$(F90FILES)
1663 edhill 1.1
1664     output.txt: \$(EXECUTABLE)
1665     @printf 'running ... '
1666     @\$(EXECUTABLE) > \$@
1667    
1668     clean:
1669 adcroft 1.44 -rm -rf *.o *.f *.p *.f90 *.mod ${RMFILES} work.{pc,pcl} *.template
1670 edhill 1.1 Clean:
1671     @make clean
1672     @make cleanlinks
1673 adcroft 1.52 -rm -f \$(SPECIAL_FILES)
1674 adcroft 1.51 -rm -f genmake_state genmake_*optfile genmake_warnings make.log run.log *.bak
1675 edhill 1.1 CLEAN:
1676     @make Clean
1677     -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
1678     -find \$(EXEDIR) -name "*.data" -exec rm {} \;
1679     -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
1680 edhill 1.12 -rm -f \$(EXECUTABLE) output.txt
1681 edhill 1.1
1682 edhill 1.18 #eh3 Makefile: makefile
1683 edhill 1.1 makefile:
1684 adcroft 1.44 $THIS_SCRIPT $@
1685 edhill 1.1 cleanlinks:
1686     -find . -type l -exec rm {} \;
1687    
1688 adcroft 1.52 # Special targets ($SPECIAL_FILES) which are create by make
1689 adcroft 1.44 ${PACKAGES_DOT_H}:
1690     @echo Creating \$@ ...
1691 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) > \$@
1692 adcroft 1.44 AD_CONFIG.h:
1693     @echo Creating \$@ ...
1694 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 > \$@
1695 adcroft 1.52 FC_NAMEMANGLE.h:
1696     @echo Creating \$@ ...
1697     echo "$FC_NAMEMANGLE" > \$@
1698 adcroft 1.44
1699 edhill 1.1 # The normal chain of rules is ( .F - .f - .o )
1700     .F.f:
1701     \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1702     .f.o:
1703     \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
1704 cnh 1.3 .F90.f90:
1705     \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1706     .f90.o:
1707     \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
1708 edhill 1.1 .c.o:
1709     \$(CC) \$(CFLAGS) -c \$<
1710    
1711     # Special exceptions that use the ( .F - .p - .f - .o ) rule-chain
1712     .F.p:
1713     \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1714     .p.f:
1715     \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
1716 edhill 1.14
1717     #=========================================
1718     #=== Automatic Differentiation Rules ===
1719    
1720     TAMC = ${TAMC}
1721     TAF = ${TAF}
1722    
1723 edhill 1.17 TAF_EXTRA = ${TAF_EXTRA}
1724     TAMC_EXTRA = ${TAMC_EXTRA}
1725    
1726 edhill 1.14 EOF
1727    
1728     ad_vars="AD_TAMC_FLAGS AD_TAF_FLAGS"
1729     ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF_FLAGS"
1730     ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
1731     for i in $ad_vars ; do
1732     name=$i
1733     t1="t2=\$"`echo $i`
1734     eval $t1
1735     printf "%-20s = " $name >> $MAKEFILE
1736     echo $t2 >> $MAKEFILE
1737     done
1738    
1739     echo " Add the source list for AD code generation"
1740     echo >> $MAKEFILE
1741 edhill 1.71 printf "AD_FILES = " >> $MAKEFILE
1742 edhill 1.14 AD_FILES=`cat ad_files`
1743     for i in $AD_FILES ; do
1744     echo " \\" >> $MAKEFILE
1745 edhill 1.71 printf " $i" >> $MAKEFILE
1746 edhill 1.14 done
1747     echo >> $MAKEFILE
1748 edhill 1.21 rm -f ad_files
1749 edhill 1.14
1750     cat >>$MAKEFILE <<EOF
1751    
1752 edhill 1.16 # ... AD ...
1753 edhill 1.23 adall: ad_taf
1754     adtaf: ad_taf_output.f
1755     adtamc: ad_tamc_output.f
1756 edhill 1.21
1757 heimbach 1.48 ad_input_code.f: \$(AD_FILES) \$(HEADERFILES)
1758 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
1759 edhill 1.23 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
1760 adcroft 1.44 -rm -f ad_config.template
1761 edhill 1.22 @make \$(F77FILES)
1762     @make \$(AD_FLOW_FILES)
1763     cat \$(AD_FLOW_FILES) \$(AD_FILES) > ad_input_code.f
1764    
1765 edhill 1.14 ad_taf_output.f: ad_input_code.f
1766 heimbach 1.37 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f
1767 adcroft 1.44 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f
1768 heimbach 1.37
1769     adtafonly:
1770 edhill 1.17 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f
1771 adcroft 1.44 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f
1772 edhill 1.14
1773     ad_taf: ad_taf_output.o \$(OBJFILES)
1774 edhill 1.21 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
1775 edhill 1.14
1776     ad_tamc_output.f: ad_input_code.f
1777 edhill 1.17 \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.f
1778 adcroft 1.44 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.f
1779 edhill 1.14
1780     ad_tamc: ad_tamc_output.o \$(OBJFILES)
1781 edhill 1.21 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
1782 edhill 1.14
1783    
1784 edhill 1.19 # ... FTL ...
1785 edhill 1.23 ftlall: ftl_taf
1786     ftltaf: ftl_taf_output.f
1787     ftltamc: ftl_tamc_output.f
1788 edhill 1.21
1789 heimbach 1.48 ftl_input_code.f: \$(AD_FILES) \$(HEADERFILES)
1790 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
1791 edhill 1.23 cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
1792 adcroft 1.44 -rm -f ftl_config.template
1793 edhill 1.23 @make \$(F77FILES)
1794 edhill 1.22 @make \$(AD_FLOW_FILES)
1795     cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.f
1796    
1797     ftl_taf_output.f: ftl_input_code.f
1798     \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f
1799 adcroft 1.44 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f
1800 edhill 1.14
1801 heimbach 1.40 ftltafonly:
1802     \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f
1803 adcroft 1.44 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f
1804 heimbach 1.40
1805 edhill 1.19 ftl_taf: ftl_taf_output.o \$(OBJFILES)
1806 edhill 1.21 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
1807 edhill 1.14
1808 edhill 1.22 ftl_tamc_output.f: ftl_input_code.f
1809     \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.f
1810 adcroft 1.44 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.f
1811 edhill 1.16
1812 edhill 1.19 ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
1813 edhill 1.21 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
1814 edhill 1.16
1815    
1816     # ... SVD ...
1817 heimbach 1.40 svdtaf: ad_taf_output.f ftl_taf_output.f
1818     svdall: svd_taf
1819 edhill 1.16
1820 heimbach 1.40 svd_taf: ad_taf_output.o ftl_taf_output.o \$(OBJFILES)
1821     \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
1822 edhill 1.14
1823    
1824     #=========================================
1825 edhill 1.1
1826     EOF
1827 edhill 1.7
1828     if test "x$EXEHOOK" != x ; then
1829     printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE
1830     fi
1831 edhill 1.1
1832     echo " Making list of \"exceptions\" that need \".p\" files"
1833     for i in $KPPFILES ; do
1834     base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
1835     RETVAL=$?
1836     if test "x$RETVAL" != x0 ; then
1837     echo "Error: unable to add file \"$i\" to the exceptions list"
1838     fi
1839     echo "$base.f: $base.p" >> $MAKEFILE
1840     done
1841    
1842     echo " Making list of NOOPTFILES"
1843     for i in $NOOPTFILES ; do
1844     base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
1845     RETVAL=$?
1846     if test "x$RETVAL" != x0 ; then
1847     echo "Error: unable to add file \"$i\" to the exceptions list"
1848     fi
1849     echo "$base.o: $base.f" >> $MAKEFILE
1850 edhill 1.2 printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE
1851 edhill 1.1 done
1852    
1853     echo " Add rules for links"
1854     cat srclinks.tmp >> $MAKEFILE
1855     rm -f srclinks.tmp
1856    
1857     echo " Adding makedepend marker"
1858 edhill 1.2 printf "\n\n# DO NOT DELETE\n" >> $MAKEFILE
1859 edhill 1.1
1860 edhill 1.2 printf "\n=== Done ===\n"
1861 adcroft 1.47
1862     # Create special header files
1863 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"
1864 adcroft 1.47 if test ! -f $PACKAGES_DOT_H ; then
1865     mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
1866     else
1867 edhill 1.61 cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H > /dev/null 2>&1
1868 adcroft 1.47 RETVAL=$?
1869     if test "x$RETVAL" = x0 ; then
1870     rm -f $PACKAGES_DOT_H".tmp"
1871     else
1872     mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"
1873     mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
1874     fi
1875     fi
1876     if test ! -f AD_CONFIG.h ; then
1877 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
1878 adcroft 1.47 fi
1879 edhill 1.5
1880    
1881     # Write the "state" for future records
1882     if test "x$DUMPSTATE" != xf ; then
1883 edhill 1.71 printf "" > genmake_state
1884 edhill 1.5 for i in $gm_state ; do
1885     t1="t2=\$$i"
1886     eval $t1
1887 edhill 1.12 echo "$i='$t2'" >> genmake_state
1888 edhill 1.5 done
1889     fi

  ViewVC Help
Powered by ViewVC 1.1.22