/[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.180 - (show annotations) (download)
Thu Dec 11 17:50:56 2008 UTC (15 years, 3 months ago) by utke
Branch: MAIN
CVS Tags: checkpoint61g
Changes since 1.179: +2 -2 lines
updated flag

1 #! /usr/bin/env bash
2 #
3 # $Header: /u/gcmpack/MITgcm/tools/genmake2,v 1.179 2008/11/21 16:15:00 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 version_file="${ROOTDIR}/doc/tag-index"
1406 if test -f $version_file ; then
1407 THISVER=`grep '^checkpoint' $version_file | head -1`
1408 #- remove ./BUILD_INFO.h file if older than version_file
1409 if test -f ./BUILD_INFO.h -a ./BUILD_INFO.h -ot $version_file ; then
1410 echo " remove ./BUILD_INFO.h (older than ${version_file})"
1411 rm -f ./BUILD_INFO.h
1412 fi
1413 fi
1414
1415 if test "x$MAKEFILE" = x ; then
1416 MAKEFILE="Makefile"
1417 fi
1418
1419 echo " getting OPTFILE information: "
1420 if test "x${OPTFILE}" = x ; then
1421 if test "x$MITGCM_OF" = x ; then
1422 echo "Warning: no OPTFILE specified so we'll look for possible settings"
1423 printf "\n=== Searching for possible settings for OPTFILE ===\n"
1424 find_possible_configs
1425 else
1426 OPTFILE=$MITGCM_OF
1427 fi
1428 fi
1429 if test "x$OPTFILE" != xNONE ; then
1430 if test -f "$OPTFILE" -a -r "$OPTFILE" ; then
1431 echo " using OPTFILE=\"$OPTFILE\""
1432 . "$OPTFILE"
1433 RETVAL=$?
1434 if test "x$RETVAL" != x0 ; then
1435 printf "Error: failed to source OPTFILE \"$OPTFILE\""
1436 echo "--please check that variable syntax is bash-compatible"
1437 exit 1
1438 fi
1439 if test "x$DUMPSTATE" != xf ; then
1440 cp -f $OPTFILE "genmake_optfile"
1441 fi
1442 else
1443 echo "Error: can't read OPTFILE=\"$OPTFILE\""
1444 exit 1
1445 fi
1446 fi
1447
1448 echo " getting AD_OPTFILE information: "
1449 if test "x${AD_OPTFILE}" = x ; then
1450 if test "x$MITGCM_AD_OF" = x ; then
1451 AD_OPTFILE=$ROOTDIR/tools/adjoint_options/adjoint_default
1452 else
1453 AD_OPTFILE=$MITGCM_AD_OF
1454 fi
1455 fi
1456 if test "x${AD_OPTFILE}" != xNONE ; then
1457 if test -f "$AD_OPTFILE" -a -r "$AD_OPTFILE" ; then
1458 echo " using AD_OPTFILE=\"$AD_OPTFILE\""
1459 . "$AD_OPTFILE"
1460 RETVAL=$?
1461 if test "x$RETVAL" != x0 ; then
1462 printf "Error: failed to source AD_OPTFILE \"$AD_OPTFILE\""
1463 echo "--please check that variable syntax is bash-compatible"
1464 exit 1
1465 fi
1466 if test "x$DUMPSTATE" != xf ; then
1467 cp -f $AD_OPTFILE "genmake_ad_optfile"
1468 fi
1469 else
1470 echo "Error: can't read AD_OPTFILE=\"$AD_OPTFILE\""
1471 exit 1
1472 fi
1473 fi
1474
1475 #====================================================================
1476 # Set default values if not set by the optfile
1477 #
1478 # Check that FC, CC, LINK, CPP, S64, LN, and MAKE are defined. If not,
1479 # either set defaults or complain and abort!
1480 if test ! "x$BASH" = x ; then
1481 # add a trailing space so that it works within the Makefile syntax (see below)
1482 BASH="$BASH "
1483 fi
1484 if test "x$FC" = x ; then
1485 cat <<EOF 1>&2
1486
1487 Error: no Fortran compiler: please specify using one of the following:
1488 1) within the options file ("FC=...") as specified by "-of=OPTFILE"
1489 2) the "-fc=XXX" command-line option
1490 3) the "./genmake_local" file
1491 EOF
1492 exit 1
1493 fi
1494 if test "x$CC" = x ; then
1495 CC=cc
1496 # cat <<EOF 1>&2
1497 # Error: no C compiler: please specify using one of the following:
1498 # 1) within the options file ("CC=...") as specified by "-of=OPTFILE"
1499 # 2) the "-cc=XXX" command-line option
1500 # 3) the "./genmake_local" file
1501 # EOF
1502 # exit 1
1503 fi
1504 if test "x$LINK" = x ; then
1505 LINK=$FC
1506 fi
1507 if test "x$MAKE" = x ; then
1508 MAKE="make"
1509 fi
1510 if test "x$CPP" = x ; then
1511 CPP=cpp
1512 fi
1513 #EH3 === UGLY ===
1514 # The following is an ugly little hack to check for $CPP in /lib/ and
1515 # it should eventually be replaced with a more general function that
1516 # searches a combo of the user's path and a list of "usual suspects"
1517 # to find the correct location for binaries such as $CPP.
1518 for i in " " "/lib/" ; do
1519 echo "#define A a" | $i$CPP > test_cpp 2>&1 && CPP=$i$CPP
1520 done
1521 #EH3 === UGLY ===
1522 echo "#define A a" | $CPP > test_cpp 2>&1
1523 RETVAL=$?
1524 if test "x$RETVAL" != x0 ; then
1525 cat <<EOF 1>&2
1526
1527 Error: C pre-processor "$CPP" failed the test case: please specify using:
1528
1529 1) within the options file ("CPP=...") as specified by "-of=OPTFILE"
1530 2) the "./genmake_local" file
1531 3) with the CPP environment variable
1532
1533 EOF
1534 exit 1
1535 else
1536 rm -f test_cpp
1537 fi
1538 look_for_makedepend
1539 if test "x$LN" = x ; then
1540 LN="ln -s"
1541 fi
1542 echo "test" > genmake_test_ln
1543 $LN genmake_test_ln genmake_tlink
1544 RETVAL=$?
1545 if test "x$RETVAL" != x0 ; then
1546 cat <<EOF 1>&2
1547
1548 Error: The command "ln -s" failed -- please specify a working soft-link
1549 command in the optfile.
1550
1551 EOF
1552 exit 1
1553 fi
1554 test -L genmake_tlink > /dev/null 2>&1
1555 RETVAL=$?
1556 if test "x$RETVAL" = x0 ; then
1557 HAVE_TEST_L=t
1558 fi
1559 rm -f genmake_test_ln genmake_tlink
1560
1561 # Check for broken *.F/*.f handling and fix if possible
1562 check_for_broken_Ff
1563
1564 if test ! "x$MPI" = x ; then
1565 echo " Turning on MPI cpp macros"
1566 DEFINES="$DEFINES -DALLOW_USE_MPI -DALWAYS_USE_MPI"
1567 fi
1568
1569 if test ! "x$TS" = x ; then
1570 echo " Turning on timing per timestep"
1571 if test ! "x$FOOLAD" = x ; then
1572 DEFINES="$DEFINES -DTIME_PER_TIMESTEP_SFP"
1573 else
1574 DEFINES="$DEFINES -DTIME_PER_TIMESTEP"
1575 fi
1576 PACKAGES="$PACKAGES showflops"
1577 fi
1578 if test ! "x$PAPIS" = x ; then
1579 echo " Turning on PAPI flop summary per timestep"
1580 echo " Please make sure PAPIINC, PAPILIB are defined"
1581 if test ! "x$FOOLAD" = x ; then
1582 DEFINES="$DEFINES -DUSE_PAPI_FLOPS_SFP"
1583 else
1584 DEFINES="$DEFINES -DUSE_PAPI_FLOPS"
1585 fi
1586 INCLUDES="$INCLUDES $PAPIINC"
1587 LIBS="$LIBS $PAPILIB"
1588 PACKAGES="$PACKAGES showflops"
1589 fi
1590 if test ! "x$PCLS" = x ; then
1591 echo " Turning on PCL counter summary per timestep"
1592 echo " Please make sure PCLINC, PCLLIB are defined"
1593 if test ! "x$FOOLAD" = x ; then
1594 DEFINES="$DEFINES -DUSE_PCL_FLOPS_SFP"
1595 else
1596 DEFINES="$DEFINES -DUSE_PCL_FLOPS"
1597 fi
1598 INCLUDES="$INCLUDES $PCLINC"
1599 LIBS="$LIBS $PCLLIB"
1600 PACKAGES="$PACKAGES showflops"
1601 fi
1602 if test ! "x$PAPI" = x ; then
1603 if test ! "x$PAPIS" = x ; then
1604 echo " PAPI performance analysis and flop summary per timestep cannot co-exist!"
1605 echo " Sticking with PAPI flop summary per timestep!"
1606 else
1607 echo " Turning on performance analysis with PAPI"
1608 echo " Please make sure PAPIINC, PAPILIB are defined"
1609 DEFINES="$DEFINES -DUSE_PAPI"
1610 INCLUDES="$INCLUDES $PAPIINC"
1611 LIBS="$LIBS $PAPILIB"
1612 fi
1613 fi
1614 if test ! "x$PCL" = x ; then
1615 if test ! "x$PCLS" = x ; then
1616 echo " PCL performance analysis and flop summary per timestep cannot co-exist!"
1617 echo " Sticking with PCL flop summary per timestep!"
1618 else
1619 echo " Turning on performance analysis with PCL"
1620 echo " Please make sure PCLINC, PCLLIB are defined"
1621 DEFINES="$DEFINES -DUSE_PCL"
1622 INCLUDES="$INCLUDES $PCLINC"
1623 LIBS="$LIBS $PCLLIB"
1624 fi
1625 fi
1626 if test ! "x$HPMT" = x ; then
1627 if test ! "x$PAPI" = x ; then
1628 echo " PAPI and the HPM Toolkit cannot co-exist!"
1629 echo " Sticking with PAPI!"
1630 else if test ! "x$PCL" = x ; then
1631 echo " PCL and the HPM Toolkit cannot co-exist!"
1632 echo " Sticking with PCL!"
1633 else
1634 echo " Turning on performance analysis with the HPM Toolkit"
1635 echo " Please make sure HPMTINC, HPMTLIB are defined"
1636 DEFINES="$DEFINES -DUSE_LIBHPM"
1637 INCLUDES="$INCLUDES $HPMTINC"
1638 LIBS="$LIBS $HPMTLIB"
1639 fi
1640 fi
1641 fi
1642 if test ! "x$GSL" = x ; then
1643 echo " Turning on use of GSL to control floating point calculations"
1644 echo " Please make sure GSLINC, GSLLIB are defined"
1645 DEFINES="$DEFINES -DUSE_GSL_IEEE"
1646 INCLUDES="$INCLUDES $GSLINC"
1647 LIBS="$LIBS $GSLLIB"
1648 fi
1649
1650 printf "\n=== Checking system libraries ===\n"
1651 printf " Do we have the system() command using $FC... "
1652 cat > genmake_tcomp.$FS <<EOF
1653 program hello
1654 call system('echo hi')
1655 end
1656 EOF
1657 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1658 RETVAL=$?
1659 if test "x$RETVAL" = x0 ; then
1660 HAVE_SYSTEM=t
1661 DEFINES="$DEFINES -DHAVE_SYSTEM"
1662 echo "yes"
1663 else
1664 HAVE_SYSTEM=
1665 echo "no"
1666 fi
1667 rm -f genmake_tcomp*
1668
1669 printf " Do we have the fdate() command using $FC... "
1670 cat > genmake_tcomp.$FS <<EOF
1671 program hello
1672 CHARACTER*(128) string
1673 string = ' '
1674 call fdate( string )
1675 print *, string
1676 end
1677 EOF
1678 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1679 RETVAL=$?
1680 if test "x$RETVAL" = x0 ; then
1681 HAVE_FDATE=t
1682 DEFINES="$DEFINES -DHAVE_FDATE"
1683 echo "yes"
1684 else
1685 HAVE_FDATE=
1686 echo "no"
1687 fi
1688 rm -f genmake_tcomp*
1689
1690 printf " Do we have the etime() command using $FC... "
1691 cat > genmake_tcomp.$FS <<EOF
1692 program hello
1693 REAL*4 ACTUAL, TARRAY(2)
1694 EXTERNAL ETIME
1695 REAL*4 ETIME
1696 actual = etime( tarray )
1697 print *, tarray
1698 end
1699 EOF
1700 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1701 RETVAL=$?
1702 if test "x$RETVAL" = x0 ; then
1703 HAVE_ETIME=t
1704 DEFINES="$DEFINES -DHAVE_ETIME"
1705 echo "yes"
1706 else
1707 HAVE_ETIME=
1708 echo "no"
1709 fi
1710 rm -f genmake_tcomp*
1711
1712 printf " Can we call simple C routines (here, \"cloc()\") using $FC... "
1713 check_HAVE_CLOC
1714 if test "x$HAVE_CLOC" != x ; then
1715 echo "yes"
1716 else
1717 echo "no"
1718 if test "x$EMBED_SRC" = xt ; then
1719 echo " WARNING: you requested file embedding but it has"
1720 echo " been disabled since C code cannot be called"
1721 EMBED_SRC=
1722 fi
1723 fi
1724 rm -f genmake_t*
1725
1726 printf " Can we unlimit the stack size using $FC... "
1727 check_HAVE_SETRLSTK
1728 if test "x$HAVE_SETRLSTK" = xt ; then
1729 echo "yes"
1730 else
1731 echo "no"
1732 fi
1733 rm -f genmake_t*
1734
1735 printf " Can we register a signal handler using $FC... "
1736 check_HAVE_SIGREG
1737 if test "x$HAVE_SIGREG" = xt ; then
1738 echo "yes"
1739 else
1740 echo "no"
1741 fi
1742 rm -f genmake_t*
1743
1744 printf " Can we use stat() through C calls... "
1745 check_HAVE_STAT
1746 if test "x$HAVE_STAT" != x ; then
1747 echo "yes"
1748 else
1749 echo "no"
1750 fi
1751 rm -f genmake_t*
1752
1753 printf " Can we create NetCDF-enabled binaries... "
1754 check_netcdf_libs
1755 if test "x$HAVE_NETCDF" != x ; then
1756 echo "yes"
1757 else
1758 echo "no"
1759 fi
1760 DEFINES="$DEFINES $IGNORE_TIME"
1761
1762 if test "x$EMBED_SRC" = xt ; then
1763 build_embed_encode
1764 fi
1765 if test "x$EMBED_SRC" = xt ; then
1766 ENABLE="$ENABLE embed_files"
1767 fi
1768
1769
1770 printf "\n=== Setting defaults ===\n"
1771 printf " Adding MODS directories: "
1772 for d in $MODS ; do
1773 if test ! -d $d ; then
1774 echo
1775 echo "Error: MODS directory \"$d\" not found!"
1776 exit 1
1777 else
1778 printf " $d"
1779 SOURCEDIRS="$SOURCEDIRS $d"
1780 INCLUDEDIRS="$INCLUDEDIRS $d"
1781 fi
1782 done
1783 echo
1784
1785 if test "x${PLATFORM}" = x ; then
1786 PLATFORM=$p_PLATFORM
1787 fi
1788
1789 if test "x${EXEDIR}" = x ; then
1790 tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1791 if test "x$tmp" = "xbin" -a -d ../exe -a $ROOTDIR = .. ; then
1792 EXEDIR=../exe
1793 else
1794 EXEDIR=.
1795 fi
1796 fi
1797 if test ! -d ${EXEDIR} ; then
1798 echo "Error: the specified EXEDIR (\"$EXEDIR\") does not exist!"
1799 exit 1
1800 fi
1801
1802 if test "x${TOOLSDIR}" = x ; then
1803 TOOLSDIR="$ROOTDIR/tools"
1804 fi
1805 if test ! -d ${TOOLSDIR} ; then
1806 echo "Error: the specified TOOLSDIR (\"$TOOLSDIR\") does not exist!"
1807 exit 1
1808 fi
1809 if test "x$S64" = x ; then
1810 echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.sh > /dev/null 2>&1
1811 RETVAL=$?
1812 if test "x${RETVAL}" = x0 ; then
1813 S64='$(TOOLSDIR)/set64bitConst.sh'
1814 else
1815 echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.csh > /dev/null 2>&1
1816 RETVAL=$?
1817 if test "x${RETVAL}" = x0 ; then
1818 S64='$(TOOLSDIR)/set64bitConst.csh'
1819 else
1820 cat <<EOF
1821
1822 ERROR: neither of the two default scripts:
1823
1824 ${TOOLSDIR}/set64bitConst.sh
1825 ${TOOLSDIR}/set64bitConst.csh
1826
1827 are working so please check paths or specify (with \$S64) a
1828 working version of this script.
1829
1830 EOF
1831 exit 1
1832 fi
1833 fi
1834 fi
1835 THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`
1836
1837 EXECUTABLE=${EXECUTABLE:-mitgcmuv}
1838
1839 # We have a special set of source files in eesupp/src which are
1840 # generated from some template source files. We'll make them first so
1841 # they appear as regular source code
1842 if test -r $ROOTDIR"/eesupp/src/Makefile" ; then
1843 echo " Making source files in eesupp from templates"
1844 ( cd $ROOTDIR"/eesupp/src/" && $MAKE ) > make_eesupp.errors 2>&1
1845 RETVAL=$?
1846 if test "x${RETVAL}" = x0 ; then
1847 rm -f make_eesupp.errors
1848 else
1849 echo "Error: problem encountered while building source files in eesupp:"
1850 cat make_eesupp.errors 1>&2
1851 exit 1
1852 fi
1853 fi
1854
1855 #same for pkg/exch2 and pkg/regrid
1856 for pdir in exch2 regrid ; do
1857 if test -r $ROOTDIR"/pkg/${pdir}/Makefile" ; then
1858 echo " Making source files in pkg/${pdir} from templates"
1859 ( cd $ROOTDIR"/pkg/"${pdir} && $MAKE ) > make_${pdir}.errors 2>&1
1860 RETVAL=$?
1861 if test "x${RETVAL}" = x0 ; then
1862 rm -f make_${pdir}.errors
1863 else
1864 echo "Error: problem encountered while building source files in pkg/${pdir}:"
1865 cat make_${pdir}.errors 1>&2
1866 exit 1
1867 fi
1868 fi
1869 done
1870
1871 printf "\n=== Determining package settings ===\n"
1872 if test "x${PDEPEND}" = x ; then
1873 tmp=$ROOTDIR"/pkg/pkg_depend"
1874 if test -r $tmp ; then
1875 PDEPEND=$tmp
1876 else
1877 echo "Warning: No package dependency information was specified."
1878 echo " Please check that ROOTDIR/pkg/pkg_depend exists."
1879 fi
1880 else
1881 if test ! -r ${PDEPEND} ; then
1882 echo "Error: can't read package dependency info from PDEPEND=\"$PDEPEND\""
1883 exit 1
1884 fi
1885 fi
1886 echo " getting package dependency info from $PDEPEND"
1887 # Strip the comments and then convert the dependency file into
1888 # two arrays: PNAME, DNAME
1889 cat $PDEPEND | sed -e 's/#.*$//g' \
1890 | $AWK 'BEGIN{nn=-1;} (NF>0){ for(i=2;i<=NF;i++){nn++; print "PNAME_"nn"="$1"\nDNAME_"nn"="$i}} END{print "nname="nn}' \
1891 > ./.pd_tmp
1892 RETVAL=$?
1893 if test ! "x${RETVAL}" = x0 ; then
1894 echo "Error: unable to parse package dependencies -- please check PDEPEND=\"$PDEPEND\""
1895 exit 1
1896 fi
1897 . ./.pd_tmp
1898 rm -f ./.pd_tmp
1899
1900 # Search for default packages. Note that a "$ROOTDIR/pkg/pkg_groups"
1901 # file should eventually be added so that, for convenience, one can
1902 # specify groups of packages using names like "ocean" and "atmosphere".
1903 echo " checking default package list: "
1904 if test "x${PDEFAULT}" = x ; then
1905 for i in "." $MODS ; do
1906 if test -r $i"/packages.conf" ; then
1907 PDEFAULT=$i"/packages.conf"
1908 break
1909 fi
1910 done
1911 fi
1912 if test "x${PDEFAULT}" = x ; then
1913 PDEFAULT="$ROOTDIR/pkg/pkg_default"
1914 fi
1915 if test "x${PDEFAULT}" = xNONE ; then
1916 echo " default packages file disabled"
1917 else
1918 if test ! -r $PDEFAULT ; then
1919 echo "Warning: can't read default packages from PDEFAULT=\"$PDEFAULT\""
1920 else
1921 echo " using PDEFAULT=\"$PDEFAULT\""
1922 # Strip the comments and add all the names
1923 def=`cat $PDEFAULT | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
1924 RETVAL=$?
1925 if test "x${RETVAL}" != x0 ; then
1926 printf "Error: can't parse default package list "
1927 echo "-- please check PDEFAULT=\"$PDEFAULT\""
1928 exit 1
1929 fi
1930 for i in $def ; do
1931 PACKAGES="$PACKAGES $i"
1932 done
1933 echo " before group expansion packages are: $PACKAGES"
1934 RET=1
1935 while test $RET = 1 ; do expand_pkg_groups; RET=$?; done
1936 echo " after group expansion packages are: $PACKAGES"
1937 fi
1938 fi
1939
1940 echo " applying DISABLE settings"
1941 for i in $PACKAGES ; do
1942 echo $i >> ./.tmp_pack
1943 done
1944 for i in `grep "-" ./.tmp_pack` ; do
1945 j=`echo $i | sed 's/[-]//'`
1946 DISABLE="$DISABLE $j"
1947 done
1948 pack=
1949 for p in $PACKAGES ; do
1950 addit="t"
1951 for d in $DISABLE ; do
1952 if test "x$p" = "x$d" ; then
1953 addit="f"
1954 fi
1955 done
1956 if test "x$addit" = xt ; then
1957 pack="$pack $p"
1958 fi
1959 done
1960 PACKAGES="$pack"
1961 echo " applying ENABLE settings"
1962 echo "" > ./.tmp_pack
1963 PACKAGES="$PACKAGES $ENABLE"
1964 # Test if each explicitly referenced package exists
1965 for i in $PACKAGES ; do
1966 j=`echo $i | sed 's/[-+]//'`
1967 if test ! -d "$ROOTDIR/pkg/$j" ; then
1968 echo "Error: can't find package $i at \"$ROOTDIR/pkg/$i\""
1969 exit 1
1970 fi
1971 echo $i >> ./.tmp_pack
1972 done
1973 PACKAGES=
1974 for i in `grep -v "-" ./.tmp_pack | sort | uniq` ; do
1975 PACKAGES="$PACKAGES $i"
1976 done
1977 rm -f ./.tmp_pack
1978 echo " packages are: $PACKAGES"
1979
1980 # Check for package MNC: if NetCDF is available, then build the MNC
1981 # template files ; otherwise, delete mnc from the list of packages.
1982 echo $PACKAGES | grep ' mnc ' > /dev/null 2>&1
1983 RETVAL=$?
1984 if test "x$RETVAL" = x0 ; then
1985 if test "x$HAVE_NETCDF" != xt ; then
1986 cat <<EOF
1987
1988 *********************************************************************
1989 WARNING: the "mnc" package was enabled but tests failed to compile
1990 NetCDF applications. Please check that:
1991
1992 1) NetCDF is correctly installed for this compiler and
1993 2) the LIBS variable (within the "optfile") specifies the correct
1994 NetCDF library to link against.
1995
1996 Due to this failure, the "mnc" package is now DISABLED.
1997 *********************************************************************
1998
1999 EOF
2000 PACKAGES=`echo $PACKAGES | sed -e 's/mnc//g'`
2001 DISABLE="$DISABLE mnc"
2002 else
2003 ( cd $ROOTDIR"/pkg/mnc" && $MAKE testclean && $MAKE templates ) > make_mnc.errors 2>&1
2004 RETVAL=$?
2005 if test "x${RETVAL}" = x0 ; then
2006 rm -f make_mnc.errors
2007 else
2008 echo "Error: problem encountered while building source files in pkg/mnc:"
2009 cat make_mnc.errors 1>&2
2010 exit 1
2011 fi
2012 fi
2013 fi
2014
2015 # Check for package PROFILES: if NetCDF is not available,
2016 # then delete profiles from the list of available packages.
2017 echo $PACKAGES | grep ' profiles ' > /dev/null 2>&1
2018 RETVAL=$?
2019 if test "x$RETVAL" = x0 ; then
2020 if test "x$HAVE_NETCDF" != xt ; then
2021 cat <<EOF
2022
2023 *********************************************************************
2024 WARNING: the "profiles" package was enabled but tests failed to
2025 compile NetCDF applications. Please check that:
2026
2027 1) NetCDF is correctly installed for this compiler and
2028 2) the LIBS variable (within the "optfile") specifies the correct
2029 NetCDF library to link against.
2030
2031 Due to this failure, the "profiles" package is now DISABLED.
2032 *********************************************************************
2033
2034 EOF
2035 PACKAGES=`echo $PACKAGES | sed -e 's/profiles//g'`
2036 DISABLE="$DISABLE profiles"
2037 fi
2038 fi
2039
2040 echo " applying package dependency rules"
2041 ck=
2042 while test "x$ck" != xtt ; do
2043 i=0
2044 # rtot=${#PNAME[@]}
2045 rtot=$nname
2046 while test $i -le $rtot ; do
2047
2048 # Is $pname in the current $PACKAGES list?
2049 # pname=${PNAME[$i]}
2050 tmp="pname=\"\$PNAME_$i\""
2051 eval $tmp
2052 pin="f"
2053 for p in $PACKAGES ; do
2054 if test "x$p" = "x$pname" ; then
2055 pin="t"
2056 fi
2057 done
2058
2059 # Is the DNAME entry a (+) or (-) rule ?
2060 tmp="dname=\"\$DNAME_$i\""
2061 eval $tmp
2062 plus="-"
2063 echo $dname | grep '^+' > /dev/null 2>&1
2064 RETVAL=$?
2065 if test "x$RETVAL" = x0 ; then
2066 plus="+"
2067 fi
2068
2069 # Is $dname in the current $PACKAGES list?
2070 dname=`echo $dname | sed -e 's/^[+-]//'`
2071 din="f"
2072 for p in $PACKAGES ; do
2073 if test "x$p" = "x$dname" ; then
2074 din="t"
2075 fi
2076 done
2077
2078 # Do we need to add $dname according to the dependency rules?
2079 if test "x$pin" = xt -a "x$plus" = "x+" -a "x$din" = xf ; then
2080 #echo " " $pname ": need to add :" $dname
2081 in_dis="f"
2082 for dis in $DISABLE ; do
2083 if test "x$dis" = "x$dname" ; then
2084 in_dis="t"
2085 fi
2086 done
2087 if test "x$in_dis" = xt ; then
2088 echo "Error: can't satisfy package dependencies:"
2089 echo " \"$dname\" is required by the dependency rules"
2090 echo " but is disallowed by the DISABLE settings"
2091 exit 1
2092 else
2093 PACKAGES="$PACKAGES $dname"
2094 ck=
2095 fi
2096 fi
2097
2098 # Do we need to get rid of $dname according to the dependency rules?
2099 if test "x$pin" = xt -a "x$plus" = "x-" -a "x$din" = xt; then
2100 echo "Error: can't satisfy package dependencies:"
2101 echo " \"$pname\" was requested but is disallowed by"
2102 echo " the dependency rules for \"$dname\""
2103 exit 1
2104 fi
2105 i=`echo "$i + 1" | bc -l`
2106 #i=$(( $i + 1 ))
2107 done
2108 ck=$ck"t"
2109 done
2110 echo " packages are: $PACKAGES"
2111 for i in $PACKAGES ; do
2112 adr="$ROOTDIR/pkg/$i"
2113 if test -d $adr ; then
2114 SOURCEDIRS="$SOURCEDIRS $adr"
2115 INCLUDEDIRS="$INCLUDEDIRS $adr"
2116 if test "x$i" = xautodiff ; then
2117 AUTODIFF_PKG_USED=t
2118 fi
2119 else
2120 echo "Error: the directory \"$adr\" for package $i doesn't exist"
2121 exit 1
2122 fi
2123 done
2124
2125 # Create a list of #define and #undef to enable/disable packages
2126 PACKAGES_DOT_H=PACKAGES_CONFIG.h
2127 # The following UGLY HACK sets multiple "#undef"s and it needs to go
2128 # away. On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h
2129 # file would eventually be split up so that all package-related #define
2130 # statements could be separated and handled only by genmake.
2131 names=`ls -1 "$ROOTDIR/pkg"`
2132 all_pack=
2133 DISABLED_PACKAGES=
2134 for n in $names ; do
2135 if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
2136 has_pack="f"
2137 for pack in $PACKAGES ; do
2138 if test "x$pack" = "x$n" ; then
2139 has_pack="t"
2140 break
2141 fi
2142 done
2143 if test "x$has_pack" = xf ; then
2144 undef=`echo "ALLOW_$n" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2145 DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
2146 fi
2147 fi
2148 done
2149 ENABLED_PACKAGES=
2150 for i in $PACKAGES ; do
2151 def=`echo "ALLOW_$i" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2152 ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
2153 #eh3 DEFINES="$DEFINES -D$def"
2154
2155 #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
2156 case $i in
2157 aim_v23)
2158 ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
2159 echo "Warning: ALLOW_AIM is set to enable aim_v23."
2160 ;;
2161 esac
2162 #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
2163
2164 done
2165
2166 echo " Adding STANDARDDIRS"
2167 BUILDDIR=${BUILDDIR:-.}
2168 if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
2169 STANDARDDIRS="eesupp model"
2170 fi
2171 if test "x$STANDARDDIRS" != x ; then
2172 for d in $STANDARDDIRS ; do
2173 adr="$ROOTDIR/$d/src"
2174 if test ! -d $adr ; then
2175 echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2176 echo " is correct and that you correctly specified the STANDARDDIRS option"
2177 exit 1
2178 else
2179 SOURCEDIRS="$SOURCEDIRS $adr"
2180 fi
2181 adr="$ROOTDIR/$d/inc"
2182 if test ! -d $adr ; then
2183 echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2184 echo " is correct and that you correctly specified the STANDARDDIRS option"
2185 exit 1
2186 else
2187 INCLUDEDIRS="$INCLUDEDIRS $adr"
2188 fi
2189 done
2190 fi
2191
2192 echo " Searching for *OPTIONS.h files in order to warn about the presence"
2193 echo " of \"#define \"-type statements that are no longer allowed:"
2194 CPP_OPTIONS=
2195 CPP_EEOPTIONS=
2196 spaths=". $INCLUDEDIRS"
2197 names=`ls -1 "$ROOTDIR/pkg"`
2198 for i in $spaths ; do
2199 try="$i/CPP_OPTIONS.h"
2200 if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
2201 echo " found CPP_OPTIONS=\"$try\""
2202 CPP_OPTIONS="$try"
2203 # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
2204 for n in $names ; do
2205 test_for_package_in_cpp_options $CPP_OPTIONS $n
2206 done
2207 fi
2208 try="$i/CPP_EEOPTIONS.h"
2209 if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
2210 echo " found CPP_EEOPTIONS=\"$try\""
2211 # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
2212 #**** not yet enabled ****
2213 # test_for_mpi_in_cpp_eeoptions $try
2214 #**** not yet enabled ****
2215 CPP_EEOPTIONS="$try"
2216 fi
2217 done
2218 if test "x$CPP_OPTIONS" = x ; then
2219 echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
2220 exit 1
2221 fi
2222
2223 # Here, we build the list of files to be "run through" the adjoint
2224 # compiler.
2225 if test -f ./adSrcFiles.tmp ; then
2226 rm -f ./adSrcFiles.tmp
2227 fi
2228 echo " Creating the list of files for the adjoint compiler."
2229 for i in $SOURCEDIRS ; do
2230 list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
2231 for j in $list_files ; do
2232 cat $i/$j >> adSrcFiles.tmp
2233 done
2234 done
2235 if test ! "x"$FS = "x.f" ; then
2236 cat adSrcFiles.tmp | sed -e "s/\.f/.$FS/g" > adSrcFiles.tmp_f
2237 mv -f adSrcFiles.tmp_f adSrcFiles.tmp
2238 fi
2239
2240 echo
2241 echo "=== Creating the Makefile ==="
2242 echo " setting INCLUDES"
2243 for i in $INCLUDEDIRS ; do
2244 if test ! -d $i ; then
2245 echo "Warning: can't find INCLUDEDIRS=\"$i\""
2246 fi
2247 done
2248
2249 if test ! "x$DIVA" = x ; then
2250 echo " Creating the pseudo-MPI include directory"
2251 INCLUDES="-I./mpi_headers $INCLUDES"
2252 rm -rf ./mpi_headers
2253 mkdir -p ./mpi_headers
2254
2255 if test "x$MPIINCLUDEDIR" = x ; then
2256 if test "x$MPIHOME" = x ; then
2257 MPIHOME='/usr'
2258 fi
2259 MPIINCLUDEDIR='$MPIHOME/include'
2260 fi
2261
2262 if test -r $MPIINCLUDEDIR/mpif.h ; then
2263 for i in $MPI_HEADER_FILES; do
2264 cp -p $MPIINCLUDEDIR/$i ./mpi_headers
2265 done
2266
2267 perl -i -pe 's/MPI_DISPLACEMENT_CURRENT=-1_8/MPI_DISPLACEMENT_CURRENT=-1/g' mpi_headers/mpif.h
2268 else
2269 echo " We cannot create a copy of mpif.h!"
2270 # exit -1
2271 fi
2272 fi
2273
2274 echo " Determining the list of source and include files"
2275 rm -rf .links.tmp
2276 mkdir .links.tmp
2277 touch .links.tmp/foo
2278 if test ! -r ".links.tmp/foo" ; then
2279 echo
2280 echo "ERROR : something is wrong with your directory permissions or"
2281 echo " your user file-creation mask (\"umask\") since creating a"
2282 echo " sub-dir, touch-ing a file within it, and then reading it is"
2283 echo " not working. Please try setting your umask to something"
2284 echo " sane such as:"
2285 echo
2286 echo " umask 0002"
2287 echo
2288 echo " and please verify that you have the proper permissions for"
2289 echo " creating sub-directories and then reading files created"
2290 echo " within them."
2291 echo
2292 exit 1
2293 fi
2294 rm -f .links.tmp/foo
2295
2296 if test "x$OPENAD" != x ; then
2297 OAD_DONT_COMPILE="/dev/null"
2298 OAD_DONT_TRANSFORM="/dev/null"
2299 OAD_KEEP_ORIGINAL="/dev/null"
2300 OAD_CB2M_FILES="/dev/null"
2301 echo " looking for dontCompile file: "
2302 for i in "." $MODS ; do
2303 if test -r $i"/dontCompile" ; then
2304 OAD_DONT_COMPILE=$i"/dontCompile"
2305 echo " found $OAD_DONT_COMPILE"
2306 break
2307 fi
2308 done
2309 echo " looking for dontTransform file: "
2310 for i in "." $MODS ; do
2311 if test -r $i"/dontTransform" ; then
2312 OAD_DONT_TRANSFORM=$i"/dontTransform"
2313 echo " found $OAD_DONT_TRANSFORM"
2314 break
2315 fi
2316 done
2317 echo " looking for keepOriginal file: "
2318 for i in "." $MODS ; do
2319 if test -r $i"/keepOriginal" ; then
2320 OAD_KEEP_ORIGINAL=$i"/keepOriginal"
2321 echo " found $OAD_KEEP_ORIGINAL"
2322 break
2323 fi
2324 done
2325 echo " looking for cb2mFiles: "
2326 for i in "." $MODS ; do
2327 if test -r $i"/cb2mFiles" ; then
2328 OAD_CB2M_FILES=$i"/cb2mFiles"
2329 echo " found $OAD_CB2M_FILES"
2330 break
2331 fi
2332 done
2333 echo " OpenAD exceptions: "
2334 fi
2335
2336 echo "# This section creates symbolic links" > srclinks.tmp
2337 echo "" >> srclinks.tmp
2338 printf 'F77_SRC_FILES = ' > F77srclist.tmp
2339 printf 'NON_AD_F77_SRC_FILES = ' > nonADF77srclist.tmp
2340 printf 'C_SRC_FILES = ' > csrclist.tmp
2341 printf 'F90_SRC_FILES = ' > F90srclist.tmp
2342 printf 'H_SRC_FILES = ' > hsrclist.tmp
2343 printf 'AD_FLOW_FILES = ' > ad_flow_files.tmp
2344 alldirs="$SOURCEDIRS $INCLUDEDIRS ."
2345 for d in $alldirs ; do
2346 deplist=
2347 sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
2348 sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
2349 if test "x$OPENAD" != x ; then
2350 sfiles=`( echo $sfiles | grep -v _cb2m\. )`
2351 fi
2352 for sf in $sfiles ; do
2353 if test ! -r ".links.tmp/$sf" ; then
2354 if test -f "$d/$sf" ; then
2355 ignore_f=f
2356 case $d/$sf in
2357 ./$PACKAGES_DOT_H)
2358 ignore_f=t
2359 ;;
2360 ./AD_CONFIG.h)
2361 ignore_f=t
2362 ;;
2363 ./FC_NAMEMANGLE.h)
2364 ignore_f=t
2365 ;;
2366 ./BUILD_INFO.h)
2367 ignore_f=t
2368 ;;
2369 ./EMBEDDED_FILES.h)
2370 ignore_f=t
2371 ;;
2372 *)
2373 # For the local directory *ONLY*,
2374 # ignore all soft-links
2375 if test "x$HAVE_TEST_L" = xt -a "x$d" = x. -a -L $sf ; then
2376 ignore_f=t
2377 else
2378 touch .links.tmp/$sf
2379 deplist="$deplist $sf"
2380 fi
2381 ;;
2382 esac
2383 if test "x$ignore_f" = xf ; then
2384 extn=`echo $sf | $AWK -F. '{print $NF}'`
2385 case $extn in
2386 F)
2387 echo " \\" >> F77srclist.tmp
2388 printf " $sf" >> F77srclist.tmp
2389 if test "x$OPENAD" != x ; then
2390 basename=${sf%%.F}
2391 isAD=`egrep ^$basename.f'[ ]*' adSrcFiles.tmp`
2392 if test -z "$isAD" ; then
2393 toBeIgnored=`egrep ^$basename'[ ]*' ${OAD_DONT_COMPILE}`
2394 if test -z "$toBeIgnored" ; then
2395 echo " \\" >> nonADF77srclist.tmp
2396 printf " $sf" >> nonADF77srclist.tmp
2397 else
2398 echo " not to be compiled : $sf"
2399 fi
2400 else # file is initially listed as an AD file we want to exclude it
2401 # or we want to retain the untransformed version
2402 notToBeTransformed=`egrep ^$basename'[ ]*' ${OAD_DONT_TRANSFORM}`
2403 untransformedVersionToBeKept=`egrep ^$basename'[ ]*' ${OAD_KEEP_ORIGINAL}`
2404 if test -n "$notToBeTransformed"; then
2405 echo " not to be transformed: $sf"
2406 fi
2407 if test -n "$untransformedVersionToBeKept" ; then
2408 echo " original to be kept : $sf"
2409 fi
2410 if test -n "$notToBeTransformed" -o -n "$untransformedVersionToBeKept" ; then
2411 echo " \\" >> nonADF77srclist.tmp
2412 printf " $sf" >> nonADF77srclist.tmp
2413 fi
2414 fi
2415 fi
2416 ;;
2417 F90)
2418 echo " \\" >> F90srclist.tmp
2419 printf " $sf" >> F90srclist.tmp
2420 ;;
2421 c)
2422 echo " \\" >> csrclist.tmp
2423 printf " $sf" >> csrclist.tmp
2424 ;;
2425 h)
2426 echo " \\" >> hsrclist.tmp
2427 printf " $sf" >> hsrclist.tmp
2428 ;;
2429 flow)
2430 echo " \\" >> ad_flow_files.tmp
2431 printf " $sf" >> ad_flow_files.tmp
2432 ;;
2433 esac
2434 fi
2435 fi
2436 fi
2437 done
2438 if test "x$deplist" != x ; then
2439 if test "$d" != "." ; then
2440 echo "" >> srclinks.tmp
2441 echo "# These files are linked from $d" >> srclinks.tmp
2442 echo "$deplist :" >> srclinks.tmp
2443 # We need to make sure that the link isn't already there.
2444 # This may happen when make thinks that a header file has to be "remade"
2445 # because a module it depends on has changed. In this case we do nothing.
2446 printf "\tif [ ! -L \$@ ]; then \$(LN) %s/\$@ \$@; fi\n" $d >> srclinks.tmp
2447 fi
2448 fi
2449 done
2450 rm -rf .links.tmp
2451 echo "" >> F77srclist.tmp
2452 echo "" >> nonADF77srclist.tmp
2453 echo "" >> csrclist.tmp
2454 echo "" >> F90srclist.tmp
2455 echo "" >> hsrclist.tmp
2456 echo "" >> ad_flow_files.tmp
2457
2458 if test -f $MAKEFILE ; then
2459 mv -f $MAKEFILE "$MAKEFILE.bak"
2460 fi
2461 echo " Writing makefile: $MAKEFILE"
2462 echo "# Multithreaded + multi-processing makefile for:" > $MAKEFILE
2463 echo "# $MACHINE" >> $MAKEFILE
2464 echo "# This makefile was generated automatically on" >> $MAKEFILE
2465 echo "# $THISDATE" >> $MAKEFILE
2466 echo "# by the command:" >> $MAKEFILE
2467 echo "# $0 $G2ARGS" >> $MAKEFILE
2468 echo "# executed by:" >> $MAKEFILE
2469 echo "# ${THISUSER}@${THISHOST}:${THISCWD}" >> $MAKEFILE
2470
2471 EXE_AD=$EXECUTABLE"_ad"
2472 EXE_FTL=$EXECUTABLE"_ftl"
2473 EXE_SVD=$EXECUTABLE"_svd"
2474
2475 cat >>$MAKEFILE <<EOF
2476 #
2477 # OPTFILE="$OPTFILE"
2478 #
2479 # BUILDDIR : Directory where object files are written
2480 # SOURCEDIRS : Directories containing the source (.F) files
2481 # INCLUDEDIRS : Directories containing the header-source (.h) files
2482 # EXEDIR : Directory where executable that is generated is written
2483 # EXECUTABLE : Full path of executable binary
2484 #
2485 # CPP : C-preprocessor command
2486 # INCLUDES : Directories searched for header files
2487 # DEFINES : Macro definitions for CPP
2488 # MAKEDEPEND : Dependency generator
2489 # KPP : Special preprocessor command (specific to platform)
2490 # KFLAGS : Flags for KPP
2491 # FC : Fortran compiler command
2492 # FFLAGS : Configuration/debugging options for FC
2493 # FOPTIM : Optimization options for FC
2494 # LINK : Command for link editor program
2495 # LIBS : Library flags /or/ additional optimization/debugging flags
2496
2497 ROOTDIR = ${ROOTDIR}
2498 BUILDDIR = ${BUILDDIR}
2499 SOURCEDIRS = ${SOURCEDIRS}
2500 INCLUDEDIRS = ${INCLUDEDIRS}
2501 EXEDIR = ${EXEDIR}
2502 EXECUTABLE = \$(EXEDIR)/${EXECUTABLE}
2503 TOOLSDIR = ${TOOLSDIR}
2504
2505 #eh3 new defines for the adjoint work
2506 AUTODIFF = ${ROOTDIR}/pkg/autodiff
2507 EXE_AD = ${EXE_AD}
2508 EXE_FTL = ${EXE_FTL}
2509 EXE_SVD = ${EXE_SVD}
2510
2511 ENABLED_PACKAGES = ${ENABLED_PACKAGES}
2512 DISABLED_PACKAGES = ${DISABLED_PACKAGES}
2513
2514 # These files are created by Makefile
2515 SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h BUILD_INFO.h
2516 EOF
2517
2518 if test "x$EMBED_SRC" = xt ; then
2519 echo "EMBEDDED_FILES = EMBEDDED_FILES.h" >>$MAKEFILE
2520 else
2521 echo "EMBEDDED_FILES = " >>$MAKEFILE
2522 fi
2523
2524 # Note: figure out some way to add Hyades JAM libraries here
2525 cat >>$MAKEFILE <<EOF
2526 # Unix ln (link)
2527 LN = ${LN}
2528 # C preprocessor
2529 CPP = cat \$< | ${S64} | ${CPP}
2530 # Dependency generator
2531 MAKEDEPEND = ${MAKEDEPEND}
2532 # Special preprocessor (KAP on DECs, FPP on Crays)
2533 KPP = ${KPP}
2534 # Fortran compiler
2535 FC = ${FC}
2536 # Fortran compiler
2537 F90C = ${F90C}
2538 # C compiler
2539 CC = ${CC}
2540 # Link editor
2541 LINK = ${LINK} ${LDADD}
2542
2543 # Defines for CPP
2544 DEFINES = ${DEFINES}
2545 # Includes for CPP
2546 INCLUDES = ${INCLUDES}
2547 # Flags for KPP
2548 KFLAGS1 = ${KFLAGS1}
2549 KFLAGS2 = ${KFLAGS2}
2550 # Optim./debug for FC
2551 FFLAGS = ${FFLAGS} ${FEXTRAFLAGS}
2552 FOPTIM = ${FOPTIM}
2553 # Optim./debug for FC
2554 F90FLAGS = ${F90FLAGS}
2555 F90OPTIM = ${F90OPTIM}
2556 F90FIXEDFORMAT = ${F90FIXEDFORMAT}
2557 # Flags for CC
2558 CFLAGS = ${CFLAGS}
2559 # Files that should not be optimized
2560 NOOPTFILES = ${NOOPTFILES}
2561 NOOPTFLAGS = ${NOOPTFLAGS}
2562 # Flags and libraries needed for linking
2563 LIBS = ${LIBS}
2564 # Name of the Mekfile
2565 MAKEFILE=${MAKEFILE}
2566
2567 EOF
2568
2569 cat F77srclist.tmp >> $MAKEFILE
2570 cat nonADF77srclist.tmp >> $MAKEFILE
2571 cat csrclist.tmp >> $MAKEFILE
2572 cat F90srclist.tmp >> $MAKEFILE
2573 cat hsrclist.tmp >> $MAKEFILE
2574 cat ad_flow_files.tmp >> $MAKEFILE
2575
2576 rm -f F77srclist.tmp nonADF77srclist.tmp csrclist.tmp F90srclist.tmp hsrclist.tmp ad_flow_files.tmp
2577
2578 echo >> $MAKEFILE
2579
2580 # add definitions for preprocessed sources
2581 # and note that not all systems allow case sensitive extensions
2582 # hence the $FS and $FS90 here.
2583 # for fixed format f90 files we use ff90 or FF90 resp
2584 # but these are not expected to be the original source files
2585
2586 echo 'F77_PP_SRC_FILES = $(F77_SRC_FILES:.F=.'$FS')' >> $MAKEFILE
2587 echo 'F90_PP_SRC_FILES = $(F90_SRC_FILES:.F90=.'$FS90')' >> $MAKEFILE
2588 echo 'OBJFILES= $(F77_SRC_FILES:.F=.o) $(C_SRC_FILES:.c=.o) $(F90_SRC_FILES:.F90=.o)' >> $MAKEFILE
2589 echo 'FLOFILES = $(AD_FLOW_FILES:.flow=.flowdir)' >> $MAKEFILE
2590 echo >> $MAKEFILE
2591 echo '.SUFFIXES:' >> $MAKEFILE
2592 echo '.SUFFIXES: .o .'$FS' .p .F .c .f'$FS90' .'$FS90' .FF90 .F90 .flowdir .flow' >> $MAKEFILE
2593
2594 cat >>$MAKEFILE <<EOF
2595
2596 all: \$(EXECUTABLE)
2597 \$(EXECUTABLE): \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(OBJFILES) \$(EMBEDDED_FILES)
2598 @echo Creating \$@ ...
2599 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
2600 depend:
2601 @make links
2602 \$(MAKEDEPEND) -o .$FS \$(DEFINES) \$(INCLUDES) \$(F77_SRC_FILES)
2603 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
2604 -rm -f makedepend.out
2605
2606 lib: libmitgcmuv.a
2607
2608 libmitgcmuv.a: \$(OBJFILES)
2609 ar rcv libmitgcmuv.a \$(OBJFILES)
2610 ar d libmitgcmuv.a main.o
2611
2612 links: \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(SPECIAL_FILES)
2613
2614 small_f: \$(F77_PP_SRC_FILES) \$(F90_PP_SRC_FILES)
2615
2616 output.txt: \$(EXECUTABLE)
2617 @printf 'running ... '
2618 @\$(EXECUTABLE) > \$@
2619
2620 clean:
2621 -rm -rf *.p *.$FS90 *.mod ${RMFILES} work.{pc,pcl} *.template
2622 -rm -rf *.o
2623 -rm -rf *.$FS *.flowdir
2624 -rm -rf *.f$FS90 *_mod.h *_mod.F90 *.FF90 *.mod-whirl ad_input*
2625 -rm -rf temp.sed
2626 Clean:
2627 @make clean
2628 @make cleanlinks
2629 -rm -f \$(SPECIAL_FILES)
2630 -rm -f genmake_state genmake_*optfile genmake_warnings make.log run.log f90mkdepend.log *.bak
2631 -rm -f taf_command taf_output taf_ad.log taf_ad_flow.log
2632 CLEAN:
2633 @make Clean
2634 -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
2635 -find \$(EXEDIR) -name "*.data" -exec rm {} \;
2636 -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
2637 -rm -f \$(EXECUTABLE) \$(EXE_AD) *.txt STD* *diagnostics.log datetime
2638 -rm -f *_MIT_CE_000.opt0000 costfunction*0000
2639 -rm -rf mnc_test_*
2640
2641 #eh3 Makefile: makefile
2642 makefile:
2643 $THIS_SCRIPT $G2ARGS
2644 cleanlinks:
2645 -find . -type l -exec rm {} \;
2646
2647 # Special targets (SPECIAL_FILES) which are created by make
2648 ${PACKAGES_DOT_H}:
2649 @echo Creating \$@ ...
2650 @$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) > \$@
2651 AD_CONFIG.h:
2652 @echo Creating \$@ ...
2653 @$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 > \$@
2654 FC_NAMEMANGLE.h:
2655 @echo Creating \$@ ...
2656 echo "$FC_NAMEMANGLE" > \$@
2657
2658 BUILD_INFO.h:
2659 @echo Creating \$@ ...
2660 EOF
2661
2662 test ! "x$THISVER" = x && echo " -echo \"#define THISVER '$THISVER'\" > \$@" >> $MAKEFILE
2663 test ! "x$THISUSER" = x && echo " -echo \"#define THISUSER '$THISUSER'\" >> \$@" >> $MAKEFILE
2664 test ! "x$THISDATE" = x && echo " -echo \"#define THISDATE '$THISDATE'\" >> \$@" >> $MAKEFILE
2665 test ! "x$THISHOST" = x && echo " -echo \"#define THISHOST '$THISHOST'\" >> \$@" >> $MAKEFILE
2666
2667 if test "x$EMBED_SRC" = xt ; then
2668 cat >>$MAKEFILE <<EOF
2669
2670 decode_files.o : EMBEDDED_FILES.h
2671
2672 ## \$(F77_PP_SRC_FILES)
2673 all_fF.tar.gz : \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(F77_PP_SRC_FILES) Makefile
2674 @echo Creating \$@ ...
2675 -tar -hcf all_fF.tar \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(F77_PP_SRC_FILES) Makefile
2676 -rm -f all_fF.tar.gz
2677 -gzip all_fF.tar
2678
2679 EMBEDDED_FILES.h : all_fF.tar.gz
2680 @echo Creating \$@ ...
2681 -\${ROOTDIR}/tools/embed_encode/encode_files EMBEDDED_FILES.h all_fF.tar.gz
2682
2683 EOF
2684 fi
2685
2686 cat >>$MAKEFILE <<EOF
2687
2688 # The normal chain of rules is ( .F - .$FS - .o )
2689
2690 ## This nullifies any default implicit rules concerning these two file types:
2691 ## %.o : %.F
2692
2693 .F.$FS:
2694 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2695 .$FS.o:
2696 \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
2697 .F90.$FS90:
2698 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2699 .FF90.f$FS90:
2700 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2701 .$FS90.o:
2702 \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
2703 .f$FS90.o:
2704 cp \$< \$(basename \$<).f90
2705 \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$(F90FIXEDFORMAT) \$(basename \$<).f90
2706 .c.o:
2707 \$(CC) \$(CFLAGS) \$(DEFINES) \$(INCLUDES) -c \$<
2708 .flow.flowdir:
2709 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2710
2711 # Special exceptions that use the ( .F - .p - .$FS - .o ) rule-chain
2712 .F.p:
2713 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2714 .p.$FS:
2715 \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
2716
2717 EOF
2718
2719 #=========================================
2720 #=== Automatic Differentiation Rules ===
2721 #=== for TAMC/TAF ======================
2722
2723 if test "x$OPENAD" == x ; then
2724
2725 cat >>$MAKEFILE <<EOF
2726
2727 TAMC = ${TAMC}
2728 TAF = ${TAF}
2729
2730 TAF_EXTRA = ${TAF_EXTRA}
2731 TAMC_EXTRA = ${TAMC_EXTRA}
2732
2733 EOF
2734
2735 ad_vars="AD_TAMC_FLAGS AD_TAF_FLAGS"
2736 ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF_FLAGS"
2737 ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
2738 for i in $ad_vars ; do
2739 name=$i
2740 t1="t2=\$"`echo "$i"`
2741 eval $t1
2742 printf "%-20s = " $name >> $MAKEFILE
2743 echo "$t2" | sed -e 's| \+| |g' >> $MAKEFILE
2744 done
2745
2746 echo " Add the source list for AD code generation"
2747 echo >> $MAKEFILE
2748 printf "AD_FILES = " >> $MAKEFILE
2749 AD_FILES=`cat adSrcFiles.tmp`
2750 for i in $AD_FILES ; do
2751 echo " \\" >> $MAKEFILE
2752 printf " $i" >> $MAKEFILE
2753 done
2754 echo >> $MAKEFILE
2755 rm -f adSrcFiles.tmp
2756
2757 cat >>$MAKEFILE <<EOF
2758
2759 # ... AD ...
2760 adall: \$(EXE_AD)
2761 adtaf: ad_taf_output.$FS
2762 adtamc: ad_tamc_output.$FS
2763
2764 ad_input_code.$FS: \$(AD_FILES) \$(H_SRC_FILES)
2765 @$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
2766 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
2767 -rm -f ad_config.template
2768 @make \$(F77_PP_SRC_FILES)
2769 @make \$(FLOFILES)
2770 cat \$(FLOFILES) \$(AD_FILES) > ad_input_code.$FS
2771
2772 ad_taf_output.$FS: ad_input_code.$FS
2773 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2774 ls -l ad_input_code_ad.$FS
2775 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2776
2777 adtafonly:
2778 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2779 ls -l ad_input_code_ad.$FS
2780 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2781
2782 \${EXE_AD}: ad_taf_output.o \$(OBJFILES)
2783 \$(LINK) -o \${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
2784
2785 ad_tamc_output.$FS: ad_input_code.$FS
2786 \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.$FS
2787 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.$FS
2788
2789 ad_tamc: ad_tamc_output.o \$(OBJFILES)
2790 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
2791
2792 adonlyfwd:
2793 patch < \$(TOOLSDIR)/ad_taf_output.f.onlyfwd.diff
2794
2795 adtrick:
2796 patch < \$(TOOLSDIR)/ad_taf_output.f.adtrick.diff
2797
2798 # ... FTL ...
2799 ftlall: ftl_taf
2800 ftltaf: ftl_taf_output.$FS
2801 ftltamc: ftl_tamc_output.$FS
2802
2803 ftl_input_code.$FS: \$(AD_FILES) \$(H_SRC_FILES)
2804 @$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
2805 cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
2806 -rm -f ftl_config.template
2807 @make \$(F77_PP_SRC_FILES)
2808 @make \$(AD_FLOW_FILES)
2809 cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.$FS
2810
2811 ftl_taf_output.$FS: ftl_input_code.$FS
2812 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
2813 ls -l ftl_input_code_ftl.$FS
2814 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
2815
2816 ftltafonly:
2817 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
2818 ls -l ftl_input_code_ftl.$FS
2819 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
2820
2821 ftl_taf: ftl_taf_output.o \$(OBJFILES)
2822 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
2823
2824 ftl_tamc_output.$FS: ftl_input_code.$FS
2825 \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.$FS
2826 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.$FS
2827
2828 ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
2829 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
2830
2831
2832 # ... SVD ...
2833 svdtaf: ad_taf_output.$FS ftl_taf_output.$FS
2834 @echo "--->>> Only ran TAF to generate SVD code! <<<---"
2835 @echo "--->>> Do make svdall afterwards to compile. <<<---"
2836 svdall: svd_touch svd_taf
2837
2838 svd_taf: \$(OBJFILES)
2839 \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
2840
2841 @echo "--->>> Only COMPILE svd code! <<<---"
2842 @echo "--->>> Assumes you previously <<<---"
2843 @echo "--->>> did make svdtaf <<<---"
2844
2845 svd_touch:
2846 @echo "--->>> Only COMPILE svd code! <<<---"
2847 @echo "--->>> Assumes you previously <<<---"
2848 @echo "--->>> did make svdtaf <<<---"
2849 touch ad_taf_output.$FS ftl_taf_output.$FS
2850 \$(FC) \$(FFLAGS) \$(FOPTIM) -c ad_taf_output.$FS
2851 \$(FC) \$(FFLAGS) \$(FOPTIM) -c ftl_taf_output.$FS
2852 @$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
2853 cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
2854 -rm -f ftl_config.template
2855
2856 EOF
2857
2858 fi
2859
2860 #=== for OpenAD ========================
2861
2862 if test "x$OPENAD" != x ; then
2863
2864 # ============ begin OpenAD specific section ==============
2865
2866 cat >>$MAKEFILE <<EOF
2867
2868 # all the source files linked from the various locations:
2869 ALL_LINKED_FILES= \
2870 \$(F77_SRC_FILES) \
2871 \$(C_SRC_FILES) \
2872 \$(H_SRC_FILES) \
2873 \$(F90_SRC_FILES) \
2874 \$(SPECIAL_FILES)
2875
2876 ifndef OPENADROOT
2877 \$(error "Error: environment variable OPENADROOT not defined!")
2878 endif
2879
2880 ifndef XAIFSCHEMAROOT
2881 \$(error "Error: environment variable XAIFSCHEMAROOT not defined!")
2882 endif
2883
2884 ifndef XAIFBOOSTERROOT
2885 \$(error "Error: environment variable XAIFBOOSTERROOT not defined!")
2886 endif
2887
2888 EOF
2889
2890 echo " Add the source list for common block to module conversion "
2891 echo >> $MAKEFILE
2892 printf "CB2M_F90_SRC_NAMES = " >> $MAKEFILE
2893 for i in `cat ${OAD_CB2M_FILES}` ; do
2894 echo " \\" >> $MAKEFILE
2895 printf " $i" >> $MAKEFILE
2896 done
2897 echo >> $MAKEFILE
2898
2899 echo " Add the source list for AD code generation"
2900 echo >> $MAKEFILE
2901 printf "AD_FILES = " >> $MAKEFILE
2902 for i in `cat ${OAD_CB2M_FILES}` ; do
2903 echo " \\" >> $MAKEFILE
2904 printf " ${i}_mod.f$FS90" >> $MAKEFILE
2905 done
2906 AD_FILES=`cat adSrcFiles.tmp`
2907 for i in $AD_FILES ; do
2908 basename=${i%%.f}
2909 toBeIgnored=`egrep ^$basename'[ ]*' ${OAD_DONT_COMPILE} ${OAD_DONT_TRANSFORM}`
2910 if test -z "$toBeIgnored" ; then
2911 echo " \\" >> $MAKEFILE
2912 printf " $i" >> $MAKEFILE
2913 fi
2914 done
2915 echo >> $MAKEFILE
2916 rm -f adSrcFiles.tmp
2917
2918 cat >>$MAKEFILE <<EOF
2919
2920 adAll: \$(EXE_AD)
2921 .PHONY: adAll
2922
2923 CB2M_F90_PP_SRC_FILES=\$(addsuffix _mod.f$FS90, \$(CB2M_F90_SRC_NAMES))
2924
2925 .PRECIOUS: \$(CB2M_F90_PP_SRC_FILES) \$(NON_AD_F77_SRC_FILES:.F=_cb2m.f$FS90)
2926
2927 .PHONY: adDepend
2928 adDepend: \$(ALL_LINKED_FILES) \$(addsuffix _mod.h, \$(CB2M_F90_SRC_NAMES)) \$(addsuffix _mod.FF90, \$(CB2M_F90_SRC_NAMES)) \$(F77_SRC_FILES:.F=_cb2m.FF90)
2929 \$(MAKEDEPEND) -o .$FS \$(DEFINES) \$(INCLUDES) \$(F77_SRC_FILES)
2930 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
2931 -rm -f makedepend.out
2932
2933 OPENAD_SUPPORT_F90_SRC_FILES = \
2934 w2f__types.F90 \
2935 OAD_active.F90 \
2936 OAD_cp.F90 \
2937 OAD_rev.F90 \
2938 OAD_tape.F90
2939
2940 OPENAD_SUPPORT_C_SRC_FILES = \
2941 iaddr.c \
2942 timeRatio.c
2943
2944 f95_test_mods.f90: \$(OPENAD_SUPPORT_F90_SRC_FILES:F90=$FS90)
2945 cat \$^ > \$@
2946
2947 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
2948 cat \$^ > \$@
2949
2950 f95_test.out: f95_test_mods.f90 f95_test.f90
2951 f95 -fixed -w=unused -maxcontin=132 -c f95_test_mods.f90 > \$@ 2>&1
2952 f95 -fixed -w=unused -maxcontin=132 -c -fixed f95_test.f90 >> \$@ 2>&1
2953
2954 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)
2955
2956 \$(EXE_AD): \$(ALL_LINKED_FILES) \$(addsuffix _mod.h, \$(CB2M_F90_SRC_NAMES)) \$(AD_OBJ_FILES)
2957 @echo Creating \$@ ...
2958 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(AD_OBJ_FILES) \$(LIBS)
2959
2960 # makefile debug rule
2961 openad: ad_input_code.w2f.pre.xb.x2w.w2f.td.pp.f$FS90
2962 .PHONY: openad
2963
2964 # create the module files
2965 %_mod.FF90 : %.h ../OAD_support/cb2mGetModules.csh ../OAD_support/cb2mGetModules.awk
2966 ../OAD_support/cb2mGetModules.csh $< ../OAD_support/cb2mGetModules.awk
2967
2968 # create the header files
2969 %_mod.h : %.h ../OAD_support/cb2mGetHeaders.csh ../OAD_support/cb2mGetHeaders.awk
2970 ../OAD_support/cb2mGetHeaders.csh $< ../OAD_support/cb2mGetHeaders.awk \$(CB2M_F90_SRC_NAMES)
2971
2972 # change everybody else to use the new module files:
2973 %_cb2m.FF90 : %.F ../OAD_support/cb2mUseModules.bash
2974 ../OAD_support/cb2mUseModules.bash $< ${MPI}
2975
2976 # makefile debug rule
2977 small_f: \$(CB2M_F90_PP_SRC_FILES)
2978 .PHONY: small_f
2979
2980 ad_output.txt: \$(EXE_AD)
2981 @printf 'linking data files ... '
2982 \$(LN) -f ../input_ad/data* ../input_ad/eedata .
2983 \$(LN) -f ../../global_ocean.90x40x15/input/*.bin .
2984 @printf 'running ... '
2985 @./\$(EXE_AD) > \$@
2986
2987 CB2M_AD_FILES=\$(AD_FILES:.f=_cb2m.f$FS90)
2988 ad_input_code.f$FS90: ../OAD_support/maxMinDefs.f \$(CB2M_AD_FILES)
2989 cat \$^ > \$@
2990
2991 # strip all comments and blanks to reduce
2992 # the file size in order to reduce perl's memory requirements
2993 ad_input_code_sf.f$FS90 : ad_input_code.f$FS90
2994 cat \$^ | sed -f ../OAD_support/strip.sed | sed -f ../OAD_support/stop2print.sed > \$@
2995
2996 # mfef90 preprocessing
2997 # expand statement functions
2998 # expose mfef90 specific substring handling
2999 # add the w2f__types module
3000 ad_input_code_sf.w2f.f$FS90: ad_input_code_sf.f$FS90 mfef90 whirl2f whirl2f_be w2f__types.f90
3001 ./mfef90 -r8 -z -F -N132 \$<
3002 mv \$<.B \$(basename \$<).B
3003 ./whirl2f -openad \$(basename \$<).B
3004 cat w2f__types.f90 \$(basename \$<).w2f.f > \$@
3005
3006 # canonicalizer
3007 ad_input_code_sf.w2f.pre.f$FS90: ad_input_code_sf.w2f.f$FS90 preProcess.py
3008 ./preProcess.py --mode=reverse \$< -o \$@
3009
3010 # F -> WHIRL
3011 # note that the canonicalized version cuts off at col 72
3012 # doing this also for string constants which is ok as long
3013 # as we are in fixed mode and cut of exactly there.
3014 # Otherwise mfef90 patches in spaces to fill up to 72 (or 132)
3015 # characters respectively.
3016 ad_input_code_sf.w2f.pre.B: ad_input_code_sf.w2f.pre.f$FS90 mfef90
3017 ./mfef90 -r8 -z -F \$<
3018 mv \$<.B \$@
3019
3020 # WHIRL -> XAIF
3021 ad_input_code_sf.w2f.pre.xaif : ad_input_code_sf.w2f.pre.B whirl2xaif
3022 ./whirl2xaif -s -n --debug 1 -o \$@ \$<
3023
3024 # XAIF -> XAIF'
3025 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
3026 ./openad_adm -f -t forward_step -i \$< -c \${XAIFSCHEMAROOT}/schema/examples/inlinable_intrinsics.xaif -o \$@ -I -r
3027
3028 # XAIF' -> WHIRL'
3029 ad_input_code_sf.w2f.pre.xb.x2w.B : ad_input_code_sf.w2f.pre.xb.xaif xaif2whirl
3030 ./xaif2whirl --debug 1 --structured ad_input_code_sf.w2f.pre.B \$<
3031
3032 # WHIRL' -> F'
3033 ad_input_code_sf.w2f.pre.xb.x2w.w2f.f$FS90: ad_input_code_sf.w2f.pre.xb.x2w.B whirl2f whirl2f_be
3034 ./whirl2f -FLIST:ftn_file=\$@ -openad \$<
3035
3036 # insert template directives
3037 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
3038 ../OAD_support/insertTemplateDir.bash \$< \$@
3039
3040 # postprocess F'
3041 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)
3042 perl multi-pp.pl -inline=../OAD_support/ad_inline.f \$<
3043 # the postprocessor still gets the name wrong
3044 cat \$<.pp | sed 's/RETURN//' > \$@
3045
3046 # extract all transformed modules
3047 all_mods.xb.x2w.w2f.pp.f$FS90: ad_input_code_sf.w2f.pre.xb.x2w.w2f.td.pp.f$FS90
3048 cat \$< | sed -n '/MODULE /,/END MODULE/p' > \$@
3049
3050 # remove the transformed globals module from the
3051 # transformed ad_input_code file
3052 # and remove for now the duplicate variables
3053 # and fix 2 data statements
3054 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
3055 cat \$< | sed '/MODULE /,/END MODULE/d' | sed '/^ INTEGER(w2f__i4) DOLOOP_UB/d' > \$@
3056
3057 # setup some links
3058 %.xsd:
3059 \$(LN) \${XAIFSCHEMAROOT}/schema/\$@ .
3060
3061 mfef90:
3062 \$(LN) \${OPEN64ROOT}/crayf90/sgi/mfef90 .
3063
3064 # link the support files:
3065 \$(OPENAD_SUPPORT_F90_SRC_FILES) \$(OPENAD_SUPPORT_C_SRC_FILES):
3066 \$(LN) ../OAD_support/\$@ .
3067
3068 whirl2xaif xaif2whirl:
3069 \$(LN) \${OPENADFORTTK}/bin/\$@ .
3070
3071 %.pl:
3072 \$(LN) \${OPENADFORTTK}/bin/\$@ .
3073
3074 preProcess.py:
3075 \$(LN) \${OPENADFORTTK_BASE}/tools/SourceProcessing/\$@ .
3076
3077 whirl2f whirl2f_be:
3078 \$(LN) \${OPEN64ROOT}/whirl2f/\$@ .
3079
3080 openad_adm:
3081 \$(LN) \${XAIFBOOSTERROOT}/xaifBooster/algorithms/BasicBlockPreaccumulationReverse/test/t \$@
3082
3083 # ============ end OpenAD specific section ==============
3084
3085 EOF
3086
3087 fi
3088
3089 #=========================================
3090
3091 if test "x$EXEHOOK" != x ; then
3092 printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE
3093 fi
3094
3095 echo " Making list of \"exceptions\" that need \".p\" files"
3096 for i in $KPPFILES ; do
3097 base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
3098 RETVAL=$?
3099 if test "x$RETVAL" != x0 ; then
3100 echo "Error: unable to add file \"$i\" to the exceptions list"
3101 fi
3102 echo "$base.$FS: $base.p" >> $MAKEFILE
3103 done
3104
3105 echo " Making list of NOOPTFILES"
3106 for i in $NOOPTFILES ; do
3107 base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
3108 RETVAL=$?
3109 if test "x$RETVAL" != x0 ; then
3110 echo "Error: unable to add file \"$i\" to the exceptions list"
3111 fi
3112 echo "$base.o: $base.$FS" >> $MAKEFILE
3113 printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE
3114 done
3115
3116 echo " Add rules for links"
3117 cat srclinks.tmp >> $MAKEFILE
3118 rm -f srclinks.tmp
3119
3120 echo " Adding makedepend marker"
3121 printf "\n\n# DO NOT DELETE\n" >> $MAKEFILE
3122
3123 printf "\n=== Done ===\n"
3124
3125 # Create special header files
3126 $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"
3127 if test ! -f $PACKAGES_DOT_H ; then
3128 mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
3129 else
3130 cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H > /dev/null 2>&1
3131 RETVAL=$?
3132 if test "x$RETVAL" = x0 ; then
3133 rm -f $PACKAGES_DOT_H".tmp"
3134 else
3135 mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"
3136 mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
3137 fi
3138 fi
3139 if test ! -f AD_CONFIG.h ; then
3140 $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
3141 fi
3142
3143
3144 # Write the "state" for future records
3145 if test "x$DUMPSTATE" != xf ; then
3146 printf "" > genmake_state
3147 for i in $gm_state ; do
3148 t1="t2=\$$i"
3149 eval $t1
3150 echo "$i='$t2'" >> genmake_state
3151 done
3152 fi

  ViewVC Help
Powered by ViewVC 1.1.22