/[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.262 - (show annotations) (download)
Thu Aug 22 20:49:59 2013 UTC (10 years, 7 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint64q, checkpoint64p, checkpoint64s, checkpoint64r, checkpoint64o, checkpoint64n
Changes since 1.261: +11 -11 lines
put most of the temp-files on local /tmp disk (if permission to write)

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

  ViewVC Help
Powered by ViewVC 1.1.22