/[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.58 - (show annotations) (download)
Fri Jan 9 22:08:39 2004 UTC (15 years, 10 months ago) by afe
Branch: MAIN
CVS Tags: hrcube_1
Changes since 1.57: +14 -1 lines
forgotten changes to genmake2 and hs94.cs-32x32x5/code

1 #! /usr/bin/env bash
2 #
3 # $Header: /u/u3/gcmpack/MITgcm/tools/genmake2,v 1.57 2003/12/09 18:58:24 edhill Exp $
4 #
5 # Makefile generator for MITgcm UV codes
6 # created by cnh 03/98
7 # adapted by aja 06/98
8 # modified by aja 01/00
9 # rewritten in bash by eh3 08/03
10
11 # Search for particular CPP #cmds associated with packages
12 # usage: test_for_package_in_cpp_options CPP_file package_name
13 test_for_package_in_cpp_options() {
14 cpp_options=$1
15 pkg=$2
16 test_for_string_in_file $cpp_options "^[ ]*#define.*ALLOW_$pkg" || exit 99
17 test_for_string_in_file $cpp_options "^[ ]*#undef.*ALLOW_$pkg" || exit 99
18 test_for_string_in_file $cpp_options "^[ ]*#define.*DISABLE_$pkg" || exit 99
19 test_for_string_in_file $cpp_options "^[ ]*#undef.*DISABLE_$pkg" || exit 99
20 }
21
22 # Search for particular CPP #cmds associated with MPI
23 # usage: test_for_mpi_in_cpp_eeoptions CPP_file
24 test_for_mpi_in_cpp_eeoptions() {
25 cpp_options=$1
26 test_for_string_in_file $cpp_options "^[ ]*#define.*ALLOW_USE_MPI" || exit 99
27 test_for_string_in_file $cpp_options "^[ ]*#undef.*ALLOW_USE_MPI" || exit 99
28 test_for_string_in_file $cpp_options "^[ ]*#define.*ALWAYS_USE_MPI" || exit 99
29 test_for_string_in_file $cpp_options "^[ ]*#undef.*ALWAYS_USE_MPI" || exit 99
30 }
31
32 # Search for particular string in a file. Return 1 if detected, 0 if not
33 # usage: test_for_string_in_file file string
34 test_for_string_in_file() {
35 file=$1
36 strng=$2
37 grep -i "$strng" $file > /dev/null 2>&1
38 RETVAL=$?
39 if test "x${RETVAL}" = x0 ; then
40 echo -n "Error: In $file there is an illegal line: "
41 grep -i "$strng" $file
42 return 1
43 fi
44 return 0
45 }
46
47 # Read the $ROOTDIR/pkg/pkg_groups file and expand any references to
48 # the package list.
49 expand_pkg_groups() {
50 new_packages=
51 PKG_GROUPS=$ROOTDIR"/pkg/pkg_groups"
52 if test -r $PKG_GROUPS ; then
53 cat $PKG_GROUPS | sed -e 's/#.*$//g' | sed -e 's/:/ : /g' > ./p1.tmp
54 cat ./p1.tmp | $AWK '(NF>2 && $2==":"){ print $0 }' > ./p2.tmp
55 matched=0
56 for i in $PACKAGES ; do
57 line=`grep "^ *$i" ./p2.tmp`
58 RETVAL=$?
59 if test "x$RETVAL" = x0 ; then
60 matched=1
61 replace=`echo $line | $AWK '{ $1=""; $2=""; print $0 }'`
62 echo " replacing \"$i\" with: $replace"
63 new_packages="$new_packages $replace"
64 else
65 new_packages="$new_packages $i"
66 fi
67 done
68 PACKAGES=$new_packages
69 rm -f ./p[1,2].tmp
70 else
71 echo "Warning: can't read package groups definition file: $PKG_GROUPS"
72 fi
73 }
74
75 # Guess possible config options for this host
76 find_possible_configs() {
77
78 tmp1=`uname`"_"`uname -m`
79 tmp2=`echo $tmp1 | sed -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
80 tmp3=`echo $tmp2 | sed -e 's/power macintosh/ppc/'`
81 tmp1=`echo $tmp3 | sed -e 's|x86_64|amd64|'`
82 tmp2=`echo $tmp1 | sed -e 's/i[3-6]86/ia32/' | sed -e 's/athlon/ia32/'`
83 PLATFORM=$tmp2
84 OFLIST=`(cd $ROOTDIR/tools/build_options; ls | grep "^$PLATFORM")`
85 echo " The platform appears to be: $PLATFORM"
86
87 echo "test" > test
88 ln -s ./test link
89 RETVAL=$?
90 if test "x${RETVAL}" = x0 ; then
91 LN="ln -s"
92 else
93 echo "Error: \"ln -s\" does not appear to work on this system!"
94 echo " For help, please contact <MITgcm-support@mitgcm.org>."
95 exit 1
96 fi
97 rm -f test link
98
99 if test "x$CPP" = x ; then
100 CPP="cpp -traditional -P"
101 fi
102
103 # makedepend is not always available
104 if test "x${MAKEDEPEND}" = x ; then
105 which makedepend >& /dev/null
106 RETVAL=$?
107 if test "x${RETVAL}" = x1 ; then
108 echo " makedepend was not found. Using xmakedpend instead."
109 MAKEDEPEND='$(TOOLSDIR)/xmakedepend'
110 fi
111 fi
112
113 # look for possible fortran compilers
114 tmp="$MITGCM_FC $FC efc g77 f77 pgf77 pgf95 ifc f90 f95 mpif77 mpf77 mpxlf95"
115 p_FC=
116 for c in $tmp ; do
117 rm -f ./hello.f ./hello
118 cat >> hello.f <<EOF
119 program hello
120 do i=1,3
121 print *, 'hello world : ', i
122 enddo
123 end
124 EOF
125 $c -o hello hello.f > /dev/null 2>&1
126 RETVAL=$?
127 if test "x${RETVAL}" = x0 ; then
128 p_FC="$p_FC $c"
129 fi
130 done
131 rm -f ./hello.f ./hello
132 if test "x${p_FC}" = x ; then
133 cat 1>&2 <<EOF
134
135 Error: No Fortran compilers were found in your path. Please specify one using:
136
137 1) an "optfile" on (eg. "-optfile=path/to/OPTFILE"),
138 2) a command-line option (eg. "-fc NAME"), or
139 3) the MITGCM_FC environment variable.
140
141 EOF
142 exit 1
143 else
144 echo " The possible FORTRAN compilers found in your path are:"
145 echo " "$p_FC
146 if test "x$FC" = x ; then
147 FC=`echo $p_FC | $AWK '{print $1}'`
148 fi
149 fi
150
151 for i in $p_FC ; do
152 p_OF=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$i
153 if test -r $p_OF ; then
154 OPTFILE=$p_OF
155 echo " The options file: $p_OF"
156 echo " appears to match so we'll use it."
157 break
158 fi
159 done
160 if test "x$OPTFILE" = x ; then
161 cat 1>&2 <<EOF
162
163 Error: No options file was found in: $ROOTDIR/tools/build_options/
164 that matches this platform ("$PLATFORM") and the compilers found in
165 your path. Please specify an "optfile" using:
166
167 1) the command line (eg. "-optfile=path/to/OPTFILE"), or
168 2) the MITGCM_OF environment variable.
169
170 If you need help, please contact the developers at <MITgcm-support@mitgcm.org>.
171
172 EOF
173 exit 1
174 fi
175
176 # # look for possible MPI libraries
177 # mpi_libs=
178 # mpi_fort=`which mpif77 2>/dev/null`
179 # RETVAL=$?
180 # if test "x${RETVAL}" = x0 ; then
181 # cat >>test.f <<EOF
182 # PROGRAM HELLO
183 # DO 10, I=1,10
184 # PRINT *,'Hello World'
185 # 10 CONTINUE
186 # STOP
187 # END
188 # EOF
189 # eval "$mpi_fort -showme test.f > out"
190 # RETVAL=$?
191 # if test "x${RETVAL}" = x0 ; then
192 # a=`cat out`
193 # for i in $a ; do
194 # case $i in
195 # -*)
196 # mpi_libs="$mpi_libs $i" ;;
197 # esac
198 # done
199 # echo "The MPI libs appear to be:"
200 # echo " "$mpi_libs
201 # fi
202 # rm -f test.f out
203 # fi
204
205 }
206
207 # Parse the package dependency information
208 get_pdepend_list() {
209
210 # strip the comments and then convert the dependency file into
211 # two arrays: PNAME, DNAME
212 cat $1 | sed -e 's/#.*$//g' \
213 | $AWK 'BEGIN{nn=0;} (NF>0){ for(i=2;i<=NF;i++){nn++; print "PNAME["nn"]="$1"\nDNAME["nn"]="$i} }' \
214 > ./.pd_tmp
215 . ./.pd_tmp
216 rm -f ./.pd_tmp
217
218 echo -n "PNAME = "${}
219 }
220
221
222 # Explain usage
223 usage() {
224 cat <<EOF
225
226 Usage: "$0" [OPTIONS]
227 where [OPTIONS] can be:
228
229 -help | --help | -h | --h
230 Print this help message and exit.
231
232 -nooptfile | --nooptfile
233 -optfile NAME | --optfile NAME | -of NAME | --of NAME
234 -optfile=NAME | --optfile=NAME | -of=NAME | --of=NAME
235 Use "NAME" as the optfile. By default, an attempt will be
236 made to find an appropriate "standard" optfile in the
237 tools/build_options/ directory.
238
239 -pdepend NAME | --pdepend NAME
240 -pdepend=NAME | --pdepend=NAME
241 Get package dependency information from "NAME".
242
243 -pdefault NAME | --pdefault NAME
244 -pdefault=NAME | --pdefault=NAME
245 Get the default package list from "NAME".
246
247 -make NAME | -m NAME
248 --make=NAME | -m=NAME
249 Use "NAME" for the MAKE program. The default is "make" but
250 many platforms, "gmake" is the preferred choice.
251
252 -makefile NAME | -mf NAME
253 --makefile=NAME | -mf=NAME
254 Call the makefile "NAME". The default is "Makefile".
255
256 -rootdir NAME | --rootdir NAME | -rd NAME | --rd NAME
257 -rootdir=NAME | --rootdir=NAME | -rd=NAME | --rd=NAME
258 Specify the location of the MITgcm ROOTDIR as "NAME".
259 By default, genamke will try to find the location by
260 looking in parent directories (up to the 5th parent).
261
262 -mods NAME | --mods NAME | -mo NAME | --mo NAME
263 -mods=NAME | --mods=NAME | -mo=NAME | --mo=NAME
264 Here, "NAME" specifies a list of directories that are
265 used for additional source code. Files found in the
266 "mods list" are given preference over files of the same
267 name found elsewhere.
268
269 -disable NAME | --disable NAME
270 -disable=NAME | --disable=NAME
271 Here "NAME" specifies a list of packages that we don't
272 want to use. If this violates package dependencies,
273 genamke will exit with an error message.
274
275 -enable NAME | --enable NAME
276 -enable=NAME | --enable=NAME
277 Here "NAME" specifies a list of packages that we wish
278 to specifically enable. If this violates package
279 dependencies, genamke will exit with an error message.
280
281 -standarddirs NAME | --standarddirs NAME
282 -standarddirs=NAME | --standarddirs=NAME
283 Here, "NAME" specifies a list of directories to be
284 used as the "standard" code.
285
286 -fortran NAME | --fortran NAME | -fc NAME | --fc NAME
287 -fc=NAME | --fc=NAME
288 Use "NAME" as the fortran compiler. By default, genmake
289 will search for a working compiler by trying a list of
290 "usual suspects" such as g77, f77, etc.
291
292 -[no]ieee | --[no]ieee
293 Do or don't use IEEE numerics. Note that this option
294 *only* works if it is supported by the OPTFILE that
295 is being used.
296
297 While it is most often a single word, the "NAME" variables specified
298 above can in many cases be a space-delimited string such as:
299
300 --enable pkg1 --enable 'pkg1 pkg2' --enable 'pkg1 pkg2 pkg3'
301 -mods=dir1 -mods='dir1' -mods='dir1 dir2 dir3'
302 -foptim='-Mvect=cachesize:512000,transform -xtypemap=real:64,double:64,integer:32'
303
304 which, depending upon your shell, may need to be single-quoted.
305
306 For more detailed genmake documentation, please see:
307
308 http://mitgcm.org/devel_HOWTO/
309
310 EOF
311
312 exit 1
313 }
314
315 # Build a CPP macro to automate calling C routines from FORTRAN
316 get_fortran_c_namemangling() {
317 default_nm="#define FC_NAMEMANGLE(X) X ## _"
318
319 cat > genmake_test.c <<EOF
320 void tcall( char * string ) { tsub( string ); }
321 EOF
322 $MAKE genmake_test.o >> genmake_warnings 2>&1
323 RETVAL=$?
324 if test "x$RETVAL" != x0 ; then
325 FC_NAMEMANGLE=$default_nm
326 cat <<EOF>> genmake_errors
327
328 WARNING: C test compile fails
329 WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
330 WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here
331 EOF
332 return 1
333 fi
334 c_tcall=`nm genmake_test.o | grep 'T ' | grep tcall | cut -d ' ' -f 3`
335 RETVAL=$?
336 if test "x$RETVAL" != x0 ; then
337 FC_NAMEMANGLE=$default_nm
338 cat <<EOF>> genmake_warnings
339
340 WARNING: The "nm" command failed.
341 WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
342 WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here
343 EOF
344 return 1
345 fi
346 cat > genmake_tcomp.f <<EOF
347 subroutine tcall( string )
348 character*(*) string
349 call tsub( string )
350 end
351 EOF
352 $FC $FFLAGS $DEFINES -c genmake_tcomp.f >> genmake_warnings 2>&1
353 RETVAL=$?
354 if test "x$RETVAL" != x0 ; then
355 FC_NAMEMANGLE=$default_nm
356 cat <<EOF>> genmake_warnings
357
358 WARNING: FORTRAN test compile fails -- please see "genmake_errors"
359 WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
360 WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here.
361 EOF
362 return 1
363 fi
364 f_tcall=`nm genmake_tcomp.o | grep 'T ' | grep tcall | cut -d ' ' -f 3`
365 RETVAL=$?
366 if test "x$RETVAL" != x0 ; then
367 FC_NAMEMANGLE=$default_nm
368 cat <<EOF>> genmake_warnings
369
370 WARNING: The "nm" command failed.
371 WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
372 WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here.
373 EOF
374 return 1
375 fi
376
377 c_a=`echo $c_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 1 | sed -e 's|Y||'`
378 f_a=`echo $f_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 1 | sed -e 's|Y||'`
379 c_b=`echo $c_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 2 | sed -e 's|Y||'`
380 f_b=`echo $f_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 2 | sed -e 's|Y||'`
381
382 nmangle="X"
383 if test "x$c_a" != "x$f_a" ; then
384 comm="echo x$f_a | sed -e 's|x$c_a||'"
385 a=`eval $comm`
386 nmangle="$a ## $nmangle"
387 fi
388 if test "x$c_b" != "x$f_b" ; then
389 comm="echo x$f_b | sed -e 's|x$c_b||'"
390 b=`eval $comm`
391 nmangle="$nmangle ## $b"
392 fi
393
394 FC_NAMEMANGLE="#define FC_NAMEMANGLE(X) $nmangle"
395
396 # cleanup the testing files
397 rm -f genmake_tcomp.* genmake_test.*
398 }
399
400
401 check_HAVE_CLOC() {
402 get_fortran_c_namemangling
403 cat <<EOF > genmake_tc_1.c
404 $FC_NAMEMANGLE
405 #include <stdio.h>
406 #include <stdlib.h>
407 #include <unistd.h>
408 #include <assert.h>
409 #include <sys/time.h>
410 void FC_NAMEMANGLE(cloc) ( double *curtim )
411 {
412 struct timeval tv1;
413 gettimeofday(&tv1 , (void *)NULL );
414 *curtim = (double)((tv1.tv_usec)+(tv1.tv_sec)*1.E6);
415 *curtim = *curtim/1.E6;
416 }
417 EOF
418 make genmake_tc_1.o >> genmake_tc.log 2>&1
419 RET_C=$?
420 cat <<EOF > genmake_tc_2.f
421 program hello
422 Real*8 wtime
423 external cloc
424 call cloc(wtime)
425 print *," HELLO WORLD", wtime
426 end program hello
427 EOF
428 $FC $FFLAGS -o genmake_tc genmake_tc_2.f genmake_tc_1.o >> genmake_tc.log 2>&1
429 RET_F=$?
430 test -x ./genmake_tc && ./genmake_tc >> genmake_tc.log 2>&1
431 RETVAL=$?
432 if test "x$RETVAL" = x0 ; then
433 HAVE_CLOC=t
434 DEFINES="$DEFINES -DHAVE_CLOC"
435 fi
436 rm -f genmake_tc*
437 }
438
439
440 # 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:" cat make_exch2.errors
974 exit 1
975 fi
976 fi
977
978 printf "\n=== Determining package settings ===\n"
979 if test "x${PDEPEND}" = x ; then
980 tmp=$ROOTDIR"/pkg/pkg_depend"
981 if test -r $tmp ; then
982 PDEPEND=$tmp
983 else
984 echo "Warning: No package dependency information was specified."
985 echo " Please check that ROOTDIR/pkg/pkg_depend exists."
986 fi
987 else
988 if test ! -r ${PDEPEND} ; then
989 echo "Error: can't read package dependency info from PDEPEND=\"$PDEPEND\""
990 exit 1
991 fi
992 fi
993 echo " getting package dependency info from $PDEPEND"
994 # Strip the comments and then convert the dependency file into
995 # two arrays: PNAME, DNAME
996 cat $PDEPEND | sed -e 's/#.*$//g' \
997 | $AWK 'BEGIN{nn=-1;} (NF>0){ for(i=2;i<=NF;i++){nn++; print "PNAME_"nn"="$1"\nDNAME_"nn"="$i}} END{print "nname="nn}' \
998 > ./.pd_tmp
999 RETVAL=$?
1000 if test ! "x${RETVAL}" = x0 ; then
1001 echo "Error: unable to parse package dependencies -- please check PDEPEND=\"$PDEPEND\""
1002 exit 1
1003 fi
1004 . ./.pd_tmp
1005 rm -f ./.pd_tmp
1006
1007 # Search for default packages. Note that a "$ROOTDIR/pkg/pkg_groups"
1008 # file should eventually be added so that, for convenience, one can
1009 # specify groups of packages using names like "ocean" and "atmosphere".
1010 echo " checking default package list: "
1011 if test "x${PDEFAULT}" = x ; then
1012 for i in "." $MODS ; do
1013 if test -r $i"/packages.conf" ; then
1014 PDEFAULT=$i"/packages.conf"
1015 break
1016 fi
1017 done
1018 fi
1019 if test "x${PDEFAULT}" = x ; then
1020 PDEFAULT="$ROOTDIR/pkg/pkg_default"
1021 fi
1022 if test "x${PDEFAULT}" = xNONE ; then
1023 echo " default packages file disabled"
1024 else
1025 if test ! -r $PDEFAULT ; then
1026 echo "Warning: can't read default packages from PDEFAULT=\"$PDEFAULT\""
1027 else
1028 echo " using PDEFAULT=\"$PDEFAULT\""
1029 # Strip the comments and add all the names
1030 def=`cat $PDEFAULT | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
1031 RETVAL=$?
1032 if test "x${RETVAL}" != x0 ; then
1033 echo -n "Error: can't parse default package list "
1034 echo "-- please check PDEFAULT=\"$PDEFAULT\""
1035 exit 1
1036 fi
1037 for i in $def ; do
1038 PACKAGES="$PACKAGES $i"
1039 done
1040 echo " before group expansion packages are: $PACKAGES"
1041 expand_pkg_groups
1042 echo " after group expansion packages are: $PACKAGES"
1043 fi
1044 fi
1045
1046 echo " applying DISABLE settings"
1047 pack=
1048 for p in $PACKAGES ; do
1049 addit="t"
1050 for d in $DISABLE ; do
1051 if test "x$p" = "x$d" ; then
1052 addit="f"
1053 fi
1054 done
1055 if test "x$addit" = xt ; then
1056 pack="$pack $p"
1057 fi
1058 done
1059 PACKAGES="$pack"
1060 echo " applying ENABLE settings"
1061 echo "" > ./.tmp_pack
1062 PACKAGES="$PACKAGES $ENABLE"
1063 for i in $PACKAGES ; do
1064 if test ! -d "$ROOTDIR/pkg/$i" ; then
1065 echo "Error: can't find package $i at \"$ROOTDIR/pkg/$i\""
1066 exit 1
1067 fi
1068 echo $i >> ./.tmp_pack
1069 done
1070 pack=`cat ./.tmp_pack | sort | uniq`
1071 rm -f ./.tmp_pack
1072 PACKAGES=
1073 for i in $pack ; do
1074 PACKAGES="$PACKAGES $i"
1075 done
1076 echo " packages are: $PACKAGES"
1077
1078 echo " applying package dependency rules"
1079 ck=
1080 while test "x$ck" != xtt ; do
1081 i=0
1082 # rtot=${#PNAME[@]}
1083 rtot=$nname
1084 while test $i -lt $rtot ; do
1085
1086 # Is $pname in the current $PACKAGES list?
1087 # pname=${PNAME[$i]}
1088 tmp="pname=\"\$PNAME_$i\""
1089 eval $tmp
1090 pin="f"
1091 for p in $PACKAGES ; do
1092 if test "x$p" = "x$pname" ; then
1093 pin="t"
1094 fi
1095 done
1096
1097 # Is the DNAME entry a (+) or (-) rule ?
1098 tmp="dname=\"\$DNAME_$i\""
1099 eval $tmp
1100 plus="-"
1101 echo $dname | grep '^+' > /dev/null 2>&1
1102 RETVAL=$?
1103 if test "x$RETVAL" = x0 ; then
1104 plus="+"
1105 fi
1106
1107 # Is $dname in the current $PACKAGES list?
1108 dname=`echo $dname | sed -e 's/^[+-]//'`
1109 din="f"
1110 for p in $PACKAGES ; do
1111 if test "x$p" = "x$dname" ; then
1112 din="t"
1113 fi
1114 done
1115
1116 # Do we need to add $dname according to the dependency rules?
1117 if test "x$pin" = xt -a "x$plus" = "x+" -a "x$din" = xf ; then
1118 in_dis="f"
1119 for dis in $DISABLE ; do
1120 if test "x$dis" = "x$dname" ; then
1121 in_dis="t"
1122 fi
1123 done
1124 if test "x$in_dis" = xt ; then
1125 echo "Error: can't satisfy package dependencies:"
1126 echo " \"$dname\" is required by the dependency rules"
1127 echo " but is disallowed by the DISABLE settings"
1128 exit 1
1129 else
1130 PACKAGES="$PACKAGES $dname"
1131 ck=
1132 fi
1133 fi
1134
1135 # Do we need to get rid of $dname according to the dependency rules?
1136 if test "x$pin" = xt -a "x$plus" = "x-" -a "x$din" = xt; then
1137 echo "Error: can't satisfy package dependencies:"
1138 echo " \"$pname\" was requested but is disallowed by"
1139 echo " the dependency rules for \"$dname\""
1140 exit 1
1141 fi
1142 i=$(( $i + 1 ))
1143 done
1144 ck=$ck"t"
1145 done
1146 echo " packages are: $PACKAGES"
1147 for i in $PACKAGES ; do
1148 adr="$ROOTDIR/pkg/$i"
1149 if test -d $adr ; then
1150 SOURCEDIRS="$SOURCEDIRS $adr"
1151 INCLUDEDIRS="$INCLUDEDIRS $adr"
1152 if test "x$i" = xautodiff ; then
1153 AUTODIFF_PKG_USED=t
1154 fi
1155 else
1156 echo "Error: the directory \"$adr\" for package $i doesn't exist"
1157 exit 1
1158 fi
1159 done
1160
1161
1162 # Create a list of #define and #undef to enable/disable packages
1163 PACKAGES_DOT_H=PACKAGES_CONFIG.h
1164 # The following UGLY HACK sets multiple "#undef"s and it needs to go
1165 # away. On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h
1166 # file would eventually be split up so that all package-related #define
1167 # statements could be separated and handled only by genmake.
1168 names=`ls -1 "$ROOTDIR/pkg"`
1169 all_pack=
1170 DISABLED_PACKAGES=
1171 for n in $names ; do
1172 if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
1173 has_pack="f"
1174 for pack in $PACKAGES ; do
1175 if test "x$pack" = "x$n" ; then
1176 has_pack="t"
1177 break
1178 fi
1179 done
1180 if test "x$has_pack" = xf ; then
1181 undef=`echo "ALLOW_$n" | $AWK '{print toupper($0)}'`
1182 DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
1183 fi
1184 fi
1185 done
1186 ENABLED_PACKAGES=
1187 for i in $PACKAGES ; do
1188 def=`echo "ALLOW_$i" | $AWK '{print toupper($0)}'`
1189 ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
1190 #eh3 DEFINES="$DEFINES -D$def"
1191
1192 #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
1193 case $i in
1194 aim_v23)
1195 ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
1196 echo "Warning: ALLOW_AIM is set to enable aim_v23."
1197 ;;
1198 esac
1199 #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
1200
1201 done
1202
1203 echo " Adding STANDARDDIRS"
1204 BUILDDIR=${BUILDDIR:-.}
1205 if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
1206 STANDARDDIRS="eesupp model"
1207 fi
1208 if test "x$STANDARDDIRS" != x ; then
1209 for d in $STANDARDDIRS ; do
1210 adr="$ROOTDIR/$d/src"
1211 if test ! -d $adr ; then
1212 echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1213 echo " is correct and that you correctly specified the STANDARDDIRS option"
1214 exit 1
1215 else
1216 SOURCEDIRS="$SOURCEDIRS $adr"
1217 fi
1218 adr="$ROOTDIR/$d/inc"
1219 if test ! -d $adr ; then
1220 echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1221 echo " is correct and that you correctly specified the STANDARDDIRS option"
1222 exit 1
1223 else
1224 INCLUDEDIRS="$INCLUDEDIRS $adr"
1225 fi
1226 done
1227 fi
1228
1229 echo " Searching for *OPTIONS.h files in order to warn about the presence"
1230 echo " of \"#define \"-type statements that are no longer allowed:"
1231 CPP_OPTIONS=
1232 CPP_EEOPTIONS=
1233 spaths=". $INCLUDEDIRS"
1234 names=`ls -1 "$ROOTDIR/pkg"`
1235 for i in $spaths ; do
1236 try="$i/CPP_OPTIONS.h"
1237 if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
1238 echo " found CPP_OPTIONS=\"$try\""
1239 CPP_OPTIONS="$try"
1240 # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
1241 for n in $names ; do
1242 test_for_package_in_cpp_options $CPP_OPTIONS $n
1243 done
1244 fi
1245 try="$i/CPP_EEOPTIONS.h"
1246 if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
1247 echo " found CPP_EEOPTIONS=\"$try\""
1248 # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
1249 #**** not yet enabled ****
1250 # test_for_mpi_in_cpp_eeoptions $try
1251 #**** not yet enabled ****
1252 CPP_EEOPTIONS="$try"
1253 fi
1254 done
1255 if test "x$CPP_OPTIONS" = x ; then
1256 echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
1257 exit 1
1258 fi
1259
1260 # Here, we build the list of files to be "run through" the adjoint
1261 # compiler.
1262 if test -f ./ad_files ; then
1263 rm -f ./ad_files
1264 fi
1265 echo " Creating the list of files for the adjoint compiler."
1266 for i in $SOURCEDIRS ; do
1267 list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
1268 for j in $list_files ; do
1269 cat $i/$j >> ad_files
1270 done
1271 done
1272
1273 echo
1274 echo "=== Creating the Makefile ==="
1275 echo " setting INCLUDES"
1276 for i in $INCLUDEDIRS ; do
1277 if ! test -d $i ; then
1278 # INCLUDES="$INCLUDES -I$i"
1279 # else
1280 echo "Warning: can't find INCLUDEDIRS=\"$i\""
1281 fi
1282 done
1283
1284 echo " Determining the list of source and include files"
1285 rm -rf .links.tmp
1286 mkdir .links.tmp
1287 echo "# This section creates symbolic links" > srclinks.tmp
1288 echo "" >> srclinks.tmp
1289 echo -n 'SRCFILES = ' > srclist.inc
1290 echo -n 'CSRCFILES = ' > csrclist.inc
1291 echo -n 'F90SRCFILES = ' > f90srclist.inc
1292 echo -n 'HEADERFILES = ' > hlist.inc
1293 echo -n 'AD_FLOW_FILES = ' > ad_flow_files.inc
1294 alldirs="$SOURCEDIRS $INCLUDEDIRS ."
1295 for d in $alldirs ; do
1296 deplist=
1297 sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
1298 sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
1299 for sf in $sfiles ; do
1300 if test ! -r ".links.tmp/$sf" ; then
1301 if test -f "$d/$sf" ; then
1302 case $d/$sf in
1303 ./$PACKAGES_DOT_H)
1304 ;;
1305 ./AD_CONFIG.h)
1306 ;;
1307 ./FC_NAMEMANGLE.h)
1308 ;;
1309 *)
1310 touch .links.tmp/$sf
1311 deplist="$deplist $sf"
1312 ;;
1313 esac
1314 extn=`echo $sf | $AWK -F '.' '{print $NF}'`
1315 case $extn in
1316 F)
1317 echo " \\" >> srclist.inc
1318 echo -n " $sf" >> srclist.inc
1319 ;;
1320 F90)
1321 echo " \\" >> f90srclist.inc
1322 echo -n " $sf" >> f90srclist.inc
1323 ;;
1324 c)
1325 echo " \\" >> csrclist.inc
1326 echo -n " $sf" >> csrclist.inc
1327 ;;
1328 h)
1329 echo " \\" >> hlist.inc
1330 echo -n " $sf" >> hlist.inc
1331 ;;
1332 flow)
1333 echo " \\" >> ad_flow_files.inc
1334 echo -n " $sf" >> ad_flow_files.inc
1335 ;;
1336 esac
1337 fi
1338 fi
1339 done
1340 if test "x$deplist" != x ; then
1341 echo "" >> srclinks.tmp
1342 echo "# These files are linked from $d" >> srclinks.tmp
1343 echo "$deplist :" >> srclinks.tmp
1344 printf "\t\$(LN) %s/\$@ \$@\n" $d >> srclinks.tmp
1345 fi
1346 done
1347 rm -rf .links.tmp
1348 echo "" >> srclist.inc
1349 echo "" >> csrclist.inc
1350 echo "" >> f90srclist.inc
1351 echo "" >> hlist.inc
1352 echo "" >> ad_flow_files.inc
1353
1354 if test -e $MAKEFILE ; then
1355 mv -f $MAKEFILE "$MAKEFILE.bak"
1356 fi
1357 echo " Writing makefile: $MAKEFILE"
1358 echo "# Multithreaded + multi-processing makefile for:" > $MAKEFILE
1359 echo "# $MACHINE" >> $MAKEFILE
1360 echo "# This makefile was generated automatically on" >> $MAKEFILE
1361 echo "# $THISDATE" >> $MAKEFILE
1362 echo "# by the command:" >> $MAKEFILE
1363 echo "# $0 $@" >> $MAKEFILE
1364 echo "# executed by:" >> $MAKEFILE
1365 echo "# $USER@${THISHOSTNAME}:${THISCWD}" >> $MAKEFILE
1366
1367 EXE_AD=$EXECUTABLE"_ad"
1368 EXE_FTL=$EXECUTABLE"_ftl"
1369 EXE_SVD=$EXECUTABLE"_svd"
1370
1371 cat >>$MAKEFILE <<EOF
1372 #
1373 # OPTFILE="$OPTFILE"
1374 #
1375 # BUILDDIR : Directory where object files are written
1376 # SOURCEDIRS : Directories containing the source (.F) files
1377 # INCLUDEDIRS : Directories containing the header-source (.h) files
1378 # EXEDIR : Directory where executable that is generated is written
1379 # EXECUTABLE : Full path of executable binary
1380 #
1381 # CPP : C-preprocessor command
1382 # INCLUDES : Directories searched for header files
1383 # DEFINES : Macro definitions for CPP
1384 # MAKEDEPEND : Dependency generator
1385 # KPP : Special preprocessor command (specific to platform)
1386 # KFLAGS : Flags for KPP
1387 # FC : Fortran compiler command
1388 # FFLAGS : Configuration/debugging options for FC
1389 # FOPTIM : Optimization options for FC
1390 # LINK : Command for link editor program
1391 # LIBS : Library flags /or/ additional optimization/debugging flags
1392
1393 ROOTDIR = ${ROOTDIR}
1394 BUILDDIR = ${BUILDDIR}
1395 SOURCEDIRS = ${SOURCEDIRS}
1396 INCLUDEDIRS = ${INCLUDEDIRS}
1397 EXEDIR = ${EXEDIR}
1398 EXECUTABLE = \$(EXEDIR)/${EXECUTABLE}
1399 TOOLSDIR = ${TOOLSDIR}
1400
1401 #eh3 new defines for the adjoint work
1402 AUTODIFF = ${ROOTDIR}/pkg/autodiff
1403 EXE_AD = ${EXE_AD}
1404 EXE_FTL = ${EXE_FTL}
1405 EXE_SVD = ${EXE_SVD}
1406
1407 ENABLED_PACKAGES = ${ENABLED_PACKAGES}
1408 DISABLED_PACKAGES = ${DISABLED_PACKAGES}
1409
1410 # These files are created by Makefile
1411 SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h
1412
1413 EOF
1414
1415 # Note: figure out some way to add Hyades JAM libraries here
1416
1417 cat >>$MAKEFILE <<EOF
1418 # Unix ln (link)
1419 LN = ${LN}
1420 # C preprocessor
1421 CPP = cat \$< | ${S64} | ${CPP}
1422 # Dependency generator
1423 MAKEDEPEND = ${MAKEDEPEND}
1424 # Special preprocessor (KAP on DECs, FPP on Crays)
1425 KPP = ${KPP}
1426 # Fortran compiler
1427 FC = ${FC}
1428 # Fortran compiler
1429 F90C = ${F90C}
1430 # Link editor
1431 LINK = ${LINK}
1432
1433 # Defines for CPP
1434 DEFINES = ${DEFINES}
1435 # Includes for CPP
1436 INCLUDES = ${INCLUDES}
1437 # Flags for KPP
1438 KFLAGS1 = ${KFLAGS1}
1439 KFLAGS2 = ${KFLAGS2}
1440 # Optim./debug for FC
1441 FFLAGS = ${FFLAGS}
1442 FOPTIM = ${FOPTIM}
1443 # Optim./debug for FC
1444 F90FLAGS = ${F90FLAGS}
1445 F90OPTIM = ${F90OPTIM}
1446 # Flags for CC
1447 CFLAGS = ${CFLAGS}
1448 # Files that should not be optimized
1449 NOOPTFILES = ${NOOPTFILES}
1450 NOOPTFLAGS = ${NOOPTFLAGS}
1451 # Flags and libraries needed for linking
1452 LIBS = ${LIBS} \$(XLIBS)
1453 # Name of the Mekfile
1454 MAKEFILE=${MAKEFILE}
1455
1456 EOF
1457
1458 cat srclist.inc >> $MAKEFILE
1459 cat csrclist.inc >> $MAKEFILE
1460 cat f90srclist.inc >> $MAKEFILE
1461 cat hlist.inc >> $MAKEFILE
1462 cat ad_flow_files.inc >> $MAKEFILE
1463 echo >> $MAKEFILE
1464 echo 'F77FILES = $(SRCFILES:.F=.f)' >> $MAKEFILE
1465 echo 'F90FILES = $(F90SRCFILES:.F90=.f90)' >> $MAKEFILE
1466 echo 'OBJFILES = $(SRCFILES:.F=.o) $(CSRCFILES:.c=.o) $(F90SRCFILES:.F90=.o)' >> $MAKEFILE
1467
1468 rm -f srclist.inc csrclist.inc hlist.inc flist.tmp clist.tmp f90srclist.inc
1469 rm -f ad_flow_files.inc
1470
1471 cat >>$MAKEFILE <<EOF
1472
1473 .SUFFIXES:
1474 .SUFFIXES: .o .f .p .F .c .F90 .f90
1475
1476 all: \$(EXECUTABLE)
1477 \$(EXECUTABLE): \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(OBJFILES)
1478 @echo Creating \$@ ...
1479 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
1480 depend:
1481 @make links
1482 \$(MAKEDEPEND) -o .f \$(DEFINES) \$(INCLUDES) \$(SRCFILES)
1483 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
1484
1485 links: \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(SPECIAL_FILES)
1486
1487 small_f: \$(F77FILES) \$(F90FILES)
1488
1489 output.txt: \$(EXECUTABLE)
1490 @printf 'running ... '
1491 @\$(EXECUTABLE) > \$@
1492
1493 clean:
1494 -rm -rf *.o *.f *.p *.f90 *.mod ${RMFILES} work.{pc,pcl} *.template
1495 Clean:
1496 @make clean
1497 @make cleanlinks
1498 -rm -f \$(SPECIAL_FILES)
1499 -rm -f genmake_state genmake_*optfile genmake_warnings make.log run.log *.bak
1500 CLEAN:
1501 @make Clean
1502 -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
1503 -find \$(EXEDIR) -name "*.data" -exec rm {} \;
1504 -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
1505 -rm -f \$(EXECUTABLE) output.txt
1506
1507 #eh3 Makefile: makefile
1508 makefile:
1509 $THIS_SCRIPT $@
1510 cleanlinks:
1511 -find . -type l -exec rm {} \;
1512
1513 # Special targets ($SPECIAL_FILES) which are create by make
1514 ${PACKAGES_DOT_H}:
1515 @echo Creating \$@ ...
1516 @\$(TOOLSDIR)/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -bPACKAGES_CONFIG_H "Disabled packages:" \$(DISABLED_PACKAGES) " " "Enabled packages:" \$(ENABLED_PACKAGES) > \$@
1517 AD_CONFIG.h:
1518 @echo Creating \$@ ...
1519 @\$(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 > \$@
1520 FC_NAMEMANGLE.h:
1521 @echo Creating \$@ ...
1522 echo "$FC_NAMEMANGLE" > \$@
1523
1524 # The normal chain of rules is ( .F - .f - .o )
1525 .F.f:
1526 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1527 .f.o:
1528 \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
1529 .F90.f90:
1530 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1531 .f90.o:
1532 \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
1533 .c.o:
1534 \$(CC) \$(CFLAGS) -c \$<
1535
1536 # Special exceptions that use the ( .F - .p - .f - .o ) rule-chain
1537 .F.p:
1538 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1539 .p.f:
1540 \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
1541
1542 #=========================================
1543 #=== Automatic Differentiation Rules ===
1544
1545 TAMC = ${TAMC}
1546 TAF = ${TAF}
1547
1548 TAF_EXTRA = ${TAF_EXTRA}
1549 TAMC_EXTRA = ${TAMC_EXTRA}
1550
1551 EOF
1552
1553 ad_vars="AD_TAMC_FLAGS AD_TAF_FLAGS"
1554 ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF_FLAGS"
1555 ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
1556 for i in $ad_vars ; do
1557 name=$i
1558 t1="t2=\$"`echo $i`
1559 eval $t1
1560 printf "%-20s = " $name >> $MAKEFILE
1561 echo $t2 >> $MAKEFILE
1562 done
1563
1564 echo " Add the source list for AD code generation"
1565 echo >> $MAKEFILE
1566 echo -n "AD_FILES = " >> $MAKEFILE
1567 AD_FILES=`cat ad_files`
1568 for i in $AD_FILES ; do
1569 echo " \\" >> $MAKEFILE
1570 echo -n " $i" >> $MAKEFILE
1571 done
1572 echo >> $MAKEFILE
1573 rm -f ad_files
1574
1575 cat >>$MAKEFILE <<EOF
1576
1577 # ... AD ...
1578 adall: ad_taf
1579 adtaf: ad_taf_output.f
1580 adtamc: ad_tamc_output.f
1581
1582 ad_input_code.f: \$(AD_FILES) \$(HEADERFILES)
1583 @\$(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
1584 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
1585 -rm -f ad_config.template
1586 @make \$(F77FILES)
1587 @make \$(AD_FLOW_FILES)
1588 cat \$(AD_FLOW_FILES) \$(AD_FILES) > ad_input_code.f
1589
1590 ad_taf_output.f: ad_input_code.f
1591 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f
1592 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f
1593
1594 adtafonly:
1595 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f
1596 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f
1597
1598 ad_taf: ad_taf_output.o \$(OBJFILES)
1599 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
1600
1601 ad_tamc_output.f: ad_input_code.f
1602 \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.f
1603 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.f
1604
1605 ad_tamc: ad_tamc_output.o \$(OBJFILES)
1606 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
1607
1608
1609 # ... FTL ...
1610 ftlall: ftl_taf
1611 ftltaf: ftl_taf_output.f
1612 ftltamc: ftl_tamc_output.f
1613
1614 ftl_input_code.f: \$(AD_FILES) \$(HEADERFILES)
1615 @\$(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
1616 cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
1617 -rm -f ftl_config.template
1618 @make \$(F77FILES)
1619 @make \$(AD_FLOW_FILES)
1620 cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.f
1621
1622 ftl_taf_output.f: ftl_input_code.f
1623 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f
1624 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f
1625
1626 ftltafonly:
1627 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f
1628 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f
1629
1630 ftl_taf: ftl_taf_output.o \$(OBJFILES)
1631 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
1632
1633 ftl_tamc_output.f: ftl_input_code.f
1634 \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.f
1635 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.f
1636
1637 ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
1638 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
1639
1640
1641 # ... SVD ...
1642 svdtaf: ad_taf_output.f ftl_taf_output.f
1643 svdall: svd_taf
1644
1645 svd_taf: ad_taf_output.o ftl_taf_output.o \$(OBJFILES)
1646 \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
1647
1648
1649 #=========================================
1650
1651 EOF
1652
1653 if test "x$EXEHOOK" != x ; then
1654 printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE
1655 fi
1656
1657 echo " Making list of \"exceptions\" that need \".p\" files"
1658 for i in $KPPFILES ; do
1659 base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
1660 RETVAL=$?
1661 if test "x$RETVAL" != x0 ; then
1662 echo "Error: unable to add file \"$i\" to the exceptions list"
1663 fi
1664 echo "$base.f: $base.p" >> $MAKEFILE
1665 done
1666
1667 echo " Making list of NOOPTFILES"
1668 for i in $NOOPTFILES ; do
1669 base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
1670 RETVAL=$?
1671 if test "x$RETVAL" != x0 ; then
1672 echo "Error: unable to add file \"$i\" to the exceptions list"
1673 fi
1674 echo "$base.o: $base.f" >> $MAKEFILE
1675 printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE
1676 done
1677
1678 echo " Add rules for links"
1679 cat srclinks.tmp >> $MAKEFILE
1680 rm -f srclinks.tmp
1681
1682 echo " Adding makedepend marker"
1683 printf "\n\n# DO NOT DELETE\n" >> $MAKEFILE
1684
1685 printf "\n=== Done ===\n"
1686
1687 # Create special header files
1688 $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"
1689 if test ! -f $PACKAGES_DOT_H ; then
1690 mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
1691 else
1692 cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
1693 RETVAL=$?
1694 if test "x$RETVAL" = x0 ; then
1695 rm -f $PACKAGES_DOT_H".tmp"
1696 else
1697 mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"
1698 mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
1699 fi
1700 fi
1701 if test ! -f AD_CONFIG.h ; then
1702 $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
1703 fi
1704
1705
1706 # Write the "state" for future records
1707 if test "x$DUMPSTATE" != xf ; then
1708 echo -n "" > genmake_state
1709 for i in $gm_state ; do
1710 t1="t2=\$$i"
1711 eval $t1
1712 echo "$i='$t2'" >> genmake_state
1713 done
1714 fi

  ViewVC Help
Powered by ViewVC 1.1.22