/[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.66 - (hide annotations) (download)
Mon Feb 23 21:51:32 2004 UTC (15 years, 8 months ago) by edhill
Branch: MAIN
Changes since 1.65: +14 -2 lines
 o add automatic "discovery" of the -lnetcdf library
   - Note that this will work if the NetCDF files are installed in
     standard locations such as /usr/lib or /usr/local/lib.  If the
     NetCDF files are installed in a non-standard location, then the
     user will have to specify the path ("-L /path/to/the/lib")
     within the optfile.

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

  ViewVC Help
Powered by ViewVC 1.1.22