/[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.209 - (show annotations) (download)
Mon Nov 1 00:20:28 2010 UTC (13 years, 4 months ago) by jmc
Branch: MAIN
Changes since 1.208: +5 -2 lines
- clean previous genmake log files before anything else.
- change Makefile to clean genmake log files only with "CLEAN" target
  (instead of "Clean")

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

  ViewVC Help
Powered by ViewVC 1.1.22