/[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.73 - (hide annotations) (download)
Tue Mar 16 18:20:34 2004 UTC (15 years, 4 months ago) by edhill
Branch: MAIN
Changes since 1.72: +6 -3 lines
 o fix for arguments requiring quotes to protect them from the shell
   eg: -mods="../a ../b" becomes " -mods=../a ../b" in the Makefile

1 edhill 1.49 #! /usr/bin/env bash
2 edhill 1.1 #
3 edhill 1.73 # $Header: /u/u3/gcmpack/MITgcm/tools/genmake2,v 1.72 2004/03/12 15:50:06 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.73 G2ARGS=
590 edhill 1.71 BASH=
591 edhill 1.1 PWD=`pwd`
592     MAKE=make
593 edhill 1.15 AWK=awk
594 edhill 1.1 THISHOSTNAME=`hostname`
595     THISCWD=`pwd`
596     THISDATE=`date`
597     MACHINE=`uname -a`
598 edhill 1.7 EXECUTABLE=
599     EXEHOOK=
600     EXEDIR=
601 edhill 1.12 PACKAGES_CONF=
602     IEEE=
603     if test "x$MITGCM_IEEE" != x ; then
604     IEEE=$MITGCM_IEEE
605     fi
606 edhill 1.1
607 edhill 1.14 AUTODIFF_PKG_USED=f
608     AD_OPTFILE=
609 edhill 1.17 TAF=
610     AD_TAF_FLAGS=
611     FTL_TAF_FLAGS=
612     SVD_TAF_FLAGS=
613     TAF_EXTRA=
614     TAMC=
615     AD_TAMC_FLAGS=
616     FTL_TAF_FLAGS=
617     SVD_TAMC_FLAGS=
618     TAMC_EXTRA=
619    
620 edhill 1.14
621 edhill 1.5 # The following state can be set directly by command-line switches
622 edhill 1.41 gm_s1="OPTFILE PDEPEND PDEFAULT MAKEFILE PLATFORM ROOTDIR MODS DISABLE ENABLE"
623 edhill 1.60 gm_s2="FC CPP IEEE MPI JAM DUMPSTATE STANDARDDIRS"
624 edhill 1.5
625     # The following state is not directly set by command-line switches
626     gm_s3="LN S64 KPP LINK PACKAGES MAKEDEPEND PDEPEND PDEFAULT INCLUDES FFLAGS FOPTIM "
627     gm_s4="CFLAGS KFLAGS1 KFLAGS2 LIBS KPPFILES NOOPTFILES NOOPTFLAGS"
628     gm_s5="TOOLSDIR SOURCEDIRS INCLUDEDIRS PWD MAKE THISHOSTNAME THISDATE MACHINE"
629 edhill 1.12 gm_s6="EXECUTABLE EXEHOOK EXEDIR PACKAGES_CONF"
630 edhill 1.29 gm_s7="HAVE_SYSTEM HAVE_FDATE FC_NAMEMANGLE"
631 edhill 1.5
632 edhill 1.14 # The following are all related to adjoint/tangent-linear stuff
633 edhill 1.29 gm_s10="AUTODIFF_PKG_USED AD_OPTFILE TAMC TAF AD_TAMC_FLAGS AD_TAF_FLAGS"
634     gm_s11="FTL_TAMC_FLAGS FTL_TAF_FLAGS SVD_TAMC_FLAGS SVD_TAF_FLAGS"
635     gm_s12="TAF_EXTRA TAMC_EXTRA"
636 edhill 1.14
637 edhill 1.29 gm_state="COMMANDL $gm_s1 $gm_s2 $gm_s3 $gm_s4 $gm_s5 $gm_s6 $gm_s7"
638     gm_state="$gm_state $gm_s10 $gm_s11 $gm_s12"
639 edhill 1.5
640 edhill 1.41 cat <<EOF
641    
642     GENMAKE :
643    
644     A program for GENerating MAKEfiles for the MITgcm project. For a
645     quick list of options, use "genmake -h" or for more detail see:
646    
647     http://mitgcm.org/devel_HOWTO/
648    
649     EOF
650 edhill 1.5
651 edhill 1.2 echo "=== Processing options files and arguments ==="
652 edhill 1.12 gm_local="genmake_local"
653     for i in . $MODS ; do
654     if test -r $i/$gm_local ; then
655 edhill 1.34 . $i/$gm_local
656 edhill 1.12 break
657     fi
658     done
659 edhill 1.71 printf " getting local config information: "
660 edhill 1.1 if test -e $gm_local ; then
661     echo "using $gm_local"
662 edhill 1.34 . $gm_local
663 edhill 1.2 # echo "DISABLE=$DISABLE"
664     # echo "ENABLE=$ENABLE"
665 edhill 1.1 else
666     echo "none found"
667     fi
668    
669     # echo "$0::$1:$2:$3:$4:$5:$6:$7:"
670 edhill 1.2 #OPTIONS=
671     #n=0
672     #for i ; do
673     # echo "$i $n"
674     # setvar="OPTIONS[$n]='$i'"
675     # # echo " $setvar"
676     # eval "$setvar"
677     # n=$(( $n + 1 ))
678     #done
679     #parse_options
680     ac_prev=
681     for ac_option ; do
682    
683 edhill 1.73 G2ARGS="$G2ARGS \"$ac_option\""
684    
685 edhill 1.2 # If the previous option needs an argument, assign it.
686     if test -n "$ac_prev"; then
687     eval "$ac_prev=\$ac_option"
688     ac_prev=
689     continue
690     fi
691    
692     ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
693    
694     case $ac_option in
695    
696     -help | --help | -h | --h)
697     usage ;;
698    
699     -nooptfile | --nooptfile)
700     OPTFILE="NONE" ;;
701     -optfile | --optfile | -of | --of)
702 edhill 1.4 ac_prev=OPTFILE ;;
703 edhill 1.2 -optfile=* | --optfile=* | -of=* | --of=*)
704     OPTFILE=$ac_optarg ;;
705    
706 edhill 1.50 -adoptfile | --adoptfile | -adof | --adof)
707 edhill 1.14 ac_prev=AD_OPTFILE ;;
708     -adoptfile=* | --adoptfile=* | -adof=* | --adof=*)
709     AD_OPTFILE=$ac_optarg ;;
710    
711 edhill 1.2 -pdepend | --pdepend)
712 edhill 1.4 ac_prev=PDEPEND ;;
713 edhill 1.2 -pdepend=* | --pdepend=*)
714     PDEPEND=$ac_optarg ;;
715    
716     -pdefault | --pdefault)
717 edhill 1.4 ac_prev=PDEFAULT ;;
718 edhill 1.2 -pdefault=* | --pdefault=*)
719     PDEFAULT=$ac_optarg ;;
720    
721 edhill 1.6 -make | --make | -m | --m)
722     ac_prev=MAKE ;;
723     -make=* | --make=* | -m=* | --m=*)
724     MAKE=$ac_optarg ;;
725 edhill 1.69
726 edhill 1.71 -bash | --bash)
727     ac_prev=BASH ;;
728     -bash=* | --bash=*)
729     BASH=$ac_optarg ;;
730    
731 edhill 1.69 -makedepend | --makedepend | -md | --md)
732     ac_prev=MAKEDEPEND ;;
733     -makedepend=* | --makedepend=* | -md=* | --md=*)
734     MAKEDEPEND=$ac_optarg ;;
735 edhill 1.6
736     -makefile | --makefile | -ma | --ma)
737 edhill 1.4 ac_prev=MAKEFILE ;;
738 edhill 1.6 -makefile=* | --makefile=* | -ma=* | --ma=*)
739 edhill 1.2 MAKEFILE=$ac_optarg ;;
740    
741 edhill 1.41 -platform | --platform | -pl | --pl | -platform=* | --platform=* | -pl=* | --pl=*)
742     echo "ERROR: The platform option has been removed. Please specify"
743     echo " the build options using the \"optfile\" mechanism."
744     echo
745     usage
746     ;;
747 edhill 1.2
748     -rootdir | --rootdir | -rd | --rd)
749 edhill 1.4 ac_prev=ROOTDIR ;;
750 edhill 1.2 -rootdir=* | --rootdir=* | -rd=* | --rd=*)
751     ROOTDIR=$ac_optarg ;;
752    
753     -mods | --mods | -mo | --mo)
754 edhill 1.4 ac_prev=MODS ;;
755 edhill 1.2 -mods=* | --mods=* | -mo=* | --mo=*)
756     MODS=$ac_optarg ;;
757    
758     -disable | --disable)
759 edhill 1.4 ac_prev=DISABLE ;;
760 edhill 1.2 -disable=* | --disable=*)
761     DISABLE=$ac_optarg ;;
762    
763     -enable | --enable)
764 edhill 1.4 ac_prev=ENABLE ;;
765 edhill 1.2 -enable=* | --enable=*)
766     ENABLE=$ac_optarg ;;
767    
768 edhill 1.12 -standarddirs | --standarddirs)
769     ac_prev=STANDARDDIRS ;;
770     -standarddirs=* | --standarddirs=*)
771     STANDARDDIRS=$ac_optarg ;;
772    
773 edhill 1.2 # -cpp | --cpp)
774     # ac_prev=cpp ;;
775     # -cpp=* | --cpp=*)
776     # CPP=$ac_optarg ;;
777    
778     -fortran | --fortran | -fc | --fc)
779 edhill 1.4 ac_prev=FC ;;
780 edhill 1.2 -fc=* | --fc=*)
781     FC=$ac_optarg ;;
782    
783     -ieee | --ieee)
784 edhill 1.12 IEEE=true ;;
785 edhill 1.2 -noieee | --noieee)
786 edhill 1.12 IEEE= ;;
787 adcroft 1.67
788     -mpi | --mpi)
789     MPI=true ;;
790     -mpi=* | --mpi=*)
791     MPIPATH=$ac_optarg
792     MPI=true ;;
793 edhill 1.2
794 edhill 1.41 # -jam | --jam)
795     # JAM=1 ;;
796     # -nojam | --nojam)
797     # JAM=0 ;;
798 edhill 1.2
799 edhill 1.5 -ds | --ds)
800     DUMPSTATE=t ;;
801    
802 edhill 1.17 -taf_extra | --taf_extra)
803     ac_prev=TAF_EXTRA ;;
804     -taf_extra=* | --taf_extra=*)
805     TAF_EXTRA=$ac_optarg ;;
806    
807     -tamc_extra | --tamc_extra)
808     ac_prev=TAMC_EXTRA ;;
809     -tamc_extra=* | --tamc_extra=*)
810     TAMC_EXTRA=$ac_optarg ;;
811    
812 edhill 1.2 -*)
813     echo "Error: unrecognized option: "$ac_option
814     usage
815     ;;
816    
817     *)
818     echo "Error: unrecognized argument: "$ac_option
819     usage
820     ;;
821    
822     esac
823    
824 edhill 1.1 done
825    
826 edhill 1.12 if test -f ./.genmakerc ; then
827     echo
828     echo "WARNING: genmake2 has detected a copy of the old-style \"./.genmakerc\""
829     echo " file. This file format is no longer supported. Please see:"
830     echo
831     echo " http://mitgcm.org/devel_HOWTO/"
832     echo
833     echo " for directions on how to setup and use the new \"genmake2\" input"
834     echo " files and send an email to MITgcm-support@mitgcm.org if you want help."
835     echo
836     fi
837    
838 edhill 1.11 if test "x${ROOTDIR}" = x ; then
839     if test "${PWD##/*/}" = "bin" -a -d ../model -a -d ../eesup -a -d ../pkg ; then
840     ROOTDIR=".."
841     else
842     for d in . .. ../.. ../../.. ../../../.. ../../../../.. ; do
843     if [ -d "$d/model" -a -d "$d/eesupp" -a -d "$d/pkg" ]; then
844     ROOTDIR=$d
845 edhill 1.71 printf "Warning: ROOTDIR was not specified but there appears to be"
846 edhill 1.11 echo " a copy of MITgcm at \"$ROOTDIR\" so we'll try it."
847     break
848     fi
849     done
850     fi
851     fi
852     if test "x${ROOTDIR}" = x ; then
853     echo "Error: Cannot determine ROOTDIR for MITgcm code."
854     echo " Please specify a ROOTDIR using either an options "
855     echo " file or a command-line option."
856     exit 1
857     fi
858     if test ! -d ${ROOTDIR} ; then
859     echo "Error: the specified ROOTDIR (\"$ROOTDIR\") does not exist!"
860     exit 1
861     fi
862    
863 edhill 1.1 echo " getting OPTFILE information: "
864     if test "x${OPTFILE}" = x ; then
865 edhill 1.11 if test "x$MITGCM_OF" = x ; then
866     echo "Warning: no OPTFILE specified so we'll look for possible settings"
867     printf "\n=== Searching for possible settings for OPTFILE ===\n"
868     find_possible_configs
869 edhill 1.1 else
870 edhill 1.11 OPTFILE=$MITGCM_OF
871     fi
872     fi
873     if test "x$OPTFILE" != xNONE ; then
874     if test -f "$OPTFILE" -a -r "$OPTFILE" ; then
875     echo " using OPTFILE=\"$OPTFILE\""
876 edhill 1.34 . "$OPTFILE"
877 edhill 1.11 RETVAL=$?
878     if test "x$RETVAL" != x0 ; then
879 edhill 1.71 printf "Error: failed to source OPTFILE \"$OPTFILE\""
880 edhill 1.11 echo "--please check that variable syntax is bash-compatible"
881 edhill 1.1 exit 1
882     fi
883 edhill 1.11 if test "x$DUMPSTATE" != xf ; then
884 edhill 1.12 cp -f $OPTFILE "genmake_optfile"
885 edhill 1.11 fi
886     else
887     echo "Error: can't read OPTFILE=\"$OPTFILE\""
888     exit 1
889 edhill 1.1 fi
890     fi
891 edhill 1.8
892 edhill 1.14 echo " getting AD_OPTFILE information: "
893     if test "x${AD_OPTFILE}" = x ; then
894     if test "x$MITGCM_AD_OF" = x ; then
895     AD_OPTFILE=$ROOTDIR/tools/adjoint_options/adjoint_default
896     else
897     AD_OPTFILE=$MITGCM_AD_OF
898     fi
899     fi
900     if test "x${AD_OPTFILE}" != xNONE ; then
901     if test -f "$AD_OPTFILE" -a -r "$AD_OPTFILE" ; then
902     echo " using AD_OPTFILE=\"$AD_OPTFILE\""
903 edhill 1.34 . "$AD_OPTFILE"
904 edhill 1.14 RETVAL=$?
905     if test "x$RETVAL" != x0 ; then
906 edhill 1.71 printf "Error: failed to source AD_OPTFILE \"$AD_OPTFILE\""
907 edhill 1.14 echo "--please check that variable syntax is bash-compatible"
908     exit 1
909     fi
910     if test "x$DUMPSTATE" != xf ; then
911     cp -f $AD_OPTFILE "genmake_ad_optfile"
912     fi
913     else
914     echo "Error: can't read AD_OPTFILE=\"$AD_OPTFILE\""
915     exit 1
916     fi
917     fi
918    
919 edhill 1.39 # Check that FC, LINK, CPP, S64, LN, and MAKE are defined. If not,
920     # either set defaults or complain and abort!
921 edhill 1.71 if test ! "x$BASH" = x ; then
922     # add a trailing space so that it works within the Makefile syntax (see below)
923     BASH="$BASH "
924     fi
925 edhill 1.8 if test "x$FC" = x ; then
926     cat <<EOF 1>&2
927    
928     Error: no Fortran compiler: please specify using one of the following:
929     1) within the options file ("FC=...") as specified by "-of=OPTFILE"
930     2) the "-fc=XXX" command-line option
931 edhill 1.12 3) the "./genmake_local" file
932 edhill 1.8 EOF
933     exit 1
934     fi
935     if test "x$LINK" = x ; then
936     LINK=$FC
937     fi
938 edhill 1.39 if test "x$MAKE" = x ; then
939     MAKE="make"
940     fi
941 edhill 1.63 if test "x$CPP" = x ; then
942     CPP=cpp
943     fi
944     #EH3 === UGLY ===
945     # The following an ugly little hack to check for $CPP in /lib/ and it
946     # should eventually be replaced with a more general function that
947     # searches a combo of the user's path and a list of "usual suspects"
948     # to find the correct location for binaries such as $CPP.
949     for i in " " "/lib/" ; do
950     echo "#define A a" | $i$CPP > test_cpp 2>&1 && CPP=$i$CPP
951     done
952     #EH3 === UGLY ===
953 edhill 1.13 echo "#define A a" | $CPP > test_cpp 2>&1
954 edhill 1.11 RETVAL=$?
955     if test "x$RETVAL" != x0 ; then
956 edhill 1.8 cat <<EOF 1>&2
957    
958 edhill 1.11 Error: C pre-processor "$CPP" failed the test case: please specify using:
959    
960 edhill 1.8 1) within the options file ("CPP=...") as specified by "-of=OPTFILE"
961 edhill 1.12 2) the "./genmake_local" file
962 edhill 1.30 3) with the CPP environment variable
963 edhill 1.11
964 edhill 1.8 EOF
965     exit 1
966 edhill 1.11 else
967     rm -f test_cpp
968 edhill 1.8 fi
969 edhill 1.11 if test "x$MAKEDEPEND" = x ; then
970     MAKEDEPEND=makedepend
971 edhill 1.8 fi
972 edhill 1.35 if test "x$LN" = x ; then
973     LN="ln -s"
974     fi
975     echo "test" > genmake_test_ln
976     $LN genmake_test_ln genmake_tlink
977     RETVAL=$?
978     if test "x$RETVAL" != x0 ; then
979     cat <<EOF 1>&2
980 edhill 1.29
981 edhill 1.35 Error: The command "ln -s" failed -- please specify a working soft-link
982     command in the optfile.
983    
984     EOF
985     exit 1
986     fi
987     rm -f genmake_test_ln genmake_tlink
988 edhill 1.29
989 adcroft 1.67 if test ! "x$MPI" = x ; then
990     echo " Turning on MPI cpp macros"
991 adcroft 1.68 DEFINES="$DEFINES -DALLOW_USE_MPI -DALWAYS_USE_MPI"
992 adcroft 1.67 fi
993 edhill 1.39
994 edhill 1.29 printf "\n=== Checking system libraries ===\n"
995 edhill 1.71 printf " Do we have the system() command using $FC... "
996 edhill 1.29 cat > genmake_tcomp.f <<EOF
997     program hello
998     call system('echo hi')
999     end
1000     EOF
1001     $FC $FFLAGS $DEFINES -o genmake_tcomp genmake_tcomp.f > genmake_tcomp.log 2>&1
1002     RETVAL=$?
1003     if test "x$RETVAL" = x0 ; then
1004     HAVE_SYSTEM=t
1005     DEFINES="$DEFINES -DHAVE_SYSTEM"
1006     echo "yes"
1007     else
1008     HAVE_SYSTEM=
1009     echo "no"
1010     fi
1011     rm -f genmake_tcomp*
1012    
1013 edhill 1.71 printf " Do we have the fdate() command using $FC... "
1014 edhill 1.29 cat > genmake_tcomp.f <<EOF
1015     program hello
1016     CHARACTER(128) string
1017     string = ' '
1018     call fdate( string )
1019     print *, string
1020     end
1021     EOF
1022     $FC $FFLAGS $DEFINES -o genmake_tcomp genmake_tcomp.f > genmake_tcomp.log 2>&1
1023     RETVAL=$?
1024     if test "x$RETVAL" = x0 ; then
1025     HAVE_FDATE=t
1026     DEFINES="$DEFINES -DHAVE_FDATE"
1027     echo "yes"
1028     else
1029     HAVE_FDATE=
1030     echo "no"
1031     fi
1032     rm -f genmake_tcomp*
1033    
1034 edhill 1.71 printf " Can we call simple C routines (here, \"cloc()\") using $FC... "
1035 edhill 1.39 check_HAVE_CLOC
1036     if test "x$HAVE_CLOC" != x ; then
1037     echo "yes"
1038     else
1039     echo "no"
1040 edhill 1.29 fi
1041 edhill 1.39 rm -f genmake_t*
1042 edhill 1.29
1043 edhill 1.71 printf " Can we create NetCDF-enabled binaries... "
1044 edhill 1.60 check_netcdf_libs
1045     if test "x$HAVE_NETCDF" != x ; then
1046     echo "yes"
1047     else
1048     echo "no"
1049     fi
1050    
1051 edhill 1.8
1052 edhill 1.2 printf "\n=== Setting defaults ===\n"
1053 edhill 1.71 printf " Adding MODS directories: "
1054 edhill 1.1 for d in $MODS ; do
1055     if test ! -d $d ; then
1056 edhill 1.2 echo
1057     echo "Error: MODS directory \"$d\" not found!"
1058 edhill 1.1 exit 1
1059     else
1060 edhill 1.71 printf " $d"
1061 edhill 1.1 SOURCEDIRS="$SOURCEDIRS $d"
1062     INCLUDEDIRS="$INCLUDEDIRS $d"
1063     fi
1064     done
1065     echo
1066    
1067     if test "x$MAKEFILE" = x ; then
1068     MAKEFILE="Makefile"
1069     fi
1070     if test "x${PLATFORM}" = x ; then
1071     PLATFORM=$p_PLATFORM
1072     fi
1073    
1074     if test "x${EXEDIR}" = x ; then
1075     if test "${PWD##/*/}" = "bin" -a -d ../exe -a $ROOTDIR = .. ; then
1076     EXEDIR=../exe
1077     else
1078     EXEDIR=.
1079     fi
1080     fi
1081     if test ! -d ${EXEDIR} ; then
1082     echo "Error: the specified EXEDIR (\"$EXEDIR\") does not exist!"
1083     exit 1
1084     fi
1085    
1086     if test "x${TOOLSDIR}" = x ; then
1087     TOOLSDIR="$ROOTDIR/tools"
1088     fi
1089     if test ! -d ${TOOLSDIR} ; then
1090 cnh 1.65 echo "Error: the specified TOOLSDIR (\"$TOOLSDIR\") does not exist!"
1091 edhill 1.1 exit 1
1092     fi
1093 edhill 1.11 if test "x$S64" = x ; then
1094     S64='$(TOOLSDIR)/set64bitConst.sh'
1095     fi
1096 adcroft 1.44 THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`
1097 edhill 1.1
1098     EXECUTABLE=${EXECUTABLE:-mitgcmuv}
1099    
1100     # We have a special set of source files in eesupp/src which are
1101     # generated from some template source files. We'll make them first so
1102     # they appear as regular source code
1103     if test -r $ROOTDIR"/eesupp/src/Makefile" ; then
1104     echo " Making source files in eesupp from templates"
1105 edhill 1.36 ( cd $ROOTDIR"/eesupp/src/" && $MAKE ) > make_eesupp.errors 2>&1
1106 edhill 1.1 RETVAL=$?
1107 edhill 1.2 if test "x${RETVAL}" = x0 ; then
1108 edhill 1.1 rm -f make_eesupp.errors
1109     else
1110     echo "Error: problem encountered while building source files in eesupp:"
1111 edhill 1.62 cat make_eesupp.errors 1>&2
1112 edhill 1.1 exit 1
1113 afe 1.58 fi
1114     fi
1115    
1116     #same for exch2
1117     if test -r $ROOTDIR"/pkg/exch2/Makefile" ; then
1118     echo " Making source files in exch2 from templates"
1119     ( cd $ROOTDIR"/pkg/exch2/" && $MAKE ) > make_exch2.errors 2>&1
1120     RETVAL=$?
1121     if test "x${RETVAL}" = x0 ; then
1122     rm -f make_exch2.errors
1123     else
1124 edhill 1.59 echo "Error: problem encountered while building source files in exch2:"
1125 edhill 1.62 cat make_exch2.errors 1>&2
1126 afe 1.58 exit 1
1127 edhill 1.1 fi
1128     fi
1129    
1130 edhill 1.2 printf "\n=== Determining package settings ===\n"
1131 edhill 1.1 if test "x${PDEPEND}" = x ; then
1132     tmp=$ROOTDIR"/pkg/pkg_depend"
1133     if test -r $tmp ; then
1134     PDEPEND=$tmp
1135     else
1136     echo "Warning: No package dependency information was specified."
1137     echo " Please check that ROOTDIR/pkg/pkg_depend exists."
1138     fi
1139     else
1140     if test ! -r ${PDEPEND} ; then
1141     echo "Error: can't read package dependency info from PDEPEND=\"$PDEPEND\""
1142     exit 1
1143     fi
1144     fi
1145     echo " getting package dependency info from $PDEPEND"
1146     # Strip the comments and then convert the dependency file into
1147     # two arrays: PNAME, DNAME
1148     cat $PDEPEND | sed -e 's/#.*$//g' \
1149 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}' \
1150 edhill 1.1 > ./.pd_tmp
1151     RETVAL=$?
1152     if test ! "x${RETVAL}" = x0 ; then
1153     echo "Error: unable to parse package dependencies -- please check PDEPEND=\"$PDEPEND\""
1154     exit 1
1155     fi
1156 edhill 1.34 . ./.pd_tmp
1157 edhill 1.1 rm -f ./.pd_tmp
1158    
1159 edhill 1.12 # Search for default packages. Note that a "$ROOTDIR/pkg/pkg_groups"
1160     # file should eventually be added so that, for convenience, one can
1161     # specify groups of packages using names like "ocean" and "atmosphere".
1162 edhill 1.41 echo " checking default package list: "
1163 edhill 1.1 if test "x${PDEFAULT}" = x ; then
1164 edhill 1.12 for i in "." $MODS ; do
1165     if test -r $i"/packages.conf" ; then
1166     PDEFAULT=$i"/packages.conf"
1167     break
1168     fi
1169     done
1170     fi
1171     if test "x${PDEFAULT}" = x ; then
1172 edhill 1.1 PDEFAULT="$ROOTDIR/pkg/pkg_default"
1173     fi
1174     if test "x${PDEFAULT}" = xNONE ; then
1175 edhill 1.41 echo " default packages file disabled"
1176 edhill 1.1 else
1177     if test ! -r $PDEFAULT ; then
1178     echo "Warning: can't read default packages from PDEFAULT=\"$PDEFAULT\""
1179     else
1180 edhill 1.41 echo " using PDEFAULT=\"$PDEFAULT\""
1181 edhill 1.1 # Strip the comments and add all the names
1182 edhill 1.15 def=`cat $PDEFAULT | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
1183 edhill 1.1 RETVAL=$?
1184     if test "x${RETVAL}" != x0 ; then
1185 edhill 1.71 printf "Error: can't parse default package list "
1186 edhill 1.1 echo "-- please check PDEFAULT=\"$PDEFAULT\""
1187     exit 1
1188     fi
1189     for i in $def ; do
1190     PACKAGES="$PACKAGES $i"
1191     done
1192 edhill 1.12 echo " before group expansion packages are: $PACKAGES"
1193     expand_pkg_groups
1194     echo " after group expansion packages are: $PACKAGES"
1195 edhill 1.1 fi
1196     fi
1197    
1198     echo " applying DISABLE settings"
1199     pack=
1200     for p in $PACKAGES ; do
1201     addit="t"
1202     for d in $DISABLE ; do
1203     if test "x$p" = "x$d" ; then
1204     addit="f"
1205     fi
1206     done
1207     if test "x$addit" = xt ; then
1208     pack="$pack $p"
1209     fi
1210     done
1211     PACKAGES="$pack"
1212     echo " applying ENABLE settings"
1213 edhill 1.12 echo "" > ./.tmp_pack
1214 edhill 1.1 PACKAGES="$PACKAGES $ENABLE"
1215     for i in $PACKAGES ; do
1216     if test ! -d "$ROOTDIR/pkg/$i" ; then
1217     echo "Error: can't find package $i at \"$ROOTDIR/pkg/$i\""
1218     exit 1
1219     fi
1220     echo $i >> ./.tmp_pack
1221     done
1222     pack=`cat ./.tmp_pack | sort | uniq`
1223     rm -f ./.tmp_pack
1224     PACKAGES=
1225     for i in $pack ; do
1226     PACKAGES="$PACKAGES $i"
1227     done
1228     echo " packages are: $PACKAGES"
1229    
1230     echo " applying package dependency rules"
1231     ck=
1232     while test "x$ck" != xtt ; do
1233     i=0
1234 edhill 1.2 # rtot=${#PNAME[@]}
1235     rtot=$nname
1236 edhill 1.1 while test $i -lt $rtot ; do
1237    
1238     # Is $pname in the current $PACKAGES list?
1239 edhill 1.2 # pname=${PNAME[$i]}
1240     tmp="pname=\"\$PNAME_$i\""
1241     eval $tmp
1242 edhill 1.1 pin="f"
1243     for p in $PACKAGES ; do
1244     if test "x$p" = "x$pname" ; then
1245     pin="t"
1246     fi
1247     done
1248    
1249     # Is the DNAME entry a (+) or (-) rule ?
1250 edhill 1.2 tmp="dname=\"\$DNAME_$i\""
1251     eval $tmp
1252 edhill 1.1 plus="-"
1253 edhill 1.2 echo $dname | grep '^+' > /dev/null 2>&1
1254 edhill 1.1 RETVAL=$?
1255     if test "x$RETVAL" = x0 ; then
1256     plus="+"
1257     fi
1258    
1259     # Is $dname in the current $PACKAGES list?
1260 edhill 1.2 dname=`echo $dname | sed -e 's/^[+-]//'`
1261 edhill 1.1 din="f"
1262     for p in $PACKAGES ; do
1263     if test "x$p" = "x$dname" ; then
1264     din="t"
1265     fi
1266     done
1267    
1268     # Do we need to add $dname according to the dependency rules?
1269     if test "x$pin" = xt -a "x$plus" = "x+" -a "x$din" = xf ; then
1270     in_dis="f"
1271     for dis in $DISABLE ; do
1272     if test "x$dis" = "x$dname" ; then
1273     in_dis="t"
1274     fi
1275     done
1276     if test "x$in_dis" = xt ; then
1277     echo "Error: can't satisfy package dependencies:"
1278     echo " \"$dname\" is required by the dependency rules"
1279     echo " but is disallowed by the DISABLE settings"
1280     exit 1
1281     else
1282     PACKAGES="$PACKAGES $dname"
1283     ck=
1284     fi
1285     fi
1286    
1287     # Do we need to get rid of $dname according to the dependency rules?
1288     if test "x$pin" = xt -a "x$plus" = "x-" -a "x$din" = xt; then
1289     echo "Error: can't satisfy package dependencies:"
1290     echo " \"$pname\" was requested but is disallowed by"
1291     echo " the dependency rules for \"$dname\""
1292     exit 1
1293     fi
1294     i=$(( $i + 1 ))
1295     done
1296     ck=$ck"t"
1297     done
1298     echo " packages are: $PACKAGES"
1299     for i in $PACKAGES ; do
1300     adr="$ROOTDIR/pkg/$i"
1301     if test -d $adr ; then
1302     SOURCEDIRS="$SOURCEDIRS $adr"
1303     INCLUDEDIRS="$INCLUDEDIRS $adr"
1304 edhill 1.14 if test "x$i" = xautodiff ; then
1305     AUTODIFF_PKG_USED=t
1306     fi
1307 edhill 1.1 else
1308     echo "Error: the directory \"$adr\" for package $i doesn't exist"
1309     exit 1
1310     fi
1311     done
1312    
1313 edhill 1.62 # Build MNC templates and check for ability to build and use NetCDF
1314 edhill 1.60 echo $PACKAGES | grep ' mnc ' > /dev/null 2>&1
1315     RETVAL=$?
1316 edhill 1.62 if test "x$RETVAL" = x0 ; then
1317     ( cd $ROOTDIR"/pkg/mnc" && $MAKE templates ) > make_mnc.errors 2>&1
1318     RETVAL=$?
1319     if test "x${RETVAL}" = x0 ; then
1320     rm -f make_mnc.errors
1321     else
1322     echo "Error: problem encountered while building source files in pkg/mnc:"
1323     cat make_mnc.errors 1>&2
1324     exit 1
1325     fi
1326 edhill 1.64 if test "x$HAVE_NETCDF" != xt ; then
1327 edhill 1.62 cat <<EOF
1328 edhill 1.60
1329     WARNING: the "mnc" package has been enabled but tests failed to
1330     compile and/or execute NetCDF applications. Please check that:
1331    
1332     1) NetCDF is installed for your compiler and
1333     2) the LIBS variable (within the 'optfile") specifies the correct
1334     NetCDF library to link against.
1335    
1336     EOF
1337 edhill 1.62 fi
1338 edhill 1.60 fi
1339 edhill 1.1
1340 edhill 1.12 # Create a list of #define and #undef to enable/disable packages
1341     PACKAGES_DOT_H=PACKAGES_CONFIG.h
1342 edhill 1.1 # The following UGLY HACK sets multiple "#undef"s and it needs to go
1343     # away. On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h
1344     # file would eventually be split up so that all package-related #define
1345     # statements could be separated and handled only by genmake.
1346     names=`ls -1 "$ROOTDIR/pkg"`
1347     all_pack=
1348 adcroft 1.44 DISABLED_PACKAGES=
1349 edhill 1.1 for n in $names ; do
1350     if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
1351     has_pack="f"
1352     for pack in $PACKAGES ; do
1353     if test "x$pack" = "x$n" ; then
1354     has_pack="t"
1355     break
1356     fi
1357     done
1358     if test "x$has_pack" = xf ; then
1359 edhill 1.15 undef=`echo "ALLOW_$n" | $AWK '{print toupper($0)}'`
1360 adcroft 1.44 DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
1361 edhill 1.1 fi
1362     fi
1363     done
1364 adcroft 1.44 ENABLED_PACKAGES=
1365 edhill 1.1 for i in $PACKAGES ; do
1366 edhill 1.15 def=`echo "ALLOW_$i" | $AWK '{print toupper($0)}'`
1367 adcroft 1.44 ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
1368 edhill 1.12 #eh3 DEFINES="$DEFINES -D$def"
1369 edhill 1.1
1370     #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
1371     case $i in
1372     aim_v23)
1373 adcroft 1.46 ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
1374 jmc 1.55 echo "Warning: ALLOW_AIM is set to enable aim_v23."
1375 edhill 1.1 ;;
1376     esac
1377     #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
1378    
1379     done
1380    
1381     echo " Adding STANDARDDIRS"
1382     BUILDDIR=${BUILDDIR:-.}
1383 edhill 1.57 if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
1384 edhill 1.12 STANDARDDIRS="eesupp model"
1385     fi
1386 edhill 1.57 if test "x$STANDARDDIRS" != x ; then
1387     for d in $STANDARDDIRS ; do
1388     adr="$ROOTDIR/$d/src"
1389     if test ! -d $adr ; then
1390     echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1391     echo " is correct and that you correctly specified the STANDARDDIRS option"
1392     exit 1
1393     else
1394     SOURCEDIRS="$SOURCEDIRS $adr"
1395     fi
1396     adr="$ROOTDIR/$d/inc"
1397     if test ! -d $adr ; then
1398     echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1399     echo " is correct and that you correctly specified the STANDARDDIRS option"
1400     exit 1
1401     else
1402     INCLUDEDIRS="$INCLUDEDIRS $adr"
1403     fi
1404     done
1405     fi
1406 edhill 1.1
1407 adcroft 1.52 echo " Searching for *OPTIONS.h files in order to warn about the presence"
1408     echo " of \"#define \"-type statements that are no longer allowed:"
1409 edhill 1.12 CPP_OPTIONS=
1410 adcroft 1.52 CPP_EEOPTIONS=
1411 edhill 1.12 spaths=". $INCLUDEDIRS"
1412 adcroft 1.52 names=`ls -1 "$ROOTDIR/pkg"`
1413 edhill 1.12 for i in $spaths ; do
1414     try="$i/CPP_OPTIONS.h"
1415 edhill 1.54 if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
1416 edhill 1.12 echo " found CPP_OPTIONS=\"$try\""
1417     CPP_OPTIONS="$try"
1418 adcroft 1.52 # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
1419     for n in $names ; do
1420     test_for_package_in_cpp_options $CPP_OPTIONS $n
1421     done
1422     fi
1423     try="$i/CPP_EEOPTIONS.h"
1424 edhill 1.54 if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
1425 adcroft 1.52 echo " found CPP_EEOPTIONS=\"$try\""
1426     # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
1427     #**** not yet enabled ****
1428     # test_for_mpi_in_cpp_eeoptions $try
1429     #**** not yet enabled ****
1430     CPP_EEOPTIONS="$try"
1431 edhill 1.12 fi
1432     done
1433     if test "x$CPP_OPTIONS" = x ; then
1434     echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
1435     exit 1
1436     fi
1437 edhill 1.1
1438 edhill 1.14 # Here, we build the list of files to be "run through" the adjoint
1439     # compiler.
1440     if test -f ./ad_files ; then
1441     rm -f ./ad_files
1442     fi
1443     echo " Creating the list of files for the adjoint compiler."
1444     for i in $SOURCEDIRS ; do
1445     list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
1446     for j in $list_files ; do
1447     cat $i/$j >> ad_files
1448     done
1449     done
1450 edhill 1.60
1451 edhill 1.14
1452 edhill 1.2 echo
1453     echo "=== Creating the Makefile ==="
1454 edhill 1.1 echo " setting INCLUDES"
1455     for i in $INCLUDEDIRS ; do
1456 edhill 1.12 if ! test -d $i ; then
1457     # INCLUDES="$INCLUDES -I$i"
1458     # else
1459 edhill 1.1 echo "Warning: can't find INCLUDEDIRS=\"$i\""
1460     fi
1461     done
1462    
1463     echo " Determining the list of source and include files"
1464     rm -rf .links.tmp
1465     mkdir .links.tmp
1466     echo "# This section creates symbolic links" > srclinks.tmp
1467     echo "" >> srclinks.tmp
1468 edhill 1.71 printf 'SRCFILES = ' > srclist.inc
1469     printf 'CSRCFILES = ' > csrclist.inc
1470     printf 'F90SRCFILES = ' > f90srclist.inc
1471     printf 'HEADERFILES = ' > hlist.inc
1472     printf 'AD_FLOW_FILES = ' > ad_flow_files.inc
1473 adcroft 1.9 alldirs="$SOURCEDIRS $INCLUDEDIRS ."
1474 edhill 1.1 for d in $alldirs ; do
1475     deplist=
1476 edhill 1.14 sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
1477 cnh 1.3 sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
1478 edhill 1.1 for sf in $sfiles ; do
1479     if test ! -r ".links.tmp/$sf" ; then
1480     if test -f "$d/$sf" ; then
1481 adcroft 1.44 case $d/$sf in
1482     ./$PACKAGES_DOT_H)
1483     ;;
1484     ./AD_CONFIG.h)
1485     ;;
1486     ./FC_NAMEMANGLE.h)
1487     ;;
1488     *)
1489     touch .links.tmp/$sf
1490     deplist="$deplist $sf"
1491     ;;
1492     esac
1493 edhill 1.15 extn=`echo $sf | $AWK -F '.' '{print $NF}'`
1494 edhill 1.1 case $extn in
1495     F)
1496     echo " \\" >> srclist.inc
1497 edhill 1.71 printf " $sf" >> srclist.inc
1498 edhill 1.1 ;;
1499 cnh 1.3 F90)
1500     echo " \\" >> f90srclist.inc
1501 edhill 1.71 printf " $sf" >> f90srclist.inc
1502 cnh 1.3 ;;
1503 edhill 1.1 c)
1504     echo " \\" >> csrclist.inc
1505 edhill 1.71 printf " $sf" >> csrclist.inc
1506 edhill 1.1 ;;
1507     h)
1508     echo " \\" >> hlist.inc
1509 edhill 1.71 printf " $sf" >> hlist.inc
1510 edhill 1.1 ;;
1511 edhill 1.14 flow)
1512     echo " \\" >> ad_flow_files.inc
1513 edhill 1.71 printf " $sf" >> ad_flow_files.inc
1514 edhill 1.14 ;;
1515 edhill 1.1 esac
1516     fi
1517     fi
1518     done
1519     if test "x$deplist" != x ; then
1520 edhill 1.2 echo "" >> srclinks.tmp
1521     echo "# These files are linked from $d" >> srclinks.tmp
1522 edhill 1.1 echo "$deplist :" >> srclinks.tmp
1523 edhill 1.2 printf "\t\$(LN) %s/\$@ \$@\n" $d >> srclinks.tmp
1524 edhill 1.1 fi
1525     done
1526     rm -rf .links.tmp
1527     echo "" >> srclist.inc
1528     echo "" >> csrclist.inc
1529 cnh 1.3 echo "" >> f90srclist.inc
1530 edhill 1.1 echo "" >> hlist.inc
1531 edhill 1.14 echo "" >> ad_flow_files.inc
1532 edhill 1.1
1533     if test -e $MAKEFILE ; then
1534     mv -f $MAKEFILE "$MAKEFILE.bak"
1535     fi
1536     echo " Writing makefile: $MAKEFILE"
1537     echo "# Multithreaded + multi-processing makefile for:" > $MAKEFILE
1538     echo "# $MACHINE" >> $MAKEFILE
1539     echo "# This makefile was generated automatically on" >> $MAKEFILE
1540     echo "# $THISDATE" >> $MAKEFILE
1541     echo "# by the command:" >> $MAKEFILE
1542 edhill 1.73 echo "# $0 $G2ARGS" >> $MAKEFILE
1543 edhill 1.1 echo "# executed by:" >> $MAKEFILE
1544     echo "# $USER@${THISHOSTNAME}:${THISCWD}" >> $MAKEFILE
1545 edhill 1.21
1546     EXE_AD=$EXECUTABLE"_ad"
1547     EXE_FTL=$EXECUTABLE"_ftl"
1548     EXE_SVD=$EXECUTABLE"_svd"
1549    
1550 edhill 1.1 cat >>$MAKEFILE <<EOF
1551 edhill 1.53 #
1552     # OPTFILE="$OPTFILE"
1553 edhill 1.1 #
1554     # BUILDDIR : Directory where object files are written
1555     # SOURCEDIRS : Directories containing the source (.F) files
1556     # INCLUDEDIRS : Directories containing the header-source (.h) files
1557     # EXEDIR : Directory where executable that is generated is written
1558     # EXECUTABLE : Full path of executable binary
1559     #
1560     # CPP : C-preprocessor command
1561     # INCLUDES : Directories searched for header files
1562     # DEFINES : Macro definitions for CPP
1563     # MAKEDEPEND : Dependency generator
1564     # KPP : Special preprocessor command (specific to platform)
1565     # KFLAGS : Flags for KPP
1566     # FC : Fortran compiler command
1567     # FFLAGS : Configuration/debugging options for FC
1568     # FOPTIM : Optimization options for FC
1569     # LINK : Command for link editor program
1570     # LIBS : Library flags /or/ additional optimization/debugging flags
1571    
1572     ROOTDIR = ${ROOTDIR}
1573     BUILDDIR = ${BUILDDIR}
1574     SOURCEDIRS = ${SOURCEDIRS}
1575     INCLUDEDIRS = ${INCLUDEDIRS}
1576     EXEDIR = ${EXEDIR}
1577     EXECUTABLE = \$(EXEDIR)/${EXECUTABLE}
1578     TOOLSDIR = ${TOOLSDIR}
1579    
1580 edhill 1.14 #eh3 new defines for the adjoint work
1581     AUTODIFF = ${ROOTDIR}/pkg/autodiff
1582 edhill 1.21 EXE_AD = ${EXE_AD}
1583     EXE_FTL = ${EXE_FTL}
1584     EXE_SVD = ${EXE_SVD}
1585 edhill 1.14
1586 adcroft 1.44 ENABLED_PACKAGES = ${ENABLED_PACKAGES}
1587     DISABLED_PACKAGES = ${DISABLED_PACKAGES}
1588    
1589 adcroft 1.52 # These files are created by Makefile
1590     SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h
1591    
1592 edhill 1.1 EOF
1593    
1594     # Note: figure out some way to add Hyades JAM libraries here
1595    
1596     cat >>$MAKEFILE <<EOF
1597     # Unix ln (link)
1598     LN = ${LN}
1599     # C preprocessor
1600     CPP = cat \$< | ${S64} | ${CPP}
1601     # Dependency generator
1602     MAKEDEPEND = ${MAKEDEPEND}
1603     # Special preprocessor (KAP on DECs, FPP on Crays)
1604     KPP = ${KPP}
1605     # Fortran compiler
1606     FC = ${FC}
1607 cnh 1.3 # Fortran compiler
1608     F90C = ${F90C}
1609 edhill 1.1 # Link editor
1610 edhill 1.70 LINK = ${LINK} ${LDADD}
1611 edhill 1.1
1612     # Defines for CPP
1613     DEFINES = ${DEFINES}
1614     # Includes for CPP
1615     INCLUDES = ${INCLUDES}
1616     # Flags for KPP
1617     KFLAGS1 = ${KFLAGS1}
1618     KFLAGS2 = ${KFLAGS2}
1619     # Optim./debug for FC
1620     FFLAGS = ${FFLAGS}
1621     FOPTIM = ${FOPTIM}
1622 cnh 1.3 # Optim./debug for FC
1623     F90FLAGS = ${F90FLAGS}
1624     F90OPTIM = ${F90OPTIM}
1625 edhill 1.1 # Flags for CC
1626     CFLAGS = ${CFLAGS}
1627     # Files that should not be optimized
1628     NOOPTFILES = ${NOOPTFILES}
1629     NOOPTFLAGS = ${NOOPTFLAGS}
1630     # Flags and libraries needed for linking
1631     LIBS = ${LIBS} \$(XLIBS)
1632 cnh 1.3 # Name of the Mekfile
1633     MAKEFILE=${MAKEFILE}
1634 edhill 1.1
1635     EOF
1636    
1637 edhill 1.14 cat srclist.inc >> $MAKEFILE
1638     cat csrclist.inc >> $MAKEFILE
1639     cat f90srclist.inc >> $MAKEFILE
1640     cat hlist.inc >> $MAKEFILE
1641     cat ad_flow_files.inc >> $MAKEFILE
1642     echo >> $MAKEFILE
1643 cnh 1.3 echo 'F77FILES = $(SRCFILES:.F=.f)' >> $MAKEFILE
1644     echo 'F90FILES = $(F90SRCFILES:.F90=.f90)' >> $MAKEFILE
1645     echo 'OBJFILES = $(SRCFILES:.F=.o) $(CSRCFILES:.c=.o) $(F90SRCFILES:.F90=.o)' >> $MAKEFILE
1646 edhill 1.1
1647 cnh 1.3 rm -f srclist.inc csrclist.inc hlist.inc flist.tmp clist.tmp f90srclist.inc
1648 edhill 1.14 rm -f ad_flow_files.inc
1649 edhill 1.1
1650     cat >>$MAKEFILE <<EOF
1651    
1652     .SUFFIXES:
1653 cnh 1.3 .SUFFIXES: .o .f .p .F .c .F90 .f90
1654 edhill 1.1
1655     all: \$(EXECUTABLE)
1656 adcroft 1.52 \$(EXECUTABLE): \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(OBJFILES)
1657 adcroft 1.44 @echo Creating \$@ ...
1658 edhill 1.1 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
1659     depend:
1660     @make links
1661     \$(MAKEDEPEND) -o .f \$(DEFINES) \$(INCLUDES) \$(SRCFILES)
1662 adcroft 1.44 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
1663 edhill 1.72 -rm -f makedepend.out
1664 edhill 1.1
1665 adcroft 1.52 links: \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(SPECIAL_FILES)
1666 edhill 1.1
1667 cnh 1.3 small_f: \$(F77FILES) \$(F90FILES)
1668 edhill 1.1
1669     output.txt: \$(EXECUTABLE)
1670     @printf 'running ... '
1671     @\$(EXECUTABLE) > \$@
1672    
1673     clean:
1674 adcroft 1.44 -rm -rf *.o *.f *.p *.f90 *.mod ${RMFILES} work.{pc,pcl} *.template
1675 edhill 1.1 Clean:
1676     @make clean
1677     @make cleanlinks
1678 adcroft 1.52 -rm -f \$(SPECIAL_FILES)
1679 adcroft 1.51 -rm -f genmake_state genmake_*optfile genmake_warnings make.log run.log *.bak
1680 edhill 1.1 CLEAN:
1681     @make Clean
1682     -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
1683     -find \$(EXEDIR) -name "*.data" -exec rm {} \;
1684     -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
1685 edhill 1.12 -rm -f \$(EXECUTABLE) output.txt
1686 edhill 1.1
1687 edhill 1.18 #eh3 Makefile: makefile
1688 edhill 1.1 makefile:
1689 edhill 1.73 $THIS_SCRIPT $G2ARGS
1690 edhill 1.1 cleanlinks:
1691     -find . -type l -exec rm {} \;
1692    
1693 adcroft 1.52 # Special targets ($SPECIAL_FILES) which are create by make
1694 adcroft 1.44 ${PACKAGES_DOT_H}:
1695     @echo Creating \$@ ...
1696 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) > \$@
1697 adcroft 1.44 AD_CONFIG.h:
1698     @echo Creating \$@ ...
1699 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 > \$@
1700 adcroft 1.52 FC_NAMEMANGLE.h:
1701     @echo Creating \$@ ...
1702     echo "$FC_NAMEMANGLE" > \$@
1703 adcroft 1.44
1704 edhill 1.1 # The normal chain of rules is ( .F - .f - .o )
1705     .F.f:
1706     \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1707     .f.o:
1708     \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
1709 cnh 1.3 .F90.f90:
1710     \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1711     .f90.o:
1712     \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
1713 edhill 1.1 .c.o:
1714     \$(CC) \$(CFLAGS) -c \$<
1715    
1716     # Special exceptions that use the ( .F - .p - .f - .o ) rule-chain
1717     .F.p:
1718     \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1719     .p.f:
1720     \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
1721 edhill 1.14
1722     #=========================================
1723     #=== Automatic Differentiation Rules ===
1724    
1725     TAMC = ${TAMC}
1726     TAF = ${TAF}
1727    
1728 edhill 1.17 TAF_EXTRA = ${TAF_EXTRA}
1729     TAMC_EXTRA = ${TAMC_EXTRA}
1730    
1731 edhill 1.14 EOF
1732    
1733     ad_vars="AD_TAMC_FLAGS AD_TAF_FLAGS"
1734     ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF_FLAGS"
1735     ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
1736     for i in $ad_vars ; do
1737     name=$i
1738     t1="t2=\$"`echo $i`
1739     eval $t1
1740     printf "%-20s = " $name >> $MAKEFILE
1741     echo $t2 >> $MAKEFILE
1742     done
1743    
1744     echo " Add the source list for AD code generation"
1745     echo >> $MAKEFILE
1746 edhill 1.71 printf "AD_FILES = " >> $MAKEFILE
1747 edhill 1.14 AD_FILES=`cat ad_files`
1748     for i in $AD_FILES ; do
1749     echo " \\" >> $MAKEFILE
1750 edhill 1.71 printf " $i" >> $MAKEFILE
1751 edhill 1.14 done
1752     echo >> $MAKEFILE
1753 edhill 1.21 rm -f ad_files
1754 edhill 1.14
1755     cat >>$MAKEFILE <<EOF
1756    
1757 edhill 1.16 # ... AD ...
1758 edhill 1.23 adall: ad_taf
1759     adtaf: ad_taf_output.f
1760     adtamc: ad_tamc_output.f
1761 edhill 1.21
1762 heimbach 1.48 ad_input_code.f: \$(AD_FILES) \$(HEADERFILES)
1763 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
1764 edhill 1.23 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
1765 adcroft 1.44 -rm -f ad_config.template
1766 edhill 1.22 @make \$(F77FILES)
1767     @make \$(AD_FLOW_FILES)
1768     cat \$(AD_FLOW_FILES) \$(AD_FILES) > ad_input_code.f
1769    
1770 edhill 1.14 ad_taf_output.f: ad_input_code.f
1771 heimbach 1.37 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f
1772 adcroft 1.44 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f
1773 heimbach 1.37
1774     adtafonly:
1775 edhill 1.17 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f
1776 adcroft 1.44 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f
1777 edhill 1.14
1778     ad_taf: ad_taf_output.o \$(OBJFILES)
1779 edhill 1.21 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
1780 edhill 1.14
1781     ad_tamc_output.f: ad_input_code.f
1782 edhill 1.17 \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.f
1783 adcroft 1.44 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.f
1784 edhill 1.14
1785     ad_tamc: ad_tamc_output.o \$(OBJFILES)
1786 edhill 1.21 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
1787 edhill 1.14
1788    
1789 edhill 1.19 # ... FTL ...
1790 edhill 1.23 ftlall: ftl_taf
1791     ftltaf: ftl_taf_output.f
1792     ftltamc: ftl_tamc_output.f
1793 edhill 1.21
1794 heimbach 1.48 ftl_input_code.f: \$(AD_FILES) \$(HEADERFILES)
1795 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
1796 edhill 1.23 cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
1797 adcroft 1.44 -rm -f ftl_config.template
1798 edhill 1.23 @make \$(F77FILES)
1799 edhill 1.22 @make \$(AD_FLOW_FILES)
1800     cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.f
1801    
1802     ftl_taf_output.f: ftl_input_code.f
1803     \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f
1804 adcroft 1.44 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f
1805 edhill 1.14
1806 heimbach 1.40 ftltafonly:
1807     \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f
1808 adcroft 1.44 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f
1809 heimbach 1.40
1810 edhill 1.19 ftl_taf: ftl_taf_output.o \$(OBJFILES)
1811 edhill 1.21 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
1812 edhill 1.14
1813 edhill 1.22 ftl_tamc_output.f: ftl_input_code.f
1814     \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.f
1815 adcroft 1.44 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.f
1816 edhill 1.16
1817 edhill 1.19 ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
1818 edhill 1.21 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
1819 edhill 1.16
1820    
1821     # ... SVD ...
1822 heimbach 1.40 svdtaf: ad_taf_output.f ftl_taf_output.f
1823     svdall: svd_taf
1824 edhill 1.16
1825 heimbach 1.40 svd_taf: ad_taf_output.o ftl_taf_output.o \$(OBJFILES)
1826     \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
1827 edhill 1.14
1828    
1829     #=========================================
1830 edhill 1.1
1831     EOF
1832 edhill 1.7
1833     if test "x$EXEHOOK" != x ; then
1834     printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE
1835     fi
1836 edhill 1.1
1837     echo " Making list of \"exceptions\" that need \".p\" files"
1838     for i in $KPPFILES ; do
1839     base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
1840     RETVAL=$?
1841     if test "x$RETVAL" != x0 ; then
1842     echo "Error: unable to add file \"$i\" to the exceptions list"
1843     fi
1844     echo "$base.f: $base.p" >> $MAKEFILE
1845     done
1846    
1847     echo " Making list of NOOPTFILES"
1848     for i in $NOOPTFILES ; do
1849     base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
1850     RETVAL=$?
1851     if test "x$RETVAL" != x0 ; then
1852     echo "Error: unable to add file \"$i\" to the exceptions list"
1853     fi
1854     echo "$base.o: $base.f" >> $MAKEFILE
1855 edhill 1.2 printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE
1856 edhill 1.1 done
1857    
1858     echo " Add rules for links"
1859     cat srclinks.tmp >> $MAKEFILE
1860     rm -f srclinks.tmp
1861    
1862     echo " Adding makedepend marker"
1863 edhill 1.2 printf "\n\n# DO NOT DELETE\n" >> $MAKEFILE
1864 edhill 1.1
1865 edhill 1.2 printf "\n=== Done ===\n"
1866 adcroft 1.47
1867     # Create special header files
1868 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"
1869 adcroft 1.47 if test ! -f $PACKAGES_DOT_H ; then
1870     mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
1871     else
1872 edhill 1.61 cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H > /dev/null 2>&1
1873 adcroft 1.47 RETVAL=$?
1874     if test "x$RETVAL" = x0 ; then
1875     rm -f $PACKAGES_DOT_H".tmp"
1876     else
1877     mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"
1878     mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
1879     fi
1880     fi
1881     if test ! -f AD_CONFIG.h ; then
1882 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
1883 adcroft 1.47 fi
1884 edhill 1.5
1885    
1886     # Write the "state" for future records
1887     if test "x$DUMPSTATE" != xf ; then
1888 edhill 1.71 printf "" > genmake_state
1889 edhill 1.5 for i in $gm_state ; do
1890     t1="t2=\$$i"
1891     eval $t1
1892 edhill 1.12 echo "$i='$t2'" >> genmake_state
1893 edhill 1.5 done
1894     fi

  ViewVC Help
Powered by ViewVC 1.1.22