/[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.56 - (show annotations) (download)
Sat Dec 6 23:33:10 2003 UTC (15 years, 10 months ago) by edhill
Branch: MAIN
Changes since 1.55: +4 -2 lines
 o add conversion "x86_64" -> "amd64"

1 #! /usr/bin/env bash
2 #
3 # $Header: /u/u3/gcmpack/MITgcm/tools/genmake2,v 1.55 2003/12/06 00:34:29 jmc 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=
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 printf "\n=== Determining package settings ===\n"
966 if test "x${PDEPEND}" = x ; then
967 tmp=$ROOTDIR"/pkg/pkg_depend"
968 if test -r $tmp ; then
969 PDEPEND=$tmp
970 else
971 echo "Warning: No package dependency information was specified."
972 echo " Please check that ROOTDIR/pkg/pkg_depend exists."
973 fi
974 else
975 if test ! -r ${PDEPEND} ; then
976 echo "Error: can't read package dependency info from PDEPEND=\"$PDEPEND\""
977 exit 1
978 fi
979 fi
980 echo " getting package dependency info from $PDEPEND"
981 # Strip the comments and then convert the dependency file into
982 # two arrays: PNAME, DNAME
983 cat $PDEPEND | sed -e 's/#.*$//g' \
984 | $AWK 'BEGIN{nn=-1;} (NF>0){ for(i=2;i<=NF;i++){nn++; print "PNAME_"nn"="$1"\nDNAME_"nn"="$i}} END{print "nname="nn}' \
985 > ./.pd_tmp
986 RETVAL=$?
987 if test ! "x${RETVAL}" = x0 ; then
988 echo "Error: unable to parse package dependencies -- please check PDEPEND=\"$PDEPEND\""
989 exit 1
990 fi
991 . ./.pd_tmp
992 rm -f ./.pd_tmp
993
994 # Search for default packages. Note that a "$ROOTDIR/pkg/pkg_groups"
995 # file should eventually be added so that, for convenience, one can
996 # specify groups of packages using names like "ocean" and "atmosphere".
997 echo " checking default package list: "
998 if test "x${PDEFAULT}" = x ; then
999 for i in "." $MODS ; do
1000 if test -r $i"/packages.conf" ; then
1001 PDEFAULT=$i"/packages.conf"
1002 break
1003 fi
1004 done
1005 fi
1006 if test "x${PDEFAULT}" = x ; then
1007 PDEFAULT="$ROOTDIR/pkg/pkg_default"
1008 fi
1009 if test "x${PDEFAULT}" = xNONE ; then
1010 echo " default packages file disabled"
1011 else
1012 if test ! -r $PDEFAULT ; then
1013 echo "Warning: can't read default packages from PDEFAULT=\"$PDEFAULT\""
1014 else
1015 echo " using PDEFAULT=\"$PDEFAULT\""
1016 # Strip the comments and add all the names
1017 def=`cat $PDEFAULT | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
1018 RETVAL=$?
1019 if test "x${RETVAL}" != x0 ; then
1020 echo -n "Error: can't parse default package list "
1021 echo "-- please check PDEFAULT=\"$PDEFAULT\""
1022 exit 1
1023 fi
1024 for i in $def ; do
1025 PACKAGES="$PACKAGES $i"
1026 done
1027 echo " before group expansion packages are: $PACKAGES"
1028 expand_pkg_groups
1029 echo " after group expansion packages are: $PACKAGES"
1030 fi
1031 fi
1032
1033 echo " applying DISABLE settings"
1034 pack=
1035 for p in $PACKAGES ; do
1036 addit="t"
1037 for d in $DISABLE ; do
1038 if test "x$p" = "x$d" ; then
1039 addit="f"
1040 fi
1041 done
1042 if test "x$addit" = xt ; then
1043 pack="$pack $p"
1044 fi
1045 done
1046 PACKAGES="$pack"
1047 echo " applying ENABLE settings"
1048 echo "" > ./.tmp_pack
1049 PACKAGES="$PACKAGES $ENABLE"
1050 for i in $PACKAGES ; do
1051 if test ! -d "$ROOTDIR/pkg/$i" ; then
1052 echo "Error: can't find package $i at \"$ROOTDIR/pkg/$i\""
1053 exit 1
1054 fi
1055 echo $i >> ./.tmp_pack
1056 done
1057 pack=`cat ./.tmp_pack | sort | uniq`
1058 rm -f ./.tmp_pack
1059 PACKAGES=
1060 for i in $pack ; do
1061 PACKAGES="$PACKAGES $i"
1062 done
1063 echo " packages are: $PACKAGES"
1064
1065 echo " applying package dependency rules"
1066 ck=
1067 while test "x$ck" != xtt ; do
1068 i=0
1069 # rtot=${#PNAME[@]}
1070 rtot=$nname
1071 while test $i -lt $rtot ; do
1072
1073 # Is $pname in the current $PACKAGES list?
1074 # pname=${PNAME[$i]}
1075 tmp="pname=\"\$PNAME_$i\""
1076 eval $tmp
1077 pin="f"
1078 for p in $PACKAGES ; do
1079 if test "x$p" = "x$pname" ; then
1080 pin="t"
1081 fi
1082 done
1083
1084 # Is the DNAME entry a (+) or (-) rule ?
1085 tmp="dname=\"\$DNAME_$i\""
1086 eval $tmp
1087 plus="-"
1088 echo $dname | grep '^+' > /dev/null 2>&1
1089 RETVAL=$?
1090 if test "x$RETVAL" = x0 ; then
1091 plus="+"
1092 fi
1093
1094 # Is $dname in the current $PACKAGES list?
1095 dname=`echo $dname | sed -e 's/^[+-]//'`
1096 din="f"
1097 for p in $PACKAGES ; do
1098 if test "x$p" = "x$dname" ; then
1099 din="t"
1100 fi
1101 done
1102
1103 # Do we need to add $dname according to the dependency rules?
1104 if test "x$pin" = xt -a "x$plus" = "x+" -a "x$din" = xf ; then
1105 in_dis="f"
1106 for dis in $DISABLE ; do
1107 if test "x$dis" = "x$dname" ; then
1108 in_dis="t"
1109 fi
1110 done
1111 if test "x$in_dis" = xt ; then
1112 echo "Error: can't satisfy package dependencies:"
1113 echo " \"$dname\" is required by the dependency rules"
1114 echo " but is disallowed by the DISABLE settings"
1115 exit 1
1116 else
1117 PACKAGES="$PACKAGES $dname"
1118 ck=
1119 fi
1120 fi
1121
1122 # Do we need to get rid of $dname according to the dependency rules?
1123 if test "x$pin" = xt -a "x$plus" = "x-" -a "x$din" = xt; then
1124 echo "Error: can't satisfy package dependencies:"
1125 echo " \"$pname\" was requested but is disallowed by"
1126 echo " the dependency rules for \"$dname\""
1127 exit 1
1128 fi
1129 i=$(( $i + 1 ))
1130 done
1131 ck=$ck"t"
1132 done
1133 echo " packages are: $PACKAGES"
1134 for i in $PACKAGES ; do
1135 adr="$ROOTDIR/pkg/$i"
1136 if test -d $adr ; then
1137 SOURCEDIRS="$SOURCEDIRS $adr"
1138 INCLUDEDIRS="$INCLUDEDIRS $adr"
1139 if test "x$i" = xautodiff ; then
1140 AUTODIFF_PKG_USED=t
1141 fi
1142 else
1143 echo "Error: the directory \"$adr\" for package $i doesn't exist"
1144 exit 1
1145 fi
1146 done
1147
1148
1149 # Create a list of #define and #undef to enable/disable packages
1150 PACKAGES_DOT_H=PACKAGES_CONFIG.h
1151 # The following UGLY HACK sets multiple "#undef"s and it needs to go
1152 # away. On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h
1153 # file would eventually be split up so that all package-related #define
1154 # statements could be separated and handled only by genmake.
1155 names=`ls -1 "$ROOTDIR/pkg"`
1156 all_pack=
1157 DISABLED_PACKAGES=
1158 for n in $names ; do
1159 if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
1160 has_pack="f"
1161 for pack in $PACKAGES ; do
1162 if test "x$pack" = "x$n" ; then
1163 has_pack="t"
1164 break
1165 fi
1166 done
1167 if test "x$has_pack" = xf ; then
1168 undef=`echo "ALLOW_$n" | $AWK '{print toupper($0)}'`
1169 DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
1170 fi
1171 fi
1172 done
1173 ENABLED_PACKAGES=
1174 for i in $PACKAGES ; do
1175 def=`echo "ALLOW_$i" | $AWK '{print toupper($0)}'`
1176 ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
1177 #eh3 DEFINES="$DEFINES -D$def"
1178
1179 #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
1180 case $i in
1181 aim_v23)
1182 ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
1183 echo "Warning: ALLOW_AIM is set to enable aim_v23."
1184 ;;
1185 esac
1186 #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
1187
1188 done
1189
1190 echo " Adding STANDARDDIRS"
1191 BUILDDIR=${BUILDDIR:-.}
1192 if test "x$STANDARDDIRS" = x ; then
1193 STANDARDDIRS="eesupp model"
1194 fi
1195 for d in $STANDARDDIRS ; do
1196 adr="$ROOTDIR/$d/src"
1197 if test ! -d $adr ; then
1198 echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1199 echo " is correct and that you correctly specified the STANDARDDIRS option"
1200 exit 1
1201 else
1202 SOURCEDIRS="$SOURCEDIRS $adr"
1203 fi
1204 adr="$ROOTDIR/$d/inc"
1205 if test ! -d $adr ; then
1206 echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1207 echo " is correct and that you correctly specified the STANDARDDIRS option"
1208 exit 1
1209 else
1210 INCLUDEDIRS="$INCLUDEDIRS $adr"
1211 fi
1212 done
1213
1214 echo " Searching for *OPTIONS.h files in order to warn about the presence"
1215 echo " of \"#define \"-type statements that are no longer allowed:"
1216 CPP_OPTIONS=
1217 CPP_EEOPTIONS=
1218 spaths=". $INCLUDEDIRS"
1219 names=`ls -1 "$ROOTDIR/pkg"`
1220 for i in $spaths ; do
1221 try="$i/CPP_OPTIONS.h"
1222 if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
1223 echo " found CPP_OPTIONS=\"$try\""
1224 CPP_OPTIONS="$try"
1225 # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
1226 for n in $names ; do
1227 test_for_package_in_cpp_options $CPP_OPTIONS $n
1228 done
1229 fi
1230 try="$i/CPP_EEOPTIONS.h"
1231 if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
1232 echo " found CPP_EEOPTIONS=\"$try\""
1233 # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
1234 #**** not yet enabled ****
1235 # test_for_mpi_in_cpp_eeoptions $try
1236 #**** not yet enabled ****
1237 CPP_EEOPTIONS="$try"
1238 fi
1239 done
1240 if test "x$CPP_OPTIONS" = x ; then
1241 echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
1242 exit 1
1243 fi
1244
1245 # Here, we build the list of files to be "run through" the adjoint
1246 # compiler.
1247 if test -f ./ad_files ; then
1248 rm -f ./ad_files
1249 fi
1250 echo " Creating the list of files for the adjoint compiler."
1251 for i in $SOURCEDIRS ; do
1252 list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
1253 for j in $list_files ; do
1254 cat $i/$j >> ad_files
1255 done
1256 done
1257
1258 echo
1259 echo "=== Creating the Makefile ==="
1260 echo " setting INCLUDES"
1261 for i in $INCLUDEDIRS ; do
1262 if ! test -d $i ; then
1263 # INCLUDES="$INCLUDES -I$i"
1264 # else
1265 echo "Warning: can't find INCLUDEDIRS=\"$i\""
1266 fi
1267 done
1268
1269 echo " Determining the list of source and include files"
1270 rm -rf .links.tmp
1271 mkdir .links.tmp
1272 echo "# This section creates symbolic links" > srclinks.tmp
1273 echo "" >> srclinks.tmp
1274 echo -n 'SRCFILES = ' > srclist.inc
1275 echo -n 'CSRCFILES = ' > csrclist.inc
1276 echo -n 'F90SRCFILES = ' > f90srclist.inc
1277 echo -n 'HEADERFILES = ' > hlist.inc
1278 echo -n 'AD_FLOW_FILES = ' > ad_flow_files.inc
1279 alldirs="$SOURCEDIRS $INCLUDEDIRS ."
1280 for d in $alldirs ; do
1281 deplist=
1282 sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
1283 sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
1284 for sf in $sfiles ; do
1285 if test ! -r ".links.tmp/$sf" ; then
1286 if test -f "$d/$sf" ; then
1287 case $d/$sf in
1288 ./$PACKAGES_DOT_H)
1289 ;;
1290 ./AD_CONFIG.h)
1291 ;;
1292 ./FC_NAMEMANGLE.h)
1293 ;;
1294 *)
1295 touch .links.tmp/$sf
1296 deplist="$deplist $sf"
1297 ;;
1298 esac
1299 extn=`echo $sf | $AWK -F '.' '{print $NF}'`
1300 case $extn in
1301 F)
1302 echo " \\" >> srclist.inc
1303 echo -n " $sf" >> srclist.inc
1304 ;;
1305 F90)
1306 echo " \\" >> f90srclist.inc
1307 echo -n " $sf" >> f90srclist.inc
1308 ;;
1309 c)
1310 echo " \\" >> csrclist.inc
1311 echo -n " $sf" >> csrclist.inc
1312 ;;
1313 h)
1314 echo " \\" >> hlist.inc
1315 echo -n " $sf" >> hlist.inc
1316 ;;
1317 flow)
1318 echo " \\" >> ad_flow_files.inc
1319 echo -n " $sf" >> ad_flow_files.inc
1320 ;;
1321 esac
1322 fi
1323 fi
1324 done
1325 if test "x$deplist" != x ; then
1326 echo "" >> srclinks.tmp
1327 echo "# These files are linked from $d" >> srclinks.tmp
1328 echo "$deplist :" >> srclinks.tmp
1329 printf "\t\$(LN) %s/\$@ \$@\n" $d >> srclinks.tmp
1330 fi
1331 done
1332 rm -rf .links.tmp
1333 echo "" >> srclist.inc
1334 echo "" >> csrclist.inc
1335 echo "" >> f90srclist.inc
1336 echo "" >> hlist.inc
1337 echo "" >> ad_flow_files.inc
1338
1339 if test -e $MAKEFILE ; then
1340 mv -f $MAKEFILE "$MAKEFILE.bak"
1341 fi
1342 echo " Writing makefile: $MAKEFILE"
1343 echo "# Multithreaded + multi-processing makefile for:" > $MAKEFILE
1344 echo "# $MACHINE" >> $MAKEFILE
1345 echo "# This makefile was generated automatically on" >> $MAKEFILE
1346 echo "# $THISDATE" >> $MAKEFILE
1347 echo "# by the command:" >> $MAKEFILE
1348 echo "# $0 $@" >> $MAKEFILE
1349 echo "# executed by:" >> $MAKEFILE
1350 echo "# $USER@${THISHOSTNAME}:${THISCWD}" >> $MAKEFILE
1351
1352 EXE_AD=$EXECUTABLE"_ad"
1353 EXE_FTL=$EXECUTABLE"_ftl"
1354 EXE_SVD=$EXECUTABLE"_svd"
1355
1356 cat >>$MAKEFILE <<EOF
1357 #
1358 # OPTFILE="$OPTFILE"
1359 #
1360 # BUILDDIR : Directory where object files are written
1361 # SOURCEDIRS : Directories containing the source (.F) files
1362 # INCLUDEDIRS : Directories containing the header-source (.h) files
1363 # EXEDIR : Directory where executable that is generated is written
1364 # EXECUTABLE : Full path of executable binary
1365 #
1366 # CPP : C-preprocessor command
1367 # INCLUDES : Directories searched for header files
1368 # DEFINES : Macro definitions for CPP
1369 # MAKEDEPEND : Dependency generator
1370 # KPP : Special preprocessor command (specific to platform)
1371 # KFLAGS : Flags for KPP
1372 # FC : Fortran compiler command
1373 # FFLAGS : Configuration/debugging options for FC
1374 # FOPTIM : Optimization options for FC
1375 # LINK : Command for link editor program
1376 # LIBS : Library flags /or/ additional optimization/debugging flags
1377
1378 ROOTDIR = ${ROOTDIR}
1379 BUILDDIR = ${BUILDDIR}
1380 SOURCEDIRS = ${SOURCEDIRS}
1381 INCLUDEDIRS = ${INCLUDEDIRS}
1382 EXEDIR = ${EXEDIR}
1383 EXECUTABLE = \$(EXEDIR)/${EXECUTABLE}
1384 TOOLSDIR = ${TOOLSDIR}
1385
1386 #eh3 new defines for the adjoint work
1387 AUTODIFF = ${ROOTDIR}/pkg/autodiff
1388 EXE_AD = ${EXE_AD}
1389 EXE_FTL = ${EXE_FTL}
1390 EXE_SVD = ${EXE_SVD}
1391
1392 ENABLED_PACKAGES = ${ENABLED_PACKAGES}
1393 DISABLED_PACKAGES = ${DISABLED_PACKAGES}
1394
1395 # These files are created by Makefile
1396 SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h
1397
1398 EOF
1399
1400 # Note: figure out some way to add Hyades JAM libraries here
1401
1402 cat >>$MAKEFILE <<EOF
1403 # Unix ln (link)
1404 LN = ${LN}
1405 # C preprocessor
1406 CPP = cat \$< | ${S64} | ${CPP}
1407 # Dependency generator
1408 MAKEDEPEND = ${MAKEDEPEND}
1409 # Special preprocessor (KAP on DECs, FPP on Crays)
1410 KPP = ${KPP}
1411 # Fortran compiler
1412 FC = ${FC}
1413 # Fortran compiler
1414 F90C = ${F90C}
1415 # Link editor
1416 LINK = ${LINK}
1417
1418 # Defines for CPP
1419 DEFINES = ${DEFINES}
1420 # Includes for CPP
1421 INCLUDES = ${INCLUDES}
1422 # Flags for KPP
1423 KFLAGS1 = ${KFLAGS1}
1424 KFLAGS2 = ${KFLAGS2}
1425 # Optim./debug for FC
1426 FFLAGS = ${FFLAGS}
1427 FOPTIM = ${FOPTIM}
1428 # Optim./debug for FC
1429 F90FLAGS = ${F90FLAGS}
1430 F90OPTIM = ${F90OPTIM}
1431 # Flags for CC
1432 CFLAGS = ${CFLAGS}
1433 # Files that should not be optimized
1434 NOOPTFILES = ${NOOPTFILES}
1435 NOOPTFLAGS = ${NOOPTFLAGS}
1436 # Flags and libraries needed for linking
1437 LIBS = ${LIBS} \$(XLIBS)
1438 # Name of the Mekfile
1439 MAKEFILE=${MAKEFILE}
1440
1441 EOF
1442
1443 cat srclist.inc >> $MAKEFILE
1444 cat csrclist.inc >> $MAKEFILE
1445 cat f90srclist.inc >> $MAKEFILE
1446 cat hlist.inc >> $MAKEFILE
1447 cat ad_flow_files.inc >> $MAKEFILE
1448 echo >> $MAKEFILE
1449 echo 'F77FILES = $(SRCFILES:.F=.f)' >> $MAKEFILE
1450 echo 'F90FILES = $(F90SRCFILES:.F90=.f90)' >> $MAKEFILE
1451 echo 'OBJFILES = $(SRCFILES:.F=.o) $(CSRCFILES:.c=.o) $(F90SRCFILES:.F90=.o)' >> $MAKEFILE
1452
1453 rm -f srclist.inc csrclist.inc hlist.inc flist.tmp clist.tmp f90srclist.inc
1454 rm -f ad_flow_files.inc
1455
1456 cat >>$MAKEFILE <<EOF
1457
1458 .SUFFIXES:
1459 .SUFFIXES: .o .f .p .F .c .F90 .f90
1460
1461 all: \$(EXECUTABLE)
1462 \$(EXECUTABLE): \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(OBJFILES)
1463 @echo Creating \$@ ...
1464 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
1465 depend:
1466 @make links
1467 \$(MAKEDEPEND) -o .f \$(DEFINES) \$(INCLUDES) \$(SRCFILES)
1468 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
1469
1470 links: \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(SPECIAL_FILES)
1471
1472 small_f: \$(F77FILES) \$(F90FILES)
1473
1474 output.txt: \$(EXECUTABLE)
1475 @printf 'running ... '
1476 @\$(EXECUTABLE) > \$@
1477
1478 clean:
1479 -rm -rf *.o *.f *.p *.f90 *.mod ${RMFILES} work.{pc,pcl} *.template
1480 Clean:
1481 @make clean
1482 @make cleanlinks
1483 -rm -f \$(SPECIAL_FILES)
1484 -rm -f genmake_state genmake_*optfile genmake_warnings make.log run.log *.bak
1485 CLEAN:
1486 @make Clean
1487 -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
1488 -find \$(EXEDIR) -name "*.data" -exec rm {} \;
1489 -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
1490 -rm -f \$(EXECUTABLE) output.txt
1491
1492 #eh3 Makefile: makefile
1493 makefile:
1494 $THIS_SCRIPT $@
1495 cleanlinks:
1496 -find . -type l -exec rm {} \;
1497
1498 # Special targets ($SPECIAL_FILES) which are create by make
1499 ${PACKAGES_DOT_H}:
1500 @echo Creating \$@ ...
1501 @\$(TOOLSDIR)/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -bPACKAGES_CONFIG_H "Disabled packages:" \$(DISABLED_PACKAGES) " " "Enabled packages:" \$(ENABLED_PACKAGES) > \$@
1502 AD_CONFIG.h:
1503 @echo Creating \$@ ...
1504 @\$(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 > \$@
1505 FC_NAMEMANGLE.h:
1506 @echo Creating \$@ ...
1507 echo "$FC_NAMEMANGLE" > \$@
1508
1509 # The normal chain of rules is ( .F - .f - .o )
1510 .F.f:
1511 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1512 .f.o:
1513 \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
1514 .F90.f90:
1515 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1516 .f90.o:
1517 \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
1518 .c.o:
1519 \$(CC) \$(CFLAGS) -c \$<
1520
1521 # Special exceptions that use the ( .F - .p - .f - .o ) rule-chain
1522 .F.p:
1523 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1524 .p.f:
1525 \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
1526
1527 #=========================================
1528 #=== Automatic Differentiation Rules ===
1529
1530 TAMC = ${TAMC}
1531 TAF = ${TAF}
1532
1533 TAF_EXTRA = ${TAF_EXTRA}
1534 TAMC_EXTRA = ${TAMC_EXTRA}
1535
1536 EOF
1537
1538 ad_vars="AD_TAMC_FLAGS AD_TAF_FLAGS"
1539 ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF_FLAGS"
1540 ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
1541 for i in $ad_vars ; do
1542 name=$i
1543 t1="t2=\$"`echo $i`
1544 eval $t1
1545 printf "%-20s = " $name >> $MAKEFILE
1546 echo $t2 >> $MAKEFILE
1547 done
1548
1549 echo " Add the source list for AD code generation"
1550 echo >> $MAKEFILE
1551 echo -n "AD_FILES = " >> $MAKEFILE
1552 AD_FILES=`cat ad_files`
1553 for i in $AD_FILES ; do
1554 echo " \\" >> $MAKEFILE
1555 echo -n " $i" >> $MAKEFILE
1556 done
1557 echo >> $MAKEFILE
1558 rm -f ad_files
1559
1560 cat >>$MAKEFILE <<EOF
1561
1562 # ... AD ...
1563 adall: ad_taf
1564 adtaf: ad_taf_output.f
1565 adtamc: ad_tamc_output.f
1566
1567 ad_input_code.f: \$(AD_FILES) \$(HEADERFILES)
1568 @\$(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
1569 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
1570 -rm -f ad_config.template
1571 @make \$(F77FILES)
1572 @make \$(AD_FLOW_FILES)
1573 cat \$(AD_FLOW_FILES) \$(AD_FILES) > ad_input_code.f
1574
1575 ad_taf_output.f: ad_input_code.f
1576 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f
1577 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f
1578
1579 adtafonly:
1580 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f
1581 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f
1582
1583 ad_taf: ad_taf_output.o \$(OBJFILES)
1584 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
1585
1586 ad_tamc_output.f: ad_input_code.f
1587 \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.f
1588 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.f
1589
1590 ad_tamc: ad_tamc_output.o \$(OBJFILES)
1591 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
1592
1593
1594 # ... FTL ...
1595 ftlall: ftl_taf
1596 ftltaf: ftl_taf_output.f
1597 ftltamc: ftl_tamc_output.f
1598
1599 ftl_input_code.f: \$(AD_FILES) \$(HEADERFILES)
1600 @\$(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
1601 cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
1602 -rm -f ftl_config.template
1603 @make \$(F77FILES)
1604 @make \$(AD_FLOW_FILES)
1605 cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.f
1606
1607 ftl_taf_output.f: ftl_input_code.f
1608 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f
1609 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f
1610
1611 ftltafonly:
1612 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f
1613 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f
1614
1615 ftl_taf: ftl_taf_output.o \$(OBJFILES)
1616 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
1617
1618 ftl_tamc_output.f: ftl_input_code.f
1619 \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.f
1620 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.f
1621
1622 ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
1623 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
1624
1625
1626 # ... SVD ...
1627 svdtaf: ad_taf_output.f ftl_taf_output.f
1628 svdall: svd_taf
1629
1630 svd_taf: ad_taf_output.o ftl_taf_output.o \$(OBJFILES)
1631 \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
1632
1633
1634 #=========================================
1635
1636 EOF
1637
1638 if test "x$EXEHOOK" != x ; then
1639 printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE
1640 fi
1641
1642 echo " Making list of \"exceptions\" that need \".p\" files"
1643 for i in $KPPFILES ; do
1644 base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
1645 RETVAL=$?
1646 if test "x$RETVAL" != x0 ; then
1647 echo "Error: unable to add file \"$i\" to the exceptions list"
1648 fi
1649 echo "$base.f: $base.p" >> $MAKEFILE
1650 done
1651
1652 echo " Making list of NOOPTFILES"
1653 for i in $NOOPTFILES ; do
1654 base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
1655 RETVAL=$?
1656 if test "x$RETVAL" != x0 ; then
1657 echo "Error: unable to add file \"$i\" to the exceptions list"
1658 fi
1659 echo "$base.o: $base.f" >> $MAKEFILE
1660 printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE
1661 done
1662
1663 echo " Add rules for links"
1664 cat srclinks.tmp >> $MAKEFILE
1665 rm -f srclinks.tmp
1666
1667 echo " Adding makedepend marker"
1668 printf "\n\n# DO NOT DELETE\n" >> $MAKEFILE
1669
1670 printf "\n=== Done ===\n"
1671
1672 # Create special header files
1673 $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"
1674 if test ! -f $PACKAGES_DOT_H ; then
1675 mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
1676 else
1677 cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
1678 RETVAL=$?
1679 if test "x$RETVAL" = x0 ; then
1680 rm -f $PACKAGES_DOT_H".tmp"
1681 else
1682 mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"
1683 mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
1684 fi
1685 fi
1686 if test ! -f AD_CONFIG.h ; then
1687 $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
1688 fi
1689
1690
1691 # Write the "state" for future records
1692 if test "x$DUMPSTATE" != xf ; then
1693 echo -n "" > genmake_state
1694 for i in $gm_state ; do
1695 t1="t2=\$$i"
1696 eval $t1
1697 echo "$i='$t2'" >> genmake_state
1698 done
1699 fi

  ViewVC Help
Powered by ViewVC 1.1.22