/[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.220 - (show annotations) (download)
Fri Jun 3 19:53:45 2011 UTC (12 years, 9 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint62z
Changes since 1.219: +17 -20 lines
- ignore "-noieee" option (this is the default anyway) and add a warning.
- option "-devel" also switch on "-ieee"

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

  ViewVC Help
Powered by ViewVC 1.1.22