/[MITgcm]/MITgcm/tools/genmake2
ViewVC logotype

Contents of /MITgcm/tools/genmake2

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


Revision 1.62 - (show annotations) (download)
Thu Jan 15 19:19:59 2004 UTC (20 years, 2 months ago) by edhill
Branch: MAIN
CVS Tags: checkpoint52i_post, checkpoint52i_pre, checkpoint52h_pre
Changes since 1.61: +17 -6 lines
 o build the templates for type conversion in MNC
 o small fixes to error handling

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

  ViewVC Help
Powered by ViewVC 1.1.22