/[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.248 - (show annotations) (download)
Thu Jan 24 19:07:04 2013 UTC (6 years, 10 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint64d
Changes since 1.247: +3 -1 lines
add (but commented out) instruction to enable to compile code older
 than checkpoint63s (2012/09/05), using the latest genmake2

1 #! /usr/bin/env bash
2 #
3 # $Header: /u/gcmpack/MITgcm/tools/genmake2,v 1.247 2012/12/26 17:20:01 jahn 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 # comment this line out to enable lapack test
1192 SKIP_LAPACK_CHECK=t
1193
1194 # DEFINES checked by test compilation or command-line
1195 HAVE_SYSTEM=
1196 HAVE_FDATE=
1197 FC_NAMEMANGLE=
1198 HAVE_CLOC=
1199 # HAVE_SETRLSTK=
1200 HAVE_STAT=
1201 HAVE_NETCDF=
1202 HAVE_ETIME=
1203 IGNORE_TIME=
1204 HAVE_LAPACK=
1205 HAVE_FLUSH=
1206
1207 MODS=
1208 TOOLSDIR=
1209 SOURCEDIRS=
1210 INCLUDEDIRS=
1211 STANDARDDIRS="USE_THE_DEFAULT"
1212
1213 #- local config file
1214 gm_local="genmake_local"
1215
1216 G2ARGS=
1217 BASH=
1218 PWD=`pwd`
1219 test "x$MAKE" = x && MAKE=make
1220 test "x$AWK" = x && AWK=awk
1221 EMBED_SRC=
1222 THISHOST=`hostname`
1223 THISCWD=`pwd`
1224 THISDATE=`date`
1225 THISUSER=`echo $USER`
1226 THISVER=
1227 MACHINE=`uname -a`
1228 EXECUTABLE=
1229 EXEHOOK=
1230 EXEDIR=
1231 IEEE=
1232 if test "x$MITGCM_IEEE" != x ; then
1233 IEEE=$MITGCM_IEEE
1234 fi
1235 FS=
1236 FS90=
1237
1238 AUTODIFF_PKG_USED=f
1239 AD_OPTFILE=
1240 TAF=
1241 AD_TAF_FLAGS=
1242 FTL_TAF_FLAGS=
1243 SVD_TAF_FLAGS=
1244 TAF_EXTRA=
1245 TAMC=
1246 AD_TAMC_FLAGS=
1247 FTL_TAF_FLAGS=
1248 SVD_TAMC_FLAGS=
1249 TAMC_EXTRA=
1250
1251 # The following state can be set directly by command-line switches
1252 gm_s1="ROOTDIR STANDARDDIRS MODS PKG_DEPEND PKG_GROUPS DISABLE ENABLE"
1253 gm_s2="PLATFORM OPTFILE MAKE MAKEFILE MAKEDEPEND FC CC MPI OMP USE_R4"
1254 gm_s3="FEXTRAFLAGS IEEE DEVEL GSL TS PAPIS PCLS PAPI PCL HPMT DUMPSTATE"
1255
1256 # The following state is not directly set by command-line switches
1257 gm_s4="LN S64 LINK PACKAGES INCLUDES FFLAGS FOPTIM"
1258 gm_s5="CFLAGS LIBS KPP KFLAGS1 KFLAGS2 KPPFILES NOOPTFILES NOOPTFLAGS"
1259 gm_s6="PWD TOOLSDIR SOURCEDIRS INCLUDEDIRS EXEDIR EXECUTABLE EXEHOOK"
1260 gm_s7="THISHOST THISUSER THISDATE THISVER MACHINE FC_NAMEMANGLE"
1261 gm_s8="HAVE_NETCDF HAVE_SYSTEM HAVE_FDATE HAVE_ETIME HAVE_LAPACK HAVE_FLUSH"
1262
1263 # The following are all related to adjoint/tangent-linear stuff
1264 gm_s10="AUTODIFF_PKG_USED AD_OPTFILE TAMC TAF AD_TAMC_FLAGS AD_TAF_FLAGS"
1265 gm_s11="FTL_TAMC_FLAGS FTL_TAF_FLAGS SVD_TAMC_FLAGS SVD_TAF_FLAGS"
1266 gm_s12="TAF_EXTRA TAMC_EXTRA"
1267
1268 gm_state="COMMANDL $gm_s1 $gm_s2 $gm_s3 $gm_s4 $gm_s5 $gm_s6 $gm_s7 $gm_s8"
1269 gm_state="$gm_state $gm_s10 $gm_s11 $gm_s12"
1270
1271 cat <<EOF
1272
1273 GENMAKE :
1274
1275 A program for GENerating MAKEfiles for the MITgcm project.
1276 For a quick list of options, use "genmake2 -h"
1277 or for more detail see the Developer's HOWTO manual at:
1278 http://mitgcm.org/public/docs.html
1279
1280 EOF
1281
1282 LOGFILE="genmake.log"
1283 #- clean-up previous genmake logfiles:
1284 rm -f genmake_state genmake_*optfile $LOGFILE
1285
1286 echo "=== Processing options files and arguments ==="
1287
1288 #echo "$0::$1:$2:$3:$4:$5:$6:$7:"
1289 #parse_options
1290 ac_prev=
1291 for ac_option in "$@" ; do
1292
1293 G2ARGS="$G2ARGS \"$ac_option\""
1294
1295 # If the previous option needs an argument, assign it.
1296 if test -n "$ac_prev"; then
1297 eval "$ac_prev=\$ac_option"
1298 ac_prev=
1299 continue
1300 fi
1301
1302 ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
1303
1304 case $ac_option in
1305
1306 -help | --help | -h | --h)
1307 usage ;;
1308
1309 -nooptfile | --nooptfile)
1310 OPTFILE="NONE" ;;
1311 -optfile | --optfile | -of | --of)
1312 ac_prev=OPTFILE ;;
1313 -optfile=* | --optfile=* | -of=* | --of=*)
1314 OPTFILE=$ac_optarg ;;
1315
1316 -adoptfile | --adoptfile | -adof | --adof)
1317 ac_prev=AD_OPTFILE ;;
1318 -adoptfile=* | --adoptfile=* | -adof=* | --adof=*)
1319 AD_OPTFILE=$ac_optarg ;;
1320
1321 -pdepend | --pdepend)
1322 ac_prev=PKG_DEPEND ;;
1323 -pdepend=* | --pdepend=*)
1324 PKG_DEPEND=$ac_optarg ;;
1325
1326 -pgroups | --pgroups)
1327 ac_prev=PKG_GROUPS ;;
1328 -pgroups=* | --pgroups=*)
1329 PKG_GROUPS=$ac_optarg ;;
1330
1331 -make | --make | -m | --m)
1332 ac_prev=MAKE ;;
1333 -make=* | --make=* | -m=* | --m=*)
1334 MAKE=$ac_optarg ;;
1335
1336 -bash | --bash)
1337 ac_prev=BASH ;;
1338 -bash=* | --bash=*)
1339 BASH=$ac_optarg ;;
1340
1341 -makedepend | --makedepend | -md | --md)
1342 ac_prev=MAKEDEPEND ;;
1343 -makedepend=* | --makedepend=* | -md=* | --md=*)
1344 MAKEDEPEND=$ac_optarg ;;
1345
1346 -makefile | --makefile | -mf | --mf)
1347 ac_prev=MAKEFILE ;;
1348 -makefile=* | --makefile=* | -mf=* | --mf=*)
1349 MAKEFILE=$ac_optarg ;;
1350
1351 -platform | --platform | -pl | --pl | -platform=* | --platform=* | -pl=* | --pl=*)
1352 echo "ERROR: The platform option has been removed. Please specify"
1353 echo " the build options using the \"optfile\" mechanism."
1354 echo
1355 usage
1356 ;;
1357
1358 -rootdir | --rootdir | -rd | --rd)
1359 ac_prev=ROOTDIR ;;
1360 -rootdir=* | --rootdir=* | -rd=* | --rd=*)
1361 ROOTDIR=$ac_optarg ;;
1362
1363 -mods | --mods | -mo | --mo)
1364 ac_prev=MODS ;;
1365 -mods=* | --mods=* | -mo=* | --mo=*)
1366 MODS=$ac_optarg ;;
1367
1368 -disable | --disable)
1369 ac_prev=DISABLE ;;
1370 -disable=* | --disable=*)
1371 DISABLE=$ac_optarg ;;
1372
1373 -enable | --enable)
1374 ac_prev=ENABLE ;;
1375 -enable=* | --enable=*)
1376 ENABLE=$ac_optarg ;;
1377
1378 -standarddirs | --standarddirs)
1379 ac_prev=STANDARDDIRS ;;
1380 -standarddirs=* | --standarddirs=*)
1381 STANDARDDIRS=$ac_optarg ;;
1382
1383 # -cpp | --cpp)
1384 # ac_prev=cpp ;;
1385 # -cpp=* | --cpp=*)
1386 # CPP=$ac_optarg ;;
1387
1388 -cc | --cc)
1389 ac_prev=CC ;;
1390 -cc=* | --cc=*)
1391 CC=$ac_optarg ;;
1392
1393 -fortran | --fortran | -fc | --fc)
1394 ac_prev=FC ;;
1395 -fc=* | --fc=*)
1396 FC=$ac_optarg ;;
1397
1398 -fs | --fs)
1399 ac_prev=FS ;;
1400 -fs=* | --fs=*)
1401 FS=$ac_optarg ;;
1402
1403 -fs90 | --fs90)
1404 ac_prev=FS90 ;;
1405 -fs90=* | --fs90=*)
1406 FS90=$ac_optarg ;;
1407
1408 -use_real4 | -use_r4 | -ur4 | --use_real4 | --use_r4 | --ur4 )
1409 USE_R4=true ;;
1410
1411 -ieee | --ieee)
1412 IEEE=true ;;
1413 -noieee | --noieee)
1414 echo "Warning: ignore option '$ac_option' (default is already without '-ieee')" ;;
1415 -devel | --devel)
1416 IEEE=true ; DEVEL=true ;;
1417 -gsl | --gsl)
1418 GSL=true ;;
1419
1420 -ts | --ts)
1421 TS=true ;;
1422 -papis | --papis)
1423 PAPIS=true ;;
1424 -pcls | --pcls)
1425 PCLS=true ;;
1426 -foolad | --foolad)
1427 FOOLAD=true ;;
1428 -papi | --papi)
1429 PAPI=true ;;
1430 -pcl | --pcl)
1431 PCL=true ;;
1432 -hpmt | --hpmt)
1433 HPMT=true ;;
1434
1435 -mpi | --mpi)
1436 MPI=true ;;
1437 -mpi=* | --mpi=*)
1438 MPIPATH=$ac_optarg
1439 MPI=true ;;
1440
1441 -omp | --omp)
1442 OMP=true ;;
1443 -omp=* | --omp=*)
1444 OMPFLAG=$ac_optarg
1445 OMP=true ;;
1446
1447 -ds | --ds)
1448 DUMPSTATE=t ;;
1449
1450 -extra_flag | --extra_flag)
1451 ac_prev=FEXTRAFLAGS ;;
1452 -extra_flag=* | --extra_flag=*)
1453 FEXTRAFLAGS=$ac_optarg ;;
1454
1455 -taf_extra | --taf_extra)
1456 ac_prev=TAF_EXTRA ;;
1457 -taf_extra=* | --taf_extra=*)
1458 TAF_EXTRA=$ac_optarg ;;
1459
1460 -tamc_extra | --tamc_extra)
1461 ac_prev=TAMC_EXTRA ;;
1462 -tamc_extra=* | --tamc_extra=*)
1463 TAMC_EXTRA=$ac_optarg ;;
1464
1465 -ignoretime | -ignore_time | --ignoretime | --ignore_time)
1466 IGNORE_TIME="-DIGNORE_TIME" ;;
1467
1468 -es | --es | -embed-source | --embed-source)
1469 EMBED_SRC=t ;;
1470
1471 -*)
1472 echo "Error: unrecognized option: "$ac_option
1473 usage
1474 ;;
1475
1476 *)
1477 echo "Error: unrecognized argument: "$ac_option
1478 usage
1479 ;;
1480
1481 esac
1482
1483 done
1484
1485 printf " getting local config information: "
1486 if test -f $gm_local ; then
1487 echo "using $gm_local"
1488 . $gm_local
1489 else
1490 echo "none found"
1491 fi
1492
1493 if test -f ./.genmakerc ; then
1494 echo
1495 echo "WARNING: genmake2 has detected a copy of the old-style \"./.genmakerc\""
1496 echo " file. This file format is no longer supported. For directions on"
1497 echo " how to setup and use the new \"genmake2\" script, please see:"
1498 echo " http://mitgcm.org/public/devel_HOWTO/"
1499 echo " and send an email to MITgcm-support@mitgcm.org if you need help."
1500 echo "WARNING: ignore \"./.genmakerc\" and continue."
1501 echo
1502 fi
1503
1504 # Find the MITgcm ${ROOTDIR}
1505 if test "x${ROOTDIR}" = x ; then
1506 tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1507 if test "x$tmp" = "xbin" -a -d ../model -a -d ../eesupp -a -d ../pkg ; then
1508 ROOTDIR=".."
1509 else
1510 for d in . .. ../.. ../../.. ../../../.. ../../../../.. ; do
1511 if [ -d "$d/model" -a -d "$d/eesupp" -a -d "$d/pkg" ]; then
1512 ROOTDIR=$d
1513 printf "Warning: ROOTDIR was not specified ;"
1514 echo " try using a local copy of MITgcm found at \"$ROOTDIR\""
1515 break
1516 fi
1517 done
1518 fi
1519 fi
1520 if test "x${ROOTDIR}" = x ; then
1521 echo "Error: Cannot determine ROOTDIR for MITgcm code."
1522 echo " Please specify a ROOTDIR using either an options "
1523 echo " file or a command-line option."
1524 exit 1
1525 fi
1526 if test ! -d ${ROOTDIR} ; then
1527 echo "Error: the specified ROOTDIR (\"$ROOTDIR\") does not exist!"
1528 exit 1
1529 fi
1530
1531 # Find the MITgcm ${THISVER}
1532 version_file="${ROOTDIR}/doc/tag-index"
1533 if test -f $version_file ; then
1534 THISVER=`$AWK '/^checkpoint/{print $1; exit}' $version_file`
1535 #- remove ./BUILD_INFO.h file if older than version_file
1536 if test -f ./BUILD_INFO.h -a ./BUILD_INFO.h -ot $version_file ; then
1537 echo " remove ./BUILD_INFO.h (older than ${version_file})"
1538 rm -f ./BUILD_INFO.h
1539 fi
1540 fi
1541
1542 if test "x$MAKEFILE" = x ; then
1543 MAKEFILE="Makefile"
1544 fi
1545
1546 echo " getting OPTFILE information:"
1547 if test "x${OPTFILE}" = x ; then
1548 if test "x$MITGCM_OF" = x ; then
1549 echo "Warning: no OPTFILE specified so we'll look for possible settings"
1550 printf "\n=== Searching for possible settings for OPTFILE ===\n"
1551 find_possible_optfile
1552 else
1553 OPTFILE=$MITGCM_OF
1554 fi
1555 fi
1556 if test "x$OPTFILE" != xNONE ; then
1557 if test -f "$OPTFILE" -a -r "$OPTFILE" ; then
1558 echo " using OPTFILE=\"$OPTFILE\""
1559 . "$OPTFILE"
1560 RETVAL=$?
1561 if test "x$RETVAL" != x0 ; then
1562 printf "Error: failed to source OPTFILE \"$OPTFILE\""
1563 echo "--please check that variable syntax is bash-compatible"
1564 exit 1
1565 fi
1566 if test "x$DUMPSTATE" = xt ; then
1567 cp -f $OPTFILE "genmake_optfile"
1568 fi
1569 else
1570 echo "Error: can't read OPTFILE=\"$OPTFILE\""
1571 exit 1
1572 fi
1573 fi
1574
1575 echo " getting AD_OPTFILE information:"
1576 if test "x${AD_OPTFILE}" = x ; then
1577 if test "x$MITGCM_AD_OF" = x ; then
1578 AD_OPTFILE=$ROOTDIR/tools/adjoint_options/adjoint_default
1579 else
1580 AD_OPTFILE=$MITGCM_AD_OF
1581 fi
1582 fi
1583 if test "x${AD_OPTFILE}" != xNONE ; then
1584 if test -f "$AD_OPTFILE" -a -r "$AD_OPTFILE" ; then
1585 echo " using AD_OPTFILE=\"$AD_OPTFILE\""
1586 . "$AD_OPTFILE"
1587 RETVAL=$?
1588 if test "x$RETVAL" != x0 ; then
1589 printf "Error: failed to source AD_OPTFILE \"$AD_OPTFILE\""
1590 echo "--please check that variable syntax is bash-compatible"
1591 exit 1
1592 fi
1593 if test "x$DUMPSTATE" = xt ; then
1594 cp -f $AD_OPTFILE "genmake_ad_optfile"
1595 fi
1596 else
1597 echo "Error: can't read AD_OPTFILE=\"$AD_OPTFILE\""
1598 exit 1
1599 fi
1600 fi
1601
1602 #====================================================================
1603 # Set default values if not set by the optfile
1604 #
1605 # Check that FC, CC, LINK, CPP, S64, LN, and MAKE are defined. If not,
1606 # either set defaults or complain and abort!
1607 if test ! "x$BASH" = x ; then
1608 # add a trailing space so that it works within the Makefile syntax (see below)
1609 BASH="$BASH "
1610 fi
1611 if test "x$FC" = x ; then
1612 cat <<EOF 1>&2
1613
1614 Error: no Fortran compiler: please specify using one of the following:
1615 1) within the options file ("FC=...") as specified by "-of=OPTFILE"
1616 2) the "-fc=XXX" command-line option
1617 3) the "./genmake_local" file
1618 EOF
1619 exit 1
1620 fi
1621 if test "x$GET_FC_VERSION" != x ; then
1622 echo "Get compiler version using: $FC $GET_FC_VERSION" >> $LOGFILE
1623 ff=`echo $FC | sed 's/ .*//'` ; xx=`echo $ff | sed 's/^./& /' | sed 's/ .*//'`
1624 if test $xx != '/' ; then which $ff >> $LOGFILE ; fi
1625 $FC $GET_FC_VERSION > genmake_fc_vers1 2> genmake_fc_vers2
1626 if test -s genmake_fc_vers1 ; then
1627 cat genmake_fc_vers1 >> $LOGFILE
1628 else
1629 cat genmake_fc_vers2 >> $LOGFILE
1630 fi
1631 echo "<-- compiler version ----" >> $LOGFILE
1632 rm -f genmake_fc_vers1 genmake_fc_vers2
1633 fi
1634
1635 if test "x$CC" = x ; then
1636 look_for_C_compilers
1637 fi
1638
1639 if test "x$LINK" = x ; then
1640 LINK=$FC
1641 fi
1642 if test "x$MAKE" = x ; then
1643 MAKE="make"
1644 fi
1645 if test "x$CPP" = x ; then
1646 CPP="cpp -traditional -P"
1647 fi
1648 #EH3 === UGLY ===
1649 # The following is an ugly little hack to check for $CPP in /lib/ and
1650 # it should eventually be replaced with a more general function that
1651 # searches a combo of the user's path and a list of "usual suspects"
1652 # to find the correct location for binaries such as $CPP.
1653 for i in " " "/lib/" ; do
1654 echo "#define A a" | $i$CPP > test_cpp 2>&1 && CPP=$i$CPP
1655 done
1656 #EH3 === UGLY ===
1657 echo "#define A a" | $CPP > test_cpp 2>&1
1658 RETVAL=$?
1659 if test "x$RETVAL" != x0 ; then
1660 cat <<EOF 1>&2
1661
1662 Error: C pre-processor "$CPP" failed the test case: please specify using:
1663
1664 1) within the options file ("CPP=...") as specified by "-of=OPTFILE"
1665 2) the "./genmake_local" file
1666 3) with the CPP environment variable
1667
1668 EOF
1669 exit 1
1670 else
1671 rm -f test_cpp
1672 fi
1673
1674 look_for_makedepend
1675
1676 # Check that soft-link command is set and usable
1677 if test "x$LN" = x ; then
1678 LN="ln -s"
1679 fi
1680 echo "test" > genmake_test_ln
1681 $LN genmake_test_ln genmake_tlink
1682 RETVAL=$?
1683 if test "x$RETVAL" != x0 ; then
1684 cat <<EOF 1>&2
1685
1686 Error: The command "$LN" failed -- please specify a working soft-link
1687 command in the optfile.
1688
1689 EOF
1690 exit 1
1691 fi
1692 test -L genmake_tlink > /dev/null 2>&1
1693 RETVAL=$?
1694 if test "x$RETVAL" = x0 ; then
1695 HAVE_TEST_L=t
1696 fi
1697 rm -f genmake_test_ln genmake_tlink
1698
1699 # Check for broken *.F/*.f handling and fix if possible
1700 check_for_broken_Ff
1701
1702 if test ! "x$MPI" = x ; then
1703 echo " Turning on MPI cpp macros"
1704 DEFINES="$DEFINES -DALLOW_USE_MPI"
1705 #- To compile code older than checkpoint63s (2012/09/05), un-comment the following line:
1706 # DEFINES="$DEFINES -DALWAYS_USE_MPI"
1707 fi
1708 if test ! "x$OMP" = x ; then
1709 echo " Add OMPFLAG and turn on OpenMP cpp macros"
1710 FFLAGS="$FFLAGS $OMPFLAG"
1711 F90FLAGS="$F90FLAGS $OMPFLAG"
1712 DEFINES="$DEFINES -DUSE_OMP_THREADING"
1713 fi
1714
1715 if test ! "x$USE_R4" = x ; then
1716 echo " Turning on LET_RS_BE_REAL4 cpp flag"
1717 DEFINES="$DEFINES -DLET_RS_BE_REAL4"
1718 fi
1719
1720 if test ! "x$TS" = x ; then
1721 echo " Turning on timing per timestep"
1722 if test ! "x$FOOLAD" = x ; then
1723 DEFINES="$DEFINES -DTIME_PER_TIMESTEP_SFP"
1724 else
1725 DEFINES="$DEFINES -DTIME_PER_TIMESTEP"
1726 fi
1727 PACKAGES="$PACKAGES showflops"
1728 fi
1729 if test ! "x$PAPIS" = x ; then
1730 echo " Turning on PAPI flop summary per timestep"
1731 echo " Please make sure PAPIINC, PAPILIB are defined"
1732 if test ! "x$FOOLAD" = x ; then
1733 DEFINES="$DEFINES -DUSE_PAPI_FLOPS_SFP"
1734 else
1735 DEFINES="$DEFINES -DUSE_PAPI_FLOPS"
1736 fi
1737 INCLUDES="$INCLUDES $PAPIINC"
1738 LIBS="$LIBS $PAPILIB"
1739 PACKAGES="$PACKAGES showflops"
1740 fi
1741 if test ! "x$PCLS" = x ; then
1742 echo " Turning on PCL counter summary per timestep"
1743 echo " Please make sure PCLINC, PCLLIB are defined"
1744 if test ! "x$FOOLAD" = x ; then
1745 DEFINES="$DEFINES -DUSE_PCL_FLOPS_SFP"
1746 else
1747 DEFINES="$DEFINES -DUSE_PCL_FLOPS"
1748 fi
1749 INCLUDES="$INCLUDES $PCLINC"
1750 LIBS="$LIBS $PCLLIB"
1751 PACKAGES="$PACKAGES showflops"
1752 fi
1753 if test ! "x$PAPI" = x ; then
1754 if test ! "x$PAPIS" = x ; then
1755 echo " PAPI performance analysis and flop summary per timestep cannot co-exist!"
1756 echo " Sticking with PAPI flop summary per timestep!"
1757 else
1758 echo " Turning on performance analysis with PAPI"
1759 echo " Please make sure PAPIINC, PAPILIB are defined"
1760 DEFINES="$DEFINES -DUSE_PAPI"
1761 INCLUDES="$INCLUDES $PAPIINC"
1762 LIBS="$LIBS $PAPILIB"
1763 fi
1764 fi
1765 if test ! "x$PCL" = x ; then
1766 if test ! "x$PCLS" = x ; then
1767 echo " PCL performance analysis and flop summary per timestep cannot co-exist!"
1768 echo " Sticking with PCL flop summary per timestep!"
1769 else
1770 echo " Turning on performance analysis with PCL"
1771 echo " Please make sure PCLINC, PCLLIB are defined"
1772 DEFINES="$DEFINES -DUSE_PCL"
1773 INCLUDES="$INCLUDES $PCLINC"
1774 LIBS="$LIBS $PCLLIB"
1775 fi
1776 fi
1777 if test ! "x$HPMT" = x ; then
1778 if test ! "x$PAPI" = x ; then
1779 echo " PAPI and the HPM Toolkit cannot co-exist!"
1780 echo " Sticking with PAPI!"
1781 else
1782 if test ! "x$PCL" = x ; then
1783 echo " PCL and the HPM Toolkit cannot co-exist!"
1784 echo " Sticking with PCL!"
1785 else
1786 echo " Turning on performance analysis with the HPM Toolkit"
1787 echo " Please make sure HPMTINC, HPMTLIB are defined"
1788 DEFINES="$DEFINES -DUSE_LIBHPM"
1789 INCLUDES="$INCLUDES $HPMTINC"
1790 LIBS="$LIBS $HPMTLIB"
1791 fi
1792 fi
1793 fi
1794 if test ! "x$GSL" = x ; then
1795 echo " Turning on use of GSL to control floating point calculations"
1796 echo " Please make sure GSLINC, GSLLIB are defined"
1797 DEFINES="$DEFINES -DUSE_GSL_IEEE"
1798 INCLUDES="$INCLUDES $GSLINC"
1799 LIBS="$LIBS $GSLLIB"
1800 fi
1801 #- if USE_EXTENDED_SRC is set, add EXTENDED_SRC_FLAG to FFLAGS :
1802 if test ! "x$USE_EXTENDED_SRC" = x ; then
1803 FFLAGS="$FFLAGS $EXTENDED_SRC_FLAG"
1804 F90FIXEDFORMAT="$F90FIXEDFORMAT $EXTENDED_SRC_FLAG"
1805 fi
1806
1807 printf "\n=== Checking system libraries ===\n"
1808 printf " Do we have the system() command using $FC... "
1809 cat > genmake_tcomp.$FS <<EOF
1810 program hello
1811 call system('echo hi')
1812 end
1813 EOF
1814 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1815 RETVAL=$?
1816 if test "x$RETVAL" = x0 ; then
1817 HAVE_SYSTEM=t
1818 DEFINES="$DEFINES -DHAVE_SYSTEM"
1819 echo "yes"
1820 else
1821 HAVE_SYSTEM=
1822 echo "no"
1823 fi
1824 rm -f genmake_tcomp*
1825
1826 printf " Do we have the fdate() command using $FC... "
1827 cat > genmake_tcomp.$FS <<EOF
1828 program hello
1829 CHARACTER*(128) string
1830 string = ' '
1831 call fdate( string )
1832 print *, string
1833 end
1834 EOF
1835 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1836 RETVAL=$?
1837 if test "x$RETVAL" = x0 ; then
1838 HAVE_FDATE=t
1839 DEFINES="$DEFINES -DHAVE_FDATE"
1840 echo "yes"
1841 else
1842 HAVE_FDATE=
1843 echo "no"
1844 fi
1845 rm -f genmake_tcomp*
1846
1847 printf " Do we have the etime() command using $FC... "
1848 cat > genmake_tcomp.$FS <<EOF
1849 program hello
1850 REAL*4 ACTUAL, TARRAY(2)
1851 EXTERNAL ETIME
1852 REAL*4 ETIME
1853 actual = etime( tarray )
1854 print *, tarray
1855 end
1856 EOF
1857 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1858 RETVAL=$?
1859 if test "x$RETVAL" = x0 ; then
1860 HAVE_ETIME=t
1861 DEFINES="$DEFINES -DHAVE_ETIME"
1862 echo "yes"
1863 else
1864 HAVE_ETIME=
1865 echo "no"
1866 fi
1867 rm -f genmake_tcomp*
1868
1869 printf " Can we call simple C routines (here, \"cloc()\") using $FC... "
1870 check_HAVE_CLOC
1871 if test "x$HAVE_CLOC" != x ; then
1872 DEFINES="$DEFINES -DHAVE_CLOC"
1873 echo "yes"
1874 else
1875 echo "no"
1876 if test "x$EMBED_SRC" = xt ; then
1877 echo " WARNING: you requested file embedding but it has"
1878 echo " been disabled since C code cannot be called"
1879 EMBED_SRC=
1880 fi
1881 fi
1882 rm -f genmake_t*
1883
1884 printf " Can we unlimit the stack size using $FC... "
1885 check_HAVE_SETRLSTK
1886 if test "x$HAVE_SETRLSTK" = xt ; then
1887 DEFINES="$DEFINES -DHAVE_SETRLSTK"
1888 echo "yes"
1889 else
1890 echo "no"
1891 fi
1892 rm -f genmake_t*
1893
1894 printf " Can we register a signal handler using $FC... "
1895 check_HAVE_SIGREG
1896 if test "x$HAVE_SIGREG" = xt ; then
1897 DEFINES="$DEFINES -DHAVE_SIGREG"
1898 echo "yes"
1899 else
1900 echo "no"
1901 fi
1902 rm -f genmake_t*
1903
1904 printf " Can we use stat() through C calls... "
1905 check_HAVE_STAT
1906 if test "x$HAVE_STAT" != x ; then
1907 DEFINES="$DEFINES -DHAVE_STAT"
1908 echo "yes"
1909 else
1910 echo "no"
1911 fi
1912 rm -f genmake_t*
1913
1914 printf " Can we create NetCDF-enabled binaries... "
1915 check_netcdf_libs
1916 if test "x$HAVE_NETCDF" != x ; then
1917 DEFINES="$DEFINES -DHAVE_NETCDF"
1918 echo "yes"
1919 else
1920 echo "no"
1921 fi
1922
1923 printf " Can we create LAPACK-enabled binaries... "
1924 check_lapack_libs
1925 if test "x$HAVE_LAPACK" != x ; then
1926 DEFINES="$DEFINES -DHAVE_LAPACK"
1927 echo "yes"
1928 else
1929 echo "no"
1930 fi
1931
1932 printf " Can we call FLUSH intrinsic subroutine... "
1933 check_HAVE_FLUSH
1934 if test "x$HAVE_FLUSH" = xt ; then
1935 DEFINES="$DEFINES -DHAVE_FLUSH"
1936 echo "yes"
1937 else
1938 echo "no"
1939 fi
1940
1941 DEFINES="$DEFINES $IGNORE_TIME"
1942 if test "x$EMBED_SRC" = xt ; then
1943 build_embed_encode
1944 fi
1945 if test "x$EMBED_SRC" = xt ; then
1946 ENABLE="$ENABLE embed_files"
1947 # DEFINES="$DEFINES -DHAVE_EMBED_SRC"
1948 fi
1949
1950 printf "\n=== Setting defaults ===\n"
1951 printf " Adding MODS directories: "
1952 for d in $MODS ; do
1953 if test ! -d $d ; then
1954 echo
1955 echo "Error: MODS directory \"$d\" not found!"
1956 exit 1
1957 else
1958 printf "$d "
1959 SOURCEDIRS="$SOURCEDIRS $d"
1960 INCLUDEDIRS="$INCLUDEDIRS $d"
1961 fi
1962 done
1963 echo
1964
1965 #if test "x${PLATFORM}" = x ; then
1966 # PLATFORM=$p_PLATFORM
1967 #fi
1968
1969 if test "x${EXEDIR}" = x ; then
1970 tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1971 if test "x$tmp" = "xbin" -a -d ../exe -a $ROOTDIR = .. ; then
1972 EXEDIR=../exe
1973 else
1974 EXEDIR=.
1975 fi
1976 fi
1977 if test ! -d ${EXEDIR} ; then
1978 echo "Error: the specified EXEDIR (\"$EXEDIR\") does not exist!"
1979 exit 1
1980 fi
1981
1982 if test "x${TOOLSDIR}" = x ; then
1983 TOOLSDIR="$ROOTDIR/tools"
1984 fi
1985 if test ! -d ${TOOLSDIR} ; then
1986 echo "Error: the specified TOOLSDIR (\"$TOOLSDIR\") does not exist!"
1987 exit 1
1988 fi
1989 if test "x$S64" = x ; then
1990 echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.sh > /dev/null 2>&1
1991 RETVAL=$?
1992 if test "x${RETVAL}" = x0 ; then
1993 S64='$(TOOLSDIR)/set64bitConst.sh'
1994 else
1995 echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.csh > /dev/null 2>&1
1996 RETVAL=$?
1997 if test "x${RETVAL}" = x0 ; then
1998 S64='$(TOOLSDIR)/set64bitConst.csh'
1999 else
2000 cat <<EOF
2001
2002 ERROR: neither of the two default scripts:
2003
2004 ${TOOLSDIR}/set64bitConst.sh
2005 ${TOOLSDIR}/set64bitConst.csh
2006
2007 are working so please check paths or specify (with \$S64) a
2008 working version of this script.
2009
2010 EOF
2011 exit 1
2012 fi
2013 fi
2014 fi
2015 THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`
2016
2017 EXECUTABLE=${EXECUTABLE:-mitgcmuv}
2018
2019 # Set Standard Code Directories:
2020 if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
2021 STANDARDDIRS="eesupp model"
2022 fi
2023 # if model in Standard-Code-Dir, add eesupp (needed to compile model)
2024 echo " $STANDARDDIRS " | grep ' model ' > /dev/null 2>&1
2025 ckM=$?
2026 echo " $STANDARDDIRS " | grep ' eesupp ' > /dev/null 2>&1
2027 ckE=$?
2028 if test $ckM = 0 -a $ckE = 1 ; then
2029 STANDARDDIRS="$STANDARDDIRS eesupp"
2030 fi
2031
2032 # We have a special set of source files in eesupp/src which are
2033 # generated from some template source files. We'll make them first so
2034 # they appear as regular source code
2035 if test -r $ROOTDIR"/eesupp/src/Makefile" ; then
2036 echo " Making source files in eesupp from templates"
2037 ( cd $ROOTDIR"/eesupp/src/" && $MAKE clean_old && $MAKE \
2038 ) > make_eesupp.errors 2>&1
2039 RETVAL=$?
2040 if test "x${RETVAL}" = x0 ; then
2041 rm -f make_eesupp.errors
2042 else
2043 echo "Error: problem encountered while building source files in eesupp:"
2044 cat make_eesupp.errors 1>&2
2045 exit 1
2046 fi
2047 fi
2048
2049 #same for pkg/exch2 and pkg/regrid
2050 for pdir in exch2 regrid ; do
2051 if test -r $ROOTDIR"/pkg/${pdir}/Makefile" ; then
2052 echo " Making source files in pkg/${pdir} from templates"
2053 ( cd $ROOTDIR"/pkg/"${pdir} && $MAKE clean_old && $MAKE \
2054 ) > make_${pdir}.errors 2>&1
2055 RETVAL=$?
2056 if test "x${RETVAL}" = x0 ; then
2057 rm -f make_${pdir}.errors
2058 else
2059 echo "Error: problem encountered while building source files in pkg/${pdir}:"
2060 cat make_${pdir}.errors 1>&2
2061 exit 1
2062 fi
2063 fi
2064 done
2065
2066 printf "\n=== Determining package settings ===\n"
2067 if test "x${PKG_DEPEND}" = x ; then
2068 tmp=$ROOTDIR"/pkg/pkg_depend"
2069 if test -r $tmp ; then PKG_DEPEND=$tmp ; fi
2070 fi
2071 if test "x${PKG_DEPEND}" = x ; then
2072 echo "Warning: No package dependency information was specified."
2073 echo " Please check that ROOTDIR/pkg/pkg_depend exists."
2074 else
2075 if test ! -r ${PKG_DEPEND} ; then
2076 echo "Error: can't read package dependency info from PKG_DEPEND=\"$PKG_DEPEND\""
2077 exit 1
2078 fi
2079 echo " getting package dependency info from $PKG_DEPEND"
2080 # Strip the comments and then convert the dependency file into arrays: PNAME, DNAME
2081 get_pdepend_list $PKG_DEPEND
2082 fi
2083
2084 # A default package groups file "$ROOTDIR/pkg/pkg_groups" is provided
2085 # to define the "default_pkg_list" and package groups (for convenience, one
2086 # can specify a group of packages using names like "ocean" and "atmosphere").
2087 if test "x${PKG_GROUPS}" = x ; then
2088 tmp=$ROOTDIR"/pkg/pkg_groups"
2089 if test -r $tmp ; then PKG_GROUPS=$tmp ; fi
2090 fi
2091 if test "x${PKG_GROUPS}" = x ; then
2092 echo "Warning: No package groups information was specified."
2093 echo " Please check that ROOTDIR/pkg/pkg_groups exists."
2094 else
2095 if test ! -r ${PKG_GROUPS} ; then
2096 echo "Error: can't read package groups info from PKG_GROUPS=\"$PKG_GROUPS\""
2097 exit 1
2098 fi
2099 echo " getting package groups info from $PKG_GROUPS"
2100 fi
2101
2102 # Search for packages to compile.
2103 echo " checking list of packages to compile:"
2104 PKG_LIST=
2105 if test "x${PKG_LIST}" = x ; then
2106 for i in "." $MODS ; do
2107 if test -r $i"/packages.conf" ; then
2108 PKG_LIST=$i"/packages.conf"
2109 break
2110 fi
2111 done
2112 fi
2113 if test "x${PKG_LIST}" = x ; then
2114 pkg_list='default_pkg_list'
2115 if test "x${PKG_GROUPS}" = x ; then
2116 echo "Error: need package groups info to expand pkg_list=\"$pkg_list\""
2117 exit 1
2118 fi
2119 else
2120 if test ! -r $PKG_LIST ; then
2121 echo "Error: can't read package list from PKG_LIST=\"$PKG_LIST\""
2122 exit 1
2123 else
2124 echo " using PKG_LIST=\"$PKG_LIST\""
2125 # Strip the comments and add all the names
2126 pkg_list=`cat $PKG_LIST | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
2127 RETVAL=$?
2128 if test "x${RETVAL}" != x0 ; then
2129 printf "Error: can't parse package list "
2130 echo "-- please check PKG_LIST=\"$PKG_LIST\""
2131 exit 1
2132 fi
2133 fi
2134 fi
2135 for i in $pkg_list ; do
2136 PACKAGES="$PACKAGES $i"
2137 done
2138 echo " before group expansion packages are:$PACKAGES"
2139 if test "x${PKG_GROUPS}" != x ; then
2140 RET=1
2141 while test $RET = 1 ; do expand_pkg_groups; RET=$?; done
2142 echo " after group expansion packages are: $PACKAGES"
2143 fi
2144
2145 echo " applying DISABLE settings"
2146 echo "" > ./.tmp_pack
2147 for i in $PACKAGES ; do
2148 echo $i >> ./.tmp_pack
2149 done
2150 for i in `grep "-" ./.tmp_pack` ; do
2151 j=`echo $i | sed 's/[-]//'`
2152 DISABLE="$DISABLE $j"
2153 done
2154 pack=
2155 for p in $PACKAGES ; do
2156 addit="t"
2157 for d in $DISABLE ; do
2158 if test "x$p" = "x$d" ; then
2159 addit="f"
2160 fi
2161 done
2162 if test "x$addit" = xt ; then
2163 pack="$pack $p"
2164 fi
2165 done
2166 PACKAGES="$pack"
2167 echo " applying ENABLE settings"
2168 echo "" > ./.tmp_pack
2169 PACKAGES="$PACKAGES $ENABLE"
2170 # Test if each explicitly referenced package exists
2171 for i in $PACKAGES ; do
2172 j=`echo $i | sed 's/[-+]//'`
2173 if test ! -d "$ROOTDIR/pkg/$j" ; then
2174 echo "Error: dir '$ROOTDIR/pkg/$i' missing for package '$i'"
2175 exit 1
2176 fi
2177 echo $i >> ./.tmp_pack
2178 done
2179 PACKAGES=
2180 for i in `grep -v "-" ./.tmp_pack | sort | uniq` ; do
2181 PACKAGES="$PACKAGES $i"
2182 done
2183 rm -f ./.tmp_pack
2184 echo " packages are: $PACKAGES"
2185
2186 # Check for package MNC: if NetCDF is available, then build the MNC
2187 # template files ; otherwise, delete mnc from the list of packages.
2188 echo " $PACKAGES " | grep ' mnc ' > /dev/null 2>&1
2189 mnc_in=$?
2190 if test "x$HAVE_NETCDF" != xt ; then
2191 if test "x$mnc_in" = x0 ; then
2192 cat <<EOF
2193 *********************************************************************
2194 WARNING: the "mnc" package was enabled but tests failed to compile
2195 NetCDF applications. Please check that:
2196
2197 1) NetCDF is correctly installed for this compiler and
2198 2) the LIBS variable (within the "optfile") specifies the correct
2199 NetCDF library to link against.
2200
2201 Due to this failure, the "mnc" package is now DISABLED.
2202 *********************************************************************
2203 EOF
2204 PACKAGES=`echo $PACKAGES | sed -e 's/mnc//g'`
2205 DISABLE="$DISABLE mnc"
2206 else
2207 # this prevent to add mnc (due to pdepend rules) if not available
2208 DISABLE="$DISABLE mnc"
2209 fi
2210 else
2211 # we have NetCDF, we try to build MNC template files
2212 ( cd $ROOTDIR"/pkg/mnc" && $MAKE testclean && $MAKE templates ) > make_mnc.errors 2>&1
2213 RETVAL=$?
2214 if test "x${RETVAL}" = x0 ; then
2215 rm -f make_mnc.errors
2216 else
2217 echo "Error: problem encountered while building source files in pkg/mnc:"
2218 cat make_mnc.errors 1>&2
2219 if test "x$mnc_in" = x0 ; then
2220 exit 1
2221 else
2222 DISABLE="$DISABLE mnc"
2223 fi
2224 fi
2225 fi
2226
2227 # Check for package PROFILES: if NetCDF is not available,
2228 # then delete profiles from the list of available packages.
2229 if test "x$HAVE_NETCDF" != xt ; then
2230 echo " $PACKAGES " | grep ' profiles ' > /dev/null 2>&1
2231 RETVAL=$?
2232 if test "x$RETVAL" = x0 ; then
2233 cat <<EOF
2234 *********************************************************************
2235 WARNING: the "profiles" package was enabled but tests failed to
2236 compile NetCDF applications. Please check that:
2237
2238 1) NetCDF is correctly installed for this compiler and
2239 2) the LIBS variable (within the "optfile") specifies the correct
2240 NetCDF library to link against.
2241
2242 Due to this failure, the "profiles" package is now DISABLED.
2243 *********************************************************************
2244 EOF
2245 PACKAGES=`echo $PACKAGES | sed -e 's/profiles//g'`
2246 DISABLE="$DISABLE profiles"
2247 else
2248 # this prevent to add profiles (due to pdepend rules) if not available
2249 DISABLE="$DISABLE profiles"
2250 fi
2251 fi
2252
2253 # Check for package RADTRANS: if LAPACK is not available,
2254 # then issue a warning that the direct radtrans solver is not available.
2255 if test "x$HAVE_LAPACK" != xt ; then
2256 echo " $PACKAGES " | grep ' radtrans ' > /dev/null 2>&1
2257 RETVAL=$?
2258 if test "x$RETVAL" = x0 ; then
2259 cat <<EOF
2260 *********************************************************************
2261 WARNING: the "radtrans" package was enabled but tests failed to
2262 compile LAPACK applications. This means that the direct radtrans
2263 solver is not available and compilation will fail if it is enabled.
2264 If you want to use the direct solver, please check that:
2265
2266 1) LAPACK is correctly installed for this compiler and
2267 2) the LIBS variable (within the "optfile") specifies the correct
2268 LAPACK library to link against.
2269 *********************************************************************
2270 EOF
2271 fi
2272 fi
2273
2274 if test "x${PKG_DEPEND}" != x ; then
2275 echo " applying package dependency rules"
2276 ck=
2277 while test "x$ck" != xtt ; do
2278 i=0
2279 # rtot=${#PNAME[@]}
2280 rtot=$nname
2281 while test $i -le $rtot ; do
2282
2283 # Is $pname in the current $PACKAGES list?
2284 # pname=${PNAME[$i]}
2285 tmp="pname=\"\$PNAME_$i\""
2286 eval $tmp
2287 pin="f"
2288 for p in $PACKAGES ; do
2289 if test "x$p" = "x$pname" ; then
2290 pin="t"
2291 fi
2292 done
2293 # or in the current $STANDARDDIRS list?
2294 for p in $STANDARDDIRS ; do
2295 if test "x$p" = "x$pname" ; then pin="t" ; fi
2296 done
2297
2298 # Is the DNAME entry a (+) or (-) rule ?
2299 tmp="dname=\"\$DNAME_$i\""
2300 eval $tmp
2301 plus="-"
2302 echo $dname | grep '^+' > /dev/null 2>&1
2303 RETVAL=$?
2304 if test "x$RETVAL" = x0 ; then
2305 plus="+"
2306 fi
2307
2308 # Is $dname in the current $PACKAGES list?
2309 dname=`echo $dname | sed -e 's/^[+-]//'`
2310 din="f"
2311 for p in $PACKAGES ; do
2312 if test "x$p" = "x$dname" ; then
2313 din="t"
2314 fi
2315 done
2316
2317 # Do we need to add $dname according to the dependency rules?
2318 if test "x$pin" = xt -a "x$plus" = "x+" -a "x$din" = xf ; then
2319 #echo " " $pname ": need to add :" $dname
2320 in_dis="f"
2321 for dis in $DISABLE ; do
2322 if test "x$dis" = "x$dname" ; then
2323 in_dis="t"
2324 fi
2325 done
2326 if test "x$in_dis" = xt ; then
2327 echo "Error: can't satisfy package dependencies:"
2328 echo " \"$dname\" is required by the dependency rules"
2329 echo " but is disallowed by the DISABLE settings"
2330 exit 1
2331 else
2332 PACKAGES="$PACKAGES $dname"
2333 ck=
2334 fi
2335 fi
2336
2337 # Do we need to get rid of $dname according to the dependency rules?
2338 if test "x$pin" = xt -a "x$plus" = "x-" -a "x$din" = xt; then
2339 echo "Error: can't satisfy package dependencies:"
2340 echo " \"$pname\" was requested but is disallowed by"
2341 echo " the dependency rules for \"$dname\""
2342 exit 1
2343 fi
2344 i=`echo "$i + 1" | bc -l`
2345 #i=$(( $i + 1 ))
2346 done
2347 ck=$ck"t"
2348 done
2349 echo " packages are: $PACKAGES"
2350 fi
2351 for i in $PACKAGES ; do
2352 adr="$ROOTDIR/pkg/$i"
2353 if test -d $adr ; then
2354 SOURCEDIRS="$SOURCEDIRS $adr"
2355 INCLUDEDIRS="$INCLUDEDIRS $adr"
2356 if test "x$i" = xautodiff ; then
2357 AUTODIFF_PKG_USED=t
2358 fi
2359 else
2360 echo "Error: the directory \"$adr\" for package $i doesn't exist"
2361 exit 1
2362 fi
2363 done
2364
2365 # Create a list of #define and #undef to enable/disable packages
2366 PACKAGES_DOT_H=PACKAGES_CONFIG.h
2367 # The following UGLY HACK sets multiple "#undef"s and it needs to go
2368 # away. On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h
2369 # file would eventually be split up so that all package-related #define
2370 # statements could be separated and handled only by genmake.
2371 names=`ls -1 "$ROOTDIR/pkg"`
2372 all_pack=
2373 DISABLED_PACKAGES=
2374 for n in $names ; do
2375 if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
2376 has_pack="f"
2377 for pack in $PACKAGES ; do
2378 if test "x$pack" = "x$n" ; then
2379 has_pack="t"
2380 break
2381 fi
2382 done
2383 if test "x$has_pack" = xf ; then
2384 undef=`echo "ALLOW_$n" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2385 DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
2386 fi
2387 fi
2388 done
2389 ENABLED_PACKAGES=
2390 for i in $PACKAGES ; do
2391 def=`echo "ALLOW_$i" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2392 ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
2393 #eh3 DEFINES="$DEFINES -D$def"
2394
2395 #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
2396 case $i in
2397 aim_v23)
2398 ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
2399 echo "Warning: ALLOW_AIM is set to enable aim_v23."
2400 ;;
2401 esac
2402 #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
2403
2404 done
2405
2406 echo " Adding STANDARDDIRS='$STANDARDDIRS'"
2407 BUILDDIR=${BUILDDIR:-.}
2408 if test "x$STANDARDDIRS" != x ; then
2409 for d in $STANDARDDIRS ; do
2410 adr="$ROOTDIR/$d/src"
2411 if test ! -d $adr ; then
2412 echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2413 echo " is correct and that you correctly specified the STANDARDDIRS option"
2414 exit 1
2415 else
2416 SOURCEDIRS="$SOURCEDIRS $adr"
2417 fi
2418 adr="$ROOTDIR/$d/inc"
2419 if test ! -d $adr ; then
2420 echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2421 echo " is correct and that you correctly specified the STANDARDDIRS option"
2422 exit 1
2423 else
2424 INCLUDEDIRS="$INCLUDEDIRS $adr"
2425 fi
2426 done
2427 fi
2428
2429 echo " Searching for *OPTIONS.h files in order to warn about the presence"
2430 echo " of \"#define \"-type statements that are no longer allowed:"
2431 CPP_OPTIONS=
2432 CPP_EEOPTIONS=
2433 spaths=". $INCLUDEDIRS"
2434 names=`ls -1 "$ROOTDIR/pkg"`
2435 for i in $spaths ; do
2436 try="$i/CPP_OPTIONS.h"
2437 if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
2438 echo " found CPP_OPTIONS=\"$try\""
2439 CPP_OPTIONS="$try"
2440 # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
2441 for n in $names ; do
2442 test_for_package_in_cpp_options $CPP_OPTIONS $n
2443 done
2444 fi
2445 try="$i/CPP_EEOPTIONS.h"
2446 if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
2447 echo " found CPP_EEOPTIONS=\"$try\""
2448 # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
2449 #**** not yet enabled ****
2450 # test_for_mpi_in_cpp_eeoptions $try
2451 #**** not yet enabled ****
2452 CPP_EEOPTIONS="$try"
2453 fi
2454 done
2455 if test "x$CPP_OPTIONS" = x ; then
2456 echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
2457 exit 1
2458 fi
2459
2460 # Here, we build the list of files to be "run through" the adjoint
2461 # compiler.
2462 if test -f ./adSrcFiles.tmp ; then
2463 rm -f ./adSrcFiles.tmp
2464 fi
2465 echo " Creating the list of files for the adjoint compiler."
2466 touch adSrcFiles.tmp
2467 for i in $SOURCEDIRS ; do
2468 list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
2469 for j in $list_files ; do
2470 cat $i/$j >> adSrcFiles.tmp
2471 done
2472 done
2473 if test ! "x"$FS = "x.f" ; then
2474 cat adSrcFiles.tmp | sed -e "s/\.f/.$FS/g" > adSrcFiles.tmp_f
2475 mv -f adSrcFiles.tmp_f adSrcFiles.tmp
2476 fi
2477
2478 echo
2479 echo "=== Creating the Makefile ==="
2480 echo " setting INCLUDES"
2481 for i in $INCLUDEDIRS ; do
2482 if test ! -d $i ; then
2483 echo "Warning: can't find INCLUDEDIRS=\"$i\""
2484 fi
2485 done
2486
2487 if test ! "x$DIVA" = x ; then
2488 echo " Creating the pseudo-MPI include directory"
2489 INCLUDES="-I./mpi_headers $INCLUDES"
2490 rm -rf ./mpi_headers
2491 mkdir -p ./mpi_headers
2492
2493 if test "x$MPIINCLUDEDIR" = x ; then
2494 if test "x$MPIHOME" = x ; then
2495 MPIHOME='/usr'
2496 fi
2497 MPIINCLUDEDIR='$MPIHOME/include'
2498 fi
2499
2500 if test -r $MPIINCLUDEDIR/mpif.h ; then
2501 for i in $MPI_HEADER_FILES; do
2502 cp -p $MPIINCLUDEDIR/$i ./mpi_headers
2503 done
2504
2505 perl -i -pe 's/MPI_DISPLACEMENT_CURRENT=-1_8/MPI_DISPLACEMENT_CURRENT=-1/g' mpi_headers/mpif.h
2506 else
2507 echo " We cannot create a copy of mpif.h!"
2508 # exit -1
2509 fi
2510 fi
2511
2512 echo " Determining the list of source and include files"
2513 rm -rf .links.tmp
2514 mkdir .links.tmp
2515 touch .links.tmp/foo
2516 if test ! -r ".links.tmp/foo" ; then
2517 echo
2518 echo "ERROR : something is wrong with your directory permissions or"
2519 echo " your user file-creation mask (\"umask\") since creating a"
2520 echo " sub-dir, touch-ing a file within it, and then reading it is"
2521 echo " not working. Please try setting your umask to something"
2522 echo " sane such as:"
2523 echo
2524 echo " umask 0002"
2525 echo
2526 echo " and please verify that you have the proper permissions for"
2527 echo " creating sub-directories and then reading files created"
2528 echo " within them."
2529 echo
2530 exit 1
2531 fi
2532 rm -f .links.tmp/foo
2533
2534 if test "x$OPENAD" != x ; then
2535 OAD_DONT_COMPILE="/dev/null"
2536 OAD_DONT_TRANSFORM="/dev/null"
2537 OAD_KEEP_ORIGINAL="/dev/null"
2538 OAD_CB2M_FILES="/dev/null"
2539 OADTOOLS="$TOOLSDIR/OAD_support"
2540 test -f "oadtempflile" && \rm -f "oadtempflile"
2541 cat >> "oadtempflile" <<EOF
2542 $OADTOOLS
2543 EOF
2544 echo " looking for dontCompile file: "
2545 for i in "." $MODS ; do
2546 if test -r $i"/dontCompile" ; then
2547 OAD_DONT_COMPILE=$i"/dontCompile"
2548 echo " found $OAD_DONT_COMPILE"
2549 break
2550 fi
2551 done
2552 echo " looking for dontTransform file: "
2553 for i in "." $MODS ; do
2554 if test -r $i"/dontTransform" ; then
2555 OAD_DONT_TRANSFORM=$i"/dontTransform"
2556 echo " found $OAD_DONT_TRANSFORM"
2557 break
2558 fi
2559 done
2560 echo " looking for keepOriginal file: "
2561 for i in "." $MODS ; do
2562 if test -r $i"/keepOriginal" ; then
2563 OAD_KEEP_ORIGINAL=$i"/keepOriginal"
2564 echo " found $OAD_KEEP_ORIGINAL"
2565 break
2566 fi
2567 done
2568 echo " looking for cb2mFiles: "
2569 for i in "." $MODS ; do
2570 if test -r $i"/cb2mFiles" ; then
2571 OAD_CB2M_FILES=$i"/cb2mFiles"
2572 echo " found $OAD_CB2M_FILES"
2573 break
2574 fi
2575 done
2576 echo " OpenAD exceptions: "
2577 fi
2578
2579 echo "# This section creates symbolic links" > srclinks.tmp
2580 echo "" >> srclinks.tmp
2581 printf 'F77_SRC_FILES = ' > F77srclist.tmp
2582 printf 'NON_AD_F77_SRC_FILES = ' > nonADF77srclist.tmp
2583 printf 'C_SRC_FILES = ' > csrclist.tmp
2584 printf 'F90_SRC_FILES = ' > F90srclist.tmp
2585 printf 'H_SRC_FILES = ' > hsrclist.tmp
2586 printf 'AD_FLOW_FILES = ' > ad_flow_files.tmp
2587 alldirs="$SOURCEDIRS $INCLUDEDIRS ."
2588 for d in $alldirs ; do
2589 deplist=
2590 sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
2591 sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
2592 if test "x$OPENAD" != x ; then
2593 sfiles=`( echo $sfiles | grep -v _cb2m\. )`
2594 fi
2595 for sf in $sfiles ; do
2596 if test ! -r ".links.tmp/$sf" ; then
2597 if test -f "$d/$sf" ; then
2598 ignore_f=f
2599 case $d/$sf in
2600 ./$PACKAGES_DOT_H)
2601 ignore_f=t
2602 ;;
2603 ./AD_CONFIG.h)
2604 ignore_f=t
2605 ;;
2606 ./FC_NAMEMANGLE.h)
2607 ignore_f=t
2608 ;;
2609 ./BUILD_INFO.h)
2610 ignore_f=t
2611 ;;
2612 ./EMBEDDED_FILES.h)
2613 ignore_f=t
2614 ;;
2615 *)
2616 # For the local directory *ONLY*,
2617 # ignore all soft-links
2618 if test "x$HAVE_TEST_L" = xt -a "x$d" = x. -a -L $sf ; then
2619 ignore_f=t
2620 else
2621 touch .links.tmp/$sf
2622 deplist="$deplist $sf"
2623 fi
2624 ;;
2625 esac
2626 if test "x$ignore_f" = xf ; then
2627 extn=`echo $sf | $AWK -F. '{print $NF}'`
2628 case $extn in
2629 F)
2630 echo " \\" >> F77srclist.tmp
2631 printf " $sf" >> F77srclist.tmp
2632 if test "x$OPENAD" != x ; then
2633 basename=${sf%%.F}
2634 isAD=`egrep ^$basename.f'[ ]*' adSrcFiles.tmp`
2635 if test -z "$isAD" ; then
2636 toBeIgnored=`egrep ^$basename'[ ]*' ${OAD_DONT_COMPILE}`
2637 if test -z "$toBeIgnored" ; then
2638 echo " \\" >> nonADF77srclist.tmp
2639 printf " $sf" >> nonADF77srclist.tmp
2640 else
2641 echo " not to be compiled : $sf"
2642 fi
2643 else # file is initially listed as an AD file we want to exclude it
2644 # or we want to retain the untransformed version
2645 notToBeTransformed=`egrep ^$basename'[ ]*' ${OAD_DONT_TRANSFORM}`
2646 untransformedVersionToBeKept=`egrep ^$basename'[ ]*' ${OAD_KEEP_ORIGINAL}`
2647 if test -n "$notToBeTransformed"; then
2648 echo " not to be transformed: $sf"
2649 fi
2650 if test -n "$untransformedVersionToBeKept" ; then
2651 echo " original to be kept : $sf"
2652 fi
2653 if test -n "$notToBeTransformed" -o -n "$untransformedVersionToBeKept" ; then
2654 echo " \\" >> nonADF77srclist.tmp
2655 printf " $sf" >> nonADF77srclist.tmp
2656 fi
2657 fi
2658 fi
2659 ;;
2660 F90)
2661 echo " \\" >> F90srclist.tmp
2662 printf " $sf" >> F90srclist.tmp
2663 ;;
2664 c)
2665 echo " \\" >> csrclist.tmp
2666 printf " $sf" >> csrclist.tmp
2667 ;;
2668 h)
2669 echo " \\" >> hsrclist.tmp
2670 printf " $sf" >> hsrclist.tmp
2671 ;;
2672 flow)
2673 echo " \\" >> ad_flow_files.tmp
2674 printf " $sf" >> ad_flow_files.tmp
2675 ;;
2676 esac
2677 fi
2678 fi
2679 fi
2680 done
2681 if test "x$deplist" != x ; then
2682 if test "$d" != "." ; then
2683 echo "" >> srclinks.tmp
2684 echo "# These files are linked from $d" >> srclinks.tmp
2685 echo "$deplist :" >> srclinks.tmp
2686 # We need to make sure that the link isn't already there.
2687 # This may happen when make thinks that a header file has to be "remade"
2688 # because a module it depends on has changed. In this case we do nothing.
2689 printf "\tif [ ! -L \$@ ]; then \$(LN) %s/\$@ \$@; fi\n" $d >> srclinks.tmp
2690 fi
2691 fi
2692 done
2693 rm -rf .links.tmp
2694 echo "" >> F77srclist.tmp
2695 echo "" >> nonADF77srclist.tmp
2696 echo "" >> csrclist.tmp
2697 echo "" >> F90srclist.tmp
2698 echo "" >> hsrclist.tmp
2699 echo "" >> ad_flow_files.tmp
2700
2701 CMDLINE=$0
2702 for xx in "$@" ; do nw=`echo $xx | wc -w`
2703 if test $nw = '1' ; then CMDLINE="$CMDLINE $xx"
2704 else CMDLINE="$CMDLINE '$xx'" ; fi
2705 done
2706
2707 if test -f $MAKEFILE ; then
2708 mv -f $MAKEFILE "$MAKEFILE.old"
2709 fi
2710 echo " Writing makefile: $MAKEFILE"
2711 echo "# Multithreaded + multi-processing makefile for:" > $MAKEFILE
2712 echo "# $MACHINE" >> $MAKEFILE
2713 echo "# This makefile was generated automatically on" >> $MAKEFILE
2714 echo "# $THISDATE" >> $MAKEFILE
2715 echo "# by the command:" >> $MAKEFILE
2716 echo "# $CMDLINE" >> $MAKEFILE
2717 echo "# executed by:" >> $MAKEFILE
2718 echo "# ${THISUSER}@${THISHOST}:${THISCWD}" >> $MAKEFILE
2719
2720 EXE_AD=$EXECUTABLE"_ad"
2721 EXE_FTL=$EXECUTABLE"_ftl"
2722 EXE_SVD=$EXECUTABLE"_svd"
2723
2724 cat >>$MAKEFILE <<EOF
2725 #
2726 # OPTFILE="$OPTFILE"
2727 #
2728 # BUILDDIR : Directory where object files are written
2729 # SOURCEDIRS : Directories containing the source (.F) files
2730 # INCLUDEDIRS : Directories containing the header-source (.h) files
2731 # EXEDIR : Directory where executable that is generated is written
2732 # EXECUTABLE : Full path of executable binary
2733 #
2734 # CPP : C-preprocessor command
2735 # INCLUDES : Directories searched for header files
2736 # DEFINES : Macro definitions for CPP
2737 # MAKEDEPEND : Dependency generator
2738 # FC : Fortran compiler command
2739 # FFLAGS : Configuration/debugging options for FC
2740 # FOPTIM : Optimization options for FC
2741 # LINK : Command for link editor program
2742 # LIBS : Library flags /or/ additional optimization/debugging flags
2743
2744 ROOTDIR = ${ROOTDIR}
2745 BUILDDIR = ${BUILDDIR}
2746 SOURCEDIRS = ${SOURCEDIRS}
2747 INCLUDEDIRS = ${INCLUDEDIRS}
2748 EXEDIR = ${EXEDIR}
2749 EXECUTABLE = \$(EXEDIR)/${EXECUTABLE}
2750 TOOLSDIR = ${TOOLSDIR}
2751 OADTOOLS = ${OADTOOLS}
2752
2753 #eh3 new defines for the adjoint work
2754 AUTODIFF = ${ROOTDIR}/pkg/autodiff
2755 EXE_AD = ${EXE_AD}
2756 EXE_FTL = ${EXE_FTL}
2757 EXE_SVD = ${EXE_SVD}
2758
2759 ENABLED_PACKAGES = ${ENABLED_PACKAGES}
2760 DISABLED_PACKAGES = ${DISABLED_PACKAGES}
2761
2762 # These files are created by Makefile
2763 SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h BUILD_INFO.h
2764 EOF
2765
2766 if test "x$EMBED_SRC" = xt ; then
2767 echo "EMBEDDED_FILES = EMBEDDED_FILES.h" >>$MAKEFILE
2768 else
2769 echo "EMBEDDED_FILES = " >>$MAKEFILE
2770 fi
2771
2772 # extract default cpp search path so we can pass it to makedepend
2773 CPPINCLUDES=`cat /dev/null | $CPP -v 2>&1 | awk '/^End of search/{f=0}!/^\#/{if(f){printf " -I%s", $1;}}/^\#include "..." search start/{f=1}'`
2774
2775 cat >>$MAKEFILE <<EOF
2776 # Unix ln (link)
2777 LN = ${LN}
2778 # Dependency generator
2779 MAKEDEPEND = ${MAKEDEPEND}
2780 # Special preprocessor (KAP on DECs, FPP on Crays)
2781 KPP = ${KPP}
2782 # Fortran compiler
2783 FC = ${FC}
2784 # Fortran compiler
2785 F90C = ${F90C}
2786 # C compiler
2787 CC = ${CC}
2788 # Link editor
2789 LINK = ${LINK} ${LDADD}
2790
2791 # Defines for CPP
2792 DEFINES = ${DEFINES}
2793 # Includes for CPP
2794 INCLUDES = ${INCLUDES}
2795 # default CPP includes for makedepend
2796 CPPINCLUDES = ${CPPINCLUDES}
2797 # Flags for KPP
2798 KFLAGS1 = ${KFLAGS1}
2799 KFLAGS2 = ${KFLAGS2}
2800 # Optim./debug for FC
2801 FFLAGS = ${FFLAGS} ${FEXTRAFLAGS}
2802 FOPTIM = ${FOPTIM}
2803 # Optim./debug for FC
2804 F90FLAGS = ${F90FLAGS}
2805 F90OPTIM = ${F90OPTIM}
2806 F90FIXEDFORMAT = ${F90FIXEDFORMAT}
2807 # Flags for CC
2808 CFLAGS = ${CFLAGS}
2809 # Files that should not be optimized
2810 NOOPTFILES = ${NOOPTFILES}
2811 NOOPTFLAGS = ${NOOPTFLAGS}
2812 # Flags and libraries needed for linking
2813 LIBS = ${LIBS}
2814 # Name of the makefile
2815 MAKEFILE = ${MAKEFILE}
2816 # Name of the make program
2817 MAKE = ${MAKE}
2818
2819 EOF
2820
2821 cat F77srclist.tmp >> $MAKEFILE
2822 cat nonADF77srclist.tmp >> $MAKEFILE
2823 cat csrclist.tmp >> $MAKEFILE
2824 cat F90srclist.tmp >> $MAKEFILE
2825 cat hsrclist.tmp >> $MAKEFILE
2826 cat ad_flow_files.tmp >> $MAKEFILE
2827
2828 rm -f F77srclist.tmp nonADF77srclist.tmp csrclist.tmp F90srclist.tmp hsrclist.tmp ad_flow_files.tmp
2829
2830 echo >> $MAKEFILE
2831
2832 # add definitions for preprocessed sources
2833 # and note that not all systems allow case sensitive extensions
2834 # hence the $FS and $FS90 here.
2835 # for fixed format f90 files we use ff90 or FF90 resp
2836 # but these are not expected to be the original source files
2837
2838 echo 'F77_PP_SRC_FILES = $(F77_SRC_FILES:.F=.'$FS')' >> $MAKEFILE
2839 echo 'F90_PP_SRC_FILES = $(F90_SRC_FILES:.F90=.'$FS90')' >> $MAKEFILE
2840 echo 'OBJFILES= $(F77_SRC_FILES:.F=.o) $(C_SRC_FILES:.c=.o) $(F90_SRC_FILES:.F90=.o)' >> $MAKEFILE
2841 echo 'FLOWFILES = $(AD_FLOW_FILES:.flow=.flowdir)' >> $MAKEFILE
2842 echo >> $MAKEFILE
2843 echo '.SUFFIXES:' >> $MAKEFILE
2844 echo '.SUFFIXES: .o .'$FS' .p .F .c .f'$FS90' .'$FS90' .FF90 .F90 .flowdir .flow' >> $MAKEFILE
2845
2846 cat >>$MAKEFILE <<EOF
2847
2848 all: fwd_exe_target
2849 fwd_exe_target:
2850 @echo Update AD_CONFIG.h and make \$(EXECUTABLE)
2851 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Forward version" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN > ad_config.template
2852 @cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
2853 @-rm -f ad_config.template
2854 \$(MAKE) -f \$(MAKEFILE) \$(EXECUTABLE)
2855
2856 \$(EXECUTABLE): \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(OBJFILES) \$(EMBEDDED_FILES)
2857 @echo Creating \$@ ...
2858 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
2859
2860 depend:
2861 @\$(MAKE) -f \$(MAKEFILE) links
2862 \$(MAKEDEPEND) -f \$(MAKEFILE) -o .$FS \$(DEFINES) \$(INCLUDES) \$(CPPINCLUDES) \$(F77_SRC_FILES)
2863 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
2864 -rm -f makedepend.out
2865
2866 lib: libmitgcmuv.a
2867
2868 libmitgcmuv.a: \$(OBJFILES)
2869 ar rcv libmitgcmuv.a \$(OBJFILES)
2870 ar d libmitgcmuv.a main.o
2871
2872 obj: \$(OBJFILES)
2873
2874 links: \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(SPECIAL_FILES)
2875
2876 small_f: \$(F77_PP_SRC_FILES) \$(F90_PP_SRC_FILES)
2877
2878 output.txt: \$(EXECUTABLE)
2879 @printf 'running ... '
2880 @\$(EXECUTABLE) > \$@
2881
2882 # remove most of the files that "make" generates
2883 clean:
2884 -rm -rf *.p *.$FS90 *.mod ${RMFILES} work.{pc,pcl} *.template
2885 -rm -rf *.o
2886 -rm -rf *.$FS *.flowdir
2887 -rm -rf *.f$FS90 \$(AD_CLEAN) ad_input*
2888
2889 # remove most of the files that "make" and "make depend" generate
2890 Clean:
2891 @\$(MAKE) -f \$(MAKEFILE) clean
2892 @\$(MAKE) -f \$(MAKEFILE) cleanlinks
2893 -rm -f \$(SPECIAL_FILES) f90mkdepend.log $MAKEFILE.old
2894 -rm -f taf_command taf_output taf_ad.log taf_ad_flow.log taf_ftl.log
2895 -rm -f genmake_warnings genmake_errors make.log
2896
2897 # remove also the executable, files that "genmake2" generates (except Makefile)
2898 # and output from a run (plus log files from testreport)
2899 CLEAN:
2900 @\$(MAKE) -f \$(MAKEFILE) Clean
2901 -rm -f \$(EXECUTABLE) \$(EXE_AD) \$(EXE_FTL) *.bak
2902 -rm -f $LOGFILE genmake_state genmake_*optfile
2903 -rm -f SIZE.h.mpi genmake.tr_log make.tr_log
2904 -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
2905 -find \$(EXEDIR) -name "*.data" -exec rm {} \;
2906 -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
2907 -rm -f *.txt STD* *diagnostics.log datetime
2908 -rm -f *_MIT_CE_000.opt0000 costfunction*0000
2909 -rm -rf mnc_test_*
2910
2911 makefile:
2912 $THIS_SCRIPT $G2ARGS
2913 cleanlinks:
2914 -find . -type l -exec rm {} \;
2915
2916 # Special targets (SPECIAL_FILES) which are created by make
2917 ${PACKAGES_DOT_H}:
2918 @echo Creating \$@ ...
2919 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines -bPACKAGES_CONFIG_H "Disabled packages:" \$(DISABLED_PACKAGES) " " "Enabled packages:" \$(ENABLED_PACKAGES) > \$@
2920 AD_CONFIG.h:
2921 @echo Creating \$@ ...
2922 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Default version" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN > \$@
2923 FC_NAMEMANGLE.h:
2924 @echo Creating \$@ ...
2925 echo "$FC_NAMEMANGLE" > \$@
2926
2927 BUILD_INFO.h:
2928 @echo Creating \$@ ...
2929 EOF
2930
2931 test ! "x$THISVER" = x && echo " -echo \"#define THISVER '$THISVER'\" > \$@" >> $MAKEFILE
2932 test ! "x$THISUSER" = x && echo " -echo \"#define THISUSER '$THISUSER'\" >> \$@" >> $MAKEFILE
2933 test ! "x$THISDATE" = x && echo " -echo \"#define THISDATE '$THISDATE'\" >> \$@" >> $MAKEFILE
2934 test ! "x$THISHOST" = x && echo " -echo \"#define THISHOST '$THISHOST'\" >> \$@" >> $MAKEFILE
2935
2936 if test "x$EMBED_SRC" = xt ; then
2937 cat >>$MAKEFILE <<EOF
2938
2939 decode_files.o : EMBEDDED_FILES.h
2940
2941 ## \$(F77_PP_SRC_FILES)
2942 all_fF.tar.gz : \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(F77_PP_SRC_FILES) Makefile
2943 @echo Creating \$@ ...
2944 -tar -hcf all_fF.tar \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(F77_PP_SRC_FILES) Makefile
2945 -rm -f all_fF.tar.gz
2946 -gzip all_fF.tar
2947
2948 EMBEDDED_FILES.h : all_fF.tar.gz
2949 @echo Creating \$@ ...
2950 -\${ROOTDIR}/tools/embed_encode/encode_files EMBEDDED_FILES.h all_fF.tar.gz
2951
2952 EOF
2953 fi
2954
2955 cat >>$MAKEFILE <<EOF
2956
2957 # The normal chain of rules is ( .F - .$FS - .o )
2958
2959 ## This nullifies any default implicit rules concerning these two file types:
2960 ## %.o : %.F
2961
2962 # C preprocessing and replacing the _d in constants:
2963 CPPCMD = cat \$< | ${CPP} \$(DEFINES) \$(INCLUDES) | ${S64}
2964
2965 .F.$FS:
2966 \$(CPPCMD) > \$@
2967 .$FS.o:
2968 \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
2969 .F.o:
2970 \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
2971 .F90.$FS90:
2972 \$(CPPCMD) > \$@
2973 .FF90.f$FS90:
2974 \$(CPPCMD) > \$@
2975 .$FS90.o:
2976 \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
2977 .f$FS90.o:
2978 cp \$< \$(basename \$<).f90
2979 \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$(F90FIXEDFORMAT) \$(basename \$<).f90
2980 .c.o:
2981 \$(CC) \$(CFLAGS) \$(DEFINES) \$(INCLUDES) -c \$<
2982 .flow.flowdir:
2983 \$(CPPCMD) > \$@
2984
2985 # Special exceptions that use the ( .F - .p - .$FS - .o ) rule-chain
2986 .F.p:
2987 \$(CPPCMD) > \$@
2988 .p.$FS:
2989 \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
2990
2991 EOF
2992
2993 #=========================================
2994 #=== Automatic Differentiation Rules ===
2995 #=== for TAMC/TAF ======================
2996
2997 if test "x$OPENAD" = x ; then
2998
2999 cat >>$MAKEFILE <<EOF
3000
3001 TAMC = ${TAMC}
3002 TAF = ${TAF}
3003
3004 TAF_EXTRA = ${TAF_EXTRA}
3005 TAMC_EXTRA = ${TAMC_EXTRA}
3006
3007 EOF
3008
3009 ad_vars="AD_TAMC_FLAGS AD_TAF_FLAGS"
3010 ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF_FLAGS"
3011 ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
3012 for i in $ad_vars ; do
3013 name=$i
3014 t1="t2=\$"`echo "$i"`
3015 eval $t1
3016 printf "%-20s = " $name >> $MAKEFILE
3017 echo "$t2" | sed -e 's| \+| |g' >> $MAKEFILE
3018 done
3019
3020 echo " Add the source list for AD code generation"
3021 echo >> $MAKEFILE
3022 printf "AD_FILES = " >> $MAKEFILE
3023 AD_FILES=`cat adSrcFiles.tmp`
3024 for i in $AD_FILES ; do
3025 echo " \\" >> $MAKEFILE
3026 printf " $i" >> $MAKEFILE
3027 done
3028 echo >> $MAKEFILE
3029 rm -f adSrcFiles.tmp
3030
3031 cat >>$MAKEFILE <<EOF
3032
3033 # ... AD ...
3034 adall: ad_exe_target
3035 adtaf: ad_taf_output.$FS
3036 adtamc: ad_tamc_output.$FS
3037
3038 ad_exe_target:
3039 @echo Update AD_CONFIG.h and make \$(EXE_AD)
3040 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Adjoint version" -bAD_CONFIG_H -DALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN > ad_config.template
3041 @cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
3042 @-rm -f ad_config.template
3043 \$(MAKE) -f \$(MAKEFILE) \$(EXE_AD)
3044
3045 ad_input_code.$FS: \$(AD_FILES) \$(AD_FLOW_FILES)
3046 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Adjoint version" -bAD_CONFIG_H -DALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN > ad_config.template
3047 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
3048 @-rm -f ad_config.template
3049 @\$(MAKE) -f \$(MAKEFILE) \$(F77_PP_SRC_FILES)
3050 @\$(MAKE) -f \$(MAKEFILE) \$(FLOWFILES)
3051 cat \$(FLOWFILES) \$(AD_FILES) | sed -f \$(TOOLSDIR)/remove_comments_sed > ad_input_code.$FS
3052
3053 ad_taf_output.$FS: ad_input_code.$FS
3054 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
3055 ls -l ad_input_code_ad.$FS
3056 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
3057
3058 adtafonly:
3059 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
3060 ls -l ad_input_code_ad.$FS
3061 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
3062
3063 \$(EXE_AD): \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) ad_taf_output.o \$(OBJFILES) \$(EMBEDDED_FILES)
3064 \$(LINK) -o \${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
3065
3066 ad_tamc_output.$FS: ad_input_code.$FS
3067 \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.$FS
3068 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.$FS
3069
3070 ad_tamc: ad_tamc_output.o \$(OBJFILES)
3071 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
3072
3073 adonlyfwd:
3074 patch < \$(TOOLSDIR)/ad_taf_output.f.onlyfwd.diff
3075
3076 adtrick:
3077 patch < \$(TOOLSDIR)/ad_taf_output.f.adtrick.diff
3078
3079 adobj: ad_taf_output.o \$(OBJFILES)
3080
3081 # ... FTL ...
3082 ftlall: ftl_exe_target
3083 ftltaf: ftl_taf_output.$FS
3084 ftltamc: ftl_tamc_output.$FS
3085
3086 ftl_exe_target:
3087 @echo Update AD_CONFIG.h and make \$(EXE_FTL)
3088 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "TangLin version" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -DALLOW_TANGENTLINEAR_RUN > ad_config.template
3089 @cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
3090 @-rm -f ad_config.template
3091 \$(MAKE) -f \$(MAKEFILE) \$(EXE_FTL)
3092
3093 ftl_input_code.$FS: \$(AD_FILES)
3094 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "TangLin version" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -DALLOW_TANGENTLINEAR_RUN > ad_config.template
3095 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
3096 @-rm -f ad_config.template
3097 @\$(MAKE) -f \$(MAKEFILE) \$(F77_PP_SRC_FILES)
3098 @\$(MAKE) -f \$(MAKEFILE) \$(AD_FLOW_FILES)
3099 cat \$(AD_FLOW_FILES) \$(AD_FILES) | sed -f \$(TOOLSDIR)/remove_comments_sed > ftl_input_code.$FS
3100
3101 ftl_taf_output.$FS: ftl_input_code.$FS
3102 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
3103 ls -l ftl_input_code_ftl.$FS
3104 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
3105
3106 ftltafonly:
3107 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
3108 ls -l ftl_input_code_ftl.$FS
3109 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
3110
3111 \$(EXE_FTL): \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) ftl_taf_output.o \$(OBJFILES) \$(EMBEDDED_FILES)
3112 \$(LINK) -o \${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
3113
3114 ftl_tamc_output.$FS: ftl_input_code.$FS
3115 \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.$FS
3116 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.$FS
3117
3118 ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
3119 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
3120
3121 # ... SVD ...
3122 svdtaf: ad_taf_output.$FS ftl_taf_output.$FS
3123 @echo "--->>> Only ran TAF to generate SVD code! <<<---"
3124 @echo "--->>> Do make svdall afterwards to compile. <<<---"
3125 svdall: svd_touch svd_taf
3126
3127 svd_taf: \$(OBJFILES)
3128 \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
3129
3130 @echo "--->>> Only COMPILE svd code! <<<---"
3131 @echo "--->>> Assumes you previously <<<---"
3132 @echo "--->>> did make svdtaf <<<---"
3133
3134 svd_touch:
3135 @echo "--->>> Only COMPILE svd code! <<<---"
3136 @echo "--->>> Assumes you previously <<<---"
3137 @echo "--->>> did make svdtaf <<<---"
3138 touch ad_taf_output.$FS ftl_taf_output.$FS
3139 \$(FC) \$(FFLAGS) \$(FOPTIM) -c ad_taf_output.$FS
3140 \$(FC) \$(FFLAGS) \$(FOPTIM) -c ftl_taf_output.$FS
3141 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "SVD version" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -DALLOW_TANGENTLINEAR_RUN > ad_config.template
3142 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
3143 @-rm -f ad_config.template
3144
3145 EOF
3146
3147 fi
3148
3149 #=== for OpenAD ========================
3150
3151 if test "x$OPENAD" != x ; then
3152
3153 # ============ begin OpenAD specific section ==============
3154
3155 cat >>$MAKEFILE <<EOF
3156
3157 # all the source files linked from the various locations:
3158 ALL_LINKED_FILES= \
3159 \$(F77_SRC_FILES) \
3160 \$(C_SRC_FILES) \
3161 \$(H_SRC_FILES) \
3162 \$(F90_SRC_FILES) \
3163 \$(SPECIAL_FILES)
3164
3165 ifndef OPENADROOT
3166 \$(error "Error: environment variable OPENADROOT not defined!")
3167 endif
3168
3169 ifndef XAIFSCHEMAROOT
3170 \$(error "Error: environment variable XAIFSCHEMAROOT not defined!")
3171 endif
3172
3173 ifndef XAIFBOOSTERROOT
3174 \$(error "Error: environment variable XAIFBOOSTERROOT not defined!")
3175 endif
3176
3177 EOF
3178
3179 echo " Add the source list for common block to module conversion "
3180 echo >> $MAKEFILE
3181 printf "CB2M_F90_SRC_NAMES = " >> $MAKEFILE
3182 for i in `cat ${OAD_CB2M_FILES}` ; do
3183 echo " \\" >> $MAKEFILE
3184 printf " $i" >> $MAKEFILE
3185 done
3186 echo >> $MAKEFILE
3187
3188 echo " Add the source list for AD code generation"
3189 echo >> $MAKEFILE
3190 printf "AD_FILES = " >> $MAKEFILE
3191 for i in `cat ${OAD_CB2M_FILES}` ; do
3192 echo " \\" >> $MAKEFILE
3193 printf " ${i}_mod.f$FS90" >> $MAKEFILE
3194 done
3195 AD_FILES=`cat adSrcFiles.tmp`
3196 for i in $AD_FILES ; do
3197 basename=${i%%.f}
3198 toBeIgnored=`egrep ^$basename'[ ]*' ${OAD_DONT_COMPILE} ${OAD_DONT_TRANSFORM}`
3199 if test -z "$toBeIgnored" ; then
3200 echo " \\" >> $MAKEFILE
3201 printf " $i" >> $MAKEFILE
3202 fi
3203 done
3204 echo >> $MAKEFILE
3205 rm -f adSrcFiles.tmp
3206
3207 cat >>$MAKEFILE <<EOF
3208
3209 adAll: \$(EXE_AD)
3210 .PHONY: adAll
3211
3212 CB2M_F90_PP_SRC_FILES=\$(addsuffix _mod.f$FS90, \$(CB2M_F90_SRC_NAMES))
3213
3214 .PRECIOUS: \$(CB2M_F90_PP_SRC_FILES) \$(NON_AD_F77_SRC_FILES:.F=_cb2m.f$FS90)
3215
3216 .PHONY: adDepend
3217 adDepend: \$(ALL_LINKED_FILES) \$(addsuffix _mod.h, \$(CB2M_F90_SRC_NAMES)) \$(addsuffix _mod.FF90, \$(CB2M_F90_SRC_NAMES)) \$(F77_SRC_FILES:.F=_cb2m.FF90)
3218 \$(MAKEDEPEND) -f \$(MAKEFILE) -o .$FS \$(DEFINES) \$(INCLUDES) \$(F77_SRC_FILES)
3219 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
3220 -rm -f makedepend.out
3221
3222 OPENAD_SUPPORT_F90_SRC_FILES = \
3223 w2f__types.F90 \
3224 OAD_active.F90 \
3225 OAD_cp.F90 \
3226 OAD_rev.F90 \
3227 OAD_tape.F90
3228
3229 OPENAD_SUPPORT_C_SRC_FILES = \
3230 iaddr.c \
3231 timeRatio.c
3232
3233 f95_test_mods.f90: \$(OPENAD_SUPPORT_F90_SRC_FILES:F90=$FS90)
3234 cat \$^ > \$@
3235
3236 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
3237 cat \$^ > \$@
3238
3239 f95_test.out: f95_test_mods.f90 f95_test.f90
3240 f95 -fixed -w=unused -maxcontin=132 -c f95_test_mods.f90 > \$@ 2>&1
3241 f95 -fixed -w=unused -maxcontin=132 -c -fixed f95_test.f90 >> \$@ 2>&1
3242
3243 CB2M_AD_FILES=\$(AD_FILES:.f=_cb2m.f$FS90)
3244
3245 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)
3246
3247 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)
3248
3249 \$(EXE_AD): \$(ALL_LINKED_FILES) \$(addsuffix _mod.h, \$(CB2M_F90_SRC_NAMES)) postProcess.tag \$(AD_OBJ_FILES_S2)
3250 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(AD_OBJ_FILES_S2) \$(LIBS)
3251
3252 # create sources files modules from header files containing common blocks
3253 %_mod.FF90 : %.h \${OADTOOLS}/cb2mGetModules.csh \${OADTOOLS}/cb2mGetModules.awk
3254 \${OADTOOLS}/cb2mGetModules.csh $< \${OADTOOLS}/cb2mGetModules.awk
3255
3256 # create new header files with USE statements for the new modules made above
3257 %_mod.h : %.h \${OADTOOLS}/cb2mGetHeaders.csh \${OADTOOLS}/cb2mGetHeaders.awk
3258 \${OADTOOLS}/cb2mGetHeaders.csh $< \${OADTOOLS}/cb2mGetHeaders.awk \$(CB2M_F90_SRC_NAMES)
3259
3260 # change the include directives of everybody to refer to the new header files with the USE statements
3261 %_cb2m.FF90 : %.F \${OADTOOLS}/cb2mUseModules.bash
3262 \${OADTOOLS}/cb2mUseModules.bash $< ${MPI}
3263
3264 # makefile debug rule
3265 small_f: \$(CB2M_F90_PP_SRC_FILES)
3266 .PHONY: small_f
3267
3268 ad_output.txt: \$(EXE_AD)
3269 @printf 'linking data files ... '
3270 \$(LN) -f ../input_ad/data* ../input_ad/eedata .
3271 \$(LN) -f ../../global_ocean.90x40x15/input/*.bin .
3272 @printf 'running ... '
3273 @./\$(EXE_AD) > \$@
3274
3275 ad_input_code.f$FS90: \$(CB2M_AD_FILES)
3276 cat \$^ > \$@
3277
3278 # canonicalizer
3279 ad_input_code_sf.pre.f90 : \$(CB2M_AD_FILES)
3280 \${OPENADFORTTK_BASE}/tools/SourceProcessing/preProcess.py --timing --r8 -H -S -o \$@ \$^
3281
3282 # replace stop statements (to avoid the implied unstructured control flow) with print statements
3283 ad_input_code_sf.pre.s2p.f90 : ad_input_code_sf.pre.f90
3284 cat \$< | sed -f \${OADTOOLS}/stop2print.sed > ad_input_code_sf.pre.s2p.f90
3285
3286 # F -> WHIRL
3287 ad_input_code_sf.pre.s2p.B: ad_input_code_sf.pre.s2p.f90
3288 \${OPEN64ROOT}/crayf90/sgi/mfef90 -r8 -z -F ad_input_code_sf.pre.s2p.f90
3289
3290 # WHIRL -> XAIF
3291 ad_input_code_sf.pre.s2p.xaif : ad_input_code_sf.pre.s2p.B
3292 \${OPENADFORTTK}/bin/whirl2xaif -s -n --debug 1 -o \$@ \$<
3293
3294 # XAIF -> XAIF'
3295 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
3296 \${XAIFBOOSTERROOT}/xaifBooster/algorithms/BasicBlockPreaccumulationReverse/driver/oadDriver -f -t forward_step -i \$< -c \${XAIFSCHEMAROOT}/schema/examples/inlinable_intrinsics.xaif -o \$@ -I -r
3297
3298 # XAIF' -> WHIRL'
3299 ad_input_code_sf.pre.s2p.xb.x2w.B : ad_input_code_sf.pre.s2p.xb.xaif
3300 \${OPENADFORTTK}/bin/xaif2whirl --debug 1 ad_input_code_sf.pre.s2p.B \$<
3301
3302 # WHIRL' -> F'
3303 ad_input_code_sf.pre.s2p.xb.x2w.w2f.f$FS90: ad_input_code_sf.pre.s2p.xb.x2w.B
3304 \${OPEN64ROOT}/whirl2f/whirl2f -FLIST:ftn_file=\$@ -openad \$<
3305
3306 # insert template directives
3307 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
3308 \${OADTOOLS}/insertTemplateDir.bash \$< \$@
3309
3310 PPEXTRAS=\$(wildcard \${OADTOOLS}/ad_template.*.F) \${OADTOOLS}/ad_inline.F
3311 # postprocess F'
3312 postProcess.tag: ad_input_code_sf.pre.s2p.xb.x2w.w2f.td.f$FS90 \$(PPEXTRAS:.F=.f) | w2f__types.f90
3313 \${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 \$<
3314 # the target is a placeholder to trigger a single execution of the rule
3315 touch \$@
3316 # put this so make knows about the postprocessing output
3317 OAD_intrinsics_oad.f \$(CB2M_AD_FILES:.f$FS90=_oad.f): postProcess.tag
3318
3319 # link the XAIF schema files
3320 %.xsd:
3321 \$(LN) \${XAIFSCHEMAROOT}/schema/\$@ .
3322
3323 # link the support files:
3324 \$(OPENAD_SUPPORT_F90_SRC_FILES) \$(OPENAD_SUPPORT_C_SRC_FILES):
3325 \$(LN) \${OADTOOLS}/\$@ .
3326
3327 AD_CLEAN += *_mod.h *_mod.F90 *.FF90 *.mod-whirl temp.sed oad_cp.* postProcess.tag \$(PPEXTRAS:.F=.f)
3328
3329 # ============ end OpenAD specific section ==============
3330
3331 EOF
3332
3333 fi
3334
3335 #=========================================
3336
3337 if test "x$EXEHOOK" != x ; then
3338 printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE
3339 fi
3340
3341 echo " Making list of \"exceptions\" that need \".p\" files"
3342 for i in $KPPFILES ; 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.$FS: $base.p" >> $MAKEFILE
3349 done
3350
3351 echo " Making list of NOOPTFILES"
3352 for i in $NOOPTFILES ; do
3353 base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
3354 RETVAL=$?
3355 if test "x$RETVAL" != x0 ; then
3356 echo "Error: unable to add file \"$i\" to the exceptions list"
3357 fi
3358 echo "$base.o: $base.$FS" >> $MAKEFILE
3359 printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE
3360 done
3361
3362 echo " Add rules for links"
3363 cat srclinks.tmp >> $MAKEFILE
3364 rm -f srclinks.tmp
3365
3366 echo " Adding makedepend marker"
3367 printf "\n\n# DO NOT DELETE\n" >> $MAKEFILE
3368
3369 printf "\n=== Done ===\n"
3370
3371 # Create special header files
3372 $BASH $TOOLSDIR/convert_cpp_cmd2defines -bPACKAGES_CONFIG_H "Disabled packages:" $DISABLED_PACKAGES " " "Enabled packages:" $ENABLED_PACKAGES > $PACKAGES_DOT_H".tmp"
3373 if test ! -f $PACKAGES_DOT_H ; then
3374 mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
3375 else
3376 cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H > /dev/null 2>&1
3377 RETVAL=$?
3378 if test "x$RETVAL" = x0 ; then
3379 rm -f $PACKAGES_DOT_H".tmp"
3380 else
3381 mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"
3382 mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
3383 fi
3384 fi
3385 if test ! -f AD_CONFIG.h ; then
3386 $BASH $TOOLSDIR/convert_cpp_cmd2defines "Default version" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN > AD_CONFIG.h
3387 fi
3388
3389 # Write the "state" for future records
3390 if test "x$DUMPSTATE" = xt ; then
3391 printf "" > genmake_state
3392 for i in $gm_state ; do
3393 t1="t2=\$$i"
3394 eval $t1
3395 echo "$i='$t2'" | sed -e 's/ */ /g' >> genmake_state
3396 done
3397 fi

  ViewVC Help
Powered by ViewVC 1.1.22