/[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.274 - (show annotations) (download)
Fri Nov 20 01:22:36 2015 UTC (8 years, 4 months ago) by jmc
Branch: MAIN
Changes since 1.273: +2 -4 lines
from Jinxuan Zhu: fix etime option (for gfortran)

1 #! /usr/bin/env bash
2 #
3 # $Header: /u/gcmpack/MITgcm/tools/genmake2,v 1.273 2015/09/01 19:39:56 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_${USER}_$$
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 call etime( tarray, actual )
1972 print *, tarray
1973 end
1974 EOF
1975 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1976 RETVAL=$?
1977 if test "x$RETVAL" = x0 ; then
1978 HAVE_ETIME=t
1979 DEFINES="$DEFINES -DHAVE_ETIME"
1980 echo "yes"
1981 else
1982 HAVE_ETIME=
1983 echo "no"
1984 fi
1985 rm -f genmake_tcomp*
1986
1987 printf " Can we call simple C routines (here, \"cloc()\") using $FC... "
1988 check_HAVE_CLOC
1989 if test "x$HAVE_CLOC" != x ; then
1990 DEFINES="$DEFINES -DHAVE_CLOC"
1991 echo "yes"
1992 else
1993 echo "no"
1994 if test "x$EMBED_SRC" = xt ; then
1995 echo " WARNING: you requested file embedding but it has"
1996 echo " been disabled since C code cannot be called"
1997 EMBED_SRC=
1998 fi
1999 fi
2000 rm -f genmake_t*
2001
2002 printf " Can we unlimit the stack size using $FC... "
2003 check_HAVE_SETRLSTK
2004 if test "x$HAVE_SETRLSTK" = xt ; then
2005 DEFINES="$DEFINES -DHAVE_SETRLSTK"
2006 echo "yes"
2007 else
2008 echo "no"
2009 fi
2010 rm -f genmake_t*
2011
2012 printf " Can we register a signal handler using $FC... "
2013 check_HAVE_SIGREG
2014 if test "x$HAVE_SIGREG" = xt ; then
2015 DEFINES="$DEFINES -DHAVE_SIGREG"
2016 echo "yes"
2017 else
2018 echo "no"
2019 fi
2020 rm -f genmake_t*
2021
2022 printf " Can we use stat() through C calls... "
2023 check_HAVE_STAT
2024 if test "x$HAVE_STAT" != x ; then
2025 DEFINES="$DEFINES -DHAVE_STAT"
2026 echo "yes"
2027 else
2028 echo "no"
2029 fi
2030 rm -f genmake_t*
2031
2032 printf " Can we create NetCDF-enabled binaries... "
2033 check_netcdf_libs
2034 if test "x$HAVE_NETCDF" != x ; then
2035 DEFINES="$DEFINES -DHAVE_NETCDF"
2036 echo "yes"
2037 else
2038 echo "no"
2039 fi
2040
2041 printf " Can we create LAPACK-enabled binaries... "
2042 check_lapack_libs
2043 if test "x$HAVE_LAPACK" != x ; then
2044 DEFINES="$DEFINES -DHAVE_LAPACK"
2045 echo "yes"
2046 else
2047 echo "no"
2048 fi
2049
2050 printf " Can we call FLUSH intrinsic subroutine... "
2051 check_HAVE_FLUSH
2052 if test "x$HAVE_FLUSH" = xt ; then
2053 DEFINES="$DEFINES -DHAVE_FLUSH"
2054 echo "yes"
2055 else
2056 echo "no"
2057 fi
2058
2059 DEFINES="$DEFINES $IGNORE_TIME"
2060 if test "x$EMBED_SRC" = xt ; then
2061 build_embed_encode
2062 fi
2063 if test "x$EMBED_SRC" = xt ; then
2064 ENABLE="$ENABLE embed_files"
2065 # DEFINES="$DEFINES -DHAVE_EMBED_SRC"
2066 fi
2067
2068 printf "\n=== Setting defaults ===\n"
2069 printf " Adding MODS directories: "
2070 for d in $MODS ; do
2071 if test ! -d $d ; then
2072 echo
2073 echo "Error: MODS directory \"$d\" not found!"
2074 exit 1
2075 else
2076 printf "$d "
2077 SOURCEDIRS="$SOURCEDIRS $d"
2078 INCLUDEDIRS="$INCLUDEDIRS $d"
2079 fi
2080 done
2081 echo
2082
2083 #if test "x${PLATFORM}" = x ; then
2084 # PLATFORM=$p_PLATFORM
2085 #fi
2086
2087 if test "x${EXEDIR}" = x ; then
2088 tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
2089 if test "x$tmp" = "xbin" -a -d ../exe -a $ROOTDIR = .. ; then
2090 EXEDIR=../exe
2091 else
2092 EXEDIR=.
2093 fi
2094 fi
2095 if test ! -d ${EXEDIR} ; then
2096 echo "Error: the specified EXEDIR (\"$EXEDIR\") does not exist!"
2097 exit 1
2098 fi
2099
2100 if test "x${TOOLSDIR}" = x ; then
2101 TOOLSDIR="$ROOTDIR/tools"
2102 fi
2103 if test ! -d ${TOOLSDIR} ; then
2104 echo "Error: the specified TOOLSDIR (\"$TOOLSDIR\") does not exist!"
2105 exit 1
2106 fi
2107 if test "x$S64" = x ; then
2108 echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.sh > /dev/null 2>&1
2109 RETVAL=$?
2110 if test "x${RETVAL}" = x0 ; then
2111 S64='$(TOOLSDIR)/set64bitConst.sh'
2112 else
2113 echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.csh > /dev/null 2>&1
2114 RETVAL=$?
2115 if test "x${RETVAL}" = x0 ; then
2116 S64='$(TOOLSDIR)/set64bitConst.csh'
2117 else
2118 cat <<EOF
2119
2120 ERROR: neither of the two default scripts:
2121
2122 ${TOOLSDIR}/set64bitConst.sh
2123 ${TOOLSDIR}/set64bitConst.csh
2124
2125 are working so please check paths or specify (with \$S64) a
2126 working version of this script.
2127
2128 EOF
2129 exit 1
2130 fi
2131 fi
2132 fi
2133 THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`
2134
2135 EXECUTABLE=${EXECUTABLE:-mitgcmuv}
2136
2137 # Set Standard Code Directories:
2138 if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
2139 STANDARDDIRS="eesupp model"
2140 fi
2141 # if model in Standard-Code-Dir, add eesupp (needed to compile model)
2142 echo " $STANDARDDIRS " | grep ' model ' > /dev/null 2>&1
2143 ckM=$?
2144 echo " $STANDARDDIRS " | grep ' eesupp ' > /dev/null 2>&1
2145 ckE=$?
2146 if test $ckM = 0 -a $ckE = 1 ; then
2147 STANDARDDIRS="$STANDARDDIRS eesupp"
2148 fi
2149
2150 # We have a special set of source files in eesupp/src which are
2151 # generated from some template source files. We'll make them first so
2152 # they appear as regular source code
2153 if test -r $ROOTDIR"/eesupp/src/Makefile" ; then
2154 echo " Making source files in eesupp from templates"
2155 ( cd $ROOTDIR"/eesupp/src/" && $MAKE clean_old && $MAKE \
2156 ) > make_eesupp.errors 2>&1
2157 RETVAL=$?
2158 if test "x${RETVAL}" = x0 ; then
2159 rm -f make_eesupp.errors
2160 else
2161 echo "Error: problem encountered while building source files in eesupp:"
2162 cat make_eesupp.errors 1>&2
2163 exit 1
2164 fi
2165 fi
2166
2167 #same for pkg/exch2 and pkg/regrid
2168 for pdir in exch2 regrid ; do
2169 if test -r $ROOTDIR"/pkg/${pdir}/Makefile" ; then
2170 echo " Making source files in pkg/${pdir} from templates"
2171 ( cd $ROOTDIR"/pkg/"${pdir} && $MAKE clean_old && $MAKE \
2172 ) > make_${pdir}.errors 2>&1
2173 RETVAL=$?
2174 if test "x${RETVAL}" = x0 ; then
2175 rm -f make_${pdir}.errors
2176 else
2177 echo "Error: problem encountered while building source files in pkg/${pdir}:"
2178 cat make_${pdir}.errors 1>&2
2179 exit 1
2180 fi
2181 fi
2182 done
2183
2184 printf "\n=== Determining package settings ===\n"
2185 if test "x${PKG_DEPEND}" = x ; then
2186 tmp=$ROOTDIR"/pkg/pkg_depend"
2187 if test -r $tmp ; then PKG_DEPEND=$tmp ; fi
2188 fi
2189 if test "x${PKG_DEPEND}" = x ; then
2190 echo "Warning: No package dependency information was specified."
2191 echo " Please check that ROOTDIR/pkg/pkg_depend exists."
2192 else
2193 if test ! -r ${PKG_DEPEND} ; then
2194 echo "Error: can't read package dependency info from PKG_DEPEND=\"$PKG_DEPEND\""
2195 exit 1
2196 fi
2197 echo " getting package dependency info from $PKG_DEPEND"
2198 # Strip the comments and then convert the dependency file into arrays: PNAME, DNAME
2199 get_pdepend_list $PKG_DEPEND
2200 fi
2201
2202 # A default package groups file "$ROOTDIR/pkg/pkg_groups" is provided
2203 # to define the "default_pkg_list" and package groups (for convenience, one
2204 # can specify a group of packages using names like "ocean" and "atmosphere").
2205 if test "x${PKG_GROUPS}" = x ; then
2206 tmp=$ROOTDIR"/pkg/pkg_groups"
2207 if test -r $tmp ; then PKG_GROUPS=$tmp ; fi
2208 fi
2209 if test "x${PKG_GROUPS}" = x ; then
2210 echo "Warning: No package groups information was specified."
2211 echo " Please check that ROOTDIR/pkg/pkg_groups exists."
2212 else
2213 if test ! -r ${PKG_GROUPS} ; then
2214 echo "Error: can't read package groups info from PKG_GROUPS=\"$PKG_GROUPS\""
2215 exit 1
2216 fi
2217 echo " getting package groups info from $PKG_GROUPS"
2218 fi
2219
2220 # Search for packages to compile.
2221 echo " checking list of packages to compile:"
2222 PKG_LIST=
2223 if test "x${PKG_LIST}" = x ; then
2224 for i in "." $MODS ; do
2225 if test -r $i"/packages.conf" ; then
2226 PKG_LIST=$i"/packages.conf"
2227 break
2228 fi
2229 done
2230 fi
2231 if test "x${PKG_LIST}" = x ; then
2232 pkg_list='default_pkg_list'
2233 if test "x${PKG_GROUPS}" = x ; then
2234 echo "Error: need package groups info to expand pkg_list=\"$pkg_list\""
2235 exit 1
2236 fi
2237 else
2238 if test ! -r $PKG_LIST ; then
2239 echo "Error: can't read package list from PKG_LIST=\"$PKG_LIST\""
2240 exit 1
2241 else
2242 echo " using PKG_LIST=\"$PKG_LIST\""
2243 # Strip the comments and add all the names
2244 pkg_list=`cat $PKG_LIST | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
2245 RETVAL=$?
2246 if test "x${RETVAL}" != x0 ; then
2247 printf "Error: can't parse package list "
2248 echo "-- please check PKG_LIST=\"$PKG_LIST\""
2249 exit 1
2250 fi
2251 fi
2252 fi
2253 for i in $pkg_list ; do
2254 PACKAGES="$PACKAGES $i"
2255 done
2256 echo " before group expansion packages are:$PACKAGES"
2257 if test "x${PKG_GROUPS}" != x ; then
2258 RET=1
2259 while test $RET = 1 ; do expand_pkg_groups; RET=$?; done
2260 echo " after group expansion packages are: $PACKAGES"
2261 fi
2262
2263 echo " applying DISABLE settings"
2264 echo "" > $TMP.pack
2265 for i in $PACKAGES ; do
2266 echo $i >> $TMP.pack
2267 done
2268 for i in `grep "-" $TMP.pack` ; do
2269 j=`echo $i | sed 's/[-]//'`
2270 DISABLE="$DISABLE $j"
2271 done
2272 pack=
2273 for p in $PACKAGES ; do
2274 addit="t"
2275 for d in $DISABLE ; do
2276 if test "x$p" = "x$d" ; then
2277 addit="f"
2278 fi
2279 done
2280 if test "x$addit" = xt ; then
2281 pack="$pack $p"
2282 fi
2283 done
2284 PACKAGES="$pack"
2285 echo " applying ENABLE settings"
2286 echo "" > $TMP.pack
2287 PACKAGES="$PACKAGES $ENABLE"
2288 # Test if each explicitly referenced package exists
2289 for i in $PACKAGES ; do
2290 j=`echo $i | sed 's/[-+]//'`
2291 if test ! -d "$ROOTDIR/pkg/$j" ; then
2292 echo "Error: dir '$ROOTDIR/pkg/$i' missing for package '$i'"
2293 exit 1
2294 fi
2295 echo $i >> $TMP.pack
2296 done
2297 PACKAGES=
2298 for i in `grep -v "-" $TMP.pack | sort | uniq` ; do
2299 PACKAGES="$PACKAGES $i"
2300 done
2301 rm -f $TMP.pack
2302 echo " packages are: $PACKAGES"
2303
2304 # Check for package MNC: if NetCDF is available, then build the MNC
2305 # template files ; otherwise, delete mnc from the list of packages.
2306 echo " $PACKAGES " | grep ' mnc ' > /dev/null 2>&1
2307 mnc_in=$?
2308 if test "x$HAVE_NETCDF" != xt ; then
2309 if test "x$mnc_in" = x0 ; then
2310 cat <<EOF
2311 *********************************************************************
2312 WARNING: the "mnc" package was enabled but tests failed to compile
2313 NetCDF applications. Please check that:
2314
2315 1) NetCDF is correctly installed for this compiler and
2316 2) the LIBS variable (within the "optfile") specifies the correct
2317 NetCDF library to link against.
2318
2319 Due to this failure, the "mnc" package is now DISABLED.
2320 *********************************************************************
2321 EOF
2322 PACKAGES=`echo $PACKAGES | sed -e 's/mnc//g'`
2323 DISABLE="$DISABLE mnc"
2324 else
2325 # this prevent to add mnc (due to pdepend rules) if not available
2326 DISABLE="$DISABLE mnc"
2327 fi
2328 else
2329 # we have NetCDF, we try to build MNC template files
2330 ( cd $ROOTDIR"/pkg/mnc" && $MAKE testclean && $MAKE templates ) > make_mnc.errors 2>&1
2331 RETVAL=$?
2332 if test "x${RETVAL}" = x0 ; then
2333 rm -f make_mnc.errors
2334 else
2335 echo "Error: problem encountered while building source files in pkg/mnc:"
2336 cat make_mnc.errors 1>&2
2337 if test "x$mnc_in" = x0 ; then
2338 exit 1
2339 else
2340 DISABLE="$DISABLE mnc"
2341 fi
2342 fi
2343 fi
2344
2345 # Check for package PROFILES: if NetCDF is not available,
2346 # then delete profiles from the list of available packages.
2347 if test "x$HAVE_NETCDF" != xt ; then
2348 echo " $PACKAGES " | grep ' profiles ' > /dev/null 2>&1
2349 RETVAL=$?
2350 if test "x$RETVAL" = x0 ; then
2351 cat <<EOF
2352 *********************************************************************
2353 WARNING: the "profiles" package was enabled but tests failed to
2354 compile NetCDF applications. Please check that:
2355
2356 1) NetCDF is correctly installed for this compiler and
2357 2) the LIBS variable (within the "optfile") specifies the correct
2358 NetCDF library to link against.
2359
2360 Due to this failure, the "profiles" package is now DISABLED.
2361 *********************************************************************
2362 EOF
2363 PACKAGES=`echo $PACKAGES | sed -e 's/profiles//g'`
2364 DISABLE="$DISABLE profiles"
2365 else
2366 # this prevent to add profiles (due to pdepend rules) if not available
2367 DISABLE="$DISABLE profiles"
2368 fi
2369 fi
2370
2371 # Make sure the openad package is enabled if using OpenAD
2372 if test "x$OPENAD" != x ; then
2373 echo " $PACKAGES " | grep ' openad ' > /dev/null 2>&1
2374 RETVAL=$?
2375 if test "x$RETVAL" != x0 ; then
2376 cat <<EOF
2377
2378 *********************************************************************
2379 ERROR: when generating an adjoint with OpenAD, the openad package
2380 must be enabled. Please add it to packages.conf.
2381 *********************************************************************
2382
2383 EOF
2384 exit 1
2385 fi
2386 fi
2387
2388 if test "x${PKG_DEPEND}" != x ; then
2389 echo " applying package dependency rules"
2390 ck=
2391 while test "x$ck" != xtt ; do
2392 i=0
2393 # rtot=${#PNAME[@]}
2394 rtot=$nname
2395 while test $i -le $rtot ; do
2396
2397 # Is $pname in the current $PACKAGES list?
2398 # pname=${PNAME[$i]}
2399 tmp="pname=\"\$PNAME_$i\""
2400 eval $tmp
2401 pin="f"
2402 for p in $PACKAGES ; do
2403 if test "x$p" = "x$pname" ; then
2404 pin="t"
2405 fi
2406 done
2407 # or in the current $STANDARDDIRS list?
2408 for p in $STANDARDDIRS ; do
2409 if test "x$p" = "x$pname" ; then pin="t" ; fi
2410 done
2411
2412 # Is the DNAME entry a (+) or (-) rule ?
2413 tmp="dname=\"\$DNAME_$i\""
2414 eval $tmp
2415 plus="-"
2416 echo $dname | grep '^+' > /dev/null 2>&1
2417 RETVAL=$?
2418 if test "x$RETVAL" = x0 ; then
2419 plus="+"
2420 fi
2421
2422 # Is $dname in the current $PACKAGES list?
2423 dname=`echo $dname | sed -e 's/^[+-]//'`
2424 din="f"
2425 for p in $PACKAGES ; do
2426 if test "x$p" = "x$dname" ; then
2427 din="t"
2428 fi
2429 done
2430
2431 # Do we need to add $dname according to the dependency rules?
2432 if test "x$pin" = xt -a "x$plus" = "x+" -a "x$din" = xf ; then
2433 #echo " " $pname ": need to add :" $dname
2434 in_dis="f"
2435 for dis in $DISABLE ; do
2436 if test "x$dis" = "x$dname" ; then
2437 in_dis="t"
2438 fi
2439 done
2440 if test "x$in_dis" = xt ; then
2441 echo "Error: can't satisfy package dependencies:"
2442 echo " \"$dname\" is required by the dependency rules"
2443 echo " but is disallowed by the DISABLE settings"
2444 exit 1
2445 else
2446 PACKAGES="$PACKAGES $dname"
2447 ck=
2448 fi
2449 fi
2450
2451 # Do we need to get rid of $dname according to the dependency rules?
2452 if test "x$pin" = xt -a "x$plus" = "x-" -a "x$din" = xt; then
2453 echo "Error: can't satisfy package dependencies:"
2454 echo " \"$pname\" was requested but is disallowed by"
2455 echo " the dependency rules for \"$dname\""
2456 exit 1
2457 fi
2458 i=`echo "$i + 1" | bc -l`
2459 #i=$(( $i + 1 ))
2460 done
2461 ck=$ck"t"
2462 done
2463 echo " packages are: $PACKAGES"
2464 fi
2465 for i in $PACKAGES ; do
2466 adr="$ROOTDIR/pkg/$i"
2467 if test -d $adr ; then
2468 SOURCEDIRS="$SOURCEDIRS $adr"
2469 INCLUDEDIRS="$INCLUDEDIRS $adr"
2470 if test "x$i" = xautodiff ; then
2471 AUTODIFF_PKG_USED=t
2472 fi
2473 else
2474 echo "Error: the directory \"$adr\" for package $i doesn't exist"
2475 exit 1
2476 fi
2477 done
2478
2479 # Create a list of #define and #undef to enable/disable packages
2480 PACKAGES_DOT_H=PACKAGES_CONFIG.h
2481 # The following UGLY HACK sets multiple "#undef"s and it needs to go
2482 # away. On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h
2483 # file would eventually be split up so that all package-related #define
2484 # statements could be separated and handled only by genmake.
2485 names=`ls -1 "$ROOTDIR/pkg"`
2486 all_pack=
2487 DISABLED_PACKAGES=
2488 for n in $names ; do
2489 if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
2490 has_pack="f"
2491 for pack in $PACKAGES ; do
2492 if test "x$pack" = "x$n" ; then
2493 has_pack="t"
2494 break
2495 fi
2496 done
2497 if test "x$has_pack" = xf ; then
2498 undef=`echo "ALLOW_$n" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2499 DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
2500 fi
2501 fi
2502 done
2503 ENABLED_PACKAGES=
2504 for i in $PACKAGES ; do
2505 def=`echo "ALLOW_$i" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2506 ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
2507 #eh3 DEFINES="$DEFINES -D$def"
2508
2509 #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
2510 case $i in
2511 aim_v23)
2512 ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
2513 echo "Warning: ALLOW_AIM is set to enable aim_v23."
2514 ;;
2515 esac
2516 #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
2517
2518 done
2519
2520 echo " Adding STANDARDDIRS='$STANDARDDIRS'"
2521 BUILDDIR=${BUILDDIR:-.}
2522 if test "x$STANDARDDIRS" != x ; then
2523 for d in $STANDARDDIRS ; do
2524 adr="$ROOTDIR/$d/src"
2525 if test ! -d $adr ; then
2526 echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2527 echo " is correct and that you correctly specified the STANDARDDIRS option"
2528 exit 1
2529 else
2530 SOURCEDIRS="$SOURCEDIRS $adr"
2531 fi
2532 adr="$ROOTDIR/$d/inc"
2533 if test ! -d $adr ; then
2534 echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2535 echo " is correct and that you correctly specified the STANDARDDIRS option"
2536 exit 1
2537 else
2538 INCLUDEDIRS="$INCLUDEDIRS $adr"
2539 fi
2540 done
2541 fi
2542
2543 echo " Searching for *OPTIONS.h files in order to warn about the presence"
2544 echo " of \"#define \"-type statements that are no longer allowed:"
2545 CPP_OPTIONS=
2546 CPP_EEOPTIONS=
2547 spaths=". $INCLUDEDIRS"
2548 names=`ls -1 "$ROOTDIR/pkg"`
2549 for i in $spaths ; do
2550 try="$i/CPP_OPTIONS.h"
2551 if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
2552 echo " found CPP_OPTIONS=\"$try\""
2553 CPP_OPTIONS="$try"
2554 # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
2555 for n in $names ; do
2556 test_for_package_in_cpp_options $CPP_OPTIONS $n
2557 done
2558 fi
2559 try="$i/CPP_EEOPTIONS.h"
2560 if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
2561 echo " found CPP_EEOPTIONS=\"$try\""
2562 # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
2563 #**** not yet enabled ****
2564 # test_for_mpi_in_cpp_eeoptions $try
2565 #**** not yet enabled ****
2566 CPP_EEOPTIONS="$try"
2567 fi
2568 done
2569 if test "x$CPP_OPTIONS" = x ; then
2570 echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
2571 exit 1
2572 fi
2573
2574 # Here, we build the list of files to be "run through" the adjoint
2575 # compiler.
2576 if test -f $TMP.adSrcFiles ; then
2577 rm -f $TMP.adSrcFiles
2578 fi
2579 echo " Creating the list of files for the adjoint compiler."
2580 touch $TMP.adSrcFiles
2581 for i in $SOURCEDIRS ; do
2582 list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
2583 for j in $list_files ; do
2584 cat $i/$j >> $TMP.adSrcFiles
2585 done
2586 done
2587 if test ! "x"$FS = "x.f" ; then
2588 cat $TMP.adSrcFiles | sed -e "s/\.f/.$FS/g" > $TMP.adSrcFiles_f
2589 mv -f $TMP.adSrcFiles_f $TMP.adSrcFiles
2590 fi
2591
2592 echo
2593 echo "=== Creating the Makefile ==="
2594 echo " setting INCLUDES"
2595 for i in $INCLUDEDIRS ; do
2596 if test ! -d $i ; then
2597 echo "Warning: can't find INCLUDEDIRS=\"$i\""
2598 fi
2599 done
2600
2601 if test ! "x$DIVA" = x -a ! "x$MPI" = x ; then
2602 if test ! "x$MPIINCLUDEDIR" = x ; then
2603 # Do a local copy of MPI headers files (in local dir ./mpi_headers/) after
2604 # checking for additional included headers (in case of chain of included
2605 # header); also set LOCAL_MPI_HEADERS (if not already set)
2606 mpi_headers_do_local_copy
2607 fi
2608 fi
2609
2610 echo " Determining the list of source and include files"
2611 rm -rf $TMP.links
2612 mkdir $TMP.links
2613 touch $TMP.links/foo
2614 if test ! -r "$TMP.links/foo" ; then
2615 echo
2616 echo "ERROR : something is wrong with your directory permissions or"
2617 echo " your user file-creation mask (\"umask\") since creating a"
2618 echo " sub-dir, touch-ing a file within it, and then reading it is"
2619 echo " not working. Please try setting your umask to something"
2620 echo " sane such as:"
2621 echo
2622 echo " umask 0002"
2623 echo
2624 echo " and please verify that you have the proper permissions for"
2625 echo " creating sub-directories and then reading files created"
2626 echo " within them."
2627 echo
2628 exit 1
2629 fi
2630 rm -f $TMP.links/foo
2631
2632 if test "x$OPENAD" != x ; then
2633 OAD_DONT_COMPILE="/dev/null"
2634 OAD_DONT_TRANSFORM="/dev/null"
2635 OAD_KEEP_ORIGINAL="/dev/null"
2636 OAD_CB2M_FILES="/dev/null"
2637 OADTOOLS="$TOOLSDIR/OAD_support"
2638 echo " looking for dontCompile file: "
2639 for i in "." $MODS $OADTOOLS ; do
2640 if test -r $i"/dontCompile" ; then
2641 OAD_DONT_COMPILE=$i"/dontCompile"
2642 echo " found $OAD_DONT_COMPILE"
2643 break
2644 fi
2645 done
2646 echo " looking for dontTransform file: "
2647 for i in "." $MODS $OADTOOLS ; do
2648 if test -r $i"/dontTransform" ; then
2649 OAD_DONT_TRANSFORM=$i"/dontTransform"
2650 echo " found $OAD_DONT_TRANSFORM"
2651 break
2652 fi
2653 done
2654 echo " looking for keepOriginal file: "
2655 for i in "." $MODS $OADTOOLS ; do
2656 if test -r $i"/keepOriginal" ; then
2657 OAD_KEEP_ORIGINAL=$i"/keepOriginal"
2658 echo " found $OAD_KEEP_ORIGINAL"
2659 break
2660 fi
2661 done
2662 echo " looking for cb2mFiles: "
2663 for i in "." $MODS $OADTOOLS ; do
2664 if test -r $i"/cb2mFiles" ; then
2665 OAD_CB2M_FILES=$i"/cb2mFiles"
2666 echo " found $OAD_CB2M_FILES"
2667 break
2668 fi
2669 done
2670 echo " OpenAD exceptions: "
2671 fi
2672
2673 echo "# This section creates symbolic links" > $TMP.srclinks
2674 echo "" >> $TMP.srclinks
2675 printf 'F77_SRC_FILES = ' > $TMP.F77srclist
2676 printf 'NON_AD_F77_SRC_FILES = ' > $TMP.nonADF77srclist
2677 printf 'C_SRC_FILES = ' > $TMP.csrclist
2678 printf 'F90_SRC_FILES = ' > $TMP.F90srclist
2679 printf 'H_SRC_FILES = ' > $TMP.hsrclist
2680 printf 'AD_FLOW_FILES = ' > $TMP.ad_flow_files
2681 alldirs="$SOURCEDIRS $INCLUDEDIRS ."
2682 for d in $alldirs ; do
2683 deplist=
2684 sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
2685 sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
2686 if test "x$OPENAD" != x ; then
2687 sfiles=`( echo $sfiles | grep -v _cb2m\. )`
2688 fi
2689 for sf in $sfiles ; do
2690 if test ! -r "$TMP.links/$sf" ; then
2691 if test -f "$d/$sf" ; then
2692 ignore_f=f
2693 case $d/$sf in
2694 ./$PACKAGES_DOT_H)
2695 ignore_f=t
2696 ;;
2697 ./AD_CONFIG.h)
2698 ignore_f=t
2699 ;;
2700 ./FC_NAMEMANGLE.h)
2701 ignore_f=t
2702 ;;
2703 ./BUILD_INFO.h)
2704 ignore_f=t
2705 ;;
2706 ./EMBEDDED_FILES.h)
2707 ignore_f=t
2708 ;;
2709 *)
2710 # For the local directory *ONLY*,
2711 # ignore all soft-links
2712 if test "x$HAVE_TEST_L" = xt -a "x$d" = x. -a -L $sf ; then
2713 ignore_f=t
2714 else
2715 touch $TMP.links/$sf
2716 deplist="$deplist $sf"
2717 fi
2718 ;;
2719 esac
2720 if test "x$ignore_f" = xf ; then
2721 extn=`echo $sf | $AWK -F. '{print $NF}'`
2722 case $extn in
2723 F)
2724 echo " \\" >> $TMP.F77srclist
2725 printf " $sf" >> $TMP.F77srclist
2726 if test "x$OPENAD" = x ; then
2727 basename=${sf%%.F}
2728 isAD=`egrep ^$basename.f'[ ]*' $TMP.adSrcFiles`
2729 if test -z "$isAD" ; then
2730 echo " \\" >> $TMP.nonADF77srclist
2731 printf " $sf" >> $TMP.nonADF77srclist
2732 fi
2733 else #- OpenAD case:
2734 basename=${sf%%.F}
2735 isAD=`egrep ^$basename.f'[ ]*' $TMP.adSrcFiles`
2736 if test -z "$isAD" ; then
2737 toBeIgnored=`egrep ^$basename'[ ]*' ${OAD_DONT_COMPILE}`
2738 if test -z "$toBeIgnored" ; then
2739 echo " \\" >> $TMP.nonADF77srclist
2740 printf " $sf" >> $TMP.nonADF77srclist
2741 else
2742 echo " not to be compiled : $sf"
2743 fi
2744 else # file is initially listed as an AD file we want to exclude it
2745 # or we want to retain the untransformed version
2746 notToBeTransformed=`egrep ^$basename'[ ]*' ${OAD_DONT_TRANSFORM}`
2747 untransformedVersionToBeKept=`egrep ^$basename'[ ]*' ${OAD_KEEP_ORIGINAL}`
2748 if test -n "$notToBeTransformed"; then
2749 echo " not to be transformed: $sf"
2750 fi
2751 if test -n "$untransformedVersionToBeKept" ; then
2752 echo " original to be kept : $sf"
2753 fi
2754 if test -n "$notToBeTransformed" -o -n "$untransformedVersionToBeKept" ; then
2755 echo " \\" >> $TMP.nonADF77srclist
2756 printf " $sf" >> $TMP.nonADF77srclist
2757 fi
2758 fi
2759 fi
2760 ;;
2761 F90)
2762 echo " \\" >> $TMP.F90srclist
2763 printf " $sf" >> $TMP.F90srclist
2764 ;;
2765 c)
2766 echo " \\" >> $TMP.csrclist
2767 printf " $sf" >> $TMP.csrclist
2768 ;;
2769 h)
2770 echo " \\" >> $TMP.hsrclist
2771 printf " $sf" >> $TMP.hsrclist
2772 ;;
2773 flow)
2774 echo " \\" >> $TMP.ad_flow_files
2775 printf " $sf" >> $TMP.ad_flow_files
2776 ;;
2777 esac
2778 fi
2779 fi
2780 fi
2781 done
2782 if test "x$deplist" != x ; then
2783 if test "$d" != "." ; then
2784 echo "" >> $TMP.srclinks
2785 echo "# These files are linked from $d" >> $TMP.srclinks
2786 echo "$deplist :" >> $TMP.srclinks
2787 # We need to make sure that the link isn't already there.
2788 # This may happen when make thinks that a header file has to be "remade"
2789 # because a module it depends on has changed. In this case we do nothing.
2790 printf "\tif [ ! -L \$@ ]; then \$(LN) %s/\$@ \$@; fi\n" $d >> $TMP.srclinks
2791 fi
2792 fi
2793 done
2794 rm -rf $TMP.links
2795 echo "" >> $TMP.F77srclist
2796 echo "" >> $TMP.nonADF77srclist
2797 echo "" >> $TMP.csrclist
2798 echo "" >> $TMP.F90srclist
2799 echo "" >> $TMP.hsrclist
2800 echo "" >> $TMP.ad_flow_files
2801
2802 CMDLINE=$0
2803 for xx in "$@" ; do nw=`echo $xx | wc -w`
2804 if test $nw = '1' ; then CMDLINE="$CMDLINE $xx"
2805 else CMDLINE="$CMDLINE '$xx'" ; fi
2806 done
2807
2808 if test -f $MAKEFILE ; then
2809 mv -f $MAKEFILE "$MAKEFILE.old"
2810 fi
2811 echo " Writing makefile: $MAKEFILE"
2812 echo "# Multithreaded + multi-processing makefile for:" > $MAKEFILE
2813 echo "# $MACHINE" >> $MAKEFILE
2814 echo "# This makefile was generated automatically on" >> $MAKEFILE
2815 echo "# $THISDATE" >> $MAKEFILE
2816 echo "# by the command:" >> $MAKEFILE
2817 echo "# $CMDLINE" >> $MAKEFILE
2818 echo "# executed by:" >> $MAKEFILE
2819 echo "# ${THISUSER}@${THISHOST}:${THISCWD}" >> $MAKEFILE
2820
2821 EXE_AD=$EXECUTABLE"_ad"
2822 EXE_FTL=$EXECUTABLE"_ftl"
2823 EXE_SVD=$EXECUTABLE"_svd"
2824
2825 cat >>$MAKEFILE <<EOF
2826 #
2827 # OPTFILE="$OPTFILE"
2828 #
2829 # BUILDDIR : Directory where object files are written
2830 # SOURCEDIRS : Directories containing the source (.F) files
2831 # INCLUDEDIRS : Directories containing the header-source (.h) files
2832 # EXEDIR : Directory where executable that is generated is written
2833 # EXECUTABLE : Full path of executable binary
2834 #
2835 # CPP : C-preprocessor command
2836 # INCLUDES : Directories searched for header files
2837 # DEFINES : Macro definitions for CPP
2838 # MAKEDEPEND : Dependency generator
2839 # FC : Fortran compiler command
2840 # FFLAGS : Configuration/debugging options for FC
2841 # FOPTIM : Optimization options for FC
2842 # LINK : Command for link editor program
2843 # LIBS : Library flags /or/ additional optimization/debugging flags
2844
2845 ROOTDIR = ${ROOTDIR}
2846 BUILDDIR = ${BUILDDIR}
2847 SOURCEDIRS = ${SOURCEDIRS}
2848 INCLUDEDIRS = ${INCLUDEDIRS}
2849 EXEDIR = ${EXEDIR}
2850 EXECUTABLE = \$(EXEDIR)/${EXECUTABLE}
2851 TOOLSDIR = ${TOOLSDIR}
2852 OADTOOLS = ${OADTOOLS}
2853
2854 #eh3 new defines for the adjoint work
2855 AUTODIFF = ${ROOTDIR}/pkg/autodiff
2856 EXE_AD = ${EXE_AD}
2857 EXE_FTL = ${EXE_FTL}
2858 EXE_SVD = ${EXE_SVD}
2859
2860 ENABLED_PACKAGES = ${ENABLED_PACKAGES}
2861 DISABLED_PACKAGES = ${DISABLED_PACKAGES}
2862
2863 # These files are created by Makefile
2864 SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h BUILD_INFO.h
2865 EOF
2866
2867 if test "x$EMBED_SRC" = xt ; then
2868 echo "EMBEDDED_FILES = EMBEDDED_FILES.h" >>$MAKEFILE
2869 else
2870 echo "EMBEDDED_FILES = " >>$MAKEFILE
2871 fi
2872
2873 # extract default cpp search path so we can pass it to makedepend
2874 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}'`
2875
2876 cat >>$MAKEFILE <<EOF
2877 # Unix ln (link)
2878 LN = ${LN}
2879 # Dependency generator
2880 MAKEDEPEND = ${MAKEDEPEND}
2881 # Special preprocessor (KAP on DECs, FPP on Crays)
2882 KPP = ${KPP}
2883 # Fortran compiler
2884 FC = ${FC}
2885 # Fortran compiler
2886 F90C = ${F90C}
2887 # C compiler
2888 CC = ${CC}
2889 # Link editor
2890 LINK = ${LINK} ${LDADD}
2891
2892 # Defines for CPP
2893 DEFINES = ${DEFINES}
2894 # Includes for CPP
2895 INCLUDES = ${INCLUDES}
2896 # default CPP includes for makedepend
2897 CPPINCLUDES = ${CPPINCLUDES}
2898 # Flags for KPP
2899 KFLAGS1 = ${KFLAGS1}
2900 KFLAGS2 = ${KFLAGS2}
2901 # Optim./debug for FC
2902 FFLAGS = ${FFLAGS}
2903 FOPTIM = ${FOPTIM} ${FEXTRAFLAGS}
2904 # Optim./debug for FC
2905 F90FLAGS = ${F90FLAGS}
2906 F90OPTIM = ${F90OPTIM}
2907 F90FIXEDFORMAT = ${F90FIXEDFORMAT}
2908 # Flags for CC
2909 CFLAGS = ${CFLAGS}
2910 # Files that should not be optimized
2911 NOOPTFILES = ${NOOPTFILES}
2912 NOOPTFLAGS = ${NOOPTFLAGS}
2913 # Flags and libraries needed for linking
2914 LIBS = ${LIBS}
2915 # Name of the makefile
2916 MAKEFILE = ${MAKEFILE}
2917 # Name of the make program
2918 MAKE = ${MAKE}
2919
2920 EOF
2921
2922 cat $TMP.F77srclist >> $MAKEFILE
2923 cat $TMP.nonADF77srclist >> $MAKEFILE
2924 cat $TMP.csrclist >> $MAKEFILE
2925 cat $TMP.F90srclist >> $MAKEFILE
2926 cat $TMP.hsrclist >> $MAKEFILE
2927 cat $TMP.ad_flow_files >> $MAKEFILE
2928
2929 rm -f $TMP.F77srclist $TMP.nonADF77srclist $TMP.csrclist $TMP.F90srclist $TMP.hsrclist $TMP.ad_flow_files
2930
2931 echo >> $MAKEFILE
2932
2933 # add definitions for preprocessed sources
2934 # and note that not all systems allow case sensitive extensions
2935 # hence the $FS and $FS90 here.
2936 # for fixed format f90 files we use ff90 or FF90 resp
2937 # but these are not expected to be the original source files
2938
2939 echo 'F77_PP_SRC_FILES = $(F77_SRC_FILES:.F=.'$FS')' >> $MAKEFILE
2940 echo 'F90_PP_SRC_FILES = $(F90_SRC_FILES:.F90=.'$FS90')' >> $MAKEFILE
2941 echo 'OBJFILES= $(F77_SRC_FILES:.F=.o) $(C_SRC_FILES:.c=.o) $(F90_SRC_FILES:.F90=.o)' >> $MAKEFILE
2942 echo 'FLOWFILES = $(AD_FLOW_FILES:.flow=.flowdir)' >> $MAKEFILE
2943 echo >> $MAKEFILE
2944 echo '.SUFFIXES:' >> $MAKEFILE
2945 echo '.SUFFIXES: .o .'$FS' .p .F .c .f'$FS90' .'$FS90' .FF90 .F90 .flowdir .flow' >> $MAKEFILE
2946
2947 cat >>$MAKEFILE <<EOF
2948
2949 all: fwd_exe_target
2950 fwd_exe_target:
2951 @echo Update AD_CONFIG.h and make \$(EXECUTABLE)
2952 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Forward version" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN > ad_config.template
2953 @cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
2954 @-rm -f ad_config.template
2955 \$(MAKE) -f \$(MAKEFILE) \$(EXECUTABLE)
2956
2957 \$(EXECUTABLE): \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(OBJFILES) \$(EMBEDDED_FILES)
2958 @echo Creating \$@ ...
2959 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
2960
2961 depend:
2962 @\$(MAKE) -f \$(MAKEFILE) links
2963 \$(MAKEDEPEND) -f \$(MAKEFILE) -o .$FS \$(DEFINES) \$(INCLUDES) \$(CPPINCLUDES) \$(F77_SRC_FILES)
2964 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
2965 -rm -f makedepend.out
2966
2967 lib: libmitgcmuv.a
2968
2969 libmitgcmuv.a: \$(OBJFILES)
2970 ar rcv libmitgcmuv.a \$(OBJFILES)
2971 ar d libmitgcmuv.a main.o
2972
2973 obj: \$(OBJFILES)
2974
2975 links: \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(SPECIAL_FILES)
2976
2977 small_f: \$(F77_PP_SRC_FILES) \$(F90_PP_SRC_FILES)
2978
2979 # remove most of the files that "make" generates
2980 clean:
2981 -rm -rf *.p *.$FS90 *.mod ${RMFILES} work.{pc,pcl} *.template
2982 -rm -rf *.o
2983 -rm -rf *.$FS *.flowdir
2984 -rm -rf *.f$FS90 \$(AD_CLEAN) ad_input*
2985
2986 # remove most of the files that "make" and "make depend" generate
2987 Clean:
2988 @\$(MAKE) -f \$(MAKEFILE) clean
2989 @\$(MAKE) -f \$(MAKEFILE) cleanlinks
2990 -rm -f \$(SPECIAL_FILES) f90mkdepend.log $MAKEFILE.old
2991 -rm -f taf_command taf_output taf_ad.log taf_ad_flow.log taf_ftl.log
2992
2993 # remove also the executable, files that "genmake2" generates (except Makefile)
2994 # and output from a run (plus log files from testreport)
2995 CLEAN:
2996 @\$(MAKE) -f \$(MAKEFILE) Clean
2997 -rm -f \$(EXECUTABLE) \$(EXE_AD) \$(EXE_FTL) *.bak
2998 -rm -f $LOGFILE genmake_state genmake_*optfile
2999 -rm -f SIZE.h.mpi genmake.tr_log make.tr_log
3000 -rm -rf mpi_headers mnc_test_*
3001 -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
3002 -find \$(EXEDIR) -name "*.data" -exec rm {} \;
3003 -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
3004 -rm -f *.txt STDOUT.* STDERR.* *diagnostics.log *.[0-9][0-9][0-9][0-9].log
3005 -rm -f datetime costfinal divided.ctrl snapshot* output_adm.txt.diva_*
3006 -rm -f *_MIT_CE_000.opt0000 costfunction*0000
3007 -rm -f oad_cp.[0-9][0-9][0-9].?????
3008
3009 makefile:
3010 $THIS_SCRIPT $G2ARGS
3011 cleanlinks:
3012 -find . -type l -exec rm {} \;
3013
3014 # Special targets (SPECIAL_FILES) which are created by make
3015 ${PACKAGES_DOT_H}:
3016 @echo Creating \$@ ...
3017 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines -bPACKAGES_CONFIG_H "Disabled packages:" \$(DISABLED_PACKAGES) " " "Enabled packages:" \$(ENABLED_PACKAGES) > \$@
3018 AD_CONFIG.h:
3019 @echo Creating \$@ ...
3020 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Default version" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN > \$@
3021 FC_NAMEMANGLE.h:
3022 @echo Creating \$@ ...
3023 echo "$FC_NAMEMANGLE" > \$@
3024
3025 BUILD_INFO.h:
3026 @echo Creating \$@ ...
3027 EOF
3028
3029 test ! "x$THISVER" = x && echo " -echo \"#define THISVER '$THISVER'\" > \$@" >> $MAKEFILE
3030 test ! "x$THISUSER" = x && echo " -echo \"#define THISUSER '$THISUSER'\" >> \$@" >> $MAKEFILE
3031 test ! "x$THISDATE" = x && echo " -echo \"#define THISDATE '$THISDATE'\" >> \$@" >> $MAKEFILE
3032 test ! "x$THISHOST" = x && echo " -echo \"#define THISHOST '$THISHOST'\" >> \$@" >> $MAKEFILE
3033
3034 if test "x$EMBED_SRC" = xt ; then
3035 cat >>$MAKEFILE <<EOF
3036
3037 decode_files.o : EMBEDDED_FILES.h
3038
3039 ## \$(F77_PP_SRC_FILES)
3040 all_fF.tar.gz : \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(F77_PP_SRC_FILES) Makefile
3041 @echo Creating \$@ ...
3042 -tar -hcf all_fF.tar \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(F77_PP_SRC_FILES) Makefile
3043 -rm -f all_fF.tar.gz
3044 -gzip all_fF.tar
3045
3046 EMBEDDED_FILES.h : all_fF.tar.gz
3047 @echo Creating \$@ ...
3048 -\${ROOTDIR}/tools/embed_encode/encode_files EMBEDDED_FILES.h all_fF.tar.gz
3049
3050 EOF
3051 fi
3052
3053 cat >>$MAKEFILE <<EOF
3054
3055 # The normal chain of rules is ( .F - .$FS - .o )
3056
3057 ## This nullifies any default implicit rules concerning these two file types:
3058 ## %.o : %.F
3059
3060 # C preprocessing and replacing the _d in constants:
3061 CPPCMD = cat \$< | ${CPP} \$(DEFINES) \$(INCLUDES) | ${S64}
3062
3063 .F.$FS:
3064 \$(CPPCMD) > \$@
3065 .$FS.o:
3066 \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
3067 .F.o:
3068 \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
3069 .F90.$FS90:
3070 \$(CPPCMD) > \$@
3071 .FF90.f$FS90:
3072 \$(CPPCMD) > \$@
3073 .$FS90.o:
3074 \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
3075 .f$FS90.o:
3076 cp \$< \$(basename \$<).f90
3077 \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$(F90FIXEDFORMAT) \$(basename \$<).f90
3078 .c.o:
3079 \$(CC) \$(CFLAGS) \$(DEFINES) \$(INCLUDES) -c \$<
3080 .flow.flowdir:
3081 \$(CPPCMD) > \$@
3082
3083 # Special exceptions that use the ( .F - .p - .$FS - .o ) rule-chain
3084 .F.p:
3085 \$(CPPCMD) > \$@
3086 .p.$FS:
3087 \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
3088
3089 EOF
3090
3091 #=========================================
3092 #=== Automatic Differentiation Rules ===
3093 #=== for TAMC/TAF ======================
3094
3095 if test "x$OPENAD" = x ; then
3096
3097 cat >>$MAKEFILE <<EOF
3098
3099 TAMC = ${TAMC}
3100 TAF = ${TAF}
3101
3102 TAF_EXTRA = ${TAF_EXTRA}
3103 TAMC_EXTRA = ${TAMC_EXTRA}
3104 LOCAL_MPI_HEADERS = ${LOCAL_MPI_HEADERS}
3105
3106 EOF
3107
3108 ad_vars="AD_TAMC_FLAGS AD_TAF_FLAGS"
3109 ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF_FLAGS"
3110 ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
3111 for i in $ad_vars ; do
3112 name=$i
3113 t1="t2=\$"`echo "$i"`
3114 eval $t1
3115 printf "%-20s = " $name >> $MAKEFILE
3116 echo "$t2" | sed -e 's| \+| |g' >> $MAKEFILE
3117 done
3118
3119 echo " Add the source list for AD code generation"
3120 echo >> $MAKEFILE
3121 printf "AD_FILES = " >> $MAKEFILE
3122 AD_FILES=`cat $TMP.adSrcFiles`
3123 for i in $AD_FILES ; do
3124 echo " \\" >> $MAKEFILE
3125 printf " $i" >> $MAKEFILE
3126 done
3127 echo >> $MAKEFILE
3128 rm -f $TMP.adSrcFiles
3129
3130 if test $CAT_SRC_FOR_TAF = 0 ; then
3131 cat >>$MAKEFILE <<EOF
3132
3133 # ... Utilities ...
3134 remove_comments:
3135 sed -i.bak -f \$(TOOLSDIR)/remove_comments_sed \$(AD_FILES)
3136 @-rm -f \$(AD_FILES:.$FS=.$FS.bak)
3137 adj_sed:
3138 sed -i.bak -f \$(TOOLSDIR)/adjoint_sed \$(AD_FILES:.$FS=_ad.$FS)
3139 @-rm -f \$(AD_FILES:.$FS=_ad.$FS.bak)
3140 ftl_sed:
3141 sed -i.bak -f \$(TOOLSDIR)/adjoint_sed \$(AD_FILES:.$FS=_tl.$FS)
3142 @-rm -f \$(AD_FILES:.$FS=_tl.$FS.bak)
3143 adobjfiles: \$(AD_FILES:.$FS=_ad.o)
3144 ftlobjfiles: \$(AD_FILES:.$FS=_tl.o)
3145 EOF
3146 fi
3147
3148 cat >>$MAKEFILE <<EOF
3149
3150 # ... AD ...
3151 adall: ad_exe_target
3152 adtaf: ad_taf_output.$FS
3153 adtamc: ad_tamc_output.$FS
3154
3155 ad_exe_target:
3156 @echo Update AD_CONFIG.h and make \$(EXE_AD)
3157 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Adjoint version" -bAD_CONFIG_H -DALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN > ad_config.template
3158 @cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
3159 @-rm -f ad_config.template
3160 \$(MAKE) -f \$(MAKEFILE) \$(EXE_AD)
3161
3162 ad_input_code.$FS: \$(AD_FILES) \$(AD_FLOW_FILES)
3163 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Adjoint version" -bAD_CONFIG_H -DALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN > ad_config.template
3164 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
3165 @-rm -f ad_config.template
3166 @\$(MAKE) -f \$(MAKEFILE) \$(F77_PP_SRC_FILES)
3167 @\$(MAKE) -f \$(MAKEFILE) \$(FLOWFILES)
3168 cat \$(FLOWFILES) \$(AD_FILES) | sed -f \$(TOOLSDIR)/remove_comments_sed > ad_input_code.$FS
3169
3170 adtafonly:
3171 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
3172 ls -l ad_input_code_ad.$FS
3173 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
3174
3175 EOF
3176
3177 if test $CAT_SRC_FOR_TAF = 1 ; then
3178 cat >>$MAKEFILE <<EOF
3179 # ... send 1 file to TAF ...
3180 ad_taf_output.$FS: ad_input_code.$FS
3181 @-rm -f ad_input_code_ad.$FS ; echo ''
3182 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
3183 ls -l ad_input_code_ad.$FS
3184 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
3185
3186 \$(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)
3187 \$(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)
3188
3189 adobj: ad_taf_output.o \$(NON_AD_F77_SRC_FILES:.F=.o) \$(F90_SRC_FILES:.F90=.o) \$(C_SRC_FILES:.c=.o)
3190
3191 EOF
3192
3193 else
3194 cat >>$MAKEFILE <<EOF
3195 # ... send multiple files to TAF ...
3196 ad_taf_output.$FS: \$(AD_FLOW_FILES) \$(AD_FILES)
3197 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Adjoint version" -bAD_CONFIG_H -DALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN > ad_config.template
3198 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
3199 @-rm -f ad_config.template
3200 @\$(MAKE) -f \$(MAKEFILE) \$(F77_PP_SRC_FILES)
3201 @\$(MAKE) -f \$(MAKEFILE) \$(FLOWFILES)
3202 @-rm -f \$(AD_FILES:.$FS=_ad.$FS) \$(AD_FILES:.$FS=_ad.o); echo ''
3203 \$(MAKE) -f \$(MAKEFILE) remove_comments
3204 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) \$(FLOWFILES) \$(AD_FILES)
3205 \$(MAKE) -f \$(MAKEFILE) adj_sed
3206 cat \$(AD_FILES:.$FS=_ad.$FS) > ad_taf_output.$FS
3207
3208 \$(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)
3209 \$(MAKE) -f \$(MAKEFILE) adobjfiles
3210 \$(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)
3211
3212 adobj: ad_taf_output.$FS \$(NON_AD_F77_SRC_FILES:.F=.o) \$(F90_SRC_FILES:.F90=.o) \$(C_SRC_FILES:.c=.o)
3213 \$(MAKE) -f \$(MAKEFILE) adobjfiles
3214
3215 EOF
3216 fi
3217
3218 cat >>$MAKEFILE <<EOF
3219 adonlyfwd:
3220 patch < \$(TOOLSDIR)/ad_taf_output.f.onlyfwd.diff
3221
3222 adtrick:
3223 patch < \$(TOOLSDIR)/ad_taf_output.f.adtrick.diff
3224
3225 ad_tamc_output.$FS: ad_input_code.$FS
3226 \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.$FS
3227 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.$FS
3228
3229 ad_tamc: ad_tamc_output.o \$(OBJFILES)
3230 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
3231
3232 # ... FTL ...
3233 ftlall: ftl_exe_target
3234 ftltaf: ftl_taf_output.$FS
3235 ftltamc: ftl_tamc_output.$FS
3236
3237 ftl_exe_target:
3238 @echo Update AD_CONFIG.h and make \$(EXE_FTL)
3239 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "TangLin version" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -DALLOW_TANGENTLINEAR_RUN > ad_config.template
3240 @cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
3241 @-rm -f ad_config.template
3242 \$(MAKE) -f \$(MAKEFILE) \$(EXE_FTL)
3243
3244 ftl_input_code.$FS: \$(AD_FILES)
3245 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "TangLin version" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -DALLOW_TANGENTLINEAR_RUN > ad_config.template
3246 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
3247 @-rm -f ad_config.template
3248 @\$(MAKE) -f \$(MAKEFILE) \$(F77_PP_SRC_FILES)
3249 @\$(MAKE) -f \$(MAKEFILE) \$(AD_FLOW_FILES)
3250 cat \$(AD_FLOW_FILES) \$(AD_FILES) | sed -f \$(TOOLSDIR)/remove_comments_sed > ftl_input_code.$FS
3251
3252 ftltafonly:
3253 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
3254 ls -l ftl_input_code_tl.$FS
3255 cat ftl_input_code_tl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
3256
3257 EOF
3258
3259 if test $CAT_SRC_FOR_TAF = 1 ; then
3260 cat >>$MAKEFILE <<EOF
3261 # ... send 1 file to TAF ...
3262 ftl_taf_output.$FS: ftl_input_code.$FS
3263 @-rm -f ftl_input_code_tl.$FS ; echo ''
3264 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
3265 ls -l ftl_input_code_tl.$FS
3266 cat ftl_input_code_tl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
3267
3268 \$(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)
3269 \$(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)
3270
3271 EOF
3272
3273 else
3274 cat >>$MAKEFILE <<EOF
3275 # ... send multiple files to TAF ...
3276 ftl_taf_output.$FS: \$(AD_FLOW_FILES) \$(AD_FILES)
3277 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "TangLin version" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -DALLOW_TANGENTLINEAR_RUN > ad_config.template
3278 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
3279 @-rm -f ad_config.template
3280 @\$(MAKE) -f \$(MAKEFILE) \$(F77_PP_SRC_FILES)
3281 @\$(MAKE) -f \$(MAKEFILE) \$(AD_FLOW_FILES)
3282 @-rm -f \$(AD_FILES:.$FS=_tl.$FS) \$(AD_FILES:.$FS=_tl.o); echo ''
3283 \$(MAKE) -f \$(MAKEFILE) remove_comments
3284 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) \$(AD_FLOW_FILES) \$(AD_FILES)
3285 \$(MAKE) -f \$(MAKEFILE) ftl_sed
3286 cat \$(AD_FILES:.$FS=_tl.$FS) > ftl_taf_output.$FS
3287
3288 \$(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)
3289 \$(MAKE) -f \$(MAKEFILE) ftlobjfiles
3290 \$(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)
3291
3292 EOF
3293 fi
3294
3295 cat >>$MAKEFILE <<EOF
3296 ftl_tamc_output.$FS: ftl_input_code.$FS
3297 \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.$FS
3298 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.$FS
3299
3300 ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
3301 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
3302
3303 # ... SVD ...
3304 svdtaf: ad_taf_output.$FS ftl_taf_output.$FS
3305 @echo "--->>> Only ran TAF to generate SVD code! <<<---"
3306 @echo "--->>> Do make svdall afterwards to compile. <<<---"
3307 svdall: svd_touch svd_taf
3308
3309 svd_taf: \$(OBJFILES)
3310 \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
3311
3312 @echo "--->>> Only COMPILE svd code! <<<---"
3313 @echo "--->>> Assumes you previously <<<---"
3314 @echo "--->>> did make svdtaf <<<---"
3315
3316 svd_touch:
3317 @echo "--->>> Only COMPILE svd code! <<<---"
3318 @echo "--->>> Assumes you previously <<<---"
3319 @echo "--->>> did make svdtaf <<<---"
3320 touch ad_taf_output.$FS ftl_taf_output.$FS
3321 \$(FC) \$(FFLAGS) \$(FOPTIM) -c ad_taf_output.$FS
3322 \$(FC) \$(FFLAGS) \$(FOPTIM) -c ftl_taf_output.$FS
3323 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "SVD version" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -DALLOW_TANGENTLINEAR_RUN > ad_config.template
3324 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
3325 @-rm -f ad_config.template
3326
3327 EOF
3328
3329 fi
3330
3331 #=== for OpenAD ========================
3332
3333 if test "x$OPENAD" != x ; then
3334
3335 # ============ begin OpenAD specific section ==============
3336
3337 cat >>$MAKEFILE <<EOF
3338 # ... OpenAD ...
3339
3340 # all the source files linked from the various locations:
3341 ALL_LINKED_FILES= \
3342 \$(F77_SRC_FILES) \
3343 \$(C_SRC_FILES) \
3344 \$(H_SRC_FILES) \
3345 \$(F90_SRC_FILES) \
3346 \$(SPECIAL_FILES)
3347
3348 ifndef OPENADROOT
3349 \$(error "Error: environment variable OPENADROOT not defined!")
3350 endif
3351
3352 ifndef XAIFSCHEMAROOT
3353 \$(error "Error: environment variable XAIFSCHEMAROOT not defined!")
3354 endif
3355
3356 ifndef XAIFBOOSTERROOT
3357 \$(error "Error: environment variable XAIFBOOSTERROOT not defined!")
3358 endif
3359
3360 EOF
3361
3362 echo " Add the source list for common block to module conversion "
3363 echo >> $MAKEFILE
3364 printf "CB2M_F90_SRC_NAMES = " >> $MAKEFILE
3365 for i in `cat ${OAD_CB2M_FILES}` ; do
3366 echo " \\" >> $MAKEFILE
3367 printf " $i" >> $MAKEFILE
3368 done
3369 echo >> $MAKEFILE
3370
3371 echo " Add the source list for AD code generation"
3372 echo >> $MAKEFILE
3373 printf "AD_FILES = " >> $MAKEFILE
3374 for i in `cat ${OAD_CB2M_FILES}` ; do
3375 echo " \\" >> $MAKEFILE
3376 printf " ${i}_mod.f$FS90" >> $MAKEFILE
3377 done
3378 AD_FILES=`cat $TMP.adSrcFiles`
3379 for i in $AD_FILES ; do
3380 basename=${i%%.f}
3381 toBeIgnored=`egrep ^$basename'[ ]*' ${OAD_DONT_COMPILE} ${OAD_DONT_TRANSFORM}`
3382 if test -z "$toBeIgnored" ; then
3383 echo " \\" >> $MAKEFILE
3384 printf " $i" >> $MAKEFILE
3385 fi
3386 done
3387 echo >> $MAKEFILE
3388 rm -f $TMP.adSrcFiles
3389
3390 cat >>$MAKEFILE <<EOF
3391
3392 adAll: ad_exe_target
3393 .PHONY: adAll
3394
3395 ad_exe_target:
3396 @echo Update AD_CONFIG.h and make \$(EXE_AD)
3397 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Adjoint version" -bAD_CONFIG_H -DALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN > ad_config.template
3398 @cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
3399 @-rm -f ad_config.template
3400 \$(MAKE) -f \$(MAKEFILE) \$(EXE_AD)
3401
3402 CB2M_F90_PP_SRC_FILES=\$(addsuffix _mod.f$FS90, \$(CB2M_F90_SRC_NAMES))
3403
3404 .PRECIOUS: \$(CB2M_F90_PP_SRC_FILES) \$(NON_AD_F77_SRC_FILES:.F=_cb2m.f$FS90)
3405
3406 .PHONY: adDepend
3407 adDepend: \$(ALL_LINKED_FILES) \$(addsuffix _mod.h, \$(CB2M_F90_SRC_NAMES)) \$(addsuffix _mod.FF90, \$(CB2M_F90_SRC_NAMES)) \$(F77_SRC_FILES:.F=_cb2m.FF90)
3408 \$(MAKEDEPEND) -f \$(MAKEFILE) -o .$FS \$(DEFINES) \$(INCLUDES) \$(F77_SRC_FILES)
3409 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
3410 -rm -f makedepend.out
3411
3412 OPENAD_SUPPORT_F90_SRC_FILES = \
3413 w2f__types.F90 \
3414 OAD_active.F90 \
3415 OAD_cp.F90 \
3416 OAD_rev.F90 \
3417 OAD_tape.F90 \
3418 OAD_regular_cp.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