/[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.213 - (show annotations) (download)
Fri Nov 5 16:28:59 2010 UTC (13 years, 4 months ago) by jmc
Branch: MAIN
Changes since 1.212: +14 -9 lines
use CFLAGS to test C compiler (+ report in genmake.log file)

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

  ViewVC Help
Powered by ViewVC 1.1.22