/[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.210 - (show annotations) (download)
Tue Nov 2 00:51:11 2010 UTC (9 years ago) by jmc
Branch: MAIN
Changes since 1.209: +30 -15 lines
- change Makefile to remove testreport output files only with "CLEAN" target
  (instead of "Clean");
- add description (comments in Makefile) of the 3 cleaning target.
- try to make "genmake_warnings" easier to read

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

  ViewVC Help
Powered by ViewVC 1.1.22