/[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.231 - (show annotations) (download)
Fri Jul 6 18:55:13 2012 UTC (7 years, 1 month ago) by jmc
Branch: MAIN
CVS Tags: checkpoint63q
Changes since 1.230: +6 -6 lines
remove "#undef ALLOW_ECCO_OPTIMIZATION" from AD_CONFIG.h

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

  ViewVC Help
Powered by ViewVC 1.1.22