/[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.70 - (hide annotations) (download)
Sat Feb 28 05:01:12 2004 UTC (20 years ago) by edhill
Branch: MAIN
CVS Tags: hrcube5
Changes since 1.69: +3 -2 lines
 o add "LDADD" variable

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

  ViewVC Help
Powered by ViewVC 1.1.22