/[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.244 - (show annotations) (download)
Wed Oct 10 22:24:59 2012 UTC (7 years ago) by jmc
Branch: MAIN
CVS Tags: checkpoint64a
Changes since 1.243: +55 -6 lines
add a check for FLUSH intrinsic subroutine

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

  ViewVC Help
Powered by ViewVC 1.1.22