/[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.160 - (show annotations) (download)
Wed Jan 31 21:28:10 2007 UTC (17 years, 1 month ago) by ce107
Branch: MAIN
CVS Tags: checkpoint58v_post
Changes since 1.159: +23 -2 lines
Added support for the --devel flag & more support for NetCDF libraries with a
separate Fortran library component.

1 #! /usr/bin/env bash
2 #
3 # $Header: /u/gcmpack/MITgcm/tools/genmake2,v 1.159 2006/12/13 02:24:53 cnh 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. Please see:"
1365 echo
1366 echo " http://mitgcm.org/devel_HOWTO/"
1367 echo
1368 echo " for directions on how to setup and use the new \"genmake2\" input"
1369 echo " files and send an email to MITgcm-support@mitgcm.org if you want help."
1370 echo
1371 fi
1372
1373 # Find the MITgcm ${ROOTDIR}
1374 if test "x${ROOTDIR}" = x ; then
1375 tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1376 if test "x$tmp" = "xbin" -a -d ../model -a -d ../eesupp -a -d ../pkg ; then
1377 ROOTDIR=".."
1378 else
1379 for d in . .. ../.. ../../.. ../../../.. ../../../../.. ; do
1380 if [ -d "$d/model" -a -d "$d/eesupp" -a -d "$d/pkg" ]; then
1381 ROOTDIR=$d
1382 printf "Warning: ROOTDIR was not specified but there appears to be"
1383 echo " a copy of MITgcm at \"$ROOTDIR\" so we'll try it."
1384 break
1385 fi
1386 done
1387 fi
1388 fi
1389 if test "x${ROOTDIR}" = x ; then
1390 echo "Error: Cannot determine ROOTDIR for MITgcm code."
1391 echo " Please specify a ROOTDIR using either an options "
1392 echo " file or a command-line option."
1393 exit 1
1394 fi
1395 if test ! -d ${ROOTDIR} ; then
1396 echo "Error: the specified ROOTDIR (\"$ROOTDIR\") does not exist!"
1397 exit 1
1398 fi
1399
1400 # Find the MITgcm ${THISVER}
1401 if test -f "${ROOTDIR}/doc/tag-index" ; then
1402 THISVER=`grep '^checkpoint' ${ROOTDIR}/doc/tag-index | head -1`
1403 fi
1404
1405 if test "x$MAKEFILE" = x ; then
1406 MAKEFILE="Makefile"
1407 fi
1408
1409 echo " getting OPTFILE information: "
1410 if test "x${OPTFILE}" = x ; then
1411 if test "x$MITGCM_OF" = x ; then
1412 echo "Warning: no OPTFILE specified so we'll look for possible settings"
1413 printf "\n=== Searching for possible settings for OPTFILE ===\n"
1414 find_possible_configs
1415 else
1416 OPTFILE=$MITGCM_OF
1417 fi
1418 fi
1419 if test "x$OPTFILE" != xNONE ; then
1420 if test -f "$OPTFILE" -a -r "$OPTFILE" ; then
1421 echo " using OPTFILE=\"$OPTFILE\""
1422 . "$OPTFILE"
1423 RETVAL=$?
1424 if test "x$RETVAL" != x0 ; then
1425 printf "Error: failed to source OPTFILE \"$OPTFILE\""
1426 echo "--please check that variable syntax is bash-compatible"
1427 exit 1
1428 fi
1429 if test "x$DUMPSTATE" != xf ; then
1430 cp -f $OPTFILE "genmake_optfile"
1431 fi
1432 else
1433 echo "Error: can't read OPTFILE=\"$OPTFILE\""
1434 exit 1
1435 fi
1436 fi
1437
1438 echo " getting AD_OPTFILE information: "
1439 if test "x${AD_OPTFILE}" = x ; then
1440 if test "x$MITGCM_AD_OF" = x ; then
1441 AD_OPTFILE=$ROOTDIR/tools/adjoint_options/adjoint_default
1442 else
1443 AD_OPTFILE=$MITGCM_AD_OF
1444 fi
1445 fi
1446 if test "x${AD_OPTFILE}" != xNONE ; then
1447 if test -f "$AD_OPTFILE" -a -r "$AD_OPTFILE" ; then
1448 echo " using AD_OPTFILE=\"$AD_OPTFILE\""
1449 . "$AD_OPTFILE"
1450 RETVAL=$?
1451 if test "x$RETVAL" != x0 ; then
1452 printf "Error: failed to source AD_OPTFILE \"$AD_OPTFILE\""
1453 echo "--please check that variable syntax is bash-compatible"
1454 exit 1
1455 fi
1456 if test "x$DUMPSTATE" != xf ; then
1457 cp -f $AD_OPTFILE "genmake_ad_optfile"
1458 fi
1459 else
1460 echo "Error: can't read AD_OPTFILE=\"$AD_OPTFILE\""
1461 exit 1
1462 fi
1463 fi
1464
1465 #====================================================================
1466 # Set default values if not set by the optfile
1467 #
1468 # Check that FC, CC, LINK, CPP, S64, LN, and MAKE are defined. If not,
1469 # either set defaults or complain and abort!
1470 if test ! "x$BASH" = x ; then
1471 # add a trailing space so that it works within the Makefile syntax (see below)
1472 BASH="$BASH "
1473 fi
1474 if test "x$FC" = x ; then
1475 cat <<EOF 1>&2
1476
1477 Error: no Fortran compiler: please specify using one of the following:
1478 1) within the options file ("FC=...") as specified by "-of=OPTFILE"
1479 2) the "-fc=XXX" command-line option
1480 3) the "./genmake_local" file
1481 EOF
1482 exit 1
1483 fi
1484 if test "x$CC" = x ; then
1485 CC=cc
1486 # cat <<EOF 1>&2
1487 # Error: no C compiler: please specify using one of the following:
1488 # 1) within the options file ("CC=...") as specified by "-of=OPTFILE"
1489 # 2) the "-cc=XXX" command-line option
1490 # 3) the "./genmake_local" file
1491 # EOF
1492 # exit 1
1493 fi
1494 if test "x$LINK" = x ; then
1495 LINK=$FC
1496 fi
1497 if test "x$MAKE" = x ; then
1498 MAKE="make"
1499 fi
1500 if test "x$CPP" = x ; then
1501 CPP=cpp
1502 fi
1503 #EH3 === UGLY ===
1504 # The following is an ugly little hack to check for $CPP in /lib/ and
1505 # it should eventually be replaced with a more general function that
1506 # searches a combo of the user's path and a list of "usual suspects"
1507 # to find the correct location for binaries such as $CPP.
1508 for i in " " "/lib/" ; do
1509 echo "#define A a" | $i$CPP > test_cpp 2>&1 && CPP=$i$CPP
1510 done
1511 #EH3 === UGLY ===
1512 echo "#define A a" | $CPP > test_cpp 2>&1
1513 RETVAL=$?
1514 if test "x$RETVAL" != x0 ; then
1515 cat <<EOF 1>&2
1516
1517 Error: C pre-processor "$CPP" failed the test case: please specify using:
1518
1519 1) within the options file ("CPP=...") as specified by "-of=OPTFILE"
1520 2) the "./genmake_local" file
1521 3) with the CPP environment variable
1522
1523 EOF
1524 exit 1
1525 else
1526 rm -f test_cpp
1527 fi
1528 look_for_makedepend
1529 if test "x$LN" = x ; then
1530 LN="ln -s"
1531 fi
1532 echo "test" > genmake_test_ln
1533 $LN genmake_test_ln genmake_tlink
1534 RETVAL=$?
1535 if test "x$RETVAL" != x0 ; then
1536 cat <<EOF 1>&2
1537
1538 Error: The command "ln -s" failed -- please specify a working soft-link
1539 command in the optfile.
1540
1541 EOF
1542 exit 1
1543 fi
1544 test -L genmake_tlink > /dev/null 2>&1
1545 RETVAL=$?
1546 if test "x$RETVAL" = x0 ; then
1547 HAVE_TEST_L=t
1548 fi
1549 rm -f genmake_test_ln genmake_tlink
1550
1551 # Check for broken *.F/*.f handling and fix if possible
1552 check_for_broken_Ff
1553
1554 if test ! "x$MPI" = x ; then
1555 echo " Turning on MPI cpp macros"
1556 DEFINES="$DEFINES -DALLOW_USE_MPI -DALWAYS_USE_MPI"
1557 fi
1558
1559 if test ! "x$TS" = x ; then
1560 echo " Turning on timing per timestep"
1561 if test ! "x$FOOLAD" = x ; then
1562 DEFINES="$DEFINES -DTIME_PER_TIMESTEP_SFP"
1563 else
1564 DEFINES="$DEFINES -DTIME_PER_TIMESTEP"
1565 fi
1566 fi
1567 if test ! "x$PAPIS" = x ; then
1568 echo " Turning on PAPI flop summary per timestep"
1569 echo " Please make sure PAPIINC, PAPILIB are defined"
1570 if test ! "x$FOOLAD" = x ; then
1571 DEFINES="$DEFINES -DUSE_PAPI_FLOPS_SFP"
1572 else
1573 DEFINES="$DEFINES -DUSE_PAPI_FLOPS"
1574 fi
1575 INCLUDES="$INCLUDES $PAPIINC"
1576 LIBS="$LIBS $PAPILIB"
1577 fi
1578 if test ! "x$PCLS" = x ; then
1579 echo " Turning on PCL counter summary per timestep"
1580 echo " Please make sure PCLINC, PCLLIB are defined"
1581 if test ! "x$FOOLAD" = x ; then
1582 DEFINES="$DEFINES -DUSE_PCL_FLOPS_SFP"
1583 else
1584 DEFINES="$DEFINES -DUSE_PCL_FLOPS"
1585 fi
1586 INCLUDES="$INCLUDES $PCLINC"
1587 LIBS="$LIBS $PCLLIB"
1588 fi
1589 if test ! "x$PAPI" = x ; then
1590 if test ! "x$PAPIS" = x ; then
1591 echo " PAPI performance analysis and flop summary per timestep cannot co-exist!"
1592 echo " Sticking with PAPI flop summary per timestep!"
1593 else
1594 echo " Turning on performance analysis with PAPI"
1595 echo " Please make sure PAPIINC, PAPILIB are defined"
1596 DEFINES="$DEFINES -DUSE_PAPI"
1597 INCLUDES="$INCLUDES $PAPIINC"
1598 LIBS="$LIBS $PAPILIB"
1599 fi
1600 fi
1601 if test ! "x$PCL" = x ; then
1602 if test ! "x$PCLS" = x ; then
1603 echo " PCL performance analysis and flop summary per timestep cannot co-exist!"
1604 echo " Sticking with PCL flop summary per timestep!"
1605 else
1606 echo " Turning on performance analysis with PCL"
1607 echo " Please make sure PCLINC, PCLLIB are defined"
1608 DEFINES="$DEFINES -DUSE_PCL"
1609 INCLUDES="$INCLUDES $PCLINC"
1610 LIBS="$LIBS $PCLLIB"
1611 fi
1612 fi
1613 if test ! "x$HPMT" = x ; then
1614 if test ! "x$PAPI" = x ; then
1615 echo " PAPI and the HPM Toolkit cannot co-exist!"
1616 echo " Sticking with PAPI!"
1617 else if test ! "x$PCL" = x ; then
1618 echo " PCL and the HPM Toolkit cannot co-exist!"
1619 echo " Sticking with PCL!"
1620 else
1621 echo " Turning on performance analysis with the HPM Toolkit"
1622 echo " Please make sure HPMTINC, HPMTLIB are defined"
1623 DEFINES="$DEFINES -DUSE_LIBHPM"
1624 INCLUDES="$INCLUDES $HPMTINC"
1625 LIBS="$LIBS $HPMTLIB"
1626 fi
1627 fi
1628 fi
1629 if test ! "x$GSL" = x ; then
1630 echo " Turning on use of GSL to control floating point calculations"
1631 echo " Please make sure GSLINC, GSLLIB are defined"
1632 DEFINES="$DEFINES -DUSE_GSL_IEEE"
1633 INCLUDES="$INCLUDES $GSLINC"
1634 LIBS="$LIBS $GSLLIB"
1635 fi
1636
1637 printf "\n=== Checking system libraries ===\n"
1638 printf " Do we have the system() command using $FC... "
1639 cat > genmake_tcomp.$FS <<EOF
1640 program hello
1641 call system('echo hi')
1642 end
1643 EOF
1644 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1645 RETVAL=$?
1646 if test "x$RETVAL" = x0 ; then
1647 HAVE_SYSTEM=t
1648 DEFINES="$DEFINES -DHAVE_SYSTEM"
1649 echo "yes"
1650 else
1651 HAVE_SYSTEM=
1652 echo "no"
1653 fi
1654 rm -f genmake_tcomp*
1655
1656 printf " Do we have the fdate() command using $FC... "
1657 cat > genmake_tcomp.$FS <<EOF
1658 program hello
1659 CHARACTER*(128) string
1660 string = ' '
1661 call fdate( string )
1662 print *, string
1663 end
1664 EOF
1665 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1666 RETVAL=$?
1667 if test "x$RETVAL" = x0 ; then
1668 HAVE_FDATE=t
1669 DEFINES="$DEFINES -DHAVE_FDATE"
1670 echo "yes"
1671 else
1672 HAVE_FDATE=
1673 echo "no"
1674 fi
1675 rm -f genmake_tcomp*
1676
1677 printf " Do we have the etime() command using $FC... "
1678 cat > genmake_tcomp.$FS <<EOF
1679 program hello
1680 REAL*4 ACTUAL, TARRAY(2)
1681 EXTERNAL ETIME
1682 REAL*4 ETIME
1683 actual = etime( tarray )
1684 print *, tarray
1685 end
1686 EOF
1687 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1688 RETVAL=$?
1689 if test "x$RETVAL" = x0 ; then
1690 HAVE_ETIME=t
1691 DEFINES="$DEFINES -DHAVE_ETIME"
1692 echo "yes"
1693 else
1694 HAVE_ETIME=
1695 echo "no"
1696 fi
1697 rm -f genmake_tcomp*
1698
1699 printf " Can we call simple C routines (here, \"cloc()\") using $FC... "
1700 check_HAVE_CLOC
1701 if test "x$HAVE_CLOC" != x ; then
1702 echo "yes"
1703 else
1704 echo "no"
1705 if test "x$EMBED_SRC" = xt ; then
1706 echo " WARNING: you requested file embedding but it has"
1707 echo " been disabled since C code cannot be called"
1708 EMBED_SRC=
1709 fi
1710 fi
1711 rm -f genmake_t*
1712
1713 printf " Can we unlimit the stack size using $FC... "
1714 check_HAVE_SETRLSTK
1715 if test "x$HAVE_SETRLSTK" = xt ; then
1716 echo "yes"
1717 else
1718 echo "no"
1719 fi
1720 rm -f genmake_t*
1721
1722 printf " Can we register a signal handler using $FC... "
1723 check_HAVE_SIGREG
1724 if test "x$HAVE_SIGREG" = xt ; then
1725 echo "yes"
1726 else
1727 echo "no"
1728 fi
1729 rm -f genmake_t*
1730
1731 printf " Can we use stat() through C calls... "
1732 check_HAVE_STAT
1733 if test "x$HAVE_STAT" != x ; then
1734 echo "yes"
1735 else
1736 echo "no"
1737 fi
1738 rm -f genmake_t*
1739
1740 printf " Can we create NetCDF-enabled binaries... "
1741 check_netcdf_libs
1742 if test "x$HAVE_NETCDF" != x ; then
1743 echo "yes"
1744 else
1745 echo "no"
1746 fi
1747 DEFINES="$DEFINES $IGNORE_TIME"
1748
1749 if test "x$EMBED_SRC" = xt ; then
1750 build_embed_encode
1751 fi
1752 if test "x$EMBED_SRC" = xt ; then
1753 ENABLE="$ENABLE embed_files"
1754 fi
1755
1756
1757 printf "\n=== Setting defaults ===\n"
1758 printf " Adding MODS directories: "
1759 for d in $MODS ; do
1760 if test ! -d $d ; then
1761 echo
1762 echo "Error: MODS directory \"$d\" not found!"
1763 exit 1
1764 else
1765 printf " $d"
1766 SOURCEDIRS="$SOURCEDIRS $d"
1767 INCLUDEDIRS="$INCLUDEDIRS $d"
1768 fi
1769 done
1770 echo
1771
1772 if test "x${PLATFORM}" = x ; then
1773 PLATFORM=$p_PLATFORM
1774 fi
1775
1776 if test "x${EXEDIR}" = x ; then
1777 tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1778 if test "x$tmp" = "xbin" -a -d ../exe -a $ROOTDIR = .. ; then
1779 EXEDIR=../exe
1780 else
1781 EXEDIR=.
1782 fi
1783 fi
1784 if test ! -d ${EXEDIR} ; then
1785 echo "Error: the specified EXEDIR (\"$EXEDIR\") does not exist!"
1786 exit 1
1787 fi
1788
1789 if test "x${TOOLSDIR}" = x ; then
1790 TOOLSDIR="$ROOTDIR/tools"
1791 fi
1792 if test ! -d ${TOOLSDIR} ; then
1793 echo "Error: the specified TOOLSDIR (\"$TOOLSDIR\") does not exist!"
1794 exit 1
1795 fi
1796 if test "x$S64" = x ; then
1797 echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.sh > /dev/null 2>&1
1798 RETVAL=$?
1799 if test "x${RETVAL}" = x0 ; then
1800 S64='$(TOOLSDIR)/set64bitConst.sh'
1801 else
1802 echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.csh > /dev/null 2>&1
1803 RETVAL=$?
1804 if test "x${RETVAL}" = x0 ; then
1805 S64='$(TOOLSDIR)/set64bitConst.csh'
1806 else
1807 cat <<EOF
1808
1809 ERROR: neither of the two default scripts:
1810
1811 ${TOOLSDIR}/set64bitConst.sh
1812 ${TOOLSDIR}/set64bitConst.csh
1813
1814 are working so please check paths or specify (with \$S64) a
1815 working version of this script.
1816
1817 EOF
1818 exit 1
1819 fi
1820 fi
1821 fi
1822 THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`
1823
1824 EXECUTABLE=${EXECUTABLE:-mitgcmuv}
1825
1826 # We have a special set of source files in eesupp/src which are
1827 # generated from some template source files. We'll make them first so
1828 # they appear as regular source code
1829 if test -r $ROOTDIR"/eesupp/src/Makefile" ; then
1830 echo " Making source files in eesupp from templates"
1831 ( cd $ROOTDIR"/eesupp/src/" && $MAKE ) > make_eesupp.errors 2>&1
1832 RETVAL=$?
1833 if test "x${RETVAL}" = x0 ; then
1834 rm -f make_eesupp.errors
1835 else
1836 echo "Error: problem encountered while building source files in eesupp:"
1837 cat make_eesupp.errors 1>&2
1838 exit 1
1839 fi
1840 fi
1841
1842 #same for pkg/exch2 and pkg/regrid
1843 for pdir in exch2 regrid ; do
1844 if test -r $ROOTDIR"/pkg/${pdir}/Makefile" ; then
1845 echo " Making source files in pkg/${pdir} from templates"
1846 ( cd $ROOTDIR"/pkg/"${pdir} && $MAKE ) > make_${pdir}.errors 2>&1
1847 RETVAL=$?
1848 if test "x${RETVAL}" = x0 ; then
1849 rm -f make_${pdir}.errors
1850 else
1851 echo "Error: problem encountered while building source files in pkg/${pdir}:"
1852 cat make_${pdir}.errors 1>&2
1853 exit 1
1854 fi
1855 fi
1856 done
1857
1858 printf "\n=== Determining package settings ===\n"
1859 if test "x${PDEPEND}" = x ; then
1860 tmp=$ROOTDIR"/pkg/pkg_depend"
1861 if test -r $tmp ; then
1862 PDEPEND=$tmp
1863 else
1864 echo "Warning: No package dependency information was specified."
1865 echo " Please check that ROOTDIR/pkg/pkg_depend exists."
1866 fi
1867 else
1868 if test ! -r ${PDEPEND} ; then
1869 echo "Error: can't read package dependency info from PDEPEND=\"$PDEPEND\""
1870 exit 1
1871 fi
1872 fi
1873 echo " getting package dependency info from $PDEPEND"
1874 # Strip the comments and then convert the dependency file into
1875 # two arrays: PNAME, DNAME
1876 cat $PDEPEND | sed -e 's/#.*$//g' \
1877 | $AWK 'BEGIN{nn=-1;} (NF>0){ for(i=2;i<=NF;i++){nn++; print "PNAME_"nn"="$1"\nDNAME_"nn"="$i}} END{print "nname="nn}' \
1878 > ./.pd_tmp
1879 RETVAL=$?
1880 if test ! "x${RETVAL}" = x0 ; then
1881 echo "Error: unable to parse package dependencies -- please check PDEPEND=\"$PDEPEND\""
1882 exit 1
1883 fi
1884 . ./.pd_tmp
1885 rm -f ./.pd_tmp
1886
1887 # Search for default packages. Note that a "$ROOTDIR/pkg/pkg_groups"
1888 # file should eventually be added so that, for convenience, one can
1889 # specify groups of packages using names like "ocean" and "atmosphere".
1890 echo " checking default package list: "
1891 if test "x${PDEFAULT}" = x ; then
1892 for i in "." $MODS ; do
1893 if test -r $i"/packages.conf" ; then
1894 PDEFAULT=$i"/packages.conf"
1895 break
1896 fi
1897 done
1898 fi
1899 if test "x${PDEFAULT}" = x ; then
1900 PDEFAULT="$ROOTDIR/pkg/pkg_default"
1901 fi
1902 if test "x${PDEFAULT}" = xNONE ; then
1903 echo " default packages file disabled"
1904 else
1905 if test ! -r $PDEFAULT ; then
1906 echo "Warning: can't read default packages from PDEFAULT=\"$PDEFAULT\""
1907 else
1908 echo " using PDEFAULT=\"$PDEFAULT\""
1909 # Strip the comments and add all the names
1910 def=`cat $PDEFAULT | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
1911 RETVAL=$?
1912 if test "x${RETVAL}" != x0 ; then
1913 printf "Error: can't parse default package list "
1914 echo "-- please check PDEFAULT=\"$PDEFAULT\""
1915 exit 1
1916 fi
1917 for i in $def ; do
1918 PACKAGES="$PACKAGES $i"
1919 done
1920 echo " before group expansion packages are: $PACKAGES"
1921 RET=1
1922 while test $RET = 1 ; do expand_pkg_groups; RET=$?; done
1923 echo " after group expansion packages are: $PACKAGES"
1924 fi
1925 fi
1926
1927 echo " applying DISABLE settings"
1928 for i in $PACKAGES ; do
1929 echo $i >> ./.tmp_pack
1930 done
1931 for i in `grep "-" ./.tmp_pack` ; do
1932 j=`echo $i | sed 's/[-]//'`
1933 DISABLE="$DISABLE $j"
1934 done
1935 pack=
1936 for p in $PACKAGES ; do
1937 addit="t"
1938 for d in $DISABLE ; do
1939 if test "x$p" = "x$d" ; then
1940 addit="f"
1941 fi
1942 done
1943 if test "x$addit" = xt ; then
1944 pack="$pack $p"
1945 fi
1946 done
1947 PACKAGES="$pack"
1948 echo " applying ENABLE settings"
1949 echo "" > ./.tmp_pack
1950 PACKAGES="$PACKAGES $ENABLE"
1951 # Test if each explicitly referenced package exists
1952 for i in $PACKAGES ; do
1953 j=`echo $i | sed 's/[-+]//'`
1954 if test ! -d "$ROOTDIR/pkg/$j" ; then
1955 echo "Error: can't find package $i at \"$ROOTDIR/pkg/$i\""
1956 exit 1
1957 fi
1958 echo $i >> ./.tmp_pack
1959 done
1960 PACKAGES=
1961 for i in `grep -v "-" ./.tmp_pack | sort | uniq` ; do
1962 PACKAGES="$PACKAGES $i"
1963 done
1964 rm -f ./.tmp_pack
1965 echo " packages are: $PACKAGES"
1966
1967 # Check availability of NetCDF and then either build the MNC template
1968 # files or delete mnc from the list of available packages.
1969 echo $PACKAGES | grep ' mnc ' > /dev/null 2>&1
1970 RETVAL=$?
1971 if test "x$RETVAL" = x0 ; then
1972 if test "x$HAVE_NETCDF" != xt ; then
1973 cat <<EOF
1974
1975 *********************************************************************
1976 WARNING: the "mnc" package was enabled but tests failed to compile
1977 NetCDF applications. Please check that:
1978
1979 1) NetCDF is correctly installed for this compiler and
1980 2) the LIBS variable (within the "optfile") specifies the correct
1981 NetCDF library to link against.
1982
1983 Due to this failure, the "mnc" package is now DISABLED.
1984 *********************************************************************
1985
1986 EOF
1987 PACKAGES=`echo $PACKAGES | sed -e 's/mnc//g'`
1988 DISABLE="$DISABLE mnc"
1989 else
1990 ( cd $ROOTDIR"/pkg/mnc" && $MAKE testclean && $MAKE templates ) > make_mnc.errors 2>&1
1991 RETVAL=$?
1992 if test "x${RETVAL}" = x0 ; then
1993 rm -f make_mnc.errors
1994 else
1995 echo "Error: problem encountered while building source files in pkg/mnc:"
1996 cat make_mnc.errors 1>&2
1997 exit 1
1998 fi
1999 fi
2000 fi
2001
2002 echo " applying package dependency rules"
2003 ck=
2004 while test "x$ck" != xtt ; do
2005 i=0
2006 # rtot=${#PNAME[@]}
2007 rtot=$nname
2008 while test $i -lt $rtot ; do
2009
2010 # Is $pname in the current $PACKAGES list?
2011 # pname=${PNAME[$i]}
2012 tmp="pname=\"\$PNAME_$i\""
2013 eval $tmp
2014 pin="f"
2015 for p in $PACKAGES ; do
2016 if test "x$p" = "x$pname" ; then
2017 pin="t"
2018 fi
2019 done
2020
2021 # Is the DNAME entry a (+) or (-) rule ?
2022 tmp="dname=\"\$DNAME_$i\""
2023 eval $tmp
2024 plus="-"
2025 echo $dname | grep '^+' > /dev/null 2>&1
2026 RETVAL=$?
2027 if test "x$RETVAL" = x0 ; then
2028 plus="+"
2029 fi
2030
2031 # Is $dname in the current $PACKAGES list?
2032 dname=`echo $dname | sed -e 's/^[+-]//'`
2033 din="f"
2034 for p in $PACKAGES ; do
2035 if test "x$p" = "x$dname" ; then
2036 din="t"
2037 fi
2038 done
2039
2040 # Do we need to add $dname according to the dependency rules?
2041 if test "x$pin" = xt -a "x$plus" = "x+" -a "x$din" = xf ; then
2042 in_dis="f"
2043 for dis in $DISABLE ; do
2044 if test "x$dis" = "x$dname" ; then
2045 in_dis="t"
2046 fi
2047 done
2048 if test "x$in_dis" = xt ; then
2049 echo "Error: can't satisfy package dependencies:"
2050 echo " \"$dname\" is required by the dependency rules"
2051 echo " but is disallowed by the DISABLE settings"
2052 exit 1
2053 else
2054 PACKAGES="$PACKAGES $dname"
2055 ck=
2056 fi
2057 fi
2058
2059 # Do we need to get rid of $dname according to the dependency rules?
2060 if test "x$pin" = xt -a "x$plus" = "x-" -a "x$din" = xt; then
2061 echo "Error: can't satisfy package dependencies:"
2062 echo " \"$pname\" was requested but is disallowed by"
2063 echo " the dependency rules for \"$dname\""
2064 exit 1
2065 fi
2066 i=`echo "$i + 1" | bc -l`
2067 #i=$(( $i + 1 ))
2068 done
2069 ck=$ck"t"
2070 done
2071 echo " packages are: $PACKAGES"
2072 for i in $PACKAGES ; do
2073 adr="$ROOTDIR/pkg/$i"
2074 if test -d $adr ; then
2075 SOURCEDIRS="$SOURCEDIRS $adr"
2076 INCLUDEDIRS="$INCLUDEDIRS $adr"
2077 if test "x$i" = xautodiff ; then
2078 AUTODIFF_PKG_USED=t
2079 fi
2080 else
2081 echo "Error: the directory \"$adr\" for package $i doesn't exist"
2082 exit 1
2083 fi
2084 done
2085
2086 # Create a list of #define and #undef to enable/disable packages
2087 PACKAGES_DOT_H=PACKAGES_CONFIG.h
2088 # The following UGLY HACK sets multiple "#undef"s and it needs to go
2089 # away. On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h
2090 # file would eventually be split up so that all package-related #define
2091 # statements could be separated and handled only by genmake.
2092 names=`ls -1 "$ROOTDIR/pkg"`
2093 all_pack=
2094 DISABLED_PACKAGES=
2095 for n in $names ; do
2096 if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
2097 has_pack="f"
2098 for pack in $PACKAGES ; do
2099 if test "x$pack" = "x$n" ; then
2100 has_pack="t"
2101 break
2102 fi
2103 done
2104 if test "x$has_pack" = xf ; then
2105 undef=`echo "ALLOW_$n" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2106 DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
2107 fi
2108 fi
2109 done
2110 ENABLED_PACKAGES=
2111 for i in $PACKAGES ; do
2112 def=`echo "ALLOW_$i" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2113 ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
2114 #eh3 DEFINES="$DEFINES -D$def"
2115
2116 #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
2117 case $i in
2118 aim_v23)
2119 ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
2120 echo "Warning: ALLOW_AIM is set to enable aim_v23."
2121 ;;
2122 esac
2123 #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
2124
2125 done
2126
2127 echo " Adding STANDARDDIRS"
2128 BUILDDIR=${BUILDDIR:-.}
2129 if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
2130 STANDARDDIRS="eesupp model"
2131 fi
2132 if test "x$STANDARDDIRS" != x ; then
2133 for d in $STANDARDDIRS ; do
2134 adr="$ROOTDIR/$d/src"
2135 if test ! -d $adr ; then
2136 echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2137 echo " is correct and that you correctly specified the STANDARDDIRS option"
2138 exit 1
2139 else
2140 SOURCEDIRS="$SOURCEDIRS $adr"
2141 fi
2142 adr="$ROOTDIR/$d/inc"
2143 if test ! -d $adr ; then
2144 echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2145 echo " is correct and that you correctly specified the STANDARDDIRS option"
2146 exit 1
2147 else
2148 INCLUDEDIRS="$INCLUDEDIRS $adr"
2149 fi
2150 done
2151 fi
2152
2153 echo " Searching for *OPTIONS.h files in order to warn about the presence"
2154 echo " of \"#define \"-type statements that are no longer allowed:"
2155 CPP_OPTIONS=
2156 CPP_EEOPTIONS=
2157 spaths=". $INCLUDEDIRS"
2158 names=`ls -1 "$ROOTDIR/pkg"`
2159 for i in $spaths ; do
2160 try="$i/CPP_OPTIONS.h"
2161 if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
2162 echo " found CPP_OPTIONS=\"$try\""
2163 CPP_OPTIONS="$try"
2164 # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
2165 for n in $names ; do
2166 test_for_package_in_cpp_options $CPP_OPTIONS $n
2167 done
2168 fi
2169 try="$i/CPP_EEOPTIONS.h"
2170 if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
2171 echo " found CPP_EEOPTIONS=\"$try\""
2172 # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
2173 #**** not yet enabled ****
2174 # test_for_mpi_in_cpp_eeoptions $try
2175 #**** not yet enabled ****
2176 CPP_EEOPTIONS="$try"
2177 fi
2178 done
2179 if test "x$CPP_OPTIONS" = x ; then
2180 echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
2181 exit 1
2182 fi
2183
2184 # Here, we build the list of files to be "run through" the adjoint
2185 # compiler.
2186 if test -f ./ad_files ; then
2187 rm -f ./ad_files
2188 fi
2189 echo " Creating the list of files for the adjoint compiler."
2190 for i in $SOURCEDIRS ; do
2191 list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
2192 for j in $list_files ; do
2193 cat $i/$j >> ad_files
2194 done
2195 done
2196 if test ! "x"$FS = "x.f" ; then
2197 cat ad_files | sed -e "s/\.f/.$FS/g" > ad_files_f
2198 mv -f ad_files_f ad_files
2199 fi
2200
2201 echo
2202 echo "=== Creating the Makefile ==="
2203 echo " setting INCLUDES"
2204 for i in $INCLUDEDIRS ; do
2205 if test ! -d $i ; then
2206 echo "Warning: can't find INCLUDEDIRS=\"$i\""
2207 fi
2208 done
2209
2210 if test ! "x$DIVA" = x ; then
2211 echo " Creating the pseudo-MPI include directory"
2212 INCLUDES="-I./mpi_headers $INCLUDES"
2213 rm -rf ./mpi_headers
2214 mkdir -p ./mpi_headers
2215
2216 if test "x$MPIINCLUDEDIR" = x ; then
2217 if test "x$MPIHOME" = x ; then
2218 MPIHOME='/usr'
2219 fi
2220 MPIINCLUDEDIR='$MPIHOME/include'
2221 fi
2222
2223 if test -r $MPIINCLUDEDIR/mpif.h ; then
2224 for i in $MPI_HEADER_FILES; do
2225 cp -p $MPIINCLUDEDIR/$i ./mpi_headers
2226 done
2227
2228 perl -i -pe 's/MPI_DISPLACEMENT_CURRENT=-1_8/MPI_DISPLACEMENT_CURRENT=-1/g' mpi_headers/mpif.h
2229 else
2230 echo " We cannot create a copy of mpif.h!"
2231 # exit -1
2232 fi
2233 fi
2234
2235 echo " Determining the list of source and include files"
2236 rm -rf .links.tmp
2237 mkdir .links.tmp
2238 touch .links.tmp/foo
2239 if test ! -r ".links.tmp/foo" ; then
2240 echo
2241 echo "ERROR : something is wrong with your directory permissions or"
2242 echo " your user file-creation mask (\"umask\") since creating a"
2243 echo " sub-dir, touch-ing a file within it, and then reading it is"
2244 echo " not working. Please try setting your umask to something"
2245 echo " sane such as:"
2246 echo
2247 echo " umask 0002"
2248 echo
2249 echo " and please verify that you have the proper permissions for"
2250 echo " creating sub-directories and then reading files created"
2251 echo " within them."
2252 echo
2253 exit 1
2254 fi
2255 rm -f .links.tmp/foo
2256 echo "# This section creates symbolic links" > srclinks.tmp
2257 echo "" >> srclinks.tmp
2258 printf 'SRCFILES = ' > srclist.inc
2259 printf 'CSRCFILES = ' > csrclist.inc
2260 printf 'F90SRCFILES = ' > f90srclist.inc
2261 printf 'HEADERFILES = ' > hlist.inc
2262 printf 'AD_FLOW_FILES = ' > ad_flow_files.inc
2263 alldirs="$SOURCEDIRS $INCLUDEDIRS ."
2264 for d in $alldirs ; do
2265 deplist=
2266 sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
2267 sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
2268 for sf in $sfiles ; do
2269 if test ! -r ".links.tmp/$sf" ; then
2270 if test -f "$d/$sf" ; then
2271 ignore_f=f
2272 case $d/$sf in
2273 ./$PACKAGES_DOT_H)
2274 ignore_f=t
2275 ;;
2276 ./AD_CONFIG.h)
2277 ignore_f=t
2278 ;;
2279 ./FC_NAMEMANGLE.h)
2280 ignore_f=t
2281 ;;
2282 ./BUILD_INFO.h)
2283 ignore_f=t
2284 ;;
2285 ./EMBEDDED_FILES.h)
2286 ignore_f=t
2287 ;;
2288 *)
2289 # For the local directory *ONLY*,
2290 # ignore all soft-links
2291 if test "x$HAVE_TEST_L" = xt -a "x$d" = x. -a -L $sf ; then
2292 ignore_f=t
2293 else
2294 touch .links.tmp/$sf
2295 deplist="$deplist $sf"
2296 fi
2297 ;;
2298 esac
2299 if test "x$ignore_f" = xf ; then
2300 extn=`echo $sf | $AWK -F. '{print $NF}'`
2301 case $extn in
2302 F)
2303 echo " \\" >> srclist.inc
2304 printf " $sf" >> srclist.inc
2305 ;;
2306 F90)
2307 echo " \\" >> f90srclist.inc
2308 printf " $sf" >> f90srclist.inc
2309 ;;
2310 c)
2311 echo " \\" >> csrclist.inc
2312 printf " $sf" >> csrclist.inc
2313 ;;
2314 h)
2315 echo " \\" >> hlist.inc
2316 printf " $sf" >> hlist.inc
2317 ;;
2318 flow)
2319 echo " \\" >> ad_flow_files.inc
2320 printf " $sf" >> ad_flow_files.inc
2321 ;;
2322 esac
2323 fi
2324 fi
2325 fi
2326 done
2327 if test "x$deplist" != x ; then
2328 echo "" >> srclinks.tmp
2329 echo "# These files are linked from $d" >> srclinks.tmp
2330 echo "$deplist :" >> srclinks.tmp
2331 printf "\t\$(LN) %s/\$@ \$@\n" $d >> srclinks.tmp
2332 fi
2333 done
2334 rm -rf .links.tmp
2335 echo "" >> srclist.inc
2336 echo "" >> csrclist.inc
2337 echo "" >> f90srclist.inc
2338 echo "" >> hlist.inc
2339 echo "" >> ad_flow_files.inc
2340
2341 if test -f $MAKEFILE ; then
2342 mv -f $MAKEFILE "$MAKEFILE.bak"
2343 fi
2344 echo " Writing makefile: $MAKEFILE"
2345 echo "# Multithreaded + multi-processing makefile for:" > $MAKEFILE
2346 echo "# $MACHINE" >> $MAKEFILE
2347 echo "# This makefile was generated automatically on" >> $MAKEFILE
2348 echo "# $THISDATE" >> $MAKEFILE
2349 echo "# by the command:" >> $MAKEFILE
2350 echo "# $0 $G2ARGS" >> $MAKEFILE
2351 echo "# executed by:" >> $MAKEFILE
2352 echo "# ${THISUSER}@${THISHOST}:${THISCWD}" >> $MAKEFILE
2353
2354 EXE_AD=$EXECUTABLE"_ad"
2355 EXE_FTL=$EXECUTABLE"_ftl"
2356 EXE_SVD=$EXECUTABLE"_svd"
2357
2358 cat >>$MAKEFILE <<EOF
2359 #
2360 # OPTFILE="$OPTFILE"
2361 #
2362 # BUILDDIR : Directory where object files are written
2363 # SOURCEDIRS : Directories containing the source (.F) files
2364 # INCLUDEDIRS : Directories containing the header-source (.h) files
2365 # EXEDIR : Directory where executable that is generated is written
2366 # EXECUTABLE : Full path of executable binary
2367 #
2368 # CPP : C-preprocessor command
2369 # INCLUDES : Directories searched for header files
2370 # DEFINES : Macro definitions for CPP
2371 # MAKEDEPEND : Dependency generator
2372 # KPP : Special preprocessor command (specific to platform)
2373 # KFLAGS : Flags for KPP
2374 # FC : Fortran compiler command
2375 # FFLAGS : Configuration/debugging options for FC
2376 # FOPTIM : Optimization options for FC
2377 # LINK : Command for link editor program
2378 # LIBS : Library flags /or/ additional optimization/debugging flags
2379
2380 ROOTDIR = ${ROOTDIR}
2381 BUILDDIR = ${BUILDDIR}
2382 SOURCEDIRS = ${SOURCEDIRS}
2383 INCLUDEDIRS = ${INCLUDEDIRS}
2384 EXEDIR = ${EXEDIR}
2385 EXECUTABLE = \$(EXEDIR)/${EXECUTABLE}
2386 TOOLSDIR = ${TOOLSDIR}
2387
2388 #eh3 new defines for the adjoint work
2389 AUTODIFF = ${ROOTDIR}/pkg/autodiff
2390 EXE_AD = ${EXE_AD}
2391 EXE_FTL = ${EXE_FTL}
2392 EXE_SVD = ${EXE_SVD}
2393
2394 ENABLED_PACKAGES = ${ENABLED_PACKAGES}
2395 DISABLED_PACKAGES = ${DISABLED_PACKAGES}
2396
2397 # These files are created by Makefile
2398 SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h BUILD_INFO.h
2399 EOF
2400
2401 if test "x$EMBED_SRC" = xt ; then
2402 echo "EMBEDDED_FILES = EMBEDDED_FILES.h" >>$MAKEFILE
2403 else
2404 echo "EMBEDDED_FILES = " >>$MAKEFILE
2405 fi
2406
2407 # Note: figure out some way to add Hyades JAM libraries here
2408 cat >>$MAKEFILE <<EOF
2409 # Unix ln (link)
2410 LN = ${LN}
2411 # C preprocessor
2412 CPP = cat \$< | ${S64} | ${CPP}
2413 # Dependency generator
2414 MAKEDEPEND = ${MAKEDEPEND}
2415 # Special preprocessor (KAP on DECs, FPP on Crays)
2416 KPP = ${KPP}
2417 # Fortran compiler
2418 FC = ${FC}
2419 # Fortran compiler
2420 F90C = ${F90C}
2421 # C compiler
2422 CC = ${CC}
2423 # Link editor
2424 LINK = ${LINK} ${LDADD}
2425
2426 # Defines for CPP
2427 DEFINES = ${DEFINES}
2428 # Includes for CPP
2429 INCLUDES = ${INCLUDES}
2430 # Flags for KPP
2431 KFLAGS1 = ${KFLAGS1}
2432 KFLAGS2 = ${KFLAGS2}
2433 # Optim./debug for FC
2434 FFLAGS = ${FFLAGS}
2435 FOPTIM = ${FOPTIM}
2436 # Optim./debug for FC
2437 F90FLAGS = ${F90FLAGS}
2438 F90OPTIM = ${F90OPTIM}
2439 # Flags for CC
2440 CFLAGS = ${CFLAGS}
2441 # Files that should not be optimized
2442 NOOPTFILES = ${NOOPTFILES}
2443 NOOPTFLAGS = ${NOOPTFLAGS}
2444 # Flags and libraries needed for linking
2445 LIBS = ${LIBS}
2446 # Name of the Mekfile
2447 MAKEFILE=${MAKEFILE}
2448
2449 EOF
2450
2451 cat srclist.inc >> $MAKEFILE
2452 cat csrclist.inc >> $MAKEFILE
2453 cat f90srclist.inc >> $MAKEFILE
2454 cat hlist.inc >> $MAKEFILE
2455 cat ad_flow_files.inc >> $MAKEFILE
2456 echo >> $MAKEFILE
2457 echo 'F77FILES = $(SRCFILES:.F=.'$FS')' >> $MAKEFILE
2458 echo 'F90FILES = $(F90SRCFILES:.F90=.'$FS90')' >> $MAKEFILE
2459 echo 'OBJFILES = $(SRCFILES:.F=.o) $(CSRCFILES:.c=.o) $(F90SRCFILES:.F90=.o)' >> $MAKEFILE
2460 echo >> $MAKEFILE
2461 echo '.SUFFIXES:' >> $MAKEFILE
2462 echo '.SUFFIXES: .o .'$FS' .p .F .c .'$FS90' .F90' >> $MAKEFILE
2463 rm -f srclist.inc csrclist.inc hlist.inc flist.tmp clist.tmp f90srclist.inc
2464 rm -f ad_flow_files.inc
2465
2466 cat >>$MAKEFILE <<EOF
2467
2468 all: \$(EXECUTABLE)
2469 \$(EXECUTABLE): \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(OBJFILES) \$(EMBEDDED_FILES)
2470 @echo Creating \$@ ...
2471 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
2472 depend:
2473 @make links
2474 \$(MAKEDEPEND) -o .$FS \$(DEFINES) \$(INCLUDES) \$(SRCFILES)
2475 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
2476 -rm -f makedepend.out
2477
2478 lib: libmitgcmuv.a
2479
2480 libmitgcmuv.a: \$(OBJFILES)
2481 ar rcv libmitgcmuv.a \$(OBJFILES)
2482 ar d libmitgcmuv.a main.o
2483
2484 links: \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(SPECIAL_FILES)
2485
2486 small_f: \$(F77FILES) \$(F90FILES)
2487
2488 output.txt: \$(EXECUTABLE)
2489 @printf 'running ... '
2490 @\$(EXECUTABLE) > \$@
2491
2492 clean:
2493 -rm -rf *.p *.$FS90 *.mod ${RMFILES} work.{pc,pcl} *.template
2494 -rm -rf *.o
2495 -rm -rf *.$FS
2496 Clean:
2497 @make clean
2498 @make cleanlinks
2499 -rm -f \$(SPECIAL_FILES)
2500 -rm -f genmake_state genmake_*optfile genmake_warnings make.log run.log *.bak
2501 CLEAN:
2502 @make Clean
2503 -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
2504 -find \$(EXEDIR) -name "*.data" -exec rm {} \;
2505 -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
2506 -rm -f \$(EXECUTABLE) \$(EXE_AD) *.txt STD* *diagnostics.log datetime
2507 -rm -rf mnc_test_*
2508
2509 #eh3 Makefile: makefile
2510 makefile:
2511 $THIS_SCRIPT $G2ARGS
2512 cleanlinks:
2513 -find . -type l -exec rm {} \;
2514
2515 # Special targets (SPECIAL_FILES) which are create by make
2516 ${PACKAGES_DOT_H}:
2517 @echo Creating \$@ ...
2518 @$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) > \$@
2519 AD_CONFIG.h:
2520 @echo Creating \$@ ...
2521 @$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 > \$@
2522 FC_NAMEMANGLE.h:
2523 @echo Creating \$@ ...
2524 echo "$FC_NAMEMANGLE" > \$@
2525
2526 BUILD_INFO.h:
2527 @echo Creating \$@ ...
2528 EOF
2529
2530 test ! "x$THISVER" = x && echo " -echo \"#define THISVER '$THISVER'\" > \$@" >> $MAKEFILE
2531 test ! "x$THISUSER" = x && echo " -echo \"#define THISUSER '$THISUSER'\" >> \$@" >> $MAKEFILE
2532 test ! "x$THISDATE" = x && echo " -echo \"#define THISDATE '$THISDATE'\" >> \$@" >> $MAKEFILE
2533 test ! "x$THISHOST" = x && echo " -echo \"#define THISHOST '$THISHOST'\" >> \$@" >> $MAKEFILE
2534
2535 if test "x$EMBED_SRC" = xt ; then
2536 cat >>$MAKEFILE <<EOF
2537
2538 decode_files.o : EMBEDDED_FILES.h
2539
2540 ## \$(F77FILES)
2541 all_fF.tar.gz : \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(F77FILES) Makefile
2542 @echo Creating \$@ ...
2543 -tar -hcf all_fF.tar \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(F77FILES) Makefile
2544 -rm -f all_fF.tar.gz
2545 -gzip all_fF.tar
2546
2547 EMBEDDED_FILES.h : all_fF.tar.gz
2548 @echo Creating \$@ ...
2549 -\${ROOTDIR}/tools/embed_encode/encode_files EMBEDDED_FILES.h all_fF.tar.gz
2550
2551 EOF
2552 fi
2553
2554 cat >>$MAKEFILE <<EOF
2555
2556 # The normal chain of rules is ( .F - .$FS - .o )
2557
2558 ## This nullifies any default implicit rules concerning these two file types:
2559 ## %.o : %.F
2560
2561 .F.$FS:
2562 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2563 .$FS.o:
2564 \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
2565 .F90.o:
2566 \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
2567 .c.o:
2568 \$(CC) \$(CFLAGS) \$(DEFINES) \$(INCLUDES) -c \$<
2569
2570 # Special exceptions that use the ( .F - .p - .$FS - .o ) rule-chain
2571 .F.p:
2572 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2573 .p.$FS:
2574 \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
2575
2576 #=========================================
2577 #=== Automatic Differentiation Rules ===
2578
2579 TAMC = ${TAMC}
2580 TAF = ${TAF}
2581
2582 TAF_EXTRA = ${TAF_EXTRA}
2583 TAMC_EXTRA = ${TAMC_EXTRA}
2584
2585 EOF
2586
2587 ad_vars="AD_TAMC_FLAGS AD_TAF_FLAGS"
2588 ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF_FLAGS"
2589 ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
2590 for i in $ad_vars ; do
2591 name=$i
2592 t1="t2=\$"`echo "$i"`
2593 eval $t1
2594 printf "%-20s = " $name >> $MAKEFILE
2595 echo "$t2" | sed -e 's| \+| |g' >> $MAKEFILE
2596 done
2597
2598 echo " Add the source list for AD code generation"
2599 echo >> $MAKEFILE
2600 printf "AD_FILES = " >> $MAKEFILE
2601 AD_FILES=`cat ad_files`
2602 for i in $AD_FILES ; do
2603 echo " \\" >> $MAKEFILE
2604 printf " $i" >> $MAKEFILE
2605 done
2606 echo >> $MAKEFILE
2607 rm -f ad_files
2608
2609 cat >>$MAKEFILE <<EOF
2610
2611 # ... AD ...
2612 adall: \$(EXE_AD)
2613 adtaf: ad_taf_output.$FS
2614 adtamc: ad_tamc_output.$FS
2615
2616 ad_input_code.$FS: \$(AD_FILES) \$(HEADERFILES)
2617 @$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
2618 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
2619 -rm -f ad_config.template
2620 @make \$(F77FILES)
2621 @make \$(AD_FLOW_FILES)
2622 cat \$(AD_FLOW_FILES) \$(AD_FILES) > ad_input_code.$FS
2623
2624 ad_taf_output.$FS: ad_input_code.$FS
2625 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2626 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2627
2628 adtafonly:
2629 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2630 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2631
2632 \${EXE_AD}: ad_taf_output.o \$(OBJFILES)
2633 \$(LINK) -o \${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
2634
2635 ad_tamc_output.$FS: ad_input_code.$FS
2636 \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.$FS
2637 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.$FS
2638
2639 ad_tamc: ad_tamc_output.o \$(OBJFILES)
2640 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
2641
2642 adonlyfwd:
2643 patch < \$(TOOLSDIR)/ad_taf_output.f.onlyfwd.diff
2644
2645 adtrick:
2646 patch < \$(TOOLSDIR)/ad_taf_output.f.adtrick.diff
2647
2648 # ... FTL ...
2649 ftlall: ftl_taf
2650 ftltaf: ftl_taf_output.$FS
2651 ftltamc: ftl_tamc_output.$FS
2652
2653 ftl_input_code.$FS: \$(AD_FILES) \$(HEADERFILES)
2654 @$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
2655 cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
2656 -rm -f ftl_config.template
2657 @make \$(F77FILES)
2658 @make \$(AD_FLOW_FILES)
2659 cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.$FS
2660
2661 ftl_taf_output.$FS: ftl_input_code.$FS
2662 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
2663 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
2664
2665 ftltafonly:
2666 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
2667 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
2668
2669 ftl_taf: ftl_taf_output.o \$(OBJFILES)
2670 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
2671
2672 ftl_tamc_output.$FS: ftl_input_code.$FS
2673 \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.$FS
2674 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.$FS
2675
2676 ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
2677 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
2678
2679
2680 # ... SVD ...
2681 svdtaf: ad_taf_output.$FS ftl_taf_output.$FS
2682 @echo "--->>> Only ran TAF to generate SVD code! <<<---"
2683 @echo "--->>> Do make svdall afterwards to compile. <<<---"
2684 svdall: svd_touch svd_taf
2685
2686 svd_taf: \$(OBJFILES)
2687 \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
2688
2689 @echo "--->>> Only COMPILE svd code! <<<---"
2690 @echo "--->>> Assumes you previously <<<---"
2691 @echo "--->>> did make svdtaf <<<---"
2692
2693 svd_touch:
2694 @echo "--->>> Only COMPILE svd code! <<<---"
2695 @echo "--->>> Assumes you previously <<<---"
2696 @echo "--->>> did make svdtaf <<<---"
2697 touch ad_taf_output.$FS ftl_taf_output.$FS
2698 \$(FC) \$(FFLAGS) \$(FOPTIM) -c ad_taf_output.$FS
2699 \$(FC) \$(FFLAGS) \$(FOPTIM) -c ftl_taf_output.$FS
2700 @$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
2701 cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
2702 -rm -f ftl_config.template
2703
2704 #=========================================
2705
2706 EOF
2707
2708 if test "x$EXEHOOK" != x ; then
2709 printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE
2710 fi
2711
2712 echo " Making list of \"exceptions\" that need \".p\" files"
2713 for i in $KPPFILES ; do
2714 base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
2715 RETVAL=$?
2716 if test "x$RETVAL" != x0 ; then
2717 echo "Error: unable to add file \"$i\" to the exceptions list"
2718 fi
2719 echo "$base.$FS: $base.p" >> $MAKEFILE
2720 done
2721
2722 echo " Making list of NOOPTFILES"
2723 for i in $NOOPTFILES ; do
2724 base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
2725 RETVAL=$?
2726 if test "x$RETVAL" != x0 ; then
2727 echo "Error: unable to add file \"$i\" to the exceptions list"
2728 fi
2729 echo "$base.o: $base.$FS" >> $MAKEFILE
2730 printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE
2731 done
2732
2733 echo " Add rules for links"
2734 cat srclinks.tmp >> $MAKEFILE
2735 rm -f srclinks.tmp
2736
2737 echo " Adding makedepend marker"
2738 printf "\n\n# DO NOT DELETE\n" >> $MAKEFILE
2739
2740 printf "\n=== Done ===\n"
2741
2742 # Create special header files
2743 $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"
2744 if test ! -f $PACKAGES_DOT_H ; then
2745 mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
2746 else
2747 cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H > /dev/null 2>&1
2748 RETVAL=$?
2749 if test "x$RETVAL" = x0 ; then
2750 rm -f $PACKAGES_DOT_H".tmp"
2751 else
2752 mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"
2753 mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
2754 fi
2755 fi
2756 if test ! -f AD_CONFIG.h ; then
2757 $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
2758 fi
2759
2760
2761 # Write the "state" for future records
2762 if test "x$DUMPSTATE" != xf ; then
2763 printf "" > genmake_state
2764 for i in $gm_state ; do
2765 t1="t2=\$$i"
2766 eval $t1
2767 echo "$i='$t2'" >> genmake_state
2768 done
2769 fi

  ViewVC Help
Powered by ViewVC 1.1.22