/[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.277 - (show annotations) (download)
Tue Jan 12 20:43:00 2016 UTC (8 years, 2 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint65s
Changes since 1.276: +32 -15 lines
an other HAVE_ETIME modif: check for Function ETIME first and, if it fail,
then check for subroutine ETIME and consistent output.

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

  ViewVC Help
Powered by ViewVC 1.1.22