/[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.72 - (hide annotations) (download)
Fri Mar 12 15:50:06 2004 UTC (15 years, 4 months ago) by edhill
Branch: MAIN
Changes since 1.71: +5 -3 lines
 o more small fixes for CRAY SV1 systems

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

  ViewVC Help
Powered by ViewVC 1.1.22