/[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.61 - (show annotations) (download)
Thu Jan 15 04:27:39 2004 UTC (20 years, 2 months ago) by edhill
Branch: MAIN
Changes since 1.60: +2 -2 lines
 o minor output-redirecton fix

1 #! /usr/bin/env bash
2 #
3 # $Header: /u/u3/gcmpack/MITgcm/tools/genmake2,v 1.60 2004/01/14 03:44:48 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
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
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 # 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 -a "x$HAVE_NETCDF" != xt ; then
1203 cat <<EOF
1204
1205 WARNING: the "mnc" package has been enabled but tests failed to
1206 compile and/or execute NetCDF applications. Please check that:
1207
1208 1) NetCDF is installed for your compiler and
1209 2) the LIBS variable (within the 'optfile") specifies the correct
1210 NetCDF library to link against.
1211
1212 EOF
1213 fi
1214
1215 # Create a list of #define and #undef to enable/disable packages
1216 PACKAGES_DOT_H=PACKAGES_CONFIG.h
1217 # The following UGLY HACK sets multiple "#undef"s and it needs to go
1218 # away. On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h
1219 # file would eventually be split up so that all package-related #define
1220 # statements could be separated and handled only by genmake.
1221 names=`ls -1 "$ROOTDIR/pkg"`
1222 all_pack=
1223 DISABLED_PACKAGES=
1224 for n in $names ; do
1225 if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
1226 has_pack="f"
1227 for pack in $PACKAGES ; do
1228 if test "x$pack" = "x$n" ; then
1229 has_pack="t"
1230 break
1231 fi
1232 done
1233 if test "x$has_pack" = xf ; then
1234 undef=`echo "ALLOW_$n" | $AWK '{print toupper($0)}'`
1235 DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
1236 fi
1237 fi
1238 done
1239 ENABLED_PACKAGES=
1240 for i in $PACKAGES ; do
1241 def=`echo "ALLOW_$i" | $AWK '{print toupper($0)}'`
1242 ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
1243 #eh3 DEFINES="$DEFINES -D$def"
1244
1245 #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
1246 case $i in
1247 aim_v23)
1248 ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
1249 echo "Warning: ALLOW_AIM is set to enable aim_v23."
1250 ;;
1251 esac
1252 #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
1253
1254 done
1255
1256 echo " Adding STANDARDDIRS"
1257 BUILDDIR=${BUILDDIR:-.}
1258 if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
1259 STANDARDDIRS="eesupp model"
1260 fi
1261 if test "x$STANDARDDIRS" != x ; then
1262 for d in $STANDARDDIRS ; do
1263 adr="$ROOTDIR/$d/src"
1264 if test ! -d $adr ; then
1265 echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1266 echo " is correct and that you correctly specified the STANDARDDIRS option"
1267 exit 1
1268 else
1269 SOURCEDIRS="$SOURCEDIRS $adr"
1270 fi
1271 adr="$ROOTDIR/$d/inc"
1272 if test ! -d $adr ; then
1273 echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1274 echo " is correct and that you correctly specified the STANDARDDIRS option"
1275 exit 1
1276 else
1277 INCLUDEDIRS="$INCLUDEDIRS $adr"
1278 fi
1279 done
1280 fi
1281
1282 echo " Searching for *OPTIONS.h files in order to warn about the presence"
1283 echo " of \"#define \"-type statements that are no longer allowed:"
1284 CPP_OPTIONS=
1285 CPP_EEOPTIONS=
1286 spaths=". $INCLUDEDIRS"
1287 names=`ls -1 "$ROOTDIR/pkg"`
1288 for i in $spaths ; do
1289 try="$i/CPP_OPTIONS.h"
1290 if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
1291 echo " found CPP_OPTIONS=\"$try\""
1292 CPP_OPTIONS="$try"
1293 # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
1294 for n in $names ; do
1295 test_for_package_in_cpp_options $CPP_OPTIONS $n
1296 done
1297 fi
1298 try="$i/CPP_EEOPTIONS.h"
1299 if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
1300 echo " found CPP_EEOPTIONS=\"$try\""
1301 # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
1302 #**** not yet enabled ****
1303 # test_for_mpi_in_cpp_eeoptions $try
1304 #**** not yet enabled ****
1305 CPP_EEOPTIONS="$try"
1306 fi
1307 done
1308 if test "x$CPP_OPTIONS" = x ; then
1309 echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
1310 exit 1
1311 fi
1312
1313 # Here, we build the list of files to be "run through" the adjoint
1314 # compiler.
1315 if test -f ./ad_files ; then
1316 rm -f ./ad_files
1317 fi
1318 echo " Creating the list of files for the adjoint compiler."
1319 for i in $SOURCEDIRS ; do
1320 list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
1321 for j in $list_files ; do
1322 cat $i/$j >> ad_files
1323 done
1324 done
1325
1326
1327 echo
1328 echo "=== Creating the Makefile ==="
1329 echo " setting INCLUDES"
1330 for i in $INCLUDEDIRS ; do
1331 if ! test -d $i ; then
1332 # INCLUDES="$INCLUDES -I$i"
1333 # else
1334 echo "Warning: can't find INCLUDEDIRS=\"$i\""
1335 fi
1336 done
1337
1338 echo " Determining the list of source and include files"
1339 rm -rf .links.tmp
1340 mkdir .links.tmp
1341 echo "# This section creates symbolic links" > srclinks.tmp
1342 echo "" >> srclinks.tmp
1343 echo -n 'SRCFILES = ' > srclist.inc
1344 echo -n 'CSRCFILES = ' > csrclist.inc
1345 echo -n 'F90SRCFILES = ' > f90srclist.inc
1346 echo -n 'HEADERFILES = ' > hlist.inc
1347 echo -n 'AD_FLOW_FILES = ' > ad_flow_files.inc
1348 alldirs="$SOURCEDIRS $INCLUDEDIRS ."
1349 for d in $alldirs ; do
1350 deplist=
1351 sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
1352 sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
1353 for sf in $sfiles ; do
1354 if test ! -r ".links.tmp/$sf" ; then
1355 if test -f "$d/$sf" ; then
1356 case $d/$sf in
1357 ./$PACKAGES_DOT_H)
1358 ;;
1359 ./AD_CONFIG.h)
1360 ;;
1361 ./FC_NAMEMANGLE.h)
1362 ;;
1363 *)
1364 touch .links.tmp/$sf
1365 deplist="$deplist $sf"
1366 ;;
1367 esac
1368 extn=`echo $sf | $AWK -F '.' '{print $NF}'`
1369 case $extn in
1370 F)
1371 echo " \\" >> srclist.inc
1372 echo -n " $sf" >> srclist.inc
1373 ;;
1374 F90)
1375 echo " \\" >> f90srclist.inc
1376 echo -n " $sf" >> f90srclist.inc
1377 ;;
1378 c)
1379 echo " \\" >> csrclist.inc
1380 echo -n " $sf" >> csrclist.inc
1381 ;;
1382 h)
1383 echo " \\" >> hlist.inc
1384 echo -n " $sf" >> hlist.inc
1385 ;;
1386 flow)
1387 echo " \\" >> ad_flow_files.inc
1388 echo -n " $sf" >> ad_flow_files.inc
1389 ;;
1390 esac
1391 fi
1392 fi
1393 done
1394 if test "x$deplist" != x ; then
1395 echo "" >> srclinks.tmp
1396 echo "# These files are linked from $d" >> srclinks.tmp
1397 echo "$deplist :" >> srclinks.tmp
1398 printf "\t\$(LN) %s/\$@ \$@\n" $d >> srclinks.tmp
1399 fi
1400 done
1401 rm -rf .links.tmp
1402 echo "" >> srclist.inc
1403 echo "" >> csrclist.inc
1404 echo "" >> f90srclist.inc
1405 echo "" >> hlist.inc
1406 echo "" >> ad_flow_files.inc
1407
1408 if test -e $MAKEFILE ; then
1409 mv -f $MAKEFILE "$MAKEFILE.bak"
1410 fi
1411 echo " Writing makefile: $MAKEFILE"
1412 echo "# Multithreaded + multi-processing makefile for:" > $MAKEFILE
1413 echo "# $MACHINE" >> $MAKEFILE
1414 echo "# This makefile was generated automatically on" >> $MAKEFILE
1415 echo "# $THISDATE" >> $MAKEFILE
1416 echo "# by the command:" >> $MAKEFILE
1417 echo "# $0 $@" >> $MAKEFILE
1418 echo "# executed by:" >> $MAKEFILE
1419 echo "# $USER@${THISHOSTNAME}:${THISCWD}" >> $MAKEFILE
1420
1421 EXE_AD=$EXECUTABLE"_ad"
1422 EXE_FTL=$EXECUTABLE"_ftl"
1423 EXE_SVD=$EXECUTABLE"_svd"
1424
1425 cat >>$MAKEFILE <<EOF
1426 #
1427 # OPTFILE="$OPTFILE"
1428 #
1429 # BUILDDIR : Directory where object files are written
1430 # SOURCEDIRS : Directories containing the source (.F) files
1431 # INCLUDEDIRS : Directories containing the header-source (.h) files
1432 # EXEDIR : Directory where executable that is generated is written
1433 # EXECUTABLE : Full path of executable binary
1434 #
1435 # CPP : C-preprocessor command
1436 # INCLUDES : Directories searched for header files
1437 # DEFINES : Macro definitions for CPP
1438 # MAKEDEPEND : Dependency generator
1439 # KPP : Special preprocessor command (specific to platform)
1440 # KFLAGS : Flags for KPP
1441 # FC : Fortran compiler command
1442 # FFLAGS : Configuration/debugging options for FC
1443 # FOPTIM : Optimization options for FC
1444 # LINK : Command for link editor program
1445 # LIBS : Library flags /or/ additional optimization/debugging flags
1446
1447 ROOTDIR = ${ROOTDIR}
1448 BUILDDIR = ${BUILDDIR}
1449 SOURCEDIRS = ${SOURCEDIRS}
1450 INCLUDEDIRS = ${INCLUDEDIRS}
1451 EXEDIR = ${EXEDIR}
1452 EXECUTABLE = \$(EXEDIR)/${EXECUTABLE}
1453 TOOLSDIR = ${TOOLSDIR}
1454
1455 #eh3 new defines for the adjoint work
1456 AUTODIFF = ${ROOTDIR}/pkg/autodiff
1457 EXE_AD = ${EXE_AD}
1458 EXE_FTL = ${EXE_FTL}
1459 EXE_SVD = ${EXE_SVD}
1460
1461 ENABLED_PACKAGES = ${ENABLED_PACKAGES}
1462 DISABLED_PACKAGES = ${DISABLED_PACKAGES}
1463
1464 # These files are created by Makefile
1465 SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h
1466
1467 EOF
1468
1469 # Note: figure out some way to add Hyades JAM libraries here
1470
1471 cat >>$MAKEFILE <<EOF
1472 # Unix ln (link)
1473 LN = ${LN}
1474 # C preprocessor
1475 CPP = cat \$< | ${S64} | ${CPP}
1476 # Dependency generator
1477 MAKEDEPEND = ${MAKEDEPEND}
1478 # Special preprocessor (KAP on DECs, FPP on Crays)
1479 KPP = ${KPP}
1480 # Fortran compiler
1481 FC = ${FC}
1482 # Fortran compiler
1483 F90C = ${F90C}
1484 # Link editor
1485 LINK = ${LINK}
1486
1487 # Defines for CPP
1488 DEFINES = ${DEFINES}
1489 # Includes for CPP
1490 INCLUDES = ${INCLUDES}
1491 # Flags for KPP
1492 KFLAGS1 = ${KFLAGS1}
1493 KFLAGS2 = ${KFLAGS2}
1494 # Optim./debug for FC
1495 FFLAGS = ${FFLAGS}
1496 FOPTIM = ${FOPTIM}
1497 # Optim./debug for FC
1498 F90FLAGS = ${F90FLAGS}
1499 F90OPTIM = ${F90OPTIM}
1500 # Flags for CC
1501 CFLAGS = ${CFLAGS}
1502 # Files that should not be optimized
1503 NOOPTFILES = ${NOOPTFILES}
1504 NOOPTFLAGS = ${NOOPTFLAGS}
1505 # Flags and libraries needed for linking
1506 LIBS = ${LIBS} \$(XLIBS)
1507 # Name of the Mekfile
1508 MAKEFILE=${MAKEFILE}
1509
1510 EOF
1511
1512 cat srclist.inc >> $MAKEFILE
1513 cat csrclist.inc >> $MAKEFILE
1514 cat f90srclist.inc >> $MAKEFILE
1515 cat hlist.inc >> $MAKEFILE
1516 cat ad_flow_files.inc >> $MAKEFILE
1517 echo >> $MAKEFILE
1518 echo 'F77FILES = $(SRCFILES:.F=.f)' >> $MAKEFILE
1519 echo 'F90FILES = $(F90SRCFILES:.F90=.f90)' >> $MAKEFILE
1520 echo 'OBJFILES = $(SRCFILES:.F=.o) $(CSRCFILES:.c=.o) $(F90SRCFILES:.F90=.o)' >> $MAKEFILE
1521
1522 rm -f srclist.inc csrclist.inc hlist.inc flist.tmp clist.tmp f90srclist.inc
1523 rm -f ad_flow_files.inc
1524
1525 cat >>$MAKEFILE <<EOF
1526
1527 .SUFFIXES:
1528 .SUFFIXES: .o .f .p .F .c .F90 .f90
1529
1530 all: \$(EXECUTABLE)
1531 \$(EXECUTABLE): \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(OBJFILES)
1532 @echo Creating \$@ ...
1533 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
1534 depend:
1535 @make links
1536 \$(MAKEDEPEND) -o .f \$(DEFINES) \$(INCLUDES) \$(SRCFILES)
1537 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
1538
1539 links: \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(SPECIAL_FILES)
1540
1541 small_f: \$(F77FILES) \$(F90FILES)
1542
1543 output.txt: \$(EXECUTABLE)
1544 @printf 'running ... '
1545 @\$(EXECUTABLE) > \$@
1546
1547 clean:
1548 -rm -rf *.o *.f *.p *.f90 *.mod ${RMFILES} work.{pc,pcl} *.template
1549 Clean:
1550 @make clean
1551 @make cleanlinks
1552 -rm -f \$(SPECIAL_FILES)
1553 -rm -f genmake_state genmake_*optfile genmake_warnings make.log run.log *.bak
1554 CLEAN:
1555 @make Clean
1556 -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
1557 -find \$(EXEDIR) -name "*.data" -exec rm {} \;
1558 -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
1559 -rm -f \$(EXECUTABLE) output.txt
1560
1561 #eh3 Makefile: makefile
1562 makefile:
1563 $THIS_SCRIPT $@
1564 cleanlinks:
1565 -find . -type l -exec rm {} \;
1566
1567 # Special targets ($SPECIAL_FILES) which are create by make
1568 ${PACKAGES_DOT_H}:
1569 @echo Creating \$@ ...
1570 @\$(TOOLSDIR)/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -bPACKAGES_CONFIG_H "Disabled packages:" \$(DISABLED_PACKAGES) " " "Enabled packages:" \$(ENABLED_PACKAGES) > \$@
1571 AD_CONFIG.h:
1572 @echo Creating \$@ ...
1573 @\$(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 > \$@
1574 FC_NAMEMANGLE.h:
1575 @echo Creating \$@ ...
1576 echo "$FC_NAMEMANGLE" > \$@
1577
1578 # The normal chain of rules is ( .F - .f - .o )
1579 .F.f:
1580 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1581 .f.o:
1582 \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
1583 .F90.f90:
1584 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1585 .f90.o:
1586 \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
1587 .c.o:
1588 \$(CC) \$(CFLAGS) -c \$<
1589
1590 # Special exceptions that use the ( .F - .p - .f - .o ) rule-chain
1591 .F.p:
1592 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1593 .p.f:
1594 \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
1595
1596 #=========================================
1597 #=== Automatic Differentiation Rules ===
1598
1599 TAMC = ${TAMC}
1600 TAF = ${TAF}
1601
1602 TAF_EXTRA = ${TAF_EXTRA}
1603 TAMC_EXTRA = ${TAMC_EXTRA}
1604
1605 EOF
1606
1607 ad_vars="AD_TAMC_FLAGS AD_TAF_FLAGS"
1608 ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF_FLAGS"
1609 ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
1610 for i in $ad_vars ; do
1611 name=$i
1612 t1="t2=\$"`echo $i`
1613 eval $t1
1614 printf "%-20s = " $name >> $MAKEFILE
1615 echo $t2 >> $MAKEFILE
1616 done
1617
1618 echo " Add the source list for AD code generation"
1619 echo >> $MAKEFILE
1620 echo -n "AD_FILES = " >> $MAKEFILE
1621 AD_FILES=`cat ad_files`
1622 for i in $AD_FILES ; do
1623 echo " \\" >> $MAKEFILE
1624 echo -n " $i" >> $MAKEFILE
1625 done
1626 echo >> $MAKEFILE
1627 rm -f ad_files
1628
1629 cat >>$MAKEFILE <<EOF
1630
1631 # ... AD ...
1632 adall: ad_taf
1633 adtaf: ad_taf_output.f
1634 adtamc: ad_tamc_output.f
1635
1636 ad_input_code.f: \$(AD_FILES) \$(HEADERFILES)
1637 @\$(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
1638 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
1639 -rm -f ad_config.template
1640 @make \$(F77FILES)
1641 @make \$(AD_FLOW_FILES)
1642 cat \$(AD_FLOW_FILES) \$(AD_FILES) > ad_input_code.f
1643
1644 ad_taf_output.f: ad_input_code.f
1645 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f
1646 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f
1647
1648 adtafonly:
1649 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f
1650 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f
1651
1652 ad_taf: ad_taf_output.o \$(OBJFILES)
1653 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
1654
1655 ad_tamc_output.f: ad_input_code.f
1656 \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.f
1657 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.f
1658
1659 ad_tamc: ad_tamc_output.o \$(OBJFILES)
1660 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
1661
1662
1663 # ... FTL ...
1664 ftlall: ftl_taf
1665 ftltaf: ftl_taf_output.f
1666 ftltamc: ftl_tamc_output.f
1667
1668 ftl_input_code.f: \$(AD_FILES) \$(HEADERFILES)
1669 @\$(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
1670 cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
1671 -rm -f ftl_config.template
1672 @make \$(F77FILES)
1673 @make \$(AD_FLOW_FILES)
1674 cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.f
1675
1676 ftl_taf_output.f: ftl_input_code.f
1677 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f
1678 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f
1679
1680 ftltafonly:
1681 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f
1682 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f
1683
1684 ftl_taf: ftl_taf_output.o \$(OBJFILES)
1685 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
1686
1687 ftl_tamc_output.f: ftl_input_code.f
1688 \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.f
1689 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.f
1690
1691 ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
1692 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
1693
1694
1695 # ... SVD ...
1696 svdtaf: ad_taf_output.f ftl_taf_output.f
1697 svdall: svd_taf
1698
1699 svd_taf: ad_taf_output.o ftl_taf_output.o \$(OBJFILES)
1700 \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
1701
1702
1703 #=========================================
1704
1705 EOF
1706
1707 if test "x$EXEHOOK" != x ; then
1708 printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE
1709 fi
1710
1711 echo " Making list of \"exceptions\" that need \".p\" files"
1712 for i in $KPPFILES ; do
1713 base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
1714 RETVAL=$?
1715 if test "x$RETVAL" != x0 ; then
1716 echo "Error: unable to add file \"$i\" to the exceptions list"
1717 fi
1718 echo "$base.f: $base.p" >> $MAKEFILE
1719 done
1720
1721 echo " Making list of NOOPTFILES"
1722 for i in $NOOPTFILES ; do
1723 base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
1724 RETVAL=$?
1725 if test "x$RETVAL" != x0 ; then
1726 echo "Error: unable to add file \"$i\" to the exceptions list"
1727 fi
1728 echo "$base.o: $base.f" >> $MAKEFILE
1729 printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE
1730 done
1731
1732 echo " Add rules for links"
1733 cat srclinks.tmp >> $MAKEFILE
1734 rm -f srclinks.tmp
1735
1736 echo " Adding makedepend marker"
1737 printf "\n\n# DO NOT DELETE\n" >> $MAKEFILE
1738
1739 printf "\n=== Done ===\n"
1740
1741 # Create special header files
1742 $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"
1743 if test ! -f $PACKAGES_DOT_H ; then
1744 mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
1745 else
1746 cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H > /dev/null 2>&1
1747 RETVAL=$?
1748 if test "x$RETVAL" = x0 ; then
1749 rm -f $PACKAGES_DOT_H".tmp"
1750 else
1751 mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"
1752 mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
1753 fi
1754 fi
1755 if test ! -f AD_CONFIG.h ; then
1756 $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
1757 fi
1758
1759
1760 # Write the "state" for future records
1761 if test "x$DUMPSTATE" != xf ; then
1762 echo -n "" > genmake_state
1763 for i in $gm_state ; do
1764 t1="t2=\$$i"
1765 eval $t1
1766 echo "$i='$t2'" >> genmake_state
1767 done
1768 fi

  ViewVC Help
Powered by ViewVC 1.1.22