/[MITgcm]/MITgcm_contrib/high_res_cube/code-mods/genmake2
ViewVC logotype

Annotation of /MITgcm_contrib/high_res_cube/code-mods/genmake2

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.2 - (hide annotations) (download)
Fri Mar 26 15:19:35 2004 UTC (21 years, 3 months ago) by edhill
Branch: MAIN
CVS Tags: HEAD
Changes since 1.1: +1 -1 lines
FILE REMOVED
 o removing files (as requested by CNH) to fix the recent CVS repository
   corruption (the dead-files-returning problem)

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

  ViewVC Help
Powered by ViewVC 1.1.22