/[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.64 - (hide annotations) (download)
Sun Jan 25 00:22:57 2004 UTC (15 years, 7 months ago) by edhill
Branch: MAIN
CVS Tags: hrcube4, hrcube_2, hrcube_3
Changes since 1.63: +2 -2 lines
 o new version of MNC "internals" with per-file association of all
     entities
 o first version with NetCDF read support
 o fixed the cleanup of internal lookup tables at file closure
 o numerous small bug fixes

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

  ViewVC Help
Powered by ViewVC 1.1.22