/[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.269 - (show annotations) (download)
Thu Feb 19 20:48:43 2015 UTC (4 years, 8 months ago) by jmc
Branch: MAIN
Changes since 1.268: +100 -13 lines
add option for an alternative Makefile where multiple source files are sent
to TAF (instead of all in one file) resulting in multiple files compilation

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

  ViewVC Help
Powered by ViewVC 1.1.22