/[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.268 - (show annotations) (download)
Sun Aug 10 16:46:04 2014 UTC (9 years, 7 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint65h, checkpoint65i, checkpoint65b, checkpoint65c, checkpoint65f, checkpoint65g, checkpoint65d, checkpoint65e
Changes since 1.267: +2 -2 lines
if permitted by the opt-file, switch to F90 compiler for OpenAD built

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

  ViewVC Help
Powered by ViewVC 1.1.22