/[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.41 - (show annotations) (download)
Thu Nov 20 00:25:43 2003 UTC (20 years, 4 months ago) by edhill
Branch: MAIN
Changes since 1.40: +113 -82 lines
 o cleanups: add better description of options and remove dead options

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

  ViewVC Help
Powered by ViewVC 1.1.22