/[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.208 - (show annotations) (download)
Thu May 27 02:09:13 2010 UTC (13 years, 9 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint62k, checkpoint62j, checkpoint62i, checkpoint62h, checkpoint62m, checkpoint62l
Changes since 1.207: +81 -66 lines
- remove "-pdefault" option: redundant with the use of "packages.conf".
- remove file pkg/pkg_default : set the default as a pkg group
  ("default_pkg_list") defined in pkg/pkg_groups.
- fix for case pkg/pkg_depend is missing (was hanging before).
- add option "-pgroups" to specify a different pkg_groups than the default.

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

  ViewVC Help
Powered by ViewVC 1.1.22