/[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.62 - (hide annotations) (download)
Thu Jan 15 19:19:59 2004 UTC (20 years, 2 months ago) by edhill
Branch: MAIN
CVS Tags: checkpoint52i_post, checkpoint52i_pre, checkpoint52h_pre
Changes since 1.61: +17 -6 lines
 o build the templates for type conversion in MNC
 o small fixes to error handling

1 edhill 1.49 #! /usr/bin/env bash
2 edhill 1.1 #
3 edhill 1.62 # $Header: /u/u3/gcmpack/MITgcm/tools/genmake2,v 1.61 2004/01/15 04:27:39 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     if test "x$CPP" = x ; then
838 edhill 1.11 CPP="cpp"
839     fi
840 edhill 1.39 if test "x$MAKE" = x ; then
841     MAKE="make"
842     fi
843 edhill 1.13 echo "#define A a" | $CPP > test_cpp 2>&1
844 edhill 1.11 RETVAL=$?
845     if test "x$RETVAL" != x0 ; then
846 edhill 1.8 cat <<EOF 1>&2
847    
848 edhill 1.11 Error: C pre-processor "$CPP" failed the test case: please specify using:
849    
850 edhill 1.8 1) within the options file ("CPP=...") as specified by "-of=OPTFILE"
851 edhill 1.12 2) the "./genmake_local" file
852 edhill 1.30 3) with the CPP environment variable
853 edhill 1.11
854 edhill 1.8 EOF
855     exit 1
856 edhill 1.11 else
857     rm -f test_cpp
858 edhill 1.8 fi
859 edhill 1.11 if test "x$MAKEDEPEND" = x ; then
860     MAKEDEPEND=makedepend
861 edhill 1.8 fi
862 edhill 1.35 if test "x$LN" = x ; then
863     LN="ln -s"
864     fi
865     echo "test" > genmake_test_ln
866     $LN genmake_test_ln genmake_tlink
867     RETVAL=$?
868     if test "x$RETVAL" != x0 ; then
869     cat <<EOF 1>&2
870 edhill 1.29
871 edhill 1.35 Error: The command "ln -s" failed -- please specify a working soft-link
872     command in the optfile.
873    
874     EOF
875     exit 1
876     fi
877     rm -f genmake_test_ln genmake_tlink
878 edhill 1.29
879 edhill 1.39
880 edhill 1.29 printf "\n=== Checking system libraries ===\n"
881     echo -n " Do we have the system() command using $FC... "
882     cat > genmake_tcomp.f <<EOF
883     program hello
884     call system('echo hi')
885     end
886     EOF
887     $FC $FFLAGS $DEFINES -o genmake_tcomp genmake_tcomp.f > genmake_tcomp.log 2>&1
888     RETVAL=$?
889     if test "x$RETVAL" = x0 ; then
890     HAVE_SYSTEM=t
891     DEFINES="$DEFINES -DHAVE_SYSTEM"
892     echo "yes"
893     else
894     HAVE_SYSTEM=
895     echo "no"
896     fi
897     rm -f genmake_tcomp*
898    
899     echo -n " Do we have the fdate() command using $FC... "
900     cat > genmake_tcomp.f <<EOF
901     program hello
902     CHARACTER(128) string
903     string = ' '
904     call fdate( string )
905     print *, string
906     end
907     EOF
908     $FC $FFLAGS $DEFINES -o genmake_tcomp genmake_tcomp.f > genmake_tcomp.log 2>&1
909     RETVAL=$?
910     if test "x$RETVAL" = x0 ; then
911     HAVE_FDATE=t
912     DEFINES="$DEFINES -DHAVE_FDATE"
913     echo "yes"
914     else
915     HAVE_FDATE=
916     echo "no"
917     fi
918     rm -f genmake_tcomp*
919    
920 edhill 1.39 echo -n " Can we call simple C routines (here, \"cloc()\") using $FC... "
921     check_HAVE_CLOC
922     if test "x$HAVE_CLOC" != x ; then
923     echo "yes"
924     else
925     echo "no"
926 edhill 1.29 fi
927 edhill 1.39 rm -f genmake_t*
928 edhill 1.29
929 edhill 1.60 echo -n " Can we create NetCDF-enabled binaries... "
930     check_netcdf_libs
931     if test "x$HAVE_NETCDF" != x ; then
932     echo "yes"
933     else
934     echo "no"
935     fi
936    
937 edhill 1.8
938 edhill 1.2 printf "\n=== Setting defaults ===\n"
939 edhill 1.1 echo -n " Adding MODS directories: "
940     for d in $MODS ; do
941     if test ! -d $d ; then
942 edhill 1.2 echo
943     echo "Error: MODS directory \"$d\" not found!"
944 edhill 1.1 exit 1
945     else
946     echo -n " $d"
947     SOURCEDIRS="$SOURCEDIRS $d"
948     INCLUDEDIRS="$INCLUDEDIRS $d"
949     fi
950     done
951     echo
952    
953     if test "x$MAKEFILE" = x ; then
954     MAKEFILE="Makefile"
955     fi
956     if test "x${PLATFORM}" = x ; then
957     PLATFORM=$p_PLATFORM
958     fi
959    
960     if test "x${EXEDIR}" = x ; then
961     if test "${PWD##/*/}" = "bin" -a -d ../exe -a $ROOTDIR = .. ; then
962     EXEDIR=../exe
963     else
964     EXEDIR=.
965     fi
966     fi
967     if test ! -d ${EXEDIR} ; then
968     echo "Error: the specified EXEDIR (\"$EXEDIR\") does not exist!"
969     exit 1
970     fi
971    
972     if test "x${TOOLSDIR}" = x ; then
973     TOOLSDIR="$ROOTDIR/tools"
974     fi
975     if test ! -d ${TOOLSDIR} ; then
976     echo "Error: the specified $TOOLSDIR (\"$TOOLSDIR\") does not exist!"
977     exit 1
978     fi
979 edhill 1.11 if test "x$S64" = x ; then
980     S64='$(TOOLSDIR)/set64bitConst.sh'
981     fi
982 adcroft 1.44 THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`
983 edhill 1.1
984     EXECUTABLE=${EXECUTABLE:-mitgcmuv}
985    
986     # We have a special set of source files in eesupp/src which are
987     # generated from some template source files. We'll make them first so
988     # they appear as regular source code
989     if test -r $ROOTDIR"/eesupp/src/Makefile" ; then
990     echo " Making source files in eesupp from templates"
991 edhill 1.36 ( cd $ROOTDIR"/eesupp/src/" && $MAKE ) > make_eesupp.errors 2>&1
992 edhill 1.1 RETVAL=$?
993 edhill 1.2 if test "x${RETVAL}" = x0 ; then
994 edhill 1.1 rm -f make_eesupp.errors
995     else
996     echo "Error: problem encountered while building source files in eesupp:"
997 edhill 1.62 cat make_eesupp.errors 1>&2
998 edhill 1.1 exit 1
999 afe 1.58 fi
1000     fi
1001    
1002     #same for exch2
1003     if test -r $ROOTDIR"/pkg/exch2/Makefile" ; then
1004     echo " Making source files in exch2 from templates"
1005     ( cd $ROOTDIR"/pkg/exch2/" && $MAKE ) > make_exch2.errors 2>&1
1006     RETVAL=$?
1007     if test "x${RETVAL}" = x0 ; then
1008     rm -f make_exch2.errors
1009     else
1010 edhill 1.59 echo "Error: problem encountered while building source files in exch2:"
1011 edhill 1.62 cat make_exch2.errors 1>&2
1012 afe 1.58 exit 1
1013 edhill 1.1 fi
1014     fi
1015    
1016 edhill 1.2 printf "\n=== Determining package settings ===\n"
1017 edhill 1.1 if test "x${PDEPEND}" = x ; then
1018     tmp=$ROOTDIR"/pkg/pkg_depend"
1019     if test -r $tmp ; then
1020     PDEPEND=$tmp
1021     else
1022     echo "Warning: No package dependency information was specified."
1023     echo " Please check that ROOTDIR/pkg/pkg_depend exists."
1024     fi
1025     else
1026     if test ! -r ${PDEPEND} ; then
1027     echo "Error: can't read package dependency info from PDEPEND=\"$PDEPEND\""
1028     exit 1
1029     fi
1030     fi
1031     echo " getting package dependency info from $PDEPEND"
1032     # Strip the comments and then convert the dependency file into
1033     # two arrays: PNAME, DNAME
1034     cat $PDEPEND | sed -e 's/#.*$//g' \
1035 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}' \
1036 edhill 1.1 > ./.pd_tmp
1037     RETVAL=$?
1038     if test ! "x${RETVAL}" = x0 ; then
1039     echo "Error: unable to parse package dependencies -- please check PDEPEND=\"$PDEPEND\""
1040     exit 1
1041     fi
1042 edhill 1.34 . ./.pd_tmp
1043 edhill 1.1 rm -f ./.pd_tmp
1044    
1045 edhill 1.12 # Search for default packages. Note that a "$ROOTDIR/pkg/pkg_groups"
1046     # file should eventually be added so that, for convenience, one can
1047     # specify groups of packages using names like "ocean" and "atmosphere".
1048 edhill 1.41 echo " checking default package list: "
1049 edhill 1.1 if test "x${PDEFAULT}" = x ; then
1050 edhill 1.12 for i in "." $MODS ; do
1051     if test -r $i"/packages.conf" ; then
1052     PDEFAULT=$i"/packages.conf"
1053     break
1054     fi
1055     done
1056     fi
1057     if test "x${PDEFAULT}" = x ; then
1058 edhill 1.1 PDEFAULT="$ROOTDIR/pkg/pkg_default"
1059     fi
1060     if test "x${PDEFAULT}" = xNONE ; then
1061 edhill 1.41 echo " default packages file disabled"
1062 edhill 1.1 else
1063     if test ! -r $PDEFAULT ; then
1064     echo "Warning: can't read default packages from PDEFAULT=\"$PDEFAULT\""
1065     else
1066 edhill 1.41 echo " using PDEFAULT=\"$PDEFAULT\""
1067 edhill 1.1 # Strip the comments and add all the names
1068 edhill 1.15 def=`cat $PDEFAULT | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
1069 edhill 1.1 RETVAL=$?
1070     if test "x${RETVAL}" != x0 ; then
1071     echo -n "Error: can't parse default package list "
1072     echo "-- please check PDEFAULT=\"$PDEFAULT\""
1073     exit 1
1074     fi
1075     for i in $def ; do
1076     PACKAGES="$PACKAGES $i"
1077     done
1078 edhill 1.12 echo " before group expansion packages are: $PACKAGES"
1079     expand_pkg_groups
1080     echo " after group expansion packages are: $PACKAGES"
1081 edhill 1.1 fi
1082     fi
1083    
1084     echo " applying DISABLE settings"
1085     pack=
1086     for p in $PACKAGES ; do
1087     addit="t"
1088     for d in $DISABLE ; do
1089     if test "x$p" = "x$d" ; then
1090     addit="f"
1091     fi
1092     done
1093     if test "x$addit" = xt ; then
1094     pack="$pack $p"
1095     fi
1096     done
1097     PACKAGES="$pack"
1098     echo " applying ENABLE settings"
1099 edhill 1.12 echo "" > ./.tmp_pack
1100 edhill 1.1 PACKAGES="$PACKAGES $ENABLE"
1101     for i in $PACKAGES ; do
1102     if test ! -d "$ROOTDIR/pkg/$i" ; then
1103     echo "Error: can't find package $i at \"$ROOTDIR/pkg/$i\""
1104     exit 1
1105     fi
1106     echo $i >> ./.tmp_pack
1107     done
1108     pack=`cat ./.tmp_pack | sort | uniq`
1109     rm -f ./.tmp_pack
1110     PACKAGES=
1111     for i in $pack ; do
1112     PACKAGES="$PACKAGES $i"
1113     done
1114     echo " packages are: $PACKAGES"
1115    
1116     echo " applying package dependency rules"
1117     ck=
1118     while test "x$ck" != xtt ; do
1119     i=0
1120 edhill 1.2 # rtot=${#PNAME[@]}
1121     rtot=$nname
1122 edhill 1.1 while test $i -lt $rtot ; do
1123    
1124     # Is $pname in the current $PACKAGES list?
1125 edhill 1.2 # pname=${PNAME[$i]}
1126     tmp="pname=\"\$PNAME_$i\""
1127     eval $tmp
1128 edhill 1.1 pin="f"
1129     for p in $PACKAGES ; do
1130     if test "x$p" = "x$pname" ; then
1131     pin="t"
1132     fi
1133     done
1134    
1135     # Is the DNAME entry a (+) or (-) rule ?
1136 edhill 1.2 tmp="dname=\"\$DNAME_$i\""
1137     eval $tmp
1138 edhill 1.1 plus="-"
1139 edhill 1.2 echo $dname | grep '^+' > /dev/null 2>&1
1140 edhill 1.1 RETVAL=$?
1141     if test "x$RETVAL" = x0 ; then
1142     plus="+"
1143     fi
1144    
1145     # Is $dname in the current $PACKAGES list?
1146 edhill 1.2 dname=`echo $dname | sed -e 's/^[+-]//'`
1147 edhill 1.1 din="f"
1148     for p in $PACKAGES ; do
1149     if test "x$p" = "x$dname" ; then
1150     din="t"
1151     fi
1152     done
1153    
1154     # Do we need to add $dname according to the dependency rules?
1155     if test "x$pin" = xt -a "x$plus" = "x+" -a "x$din" = xf ; then
1156     in_dis="f"
1157     for dis in $DISABLE ; do
1158     if test "x$dis" = "x$dname" ; then
1159     in_dis="t"
1160     fi
1161     done
1162     if test "x$in_dis" = xt ; then
1163     echo "Error: can't satisfy package dependencies:"
1164     echo " \"$dname\" is required by the dependency rules"
1165     echo " but is disallowed by the DISABLE settings"
1166     exit 1
1167     else
1168     PACKAGES="$PACKAGES $dname"
1169     ck=
1170     fi
1171     fi
1172    
1173     # Do we need to get rid of $dname according to the dependency rules?
1174     if test "x$pin" = xt -a "x$plus" = "x-" -a "x$din" = xt; then
1175     echo "Error: can't satisfy package dependencies:"
1176     echo " \"$pname\" was requested but is disallowed by"
1177     echo " the dependency rules for \"$dname\""
1178     exit 1
1179     fi
1180     i=$(( $i + 1 ))
1181     done
1182     ck=$ck"t"
1183     done
1184     echo " packages are: $PACKAGES"
1185     for i in $PACKAGES ; do
1186     adr="$ROOTDIR/pkg/$i"
1187     if test -d $adr ; then
1188     SOURCEDIRS="$SOURCEDIRS $adr"
1189     INCLUDEDIRS="$INCLUDEDIRS $adr"
1190 edhill 1.14 if test "x$i" = xautodiff ; then
1191     AUTODIFF_PKG_USED=t
1192     fi
1193 edhill 1.1 else
1194     echo "Error: the directory \"$adr\" for package $i doesn't exist"
1195     exit 1
1196     fi
1197     done
1198    
1199 edhill 1.62 # Build MNC templates and check for ability to build and use NetCDF
1200 edhill 1.60 echo $PACKAGES | grep ' mnc ' > /dev/null 2>&1
1201     RETVAL=$?
1202 edhill 1.62 if test "x$RETVAL" = x0 ; then
1203     ( cd $ROOTDIR"/pkg/mnc" && $MAKE templates ) > make_mnc.errors 2>&1
1204     RETVAL=$?
1205     if test "x${RETVAL}" = x0 ; then
1206     rm -f make_mnc.errors
1207     else
1208     echo "Error: problem encountered while building source files in pkg/mnc:"
1209     cat make_mnc.errors 1>&2
1210     exit 1
1211     fi
1212     if test -a "x$HAVE_NETCDF" != xt ; then
1213     cat <<EOF
1214 edhill 1.60
1215     WARNING: the "mnc" package has been enabled but tests failed to
1216     compile and/or execute NetCDF applications. Please check that:
1217    
1218     1) NetCDF is installed for your compiler and
1219     2) the LIBS variable (within the 'optfile") specifies the correct
1220     NetCDF library to link against.
1221    
1222     EOF
1223 edhill 1.62 fi
1224 edhill 1.60 fi
1225 edhill 1.1
1226 edhill 1.12 # Create a list of #define and #undef to enable/disable packages
1227     PACKAGES_DOT_H=PACKAGES_CONFIG.h
1228 edhill 1.1 # The following UGLY HACK sets multiple "#undef"s and it needs to go
1229     # away. On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h
1230     # file would eventually be split up so that all package-related #define
1231     # statements could be separated and handled only by genmake.
1232     names=`ls -1 "$ROOTDIR/pkg"`
1233     all_pack=
1234 adcroft 1.44 DISABLED_PACKAGES=
1235 edhill 1.1 for n in $names ; do
1236     if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
1237     has_pack="f"
1238     for pack in $PACKAGES ; do
1239     if test "x$pack" = "x$n" ; then
1240     has_pack="t"
1241     break
1242     fi
1243     done
1244     if test "x$has_pack" = xf ; then
1245 edhill 1.15 undef=`echo "ALLOW_$n" | $AWK '{print toupper($0)}'`
1246 adcroft 1.44 DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
1247 edhill 1.1 fi
1248     fi
1249     done
1250 adcroft 1.44 ENABLED_PACKAGES=
1251 edhill 1.1 for i in $PACKAGES ; do
1252 edhill 1.15 def=`echo "ALLOW_$i" | $AWK '{print toupper($0)}'`
1253 adcroft 1.44 ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
1254 edhill 1.12 #eh3 DEFINES="$DEFINES -D$def"
1255 edhill 1.1
1256     #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
1257     case $i in
1258     aim_v23)
1259 adcroft 1.46 ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
1260 jmc 1.55 echo "Warning: ALLOW_AIM is set to enable aim_v23."
1261 edhill 1.1 ;;
1262     esac
1263     #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
1264    
1265     done
1266    
1267     echo " Adding STANDARDDIRS"
1268     BUILDDIR=${BUILDDIR:-.}
1269 edhill 1.57 if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
1270 edhill 1.12 STANDARDDIRS="eesupp model"
1271     fi
1272 edhill 1.57 if test "x$STANDARDDIRS" != x ; then
1273     for d in $STANDARDDIRS ; do
1274     adr="$ROOTDIR/$d/src"
1275     if test ! -d $adr ; then
1276     echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1277     echo " is correct and that you correctly specified the STANDARDDIRS option"
1278     exit 1
1279     else
1280     SOURCEDIRS="$SOURCEDIRS $adr"
1281     fi
1282     adr="$ROOTDIR/$d/inc"
1283     if test ! -d $adr ; then
1284     echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1285     echo " is correct and that you correctly specified the STANDARDDIRS option"
1286     exit 1
1287     else
1288     INCLUDEDIRS="$INCLUDEDIRS $adr"
1289     fi
1290     done
1291     fi
1292 edhill 1.1
1293 adcroft 1.52 echo " Searching for *OPTIONS.h files in order to warn about the presence"
1294     echo " of \"#define \"-type statements that are no longer allowed:"
1295 edhill 1.12 CPP_OPTIONS=
1296 adcroft 1.52 CPP_EEOPTIONS=
1297 edhill 1.12 spaths=". $INCLUDEDIRS"
1298 adcroft 1.52 names=`ls -1 "$ROOTDIR/pkg"`
1299 edhill 1.12 for i in $spaths ; do
1300     try="$i/CPP_OPTIONS.h"
1301 edhill 1.54 if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
1302 edhill 1.12 echo " found CPP_OPTIONS=\"$try\""
1303     CPP_OPTIONS="$try"
1304 adcroft 1.52 # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
1305     for n in $names ; do
1306     test_for_package_in_cpp_options $CPP_OPTIONS $n
1307     done
1308     fi
1309     try="$i/CPP_EEOPTIONS.h"
1310 edhill 1.54 if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
1311 adcroft 1.52 echo " found CPP_EEOPTIONS=\"$try\""
1312     # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
1313     #**** not yet enabled ****
1314     # test_for_mpi_in_cpp_eeoptions $try
1315     #**** not yet enabled ****
1316     CPP_EEOPTIONS="$try"
1317 edhill 1.12 fi
1318     done
1319     if test "x$CPP_OPTIONS" = x ; then
1320     echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
1321     exit 1
1322     fi
1323 edhill 1.1
1324 edhill 1.14 # Here, we build the list of files to be "run through" the adjoint
1325     # compiler.
1326     if test -f ./ad_files ; then
1327     rm -f ./ad_files
1328     fi
1329     echo " Creating the list of files for the adjoint compiler."
1330     for i in $SOURCEDIRS ; do
1331     list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
1332     for j in $list_files ; do
1333     cat $i/$j >> ad_files
1334     done
1335     done
1336 edhill 1.60
1337 edhill 1.14
1338 edhill 1.2 echo
1339     echo "=== Creating the Makefile ==="
1340 edhill 1.1 echo " setting INCLUDES"
1341     for i in $INCLUDEDIRS ; do
1342 edhill 1.12 if ! test -d $i ; then
1343     # INCLUDES="$INCLUDES -I$i"
1344     # else
1345 edhill 1.1 echo "Warning: can't find INCLUDEDIRS=\"$i\""
1346     fi
1347     done
1348    
1349     echo " Determining the list of source and include files"
1350     rm -rf .links.tmp
1351     mkdir .links.tmp
1352     echo "# This section creates symbolic links" > srclinks.tmp
1353     echo "" >> srclinks.tmp
1354 cnh 1.3 echo -n 'SRCFILES = ' > srclist.inc
1355     echo -n 'CSRCFILES = ' > csrclist.inc
1356     echo -n 'F90SRCFILES = ' > f90srclist.inc
1357 edhill 1.1 echo -n 'HEADERFILES = ' > hlist.inc
1358 edhill 1.14 echo -n 'AD_FLOW_FILES = ' > ad_flow_files.inc
1359 adcroft 1.9 alldirs="$SOURCEDIRS $INCLUDEDIRS ."
1360 edhill 1.1 for d in $alldirs ; do
1361     deplist=
1362 edhill 1.14 sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
1363 cnh 1.3 sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
1364 edhill 1.1 for sf in $sfiles ; do
1365     if test ! -r ".links.tmp/$sf" ; then
1366     if test -f "$d/$sf" ; then
1367 adcroft 1.44 case $d/$sf in
1368     ./$PACKAGES_DOT_H)
1369     ;;
1370     ./AD_CONFIG.h)
1371     ;;
1372     ./FC_NAMEMANGLE.h)
1373     ;;
1374     *)
1375     touch .links.tmp/$sf
1376     deplist="$deplist $sf"
1377     ;;
1378     esac
1379 edhill 1.15 extn=`echo $sf | $AWK -F '.' '{print $NF}'`
1380 edhill 1.1 case $extn in
1381     F)
1382     echo " \\" >> srclist.inc
1383     echo -n " $sf" >> srclist.inc
1384     ;;
1385 cnh 1.3 F90)
1386     echo " \\" >> f90srclist.inc
1387     echo -n " $sf" >> f90srclist.inc
1388     ;;
1389 edhill 1.1 c)
1390     echo " \\" >> csrclist.inc
1391     echo -n " $sf" >> csrclist.inc
1392     ;;
1393     h)
1394     echo " \\" >> hlist.inc
1395     echo -n " $sf" >> hlist.inc
1396     ;;
1397 edhill 1.14 flow)
1398     echo " \\" >> ad_flow_files.inc
1399     echo -n " $sf" >> ad_flow_files.inc
1400     ;;
1401 edhill 1.1 esac
1402     fi
1403     fi
1404     done
1405     if test "x$deplist" != x ; then
1406 edhill 1.2 echo "" >> srclinks.tmp
1407     echo "# These files are linked from $d" >> srclinks.tmp
1408 edhill 1.1 echo "$deplist :" >> srclinks.tmp
1409 edhill 1.2 printf "\t\$(LN) %s/\$@ \$@\n" $d >> srclinks.tmp
1410 edhill 1.1 fi
1411     done
1412     rm -rf .links.tmp
1413     echo "" >> srclist.inc
1414     echo "" >> csrclist.inc
1415 cnh 1.3 echo "" >> f90srclist.inc
1416 edhill 1.1 echo "" >> hlist.inc
1417 edhill 1.14 echo "" >> ad_flow_files.inc
1418 edhill 1.1
1419     if test -e $MAKEFILE ; then
1420     mv -f $MAKEFILE "$MAKEFILE.bak"
1421     fi
1422     echo " Writing makefile: $MAKEFILE"
1423     echo "# Multithreaded + multi-processing makefile for:" > $MAKEFILE
1424     echo "# $MACHINE" >> $MAKEFILE
1425     echo "# This makefile was generated automatically on" >> $MAKEFILE
1426     echo "# $THISDATE" >> $MAKEFILE
1427     echo "# by the command:" >> $MAKEFILE
1428     echo "# $0 $@" >> $MAKEFILE
1429     echo "# executed by:" >> $MAKEFILE
1430     echo "# $USER@${THISHOSTNAME}:${THISCWD}" >> $MAKEFILE
1431 edhill 1.21
1432     EXE_AD=$EXECUTABLE"_ad"
1433     EXE_FTL=$EXECUTABLE"_ftl"
1434     EXE_SVD=$EXECUTABLE"_svd"
1435    
1436 edhill 1.1 cat >>$MAKEFILE <<EOF
1437 edhill 1.53 #
1438     # OPTFILE="$OPTFILE"
1439 edhill 1.1 #
1440     # BUILDDIR : Directory where object files are written
1441     # SOURCEDIRS : Directories containing the source (.F) files
1442     # INCLUDEDIRS : Directories containing the header-source (.h) files
1443     # EXEDIR : Directory where executable that is generated is written
1444     # EXECUTABLE : Full path of executable binary
1445     #
1446     # CPP : C-preprocessor command
1447     # INCLUDES : Directories searched for header files
1448     # DEFINES : Macro definitions for CPP
1449     # MAKEDEPEND : Dependency generator
1450     # KPP : Special preprocessor command (specific to platform)
1451     # KFLAGS : Flags for KPP
1452     # FC : Fortran compiler command
1453     # FFLAGS : Configuration/debugging options for FC
1454     # FOPTIM : Optimization options for FC
1455     # LINK : Command for link editor program
1456     # LIBS : Library flags /or/ additional optimization/debugging flags
1457    
1458     ROOTDIR = ${ROOTDIR}
1459     BUILDDIR = ${BUILDDIR}
1460     SOURCEDIRS = ${SOURCEDIRS}
1461     INCLUDEDIRS = ${INCLUDEDIRS}
1462     EXEDIR = ${EXEDIR}
1463     EXECUTABLE = \$(EXEDIR)/${EXECUTABLE}
1464     TOOLSDIR = ${TOOLSDIR}
1465    
1466 edhill 1.14 #eh3 new defines for the adjoint work
1467     AUTODIFF = ${ROOTDIR}/pkg/autodiff
1468 edhill 1.21 EXE_AD = ${EXE_AD}
1469     EXE_FTL = ${EXE_FTL}
1470     EXE_SVD = ${EXE_SVD}
1471 edhill 1.14
1472 adcroft 1.44 ENABLED_PACKAGES = ${ENABLED_PACKAGES}
1473     DISABLED_PACKAGES = ${DISABLED_PACKAGES}
1474    
1475 adcroft 1.52 # These files are created by Makefile
1476     SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h
1477    
1478 edhill 1.1 EOF
1479    
1480     # Note: figure out some way to add Hyades JAM libraries here
1481    
1482     cat >>$MAKEFILE <<EOF
1483     # Unix ln (link)
1484     LN = ${LN}
1485     # C preprocessor
1486     CPP = cat \$< | ${S64} | ${CPP}
1487     # Dependency generator
1488     MAKEDEPEND = ${MAKEDEPEND}
1489     # Special preprocessor (KAP on DECs, FPP on Crays)
1490     KPP = ${KPP}
1491     # Fortran compiler
1492     FC = ${FC}
1493 cnh 1.3 # Fortran compiler
1494     F90C = ${F90C}
1495 edhill 1.1 # Link editor
1496     LINK = ${LINK}
1497    
1498     # Defines for CPP
1499     DEFINES = ${DEFINES}
1500     # Includes for CPP
1501     INCLUDES = ${INCLUDES}
1502     # Flags for KPP
1503     KFLAGS1 = ${KFLAGS1}
1504     KFLAGS2 = ${KFLAGS2}
1505     # Optim./debug for FC
1506     FFLAGS = ${FFLAGS}
1507     FOPTIM = ${FOPTIM}
1508 cnh 1.3 # Optim./debug for FC
1509     F90FLAGS = ${F90FLAGS}
1510     F90OPTIM = ${F90OPTIM}
1511 edhill 1.1 # Flags for CC
1512     CFLAGS = ${CFLAGS}
1513     # Files that should not be optimized
1514     NOOPTFILES = ${NOOPTFILES}
1515     NOOPTFLAGS = ${NOOPTFLAGS}
1516     # Flags and libraries needed for linking
1517     LIBS = ${LIBS} \$(XLIBS)
1518 cnh 1.3 # Name of the Mekfile
1519     MAKEFILE=${MAKEFILE}
1520 edhill 1.1
1521     EOF
1522    
1523 edhill 1.14 cat srclist.inc >> $MAKEFILE
1524     cat csrclist.inc >> $MAKEFILE
1525     cat f90srclist.inc >> $MAKEFILE
1526     cat hlist.inc >> $MAKEFILE
1527     cat ad_flow_files.inc >> $MAKEFILE
1528     echo >> $MAKEFILE
1529 cnh 1.3 echo 'F77FILES = $(SRCFILES:.F=.f)' >> $MAKEFILE
1530     echo 'F90FILES = $(F90SRCFILES:.F90=.f90)' >> $MAKEFILE
1531     echo 'OBJFILES = $(SRCFILES:.F=.o) $(CSRCFILES:.c=.o) $(F90SRCFILES:.F90=.o)' >> $MAKEFILE
1532 edhill 1.1
1533 cnh 1.3 rm -f srclist.inc csrclist.inc hlist.inc flist.tmp clist.tmp f90srclist.inc
1534 edhill 1.14 rm -f ad_flow_files.inc
1535 edhill 1.1
1536     cat >>$MAKEFILE <<EOF
1537    
1538     .SUFFIXES:
1539 cnh 1.3 .SUFFIXES: .o .f .p .F .c .F90 .f90
1540 edhill 1.1
1541     all: \$(EXECUTABLE)
1542 adcroft 1.52 \$(EXECUTABLE): \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(OBJFILES)
1543 adcroft 1.44 @echo Creating \$@ ...
1544 edhill 1.1 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
1545     depend:
1546     @make links
1547     \$(MAKEDEPEND) -o .f \$(DEFINES) \$(INCLUDES) \$(SRCFILES)
1548 adcroft 1.44 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
1549 edhill 1.1
1550 adcroft 1.52 links: \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(SPECIAL_FILES)
1551 edhill 1.1
1552 cnh 1.3 small_f: \$(F77FILES) \$(F90FILES)
1553 edhill 1.1
1554     output.txt: \$(EXECUTABLE)
1555     @printf 'running ... '
1556     @\$(EXECUTABLE) > \$@
1557    
1558     clean:
1559 adcroft 1.44 -rm -rf *.o *.f *.p *.f90 *.mod ${RMFILES} work.{pc,pcl} *.template
1560 edhill 1.1 Clean:
1561     @make clean
1562     @make cleanlinks
1563 adcroft 1.52 -rm -f \$(SPECIAL_FILES)
1564 adcroft 1.51 -rm -f genmake_state genmake_*optfile genmake_warnings make.log run.log *.bak
1565 edhill 1.1 CLEAN:
1566     @make Clean
1567     -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
1568     -find \$(EXEDIR) -name "*.data" -exec rm {} \;
1569     -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
1570 edhill 1.12 -rm -f \$(EXECUTABLE) output.txt
1571 edhill 1.1
1572 edhill 1.18 #eh3 Makefile: makefile
1573 edhill 1.1 makefile:
1574 adcroft 1.44 $THIS_SCRIPT $@
1575 edhill 1.1 cleanlinks:
1576     -find . -type l -exec rm {} \;
1577    
1578 adcroft 1.52 # Special targets ($SPECIAL_FILES) which are create by make
1579 adcroft 1.44 ${PACKAGES_DOT_H}:
1580     @echo Creating \$@ ...
1581 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) > \$@
1582 adcroft 1.44 AD_CONFIG.h:
1583     @echo Creating \$@ ...
1584 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 > \$@
1585 adcroft 1.52 FC_NAMEMANGLE.h:
1586     @echo Creating \$@ ...
1587     echo "$FC_NAMEMANGLE" > \$@
1588 adcroft 1.44
1589 edhill 1.1 # The normal chain of rules is ( .F - .f - .o )
1590     .F.f:
1591     \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1592     .f.o:
1593     \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
1594 cnh 1.3 .F90.f90:
1595     \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1596     .f90.o:
1597     \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
1598 edhill 1.1 .c.o:
1599     \$(CC) \$(CFLAGS) -c \$<
1600    
1601     # Special exceptions that use the ( .F - .p - .f - .o ) rule-chain
1602     .F.p:
1603     \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1604     .p.f:
1605     \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
1606 edhill 1.14
1607     #=========================================
1608     #=== Automatic Differentiation Rules ===
1609    
1610     TAMC = ${TAMC}
1611     TAF = ${TAF}
1612    
1613 edhill 1.17 TAF_EXTRA = ${TAF_EXTRA}
1614     TAMC_EXTRA = ${TAMC_EXTRA}
1615    
1616 edhill 1.14 EOF
1617    
1618     ad_vars="AD_TAMC_FLAGS AD_TAF_FLAGS"
1619     ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF_FLAGS"
1620     ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
1621     for i in $ad_vars ; do
1622     name=$i
1623     t1="t2=\$"`echo $i`
1624     eval $t1
1625     printf "%-20s = " $name >> $MAKEFILE
1626     echo $t2 >> $MAKEFILE
1627     done
1628    
1629     echo " Add the source list for AD code generation"
1630     echo >> $MAKEFILE
1631     echo -n "AD_FILES = " >> $MAKEFILE
1632     AD_FILES=`cat ad_files`
1633     for i in $AD_FILES ; do
1634     echo " \\" >> $MAKEFILE
1635     echo -n " $i" >> $MAKEFILE
1636     done
1637     echo >> $MAKEFILE
1638 edhill 1.21 rm -f ad_files
1639 edhill 1.14
1640     cat >>$MAKEFILE <<EOF
1641    
1642 edhill 1.16 # ... AD ...
1643 edhill 1.23 adall: ad_taf
1644     adtaf: ad_taf_output.f
1645     adtamc: ad_tamc_output.f
1646 edhill 1.21
1647 heimbach 1.48 ad_input_code.f: \$(AD_FILES) \$(HEADERFILES)
1648 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
1649 edhill 1.23 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
1650 adcroft 1.44 -rm -f ad_config.template
1651 edhill 1.22 @make \$(F77FILES)
1652     @make \$(AD_FLOW_FILES)
1653     cat \$(AD_FLOW_FILES) \$(AD_FILES) > ad_input_code.f
1654    
1655 edhill 1.14 ad_taf_output.f: ad_input_code.f
1656 heimbach 1.37 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f
1657 adcroft 1.44 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f
1658 heimbach 1.37
1659     adtafonly:
1660 edhill 1.17 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f
1661 adcroft 1.44 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f
1662 edhill 1.14
1663     ad_taf: ad_taf_output.o \$(OBJFILES)
1664 edhill 1.21 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
1665 edhill 1.14
1666     ad_tamc_output.f: ad_input_code.f
1667 edhill 1.17 \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.f
1668 adcroft 1.44 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.f
1669 edhill 1.14
1670     ad_tamc: ad_tamc_output.o \$(OBJFILES)
1671 edhill 1.21 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
1672 edhill 1.14
1673    
1674 edhill 1.19 # ... FTL ...
1675 edhill 1.23 ftlall: ftl_taf
1676     ftltaf: ftl_taf_output.f
1677     ftltamc: ftl_tamc_output.f
1678 edhill 1.21
1679 heimbach 1.48 ftl_input_code.f: \$(AD_FILES) \$(HEADERFILES)
1680 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
1681 edhill 1.23 cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
1682 adcroft 1.44 -rm -f ftl_config.template
1683 edhill 1.23 @make \$(F77FILES)
1684 edhill 1.22 @make \$(AD_FLOW_FILES)
1685     cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.f
1686    
1687     ftl_taf_output.f: ftl_input_code.f
1688     \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f
1689 adcroft 1.44 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f
1690 edhill 1.14
1691 heimbach 1.40 ftltafonly:
1692     \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f
1693 adcroft 1.44 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f
1694 heimbach 1.40
1695 edhill 1.19 ftl_taf: ftl_taf_output.o \$(OBJFILES)
1696 edhill 1.21 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
1697 edhill 1.14
1698 edhill 1.22 ftl_tamc_output.f: ftl_input_code.f
1699     \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.f
1700 adcroft 1.44 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.f
1701 edhill 1.16
1702 edhill 1.19 ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
1703 edhill 1.21 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
1704 edhill 1.16
1705    
1706     # ... SVD ...
1707 heimbach 1.40 svdtaf: ad_taf_output.f ftl_taf_output.f
1708     svdall: svd_taf
1709 edhill 1.16
1710 heimbach 1.40 svd_taf: ad_taf_output.o ftl_taf_output.o \$(OBJFILES)
1711     \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
1712 edhill 1.14
1713    
1714     #=========================================
1715 edhill 1.1
1716     EOF
1717 edhill 1.7
1718     if test "x$EXEHOOK" != x ; then
1719     printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE
1720     fi
1721 edhill 1.1
1722     echo " Making list of \"exceptions\" that need \".p\" files"
1723     for i in $KPPFILES ; do
1724     base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
1725     RETVAL=$?
1726     if test "x$RETVAL" != x0 ; then
1727     echo "Error: unable to add file \"$i\" to the exceptions list"
1728     fi
1729     echo "$base.f: $base.p" >> $MAKEFILE
1730     done
1731    
1732     echo " Making list of NOOPTFILES"
1733     for i in $NOOPTFILES ; do
1734     base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
1735     RETVAL=$?
1736     if test "x$RETVAL" != x0 ; then
1737     echo "Error: unable to add file \"$i\" to the exceptions list"
1738     fi
1739     echo "$base.o: $base.f" >> $MAKEFILE
1740 edhill 1.2 printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE
1741 edhill 1.1 done
1742    
1743     echo " Add rules for links"
1744     cat srclinks.tmp >> $MAKEFILE
1745     rm -f srclinks.tmp
1746    
1747     echo " Adding makedepend marker"
1748 edhill 1.2 printf "\n\n# DO NOT DELETE\n" >> $MAKEFILE
1749 edhill 1.1
1750 edhill 1.2 printf "\n=== Done ===\n"
1751 adcroft 1.47
1752     # Create special header files
1753     $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"
1754     if test ! -f $PACKAGES_DOT_H ; then
1755     mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
1756     else
1757 edhill 1.61 cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H > /dev/null 2>&1
1758 adcroft 1.47 RETVAL=$?
1759     if test "x$RETVAL" = x0 ; then
1760     rm -f $PACKAGES_DOT_H".tmp"
1761     else
1762     mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"
1763     mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
1764     fi
1765     fi
1766     if test ! -f AD_CONFIG.h ; then
1767     $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
1768     fi
1769 edhill 1.5
1770    
1771     # Write the "state" for future records
1772     if test "x$DUMPSTATE" != xf ; then
1773 edhill 1.12 echo -n "" > genmake_state
1774 edhill 1.5 for i in $gm_state ; do
1775     t1="t2=\$$i"
1776     eval $t1
1777 edhill 1.12 echo "$i='$t2'" >> genmake_state
1778 edhill 1.5 done
1779     fi

  ViewVC Help
Powered by ViewVC 1.1.22