/[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.178 - (show annotations) (download)
Tue Nov 18 22:11:07 2008 UTC (10 years, 7 months ago) by utke
Branch: MAIN
Changes since 1.177: +20 -23 lines
using new python preprocessor

1 #! /usr/bin/env bash
2 #
3 # $Header: /u/gcmpack/MITgcm/tools/genmake2,v 1.177 2008/11/14 01:34:19 jmc Exp $
4 #
5 # Makefile generator for MITgcm UV codes
6 # created by cnh 03/98
7 # adapted by aja 06/98
8 # modified by aja 01/00
9 # rewritten in bash by eh3 08/03
10
11 # Search for particular CPP #cmds associated with packages
12 # usage: test_for_package_in_cpp_options CPP_file package_name
13 test_for_package_in_cpp_options() {
14 cpp_options=$1
15 pkg=$2
16 test_for_string_in_file $cpp_options "^[ ]*#define.*ALLOW_$pkg[ ]"
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 COMM="$CC $CFLAGS -c genmake_tc_1.c"
750 echo $COMM >> genmake_warnings
751 $COMM >> genmake_warnings 2>&1
752 RET_C=$?
753 cat <<EOF > genmake_tc_2.$FS
754 program hello
755 REAL*8 wtime
756 external cloc
757 call cloc(wtime)
758 print *," HELLO WORLD", wtime
759 end
760 EOF
761 COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
762 echo $COMM >> genmake_warnings
763 $COMM >> genmake_warnings 2>&1
764 RET_F=$?
765 test -x ./genmake_tc && ./genmake_tc >> genmake_warnings 2>&1
766 RETVAL=$?
767 if test "x$RETVAL" = x0 ; then
768 HAVE_CLOC=t
769 DEFINES="$DEFINES -DHAVE_CLOC"
770 fi
771 rm -f genmake_tc*
772 }
773
774
775 check_HAVE_SIGREG() {
776 if test ! "x$HAVE_SIGREG" = x ; then
777 return
778 fi
779 get_fortran_c_namemangling
780 cat <<EOF > genmake_tc_1.c
781 $FC_NAMEMANGLE
782 #include <stdlib.h>
783 #include <stdio.h>
784 #include <signal.h>
785 #include <errno.h>
786 #include <ucontext.h>
787
788 int * ip;
789
790 static void killhandler(
791 unsigned int sn, siginfo_t si, struct ucontext *sc )
792 {
793 *ip = *ip + 1;
794 return;
795 }
796
797 void FC_NAMEMANGLE(sigreg) (int * aip)
798 {
799 struct sigaction s;
800 ip = aip;
801 s.sa_flags = SA_SIGINFO;
802 s.sa_sigaction = (void *)killhandler;
803 if(sigaction (SIGTERM,&s,(struct sigaction *)NULL)) {
804 printf("Sigaction returned error = %d\n", errno);
805 exit(0);
806 }
807 return;
808 }
809 EOF
810 COMM="$CC $CFLAGS -c genmake_tc_1.c"
811 echo $COMM >> genmake_warnings
812 $COMM >> genmake_warnings 2>&1
813 RET_C=$?
814 cat <<EOF > genmake_tc_2.$FS
815 program hello
816 integer anint
817 common /iv/ anint
818 external sigreg
819 call sigreg(anint)
820 end
821 EOF
822 echo >> genmake_warnings
823 echo "running: check_HAVE_SIGREG()" >> genmake_warnings
824 cat genmake_tc_2.$FS >> genmake_warnings
825 COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
826 echo $COMM >> genmake_warnings
827 $COMM >> genmake_warnings 2>&1
828 RETVAL=$?
829 if test "x$RETVAL" = x0 ; then
830 HAVE_SIGREG=t
831 DEFINES="$DEFINES -DHAVE_SIGREG"
832 fi
833 rm -f genmake_tc*
834 }
835
836
837 check_HAVE_SETRLSTK() {
838 if test "x$HAVE_SETRLSTK" = xt ; then
839 DEFINES="$DEFINES -DHAVE_SETRLSTK"
840 return
841 fi
842 if test ! "x$HAVE_SETRLSTK" = x ; then
843 return
844 fi
845 get_fortran_c_namemangling
846 cat <<EOF > genmake_tc_1.c
847 $FC_NAMEMANGLE
848 #include <sys/time.h>
849 #include <sys/resource.h>
850 #include <unistd.h>
851 void FC_NAMEMANGLE(setrlstk) ()
852 {
853 struct rlimit rls;
854 rls.rlim_cur = RLIM_INFINITY;
855 rls.rlim_max = RLIM_INFINITY;
856 setrlimit(RLIMIT_STACK, &rls);
857 return;
858 }
859 EOF
860 COMM="$CC $CFLAGS -c genmake_tc_1.c"
861 echo $COMM >> genmake_warnings
862 $COMM >> genmake_warnings 2>&1
863 RET_C=$?
864 cat <<EOF > genmake_tc_2.$FS
865 program hello
866 external setrlstk
867 call setrlstk()
868 end
869 EOF
870 echo >> genmake_warnings
871 echo "running: check_HAVE_SETRLSTK()" >> genmake_warnings
872 cat genmake_tc_2.$FS >> genmake_warnings
873 COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
874 echo $COMM >> genmake_warnings
875 $COMM >> genmake_warnings 2>&1
876 RETVAL=$?
877 if test "x$RETVAL" = x0 ; then
878 HAVE_SETRLSTK=t
879 DEFINES="$DEFINES -DHAVE_SETRLSTK"
880 fi
881 rm -f genmake_tc*
882 }
883
884
885 check_HAVE_STAT() {
886 get_fortran_c_namemangling
887 cat <<EOF > genmake_tc_1.c
888 $FC_NAMEMANGLE
889 #include <stdio.h>
890 #include <stdlib.h>
891 #include <unistd.h>
892 #include <sys/stat.h>
893 #include <sys/types.h>
894 void FC_NAMEMANGLE(tfsize) ( int *nbyte )
895 {
896 char name[512];
897 struct stat astat;
898
899 name[0] = 'a'; name[1] = '\0';
900 if (! stat(name, &astat))
901 *nbyte = (int)(astat.st_size);
902 else
903 *nbyte = -1;
904 }
905 EOF
906 COMM="$CC $CFLAGS -c genmake_tc_1.c"
907 echo $COMM >> genmake_warnings
908 $COMM >> genmake_tc.log 2>&1
909 RET_C=$?
910 cat <<EOF > genmake_tc_2.$FS
911 program hello
912 integer nbyte
913 call tfsize(nbyte)
914 print *," HELLO WORLD", nbyte
915 end
916 EOF
917 echo >> genmake_warnings
918 echo "running: check_HAVE_STAT()" >> genmake_warnings
919 cat genmake_tc_2.$FS >> genmake_warnings
920 COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
921 echo $COMM >> genmake_warnings
922 $COMM >> genmake_tc.log 2>&1
923 RETVAL=$?
924 if test "x$RETVAL" = x0 ; then
925 HAVE_STAT=t
926 DEFINES="$DEFINES -DHAVE_STAT"
927 fi
928 rm -f genmake_tc*
929 }
930
931
932 check_netcdf_libs() {
933 if test ! "x$SKIP_NETCDF_CHECK" = x ; then
934 return
935 fi
936 echo >> genmake_warnings
937 echo "running: check_netcdf_libs()" >> genmake_warnings
938 cat <<EOF > genmake_tnc.F
939 program fgennc
940 #include "netcdf.inc"
941 EOF
942 if test ! "x$MPI" = x ; then
943 echo '#include "mpif.h"' >> genmake_tnc.F
944 fi
945 cat <<EOF >> genmake_tnc.F
946 integer iret, ncid, xid
947 iret = nf_create('genmake_tnc.nc', NF_CLOBBER, ncid)
948 IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
949 iret = nf_def_dim(ncid, 'X', 11, xid)
950 IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
951 iret = nf_close(ncid)
952 IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
953 end
954 EOF
955 echo "=== genmake_tnc.F ===" > genmake_tnc.log
956 cat genmake_tnc.F >> genmake_tnc.log
957 echo "=== genmake_tnc.F ===" >> genmake_tnc.log
958 RET_CPP=f
959 COMM="cat genmake_tnc.F | $CPP $DEFINES $INCLUDES"
960 echo "$COMM" >> genmake_tnc.log
961 eval $COMM > genmake_tnc.$FS 2>/dev/null && RET_CPP=t
962 if test "x$RET_CPP" = xf ; then
963 echo " WARNING: CPP failed to pre-process the netcdf test." \
964 >> genmake_tnc.log
965 echo " Please check that \$INCLUDES is properly set." \
966 >> genmake_tnc.log
967 fi
968 echo "$FC $FFLAGS $FOPTIM -c genmake_tnc.$FS \ " >> genmake_tnc.log
969 echo " && $LINK $FFLAGS $FOPTIM -o genmake_tnc.o $LIBS" >> genmake_tnc.log
970 $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1 \
971 && $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS >> genmake_tnc.log 2>&1
972 RET_COMPILE=$?
973 cat genmake_tnc.log >> genmake_warnings
974
975 #EH3 Remove test program execution for machines that either disallow
976 #EH3 execution or cannot support it (eg. cross-compilers)
977 #EH3
978 #EH3 test -x ./genmake_tnc && ./genmake_tnc >> genmake_tnc.log 2>&1
979 #EH3 RETVAL=$?
980 #EH3 if test "x$RET_COMPILE" = x0 -a "x$RETVAL" = x0 ; then
981
982 if test "x$RET_COMPILE" = x0 ; then
983 HAVE_NETCDF=t
984 else
985 # try again with "-lnetcdf" added to the libs
986 echo "try again with added '-lnetcdf'" > genmake_tnc.log
987 echo "cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS \ " >> genmake_tnc.log
988 echo " && $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS \ " >> genmake_tnc.log
989 echo " && $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf" >> genmake_tnc.log
990 cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS 2>/dev/null \
991 && $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1 \
992 && $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf >> genmake_tnc.log 2>&1
993 RET_COMPILE=$?
994 cat genmake_tnc.log >> genmake_warnings
995 if test "x$RET_COMPILE" = x0 ; then
996 LIBS="$LIBS -lnetcdf"
997 HAVE_NETCDF=t
998 else
999 # try again with "-lnetcdff" added to the libs
1000 echo "try again with added '-lnetcdff -lnetcdf'" > genmake_tnc.log
1001 echo "cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS \ " >> genmake_tnc.log
1002 echo " && $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS \ " >> genmake_tnc.log
1003 echo " && $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf" >> genmake_tnc.log
1004 cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS 2>/dev/null \
1005 && $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1 \
1006 && $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdff -lnetcdf >> genmake_tnc.log 2>&1
1007 RET_COMPILE=$?
1008 cat genmake_tnc.log >> genmake_warnings
1009 if test "x$RET_COMPILE" = x0 ; then
1010 LIBS="$LIBS -lnetcdff -lnetcdf"
1011 HAVE_NETCDF=t
1012 fi
1013 fi
1014 fi
1015 rm -f genmake_tnc*
1016 }
1017
1018
1019
1020 ###############################################################################
1021 # Sequential part of script starts here
1022 ###############################################################################
1023
1024 # Set defaults here
1025 COMMANDL="$0 $@"
1026
1027 PLATFORM=
1028 LN=
1029 S64=
1030 KPP=
1031 #FC=
1032 #CC=gcc
1033 #CPP=
1034 LINK=
1035 DEFINES=
1036 PACKAGES=
1037 ENABLE=
1038 DISABLE=
1039 # MAKEFILE=
1040 # MAKEDEPEND=
1041 PDEPEND=
1042 DUMPSTATE=t
1043 PDEFAULT=
1044 OPTFILE=
1045 INCLUDES="-I. $INCLUDES"
1046 FFLAGS=
1047 FOPTIM=
1048 FEXTRAFLAGS=
1049 CFLAGS=
1050 KFLAGS1=
1051 KFLAGS2=
1052 #LDADD=
1053 LIBS=
1054 KPPFILES=
1055 NOOPTFILES=
1056 NOOPTFLAGS=
1057 MPI=
1058 MPIPATH=
1059 TS=
1060 PAPIS=
1061 PCLS=
1062 FOOLAD=
1063 PAPI=
1064 PCL=
1065 HPMT=
1066 GSL=
1067 DEVEL=
1068 HAVE_TEST_L=
1069
1070 # DEFINES checked by test compilation or command-line
1071 HAVE_SYSTEM=
1072 HAVE_FDATE=
1073 FC_NAMEMANGLE=
1074 HAVE_CLOC=
1075 # HAVE_SETRLSTK=
1076 HAVE_STAT=
1077 HAVE_NETCDF=
1078 HAVE_ETIME=
1079 IGNORE_TIME=
1080
1081 MODS=
1082 TOOLSDIR=
1083 SOURCEDIRS=
1084 INCLUDEDIRS=
1085 STANDARDDIRS="USE_THE_DEFAULT"
1086
1087 G2ARGS=
1088 BASH=
1089 PWD=`pwd`
1090 test "x$MAKE" = x && MAKE=make
1091 test "x$AWK" = x && AWK=awk
1092 EMBED_SRC=
1093 THISHOST=`hostname`
1094 THISCWD=`pwd`
1095 THISDATE=`date`
1096 THISUSER=`echo $USER`
1097 THISVER=
1098 MACHINE=`uname -a`
1099 EXECUTABLE=
1100 EXEHOOK=
1101 EXEDIR=
1102 PACKAGES_CONF=
1103 IEEE=
1104 if test "x$MITGCM_IEEE" != x ; then
1105 IEEE=$MITGCM_IEEE
1106 fi
1107 FS=
1108 FS90=
1109
1110 AUTODIFF_PKG_USED=f
1111 AD_OPTFILE=
1112 TAF=
1113 AD_TAF_FLAGS=
1114 FTL_TAF_FLAGS=
1115 SVD_TAF_FLAGS=
1116 TAF_EXTRA=
1117 TAMC=
1118 AD_TAMC_FLAGS=
1119 FTL_TAF_FLAGS=
1120 SVD_TAMC_FLAGS=
1121 TAMC_EXTRA=
1122
1123
1124 # The following state can be set directly by command-line switches
1125 gm_s1="OPTFILE PDEPEND PDEFAULT MAKEFILE PLATFORM ROOTDIR MODS DISABLE ENABLE"
1126 gm_s2="FC CPP IEEE TS PAPIS PCLS PAPI PCL HPMT GSL DEVEL MPI JAM DUMPSTATE STANDARDDIRS"
1127
1128 # The following state is not directly set by command-line switches
1129 gm_s3="LN S64 KPP LINK PACKAGES MAKEDEPEND PDEPEND PDEFAULT INCLUDES FFLAGS FOPTIM FEXTRAFLAGS"
1130 gm_s4="CFLAGS KFLAGS1 KFLAGS2 LIBS KPPFILES NOOPTFILES NOOPTFLAGS"
1131 gm_s5="TOOLSDIR SOURCEDIRS INCLUDEDIRS PWD MAKE THISHOST THISUSER THISDATE THISVER MACHINE"
1132 gm_s6="EXECUTABLE EXEHOOK EXEDIR PACKAGES_CONF"
1133 gm_s7="HAVE_SYSTEM HAVE_FDATE FC_NAMEMANGLE HAVE_ETIME"
1134
1135 # The following are all related to adjoint/tangent-linear stuff
1136 gm_s10="AUTODIFF_PKG_USED AD_OPTFILE TAMC TAF AD_TAMC_FLAGS AD_TAF_FLAGS"
1137 gm_s11="FTL_TAMC_FLAGS FTL_TAF_FLAGS SVD_TAMC_FLAGS SVD_TAF_FLAGS"
1138 gm_s12="TAF_EXTRA TAMC_EXTRA"
1139
1140 gm_state="COMMANDL $gm_s1 $gm_s2 $gm_s3 $gm_s4 $gm_s5 $gm_s6 $gm_s7"
1141 gm_state="$gm_state $gm_s10 $gm_s11 $gm_s12"
1142
1143 cat <<EOF
1144
1145 GENMAKE :
1146
1147 A program for GENerating MAKEfiles for the MITgcm project. For a
1148 quick list of options, use "genmake -h" or for more detail see:
1149
1150 http://mitgcm.org/devel_HOWTO/
1151
1152 EOF
1153
1154 echo "=== Processing options files and arguments ==="
1155 gm_local="genmake_local"
1156 printf " getting local config information: "
1157 if test -f $gm_local ; then
1158 echo "using $gm_local"
1159 . $gm_local
1160 # echo "DISABLE=$DISABLE"
1161 # echo "ENABLE=$ENABLE"
1162 else
1163 echo "none found"
1164 fi
1165
1166 #echo "$0::$1:$2:$3:$4:$5:$6:$7:"
1167 #OPTIONS=
1168 #n=0
1169 #for i ; do
1170 # echo "$i $n"
1171 # setvar="OPTIONS[$n]='$i'"
1172 # # echo " $setvar"
1173 # eval "$setvar"
1174 # n=$(( $n + 1 ))
1175 #done
1176 #parse_options
1177 ac_prev=
1178 for ac_option in "$@" ; do
1179
1180 G2ARGS="$G2ARGS \"$ac_option\""
1181
1182 # If the previous option needs an argument, assign it.
1183 if test -n "$ac_prev"; then
1184 eval "$ac_prev=\$ac_option"
1185 ac_prev=
1186 continue
1187 fi
1188
1189 ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
1190
1191 case $ac_option in
1192
1193 -help | --help | -h | --h)
1194 usage ;;
1195
1196 -nooptfile | --nooptfile)
1197 OPTFILE="NONE" ;;
1198 -optfile | --optfile | -of | --of)
1199 ac_prev=OPTFILE ;;
1200 -optfile=* | --optfile=* | -of=* | --of=*)
1201 OPTFILE=$ac_optarg ;;
1202
1203 -adoptfile | --adoptfile | -adof | --adof)
1204 ac_prev=AD_OPTFILE ;;
1205 -adoptfile=* | --adoptfile=* | -adof=* | --adof=*)
1206 AD_OPTFILE=$ac_optarg ;;
1207
1208 -pdepend | --pdepend)
1209 ac_prev=PDEPEND ;;
1210 -pdepend=* | --pdepend=*)
1211 PDEPEND=$ac_optarg ;;
1212
1213 -pdefault | --pdefault)
1214 ac_prev=PDEFAULT ;;
1215 -pdefault=* | --pdefault=*)
1216 PDEFAULT=$ac_optarg ;;
1217
1218 -make | --make | -m | --m)
1219 ac_prev=MAKE ;;
1220 -make=* | --make=* | -m=* | --m=*)
1221 MAKE=$ac_optarg ;;
1222
1223 -bash | --bash)
1224 ac_prev=BASH ;;
1225 -bash=* | --bash=*)
1226 BASH=$ac_optarg ;;
1227
1228 -makedepend | --makedepend | -md | --md)
1229 ac_prev=MAKEDEPEND ;;
1230 -makedepend=* | --makedepend=* | -md=* | --md=*)
1231 MAKEDEPEND=$ac_optarg ;;
1232
1233 -makefile | --makefile | -ma | --ma)
1234 ac_prev=MAKEFILE ;;
1235 -makefile=* | --makefile=* | -ma=* | --ma=*)
1236 MAKEFILE=$ac_optarg ;;
1237
1238 -platform | --platform | -pl | --pl | -platform=* | --platform=* | -pl=* | --pl=*)
1239 echo "ERROR: The platform option has been removed. Please specify"
1240 echo " the build options using the \"optfile\" mechanism."
1241 echo
1242 usage
1243 ;;
1244
1245 -rootdir | --rootdir | -rd | --rd)
1246 ac_prev=ROOTDIR ;;
1247 -rootdir=* | --rootdir=* | -rd=* | --rd=*)
1248 ROOTDIR=$ac_optarg ;;
1249
1250 -mods | --mods | -mo | --mo)
1251 ac_prev=MODS ;;
1252 -mods=* | --mods=* | -mo=* | --mo=*)
1253 MODS=$ac_optarg ;;
1254
1255 -disable | --disable)
1256 ac_prev=DISABLE ;;
1257 -disable=* | --disable=*)
1258 DISABLE=$ac_optarg ;;
1259
1260 -enable | --enable)
1261 ac_prev=ENABLE ;;
1262 -enable=* | --enable=*)
1263 ENABLE=$ac_optarg ;;
1264
1265 -standarddirs | --standarddirs)
1266 ac_prev=STANDARDDIRS ;;
1267 -standarddirs=* | --standarddirs=*)
1268 STANDARDDIRS=$ac_optarg ;;
1269
1270 # -cpp | --cpp)
1271 # ac_prev=cpp ;;
1272 # -cpp=* | --cpp=*)
1273 # CPP=$ac_optarg ;;
1274
1275 -cc | --cc)
1276 ac_prev=CC ;;
1277 -cc=* | --cc=*)
1278 CC=$ac_optarg ;;
1279
1280 -fortran | --fortran | -fc | --fc)
1281 ac_prev=FC ;;
1282 -fc=* | --fc=*)
1283 FC=$ac_optarg ;;
1284
1285 -fs | --fs)
1286 ac_prev=FS ;;
1287 -fs=* | --fs=*)
1288 FS=$ac_optarg ;;
1289
1290 -fs90 | --fs90)
1291 ac_prev=FS90 ;;
1292 -fs90=* | --fs90=*)
1293 FS90=$ac_optarg ;;
1294
1295 -ieee | --ieee)
1296 IEEE=true ;;
1297 -noieee | --noieee)
1298 IEEE= ;;
1299
1300 -ts | --ts)
1301 TS=true ;;
1302 -papis | --papis)
1303 PAPIS=true ;;
1304 -pcls | --pcls)
1305 PCLS=true ;;
1306 -foolad | --foolad)
1307 FOOLAD=true ;;
1308 -papi | --papi)
1309 PAPI=true ;;
1310 -pcl | --pcl)
1311 PCL=true ;;
1312 -hpmt | --hpmt)
1313 HPMT=true ;;
1314
1315 -gsl | --gsl)
1316 GSL=true ;;
1317
1318 -devel | --devel)
1319 DEVEL=true ;;
1320
1321 -mpi | --mpi)
1322 MPI=true ;;
1323 -mpi=* | --mpi=*)
1324 MPIPATH=$ac_optarg
1325 MPI=true ;;
1326
1327 # -jam | --jam)
1328 # JAM=1 ;;
1329 # -nojam | --nojam)
1330 # JAM=0 ;;
1331
1332 -ds | --ds)
1333 DUMPSTATE=t ;;
1334
1335 -taf_extra | --taf_extra)
1336 ac_prev=TAF_EXTRA ;;
1337 -taf_extra=* | --taf_extra=*)
1338 TAF_EXTRA=$ac_optarg ;;
1339
1340 -tamc_extra | --tamc_extra)
1341 ac_prev=TAMC_EXTRA ;;
1342 -tamc_extra=* | --tamc_extra=*)
1343 TAMC_EXTRA=$ac_optarg ;;
1344
1345 -ignoretime | -ignore_time | --ignoretime | --ignore_time)
1346 IGNORE_TIME="-DIGNORE_TIME" ;;
1347
1348 -es | --es | -embed-source | --embed-source)
1349 EMBED_SRC=t ;;
1350
1351 -*)
1352 echo "Error: unrecognized option: "$ac_option
1353 usage
1354 ;;
1355
1356 *)
1357 echo "Error: unrecognized argument: "$ac_option
1358 usage
1359 ;;
1360
1361 esac
1362
1363 done
1364
1365
1366 if test -f ./.genmakerc ; then
1367 echo
1368 echo "WARNING: genmake2 has detected a copy of the old-style \"./.genmakerc\""
1369 echo " file. This file format is no longer supported. For directions on"
1370 echo " how to setup and use the new \"genmake2\" script, please see:"
1371 echo " http://mitgcm.org/devel_HOWTO/"
1372 echo " and send an email to MITgcm-support@mitgcm.org if you need help."
1373 echo "WARNING: ignore \"./.genmakerc\" and continue."
1374 echo
1375 fi
1376
1377 # Find the MITgcm ${ROOTDIR}
1378 if test "x${ROOTDIR}" = x ; then
1379 tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1380 if test "x$tmp" = "xbin" -a -d ../model -a -d ../eesupp -a -d ../pkg ; then
1381 ROOTDIR=".."
1382 else
1383 for d in . .. ../.. ../../.. ../../../.. ../../../../.. ; do
1384 if [ -d "$d/model" -a -d "$d/eesupp" -a -d "$d/pkg" ]; then
1385 ROOTDIR=$d
1386 printf "Warning: ROOTDIR was not specified but there appears to be"
1387 echo " a copy of MITgcm at \"$ROOTDIR\" so we'll try it."
1388 break
1389 fi
1390 done
1391 fi
1392 fi
1393 if test "x${ROOTDIR}" = x ; then
1394 echo "Error: Cannot determine ROOTDIR for MITgcm code."
1395 echo " Please specify a ROOTDIR using either an options "
1396 echo " file or a command-line option."
1397 exit 1
1398 fi
1399 if test ! -d ${ROOTDIR} ; then
1400 echo "Error: the specified ROOTDIR (\"$ROOTDIR\") does not exist!"
1401 exit 1
1402 fi
1403
1404 # Find the MITgcm ${THISVER}
1405 if test -f "${ROOTDIR}/doc/tag-index" ; then
1406 THISVER=`grep '^checkpoint' ${ROOTDIR}/doc/tag-index | head -1`
1407 fi
1408
1409 if test "x$MAKEFILE" = x ; then
1410 MAKEFILE="Makefile"
1411 fi
1412
1413 echo " getting OPTFILE information: "
1414 if test "x${OPTFILE}" = x ; then
1415 if test "x$MITGCM_OF" = x ; then
1416 echo "Warning: no OPTFILE specified so we'll look for possible settings"
1417 printf "\n=== Searching for possible settings for OPTFILE ===\n"
1418 find_possible_configs
1419 else
1420 OPTFILE=$MITGCM_OF
1421 fi
1422 fi
1423 if test "x$OPTFILE" != xNONE ; then
1424 if test -f "$OPTFILE" -a -r "$OPTFILE" ; then
1425 echo " using OPTFILE=\"$OPTFILE\""
1426 . "$OPTFILE"
1427 RETVAL=$?
1428 if test "x$RETVAL" != x0 ; then
1429 printf "Error: failed to source OPTFILE \"$OPTFILE\""
1430 echo "--please check that variable syntax is bash-compatible"
1431 exit 1
1432 fi
1433 if test "x$DUMPSTATE" != xf ; then
1434 cp -f $OPTFILE "genmake_optfile"
1435 fi
1436 else
1437 echo "Error: can't read OPTFILE=\"$OPTFILE\""
1438 exit 1
1439 fi
1440 fi
1441
1442 echo " getting AD_OPTFILE information: "
1443 if test "x${AD_OPTFILE}" = x ; then
1444 if test "x$MITGCM_AD_OF" = x ; then
1445 AD_OPTFILE=$ROOTDIR/tools/adjoint_options/adjoint_default
1446 else
1447 AD_OPTFILE=$MITGCM_AD_OF
1448 fi
1449 fi
1450 if test "x${AD_OPTFILE}" != xNONE ; then
1451 if test -f "$AD_OPTFILE" -a -r "$AD_OPTFILE" ; then
1452 echo " using AD_OPTFILE=\"$AD_OPTFILE\""
1453 . "$AD_OPTFILE"
1454 RETVAL=$?
1455 if test "x$RETVAL" != x0 ; then
1456 printf "Error: failed to source AD_OPTFILE \"$AD_OPTFILE\""
1457 echo "--please check that variable syntax is bash-compatible"
1458 exit 1
1459 fi
1460 if test "x$DUMPSTATE" != xf ; then
1461 cp -f $AD_OPTFILE "genmake_ad_optfile"
1462 fi
1463 else
1464 echo "Error: can't read AD_OPTFILE=\"$AD_OPTFILE\""
1465 exit 1
1466 fi
1467 fi
1468
1469 #====================================================================
1470 # Set default values if not set by the optfile
1471 #
1472 # Check that FC, CC, LINK, CPP, S64, LN, and MAKE are defined. If not,
1473 # either set defaults or complain and abort!
1474 if test ! "x$BASH" = x ; then
1475 # add a trailing space so that it works within the Makefile syntax (see below)
1476 BASH="$BASH "
1477 fi
1478 if test "x$FC" = x ; then
1479 cat <<EOF 1>&2
1480
1481 Error: no Fortran compiler: please specify using one of the following:
1482 1) within the options file ("FC=...") as specified by "-of=OPTFILE"
1483 2) the "-fc=XXX" command-line option
1484 3) the "./genmake_local" file
1485 EOF
1486 exit 1
1487 fi
1488 if test "x$CC" = x ; then
1489 CC=cc
1490 # cat <<EOF 1>&2
1491 # Error: no C compiler: please specify using one of the following:
1492 # 1) within the options file ("CC=...") as specified by "-of=OPTFILE"
1493 # 2) the "-cc=XXX" command-line option
1494 # 3) the "./genmake_local" file
1495 # EOF
1496 # exit 1
1497 fi
1498 if test "x$LINK" = x ; then
1499 LINK=$FC
1500 fi
1501 if test "x$MAKE" = x ; then
1502 MAKE="make"
1503 fi
1504 if test "x$CPP" = x ; then
1505 CPP=cpp
1506 fi
1507 #EH3 === UGLY ===
1508 # The following is an ugly little hack to check for $CPP in /lib/ and
1509 # it should eventually be replaced with a more general function that
1510 # searches a combo of the user's path and a list of "usual suspects"
1511 # to find the correct location for binaries such as $CPP.
1512 for i in " " "/lib/" ; do
1513 echo "#define A a" | $i$CPP > test_cpp 2>&1 && CPP=$i$CPP
1514 done
1515 #EH3 === UGLY ===
1516 echo "#define A a" | $CPP > test_cpp 2>&1
1517 RETVAL=$?
1518 if test "x$RETVAL" != x0 ; then
1519 cat <<EOF 1>&2
1520
1521 Error: C pre-processor "$CPP" failed the test case: please specify using:
1522
1523 1) within the options file ("CPP=...") as specified by "-of=OPTFILE"
1524 2) the "./genmake_local" file
1525 3) with the CPP environment variable
1526
1527 EOF
1528 exit 1
1529 else
1530 rm -f test_cpp
1531 fi
1532 look_for_makedepend
1533 if test "x$LN" = x ; then
1534 LN="ln -s"
1535 fi
1536 echo "test" > genmake_test_ln
1537 $LN genmake_test_ln genmake_tlink
1538 RETVAL=$?
1539 if test "x$RETVAL" != x0 ; then
1540 cat <<EOF 1>&2
1541
1542 Error: The command "ln -s" failed -- please specify a working soft-link
1543 command in the optfile.
1544
1545 EOF
1546 exit 1
1547 fi
1548 test -L genmake_tlink > /dev/null 2>&1
1549 RETVAL=$?
1550 if test "x$RETVAL" = x0 ; then
1551 HAVE_TEST_L=t
1552 fi
1553 rm -f genmake_test_ln genmake_tlink
1554
1555 # Check for broken *.F/*.f handling and fix if possible
1556 check_for_broken_Ff
1557
1558 if test ! "x$MPI" = x ; then
1559 echo " Turning on MPI cpp macros"
1560 DEFINES="$DEFINES -DALLOW_USE_MPI -DALWAYS_USE_MPI"
1561 fi
1562
1563 if test ! "x$TS" = x ; then
1564 echo " Turning on timing per timestep"
1565 if test ! "x$FOOLAD" = x ; then
1566 DEFINES="$DEFINES -DTIME_PER_TIMESTEP_SFP"
1567 else
1568 DEFINES="$DEFINES -DTIME_PER_TIMESTEP"
1569 fi
1570 PACKAGES="$PACKAGES showflops"
1571 fi
1572 if test ! "x$PAPIS" = x ; then
1573 echo " Turning on PAPI flop summary per timestep"
1574 echo " Please make sure PAPIINC, PAPILIB are defined"
1575 if test ! "x$FOOLAD" = x ; then
1576 DEFINES="$DEFINES -DUSE_PAPI_FLOPS_SFP"
1577 else
1578 DEFINES="$DEFINES -DUSE_PAPI_FLOPS"
1579 fi
1580 INCLUDES="$INCLUDES $PAPIINC"
1581 LIBS="$LIBS $PAPILIB"
1582 PACKAGES="$PACKAGES showflops"
1583 fi
1584 if test ! "x$PCLS" = x ; then
1585 echo " Turning on PCL counter summary per timestep"
1586 echo " Please make sure PCLINC, PCLLIB are defined"
1587 if test ! "x$FOOLAD" = x ; then
1588 DEFINES="$DEFINES -DUSE_PCL_FLOPS_SFP"
1589 else
1590 DEFINES="$DEFINES -DUSE_PCL_FLOPS"
1591 fi
1592 INCLUDES="$INCLUDES $PCLINC"
1593 LIBS="$LIBS $PCLLIB"
1594 PACKAGES="$PACKAGES showflops"
1595 fi
1596 if test ! "x$PAPI" = x ; then
1597 if test ! "x$PAPIS" = x ; then
1598 echo " PAPI performance analysis and flop summary per timestep cannot co-exist!"
1599 echo " Sticking with PAPI flop summary per timestep!"
1600 else
1601 echo " Turning on performance analysis with PAPI"
1602 echo " Please make sure PAPIINC, PAPILIB are defined"
1603 DEFINES="$DEFINES -DUSE_PAPI"
1604 INCLUDES="$INCLUDES $PAPIINC"
1605 LIBS="$LIBS $PAPILIB"
1606 fi
1607 fi
1608 if test ! "x$PCL" = x ; then
1609 if test ! "x$PCLS" = x ; then
1610 echo " PCL performance analysis and flop summary per timestep cannot co-exist!"
1611 echo " Sticking with PCL flop summary per timestep!"
1612 else
1613 echo " Turning on performance analysis with PCL"
1614 echo " Please make sure PCLINC, PCLLIB are defined"
1615 DEFINES="$DEFINES -DUSE_PCL"
1616 INCLUDES="$INCLUDES $PCLINC"
1617 LIBS="$LIBS $PCLLIB"
1618 fi
1619 fi
1620 if test ! "x$HPMT" = x ; then
1621 if test ! "x$PAPI" = x ; then
1622 echo " PAPI and the HPM Toolkit cannot co-exist!"
1623 echo " Sticking with PAPI!"
1624 else if test ! "x$PCL" = x ; then
1625 echo " PCL and the HPM Toolkit cannot co-exist!"
1626 echo " Sticking with PCL!"
1627 else
1628 echo " Turning on performance analysis with the HPM Toolkit"
1629 echo " Please make sure HPMTINC, HPMTLIB are defined"
1630 DEFINES="$DEFINES -DUSE_LIBHPM"
1631 INCLUDES="$INCLUDES $HPMTINC"
1632 LIBS="$LIBS $HPMTLIB"
1633 fi
1634 fi
1635 fi
1636 if test ! "x$GSL" = x ; then
1637 echo " Turning on use of GSL to control floating point calculations"
1638 echo " Please make sure GSLINC, GSLLIB are defined"
1639 DEFINES="$DEFINES -DUSE_GSL_IEEE"
1640 INCLUDES="$INCLUDES $GSLINC"
1641 LIBS="$LIBS $GSLLIB"
1642 fi
1643
1644 printf "\n=== Checking system libraries ===\n"
1645 printf " Do we have the system() command using $FC... "
1646 cat > genmake_tcomp.$FS <<EOF
1647 program hello
1648 call system('echo hi')
1649 end
1650 EOF
1651 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1652 RETVAL=$?
1653 if test "x$RETVAL" = x0 ; then
1654 HAVE_SYSTEM=t
1655 DEFINES="$DEFINES -DHAVE_SYSTEM"
1656 echo "yes"
1657 else
1658 HAVE_SYSTEM=
1659 echo "no"
1660 fi
1661 rm -f genmake_tcomp*
1662
1663 printf " Do we have the fdate() command using $FC... "
1664 cat > genmake_tcomp.$FS <<EOF
1665 program hello
1666 CHARACTER*(128) string
1667 string = ' '
1668 call fdate( string )
1669 print *, string
1670 end
1671 EOF
1672 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1673 RETVAL=$?
1674 if test "x$RETVAL" = x0 ; then
1675 HAVE_FDATE=t
1676 DEFINES="$DEFINES -DHAVE_FDATE"
1677 echo "yes"
1678 else
1679 HAVE_FDATE=
1680 echo "no"
1681 fi
1682 rm -f genmake_tcomp*
1683
1684 printf " Do we have the etime() command using $FC... "
1685 cat > genmake_tcomp.$FS <<EOF
1686 program hello
1687 REAL*4 ACTUAL, TARRAY(2)
1688 EXTERNAL ETIME
1689 REAL*4 ETIME
1690 actual = etime( tarray )
1691 print *, tarray
1692 end
1693 EOF
1694 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1695 RETVAL=$?
1696 if test "x$RETVAL" = x0 ; then
1697 HAVE_ETIME=t
1698 DEFINES="$DEFINES -DHAVE_ETIME"
1699 echo "yes"
1700 else
1701 HAVE_ETIME=
1702 echo "no"
1703 fi
1704 rm -f genmake_tcomp*
1705
1706 printf " Can we call simple C routines (here, \"cloc()\") using $FC... "
1707 check_HAVE_CLOC
1708 if test "x$HAVE_CLOC" != x ; then
1709 echo "yes"
1710 else
1711 echo "no"
1712 if test "x$EMBED_SRC" = xt ; then
1713 echo " WARNING: you requested file embedding but it has"
1714 echo " been disabled since C code cannot be called"
1715 EMBED_SRC=
1716 fi
1717 fi
1718 rm -f genmake_t*
1719
1720 printf " Can we unlimit the stack size using $FC... "
1721 check_HAVE_SETRLSTK
1722 if test "x$HAVE_SETRLSTK" = xt ; then
1723 echo "yes"
1724 else
1725 echo "no"
1726 fi
1727 rm -f genmake_t*
1728
1729 printf " Can we register a signal handler using $FC... "
1730 check_HAVE_SIGREG
1731 if test "x$HAVE_SIGREG" = xt ; then
1732 echo "yes"
1733 else
1734 echo "no"
1735 fi
1736 rm -f genmake_t*
1737
1738 printf " Can we use stat() through C calls... "
1739 check_HAVE_STAT
1740 if test "x$HAVE_STAT" != x ; then
1741 echo "yes"
1742 else
1743 echo "no"
1744 fi
1745 rm -f genmake_t*
1746
1747 printf " Can we create NetCDF-enabled binaries... "
1748 check_netcdf_libs
1749 if test "x$HAVE_NETCDF" != x ; then
1750 echo "yes"
1751 else
1752 echo "no"
1753 fi
1754 DEFINES="$DEFINES $IGNORE_TIME"
1755
1756 if test "x$EMBED_SRC" = xt ; then
1757 build_embed_encode
1758 fi
1759 if test "x$EMBED_SRC" = xt ; then
1760 ENABLE="$ENABLE embed_files"
1761 fi
1762
1763
1764 printf "\n=== Setting defaults ===\n"
1765 printf " Adding MODS directories: "
1766 for d in $MODS ; do
1767 if test ! -d $d ; then
1768 echo
1769 echo "Error: MODS directory \"$d\" not found!"
1770 exit 1
1771 else
1772 printf " $d"
1773 SOURCEDIRS="$SOURCEDIRS $d"
1774 INCLUDEDIRS="$INCLUDEDIRS $d"
1775 fi
1776 done
1777 echo
1778
1779 if test "x${PLATFORM}" = x ; then
1780 PLATFORM=$p_PLATFORM
1781 fi
1782
1783 if test "x${EXEDIR}" = x ; then
1784 tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1785 if test "x$tmp" = "xbin" -a -d ../exe -a $ROOTDIR = .. ; then
1786 EXEDIR=../exe
1787 else
1788 EXEDIR=.
1789 fi
1790 fi
1791 if test ! -d ${EXEDIR} ; then
1792 echo "Error: the specified EXEDIR (\"$EXEDIR\") does not exist!"
1793 exit 1
1794 fi
1795
1796 if test "x${TOOLSDIR}" = x ; then
1797 TOOLSDIR="$ROOTDIR/tools"
1798 fi
1799 if test ! -d ${TOOLSDIR} ; then
1800 echo "Error: the specified TOOLSDIR (\"$TOOLSDIR\") does not exist!"
1801 exit 1
1802 fi
1803 if test "x$S64" = x ; then
1804 echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.sh > /dev/null 2>&1
1805 RETVAL=$?
1806 if test "x${RETVAL}" = x0 ; then
1807 S64='$(TOOLSDIR)/set64bitConst.sh'
1808 else
1809 echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.csh > /dev/null 2>&1
1810 RETVAL=$?
1811 if test "x${RETVAL}" = x0 ; then
1812 S64='$(TOOLSDIR)/set64bitConst.csh'
1813 else
1814 cat <<EOF
1815
1816 ERROR: neither of the two default scripts:
1817
1818 ${TOOLSDIR}/set64bitConst.sh
1819 ${TOOLSDIR}/set64bitConst.csh
1820
1821 are working so please check paths or specify (with \$S64) a
1822 working version of this script.
1823
1824 EOF
1825 exit 1
1826 fi
1827 fi
1828 fi
1829 THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`
1830
1831 EXECUTABLE=${EXECUTABLE:-mitgcmuv}
1832
1833 # We have a special set of source files in eesupp/src which are
1834 # generated from some template source files. We'll make them first so
1835 # they appear as regular source code
1836 if test -r $ROOTDIR"/eesupp/src/Makefile" ; then
1837 echo " Making source files in eesupp from templates"
1838 ( cd $ROOTDIR"/eesupp/src/" && $MAKE ) > make_eesupp.errors 2>&1
1839 RETVAL=$?
1840 if test "x${RETVAL}" = x0 ; then
1841 rm -f make_eesupp.errors
1842 else
1843 echo "Error: problem encountered while building source files in eesupp:"
1844 cat make_eesupp.errors 1>&2
1845 exit 1
1846 fi
1847 fi
1848
1849 #same for pkg/exch2 and pkg/regrid
1850 for pdir in exch2 regrid ; do
1851 if test -r $ROOTDIR"/pkg/${pdir}/Makefile" ; then
1852 echo " Making source files in pkg/${pdir} from templates"
1853 ( cd $ROOTDIR"/pkg/"${pdir} && $MAKE ) > make_${pdir}.errors 2>&1
1854 RETVAL=$?
1855 if test "x${RETVAL}" = x0 ; then
1856 rm -f make_${pdir}.errors
1857 else
1858 echo "Error: problem encountered while building source files in pkg/${pdir}:"
1859 cat make_${pdir}.errors 1>&2
1860 exit 1
1861 fi
1862 fi
1863 done
1864
1865 printf "\n=== Determining package settings ===\n"
1866 if test "x${PDEPEND}" = x ; then
1867 tmp=$ROOTDIR"/pkg/pkg_depend"
1868 if test -r $tmp ; then
1869 PDEPEND=$tmp
1870 else
1871 echo "Warning: No package dependency information was specified."
1872 echo " Please check that ROOTDIR/pkg/pkg_depend exists."
1873 fi
1874 else
1875 if test ! -r ${PDEPEND} ; then
1876 echo "Error: can't read package dependency info from PDEPEND=\"$PDEPEND\""
1877 exit 1
1878 fi
1879 fi
1880 echo " getting package dependency info from $PDEPEND"
1881 # Strip the comments and then convert the dependency file into
1882 # two arrays: PNAME, DNAME
1883 cat $PDEPEND | sed -e 's/#.*$//g' \
1884 | $AWK 'BEGIN{nn=-1;} (NF>0){ for(i=2;i<=NF;i++){nn++; print "PNAME_"nn"="$1"\nDNAME_"nn"="$i}} END{print "nname="nn}' \
1885 > ./.pd_tmp
1886 RETVAL=$?
1887 if test ! "x${RETVAL}" = x0 ; then
1888 echo "Error: unable to parse package dependencies -- please check PDEPEND=\"$PDEPEND\""
1889 exit 1
1890 fi
1891 . ./.pd_tmp
1892 rm -f ./.pd_tmp
1893
1894 # Search for default packages. Note that a "$ROOTDIR/pkg/pkg_groups"
1895 # file should eventually be added so that, for convenience, one can
1896 # specify groups of packages using names like "ocean" and "atmosphere".
1897 echo " checking default package list: "
1898 if test "x${PDEFAULT}" = x ; then
1899 for i in "." $MODS ; do
1900 if test -r $i"/packages.conf" ; then
1901 PDEFAULT=$i"/packages.conf"
1902 break
1903 fi
1904 done
1905 fi
1906 if test "x${PDEFAULT}" = x ; then
1907 PDEFAULT="$ROOTDIR/pkg/pkg_default"
1908 fi
1909 if test "x${PDEFAULT}" = xNONE ; then
1910 echo " default packages file disabled"
1911 else
1912 if test ! -r $PDEFAULT ; then
1913 echo "Warning: can't read default packages from PDEFAULT=\"$PDEFAULT\""
1914 else
1915 echo " using PDEFAULT=\"$PDEFAULT\""
1916 # Strip the comments and add all the names
1917 def=`cat $PDEFAULT | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
1918 RETVAL=$?
1919 if test "x${RETVAL}" != x0 ; then
1920 printf "Error: can't parse default package list "
1921 echo "-- please check PDEFAULT=\"$PDEFAULT\""
1922 exit 1
1923 fi
1924 for i in $def ; do
1925 PACKAGES="$PACKAGES $i"
1926 done
1927 echo " before group expansion packages are: $PACKAGES"
1928 RET=1
1929 while test $RET = 1 ; do expand_pkg_groups; RET=$?; done
1930 echo " after group expansion packages are: $PACKAGES"
1931 fi
1932 fi
1933
1934 echo " applying DISABLE settings"
1935 for i in $PACKAGES ; do
1936 echo $i >> ./.tmp_pack
1937 done
1938 for i in `grep "-" ./.tmp_pack` ; do
1939 j=`echo $i | sed 's/[-]//'`
1940 DISABLE="$DISABLE $j"
1941 done
1942 pack=
1943 for p in $PACKAGES ; do
1944 addit="t"
1945 for d in $DISABLE ; do
1946 if test "x$p" = "x$d" ; then
1947 addit="f"
1948 fi
1949 done
1950 if test "x$addit" = xt ; then
1951 pack="$pack $p"
1952 fi
1953 done
1954 PACKAGES="$pack"
1955 echo " applying ENABLE settings"
1956 echo "" > ./.tmp_pack
1957 PACKAGES="$PACKAGES $ENABLE"
1958 # Test if each explicitly referenced package exists
1959 for i in $PACKAGES ; do
1960 j=`echo $i | sed 's/[-+]//'`
1961 if test ! -d "$ROOTDIR/pkg/$j" ; then
1962 echo "Error: can't find package $i at \"$ROOTDIR/pkg/$i\""
1963 exit 1
1964 fi
1965 echo $i >> ./.tmp_pack
1966 done
1967 PACKAGES=
1968 for i in `grep -v "-" ./.tmp_pack | sort | uniq` ; do
1969 PACKAGES="$PACKAGES $i"
1970 done
1971 rm -f ./.tmp_pack
1972 echo " packages are: $PACKAGES"
1973
1974 # Check for package MNC: if NetCDF is available, then build the MNC
1975 # template files ; otherwise, delete mnc from the list of packages.
1976 echo $PACKAGES | grep ' mnc ' > /dev/null 2>&1
1977 RETVAL=$?
1978 if test "x$RETVAL" = x0 ; then
1979 if test "x$HAVE_NETCDF" != xt ; then
1980 cat <<EOF
1981
1982 *********************************************************************
1983 WARNING: the "mnc" package was enabled but tests failed to compile
1984 NetCDF applications. Please check that:
1985
1986 1) NetCDF is correctly installed for this compiler and
1987 2) the LIBS variable (within the "optfile") specifies the correct
1988 NetCDF library to link against.
1989
1990 Due to this failure, the "mnc" package is now DISABLED.
1991 *********************************************************************
1992
1993 EOF
1994 PACKAGES=`echo $PACKAGES | sed -e 's/mnc//g'`
1995 DISABLE="$DISABLE mnc"
1996 else
1997 ( cd $ROOTDIR"/pkg/mnc" && $MAKE testclean && $MAKE templates ) > make_mnc.errors 2>&1
1998 RETVAL=$?
1999 if test "x${RETVAL}" = x0 ; then
2000 rm -f make_mnc.errors
2001 else
2002 echo "Error: problem encountered while building source files in pkg/mnc:"
2003 cat make_mnc.errors 1>&2
2004 exit 1
2005 fi
2006 fi
2007 fi
2008
2009 # Check for package PROFILES: if NetCDF is not available,
2010 # then delete profiles from the list of available packages.
2011 echo $PACKAGES | grep ' profiles ' > /dev/null 2>&1
2012 RETVAL=$?
2013 if test "x$RETVAL" = x0 ; then
2014 if test "x$HAVE_NETCDF" != xt ; then
2015 cat <<EOF
2016
2017 *********************************************************************
2018 WARNING: the "profiles" package was enabled but tests failed to
2019 compile NetCDF applications. Please check that:
2020
2021 1) NetCDF is correctly installed for this compiler and
2022 2) the LIBS variable (within the "optfile") specifies the correct
2023 NetCDF library to link against.
2024
2025 Due to this failure, the "profiles" package is now DISABLED.
2026 *********************************************************************
2027
2028 EOF
2029 PACKAGES=`echo $PACKAGES | sed -e 's/profiles//g'`
2030 DISABLE="$DISABLE profiles"
2031 fi
2032 fi
2033
2034 echo " applying package dependency rules"
2035 ck=
2036 while test "x$ck" != xtt ; do
2037 i=0
2038 # rtot=${#PNAME[@]}
2039 rtot=$nname
2040 while test $i -le $rtot ; do
2041
2042 # Is $pname in the current $PACKAGES list?
2043 # pname=${PNAME[$i]}
2044 tmp="pname=\"\$PNAME_$i\""
2045 eval $tmp
2046 pin="f"
2047 for p in $PACKAGES ; do
2048 if test "x$p" = "x$pname" ; then
2049 pin="t"
2050 fi
2051 done
2052
2053 # Is the DNAME entry a (+) or (-) rule ?
2054 tmp="dname=\"\$DNAME_$i\""
2055 eval $tmp
2056 plus="-"
2057 echo $dname | grep '^+' > /dev/null 2>&1
2058 RETVAL=$?
2059 if test "x$RETVAL" = x0 ; then
2060 plus="+"
2061 fi
2062
2063 # Is $dname in the current $PACKAGES list?
2064 dname=`echo $dname | sed -e 's/^[+-]//'`
2065 din="f"
2066 for p in $PACKAGES ; do
2067 if test "x$p" = "x$dname" ; then
2068 din="t"
2069 fi
2070 done
2071
2072 # Do we need to add $dname according to the dependency rules?
2073 if test "x$pin" = xt -a "x$plus" = "x+" -a "x$din" = xf ; then
2074 #echo " " $pname ": need to add :" $dname
2075 in_dis="f"
2076 for dis in $DISABLE ; do
2077 if test "x$dis" = "x$dname" ; then
2078 in_dis="t"
2079 fi
2080 done
2081 if test "x$in_dis" = xt ; then
2082 echo "Error: can't satisfy package dependencies:"
2083 echo " \"$dname\" is required by the dependency rules"
2084 echo " but is disallowed by the DISABLE settings"
2085 exit 1
2086 else
2087 PACKAGES="$PACKAGES $dname"
2088 ck=
2089 fi
2090 fi
2091
2092 # Do we need to get rid of $dname according to the dependency rules?
2093 if test "x$pin" = xt -a "x$plus" = "x-" -a "x$din" = xt; then
2094 echo "Error: can't satisfy package dependencies:"
2095 echo " \"$pname\" was requested but is disallowed by"
2096 echo " the dependency rules for \"$dname\""
2097 exit 1
2098 fi
2099 i=`echo "$i + 1" | bc -l`
2100 #i=$(( $i + 1 ))
2101 done
2102 ck=$ck"t"
2103 done
2104 echo " packages are: $PACKAGES"
2105 for i in $PACKAGES ; do
2106 adr="$ROOTDIR/pkg/$i"
2107 if test -d $adr ; then
2108 SOURCEDIRS="$SOURCEDIRS $adr"
2109 INCLUDEDIRS="$INCLUDEDIRS $adr"
2110 if test "x$i" = xautodiff ; then
2111 AUTODIFF_PKG_USED=t
2112 fi
2113 else
2114 echo "Error: the directory \"$adr\" for package $i doesn't exist"
2115 exit 1
2116 fi
2117 done
2118
2119 # Create a list of #define and #undef to enable/disable packages
2120 PACKAGES_DOT_H=PACKAGES_CONFIG.h
2121 # The following UGLY HACK sets multiple "#undef"s and it needs to go
2122 # away. On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h
2123 # file would eventually be split up so that all package-related #define
2124 # statements could be separated and handled only by genmake.
2125 names=`ls -1 "$ROOTDIR/pkg"`
2126 all_pack=
2127 DISABLED_PACKAGES=
2128 for n in $names ; do
2129 if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
2130 has_pack="f"
2131 for pack in $PACKAGES ; do
2132 if test "x$pack" = "x$n" ; then
2133 has_pack="t"
2134 break
2135 fi
2136 done
2137 if test "x$has_pack" = xf ; then
2138 undef=`echo "ALLOW_$n" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2139 DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
2140 fi
2141 fi
2142 done
2143 ENABLED_PACKAGES=
2144 for i in $PACKAGES ; do
2145 def=`echo "ALLOW_$i" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2146 ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
2147 #eh3 DEFINES="$DEFINES -D$def"
2148
2149 #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
2150 case $i in
2151 aim_v23)
2152 ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
2153 echo "Warning: ALLOW_AIM is set to enable aim_v23."
2154 ;;
2155 esac
2156 #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
2157
2158 done
2159
2160 echo " Adding STANDARDDIRS"
2161 BUILDDIR=${BUILDDIR:-.}
2162 if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
2163 STANDARDDIRS="eesupp model"
2164 fi
2165 if test "x$STANDARDDIRS" != x ; then
2166 for d in $STANDARDDIRS ; do
2167 adr="$ROOTDIR/$d/src"
2168 if test ! -d $adr ; then
2169 echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2170 echo " is correct and that you correctly specified the STANDARDDIRS option"
2171 exit 1
2172 else
2173 SOURCEDIRS="$SOURCEDIRS $adr"
2174 fi
2175 adr="$ROOTDIR/$d/inc"
2176 if test ! -d $adr ; then
2177 echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2178 echo " is correct and that you correctly specified the STANDARDDIRS option"
2179 exit 1
2180 else
2181 INCLUDEDIRS="$INCLUDEDIRS $adr"
2182 fi
2183 done
2184 fi
2185
2186 echo " Searching for *OPTIONS.h files in order to warn about the presence"
2187 echo " of \"#define \"-type statements that are no longer allowed:"
2188 CPP_OPTIONS=
2189 CPP_EEOPTIONS=
2190 spaths=". $INCLUDEDIRS"
2191 names=`ls -1 "$ROOTDIR/pkg"`
2192 for i in $spaths ; do
2193 try="$i/CPP_OPTIONS.h"
2194 if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
2195 echo " found CPP_OPTIONS=\"$try\""
2196 CPP_OPTIONS="$try"
2197 # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
2198 for n in $names ; do
2199 test_for_package_in_cpp_options $CPP_OPTIONS $n
2200 done
2201 fi
2202 try="$i/CPP_EEOPTIONS.h"
2203 if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
2204 echo " found CPP_EEOPTIONS=\"$try\""
2205 # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
2206 #**** not yet enabled ****
2207 # test_for_mpi_in_cpp_eeoptions $try
2208 #**** not yet enabled ****
2209 CPP_EEOPTIONS="$try"
2210 fi
2211 done
2212 if test "x$CPP_OPTIONS" = x ; then
2213 echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
2214 exit 1
2215 fi
2216
2217 # Here, we build the list of files to be "run through" the adjoint
2218 # compiler.
2219 if test -f ./adSrcFiles.tmp ; then
2220 rm -f ./adSrcFiles.tmp
2221 fi
2222 echo " Creating the list of files for the adjoint compiler."
2223 for i in $SOURCEDIRS ; do
2224 list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
2225 for j in $list_files ; do
2226 cat $i/$j >> adSrcFiles.tmp
2227 done
2228 done
2229 if test ! "x"$FS = "x.f" ; then
2230 cat adSrcFiles.tmp | sed -e "s/\.f/.$FS/g" > adSrcFiles.tmp_f
2231 mv -f adSrcFiles.tmp_f adSrcFiles.tmp
2232 fi
2233
2234 echo
2235 echo "=== Creating the Makefile ==="
2236 echo " setting INCLUDES"
2237 for i in $INCLUDEDIRS ; do
2238 if test ! -d $i ; then
2239 echo "Warning: can't find INCLUDEDIRS=\"$i\""
2240 fi
2241 done
2242
2243 if test ! "x$DIVA" = x ; then
2244 echo " Creating the pseudo-MPI include directory"
2245 INCLUDES="-I./mpi_headers $INCLUDES"
2246 rm -rf ./mpi_headers
2247 mkdir -p ./mpi_headers
2248
2249 if test "x$MPIINCLUDEDIR" = x ; then
2250 if test "x$MPIHOME" = x ; then
2251 MPIHOME='/usr'
2252 fi
2253 MPIINCLUDEDIR='$MPIHOME/include'
2254 fi
2255
2256 if test -r $MPIINCLUDEDIR/mpif.h ; then
2257 for i in $MPI_HEADER_FILES; do
2258 cp -p $MPIINCLUDEDIR/$i ./mpi_headers
2259 done
2260
2261 perl -i -pe 's/MPI_DISPLACEMENT_CURRENT=-1_8/MPI_DISPLACEMENT_CURRENT=-1/g' mpi_headers/mpif.h
2262 else
2263 echo " We cannot create a copy of mpif.h!"
2264 # exit -1
2265 fi
2266 fi
2267
2268 echo " Determining the list of source and include files"
2269 rm -rf .links.tmp
2270 mkdir .links.tmp
2271 touch .links.tmp/foo
2272 if test ! -r ".links.tmp/foo" ; then
2273 echo
2274 echo "ERROR : something is wrong with your directory permissions or"
2275 echo " your user file-creation mask (\"umask\") since creating a"
2276 echo " sub-dir, touch-ing a file within it, and then reading it is"
2277 echo " not working. Please try setting your umask to something"
2278 echo " sane such as:"
2279 echo
2280 echo " umask 0002"
2281 echo
2282 echo " and please verify that you have the proper permissions for"
2283 echo " creating sub-directories and then reading files created"
2284 echo " within them."
2285 echo
2286 exit 1
2287 fi
2288 rm -f .links.tmp/foo
2289
2290 if test "x$OPENAD" != x ; then
2291 OAD_DONT_COMPILE="/dev/null"
2292 OAD_DONT_TRANSFORM="/dev/null"
2293 OAD_KEEP_ORIGINAL="/dev/null"
2294 OAD_CB2M_FILES="/dev/null"
2295 echo " looking for dontCompile file: "
2296 for i in "." $MODS ; do
2297 if test -r $i"/dontCompile" ; then
2298 OAD_DONT_COMPILE=$i"/dontCompile"
2299 echo " found $OAD_DONT_COMPILE"
2300 break
2301 fi
2302 done
2303 echo " looking for dontTransform file: "
2304 for i in "." $MODS ; do
2305 if test -r $i"/dontTransform" ; then
2306 OAD_DONT_TRANSFORM=$i"/dontTransform"
2307 echo " found $OAD_DONT_TRANSFORM"
2308 break
2309 fi
2310 done
2311 echo " looking for keepOriginal file: "
2312 for i in "." $MODS ; do
2313 if test -r $i"/keepOriginal" ; then
2314 OAD_KEEP_ORIGINAL=$i"/keepOriginal"
2315 echo " found $OAD_KEEP_ORIGINAL"
2316 break
2317 fi
2318 done
2319 echo " looking for cb2mFiles: "
2320 for i in "." $MODS ; do
2321 if test -r $i"/cb2mFiles" ; then
2322 OAD_CB2M_FILES=$i"/cb2mFiles"
2323 echo " found $OAD_CB2M_FILES"
2324 break
2325 fi
2326 done
2327 echo " OpenAD exceptions: "
2328 fi
2329
2330 echo "# This section creates symbolic links" > srclinks.tmp
2331 echo "" >> srclinks.tmp
2332 printf 'F77_SRC_FILES = ' > F77srclist.tmp
2333 printf 'NON_AD_F77_SRC_FILES = ' > nonADF77srclist.tmp
2334 printf 'C_SRC_FILES = ' > csrclist.tmp
2335 printf 'F90_SRC_FILES = ' > F90srclist.tmp
2336 printf 'H_SRC_FILES = ' > hsrclist.tmp
2337 printf 'AD_FLOW_FILES = ' > ad_flow_files.tmp
2338 alldirs="$SOURCEDIRS $INCLUDEDIRS ."
2339 for d in $alldirs ; do
2340 deplist=
2341 sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
2342 sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
2343 if test "x$OPENAD" != x ; then
2344 sfiles=`( echo $sfiles | grep -v _cb2m\. )`
2345 fi
2346 for sf in $sfiles ; do
2347 if test ! -r ".links.tmp/$sf" ; then
2348 if test -f "$d/$sf" ; then
2349 ignore_f=f
2350 case $d/$sf in
2351 ./$PACKAGES_DOT_H)
2352 ignore_f=t
2353 ;;
2354 ./AD_CONFIG.h)
2355 ignore_f=t
2356 ;;
2357 ./FC_NAMEMANGLE.h)
2358 ignore_f=t
2359 ;;
2360 ./BUILD_INFO.h)
2361 ignore_f=t
2362 ;;
2363 ./EMBEDDED_FILES.h)
2364 ignore_f=t
2365 ;;
2366 *)
2367 # For the local directory *ONLY*,
2368 # ignore all soft-links
2369 if test "x$HAVE_TEST_L" = xt -a "x$d" = x. -a -L $sf ; then
2370 ignore_f=t
2371 else
2372 touch .links.tmp/$sf
2373 deplist="$deplist $sf"
2374 fi
2375 ;;
2376 esac
2377 if test "x$ignore_f" = xf ; then
2378 extn=`echo $sf | $AWK -F. '{print $NF}'`
2379 case $extn in
2380 F)
2381 echo " \\" >> F77srclist.tmp
2382 printf " $sf" >> F77srclist.tmp
2383 if test "x$OPENAD" != x ; then
2384 basename=${sf%%.F}
2385 isAD=`egrep ^$basename.f'[ ]*' adSrcFiles.tmp`
2386 if test -z "$isAD" ; then
2387 toBeIgnored=`egrep ^$basename'[ ]*' ${OAD_DONT_COMPILE}`
2388 if test -z "$toBeIgnored" ; then
2389 echo " \\" >> nonADF77srclist.tmp
2390 printf " $sf" >> nonADF77srclist.tmp
2391 else
2392 echo " not to be compiled : $sf"
2393 fi
2394 else # file is initially listed as an AD file we want to exclude it
2395 # or we want to retain the untransformed version
2396 notToBeTransformed=`egrep ^$basename'[ ]*' ${OAD_DONT_TRANSFORM}`
2397 untransformedVersionToBeKept=`egrep ^$basename'[ ]*' ${OAD_KEEP_ORIGINAL}`
2398 if test -n "$notToBeTransformed"; then
2399 echo " not to be transformed: $sf"
2400 fi
2401 if test -n "$untransformedVersionToBeKept" ; then
2402 echo " original to be kept : $sf"
2403 fi
2404 if test -n "$notToBeTransformed" -o -n "$untransformedVersionToBeKept" ; then
2405 echo " \\" >> nonADF77srclist.tmp
2406 printf " $sf" >> nonADF77srclist.tmp
2407 fi
2408 fi
2409 fi
2410 ;;
2411 F90)
2412 echo " \\" >> F90srclist.tmp
2413 printf " $sf" >> F90srclist.tmp
2414 ;;
2415 c)
2416 echo " \\" >> csrclist.tmp
2417 printf " $sf" >> csrclist.tmp
2418 ;;
2419 h)
2420 echo " \\" >> hsrclist.tmp
2421 printf " $sf" >> hsrclist.tmp
2422 ;;
2423 flow)
2424 echo " \\" >> ad_flow_files.tmp
2425 printf " $sf" >> ad_flow_files.tmp
2426 ;;
2427 esac
2428 fi
2429 fi
2430 fi
2431 done
2432 if test "x$deplist" != x ; then
2433 if test "$d" != "." ; then
2434 echo "" >> srclinks.tmp
2435 echo "# These files are linked from $d" >> srclinks.tmp
2436 echo "$deplist :" >> srclinks.tmp
2437 # We need to make sure that the link isn't already there.
2438 # This may happen when make thinks that a header file has to be "remade"
2439 # because a module it depends on has changed. In this case we do nothing.
2440 printf "\tif [ ! -L \$@ ]; then \$(LN) %s/\$@ \$@; fi\n" $d >> srclinks.tmp
2441 fi
2442 fi
2443 done
2444 rm -rf .links.tmp
2445 echo "" >> F77srclist.tmp
2446 echo "" >> nonADF77srclist.tmp
2447 echo "" >> csrclist.tmp
2448 echo "" >> F90srclist.tmp
2449 echo "" >> hsrclist.tmp
2450 echo "" >> ad_flow_files.tmp
2451
2452 if test -f $MAKEFILE ; then
2453 mv -f $MAKEFILE "$MAKEFILE.bak"
2454 fi
2455 echo " Writing makefile: $MAKEFILE"
2456 echo "# Multithreaded + multi-processing makefile for:" > $MAKEFILE
2457 echo "# $MACHINE" >> $MAKEFILE
2458 echo "# This makefile was generated automatically on" >> $MAKEFILE
2459 echo "# $THISDATE" >> $MAKEFILE
2460 echo "# by the command:" >> $MAKEFILE
2461 echo "# $0 $G2ARGS" >> $MAKEFILE
2462 echo "# executed by:" >> $MAKEFILE
2463 echo "# ${THISUSER}@${THISHOST}:${THISCWD}" >> $MAKEFILE
2464
2465 EXE_AD=$EXECUTABLE"_ad"
2466 EXE_FTL=$EXECUTABLE"_ftl"
2467 EXE_SVD=$EXECUTABLE"_svd"
2468
2469 cat >>$MAKEFILE <<EOF
2470 #
2471 # OPTFILE="$OPTFILE"
2472 #
2473 # BUILDDIR : Directory where object files are written
2474 # SOURCEDIRS : Directories containing the source (.F) files
2475 # INCLUDEDIRS : Directories containing the header-source (.h) files
2476 # EXEDIR : Directory where executable that is generated is written
2477 # EXECUTABLE : Full path of executable binary
2478 #
2479 # CPP : C-preprocessor command
2480 # INCLUDES : Directories searched for header files
2481 # DEFINES : Macro definitions for CPP
2482 # MAKEDEPEND : Dependency generator
2483 # KPP : Special preprocessor command (specific to platform)
2484 # KFLAGS : Flags for KPP
2485 # FC : Fortran compiler command
2486 # FFLAGS : Configuration/debugging options for FC
2487 # FOPTIM : Optimization options for FC
2488 # LINK : Command for link editor program
2489 # LIBS : Library flags /or/ additional optimization/debugging flags
2490
2491 ROOTDIR = ${ROOTDIR}
2492 BUILDDIR = ${BUILDDIR}
2493 SOURCEDIRS = ${SOURCEDIRS}
2494 INCLUDEDIRS = ${INCLUDEDIRS}
2495 EXEDIR = ${EXEDIR}
2496 EXECUTABLE = \$(EXEDIR)/${EXECUTABLE}
2497 TOOLSDIR = ${TOOLSDIR}
2498
2499 #eh3 new defines for the adjoint work
2500 AUTODIFF = ${ROOTDIR}/pkg/autodiff
2501 EXE_AD = ${EXE_AD}
2502 EXE_FTL = ${EXE_FTL}
2503 EXE_SVD = ${EXE_SVD}
2504
2505 ENABLED_PACKAGES = ${ENABLED_PACKAGES}
2506 DISABLED_PACKAGES = ${DISABLED_PACKAGES}
2507
2508 # These files are created by Makefile
2509 SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h BUILD_INFO.h
2510 EOF
2511
2512 if test "x$EMBED_SRC" = xt ; then
2513 echo "EMBEDDED_FILES = EMBEDDED_FILES.h" >>$MAKEFILE
2514 else
2515 echo "EMBEDDED_FILES = " >>$MAKEFILE
2516 fi
2517
2518 # Note: figure out some way to add Hyades JAM libraries here
2519 cat >>$MAKEFILE <<EOF
2520 # Unix ln (link)
2521 LN = ${LN}
2522 # C preprocessor
2523 CPP = cat \$< | ${S64} | ${CPP}
2524 # Dependency generator
2525 MAKEDEPEND = ${MAKEDEPEND}
2526 # Special preprocessor (KAP on DECs, FPP on Crays)
2527 KPP = ${KPP}
2528 # Fortran compiler
2529 FC = ${FC}
2530 # Fortran compiler
2531 F90C = ${F90C}
2532 # C compiler
2533 CC = ${CC}
2534 # Link editor
2535 LINK = ${LINK} ${LDADD}
2536
2537 # Defines for CPP
2538 DEFINES = ${DEFINES}
2539 # Includes for CPP
2540 INCLUDES = ${INCLUDES}
2541 # Flags for KPP
2542 KFLAGS1 = ${KFLAGS1}
2543 KFLAGS2 = ${KFLAGS2}
2544 # Optim./debug for FC
2545 FFLAGS = ${FFLAGS} ${FEXTRAFLAGS}
2546 FOPTIM = ${FOPTIM}
2547 # Optim./debug for FC
2548 F90FLAGS = ${F90FLAGS}
2549 F90OPTIM = ${F90OPTIM}
2550 F90FIXEDFORMAT = ${F90FIXEDFORMAT}
2551 # Flags for CC
2552 CFLAGS = ${CFLAGS}
2553 # Files that should not be optimized
2554 NOOPTFILES = ${NOOPTFILES}
2555 NOOPTFLAGS = ${NOOPTFLAGS}
2556 # Flags and libraries needed for linking
2557 LIBS = ${LIBS}
2558 # Name of the Mekfile
2559 MAKEFILE=${MAKEFILE}
2560
2561 EOF
2562
2563 cat F77srclist.tmp >> $MAKEFILE
2564 cat nonADF77srclist.tmp >> $MAKEFILE
2565 cat csrclist.tmp >> $MAKEFILE
2566 cat F90srclist.tmp >> $MAKEFILE
2567 cat hsrclist.tmp >> $MAKEFILE
2568 cat ad_flow_files.tmp >> $MAKEFILE
2569
2570 rm -f F77srclist.tmp nonADF77srclist.tmp csrclist.tmp F90srclist.tmp hsrclist.tmp ad_flow_files.tmp
2571
2572 echo >> $MAKEFILE
2573
2574 # add definitions for preprocessed sources
2575 # and note that not all systems allow case sensitive extensions
2576 # hence the $FS and $FS90 here.
2577 # for fixed format f90 files we use ff90 or FF90 resp
2578 # but these are not expected to be the original source files
2579
2580 echo 'F77_PP_SRC_FILES = $(F77_SRC_FILES:.F=.'$FS')' >> $MAKEFILE
2581 echo 'F90_PP_SRC_FILES = $(F90_SRC_FILES:.F90=.'$FS90')' >> $MAKEFILE
2582 echo 'OBJFILES= $(F77_SRC_FILES:.F=.o) $(C_SRC_FILES:.c=.o) $(F90_SRC_FILES:.F90=.o)' >> $MAKEFILE
2583 echo 'FLOFILES = $(AD_FLOW_FILES:.flow=.flowdir)' >> $MAKEFILE
2584 echo >> $MAKEFILE
2585 echo '.SUFFIXES:' >> $MAKEFILE
2586 echo '.SUFFIXES: .o .'$FS' .p .F .c .f'$FS90' .'$FS90' .FF90 .F90 .flowdir .flow' >> $MAKEFILE
2587
2588 cat >>$MAKEFILE <<EOF
2589
2590 all: \$(EXECUTABLE)
2591 \$(EXECUTABLE): \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(OBJFILES) \$(EMBEDDED_FILES)
2592 @echo Creating \$@ ...
2593 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
2594 depend:
2595 @make links
2596 \$(MAKEDEPEND) -o .$FS \$(DEFINES) \$(INCLUDES) \$(F77_SRC_FILES)
2597 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
2598 -rm -f makedepend.out
2599
2600 lib: libmitgcmuv.a
2601
2602 libmitgcmuv.a: \$(OBJFILES)
2603 ar rcv libmitgcmuv.a \$(OBJFILES)
2604 ar d libmitgcmuv.a main.o
2605
2606 links: \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(SPECIAL_FILES)
2607
2608 small_f: \$(F77_PP_SRC_FILES) \$(F90_PP_SRC_FILES)
2609
2610 output.txt: \$(EXECUTABLE)
2611 @printf 'running ... '
2612 @\$(EXECUTABLE) > \$@
2613
2614 clean:
2615 -rm -rf *.p *.$FS90 *.mod ${RMFILES} work.{pc,pcl} *.template
2616 -rm -rf *.o
2617 -rm -rf *.$FS *.flowdir
2618 -rm -rf *.f$FS90 *_mod.h *_mod.F90 *.FF90 *.mod-whirl ad_input*
2619 -rm -rf temp.sed
2620 Clean:
2621 @make clean
2622 @make cleanlinks
2623 -rm -f \$(SPECIAL_FILES)
2624 -rm -f genmake_state genmake_*optfile genmake_warnings make.log run.log f90mkdepend.log *.bak
2625 -rm -f taf_command taf_output taf_ad.log taf_ad_flow.log
2626 CLEAN:
2627 @make Clean
2628 -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
2629 -find \$(EXEDIR) -name "*.data" -exec rm {} \;
2630 -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
2631 -rm -f \$(EXECUTABLE) \$(EXE_AD) *.txt STD* *diagnostics.log datetime
2632 -rm -f *_MIT_CE_000.opt0000 costfunction*0000
2633 -rm -rf mnc_test_*
2634
2635 #eh3 Makefile: makefile
2636 makefile:
2637 $THIS_SCRIPT $G2ARGS
2638 cleanlinks:
2639 -find . -type l -exec rm {} \;
2640
2641 # Special targets (SPECIAL_FILES) which are created by make
2642 ${PACKAGES_DOT_H}:
2643 @echo Creating \$@ ...
2644 @$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) > \$@
2645 AD_CONFIG.h:
2646 @echo Creating \$@ ...
2647 @$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 > \$@
2648 FC_NAMEMANGLE.h:
2649 @echo Creating \$@ ...
2650 echo "$FC_NAMEMANGLE" > \$@
2651
2652 BUILD_INFO.h:
2653 @echo Creating \$@ ...
2654 EOF
2655
2656 test ! "x$THISVER" = x && echo " -echo \"#define THISVER '$THISVER'\" > \$@" >> $MAKEFILE
2657 test ! "x$THISUSER" = x && echo " -echo \"#define THISUSER '$THISUSER'\" >> \$@" >> $MAKEFILE
2658 test ! "x$THISDATE" = x && echo " -echo \"#define THISDATE '$THISDATE'\" >> \$@" >> $MAKEFILE
2659 test ! "x$THISHOST" = x && echo " -echo \"#define THISHOST '$THISHOST'\" >> \$@" >> $MAKEFILE
2660
2661 if test "x$EMBED_SRC" = xt ; then
2662 cat >>$MAKEFILE <<EOF
2663
2664 decode_files.o : EMBEDDED_FILES.h
2665
2666 ## \$(F77_PP_SRC_FILES)
2667 all_fF.tar.gz : \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(F77_PP_SRC_FILES) Makefile
2668 @echo Creating \$@ ...
2669 -tar -hcf all_fF.tar \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(F77_PP_SRC_FILES) Makefile
2670 -rm -f all_fF.tar.gz
2671 -gzip all_fF.tar
2672
2673 EMBEDDED_FILES.h : all_fF.tar.gz
2674 @echo Creating \$@ ...
2675 -\${ROOTDIR}/tools/embed_encode/encode_files EMBEDDED_FILES.h all_fF.tar.gz
2676
2677 EOF
2678 fi
2679
2680 cat >>$MAKEFILE <<EOF
2681
2682 # The normal chain of rules is ( .F - .$FS - .o )
2683
2684 ## This nullifies any default implicit rules concerning these two file types:
2685 ## %.o : %.F
2686
2687 .F.$FS:
2688 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2689 .$FS.o:
2690 \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
2691 .F90.$FS90:
2692 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2693 .FF90.f$FS90:
2694 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2695 .$FS90.o:
2696 \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
2697 .f$FS90.o:
2698 cp \$< \$(basename \$<).f90
2699 \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$(F90FIXEDFORMAT) \$(basename \$<).f90
2700 .c.o:
2701 \$(CC) \$(CFLAGS) \$(DEFINES) \$(INCLUDES) -c \$<
2702 .flow.flowdir:
2703 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2704
2705 # Special exceptions that use the ( .F - .p - .$FS - .o ) rule-chain
2706 .F.p:
2707 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2708 .p.$FS:
2709 \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
2710
2711 EOF
2712
2713 #=========================================
2714 #=== Automatic Differentiation Rules ===
2715 #=== for TAMC/TAF ======================
2716
2717 if test "x$OPENAD" == x ; then
2718
2719 cat >>$MAKEFILE <<EOF
2720
2721 TAMC = ${TAMC}
2722 TAF = ${TAF}
2723
2724 TAF_EXTRA = ${TAF_EXTRA}
2725 TAMC_EXTRA = ${TAMC_EXTRA}
2726
2727 EOF
2728
2729 ad_vars="AD_TAMC_FLAGS AD_TAF_FLAGS"
2730 ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF_FLAGS"
2731 ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
2732 for i in $ad_vars ; do
2733 name=$i
2734 t1="t2=\$"`echo "$i"`
2735 eval $t1
2736 printf "%-20s = " $name >> $MAKEFILE
2737 echo "$t2" | sed -e 's| \+| |g' >> $MAKEFILE
2738 done
2739
2740 echo " Add the source list for AD code generation"
2741 echo >> $MAKEFILE
2742 printf "AD_FILES = " >> $MAKEFILE
2743 AD_FILES=`cat adSrcFiles.tmp`
2744 for i in $AD_FILES ; do
2745 echo " \\" >> $MAKEFILE
2746 printf " $i" >> $MAKEFILE
2747 done
2748 echo >> $MAKEFILE
2749 rm -f adSrcFiles.tmp
2750
2751 cat >>$MAKEFILE <<EOF
2752
2753 # ... AD ...
2754 adall: \$(EXE_AD)
2755 adtaf: ad_taf_output.$FS
2756 adtamc: ad_tamc_output.$FS
2757
2758 ad_input_code.$FS: \$(AD_FILES) \$(H_SRC_FILES)
2759 @$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
2760 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
2761 -rm -f ad_config.template
2762 @make \$(F77_PP_SRC_FILES)
2763 @make \$(FLOFILES)
2764 cat \$(FLOFILES) \$(AD_FILES) > ad_input_code.$FS
2765
2766 ad_taf_output.$FS: ad_input_code.$FS
2767 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2768 ls -l ad_input_code_ad.$FS
2769 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2770
2771 adtafonly:
2772 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2773 ls -l ad_input_code_ad.$FS
2774 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2775
2776 \${EXE_AD}: ad_taf_output.o \$(OBJFILES)
2777 \$(LINK) -o \${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
2778
2779 ad_tamc_output.$FS: ad_input_code.$FS
2780 \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.$FS
2781 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.$FS
2782
2783 ad_tamc: ad_tamc_output.o \$(OBJFILES)
2784 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
2785
2786 adonlyfwd:
2787 patch < \$(TOOLSDIR)/ad_taf_output.f.onlyfwd.diff
2788
2789 adtrick:
2790 patch < \$(TOOLSDIR)/ad_taf_output.f.adtrick.diff
2791
2792 # ... FTL ...
2793 ftlall: ftl_taf
2794 ftltaf: ftl_taf_output.$FS
2795 ftltamc: ftl_tamc_output.$FS
2796
2797 ftl_input_code.$FS: \$(AD_FILES) \$(H_SRC_FILES)
2798 @$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
2799 cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
2800 -rm -f ftl_config.template
2801 @make \$(F77_PP_SRC_FILES)
2802 @make \$(AD_FLOW_FILES)
2803 cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.$FS
2804
2805 ftl_taf_output.$FS: ftl_input_code.$FS
2806 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
2807 ls -l ftl_input_code_ftl.$FS
2808 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
2809
2810 ftltafonly:
2811 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
2812 ls -l ftl_input_code_ftl.$FS
2813 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
2814
2815 ftl_taf: ftl_taf_output.o \$(OBJFILES)
2816 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
2817
2818 ftl_tamc_output.$FS: ftl_input_code.$FS
2819 \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.$FS
2820 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.$FS
2821
2822 ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
2823 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
2824
2825
2826 # ... SVD ...
2827 svdtaf: ad_taf_output.$FS ftl_taf_output.$FS
2828 @echo "--->>> Only ran TAF to generate SVD code! <<<---"
2829 @echo "--->>> Do make svdall afterwards to compile. <<<---"
2830 svdall: svd_touch svd_taf
2831
2832 svd_taf: \$(OBJFILES)
2833 \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
2834
2835 @echo "--->>> Only COMPILE svd code! <<<---"
2836 @echo "--->>> Assumes you previously <<<---"
2837 @echo "--->>> did make svdtaf <<<---"
2838
2839 svd_touch:
2840 @echo "--->>> Only COMPILE svd code! <<<---"
2841 @echo "--->>> Assumes you previously <<<---"
2842 @echo "--->>> did make svdtaf <<<---"
2843 touch ad_taf_output.$FS ftl_taf_output.$FS
2844 \$(FC) \$(FFLAGS) \$(FOPTIM) -c ad_taf_output.$FS
2845 \$(FC) \$(FFLAGS) \$(FOPTIM) -c ftl_taf_output.$FS
2846 @$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
2847 cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
2848 -rm -f ftl_config.template
2849
2850 EOF
2851
2852 fi
2853
2854 #=== for OpenAD ========================
2855
2856 if test "x$OPENAD" != x ; then
2857
2858 # ============ begin OpenAD specific section ==============
2859
2860 cat >>$MAKEFILE <<EOF
2861
2862 # all the source files linked from the various locations:
2863 ALL_LINKED_FILES= \
2864 \$(F77_SRC_FILES) \
2865 \$(C_SRC_FILES) \
2866 \$(H_SRC_FILES) \
2867 \$(F90_SRC_FILES) \
2868 \$(SPECIAL_FILES)
2869
2870 ifndef OPENADROOT
2871 \$(error "Error: environment variable OPENADROOT not defined!")
2872 endif
2873
2874 ifndef XAIFSCHEMAROOT
2875 \$(error "Error: environment variable XAIFSCHEMAROOT not defined!")
2876 endif
2877
2878 ifndef XAIFBOOSTERROOT
2879 \$(error "Error: environment variable XAIFBOOSTERROOT not defined!")
2880 endif
2881
2882 EOF
2883
2884 echo " Add the source list for common block to module conversion "
2885 echo >> $MAKEFILE
2886 printf "CB2M_F90_SRC_NAMES = " >> $MAKEFILE
2887 for i in `cat ${OAD_CB2M_FILES}` ; do
2888 echo " \\" >> $MAKEFILE
2889 printf " $i" >> $MAKEFILE
2890 done
2891 echo >> $MAKEFILE
2892
2893 echo " Add the source list for AD code generation"
2894 echo >> $MAKEFILE
2895 printf "AD_FILES = " >> $MAKEFILE
2896 for i in `cat ${OAD_CB2M_FILES}` ; do
2897 echo " \\" >> $MAKEFILE
2898 printf " ${i}_mod.f$FS90" >> $MAKEFILE
2899 done
2900 AD_FILES=`cat adSrcFiles.tmp`
2901 for i in $AD_FILES ; do
2902 basename=${i%%.f}
2903 toBeIgnored=`egrep ^$basename'[ ]*' ${OAD_DONT_COMPILE} ${OAD_DONT_TRANSFORM}`
2904 if test -z "$toBeIgnored" ; then
2905 echo " \\" >> $MAKEFILE
2906 printf " $i" >> $MAKEFILE
2907 fi
2908 done
2909 echo >> $MAKEFILE
2910 rm -f adSrcFiles.tmp
2911
2912 cat >>$MAKEFILE <<EOF
2913
2914 adAll: \$(EXE_AD)
2915 .PHONY: adAll
2916
2917 CB2M_F90_PP_SRC_FILES=\$(addsuffix _mod.f$FS90, \$(CB2M_F90_SRC_NAMES))
2918
2919 .PRECIOUS: \$(CB2M_F90_PP_SRC_FILES) \$(NON_AD_F77_SRC_FILES:.F=_cb2m.f$FS90)
2920
2921 .PHONY: adDepend
2922 adDepend: \$(ALL_LINKED_FILES) \$(addsuffix _mod.h, \$(CB2M_F90_SRC_NAMES)) \$(addsuffix _mod.FF90, \$(CB2M_F90_SRC_NAMES)) \$(F77_SRC_FILES:.F=_cb2m.FF90)
2923 \$(MAKEDEPEND) -o .$FS \$(DEFINES) \$(INCLUDES) \$(F77_SRC_FILES)
2924 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
2925 -rm -f makedepend.out
2926
2927 OPENAD_SUPPORT_F90_SRC_FILES = \
2928 w2f__types.F90 \
2929 OAD_active.F90 \
2930 OAD_cp.F90 \
2931 OAD_rev.F90 \
2932 OAD_tape.F90
2933
2934 OPENAD_SUPPORT_C_SRC_FILES = \
2935 iaddr.c \
2936 timeRatio.c
2937
2938 f95_test_mods.f90: \$(OPENAD_SUPPORT_F90_SRC_FILES:F90=$FS90)
2939 cat \$^ > \$@
2940
2941 f95_test.f90: all_mods.xb.x2w.w2f.pp.f$FS90 \$(NON_AD_F77_SRC_FILES:.F=_cb2m.f$FS90) ad_input_code.w2f.pre.xb.x2w.w2f.td.pp.f$FS90
2942 cat \$^ > \$@
2943
2944 f95_test.out: f95_test_mods.f90 f95_test.f90
2945 f95 -fixed -w=unused -maxcontin=132 -c f95_test_mods.f90 > \$@ 2>&1
2946 f95 -fixed -w=unused -maxcontin=132 -c -fixed f95_test.f90 >> \$@ 2>&1
2947
2948 AD_OBJ_FILES=\$(OPENAD_SUPPORT_F90_SRC_FILES:.F90=.o) \$(OPENAD_SUPPORT_C_SRC_FILES:.c=.o) all_mods.xb.x2w.w2f.pp.o ad_input_code.w2f.pre.xb.x2w.w2f.td.pp.o \$(NON_AD_F77_SRC_FILES:.F=_cb2m.o) \$(C_SRC_FILES:.c=.o) \$(F90_SRC_FILES:.F90=.o)
2949
2950 \$(EXE_AD): \$(ALL_LINKED_FILES) \$(addsuffix _mod.h, \$(CB2M_F90_SRC_NAMES)) \$(AD_OBJ_FILES)
2951 @echo Creating \$@ ...
2952 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(AD_OBJ_FILES) \$(LIBS)
2953
2954 # makefile debug rule
2955 openad: ad_input_code.w2f.pre.xb.x2w.w2f.td.pp.f$FS90
2956 .PHONY: openad
2957
2958 # create the module files
2959 %_mod.FF90 : %.h ../OAD_support/cb2mGetModules.csh ../OAD_support/cb2mGetModules.awk
2960 ../OAD_support/cb2mGetModules.csh $< ../OAD_support/cb2mGetModules.awk
2961
2962 # create the header files
2963 %_mod.h : %.h ../OAD_support/cb2mGetHeaders.csh ../OAD_support/cb2mGetHeaders.awk
2964 ../OAD_support/cb2mGetHeaders.csh $< ../OAD_support/cb2mGetHeaders.awk \$(CB2M_F90_SRC_NAMES)
2965
2966 # change everybody else to use the new module files:
2967 %_cb2m.FF90 : %.F ../OAD_support/cb2mUseModules.bash
2968 ../OAD_support/cb2mUseModules.bash $< ${MPI}
2969
2970 # makefile debug rule
2971 small_f: \$(CB2M_F90_PP_SRC_FILES)
2972 .PHONY: small_f
2973
2974 ad_output.txt: \$(EXE_AD)
2975 @printf 'linking data files ... '
2976 \$(LN) -f ../input_ad/data* ../input_ad/eedata .
2977 \$(LN) -f ../../global_ocean.90x40x15/input/*.bin .
2978 @printf 'running ... '
2979 @./\$(EXE_AD) > \$@
2980
2981 CB2M_AD_FILES=\$(AD_FILES:.f=_cb2m.f$FS90)
2982 ad_input_code.f$FS90: ../OAD_support/maxMinDefs.f \$(CB2M_AD_FILES)
2983 cat \$^ > \$@
2984
2985 # strip all comments and blanks to reduce
2986 # the file size in order to reduce perl's memory requirements
2987 ad_input_code_sf.f$FS90 : ad_input_code.f$FS90
2988 cat \$^ | sed -f ../OAD_support/strip.sed | sed -f ../OAD_support/stop2print.sed > \$@
2989
2990 # mfef90 preprocessing
2991 # expand statement functions
2992 # expose mfef90 specific substring handling
2993 # add the w2f__types module
2994 ad_input_code_sf.w2f.f$FS90: ad_input_code_sf.f$FS90 mfef90 whirl2f whirl2f_be w2f__types.f90
2995 ./mfef90 -r8 -z -F -N132 \$<
2996 mv \$<.B \$(basename \$<).B
2997 ./whirl2f -openad \$(basename \$<).B
2998 cat w2f__types.f90 \$(basename \$<).w2f.f > \$@
2999
3000 # canonicalizer
3001 ad_input_code_sf.w2f.pre.f$FS90: ad_input_code_sf.w2f.f$FS90 preProcess.py
3002 ./preProcess.py -H \$< -o \$@
3003
3004 # F -> WHIRL
3005 # note that the canonicalized version cuts off at col 72
3006 # doing this also for string constants which is ok as long
3007 # as we are in fixed mode and cut of exactly there.
3008 # Otherwise mfef90 patches in spaces to fill up to 72 (or 132)
3009 # characters respectively.
3010 ad_input_code_sf.w2f.pre.B: ad_input_code_sf.w2f.pre.f$FS90 mfef90
3011 ./mfef90 -r8 -z -F \$<
3012 mv \$<.B \$@
3013
3014 # WHIRL -> XAIF
3015 ad_input_code_sf.w2f.pre.xaif : ad_input_code_sf.w2f.pre.B whirl2xaif
3016 ./whirl2xaif -s -n --debug 1 -o \$@ \$<
3017
3018 # XAIF -> XAIF'
3019 ad_input_code_sf.w2f.pre.xb.xaif : ad_input_code_sf.w2f.pre.xaif xaif.xsd xaif_base.xsd xaif_inlinable_intrinsics.xsd xaif_derivative_propagator.xsd xaif_output.xsd openad_adm
3020 ./openad_adm -f -t forward_step -i \$< -c \${XAIFSCHEMAROOT}/schema/examples/inlinable_intrinsics.xaif -o \$@ -I -r
3021
3022 # XAIF' -> WHIRL'
3023 ad_input_code_sf.w2f.pre.xb.x2w.B : ad_input_code_sf.w2f.pre.xb.xaif xaif2whirl
3024 ./xaif2whirl --debug 1 --structured ad_input_code_sf.w2f.pre.B \$<
3025
3026 # WHIRL' -> F'
3027 ad_input_code_sf.w2f.pre.xb.x2w.w2f.f$FS90: ad_input_code_sf.w2f.pre.xb.x2w.B whirl2f whirl2f_be
3028 ./whirl2f -FLIST:ftn_file=\$@ -openad \$<
3029
3030 # insert template directives
3031 ad_input_code_sf.w2f.pre.xb.x2w.w2f.td.f$FS90: ad_input_code_sf.w2f.pre.xb.x2w.w2f.f$FS90 ../OAD_support/insertTemplateDir.bash
3032 ../OAD_support/insertTemplateDir.bash \$< \$@
3033
3034 # postprocess F'
3035 ad_input_code_sf.w2f.pre.xb.x2w.w2f.td.pp.f$FS90: ad_input_code_sf.w2f.pre.xb.x2w.w2f.td.f$FS90 multi-pp.pl ../OAD_support/ad_inline.f \$(wildcard ../OAD_support/ad_template.*.f)
3036 perl multi-pp.pl -inline=../OAD_support/ad_inline.f \$<
3037 # the postprocessor still gets the name wrong
3038 cat \$<.pp | sed 's/RETURN//' > \$@
3039
3040 # extract all transformed modules
3041 all_mods.xb.x2w.w2f.pp.f$FS90: ad_input_code_sf.w2f.pre.xb.x2w.w2f.td.pp.f$FS90
3042 cat \$< | sed -n '/MODULE /,/END MODULE/p' > \$@
3043
3044 # remove the transformed globals module from the
3045 # transformed ad_input_code file
3046 # and remove for now the duplicate variables
3047 # and fix 2 data statements
3048 ad_input_code.w2f.pre.xb.x2w.w2f.td.pp.f$FS90: ad_input_code_sf.w2f.pre.xb.x2w.w2f.td.pp.f$FS90
3049 cat \$< | sed '/MODULE /,/END MODULE/d' | sed '/^ INTEGER(w2f__i4) DOLOOP_UB/d' > \$@
3050
3051 # setup some links
3052 %.xsd:
3053 \$(LN) \${XAIFSCHEMAROOT}/schema/\$@ .
3054
3055 mfef90:
3056 \$(LN) \${OPEN64ROOT}/crayf90/sgi/mfef90 .
3057
3058 # link the support files:
3059 \$(OPENAD_SUPPORT_F90_SRC_FILES) \$(OPENAD_SUPPORT_C_SRC_FILES):
3060 \$(LN) ../OAD_support/\$@ .
3061
3062 whirl2xaif xaif2whirl:
3063 \$(LN) \${OPENADFORTTK}/bin/\$@ .
3064
3065 %.pl:
3066 \$(LN) \${OPENADFORTTK}/bin/\$@ .
3067
3068 preProcess.py:
3069 \$(LN) \${OPENADFORTTK_BASE}/tools/SourceProcessing/\$@ .
3070
3071 whirl2f whirl2f_be:
3072 \$(LN) \${OPEN64ROOT}/whirl2f/\$@ .
3073
3074 openad_adm:
3075 \$(LN) \${XAIFBOOSTERROOT}/xaifBooster/algorithms/BasicBlockPreaccumulationReverse/test/t \$@
3076
3077 # ============ end OpenAD specific section ==============
3078
3079 EOF
3080
3081 fi
3082
3083 #=========================================
3084
3085 if test "x$EXEHOOK" != x ; then
3086 printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE
3087 fi
3088
3089 echo " Making list of \"exceptions\" that need \".p\" files"
3090 for i in $KPPFILES ; do
3091 base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
3092 RETVAL=$?
3093 if test "x$RETVAL" != x0 ; then
3094 echo "Error: unable to add file \"$i\" to the exceptions list"
3095 fi
3096 echo "$base.$FS: $base.p" >> $MAKEFILE
3097 done
3098
3099 echo " Making list of NOOPTFILES"
3100 for i in $NOOPTFILES ; do
3101 base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
3102 RETVAL=$?
3103 if test "x$RETVAL" != x0 ; then
3104 echo "Error: unable to add file \"$i\" to the exceptions list"
3105 fi
3106 echo "$base.o: $base.$FS" >> $MAKEFILE
3107 printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE
3108 done
3109
3110 echo " Add rules for links"
3111 cat srclinks.tmp >> $MAKEFILE
3112 rm -f srclinks.tmp
3113
3114 echo " Adding makedepend marker"
3115 printf "\n\n# DO NOT DELETE\n" >> $MAKEFILE
3116
3117 printf "\n=== Done ===\n"
3118
3119 # Create special header files
3120 $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"
3121 if test ! -f $PACKAGES_DOT_H ; then
3122 mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
3123 else
3124 cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H > /dev/null 2>&1
3125 RETVAL=$?
3126 if test "x$RETVAL" = x0 ; then
3127 rm -f $PACKAGES_DOT_H".tmp"
3128 else
3129 mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"
3130 mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
3131 fi
3132 fi
3133 if test ! -f AD_CONFIG.h ; then
3134 $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
3135 fi
3136
3137
3138 # Write the "state" for future records
3139 if test "x$DUMPSTATE" != xf ; then
3140 printf "" > genmake_state
3141 for i in $gm_state ; do
3142 t1="t2=\$$i"
3143 eval $t1
3144 echo "$i='$t2'" >> genmake_state
3145 done
3146 fi

  ViewVC Help
Powered by ViewVC 1.1.22