/[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.265 - (show annotations) (download)
Fri Apr 4 21:34:01 2014 UTC (5 years, 4 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint64w, checkpoint64v
Changes since 1.264: +19 -11 lines
- OpenAD: change Makefile to generate the appropriate AD_CONFIG.h when
  building mitgcmuv_ad (make adAll).
- comment out target "output.txt" and "ad_output.txt"

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

  ViewVC Help
Powered by ViewVC 1.1.22