/[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.59 - (show annotations) (download)
Sun Jan 11 17:02:47 2004 UTC (20 years, 2 months ago) by edhill
Branch: MAIN
Changes since 1.58: +3 -2 lines
 o fix afe syntax error

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

  ViewVC Help
Powered by ViewVC 1.1.22