/[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.161 - (show annotations) (download)
Sun Feb 18 21:39:59 2007 UTC (17 years, 1 month ago) by jmc
Branch: MAIN
CVS Tags: checkpoint58w_post, checkpoint58x_post, checkpoint59a, checkpoint59, checkpoint58y_post
Changes since 1.160: +32 -8 lines
if unable to compile NetCDF code, disable "profiles" package (+ echo a WARNING)

1 #! /usr/bin/env bash
2 #
3 # $Header: /u/gcmpack/MITgcm/tools/genmake2,v 1.160 2007/01/31 21:28:10 ce107 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[ ]"
17 test_for_string_in_file $cpp_options "^[ ]*#undef.*ALLOW_$pkg[ ]"
18 test_for_string_in_file $cpp_options "^[ ]*#define.*DISABLE_$pkg[ ]"
19 test_for_string_in_file $cpp_options "^[ ]*#undef.*DISABLE_$pkg[ ]"
20 test_for_string_in_file $cpp_options "^[ ]*#define.*ALLOW_$pkg$"
21 test_for_string_in_file $cpp_options "^[ ]*#undef.*ALLOW_$pkg$"
22 test_for_string_in_file $cpp_options "^[ ]*#define.*DISABLE_$pkg$"
23 test_for_string_in_file $cpp_options "^[ ]*#undef.*DISABLE_$pkg$"
24 }
25
26 # Search for particular CPP #cmds associated with MPI
27 # usage: test_for_mpi_in_cpp_eeoptions CPP_file
28 test_for_mpi_in_cpp_eeoptions() {
29 cpp_options=$1
30 test_for_string_in_file $cpp_options "^[ ]*#define.*ALLOW_USE_MPI[ ]"
31 test_for_string_in_file $cpp_options "^[ ]*#undef.*ALLOW_USE_MPI[ ]"
32 test_for_string_in_file $cpp_options "^[ ]*#define.*ALWAYS_USE_MPI[ ]"
33 test_for_string_in_file $cpp_options "^[ ]*#undef.*ALWAYS_USE_MPI[ ]"
34 test_for_string_in_file $cpp_options "^[ ]*#define.*ALLOW_USE_MPI$"
35 test_for_string_in_file $cpp_options "^[ ]*#undef.*ALLOW_USE_MPI$"
36 test_for_string_in_file $cpp_options "^[ ]*#define.*ALWAYS_USE_MPI$"
37 test_for_string_in_file $cpp_options "^[ ]*#undef.*ALWAYS_USE_MPI$"
38 }
39
40 # Search for particular string in a file. Return 1 if detected, 0 if not
41 # usage: test_for_string_in_file file string
42 test_for_string_in_file() {
43 file=$1
44 strng=$2
45 grep -i "$strng" $file > /dev/null 2>&1
46 RETVAL=$?
47 if test "x${RETVAL}" = x0 ; then
48 printf "Error: In $file there is an illegal line: "
49 grep -i "$strng" $file
50 exit 99
51 fi
52 return 0
53 }
54
55 # Read the $ROOTDIR/pkg/pkg_groups file and expand any references to
56 # the package list.
57 expand_pkg_groups() {
58 new_packages=
59 PKG_GROUPS=$ROOTDIR"/pkg/pkg_groups"
60 if test -r $PKG_GROUPS ; then
61 cat $PKG_GROUPS | sed -e 's/#.*$//g' | sed -e 's/:/ : /g' > ./p1.tmp
62 cat ./p1.tmp | $AWK '(NF>2 && $2==":"){ print $0 }' > ./p2.tmp
63 matched=0
64 for i in $PACKAGES ; do
65 line=`grep "^ *$i" ./p2.tmp`
66 RETVAL=$?
67 if test "x$RETVAL" = x0 ; then
68 matched=1
69 replace=`echo $line | $AWK '{ $1=""; $2=""; print $0 }'`
70 echo " replacing \"$i\" with: $replace"
71 new_packages="$new_packages $replace"
72 else
73 new_packages="$new_packages $i"
74 fi
75 done
76 PACKAGES=$new_packages
77 rm -f ./p[1,2].tmp
78 return $matched
79 else
80 echo "Warning: can't read package groups definition file: $PKG_GROUPS"
81 fi
82 }
83
84 # Check for broken environments (eg. cygwin, MacOSX w/HFS+) that
85 # cannot distinguish [*.F/*.F90] from [*.f/*.f90] files.
86 check_for_broken_Ff() {
87 # Do we have defaults for $FS and/or $FS90 ?
88 tfs=f
89 tfs9=f90
90 if test "x$FS" != x ; then
91 tfs="$FS"
92 fi
93 if test "x$FS90" != x ; then
94 tfs9="$FS90"
95 fi
96
97 # First check the ability to create a *.F/.f pair.
98 cat <<EOF >> genmake_hello.F
99 program hello
100 write(*,*) 'hi'
101 stop
102 end
103 EOF
104 cp genmake_hello.F "genmake_hello."$tfs > /dev/null 2>&1
105 RETVAL=$?
106 if test "x$RETVAL" != x0 ; then
107 if test "x$FS" = x ; then
108 FS='for'
109 FS90='fr9'
110 check_for_broken_Ff
111 else
112 cat <<EOF 2>&1
113 ERROR: Your file system cannot distinguish between *.F and *.f files
114 (fails the "cp" test) and this program cannot find a suitable
115 replacement extension. Please try a different build environment or
116 contact the <MITgcm-support@mitgcm.org> list for help.
117
118 EOF
119 exit -1
120 fi
121 return
122 fi
123 rm -f genmake_hello.*
124
125 # Check the ability of ${MAKE} and ${LN} to use the current set
126 # of extensions.
127 cat <<EOF >> genmake_hello.F
128 program hello
129 write(*,*) 'hi'
130 stop
131 end
132 EOF
133 test -f $MAKEFILE && mv -f $MAKEFILE $MAKEFILE".tst"
134 cat <<EOF >> $MAKEFILE
135 .SUFFIXES:
136 .SUFFIXES: .$tfs .F
137 .F.$tfs:
138 $LN \$< \$@
139 EOF
140 $MAKE "genmake_hello."$tfs > /dev/null 2>&1
141 RETVAL=$?
142 if test "x$RETVAL" != x0 -o ! -f "genmake_hello."$tfs ; then
143 if test "x$FS" = x ; then
144 FS='for'
145 FS90='fr9'
146 check_for_broken_Ff
147 else
148 cat <<EOF 2>&1
149 ERROR: Your file system cannot distinguish between *.F and *.f files
150 (fails the "make/ln" test) and this program cannot find a suitable
151 replacement extension. Please try a different build environment or
152 contact the <MITgcm-support@mitgcm.org> list for help.
153
154 EOF
155 exit -1
156 return
157 fi
158 fi
159 rm -f genmake_hello.* $MAKEFILE
160 test -f $MAKEFILE".tst" && mv -f $MAKEFILE".tst" $MAKEFILE
161
162 # If we make it here, use the extensions
163 FS=$tfs
164 FS90=$tfs9
165 return
166 }
167
168
169 look_for_makedepend() {
170
171 # The "original" makedepend is part of the Imake system that is
172 # most often distributed with XFree86 or with an XFree86 source
173 # package. As a result, many machines (eg. generic Linux) do not
174 # have a system-default "makedepend" available. For those
175 # systems, we have two fall-back options:
176 #
177 # 1) a makedepend implementation shipped with the cyrus-imapd
178 # package: ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/
179 #
180 # 2) a known-buggy xmakedpend shell script
181 #
182 # So the choices are, in order:
183 #
184 # 1) use the user-specified program
185 # 2) use a system-wide default
186 # 3) locally build and use the cyrus implementation
187 # 4) fall back to the buggy local xmakedpend script
188 #
189 if test "x${MAKEDEPEND}" = x ; then
190 which makedepend > /dev/null 2>&1
191 RV0=$?
192 test -f $MAKEFILE && mv -f $MAKEFILE $MAKEFILE".tst"
193 # echo 'MAKEFILE="'$MAKEFILE'"'
194 cat <<EOF >> $MAKEFILE
195 # THIS IS A TEST MAKEFILE GENERATED BY "genmake2"
196 #
197 # Some "makedepend" implementations will die if they cannot
198 # find a Makefile -- so this file is here to gives them an
199 # empty one to find and parse.
200 EOF
201 cat <<EOF >> genmake_tc.f
202 program test
203 write(*,*) 'test'
204 stop
205 end
206 EOF
207 makedepend genmake_tc.f > /dev/null 2>&1
208 RV1=$?
209 test -f $MAKEFILE && rm -f $MAKEFILE
210 test -f $MAKEFILE".tst" && mv -f $MAKEFILE".tst" $MAKEFILE
211 if test "x${RV0}${RV1}" = x00 ; then
212 MAKEDEPEND=makedepend
213 else
214 echo " a system-default makedepend was not found."
215
216 # Try to build the cyrus implementation
217 build_cyrus_makedepend
218 RETVAL=$?
219 if test "x$RETVAL" != x0 ; then
220 MAKEDEPEND='$(TOOLSDIR)/xmakedepend'
221 fi
222 rm -f ./genmake_cy_md
223 fi
224 else
225 # echo "MAKEDEPEND=${MAKEDEPEND}"
226 echo "${MAKEDEPEND}" | grep -i cyrus > /dev/null 2>&1
227 RETVAL=$?
228 if test x"$RETVAL" = x0 ; then
229 build_cyrus_makedepend
230 fi
231 fi
232 }
233
234
235 build_cyrus_makedepend() {
236 rm -f ./genmake_cy_md
237 (
238 cd $ROOTDIR/tools/cyrus-imapd-makedepend \
239 && ./configure > /dev/null 2>&1 \
240 && make > /dev/null 2>&1
241 if test -x ./makedepend.exe ; then
242 $LN ./makedepend.exe ./makedepend
243 fi
244 ./makedepend ifparser.c > /dev/null 2>&1 \
245 && echo "true"
246 ) > ./genmake_cy_md
247 grep true ./genmake_cy_md > /dev/null 2>&1
248 RETVAL=$?
249 rm -f ./genmake_cy_md
250 if test "x$RETVAL" = x0 ; then
251 MAKEDEPEND='$(TOOLSDIR)/cyrus-imapd-makedepend/makedepend'
252 return 0
253 else
254 echo "WARNING: unable to build cyrus-imapd-makedepend"
255 return 1
256 fi
257 }
258
259
260 build_embed_encode()
261 {
262 printf " building the embed-encode utility... "
263 if test ! -e "$ROOTDIR/tools/embed_encode/encode_files" ; then
264 if test ! -d "$ROOTDIR/tools/embed_encode" ; then
265 echo
266 echo " Error: can't locate \"$ROOTDIR/tools/embed_encode\""
267 echo
268 EMBED_SRC=f
269 return 1
270 fi
271 clist="cc gcc c89 $CC"
272 for ic in $clist ; do
273 comm="$ic -o encode_files encode_files.c"
274 ( cd $ROOTDIR/tools/embed_encode && $comm ) > /dev/null 2>&1
275 RETVAL=$?
276 if test "x$RETVAL" = x0 ; then
277 echo "OK"
278 DEFINES="$DEFINES -DHAVE_EMBED_SRC"
279 return 0
280 fi
281 done
282 echo
283 echo " Error: unable to build $ROOTDIR/embed_encode/encode_files"
284 echo " so it has been disabled"
285 echo
286 EMBED_SRC=f
287 return 1
288 fi
289 echo "OK"
290 DEFINES="$DEFINES -DHAVE_EMBED_SRC"
291 }
292
293
294 # Guess possible config options for this host
295 find_possible_configs() {
296
297 tmp1=`uname`"_"`uname -m`
298 tmp2=`echo $tmp1 | sed -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
299 tmp3=`echo $tmp2 | sed -e 's/power macintosh/ppc/'`
300 tmp1=`echo $tmp3 | sed -e 's|x86_64|amd64|'`
301 tmp2=`echo $tmp1 | sed -e 's/i[3-6]86/ia32/' | sed -e 's/athlon/ia32/'`
302 tmp3=`echo $tmp2 | sed -e 's/cray sv1/craysv1/'`
303 PLATFORM=$tmp3
304 echo $PLATFORM | grep cygwin > /dev/null 2>&1 && PLATFORM=cygwin_ia32
305 OFLIST=`(cd $ROOTDIR/tools/build_options; ls | grep "^$PLATFORM")`
306 echo " The platform appears to be: $PLATFORM"
307
308 echo "test" > test
309 ln -s ./test link
310 RETVAL=$?
311 if test "x${RETVAL}" = x0 ; then
312 LN="ln -s"
313 else
314 echo "Error: \"ln -s\" does not appear to work on this system!"
315 echo " For help, please contact <MITgcm-support@mitgcm.org>."
316 exit 1
317 fi
318 rm -f test link
319
320 if test "x$CPP" = x ; then
321 CPP="cpp -traditional -P"
322 fi
323
324 look_for_makedepend
325
326 #================================================================
327 # look for possible C compilers
328 tmp="$MITGCM_CC $CC gcc c89 cc c99 mpicc icc"
329 p_CC=
330 for c in $tmp ; do
331 rm -f ./genmake_hello.c ./genmake_hello
332 cat >> genmake_hello.c << EOF
333 #include <stdio.h>
334 int main(int argc, char **argv) {
335 printf("Hello!\n");
336 return 0;
337 }
338 EOF
339 $c -o genmake_hello genmake_hello.c > /dev/null 2>&1
340 RETVAL=$?
341 if test "x${RETVAL}" = x0 ; then
342 p_CC="$p_CC $c"
343 fi
344 done
345 rm -f ./genmake_hello.c ./genmake_hello
346 if test "x${p_CC}" = x ; then
347 cat 1>&2 <<EOF
348
349 Error: No C compilers were found in your path. Please specify one using:
350
351 1) an "optfile" on (eg. "-optfile=path/to/OPTFILE"),
352 2) the CC or MITGCM_CC environment variables.
353
354 EOF
355 exit 1
356 else
357 echo " The possible C compilers found in your path are:"
358 echo " "$p_CC
359 if test "x$CC" = x ; then
360 CC=`echo $p_CC | $AWK '{print $1}'`
361 echo " Setting C compiler to: "$CC
362 fi
363 fi
364
365 #================================================================
366 # look for possible FORTRAN compilers
367 tmp="$MITGCM_FC $FC efc g77 f77 pgf77 pgf95 ifc ifort f90 f95 mpif77 mpf77 mpxlf95 gfortran g95"
368 p_FC=
369 for c in $tmp ; do
370 rm -f ./hello.f ./hello
371 cat >> hello.f <<EOF
372 program hello
373 do i=1,3
374 print *, 'hello world : ', i
375 enddo
376 end
377 EOF
378 $c -o hello hello.f > /dev/null 2>&1
379 RETVAL=$?
380 if test "x${RETVAL}" = x0 ; then
381 p_FC="$p_FC $c"
382 fi
383 done
384 rm -f ./hello.f ./hello
385 if test "x${p_FC}" = x ; then
386 cat 1>&2 <<EOF
387
388 Error: No Fortran compilers were found in your path. Please specify one using:
389
390 1) an "optfile" on (eg. "-optfile=path/to/OPTFILE"),
391 2) a command-line option (eg. "-fc NAME"), or
392 3) the FC or MITGCM_FC environment variables.
393
394 EOF
395 exit 1
396 else
397 echo " The possible FORTRAN compilers found in your path are:"
398 echo " "$p_FC
399 fi
400
401 # Use the first of the compilers found in the current PATH
402 # that has a correctly-named optfile
403 if test "x$OPTFILE" = x -a "x$FC" = x ; then
404 for i in $p_FC ; do
405 OPTFILE=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$i
406 if test -r $OPTFILE ; then
407 echo " Setting OPTFILE to: "$OPTFILE
408 break
409 fi
410 done
411 fi
412
413 if test "x$OPTFILE" = x ; then
414 OPTFILE=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$FC
415 if test ! -r $OPTFILE ; then
416 echo " I looked for the file "$OPTFILE" but did not find it"
417 fi
418 fi
419 # echo " The options file: $p_OF"
420 # echo " appears to match so we'll use it."
421 # for i in $p_FC ; do
422 #p_OF=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$i
423 #if test -r $p_OF ; then
424 # OPTFILE=$p_OF
425 # echo " The options file: $p_OF"
426 # echo " appears to match so we'll use it."
427 # break
428 #fi
429 # done
430 if test "x$OPTFILE" = x ; then
431 cat 1>&2 <<EOF
432
433 Error: No options file was found in: $ROOTDIR/tools/build_options/
434 that matches this platform ("$PLATFORM") and the compilers found in
435 your path. Please specify an "optfile" using:
436
437 1) the command line (eg. "-optfile=path/to/OPTFILE"), or
438 2) the MITGCM_OF environment variable.
439
440 If you need help, please contact the developers at <MITgcm-support@mitgcm.org>.
441
442 EOF
443 exit 1
444 fi
445
446 # # look for possible MPI libraries
447 # mpi_libs=
448 # mpi_fort=`which mpif77 2>/dev/null`
449 # RETVAL=$?
450 # if test "x${RETVAL}" = x0 ; then
451 # cat >>test.f <<EOF
452 # PROGRAM HELLO
453 # DO 10, I=1,10
454 # PRINT *,'Hello World'
455 # 10 CONTINUE
456 # STOP
457 # END
458 # EOF
459 # eval "$mpi_fort -showme test.f > out"
460 # RETVAL=$?
461 # if test "x${RETVAL}" = x0 ; then
462 # a=`cat out`
463 # for i in $a ; do
464 # case $i in
465 # -*)
466 # mpi_libs="$mpi_libs $i" ;;
467 # esac
468 # done
469 # echo "The MPI libs appear to be:"
470 # echo " "$mpi_libs
471 # fi
472 # rm -f test.f out
473 # fi
474
475 }
476
477 # Parse the package dependency information
478 get_pdepend_list() {
479
480 # strip the comments and then convert the dependency file into
481 # two arrays: PNAME, DNAME
482 cat $1 | sed -e 's/#.*$//g' \
483 | $AWK 'BEGIN{nn=0;} (NF>0){ for(i=2;i<=NF;i++){nn++; print "PNAME["nn"]="$1"\nDNAME["nn"]="$i} }' \
484 > ./.pd_tmp
485 . ./.pd_tmp
486 rm -f ./.pd_tmp
487
488 printf "PNAME = "${}
489 }
490
491
492 # Explain usage
493 usage() {
494 cat <<EOF
495
496 Usage: "$0" [OPTIONS]
497 where [OPTIONS] can be:
498
499 -help | --help | -h | --h
500 Print this help message and exit.
501
502 -adoptfile NAME | --adoptfile NAME | -adof NAME | --adof NAME
503 -adoptfile=NAME | --adoptfile=NAME | -adof=NAME | --adof=NAME
504 Use "NAME" as the adoptfile. By default, the file at
505 "tools/adjoint_options/adjoint_default" will be used.
506
507 -nooptfile | --nooptfile
508 -optfile NAME | --optfile NAME | -of NAME | --of NAME
509 -optfile=NAME | --optfile=NAME | -of=NAME | --of=NAME
510 Use "NAME" as the optfile. By default, an attempt will be
511 made to find an appropriate "standard" optfile in the
512 tools/build_options/ directory.
513
514 -pdepend NAME | --pdepend NAME
515 -pdepend=NAME | --pdepend=NAME
516 Get package dependency information from "NAME".
517
518 -pdefault NAME | --pdefault NAME
519 -pdefault=NAME | --pdefault=NAME
520 Get the default package list from "NAME".
521
522 -make NAME | -m NAME
523 --make=NAME | -m=NAME
524 Use "NAME" for the MAKE program. The default is "make" but
525 many platforms, "gmake" is the preferred choice.
526
527 -makefile NAME | -mf NAME
528 --makefile=NAME | -mf=NAME
529 Call the makefile "NAME". The default is "Makefile".
530
531 -makedepend NAME | -md NAME
532 --makedepend=NAME | -md=NAME
533 Use "NAME" for the MAKEDEPEND program.
534
535 -rootdir NAME | --rootdir NAME | -rd NAME | --rd NAME
536 -rootdir=NAME | --rootdir=NAME | -rd=NAME | --rd=NAME
537 Specify the location of the MITgcm ROOTDIR as "NAME".
538 By default, genamke will try to find the location by
539 looking in parent directories (up to the 5th parent).
540
541 -mods NAME | --mods NAME | -mo NAME | --mo NAME
542 -mods=NAME | --mods=NAME | -mo=NAME | --mo=NAME
543 Here, "NAME" specifies a list of directories that are
544 used for additional source code. Files found in the
545 "mods list" are given preference over files of the same
546 name found elsewhere.
547
548 -disable NAME | --disable NAME
549 -disable=NAME | --disable=NAME
550 Here "NAME" specifies a list of packages that we don't
551 want to use. If this violates package dependencies,
552 genamke will exit with an error message.
553
554 -enable NAME | --enable NAME
555 -enable=NAME | --enable=NAME
556 Here "NAME" specifies a list of packages that we wish
557 to specifically enable. If this violates package
558 dependencies, genamke will exit with an error message.
559
560 -standarddirs NAME | --standarddirs NAME
561 -standarddirs=NAME | --standarddirs=NAME
562 Here, "NAME" specifies a list of directories to be
563 used as the "standard" code.
564
565 -fortran NAME | --fortran NAME | -fc NAME | --fc NAME
566 -fc=NAME | --fc=NAME
567 Use "NAME" as the fortran compiler. By default, genmake
568 will search for a working compiler by trying a list of
569 "usual suspects" such as g77, f77, etc.
570
571 -cc NAME | --cc NAME | -cc=NAME | --cc=NAME
572 Use "NAME" as the C compiler. By default, genmake
573 will search for a working compiler by trying a list of
574 "usual suspects" such as gcc, c89, cc, etc.
575
576 -[no]ieee | --[no]ieee
577 Do or don't use IEEE numerics. Note that this option
578 *only* works if it is supported by the OPTFILE that
579 is being used.
580
581 -ignoretime | -ignore_time | --ignoretime | --ignore_time
582 Ignore all the "wall clock" routines entirely. This will
583 not in any way hurt the model results -- it simply means
584 that the code that checks how long the model spends in
585 various routines will give junk values.
586
587 -ts | --ts
588 Produce timing information per timestep
589 -papis | --papis
590 Produce summary MFlop/s (and IPC) with PAPI per timestep
591 -pcls | --pcls
592 Produce summary MFlop/s etc. with PCL per timestep
593 -foolad | --foolad
594 Fool the AD code generator
595 -papi | --papi
596 Performance analysis with PAPI
597 -pcl | --pcl
598 Performance analysis with PCL
599 -hpmt | --hpmt
600 Performance analysis with the HPM Toolkit
601
602 -gsl | --gsl
603 Use GSL to control floating point rounding and precision
604 -devel | --devel
605 Add additional warning and debugging flags for development
606
607 -mpi | --mpi
608 Include MPI header files and link to MPI libraries
609 -mpi=PATH | --mpi=PATH
610 Include MPI header files and link to MPI libraries using MPI_ROOT
611 set to PATH. i.e. Include files from \$PATH/include, link to libraries
612 from \$PATH/lib and use binaries from \$PATH/bin.
613
614 -es | --es | -embed-source | --embed-source
615 Embed a tarball containing the full source code
616 (including the Makefile, etc.) used to build the
617 executable [off by default]
618
619 -bash NAME
620 Explicitly specify the Bourne or BASH shell to use
621
622 While it is most often a single word, the "NAME" variables specified
623 above can in many cases be a space-delimited string such as:
624
625 --enable pkg1 --enable 'pkg1 pkg2' --enable 'pkg1 pkg2 pkg3'
626 -mods=dir1 -mods='dir1' -mods='dir1 dir2 dir3'
627 -foptim='-Mvect=cachesize:512000,transform -xtypemap=real:64,double:64,integer:32'
628
629 which, depending upon your shell, may need to be single-quoted.
630
631 For more detailed genmake documentation, please see:
632
633 http://mitgcm.org/devel_HOWTO/
634
635 EOF
636
637 exit 1
638 }
639
640 # Build a CPP macro to automate calling C routines from FORTRAN
641 get_fortran_c_namemangling() {
642
643 #echo "FC_NAMEMANGLE = \"$FC_NAMEMANGLE\""
644 if test ! "x$FC_NAMEMANGLE" = x ; then
645 return 0
646 fi
647
648 default_nm="#define FC_NAMEMANGLE(X) X ## _"
649
650 cat > genmake_test.c <<EOF
651 void tcall( char * string ) { tsub( string ); }
652 EOF
653 $MAKE genmake_test.o >> genmake_warnings 2>&1
654 RETVAL=$?
655 if test "x$RETVAL" != x0 ; then
656 FC_NAMEMANGLE=$default_nm
657 cat <<EOF>> genmake_errors
658
659 WARNING: C test compile fails
660 WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
661 WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here
662 EOF
663 return 1
664 fi
665 c_tcall=`nm genmake_test.o 2>/dev/null | grep 'T ' | grep tcall | cut -d ' ' -f 3`
666 RETVAL=$?
667 if test "x$RETVAL" != x0 ; then
668 FC_NAMEMANGLE=$default_nm
669 cat <<EOF>> genmake_warnings
670
671 WARNING: The "nm" command failed.
672 WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
673 WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here
674 EOF
675 return 1
676 fi
677 cat > genmake_tcomp.$FS <<EOF
678 subroutine tcall( string )
679 character*(*) string
680 call tsub( string )
681 end
682 EOF
683 $FC $FFLAGS -c genmake_tcomp.$FS >> genmake_warnings 2>&1
684 RETVAL=$?
685 if test "x$RETVAL" != x0 ; then
686 FC_NAMEMANGLE=$default_nm
687 cat <<EOF>> genmake_warnings
688
689 WARNING: FORTRAN test compile fails -- please see "genmake_errors"
690 WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
691 WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here.
692 EOF
693 return 1
694 fi
695 f_tcall=`nm genmake_tcomp.o 2>/dev/null | grep 'T ' | grep tcall | cut -d ' ' -f 3`
696 RETVAL=$?
697 if test "x$RETVAL" != x0 ; then
698 FC_NAMEMANGLE=$default_nm
699 cat <<EOF>> genmake_warnings
700
701 WARNING: The "nm" command failed.
702 WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
703 WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here.
704 EOF
705 return 1
706 fi
707
708 c_a=`echo $c_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 1 | sed -e 's|Y||'`
709 f_a=`echo $f_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 1 | sed -e 's|Y||'`
710 c_b=`echo $c_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 2 | sed -e 's|Y||'`
711 f_b=`echo $f_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 2 | sed -e 's|Y||'`
712
713 nmangle="X"
714 if test "x$c_a" != "x$f_a" ; then
715 comm="echo x$f_a | sed -e 's|x$c_a||'"
716 a=`eval $comm`
717 nmangle="$a ## $nmangle"
718 fi
719 if test "x$c_b" != "x$f_b" ; then
720 comm="echo x$f_b | sed -e 's|x$c_b||'"
721 b=`eval $comm`
722 nmangle="$nmangle ## $b"
723 fi
724
725 FC_NAMEMANGLE="#define FC_NAMEMANGLE(X) $nmangle"
726
727 # cleanup the testing files
728 rm -f genmake_tcomp.* genmake_test.*
729 }
730
731
732 check_HAVE_CLOC() {
733 get_fortran_c_namemangling
734 cat <<EOF > genmake_tc_1.c
735 $FC_NAMEMANGLE
736 #include <stdio.h>
737 #include <stdlib.h>
738 #include <unistd.h>
739 #include <assert.h>
740 #include <sys/time.h>
741 void FC_NAMEMANGLE(cloc) ( double *curtim )
742 {
743 struct timeval tv1;
744 gettimeofday(&tv1 , (void *)NULL );
745 *curtim = (double)((tv1.tv_usec)+(tv1.tv_sec)*1.E6);
746 *curtim = *curtim/1.E6;
747 }
748 EOF
749 make genmake_tc_1.o >> genmake_warnings 2>&1
750 RET_C=$?
751 cat <<EOF > genmake_tc_2.$FS
752 program hello
753 REAL*8 wtime
754 external cloc
755 call cloc(wtime)
756 print *," HELLO WORLD", wtime
757 end
758 EOF
759 $FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o >> genmake_warnings 2>&1
760 RET_F=$?
761 test -x ./genmake_tc && ./genmake_tc >> genmake_warnings 2>&1
762 RETVAL=$?
763 if test "x$RETVAL" = x0 ; then
764 HAVE_CLOC=t
765 DEFINES="$DEFINES -DHAVE_CLOC"
766 fi
767 rm -f genmake_tc*
768 }
769
770
771 check_HAVE_SIGREG() {
772 if test ! "x$HAVE_SIGREG" = x ; then
773 return
774 fi
775 get_fortran_c_namemangling
776 cat <<EOF > genmake_tc_1.c
777 $FC_NAMEMANGLE
778 #include <stdlib.h>
779 #include <stdio.h>
780 #include <signal.h>
781 #include <errno.h>
782 #include <ucontext.h>
783
784 int * ip;
785
786 static void killhandler(
787 unsigned int sn, siginfo_t si, struct ucontext *sc )
788 {
789 *ip = *ip + 1;
790 return;
791 }
792
793 void FC_NAMEMANGLE(sigreg) (int * aip)
794 {
795 struct sigaction s;
796 ip = aip;
797 s.sa_flags = SA_SIGINFO;
798 s.sa_sigaction = (void *)killhandler;
799 if(sigaction (SIGTERM,&s,(struct sigaction *)NULL)) {
800 printf("Sigaction returned error = %d\n", errno);
801 exit(0);
802 }
803 return;
804 }
805 EOF
806 make genmake_tc_1.o >> genmake_warnings 2>&1
807 RET_C=$?
808 cat <<EOF > genmake_tc_2.$FS
809 program hello
810 integer anint
811 common /iv/ anint
812 external sigreg
813 call sigreg(anint)
814 end
815 EOF
816 echo >> genmake_warnings
817 echo "running: check_HAVE_SIGREG()" >> genmake_warnings
818 cat genmake_tc_2.$FS >> genmake_warnings
819 COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
820 echo $COMM >> genmake_warnings
821 $COMM >> genmake_warnings 2>&1
822 RETVAL=$?
823 if test "x$RETVAL" = x0 ; then
824 HAVE_SIGREG=t
825 DEFINES="$DEFINES -DHAVE_SIGREG"
826 fi
827 rm -f genmake_tc*
828 }
829
830
831 check_HAVE_SETRLSTK() {
832 if test "x$HAVE_SETRLSTK" = xt ; then
833 DEFINES="$DEFINES -DHAVE_SETRLSTK"
834 return
835 fi
836 if test ! "x$HAVE_SETRLSTK" = x ; then
837 return
838 fi
839 get_fortran_c_namemangling
840 cat <<EOF > genmake_tc_1.c
841 $FC_NAMEMANGLE
842 #include <sys/time.h>
843 #include <sys/resource.h>
844 #include <unistd.h>
845 void FC_NAMEMANGLE(setrlstk) ()
846 {
847 struct rlimit rls;
848 rls.rlim_cur = RLIM_INFINITY;
849 rls.rlim_max = RLIM_INFINITY;
850 setrlimit(RLIMIT_STACK, &rls);
851 return;
852 }
853 EOF
854 make genmake_tc_1.o >> genmake_warnings 2>&1
855 RET_C=$?
856 cat <<EOF > genmake_tc_2.$FS
857 program hello
858 external setrlstk
859 call setrlstk()
860 end
861 EOF
862 echo >> genmake_warnings
863 echo "running: check_HAVE_SETRLSTK()" >> genmake_warnings
864 cat genmake_tc_2.$FS >> genmake_warnings
865 COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
866 echo $COMM >> genmake_warnings
867 $COMM >> genmake_warnings 2>&1
868 RETVAL=$?
869 if test "x$RETVAL" = x0 ; then
870 HAVE_SETRLSTK=t
871 DEFINES="$DEFINES -DHAVE_SETRLSTK"
872 fi
873 rm -f genmake_tc*
874 }
875
876
877 check_HAVE_STAT() {
878 get_fortran_c_namemangling
879 cat <<EOF > genmake_tc_1.c
880 $FC_NAMEMANGLE
881 #include <stdio.h>
882 #include <stdlib.h>
883 #include <unistd.h>
884 #include <sys/stat.h>
885 #include <sys/types.h>
886 void FC_NAMEMANGLE(tfsize) ( int *nbyte )
887 {
888 char name[512];
889 struct stat astat;
890
891 name[0] = 'a'; name[1] = '\0';
892 if (! stat(name, &astat))
893 *nbyte = (int)(astat.st_size);
894 else
895 *nbyte = -1;
896 }
897 EOF
898 make genmake_tc_1.o >> genmake_tc.log 2>&1
899 RET_C=$?
900 cat <<EOF > genmake_tc_2.$FS
901 program hello
902 integer nbyte
903 call tfsize(nbyte)
904 print *," HELLO WORLD", nbyte
905 end
906 EOF
907 echo >> genmake_warnings
908 echo "running: check_HAVE_STAT()" >> genmake_warnings
909 cat genmake_tc_2.$FS >> genmake_warnings
910 COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
911 echo $COMM >> genmake_warnings
912 $COMM >> genmake_tc.log 2>&1
913 RETVAL=$?
914 if test "x$RETVAL" = x0 ; then
915 HAVE_STAT=t
916 DEFINES="$DEFINES -DHAVE_STAT"
917 fi
918 rm -f genmake_tc*
919 }
920
921
922 check_netcdf_libs() {
923 if test ! "x$SKIP_NETCDF_CHECK" = x ; then
924 return
925 fi
926 echo >> genmake_warnings
927 echo "running: check_netcdf_libs()" >> genmake_warnings
928 cat <<EOF > genmake_tnc.F
929 program fgennc
930 #include "netcdf.inc"
931 EOF
932 if test ! "x$MPI" = x ; then
933 echo '#include "mpif.h"' >> genmake_tnc.F
934 fi
935 cat <<EOF >> genmake_tnc.F
936 integer iret, ncid, xid
937 iret = nf_create('genmake_tnc.nc', NF_CLOBBER, ncid)
938 IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
939 iret = nf_def_dim(ncid, 'X', 11, xid)
940 IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
941 iret = nf_close(ncid)
942 IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
943 end
944 EOF
945 echo "=== genmake_tnc.F ===" > genmake_tnc.log
946 cat genmake_tnc.F >> genmake_tnc.log
947 echo "=== genmake_tnc.F ===" >> genmake_tnc.log
948 RET_CPP=f
949 COMM="cat genmake_tnc.F | $CPP $DEFINES $INCLUDES"
950 echo "$COMM" >> genmake_tnc.log
951 eval $COMM > genmake_tnc.$FS 2>/dev/null && RET_CPP=t
952 if test "x$RET_CPP" = xf ; then
953 echo " WARNING: CPP failed to pre-process the netcdf test." \
954 >> genmake_tnc.log
955 echo " Please check that \$INCLUDES is properly set." \
956 >> genmake_tnc.log
957 fi
958 echo "$FC $FFLAGS $FOPTIM -c genmake_tnc.$FS \ " >> genmake_tnc.log
959 echo " && $LINK $FFLAGS $FOPTIM -o genmake_tnc.o $LIBS" >> genmake_tnc.log
960 $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1 \
961 && $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS >> genmake_tnc.log 2>&1
962 RET_COMPILE=$?
963 cat genmake_tnc.log >> genmake_warnings
964
965 #EH3 Remove test program execution for machines that either disallow
966 #EH3 execution or cannot support it (eg. cross-compilers)
967 #EH3
968 #EH3 test -x ./genmake_tnc && ./genmake_tnc >> genmake_tnc.log 2>&1
969 #EH3 RETVAL=$?
970 #EH3 if test "x$RET_COMPILE" = x0 -a "x$RETVAL" = x0 ; then
971
972 if test "x$RET_COMPILE" = x0 ; then
973 HAVE_NETCDF=t
974 else
975 # try again with "-lnetcdf" added to the libs
976 echo "try again with added '-lnetcdf'" > genmake_tnc.log
977 echo "cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS \ " >> genmake_tnc.log
978 echo " && $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS \ " >> genmake_tnc.log
979 echo " && $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf" >> genmake_tnc.log
980 cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS 2>/dev/null \
981 && $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1 \
982 && $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf >> genmake_tnc.log 2>&1
983 RET_COMPILE=$?
984 cat genmake_tnc.log >> genmake_warnings
985 if test "x$RET_COMPILE" = x0 ; then
986 LIBS="$LIBS -lnetcdf"
987 HAVE_NETCDF=t
988 else
989 # try again with "-lnetcdff" added to the libs
990 echo "try again with added '-lnetcdff -lnetcdf'" > genmake_tnc.log
991 echo "cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS \ " >> genmake_tnc.log
992 echo " && $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS \ " >> genmake_tnc.log
993 echo " && $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf" >> genmake_tnc.log
994 cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS 2>/dev/null \
995 && $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1 \
996 && $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdff -lnetcdf >> genmake_tnc.log 2>&1
997 RET_COMPILE=$?
998 cat genmake_tnc.log >> genmake_warnings
999 if test "x$RET_COMPILE" = x0 ; then
1000 LIBS="$LIBS -lnetcdff -lnetcdf"
1001 HAVE_NETCDF=t
1002 fi
1003 fi
1004 fi
1005 rm -f genmake_tnc*
1006 }
1007
1008
1009
1010 ###############################################################################
1011 # Sequential part of script starts here
1012 ###############################################################################
1013
1014 # Set defaults here
1015 COMMANDL="$0 $@"
1016
1017 PLATFORM=
1018 LN=
1019 S64=
1020 KPP=
1021 #FC=
1022 #CC=gcc
1023 #CPP=
1024 LINK=
1025 DEFINES=
1026 PACKAGES=
1027 ENABLE=
1028 DISABLE=
1029 # MAKEFILE=
1030 # MAKEDEPEND=
1031 PDEPEND=
1032 DUMPSTATE=t
1033 PDEFAULT=
1034 OPTFILE=
1035 INCLUDES="-I. $INCLUDES"
1036 FFLAGS=
1037 FOPTIM=
1038 CFLAGS=
1039 KFLAGS1=
1040 KFLAGS2=
1041 #LDADD=
1042 LIBS=
1043 KPPFILES=
1044 NOOPTFILES=
1045 NOOPTFLAGS=
1046 MPI=
1047 MPIPATH=
1048 TS=
1049 PAPIS=
1050 PCLS=
1051 FOOLAD=
1052 PAPI=
1053 PCL=
1054 HPMT=
1055 GSL=
1056 DEVEL=
1057 HAVE_TEST_L=
1058
1059 # DEFINES checked by test compilation or command-line
1060 HAVE_SYSTEM=
1061 HAVE_FDATE=
1062 FC_NAMEMANGLE=
1063 HAVE_CLOC=
1064 # HAVE_SETRLSTK=
1065 HAVE_STAT=
1066 HAVE_NETCDF=
1067 HAVE_ETIME=
1068 IGNORE_TIME=
1069
1070 MODS=
1071 TOOLSDIR=
1072 SOURCEDIRS=
1073 INCLUDEDIRS=
1074 STANDARDDIRS="USE_THE_DEFAULT"
1075
1076 G2ARGS=
1077 BASH=
1078 PWD=`pwd`
1079 test "x$MAKE" = x && MAKE=make
1080 test "x$AWK" = x && AWK=awk
1081 EMBED_SRC=
1082 THISHOST=`hostname`
1083 THISCWD=`pwd`
1084 THISDATE=`date`
1085 THISUSER=`echo $USER`
1086 THISVER=
1087 MACHINE=`uname -a`
1088 EXECUTABLE=
1089 EXEHOOK=
1090 EXEDIR=
1091 PACKAGES_CONF=
1092 IEEE=
1093 if test "x$MITGCM_IEEE" != x ; then
1094 IEEE=$MITGCM_IEEE
1095 fi
1096 FS=
1097 FS90=
1098
1099 AUTODIFF_PKG_USED=f
1100 AD_OPTFILE=
1101 TAF=
1102 AD_TAF_FLAGS=
1103 FTL_TAF_FLAGS=
1104 SVD_TAF_FLAGS=
1105 TAF_EXTRA=
1106 TAMC=
1107 AD_TAMC_FLAGS=
1108 FTL_TAF_FLAGS=
1109 SVD_TAMC_FLAGS=
1110 TAMC_EXTRA=
1111
1112
1113 # The following state can be set directly by command-line switches
1114 gm_s1="OPTFILE PDEPEND PDEFAULT MAKEFILE PLATFORM ROOTDIR MODS DISABLE ENABLE"
1115 gm_s2="FC CPP IEEE TS PAPIS PCLS PAPI PCL HPMT GSL DEVEL MPI JAM DUMPSTATE STANDARDDIRS"
1116
1117 # The following state is not directly set by command-line switches
1118 gm_s3="LN S64 KPP LINK PACKAGES MAKEDEPEND PDEPEND PDEFAULT INCLUDES FFLAGS FOPTIM "
1119 gm_s4="CFLAGS KFLAGS1 KFLAGS2 LIBS KPPFILES NOOPTFILES NOOPTFLAGS"
1120 gm_s5="TOOLSDIR SOURCEDIRS INCLUDEDIRS PWD MAKE THISHOST THISUSER THISDATE THISVER MACHINE"
1121 gm_s6="EXECUTABLE EXEHOOK EXEDIR PACKAGES_CONF"
1122 gm_s7="HAVE_SYSTEM HAVE_FDATE FC_NAMEMANGLE HAVE_ETIME"
1123
1124 # The following are all related to adjoint/tangent-linear stuff
1125 gm_s10="AUTODIFF_PKG_USED AD_OPTFILE TAMC TAF AD_TAMC_FLAGS AD_TAF_FLAGS"
1126 gm_s11="FTL_TAMC_FLAGS FTL_TAF_FLAGS SVD_TAMC_FLAGS SVD_TAF_FLAGS"
1127 gm_s12="TAF_EXTRA TAMC_EXTRA"
1128
1129 gm_state="COMMANDL $gm_s1 $gm_s2 $gm_s3 $gm_s4 $gm_s5 $gm_s6 $gm_s7"
1130 gm_state="$gm_state $gm_s10 $gm_s11 $gm_s12"
1131
1132 cat <<EOF
1133
1134 GENMAKE :
1135
1136 A program for GENerating MAKEfiles for the MITgcm project. For a
1137 quick list of options, use "genmake -h" or for more detail see:
1138
1139 http://mitgcm.org/devel_HOWTO/
1140
1141 EOF
1142
1143 echo "=== Processing options files and arguments ==="
1144 gm_local="genmake_local"
1145 for i in . $MODS ; do
1146 if test -r $i/$gm_local ; then
1147 . $i/$gm_local
1148 break
1149 fi
1150 done
1151 printf " getting local config information: "
1152 if test -f $gm_local ; then
1153 echo "using $gm_local"
1154 . $gm_local
1155 # echo "DISABLE=$DISABLE"
1156 # echo "ENABLE=$ENABLE"
1157 else
1158 echo "none found"
1159 fi
1160
1161 #echo "$0::$1:$2:$3:$4:$5:$6:$7:"
1162 #OPTIONS=
1163 #n=0
1164 #for i ; do
1165 # echo "$i $n"
1166 # setvar="OPTIONS[$n]='$i'"
1167 # # echo " $setvar"
1168 # eval "$setvar"
1169 # n=$(( $n + 1 ))
1170 #done
1171 #parse_options
1172 ac_prev=
1173 for ac_option in "$@" ; do
1174
1175 G2ARGS="$G2ARGS \"$ac_option\""
1176
1177 # If the previous option needs an argument, assign it.
1178 if test -n "$ac_prev"; then
1179 eval "$ac_prev=\$ac_option"
1180 ac_prev=
1181 continue
1182 fi
1183
1184 ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
1185
1186 case $ac_option in
1187
1188 -help | --help | -h | --h)
1189 usage ;;
1190
1191 -nooptfile | --nooptfile)
1192 OPTFILE="NONE" ;;
1193 -optfile | --optfile | -of | --of)
1194 ac_prev=OPTFILE ;;
1195 -optfile=* | --optfile=* | -of=* | --of=*)
1196 OPTFILE=$ac_optarg ;;
1197
1198 -adoptfile | --adoptfile | -adof | --adof)
1199 ac_prev=AD_OPTFILE ;;
1200 -adoptfile=* | --adoptfile=* | -adof=* | --adof=*)
1201 AD_OPTFILE=$ac_optarg ;;
1202
1203 -pdepend | --pdepend)
1204 ac_prev=PDEPEND ;;
1205 -pdepend=* | --pdepend=*)
1206 PDEPEND=$ac_optarg ;;
1207
1208 -pdefault | --pdefault)
1209 ac_prev=PDEFAULT ;;
1210 -pdefault=* | --pdefault=*)
1211 PDEFAULT=$ac_optarg ;;
1212
1213 -make | --make | -m | --m)
1214 ac_prev=MAKE ;;
1215 -make=* | --make=* | -m=* | --m=*)
1216 MAKE=$ac_optarg ;;
1217
1218 -bash | --bash)
1219 ac_prev=BASH ;;
1220 -bash=* | --bash=*)
1221 BASH=$ac_optarg ;;
1222
1223 -makedepend | --makedepend | -md | --md)
1224 ac_prev=MAKEDEPEND ;;
1225 -makedepend=* | --makedepend=* | -md=* | --md=*)
1226 MAKEDEPEND=$ac_optarg ;;
1227
1228 -makefile | --makefile | -ma | --ma)
1229 ac_prev=MAKEFILE ;;
1230 -makefile=* | --makefile=* | -ma=* | --ma=*)
1231 MAKEFILE=$ac_optarg ;;
1232
1233 -platform | --platform | -pl | --pl | -platform=* | --platform=* | -pl=* | --pl=*)
1234 echo "ERROR: The platform option has been removed. Please specify"
1235 echo " the build options using the \"optfile\" mechanism."
1236 echo
1237 usage
1238 ;;
1239
1240 -rootdir | --rootdir | -rd | --rd)
1241 ac_prev=ROOTDIR ;;
1242 -rootdir=* | --rootdir=* | -rd=* | --rd=*)
1243 ROOTDIR=$ac_optarg ;;
1244
1245 -mods | --mods | -mo | --mo)
1246 ac_prev=MODS ;;
1247 -mods=* | --mods=* | -mo=* | --mo=*)
1248 MODS=$ac_optarg ;;
1249
1250 -disable | --disable)
1251 ac_prev=DISABLE ;;
1252 -disable=* | --disable=*)
1253 DISABLE=$ac_optarg ;;
1254
1255 -enable | --enable)
1256 ac_prev=ENABLE ;;
1257 -enable=* | --enable=*)
1258 ENABLE=$ac_optarg ;;
1259
1260 -standarddirs | --standarddirs)
1261 ac_prev=STANDARDDIRS ;;
1262 -standarddirs=* | --standarddirs=*)
1263 STANDARDDIRS=$ac_optarg ;;
1264
1265 # -cpp | --cpp)
1266 # ac_prev=cpp ;;
1267 # -cpp=* | --cpp=*)
1268 # CPP=$ac_optarg ;;
1269
1270 -cc | --cc)
1271 ac_prev=CC ;;
1272 -cc=* | --cc=*)
1273 CC=$ac_optarg ;;
1274
1275 -fortran | --fortran | -fc | --fc)
1276 ac_prev=FC ;;
1277 -fc=* | --fc=*)
1278 FC=$ac_optarg ;;
1279
1280 -fs | --fs)
1281 ac_prev=FS ;;
1282 -fs=* | --fs=*)
1283 FS=$ac_optarg ;;
1284
1285 -fs90 | --fs90)
1286 ac_prev=FS90 ;;
1287 -fs90=* | --fs90=*)
1288 FS90=$ac_optarg ;;
1289
1290 -ieee | --ieee)
1291 IEEE=true ;;
1292 -noieee | --noieee)
1293 IEEE= ;;
1294
1295 -ts | --ts)
1296 TS=true ;;
1297 -papis | --papis)
1298 PAPIS=true ;;
1299 -pcls | --pcls)
1300 PCLS=true ;;
1301 -foolad | --foolad)
1302 FOOLAD=true ;;
1303 -papi | --papi)
1304 PAPI=true ;;
1305 -pcl | --pcl)
1306 PCL=true ;;
1307 -hpmt | --hpmt)
1308 HPMT=true ;;
1309
1310 -gsl | --gsl)
1311 GSL=true ;;
1312
1313 -devel | --devel)
1314 DEVEL=true ;;
1315
1316 -mpi | --mpi)
1317 MPI=true ;;
1318 -mpi=* | --mpi=*)
1319 MPIPATH=$ac_optarg
1320 MPI=true ;;
1321
1322 # -jam | --jam)
1323 # JAM=1 ;;
1324 # -nojam | --nojam)
1325 # JAM=0 ;;
1326
1327 -ds | --ds)
1328 DUMPSTATE=t ;;
1329
1330 -taf_extra | --taf_extra)
1331 ac_prev=TAF_EXTRA ;;
1332 -taf_extra=* | --taf_extra=*)
1333 TAF_EXTRA=$ac_optarg ;;
1334
1335 -tamc_extra | --tamc_extra)
1336 ac_prev=TAMC_EXTRA ;;
1337 -tamc_extra=* | --tamc_extra=*)
1338 TAMC_EXTRA=$ac_optarg ;;
1339
1340 -ignoretime | -ignore_time | --ignoretime | --ignore_time)
1341 IGNORE_TIME="-DIGNORE_TIME" ;;
1342
1343 -es | --es | -embed-source | --embed-source)
1344 EMBED_SRC=t ;;
1345
1346 -*)
1347 echo "Error: unrecognized option: "$ac_option
1348 usage
1349 ;;
1350
1351 *)
1352 echo "Error: unrecognized argument: "$ac_option
1353 usage
1354 ;;
1355
1356 esac
1357
1358 done
1359
1360
1361 if test -f ./.genmakerc ; then
1362 echo
1363 echo "WARNING: genmake2 has detected a copy of the old-style \"./.genmakerc\""
1364 echo " file. This file format is no longer supported. For directions on"
1365 echo " how to setup and use the new \"genmake2\" script, please see:"
1366 echo " http://mitgcm.org/devel_HOWTO/"
1367 echo " and send an email to MITgcm-support@mitgcm.org if you need help."
1368 echo "WARNING: ignore \"./.genmakerc\" and continue."
1369 echo
1370 fi
1371
1372 # Find the MITgcm ${ROOTDIR}
1373 if test "x${ROOTDIR}" = x ; then
1374 tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1375 if test "x$tmp" = "xbin" -a -d ../model -a -d ../eesupp -a -d ../pkg ; then
1376 ROOTDIR=".."
1377 else
1378 for d in . .. ../.. ../../.. ../../../.. ../../../../.. ; do
1379 if [ -d "$d/model" -a -d "$d/eesupp" -a -d "$d/pkg" ]; then
1380 ROOTDIR=$d
1381 printf "Warning: ROOTDIR was not specified but there appears to be"
1382 echo " a copy of MITgcm at \"$ROOTDIR\" so we'll try it."
1383 break
1384 fi
1385 done
1386 fi
1387 fi
1388 if test "x${ROOTDIR}" = x ; then
1389 echo "Error: Cannot determine ROOTDIR for MITgcm code."
1390 echo " Please specify a ROOTDIR using either an options "
1391 echo " file or a command-line option."
1392 exit 1
1393 fi
1394 if test ! -d ${ROOTDIR} ; then
1395 echo "Error: the specified ROOTDIR (\"$ROOTDIR\") does not exist!"
1396 exit 1
1397 fi
1398
1399 # Find the MITgcm ${THISVER}
1400 if test -f "${ROOTDIR}/doc/tag-index" ; then
1401 THISVER=`grep '^checkpoint' ${ROOTDIR}/doc/tag-index | head -1`
1402 fi
1403
1404 if test "x$MAKEFILE" = x ; then
1405 MAKEFILE="Makefile"
1406 fi
1407
1408 echo " getting OPTFILE information: "
1409 if test "x${OPTFILE}" = x ; then
1410 if test "x$MITGCM_OF" = x ; then
1411 echo "Warning: no OPTFILE specified so we'll look for possible settings"
1412 printf "\n=== Searching for possible settings for OPTFILE ===\n"
1413 find_possible_configs
1414 else
1415 OPTFILE=$MITGCM_OF
1416 fi
1417 fi
1418 if test "x$OPTFILE" != xNONE ; then
1419 if test -f "$OPTFILE" -a -r "$OPTFILE" ; then
1420 echo " using OPTFILE=\"$OPTFILE\""
1421 . "$OPTFILE"
1422 RETVAL=$?
1423 if test "x$RETVAL" != x0 ; then
1424 printf "Error: failed to source OPTFILE \"$OPTFILE\""
1425 echo "--please check that variable syntax is bash-compatible"
1426 exit 1
1427 fi
1428 if test "x$DUMPSTATE" != xf ; then
1429 cp -f $OPTFILE "genmake_optfile"
1430 fi
1431 else
1432 echo "Error: can't read OPTFILE=\"$OPTFILE\""
1433 exit 1
1434 fi
1435 fi
1436
1437 echo " getting AD_OPTFILE information: "
1438 if test "x${AD_OPTFILE}" = x ; then
1439 if test "x$MITGCM_AD_OF" = x ; then
1440 AD_OPTFILE=$ROOTDIR/tools/adjoint_options/adjoint_default
1441 else
1442 AD_OPTFILE=$MITGCM_AD_OF
1443 fi
1444 fi
1445 if test "x${AD_OPTFILE}" != xNONE ; then
1446 if test -f "$AD_OPTFILE" -a -r "$AD_OPTFILE" ; then
1447 echo " using AD_OPTFILE=\"$AD_OPTFILE\""
1448 . "$AD_OPTFILE"
1449 RETVAL=$?
1450 if test "x$RETVAL" != x0 ; then
1451 printf "Error: failed to source AD_OPTFILE \"$AD_OPTFILE\""
1452 echo "--please check that variable syntax is bash-compatible"
1453 exit 1
1454 fi
1455 if test "x$DUMPSTATE" != xf ; then
1456 cp -f $AD_OPTFILE "genmake_ad_optfile"
1457 fi
1458 else
1459 echo "Error: can't read AD_OPTFILE=\"$AD_OPTFILE\""
1460 exit 1
1461 fi
1462 fi
1463
1464 #====================================================================
1465 # Set default values if not set by the optfile
1466 #
1467 # Check that FC, CC, LINK, CPP, S64, LN, and MAKE are defined. If not,
1468 # either set defaults or complain and abort!
1469 if test ! "x$BASH" = x ; then
1470 # add a trailing space so that it works within the Makefile syntax (see below)
1471 BASH="$BASH "
1472 fi
1473 if test "x$FC" = x ; then
1474 cat <<EOF 1>&2
1475
1476 Error: no Fortran compiler: please specify using one of the following:
1477 1) within the options file ("FC=...") as specified by "-of=OPTFILE"
1478 2) the "-fc=XXX" command-line option
1479 3) the "./genmake_local" file
1480 EOF
1481 exit 1
1482 fi
1483 if test "x$CC" = x ; then
1484 CC=cc
1485 # cat <<EOF 1>&2
1486 # Error: no C compiler: please specify using one of the following:
1487 # 1) within the options file ("CC=...") as specified by "-of=OPTFILE"
1488 # 2) the "-cc=XXX" command-line option
1489 # 3) the "./genmake_local" file
1490 # EOF
1491 # exit 1
1492 fi
1493 if test "x$LINK" = x ; then
1494 LINK=$FC
1495 fi
1496 if test "x$MAKE" = x ; then
1497 MAKE="make"
1498 fi
1499 if test "x$CPP" = x ; then
1500 CPP=cpp
1501 fi
1502 #EH3 === UGLY ===
1503 # The following is an ugly little hack to check for $CPP in /lib/ and
1504 # it should eventually be replaced with a more general function that
1505 # searches a combo of the user's path and a list of "usual suspects"
1506 # to find the correct location for binaries such as $CPP.
1507 for i in " " "/lib/" ; do
1508 echo "#define A a" | $i$CPP > test_cpp 2>&1 && CPP=$i$CPP
1509 done
1510 #EH3 === UGLY ===
1511 echo "#define A a" | $CPP > test_cpp 2>&1
1512 RETVAL=$?
1513 if test "x$RETVAL" != x0 ; then
1514 cat <<EOF 1>&2
1515
1516 Error: C pre-processor "$CPP" failed the test case: please specify using:
1517
1518 1) within the options file ("CPP=...") as specified by "-of=OPTFILE"
1519 2) the "./genmake_local" file
1520 3) with the CPP environment variable
1521
1522 EOF
1523 exit 1
1524 else
1525 rm -f test_cpp
1526 fi
1527 look_for_makedepend
1528 if test "x$LN" = x ; then
1529 LN="ln -s"
1530 fi
1531 echo "test" > genmake_test_ln
1532 $LN genmake_test_ln genmake_tlink
1533 RETVAL=$?
1534 if test "x$RETVAL" != x0 ; then
1535 cat <<EOF 1>&2
1536
1537 Error: The command "ln -s" failed -- please specify a working soft-link
1538 command in the optfile.
1539
1540 EOF
1541 exit 1
1542 fi
1543 test -L genmake_tlink > /dev/null 2>&1
1544 RETVAL=$?
1545 if test "x$RETVAL" = x0 ; then
1546 HAVE_TEST_L=t
1547 fi
1548 rm -f genmake_test_ln genmake_tlink
1549
1550 # Check for broken *.F/*.f handling and fix if possible
1551 check_for_broken_Ff
1552
1553 if test ! "x$MPI" = x ; then
1554 echo " Turning on MPI cpp macros"
1555 DEFINES="$DEFINES -DALLOW_USE_MPI -DALWAYS_USE_MPI"
1556 fi
1557
1558 if test ! "x$TS" = x ; then
1559 echo " Turning on timing per timestep"
1560 if test ! "x$FOOLAD" = x ; then
1561 DEFINES="$DEFINES -DTIME_PER_TIMESTEP_SFP"
1562 else
1563 DEFINES="$DEFINES -DTIME_PER_TIMESTEP"
1564 fi
1565 fi
1566 if test ! "x$PAPIS" = x ; then
1567 echo " Turning on PAPI flop summary per timestep"
1568 echo " Please make sure PAPIINC, PAPILIB are defined"
1569 if test ! "x$FOOLAD" = x ; then
1570 DEFINES="$DEFINES -DUSE_PAPI_FLOPS_SFP"
1571 else
1572 DEFINES="$DEFINES -DUSE_PAPI_FLOPS"
1573 fi
1574 INCLUDES="$INCLUDES $PAPIINC"
1575 LIBS="$LIBS $PAPILIB"
1576 fi
1577 if test ! "x$PCLS" = x ; then
1578 echo " Turning on PCL counter summary per timestep"
1579 echo " Please make sure PCLINC, PCLLIB are defined"
1580 if test ! "x$FOOLAD" = x ; then
1581 DEFINES="$DEFINES -DUSE_PCL_FLOPS_SFP"
1582 else
1583 DEFINES="$DEFINES -DUSE_PCL_FLOPS"
1584 fi
1585 INCLUDES="$INCLUDES $PCLINC"
1586 LIBS="$LIBS $PCLLIB"
1587 fi
1588 if test ! "x$PAPI" = x ; then
1589 if test ! "x$PAPIS" = x ; then
1590 echo " PAPI performance analysis and flop summary per timestep cannot co-exist!"
1591 echo " Sticking with PAPI flop summary per timestep!"
1592 else
1593 echo " Turning on performance analysis with PAPI"
1594 echo " Please make sure PAPIINC, PAPILIB are defined"
1595 DEFINES="$DEFINES -DUSE_PAPI"
1596 INCLUDES="$INCLUDES $PAPIINC"
1597 LIBS="$LIBS $PAPILIB"
1598 fi
1599 fi
1600 if test ! "x$PCL" = x ; then
1601 if test ! "x$PCLS" = x ; then
1602 echo " PCL performance analysis and flop summary per timestep cannot co-exist!"
1603 echo " Sticking with PCL flop summary per timestep!"
1604 else
1605 echo " Turning on performance analysis with PCL"
1606 echo " Please make sure PCLINC, PCLLIB are defined"
1607 DEFINES="$DEFINES -DUSE_PCL"
1608 INCLUDES="$INCLUDES $PCLINC"
1609 LIBS="$LIBS $PCLLIB"
1610 fi
1611 fi
1612 if test ! "x$HPMT" = x ; then
1613 if test ! "x$PAPI" = x ; then
1614 echo " PAPI and the HPM Toolkit cannot co-exist!"
1615 echo " Sticking with PAPI!"
1616 else if test ! "x$PCL" = x ; then
1617 echo " PCL and the HPM Toolkit cannot co-exist!"
1618 echo " Sticking with PCL!"
1619 else
1620 echo " Turning on performance analysis with the HPM Toolkit"
1621 echo " Please make sure HPMTINC, HPMTLIB are defined"
1622 DEFINES="$DEFINES -DUSE_LIBHPM"
1623 INCLUDES="$INCLUDES $HPMTINC"
1624 LIBS="$LIBS $HPMTLIB"
1625 fi
1626 fi
1627 fi
1628 if test ! "x$GSL" = x ; then
1629 echo " Turning on use of GSL to control floating point calculations"
1630 echo " Please make sure GSLINC, GSLLIB are defined"
1631 DEFINES="$DEFINES -DUSE_GSL_IEEE"
1632 INCLUDES="$INCLUDES $GSLINC"
1633 LIBS="$LIBS $GSLLIB"
1634 fi
1635
1636 printf "\n=== Checking system libraries ===\n"
1637 printf " Do we have the system() command using $FC... "
1638 cat > genmake_tcomp.$FS <<EOF
1639 program hello
1640 call system('echo hi')
1641 end
1642 EOF
1643 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1644 RETVAL=$?
1645 if test "x$RETVAL" = x0 ; then
1646 HAVE_SYSTEM=t
1647 DEFINES="$DEFINES -DHAVE_SYSTEM"
1648 echo "yes"
1649 else
1650 HAVE_SYSTEM=
1651 echo "no"
1652 fi
1653 rm -f genmake_tcomp*
1654
1655 printf " Do we have the fdate() command using $FC... "
1656 cat > genmake_tcomp.$FS <<EOF
1657 program hello
1658 CHARACTER*(128) string
1659 string = ' '
1660 call fdate( string )
1661 print *, string
1662 end
1663 EOF
1664 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1665 RETVAL=$?
1666 if test "x$RETVAL" = x0 ; then
1667 HAVE_FDATE=t
1668 DEFINES="$DEFINES -DHAVE_FDATE"
1669 echo "yes"
1670 else
1671 HAVE_FDATE=
1672 echo "no"
1673 fi
1674 rm -f genmake_tcomp*
1675
1676 printf " Do we have the etime() command using $FC... "
1677 cat > genmake_tcomp.$FS <<EOF
1678 program hello
1679 REAL*4 ACTUAL, TARRAY(2)
1680 EXTERNAL ETIME
1681 REAL*4 ETIME
1682 actual = etime( tarray )
1683 print *, tarray
1684 end
1685 EOF
1686 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1687 RETVAL=$?
1688 if test "x$RETVAL" = x0 ; then
1689 HAVE_ETIME=t
1690 DEFINES="$DEFINES -DHAVE_ETIME"
1691 echo "yes"
1692 else
1693 HAVE_ETIME=
1694 echo "no"
1695 fi
1696 rm -f genmake_tcomp*
1697
1698 printf " Can we call simple C routines (here, \"cloc()\") using $FC... "
1699 check_HAVE_CLOC
1700 if test "x$HAVE_CLOC" != x ; then
1701 echo "yes"
1702 else
1703 echo "no"
1704 if test "x$EMBED_SRC" = xt ; then
1705 echo " WARNING: you requested file embedding but it has"
1706 echo " been disabled since C code cannot be called"
1707 EMBED_SRC=
1708 fi
1709 fi
1710 rm -f genmake_t*
1711
1712 printf " Can we unlimit the stack size using $FC... "
1713 check_HAVE_SETRLSTK
1714 if test "x$HAVE_SETRLSTK" = xt ; then
1715 echo "yes"
1716 else
1717 echo "no"
1718 fi
1719 rm -f genmake_t*
1720
1721 printf " Can we register a signal handler using $FC... "
1722 check_HAVE_SIGREG
1723 if test "x$HAVE_SIGREG" = xt ; then
1724 echo "yes"
1725 else
1726 echo "no"
1727 fi
1728 rm -f genmake_t*
1729
1730 printf " Can we use stat() through C calls... "
1731 check_HAVE_STAT
1732 if test "x$HAVE_STAT" != x ; then
1733 echo "yes"
1734 else
1735 echo "no"
1736 fi
1737 rm -f genmake_t*
1738
1739 printf " Can we create NetCDF-enabled binaries... "
1740 check_netcdf_libs
1741 if test "x$HAVE_NETCDF" != x ; then
1742 echo "yes"
1743 else
1744 echo "no"
1745 fi
1746 DEFINES="$DEFINES $IGNORE_TIME"
1747
1748 if test "x$EMBED_SRC" = xt ; then
1749 build_embed_encode
1750 fi
1751 if test "x$EMBED_SRC" = xt ; then
1752 ENABLE="$ENABLE embed_files"
1753 fi
1754
1755
1756 printf "\n=== Setting defaults ===\n"
1757 printf " Adding MODS directories: "
1758 for d in $MODS ; do
1759 if test ! -d $d ; then
1760 echo
1761 echo "Error: MODS directory \"$d\" not found!"
1762 exit 1
1763 else
1764 printf " $d"
1765 SOURCEDIRS="$SOURCEDIRS $d"
1766 INCLUDEDIRS="$INCLUDEDIRS $d"
1767 fi
1768 done
1769 echo
1770
1771 if test "x${PLATFORM}" = x ; then
1772 PLATFORM=$p_PLATFORM
1773 fi
1774
1775 if test "x${EXEDIR}" = x ; then
1776 tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1777 if test "x$tmp" = "xbin" -a -d ../exe -a $ROOTDIR = .. ; then
1778 EXEDIR=../exe
1779 else
1780 EXEDIR=.
1781 fi
1782 fi
1783 if test ! -d ${EXEDIR} ; then
1784 echo "Error: the specified EXEDIR (\"$EXEDIR\") does not exist!"
1785 exit 1
1786 fi
1787
1788 if test "x${TOOLSDIR}" = x ; then
1789 TOOLSDIR="$ROOTDIR/tools"
1790 fi
1791 if test ! -d ${TOOLSDIR} ; then
1792 echo "Error: the specified TOOLSDIR (\"$TOOLSDIR\") does not exist!"
1793 exit 1
1794 fi
1795 if test "x$S64" = x ; then
1796 echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.sh > /dev/null 2>&1
1797 RETVAL=$?
1798 if test "x${RETVAL}" = x0 ; then
1799 S64='$(TOOLSDIR)/set64bitConst.sh'
1800 else
1801 echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.csh > /dev/null 2>&1
1802 RETVAL=$?
1803 if test "x${RETVAL}" = x0 ; then
1804 S64='$(TOOLSDIR)/set64bitConst.csh'
1805 else
1806 cat <<EOF
1807
1808 ERROR: neither of the two default scripts:
1809
1810 ${TOOLSDIR}/set64bitConst.sh
1811 ${TOOLSDIR}/set64bitConst.csh
1812
1813 are working so please check paths or specify (with \$S64) a
1814 working version of this script.
1815
1816 EOF
1817 exit 1
1818 fi
1819 fi
1820 fi
1821 THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`
1822
1823 EXECUTABLE=${EXECUTABLE:-mitgcmuv}
1824
1825 # We have a special set of source files in eesupp/src which are
1826 # generated from some template source files. We'll make them first so
1827 # they appear as regular source code
1828 if test -r $ROOTDIR"/eesupp/src/Makefile" ; then
1829 echo " Making source files in eesupp from templates"
1830 ( cd $ROOTDIR"/eesupp/src/" && $MAKE ) > make_eesupp.errors 2>&1
1831 RETVAL=$?
1832 if test "x${RETVAL}" = x0 ; then
1833 rm -f make_eesupp.errors
1834 else
1835 echo "Error: problem encountered while building source files in eesupp:"
1836 cat make_eesupp.errors 1>&2
1837 exit 1
1838 fi
1839 fi
1840
1841 #same for pkg/exch2 and pkg/regrid
1842 for pdir in exch2 regrid ; do
1843 if test -r $ROOTDIR"/pkg/${pdir}/Makefile" ; then
1844 echo " Making source files in pkg/${pdir} from templates"
1845 ( cd $ROOTDIR"/pkg/"${pdir} && $MAKE ) > make_${pdir}.errors 2>&1
1846 RETVAL=$?
1847 if test "x${RETVAL}" = x0 ; then
1848 rm -f make_${pdir}.errors
1849 else
1850 echo "Error: problem encountered while building source files in pkg/${pdir}:"
1851 cat make_${pdir}.errors 1>&2
1852 exit 1
1853 fi
1854 fi
1855 done
1856
1857 printf "\n=== Determining package settings ===\n"
1858 if test "x${PDEPEND}" = x ; then
1859 tmp=$ROOTDIR"/pkg/pkg_depend"
1860 if test -r $tmp ; then
1861 PDEPEND=$tmp
1862 else
1863 echo "Warning: No package dependency information was specified."
1864 echo " Please check that ROOTDIR/pkg/pkg_depend exists."
1865 fi
1866 else
1867 if test ! -r ${PDEPEND} ; then
1868 echo "Error: can't read package dependency info from PDEPEND=\"$PDEPEND\""
1869 exit 1
1870 fi
1871 fi
1872 echo " getting package dependency info from $PDEPEND"
1873 # Strip the comments and then convert the dependency file into
1874 # two arrays: PNAME, DNAME
1875 cat $PDEPEND | sed -e 's/#.*$//g' \
1876 | $AWK 'BEGIN{nn=-1;} (NF>0){ for(i=2;i<=NF;i++){nn++; print "PNAME_"nn"="$1"\nDNAME_"nn"="$i}} END{print "nname="nn}' \
1877 > ./.pd_tmp
1878 RETVAL=$?
1879 if test ! "x${RETVAL}" = x0 ; then
1880 echo "Error: unable to parse package dependencies -- please check PDEPEND=\"$PDEPEND\""
1881 exit 1
1882 fi
1883 . ./.pd_tmp
1884 rm -f ./.pd_tmp
1885
1886 # Search for default packages. Note that a "$ROOTDIR/pkg/pkg_groups"
1887 # file should eventually be added so that, for convenience, one can
1888 # specify groups of packages using names like "ocean" and "atmosphere".
1889 echo " checking default package list: "
1890 if test "x${PDEFAULT}" = x ; then
1891 for i in "." $MODS ; do
1892 if test -r $i"/packages.conf" ; then
1893 PDEFAULT=$i"/packages.conf"
1894 break
1895 fi
1896 done
1897 fi
1898 if test "x${PDEFAULT}" = x ; then
1899 PDEFAULT="$ROOTDIR/pkg/pkg_default"
1900 fi
1901 if test "x${PDEFAULT}" = xNONE ; then
1902 echo " default packages file disabled"
1903 else
1904 if test ! -r $PDEFAULT ; then
1905 echo "Warning: can't read default packages from PDEFAULT=\"$PDEFAULT\""
1906 else
1907 echo " using PDEFAULT=\"$PDEFAULT\""
1908 # Strip the comments and add all the names
1909 def=`cat $PDEFAULT | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
1910 RETVAL=$?
1911 if test "x${RETVAL}" != x0 ; then
1912 printf "Error: can't parse default package list "
1913 echo "-- please check PDEFAULT=\"$PDEFAULT\""
1914 exit 1
1915 fi
1916 for i in $def ; do
1917 PACKAGES="$PACKAGES $i"
1918 done
1919 echo " before group expansion packages are: $PACKAGES"
1920 RET=1
1921 while test $RET = 1 ; do expand_pkg_groups; RET=$?; done
1922 echo " after group expansion packages are: $PACKAGES"
1923 fi
1924 fi
1925
1926 echo " applying DISABLE settings"
1927 for i in $PACKAGES ; do
1928 echo $i >> ./.tmp_pack
1929 done
1930 for i in `grep "-" ./.tmp_pack` ; do
1931 j=`echo $i | sed 's/[-]//'`
1932 DISABLE="$DISABLE $j"
1933 done
1934 pack=
1935 for p in $PACKAGES ; do
1936 addit="t"
1937 for d in $DISABLE ; do
1938 if test "x$p" = "x$d" ; then
1939 addit="f"
1940 fi
1941 done
1942 if test "x$addit" = xt ; then
1943 pack="$pack $p"
1944 fi
1945 done
1946 PACKAGES="$pack"
1947 echo " applying ENABLE settings"
1948 echo "" > ./.tmp_pack
1949 PACKAGES="$PACKAGES $ENABLE"
1950 # Test if each explicitly referenced package exists
1951 for i in $PACKAGES ; do
1952 j=`echo $i | sed 's/[-+]//'`
1953 if test ! -d "$ROOTDIR/pkg/$j" ; then
1954 echo "Error: can't find package $i at \"$ROOTDIR/pkg/$i\""
1955 exit 1
1956 fi
1957 echo $i >> ./.tmp_pack
1958 done
1959 PACKAGES=
1960 for i in `grep -v "-" ./.tmp_pack | sort | uniq` ; do
1961 PACKAGES="$PACKAGES $i"
1962 done
1963 rm -f ./.tmp_pack
1964 echo " packages are: $PACKAGES"
1965
1966 # Check for package MNC: if NetCDF is available, then build the MNC
1967 # template files ; otherwise, delete mnc from the list of packages.
1968 echo $PACKAGES | grep ' mnc ' > /dev/null 2>&1
1969 RETVAL=$?
1970 if test "x$RETVAL" = x0 ; then
1971 if test "x$HAVE_NETCDF" != xt ; then
1972 cat <<EOF
1973
1974 *********************************************************************
1975 WARNING: the "mnc" package was enabled but tests failed to compile
1976 NetCDF applications. Please check that:
1977
1978 1) NetCDF is correctly installed for this compiler and
1979 2) the LIBS variable (within the "optfile") specifies the correct
1980 NetCDF library to link against.
1981
1982 Due to this failure, the "mnc" package is now DISABLED.
1983 *********************************************************************
1984
1985 EOF
1986 PACKAGES=`echo $PACKAGES | sed -e 's/mnc//g'`
1987 DISABLE="$DISABLE mnc"
1988 else
1989 ( cd $ROOTDIR"/pkg/mnc" && $MAKE testclean && $MAKE templates ) > make_mnc.errors 2>&1
1990 RETVAL=$?
1991 if test "x${RETVAL}" = x0 ; then
1992 rm -f make_mnc.errors
1993 else
1994 echo "Error: problem encountered while building source files in pkg/mnc:"
1995 cat make_mnc.errors 1>&2
1996 exit 1
1997 fi
1998 fi
1999 fi
2000
2001 # Check for package PROFILES: if NetCDF is not available,
2002 # then delete profiles from the list of available packages.
2003 echo $PACKAGES | grep ' profiles ' > /dev/null 2>&1
2004 RETVAL=$?
2005 if test "x$RETVAL" = x0 ; then
2006 if test "x$HAVE_NETCDF" != xt ; then
2007 cat <<EOF
2008
2009 *********************************************************************
2010 WARNING: the "profiles" package was enabled but tests failed to
2011 compile NetCDF applications. Please check that:
2012
2013 1) NetCDF is correctly installed for this compiler and
2014 2) the LIBS variable (within the "optfile") specifies the correct
2015 NetCDF library to link against.
2016
2017 Due to this failure, the "profiles" package is now DISABLED.
2018 *********************************************************************
2019
2020 EOF
2021 PACKAGES=`echo $PACKAGES | sed -e 's/profiles//g'`
2022 DISABLE="$DISABLE profiles"
2023 fi
2024 fi
2025
2026 echo " applying package dependency rules"
2027 ck=
2028 while test "x$ck" != xtt ; do
2029 i=0
2030 # rtot=${#PNAME[@]}
2031 rtot=$nname
2032 while test $i -lt $rtot ; do
2033
2034 # Is $pname in the current $PACKAGES list?
2035 # pname=${PNAME[$i]}
2036 tmp="pname=\"\$PNAME_$i\""
2037 eval $tmp
2038 pin="f"
2039 for p in $PACKAGES ; do
2040 if test "x$p" = "x$pname" ; then
2041 pin="t"
2042 fi
2043 done
2044
2045 # Is the DNAME entry a (+) or (-) rule ?
2046 tmp="dname=\"\$DNAME_$i\""
2047 eval $tmp
2048 plus="-"
2049 echo $dname | grep '^+' > /dev/null 2>&1
2050 RETVAL=$?
2051 if test "x$RETVAL" = x0 ; then
2052 plus="+"
2053 fi
2054
2055 # Is $dname in the current $PACKAGES list?
2056 dname=`echo $dname | sed -e 's/^[+-]//'`
2057 din="f"
2058 for p in $PACKAGES ; do
2059 if test "x$p" = "x$dname" ; then
2060 din="t"
2061 fi
2062 done
2063
2064 # Do we need to add $dname according to the dependency rules?
2065 if test "x$pin" = xt -a "x$plus" = "x+" -a "x$din" = xf ; then
2066 in_dis="f"
2067 for dis in $DISABLE ; do
2068 if test "x$dis" = "x$dname" ; then
2069 in_dis="t"
2070 fi
2071 done
2072 if test "x$in_dis" = xt ; then
2073 echo "Error: can't satisfy package dependencies:"
2074 echo " \"$dname\" is required by the dependency rules"
2075 echo " but is disallowed by the DISABLE settings"
2076 exit 1
2077 else
2078 PACKAGES="$PACKAGES $dname"
2079 ck=
2080 fi
2081 fi
2082
2083 # Do we need to get rid of $dname according to the dependency rules?
2084 if test "x$pin" = xt -a "x$plus" = "x-" -a "x$din" = xt; then
2085 echo "Error: can't satisfy package dependencies:"
2086 echo " \"$pname\" was requested but is disallowed by"
2087 echo " the dependency rules for \"$dname\""
2088 exit 1
2089 fi
2090 i=`echo "$i + 1" | bc -l`
2091 #i=$(( $i + 1 ))
2092 done
2093 ck=$ck"t"
2094 done
2095 echo " packages are: $PACKAGES"
2096 for i in $PACKAGES ; do
2097 adr="$ROOTDIR/pkg/$i"
2098 if test -d $adr ; then
2099 SOURCEDIRS="$SOURCEDIRS $adr"
2100 INCLUDEDIRS="$INCLUDEDIRS $adr"
2101 if test "x$i" = xautodiff ; then
2102 AUTODIFF_PKG_USED=t
2103 fi
2104 else
2105 echo "Error: the directory \"$adr\" for package $i doesn't exist"
2106 exit 1
2107 fi
2108 done
2109
2110 # Create a list of #define and #undef to enable/disable packages
2111 PACKAGES_DOT_H=PACKAGES_CONFIG.h
2112 # The following UGLY HACK sets multiple "#undef"s and it needs to go
2113 # away. On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h
2114 # file would eventually be split up so that all package-related #define
2115 # statements could be separated and handled only by genmake.
2116 names=`ls -1 "$ROOTDIR/pkg"`
2117 all_pack=
2118 DISABLED_PACKAGES=
2119 for n in $names ; do
2120 if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
2121 has_pack="f"
2122 for pack in $PACKAGES ; do
2123 if test "x$pack" = "x$n" ; then
2124 has_pack="t"
2125 break
2126 fi
2127 done
2128 if test "x$has_pack" = xf ; then
2129 undef=`echo "ALLOW_$n" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2130 DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
2131 fi
2132 fi
2133 done
2134 ENABLED_PACKAGES=
2135 for i in $PACKAGES ; do
2136 def=`echo "ALLOW_$i" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2137 ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
2138 #eh3 DEFINES="$DEFINES -D$def"
2139
2140 #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
2141 case $i in
2142 aim_v23)
2143 ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
2144 echo "Warning: ALLOW_AIM is set to enable aim_v23."
2145 ;;
2146 esac
2147 #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
2148
2149 done
2150
2151 echo " Adding STANDARDDIRS"
2152 BUILDDIR=${BUILDDIR:-.}
2153 if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
2154 STANDARDDIRS="eesupp model"
2155 fi
2156 if test "x$STANDARDDIRS" != x ; then
2157 for d in $STANDARDDIRS ; do
2158 adr="$ROOTDIR/$d/src"
2159 if test ! -d $adr ; then
2160 echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2161 echo " is correct and that you correctly specified the STANDARDDIRS option"
2162 exit 1
2163 else
2164 SOURCEDIRS="$SOURCEDIRS $adr"
2165 fi
2166 adr="$ROOTDIR/$d/inc"
2167 if test ! -d $adr ; then
2168 echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2169 echo " is correct and that you correctly specified the STANDARDDIRS option"
2170 exit 1
2171 else
2172 INCLUDEDIRS="$INCLUDEDIRS $adr"
2173 fi
2174 done
2175 fi
2176
2177 echo " Searching for *OPTIONS.h files in order to warn about the presence"
2178 echo " of \"#define \"-type statements that are no longer allowed:"
2179 CPP_OPTIONS=
2180 CPP_EEOPTIONS=
2181 spaths=". $INCLUDEDIRS"
2182 names=`ls -1 "$ROOTDIR/pkg"`
2183 for i in $spaths ; do
2184 try="$i/CPP_OPTIONS.h"
2185 if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
2186 echo " found CPP_OPTIONS=\"$try\""
2187 CPP_OPTIONS="$try"
2188 # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
2189 for n in $names ; do
2190 test_for_package_in_cpp_options $CPP_OPTIONS $n
2191 done
2192 fi
2193 try="$i/CPP_EEOPTIONS.h"
2194 if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
2195 echo " found CPP_EEOPTIONS=\"$try\""
2196 # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
2197 #**** not yet enabled ****
2198 # test_for_mpi_in_cpp_eeoptions $try
2199 #**** not yet enabled ****
2200 CPP_EEOPTIONS="$try"
2201 fi
2202 done
2203 if test "x$CPP_OPTIONS" = x ; then
2204 echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
2205 exit 1
2206 fi
2207
2208 # Here, we build the list of files to be "run through" the adjoint
2209 # compiler.
2210 if test -f ./ad_files ; then
2211 rm -f ./ad_files
2212 fi
2213 echo " Creating the list of files for the adjoint compiler."
2214 for i in $SOURCEDIRS ; do
2215 list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
2216 for j in $list_files ; do
2217 cat $i/$j >> ad_files
2218 done
2219 done
2220 if test ! "x"$FS = "x.f" ; then
2221 cat ad_files | sed -e "s/\.f/.$FS/g" > ad_files_f
2222 mv -f ad_files_f ad_files
2223 fi
2224
2225 echo
2226 echo "=== Creating the Makefile ==="
2227 echo " setting INCLUDES"
2228 for i in $INCLUDEDIRS ; do
2229 if test ! -d $i ; then
2230 echo "Warning: can't find INCLUDEDIRS=\"$i\""
2231 fi
2232 done
2233
2234 if test ! "x$DIVA" = x ; then
2235 echo " Creating the pseudo-MPI include directory"
2236 INCLUDES="-I./mpi_headers $INCLUDES"
2237 rm -rf ./mpi_headers
2238 mkdir -p ./mpi_headers
2239
2240 if test "x$MPIINCLUDEDIR" = x ; then
2241 if test "x$MPIHOME" = x ; then
2242 MPIHOME='/usr'
2243 fi
2244 MPIINCLUDEDIR='$MPIHOME/include'
2245 fi
2246
2247 if test -r $MPIINCLUDEDIR/mpif.h ; then
2248 for i in $MPI_HEADER_FILES; do
2249 cp -p $MPIINCLUDEDIR/$i ./mpi_headers
2250 done
2251
2252 perl -i -pe 's/MPI_DISPLACEMENT_CURRENT=-1_8/MPI_DISPLACEMENT_CURRENT=-1/g' mpi_headers/mpif.h
2253 else
2254 echo " We cannot create a copy of mpif.h!"
2255 # exit -1
2256 fi
2257 fi
2258
2259 echo " Determining the list of source and include files"
2260 rm -rf .links.tmp
2261 mkdir .links.tmp
2262 touch .links.tmp/foo
2263 if test ! -r ".links.tmp/foo" ; then
2264 echo
2265 echo "ERROR : something is wrong with your directory permissions or"
2266 echo " your user file-creation mask (\"umask\") since creating a"
2267 echo " sub-dir, touch-ing a file within it, and then reading it is"
2268 echo " not working. Please try setting your umask to something"
2269 echo " sane such as:"
2270 echo
2271 echo " umask 0002"
2272 echo
2273 echo " and please verify that you have the proper permissions for"
2274 echo " creating sub-directories and then reading files created"
2275 echo " within them."
2276 echo
2277 exit 1
2278 fi
2279 rm -f .links.tmp/foo
2280 echo "# This section creates symbolic links" > srclinks.tmp
2281 echo "" >> srclinks.tmp
2282 printf 'SRCFILES = ' > srclist.inc
2283 printf 'CSRCFILES = ' > csrclist.inc
2284 printf 'F90SRCFILES = ' > f90srclist.inc
2285 printf 'HEADERFILES = ' > hlist.inc
2286 printf 'AD_FLOW_FILES = ' > ad_flow_files.inc
2287 alldirs="$SOURCEDIRS $INCLUDEDIRS ."
2288 for d in $alldirs ; do
2289 deplist=
2290 sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
2291 sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
2292 for sf in $sfiles ; do
2293 if test ! -r ".links.tmp/$sf" ; then
2294 if test -f "$d/$sf" ; then
2295 ignore_f=f
2296 case $d/$sf in
2297 ./$PACKAGES_DOT_H)
2298 ignore_f=t
2299 ;;
2300 ./AD_CONFIG.h)
2301 ignore_f=t
2302 ;;
2303 ./FC_NAMEMANGLE.h)
2304 ignore_f=t
2305 ;;
2306 ./BUILD_INFO.h)
2307 ignore_f=t
2308 ;;
2309 ./EMBEDDED_FILES.h)
2310 ignore_f=t
2311 ;;
2312 *)
2313 # For the local directory *ONLY*,
2314 # ignore all soft-links
2315 if test "x$HAVE_TEST_L" = xt -a "x$d" = x. -a -L $sf ; then
2316 ignore_f=t
2317 else
2318 touch .links.tmp/$sf
2319 deplist="$deplist $sf"
2320 fi
2321 ;;
2322 esac
2323 if test "x$ignore_f" = xf ; then
2324 extn=`echo $sf | $AWK -F. '{print $NF}'`
2325 case $extn in
2326 F)
2327 echo " \\" >> srclist.inc
2328 printf " $sf" >> srclist.inc
2329 ;;
2330 F90)
2331 echo " \\" >> f90srclist.inc
2332 printf " $sf" >> f90srclist.inc
2333 ;;
2334 c)
2335 echo " \\" >> csrclist.inc
2336 printf " $sf" >> csrclist.inc
2337 ;;
2338 h)
2339 echo " \\" >> hlist.inc
2340 printf " $sf" >> hlist.inc
2341 ;;
2342 flow)
2343 echo " \\" >> ad_flow_files.inc
2344 printf " $sf" >> ad_flow_files.inc
2345 ;;
2346 esac
2347 fi
2348 fi
2349 fi
2350 done
2351 if test "x$deplist" != x ; then
2352 echo "" >> srclinks.tmp
2353 echo "# These files are linked from $d" >> srclinks.tmp
2354 echo "$deplist :" >> srclinks.tmp
2355 printf "\t\$(LN) %s/\$@ \$@\n" $d >> srclinks.tmp
2356 fi
2357 done
2358 rm -rf .links.tmp
2359 echo "" >> srclist.inc
2360 echo "" >> csrclist.inc
2361 echo "" >> f90srclist.inc
2362 echo "" >> hlist.inc
2363 echo "" >> ad_flow_files.inc
2364
2365 if test -f $MAKEFILE ; then
2366 mv -f $MAKEFILE "$MAKEFILE.bak"
2367 fi
2368 echo " Writing makefile: $MAKEFILE"
2369 echo "# Multithreaded + multi-processing makefile for:" > $MAKEFILE
2370 echo "# $MACHINE" >> $MAKEFILE
2371 echo "# This makefile was generated automatically on" >> $MAKEFILE
2372 echo "# $THISDATE" >> $MAKEFILE
2373 echo "# by the command:" >> $MAKEFILE
2374 echo "# $0 $G2ARGS" >> $MAKEFILE
2375 echo "# executed by:" >> $MAKEFILE
2376 echo "# ${THISUSER}@${THISHOST}:${THISCWD}" >> $MAKEFILE
2377
2378 EXE_AD=$EXECUTABLE"_ad"
2379 EXE_FTL=$EXECUTABLE"_ftl"
2380 EXE_SVD=$EXECUTABLE"_svd"
2381
2382 cat >>$MAKEFILE <<EOF
2383 #
2384 # OPTFILE="$OPTFILE"
2385 #
2386 # BUILDDIR : Directory where object files are written
2387 # SOURCEDIRS : Directories containing the source (.F) files
2388 # INCLUDEDIRS : Directories containing the header-source (.h) files
2389 # EXEDIR : Directory where executable that is generated is written
2390 # EXECUTABLE : Full path of executable binary
2391 #
2392 # CPP : C-preprocessor command
2393 # INCLUDES : Directories searched for header files
2394 # DEFINES : Macro definitions for CPP
2395 # MAKEDEPEND : Dependency generator
2396 # KPP : Special preprocessor command (specific to platform)
2397 # KFLAGS : Flags for KPP
2398 # FC : Fortran compiler command
2399 # FFLAGS : Configuration/debugging options for FC
2400 # FOPTIM : Optimization options for FC
2401 # LINK : Command for link editor program
2402 # LIBS : Library flags /or/ additional optimization/debugging flags
2403
2404 ROOTDIR = ${ROOTDIR}
2405 BUILDDIR = ${BUILDDIR}
2406 SOURCEDIRS = ${SOURCEDIRS}
2407 INCLUDEDIRS = ${INCLUDEDIRS}
2408 EXEDIR = ${EXEDIR}
2409 EXECUTABLE = \$(EXEDIR)/${EXECUTABLE}
2410 TOOLSDIR = ${TOOLSDIR}
2411
2412 #eh3 new defines for the adjoint work
2413 AUTODIFF = ${ROOTDIR}/pkg/autodiff
2414 EXE_AD = ${EXE_AD}
2415 EXE_FTL = ${EXE_FTL}
2416 EXE_SVD = ${EXE_SVD}
2417
2418 ENABLED_PACKAGES = ${ENABLED_PACKAGES}
2419 DISABLED_PACKAGES = ${DISABLED_PACKAGES}
2420
2421 # These files are created by Makefile
2422 SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h BUILD_INFO.h
2423 EOF
2424
2425 if test "x$EMBED_SRC" = xt ; then
2426 echo "EMBEDDED_FILES = EMBEDDED_FILES.h" >>$MAKEFILE
2427 else
2428 echo "EMBEDDED_FILES = " >>$MAKEFILE
2429 fi
2430
2431 # Note: figure out some way to add Hyades JAM libraries here
2432 cat >>$MAKEFILE <<EOF
2433 # Unix ln (link)
2434 LN = ${LN}
2435 # C preprocessor
2436 CPP = cat \$< | ${S64} | ${CPP}
2437 # Dependency generator
2438 MAKEDEPEND = ${MAKEDEPEND}
2439 # Special preprocessor (KAP on DECs, FPP on Crays)
2440 KPP = ${KPP}
2441 # Fortran compiler
2442 FC = ${FC}
2443 # Fortran compiler
2444 F90C = ${F90C}
2445 # C compiler
2446 CC = ${CC}
2447 # Link editor
2448 LINK = ${LINK} ${LDADD}
2449
2450 # Defines for CPP
2451 DEFINES = ${DEFINES}
2452 # Includes for CPP
2453 INCLUDES = ${INCLUDES}
2454 # Flags for KPP
2455 KFLAGS1 = ${KFLAGS1}
2456 KFLAGS2 = ${KFLAGS2}
2457 # Optim./debug for FC
2458 FFLAGS = ${FFLAGS}
2459 FOPTIM = ${FOPTIM}
2460 # Optim./debug for FC
2461 F90FLAGS = ${F90FLAGS}
2462 F90OPTIM = ${F90OPTIM}
2463 # Flags for CC
2464 CFLAGS = ${CFLAGS}
2465 # Files that should not be optimized
2466 NOOPTFILES = ${NOOPTFILES}
2467 NOOPTFLAGS = ${NOOPTFLAGS}
2468 # Flags and libraries needed for linking
2469 LIBS = ${LIBS}
2470 # Name of the Mekfile
2471 MAKEFILE=${MAKEFILE}
2472
2473 EOF
2474
2475 cat srclist.inc >> $MAKEFILE
2476 cat csrclist.inc >> $MAKEFILE
2477 cat f90srclist.inc >> $MAKEFILE
2478 cat hlist.inc >> $MAKEFILE
2479 cat ad_flow_files.inc >> $MAKEFILE
2480 echo >> $MAKEFILE
2481 echo 'F77FILES = $(SRCFILES:.F=.'$FS')' >> $MAKEFILE
2482 echo 'F90FILES = $(F90SRCFILES:.F90=.'$FS90')' >> $MAKEFILE
2483 echo 'OBJFILES = $(SRCFILES:.F=.o) $(CSRCFILES:.c=.o) $(F90SRCFILES:.F90=.o)' >> $MAKEFILE
2484 echo >> $MAKEFILE
2485 echo '.SUFFIXES:' >> $MAKEFILE
2486 echo '.SUFFIXES: .o .'$FS' .p .F .c .'$FS90' .F90' >> $MAKEFILE
2487 rm -f srclist.inc csrclist.inc hlist.inc flist.tmp clist.tmp f90srclist.inc
2488 rm -f ad_flow_files.inc
2489
2490 cat >>$MAKEFILE <<EOF
2491
2492 all: \$(EXECUTABLE)
2493 \$(EXECUTABLE): \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(OBJFILES) \$(EMBEDDED_FILES)
2494 @echo Creating \$@ ...
2495 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
2496 depend:
2497 @make links
2498 \$(MAKEDEPEND) -o .$FS \$(DEFINES) \$(INCLUDES) \$(SRCFILES)
2499 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
2500 -rm -f makedepend.out
2501
2502 lib: libmitgcmuv.a
2503
2504 libmitgcmuv.a: \$(OBJFILES)
2505 ar rcv libmitgcmuv.a \$(OBJFILES)
2506 ar d libmitgcmuv.a main.o
2507
2508 links: \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(SPECIAL_FILES)
2509
2510 small_f: \$(F77FILES) \$(F90FILES)
2511
2512 output.txt: \$(EXECUTABLE)
2513 @printf 'running ... '
2514 @\$(EXECUTABLE) > \$@
2515
2516 clean:
2517 -rm -rf *.p *.$FS90 *.mod ${RMFILES} work.{pc,pcl} *.template
2518 -rm -rf *.o
2519 -rm -rf *.$FS
2520 Clean:
2521 @make clean
2522 @make cleanlinks
2523 -rm -f \$(SPECIAL_FILES)
2524 -rm -f genmake_state genmake_*optfile genmake_warnings make.log run.log *.bak
2525 CLEAN:
2526 @make Clean
2527 -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
2528 -find \$(EXEDIR) -name "*.data" -exec rm {} \;
2529 -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
2530 -rm -f \$(EXECUTABLE) \$(EXE_AD) *.txt STD* *diagnostics.log datetime
2531 -rm -rf mnc_test_*
2532
2533 #eh3 Makefile: makefile
2534 makefile:
2535 $THIS_SCRIPT $G2ARGS
2536 cleanlinks:
2537 -find . -type l -exec rm {} \;
2538
2539 # Special targets (SPECIAL_FILES) which are create by make
2540 ${PACKAGES_DOT_H}:
2541 @echo Creating \$@ ...
2542 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -bPACKAGES_CONFIG_H "Disabled packages:" \$(DISABLED_PACKAGES) " " "Enabled packages:" \$(ENABLED_PACKAGES) > \$@
2543 AD_CONFIG.h:
2544 @echo Creating \$@ ...
2545 @$BASH\$(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 > \$@
2546 FC_NAMEMANGLE.h:
2547 @echo Creating \$@ ...
2548 echo "$FC_NAMEMANGLE" > \$@
2549
2550 BUILD_INFO.h:
2551 @echo Creating \$@ ...
2552 EOF
2553
2554 test ! "x$THISVER" = x && echo " -echo \"#define THISVER '$THISVER'\" > \$@" >> $MAKEFILE
2555 test ! "x$THISUSER" = x && echo " -echo \"#define THISUSER '$THISUSER'\" >> \$@" >> $MAKEFILE
2556 test ! "x$THISDATE" = x && echo " -echo \"#define THISDATE '$THISDATE'\" >> \$@" >> $MAKEFILE
2557 test ! "x$THISHOST" = x && echo " -echo \"#define THISHOST '$THISHOST'\" >> \$@" >> $MAKEFILE
2558
2559 if test "x$EMBED_SRC" = xt ; then
2560 cat >>$MAKEFILE <<EOF
2561
2562 decode_files.o : EMBEDDED_FILES.h
2563
2564 ## \$(F77FILES)
2565 all_fF.tar.gz : \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(F77FILES) Makefile
2566 @echo Creating \$@ ...
2567 -tar -hcf all_fF.tar \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(F77FILES) Makefile
2568 -rm -f all_fF.tar.gz
2569 -gzip all_fF.tar
2570
2571 EMBEDDED_FILES.h : all_fF.tar.gz
2572 @echo Creating \$@ ...
2573 -\${ROOTDIR}/tools/embed_encode/encode_files EMBEDDED_FILES.h all_fF.tar.gz
2574
2575 EOF
2576 fi
2577
2578 cat >>$MAKEFILE <<EOF
2579
2580 # The normal chain of rules is ( .F - .$FS - .o )
2581
2582 ## This nullifies any default implicit rules concerning these two file types:
2583 ## %.o : %.F
2584
2585 .F.$FS:
2586 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2587 .$FS.o:
2588 \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
2589 .F90.o:
2590 \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
2591 .c.o:
2592 \$(CC) \$(CFLAGS) \$(DEFINES) \$(INCLUDES) -c \$<
2593
2594 # Special exceptions that use the ( .F - .p - .$FS - .o ) rule-chain
2595 .F.p:
2596 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2597 .p.$FS:
2598 \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
2599
2600 #=========================================
2601 #=== Automatic Differentiation Rules ===
2602
2603 TAMC = ${TAMC}
2604 TAF = ${TAF}
2605
2606 TAF_EXTRA = ${TAF_EXTRA}
2607 TAMC_EXTRA = ${TAMC_EXTRA}
2608
2609 EOF
2610
2611 ad_vars="AD_TAMC_FLAGS AD_TAF_FLAGS"
2612 ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF_FLAGS"
2613 ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
2614 for i in $ad_vars ; do
2615 name=$i
2616 t1="t2=\$"`echo "$i"`
2617 eval $t1
2618 printf "%-20s = " $name >> $MAKEFILE
2619 echo "$t2" | sed -e 's| \+| |g' >> $MAKEFILE
2620 done
2621
2622 echo " Add the source list for AD code generation"
2623 echo >> $MAKEFILE
2624 printf "AD_FILES = " >> $MAKEFILE
2625 AD_FILES=`cat ad_files`
2626 for i in $AD_FILES ; do
2627 echo " \\" >> $MAKEFILE
2628 printf " $i" >> $MAKEFILE
2629 done
2630 echo >> $MAKEFILE
2631 rm -f ad_files
2632
2633 cat >>$MAKEFILE <<EOF
2634
2635 # ... AD ...
2636 adall: \$(EXE_AD)
2637 adtaf: ad_taf_output.$FS
2638 adtamc: ad_tamc_output.$FS
2639
2640 ad_input_code.$FS: \$(AD_FILES) \$(HEADERFILES)
2641 @$BASH\$(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
2642 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
2643 -rm -f ad_config.template
2644 @make \$(F77FILES)
2645 @make \$(AD_FLOW_FILES)
2646 cat \$(AD_FLOW_FILES) \$(AD_FILES) > ad_input_code.$FS
2647
2648 ad_taf_output.$FS: ad_input_code.$FS
2649 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2650 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2651
2652 adtafonly:
2653 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2654 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2655
2656 \${EXE_AD}: ad_taf_output.o \$(OBJFILES)
2657 \$(LINK) -o \${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
2658
2659 ad_tamc_output.$FS: ad_input_code.$FS
2660 \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.$FS
2661 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.$FS
2662
2663 ad_tamc: ad_tamc_output.o \$(OBJFILES)
2664 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
2665
2666 adonlyfwd:
2667 patch < \$(TOOLSDIR)/ad_taf_output.f.onlyfwd.diff
2668
2669 adtrick:
2670 patch < \$(TOOLSDIR)/ad_taf_output.f.adtrick.diff
2671
2672 # ... FTL ...
2673 ftlall: ftl_taf
2674 ftltaf: ftl_taf_output.$FS
2675 ftltamc: ftl_tamc_output.$FS
2676
2677 ftl_input_code.$FS: \$(AD_FILES) \$(HEADERFILES)
2678 @$BASH\$(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
2679 cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
2680 -rm -f ftl_config.template
2681 @make \$(F77FILES)
2682 @make \$(AD_FLOW_FILES)
2683 cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.$FS
2684
2685 ftl_taf_output.$FS: ftl_input_code.$FS
2686 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
2687 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
2688
2689 ftltafonly:
2690 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
2691 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
2692
2693 ftl_taf: ftl_taf_output.o \$(OBJFILES)
2694 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
2695
2696 ftl_tamc_output.$FS: ftl_input_code.$FS
2697 \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.$FS
2698 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.$FS
2699
2700 ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
2701 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
2702
2703
2704 # ... SVD ...
2705 svdtaf: ad_taf_output.$FS ftl_taf_output.$FS
2706 @echo "--->>> Only ran TAF to generate SVD code! <<<---"
2707 @echo "--->>> Do make svdall afterwards to compile. <<<---"
2708 svdall: svd_touch svd_taf
2709
2710 svd_taf: \$(OBJFILES)
2711 \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
2712
2713 @echo "--->>> Only COMPILE svd code! <<<---"
2714 @echo "--->>> Assumes you previously <<<---"
2715 @echo "--->>> did make svdtaf <<<---"
2716
2717 svd_touch:
2718 @echo "--->>> Only COMPILE svd code! <<<---"
2719 @echo "--->>> Assumes you previously <<<---"
2720 @echo "--->>> did make svdtaf <<<---"
2721 touch ad_taf_output.$FS ftl_taf_output.$FS
2722 \$(FC) \$(FFLAGS) \$(FOPTIM) -c ad_taf_output.$FS
2723 \$(FC) \$(FFLAGS) \$(FOPTIM) -c ftl_taf_output.$FS
2724 @$BASH\$(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
2725 cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
2726 -rm -f ftl_config.template
2727
2728 #=========================================
2729
2730 EOF
2731
2732 if test "x$EXEHOOK" != x ; then
2733 printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE
2734 fi
2735
2736 echo " Making list of \"exceptions\" that need \".p\" files"
2737 for i in $KPPFILES ; do
2738 base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
2739 RETVAL=$?
2740 if test "x$RETVAL" != x0 ; then
2741 echo "Error: unable to add file \"$i\" to the exceptions list"
2742 fi
2743 echo "$base.$FS: $base.p" >> $MAKEFILE
2744 done
2745
2746 echo " Making list of NOOPTFILES"
2747 for i in $NOOPTFILES ; do
2748 base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
2749 RETVAL=$?
2750 if test "x$RETVAL" != x0 ; then
2751 echo "Error: unable to add file \"$i\" to the exceptions list"
2752 fi
2753 echo "$base.o: $base.$FS" >> $MAKEFILE
2754 printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE
2755 done
2756
2757 echo " Add rules for links"
2758 cat srclinks.tmp >> $MAKEFILE
2759 rm -f srclinks.tmp
2760
2761 echo " Adding makedepend marker"
2762 printf "\n\n# DO NOT DELETE\n" >> $MAKEFILE
2763
2764 printf "\n=== Done ===\n"
2765
2766 # Create special header files
2767 $BASH $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"
2768 if test ! -f $PACKAGES_DOT_H ; then
2769 mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
2770 else
2771 cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H > /dev/null 2>&1
2772 RETVAL=$?
2773 if test "x$RETVAL" = x0 ; then
2774 rm -f $PACKAGES_DOT_H".tmp"
2775 else
2776 mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"
2777 mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
2778 fi
2779 fi
2780 if test ! -f AD_CONFIG.h ; then
2781 $BASH $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
2782 fi
2783
2784
2785 # Write the "state" for future records
2786 if test "x$DUMPSTATE" != xf ; then
2787 printf "" > genmake_state
2788 for i in $gm_state ; do
2789 t1="t2=\$$i"
2790 eval $t1
2791 echo "$i='$t2'" >> genmake_state
2792 done
2793 fi

  ViewVC Help
Powered by ViewVC 1.1.22