/[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.246 - (show annotations) (download)
Tue Dec 4 20:20:29 2012 UTC (7 years ago) by jahn
Branch: MAIN
CVS Tags: checkpoint64b
Changes since 1.245: +4 -1 lines
skip lapack test by default

1 #! /usr/bin/env bash
2 #
3 # $Header: /u/gcmpack/MITgcm/tools/genmake2,v 1.245 2012/11/17 20:04:10 jmc Exp $
4 # $Name: $
5 #
6 # Makefile generator for MITgcm UV codes
7 # created by cnh 03/98
8 # adapted by aja 06/98
9 # modified by aja 01/00
10 # rewritten in bash by eh3 08/03
11
12 # Explain usage
13 usage() {
14 cat <<EOF
15
16 Usage: "$0" [OPTIONS]
17 where [OPTIONS] can be:
18
19 -help | --help | -h | --h
20 Print this help message and exit.
21
22 -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 fi
1706 if test ! "x$OMP" = x ; then
1707 echo " Add OMPFLAG and turn on OpenMP cpp macros"
1708 FFLAGS="$FFLAGS $OMPFLAG"
1709 F90FLAGS="$F90FLAGS $OMPFLAG"
1710 DEFINES="$DEFINES -DUSE_OMP_THREADING"
1711 fi
1712
1713 if test ! "x$USE_R4" = x ; then
1714 echo " Turning on LET_RS_BE_REAL4 cpp flag"
1715 DEFINES="$DEFINES -DLET_RS_BE_REAL4"
1716 fi
1717
1718 if test ! "x$TS" = x ; then
1719 echo " Turning on timing per timestep"
1720 if test ! "x$FOOLAD" = x ; then
1721 DEFINES="$DEFINES -DTIME_PER_TIMESTEP_SFP"
1722 else
1723 DEFINES="$DEFINES -DTIME_PER_TIMESTEP"
1724 fi
1725 PACKAGES="$PACKAGES showflops"
1726 fi
1727 if test ! "x$PAPIS" = x ; then
1728 echo " Turning on PAPI flop summary per timestep"
1729 echo " Please make sure PAPIINC, PAPILIB are defined"
1730 if test ! "x$FOOLAD" = x ; then
1731 DEFINES="$DEFINES -DUSE_PAPI_FLOPS_SFP"
1732 else
1733 DEFINES="$DEFINES -DUSE_PAPI_FLOPS"
1734 fi
1735 INCLUDES="$INCLUDES $PAPIINC"
1736 LIBS="$LIBS $PAPILIB"
1737 PACKAGES="$PACKAGES showflops"
1738 fi
1739 if test ! "x$PCLS" = x ; then
1740 echo " Turning on PCL counter summary per timestep"
1741 echo " Please make sure PCLINC, PCLLIB are defined"
1742 if test ! "x$FOOLAD" = x ; then
1743 DEFINES="$DEFINES -DUSE_PCL_FLOPS_SFP"
1744 else
1745 DEFINES="$DEFINES -DUSE_PCL_FLOPS"
1746 fi
1747 INCLUDES="$INCLUDES $PCLINC"
1748 LIBS="$LIBS $PCLLIB"
1749 PACKAGES="$PACKAGES showflops"
1750 fi
1751 if test ! "x$PAPI" = x ; then
1752 if test ! "x$PAPIS" = x ; then
1753 echo " PAPI performance analysis and flop summary per timestep cannot co-exist!"
1754 echo " Sticking with PAPI flop summary per timestep!"
1755 else
1756 echo " Turning on performance analysis with PAPI"
1757 echo " Please make sure PAPIINC, PAPILIB are defined"
1758 DEFINES="$DEFINES -DUSE_PAPI"
1759 INCLUDES="$INCLUDES $PAPIINC"
1760 LIBS="$LIBS $PAPILIB"
1761 fi
1762 fi
1763 if test ! "x$PCL" = x ; then
1764 if test ! "x$PCLS" = x ; then
1765 echo " PCL performance analysis and flop summary per timestep cannot co-exist!"
1766 echo " Sticking with PCL flop summary per timestep!"
1767 else
1768 echo " Turning on performance analysis with PCL"
1769 echo " Please make sure PCLINC, PCLLIB are defined"
1770 DEFINES="$DEFINES -DUSE_PCL"
1771 INCLUDES="$INCLUDES $PCLINC"
1772 LIBS="$LIBS $PCLLIB"
1773 fi
1774 fi
1775 if test ! "x$HPMT" = x ; then
1776 if test ! "x$PAPI" = x ; then
1777 echo " PAPI and the HPM Toolkit cannot co-exist!"
1778 echo " Sticking with PAPI!"
1779 else
1780 if test ! "x$PCL" = x ; then
1781 echo " PCL and the HPM Toolkit cannot co-exist!"
1782 echo " Sticking with PCL!"
1783 else
1784 echo " Turning on performance analysis with the HPM Toolkit"
1785 echo " Please make sure HPMTINC, HPMTLIB are defined"
1786 DEFINES="$DEFINES -DUSE_LIBHPM"
1787 INCLUDES="$INCLUDES $HPMTINC"
1788 LIBS="$LIBS $HPMTLIB"
1789 fi
1790 fi
1791 fi
1792 if test ! "x$GSL" = x ; then
1793 echo " Turning on use of GSL to control floating point calculations"
1794 echo " Please make sure GSLINC, GSLLIB are defined"
1795 DEFINES="$DEFINES -DUSE_GSL_IEEE"
1796 INCLUDES="$INCLUDES $GSLINC"
1797 LIBS="$LIBS $GSLLIB"
1798 fi
1799 #- if USE_EXTENDED_SRC is set, add EXTENDED_SRC_FLAG to FFLAGS :
1800 if test ! "x$USE_EXTENDED_SRC" = x ; then
1801 FFLAGS="$FFLAGS $EXTENDED_SRC_FLAG"
1802 F90FIXEDFORMAT="$F90FIXEDFORMAT $EXTENDED_SRC_FLAG"
1803 fi
1804
1805 printf "\n=== Checking system libraries ===\n"
1806 printf " Do we have the system() command using $FC... "
1807 cat > genmake_tcomp.$FS <<EOF
1808 program hello
1809 call system('echo hi')
1810 end
1811 EOF
1812 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1813 RETVAL=$?
1814 if test "x$RETVAL" = x0 ; then
1815 HAVE_SYSTEM=t
1816 DEFINES="$DEFINES -DHAVE_SYSTEM"
1817 echo "yes"
1818 else
1819 HAVE_SYSTEM=
1820 echo "no"
1821 fi
1822 rm -f genmake_tcomp*
1823
1824 printf " Do we have the fdate() command using $FC... "
1825 cat > genmake_tcomp.$FS <<EOF
1826 program hello
1827 CHARACTER*(128) string
1828 string = ' '
1829 call fdate( string )
1830 print *, string
1831 end
1832 EOF
1833 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1834 RETVAL=$?
1835 if test "x$RETVAL" = x0 ; then
1836 HAVE_FDATE=t
1837 DEFINES="$DEFINES -DHAVE_FDATE"
1838 echo "yes"
1839 else
1840 HAVE_FDATE=
1841 echo "no"
1842 fi
1843 rm -f genmake_tcomp*
1844
1845 printf " Do we have the etime() command using $FC... "
1846 cat > genmake_tcomp.$FS <<EOF
1847 program hello
1848 REAL*4 ACTUAL, TARRAY(2)
1849 EXTERNAL ETIME
1850 REAL*4 ETIME
1851 actual = etime( tarray )
1852 print *, tarray
1853 end
1854 EOF
1855 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1856 RETVAL=$?
1857 if test "x$RETVAL" = x0 ; then
1858 HAVE_ETIME=t
1859 DEFINES="$DEFINES -DHAVE_ETIME"
1860 echo "yes"
1861 else
1862 HAVE_ETIME=
1863 echo "no"
1864 fi
1865 rm -f genmake_tcomp*
1866
1867 printf " Can we call simple C routines (here, \"cloc()\") using $FC... "
1868 check_HAVE_CLOC
1869 if test "x$HAVE_CLOC" != x ; then
1870 DEFINES="$DEFINES -DHAVE_CLOC"
1871 echo "yes"
1872 else
1873 echo "no"
1874 if test "x$EMBED_SRC" = xt ; then
1875 echo " WARNING: you requested file embedding but it has"
1876 echo " been disabled since C code cannot be called"
1877 EMBED_SRC=
1878 fi
1879 fi
1880 rm -f genmake_t*
1881
1882 printf " Can we unlimit the stack size using $FC... "
1883 check_HAVE_SETRLSTK
1884 if test "x$HAVE_SETRLSTK" = xt ; then
1885 DEFINES="$DEFINES -DHAVE_SETRLSTK"
1886 echo "yes"
1887 else
1888 echo "no"
1889 fi
1890 rm -f genmake_t*
1891
1892 printf " Can we register a signal handler using $FC... "
1893 check_HAVE_SIGREG
1894 if test "x$HAVE_SIGREG" = xt ; then
1895 DEFINES="$DEFINES -DHAVE_SIGREG"
1896 echo "yes"
1897 else
1898 echo "no"
1899 fi
1900 rm -f genmake_t*
1901
1902 printf " Can we use stat() through C calls... "
1903 check_HAVE_STAT
1904 if test "x$HAVE_STAT" != x ; then
1905 DEFINES="$DEFINES -DHAVE_STAT"
1906 echo "yes"
1907 else
1908 echo "no"
1909 fi
1910 rm -f genmake_t*
1911
1912 printf " Can we create NetCDF-enabled binaries... "
1913 check_netcdf_libs
1914 if test "x$HAVE_NETCDF" != x ; then
1915 DEFINES="$DEFINES -DHAVE_NETCDF"
1916 echo "yes"
1917 else
1918 echo "no"
1919 fi
1920
1921 printf " Can we create LAPACK-enabled binaries... "
1922 check_lapack_libs
1923 if test "x$HAVE_LAPACK" != x ; then
1924 DEFINES="$DEFINES -DHAVE_LAPACK"
1925 echo "yes"
1926 else
1927 echo "no"
1928 fi
1929
1930 printf " Can we call FLUSH intrinsic subroutine... "
1931 check_HAVE_FLUSH
1932 if test "x$HAVE_FLUSH" = xt ; then
1933 DEFINES="$DEFINES -DHAVE_FLUSH"
1934 echo "yes"
1935 else
1936 echo "no"
1937 fi
1938
1939 DEFINES="$DEFINES $IGNORE_TIME"
1940 if test "x$EMBED_SRC" = xt ; then
1941 build_embed_encode
1942 fi
1943 if test "x$EMBED_SRC" = xt ; then
1944 ENABLE="$ENABLE embed_files"
1945 # DEFINES="$DEFINES -DHAVE_EMBED_SRC"
1946 fi
1947
1948 printf "\n=== Setting defaults ===\n"
1949 printf " Adding MODS directories: "
1950 for d in $MODS ; do
1951 if test ! -d $d ; then
1952 echo
1953 echo "Error: MODS directory \"$d\" not found!"
1954 exit 1
1955 else
1956 printf "$d "
1957 SOURCEDIRS="$SOURCEDIRS $d"
1958 INCLUDEDIRS="$INCLUDEDIRS $d"
1959 fi
1960 done
1961 echo
1962
1963 #if test "x${PLATFORM}" = x ; then
1964 # PLATFORM=$p_PLATFORM
1965 #fi
1966
1967 if test "x${EXEDIR}" = x ; then
1968 tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1969 if test "x$tmp" = "xbin" -a -d ../exe -a $ROOTDIR = .. ; then
1970 EXEDIR=../exe
1971 else
1972 EXEDIR=.
1973 fi
1974 fi
1975 if test ! -d ${EXEDIR} ; then
1976 echo "Error: the specified EXEDIR (\"$EXEDIR\") does not exist!"
1977 exit 1
1978 fi
1979
1980 if test "x${TOOLSDIR}" = x ; then
1981 TOOLSDIR="$ROOTDIR/tools"
1982 fi
1983 if test ! -d ${TOOLSDIR} ; then
1984 echo "Error: the specified TOOLSDIR (\"$TOOLSDIR\") does not exist!"
1985 exit 1
1986 fi
1987 if test "x$S64" = x ; then
1988 echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.sh > /dev/null 2>&1
1989 RETVAL=$?
1990 if test "x${RETVAL}" = x0 ; then
1991 S64='$(TOOLSDIR)/set64bitConst.sh'
1992 else
1993 echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.csh > /dev/null 2>&1
1994 RETVAL=$?
1995 if test "x${RETVAL}" = x0 ; then
1996 S64='$(TOOLSDIR)/set64bitConst.csh'
1997 else
1998 cat <<EOF
1999
2000 ERROR: neither of the two default scripts:
2001
2002 ${TOOLSDIR}/set64bitConst.sh
2003 ${TOOLSDIR}/set64bitConst.csh
2004
2005 are working so please check paths or specify (with \$S64) a
2006 working version of this script.
2007
2008 EOF
2009 exit 1
2010 fi
2011 fi
2012 fi
2013 THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`
2014
2015 EXECUTABLE=${EXECUTABLE:-mitgcmuv}
2016
2017 # Set Standard Code Directories:
2018 if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
2019 STANDARDDIRS="eesupp model"
2020 fi
2021 # if model in Standard-Code-Dir, add eesupp (needed to compile model)
2022 echo " $STANDARDDIRS " | grep ' model ' > /dev/null 2>&1
2023 ckM=$?
2024 echo " $STANDARDDIRS " | grep ' eesupp ' > /dev/null 2>&1
2025 ckE=$?
2026 if test $ckM = 0 -a $ckE = 1 ; then
2027 STANDARDDIRS="$STANDARDDIRS eesupp"
2028 fi
2029
2030 # We have a special set of source files in eesupp/src which are
2031 # generated from some template source files. We'll make them first so
2032 # they appear as regular source code
2033 if test -r $ROOTDIR"/eesupp/src/Makefile" ; then
2034 echo " Making source files in eesupp from templates"
2035 ( cd $ROOTDIR"/eesupp/src/" && $MAKE clean_old && $MAKE \
2036 ) > make_eesupp.errors 2>&1
2037 RETVAL=$?
2038 if test "x${RETVAL}" = x0 ; then
2039 rm -f make_eesupp.errors
2040 else
2041 echo "Error: problem encountered while building source files in eesupp:"
2042 cat make_eesupp.errors 1>&2
2043 exit 1
2044 fi
2045 fi
2046
2047 #same for pkg/exch2 and pkg/regrid
2048 for pdir in exch2 regrid ; do
2049 if test -r $ROOTDIR"/pkg/${pdir}/Makefile" ; then
2050 echo " Making source files in pkg/${pdir} from templates"
2051 ( cd $ROOTDIR"/pkg/"${pdir} && $MAKE clean_old && $MAKE \
2052 ) > make_${pdir}.errors 2>&1
2053 RETVAL=$?
2054 if test "x${RETVAL}" = x0 ; then
2055 rm -f make_${pdir}.errors
2056 else
2057 echo "Error: problem encountered while building source files in pkg/${pdir}:"
2058 cat make_${pdir}.errors 1>&2
2059 exit 1
2060 fi
2061 fi
2062 done
2063
2064 printf "\n=== Determining package settings ===\n"
2065 if test "x${PKG_DEPEND}" = x ; then
2066 tmp=$ROOTDIR"/pkg/pkg_depend"
2067 if test -r $tmp ; then PKG_DEPEND=$tmp ; fi
2068 fi
2069 if test "x${PKG_DEPEND}" = x ; then
2070 echo "Warning: No package dependency information was specified."
2071 echo " Please check that ROOTDIR/pkg/pkg_depend exists."
2072 else
2073 if test ! -r ${PKG_DEPEND} ; then
2074 echo "Error: can't read package dependency info from PKG_DEPEND=\"$PKG_DEPEND\""
2075 exit 1
2076 fi
2077 echo " getting package dependency info from $PKG_DEPEND"
2078 # Strip the comments and then convert the dependency file into arrays: PNAME, DNAME
2079 get_pdepend_list $PKG_DEPEND
2080 fi
2081
2082 # A default package groups file "$ROOTDIR/pkg/pkg_groups" is provided
2083 # to define the "default_pkg_list" and package groups (for convenience, one
2084 # can specify a group of packages using names like "ocean" and "atmosphere").
2085 if test "x${PKG_GROUPS}" = x ; then
2086 tmp=$ROOTDIR"/pkg/pkg_groups"
2087 if test -r $tmp ; then PKG_GROUPS=$tmp ; fi
2088 fi
2089 if test "x${PKG_GROUPS}" = x ; then
2090 echo "Warning: No package groups information was specified."
2091 echo " Please check that ROOTDIR/pkg/pkg_groups exists."
2092 else
2093 if test ! -r ${PKG_GROUPS} ; then
2094 echo "Error: can't read package groups info from PKG_GROUPS=\"$PKG_GROUPS\""
2095 exit 1
2096 fi
2097 echo " getting package groups info from $PKG_GROUPS"
2098 fi
2099
2100 # Search for packages to compile.
2101 echo " checking list of packages to compile:"
2102 PKG_LIST=
2103 if test "x${PKG_LIST}" = x ; then
2104 for i in "." $MODS ; do
2105 if test -r $i"/packages.conf" ; then
2106 PKG_LIST=$i"/packages.conf"
2107 break
2108 fi
2109 done
2110 fi
2111 if test "x${PKG_LIST}" = x ; then
2112 pkg_list='default_pkg_list'
2113 if test "x${PKG_GROUPS}" = x ; then
2114 echo "Error: need package groups info to expand pkg_list=\"$pkg_list\""
2115 exit 1
2116 fi
2117 else
2118 if test ! -r $PKG_LIST ; then
2119 echo "Error: can't read package list from PKG_LIST=\"$PKG_LIST\""
2120 exit 1
2121 else
2122 echo " using PKG_LIST=\"$PKG_LIST\""
2123 # Strip the comments and add all the names
2124 pkg_list=`cat $PKG_LIST | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
2125 RETVAL=$?
2126 if test "x${RETVAL}" != x0 ; then
2127 printf "Error: can't parse package list "
2128 echo "-- please check PKG_LIST=\"$PKG_LIST\""
2129 exit 1
2130 fi
2131 fi
2132 fi
2133 for i in $pkg_list ; do
2134 PACKAGES="$PACKAGES $i"
2135 done
2136 echo " before group expansion packages are:$PACKAGES"
2137 if test "x${PKG_GROUPS}" != x ; then
2138 RET=1
2139 while test $RET = 1 ; do expand_pkg_groups; RET=$?; done
2140 echo " after group expansion packages are: $PACKAGES"
2141 fi
2142
2143 echo " applying DISABLE settings"
2144 echo "" > ./.tmp_pack
2145 for i in $PACKAGES ; do
2146 echo $i >> ./.tmp_pack
2147 done
2148 for i in `grep "-" ./.tmp_pack` ; do
2149 j=`echo $i | sed 's/[-]//'`
2150 DISABLE="$DISABLE $j"
2151 done
2152 pack=
2153 for p in $PACKAGES ; do
2154 addit="t"
2155 for d in $DISABLE ; do
2156 if test "x$p" = "x$d" ; then
2157 addit="f"
2158 fi
2159 done
2160 if test "x$addit" = xt ; then
2161 pack="$pack $p"
2162 fi
2163 done
2164 PACKAGES="$pack"
2165 echo " applying ENABLE settings"
2166 echo "" > ./.tmp_pack
2167 PACKAGES="$PACKAGES $ENABLE"
2168 # Test if each explicitly referenced package exists
2169 for i in $PACKAGES ; do
2170 j=`echo $i | sed 's/[-+]//'`
2171 if test ! -d "$ROOTDIR/pkg/$j" ; then
2172 echo "Error: dir '$ROOTDIR/pkg/$i' missing for package '$i'"
2173 exit 1
2174 fi
2175 echo $i >> ./.tmp_pack
2176 done
2177 PACKAGES=
2178 for i in `grep -v "-" ./.tmp_pack | sort | uniq` ; do
2179 PACKAGES="$PACKAGES $i"
2180 done
2181 rm -f ./.tmp_pack
2182 echo " packages are: $PACKAGES"
2183
2184 # Check for package MNC: if NetCDF is available, then build the MNC
2185 # template files ; otherwise, delete mnc from the list of packages.
2186 echo " $PACKAGES " | grep ' mnc ' > /dev/null 2>&1
2187 mnc_in=$?
2188 if test "x$HAVE_NETCDF" != xt ; then
2189 if test "x$mnc_in" = x0 ; then
2190 cat <<EOF
2191 *********************************************************************
2192 WARNING: the "mnc" package was enabled but tests failed to compile
2193 NetCDF applications. Please check that:
2194
2195 1) NetCDF is correctly installed for this compiler and
2196 2) the LIBS variable (within the "optfile") specifies the correct
2197 NetCDF library to link against.
2198
2199 Due to this failure, the "mnc" package is now DISABLED.
2200 *********************************************************************
2201 EOF
2202 PACKAGES=`echo $PACKAGES | sed -e 's/mnc//g'`
2203 DISABLE="$DISABLE mnc"
2204 else
2205 # this prevent to add mnc (due to pdepend rules) if not available
2206 DISABLE="$DISABLE mnc"
2207 fi
2208 else
2209 # we have NetCDF, we try to build MNC template files
2210 ( cd $ROOTDIR"/pkg/mnc" && $MAKE testclean && $MAKE templates ) > make_mnc.errors 2>&1
2211 RETVAL=$?
2212 if test "x${RETVAL}" = x0 ; then
2213 rm -f make_mnc.errors
2214 else
2215 echo "Error: problem encountered while building source files in pkg/mnc:"
2216 cat make_mnc.errors 1>&2
2217 if test "x$mnc_in" = x0 ; then
2218 exit 1
2219 else
2220 DISABLE="$DISABLE mnc"
2221 fi
2222 fi
2223 fi
2224
2225 # Check for package PROFILES: if NetCDF is not available,
2226 # then delete profiles from the list of available packages.
2227 if test "x$HAVE_NETCDF" != xt ; then
2228 echo " $PACKAGES " | grep ' profiles ' > /dev/null 2>&1
2229 RETVAL=$?
2230 if test "x$RETVAL" = x0 ; then
2231 cat <<EOF
2232 *********************************************************************
2233 WARNING: the "profiles" package was enabled but tests failed to
2234 compile NetCDF applications. Please check that:
2235
2236 1) NetCDF is correctly installed for this compiler and
2237 2) the LIBS variable (within the "optfile") specifies the correct
2238 NetCDF library to link against.
2239
2240 Due to this failure, the "profiles" package is now DISABLED.
2241 *********************************************************************
2242 EOF
2243 PACKAGES=`echo $PACKAGES | sed -e 's/profiles//g'`
2244 DISABLE="$DISABLE profiles"
2245 else
2246 # this prevent to add profiles (due to pdepend rules) if not available
2247 DISABLE="$DISABLE profiles"
2248 fi
2249 fi
2250
2251 # Check for package RADTRANS: if LAPACK is not available,
2252 # then issue a warning that the direct radtrans solver is not available.
2253 if test "x$HAVE_LAPACK" != xt ; then
2254 echo " $PACKAGES " | grep ' radtrans ' > /dev/null 2>&1
2255 RETVAL=$?
2256 if test "x$RETVAL" = x0 ; then
2257 cat <<EOF
2258 *********************************************************************
2259 WARNING: the "radtrans" package was enabled but tests failed to
2260 compile LAPACK applications. This means that the direct radtrans
2261 solver is not available and compilation will fail if it is enabled.
2262 If you want to use the direct solver, please check that:
2263
2264 1) LAPACK is correctly installed for this compiler and
2265 2) the LIBS variable (within the "optfile") specifies the correct
2266 LAPACK library to link against.
2267 *********************************************************************
2268 EOF
2269 fi
2270 fi
2271
2272 if test "x${PKG_DEPEND}" != x ; then
2273 echo " applying package dependency rules"
2274 ck=
2275 while test "x$ck" != xtt ; do
2276 i=0
2277 # rtot=${#PNAME[@]}
2278 rtot=$nname
2279 while test $i -le $rtot ; do
2280
2281 # Is $pname in the current $PACKAGES list?
2282 # pname=${PNAME[$i]}
2283 tmp="pname=\"\$PNAME_$i\""
2284 eval $tmp
2285 pin="f"
2286 for p in $PACKAGES ; do
2287 if test "x$p" = "x$pname" ; then
2288 pin="t"
2289 fi
2290 done
2291 # or in the current $STANDARDDIRS list?
2292 for p in $STANDARDDIRS ; do
2293 if test "x$p" = "x$pname" ; then pin="t" ; fi
2294 done
2295
2296 # Is the DNAME entry a (+) or (-) rule ?
2297 tmp="dname=\"\$DNAME_$i\""
2298 eval $tmp
2299 plus="-"
2300 echo $dname | grep '^+' > /dev/null 2>&1
2301 RETVAL=$?
2302 if test "x$RETVAL" = x0 ; then
2303 plus="+"
2304 fi
2305
2306 # Is $dname in the current $PACKAGES list?
2307 dname=`echo $dname | sed -e 's/^[+-]//'`
2308 din="f"
2309 for p in $PACKAGES ; do
2310 if test "x$p" = "x$dname" ; then
2311 din="t"
2312 fi
2313 done
2314
2315 # Do we need to add $dname according to the dependency rules?
2316 if test "x$pin" = xt -a "x$plus" = "x+" -a "x$din" = xf ; then
2317 #echo " " $pname ": need to add :" $dname
2318 in_dis="f"
2319 for dis in $DISABLE ; do
2320 if test "x$dis" = "x$dname" ; then
2321 in_dis="t"
2322 fi
2323 done
2324 if test "x$in_dis" = xt ; then
2325 echo "Error: can't satisfy package dependencies:"
2326 echo " \"$dname\" is required by the dependency rules"
2327 echo " but is disallowed by the DISABLE settings"
2328 exit 1
2329 else
2330 PACKAGES="$PACKAGES $dname"
2331 ck=
2332 fi
2333 fi
2334
2335 # Do we need to get rid of $dname according to the dependency rules?
2336 if test "x$pin" = xt -a "x$plus" = "x-" -a "x$din" = xt; then
2337 echo "Error: can't satisfy package dependencies:"
2338 echo " \"$pname\" was requested but is disallowed by"
2339 echo " the dependency rules for \"$dname\""
2340 exit 1
2341 fi
2342 i=`echo "$i + 1" | bc -l`
2343 #i=$(( $i + 1 ))
2344 done
2345 ck=$ck"t"
2346 done
2347 echo " packages are: $PACKAGES"
2348 fi
2349 for i in $PACKAGES ; do
2350 adr="$ROOTDIR/pkg/$i"
2351 if test -d $adr ; then
2352 SOURCEDIRS="$SOURCEDIRS $adr"
2353 INCLUDEDIRS="$INCLUDEDIRS $adr"
2354 if test "x$i" = xautodiff ; then
2355 AUTODIFF_PKG_USED=t
2356 fi
2357 else
2358 echo "Error: the directory \"$adr\" for package $i doesn't exist"
2359 exit 1
2360 fi
2361 done
2362
2363 # Create a list of #define and #undef to enable/disable packages
2364 PACKAGES_DOT_H=PACKAGES_CONFIG.h
2365 # The following UGLY HACK sets multiple "#undef"s and it needs to go
2366 # away. On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h
2367 # file would eventually be split up so that all package-related #define
2368 # statements could be separated and handled only by genmake.
2369 names=`ls -1 "$ROOTDIR/pkg"`
2370 all_pack=
2371 DISABLED_PACKAGES=
2372 for n in $names ; do
2373 if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
2374 has_pack="f"
2375 for pack in $PACKAGES ; do
2376 if test "x$pack" = "x$n" ; then
2377 has_pack="t"
2378 break
2379 fi
2380 done
2381 if test "x$has_pack" = xf ; then
2382 undef=`echo "ALLOW_$n" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2383 DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
2384 fi
2385 fi
2386 done
2387 ENABLED_PACKAGES=
2388 for i in $PACKAGES ; do
2389 def=`echo "ALLOW_$i" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2390 ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
2391 #eh3 DEFINES="$DEFINES -D$def"
2392
2393 #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
2394 case $i in
2395 aim_v23)
2396 ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
2397 echo "Warning: ALLOW_AIM is set to enable aim_v23."
2398 ;;
2399 esac
2400 #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
2401
2402 done
2403
2404 echo " Adding STANDARDDIRS='$STANDARDDIRS'"
2405 BUILDDIR=${BUILDDIR:-.}
2406 if test "x$STANDARDDIRS" != x ; then
2407 for d in $STANDARDDIRS ; do
2408 adr="$ROOTDIR/$d/src"
2409 if test ! -d $adr ; then
2410 echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2411 echo " is correct and that you correctly specified the STANDARDDIRS option"
2412 exit 1
2413 else
2414 SOURCEDIRS="$SOURCEDIRS $adr"
2415 fi
2416 adr="$ROOTDIR/$d/inc"
2417 if test ! -d $adr ; then
2418 echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2419 echo " is correct and that you correctly specified the STANDARDDIRS option"
2420 exit 1
2421 else
2422 INCLUDEDIRS="$INCLUDEDIRS $adr"
2423 fi
2424 done
2425 fi
2426
2427 echo " Searching for *OPTIONS.h files in order to warn about the presence"
2428 echo " of \"#define \"-type statements that are no longer allowed:"
2429 CPP_OPTIONS=
2430 CPP_EEOPTIONS=
2431 spaths=". $INCLUDEDIRS"
2432 names=`ls -1 "$ROOTDIR/pkg"`
2433 for i in $spaths ; do
2434 try="$i/CPP_OPTIONS.h"
2435 if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
2436 echo " found CPP_OPTIONS=\"$try\""
2437 CPP_OPTIONS="$try"
2438 # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
2439 for n in $names ; do
2440 test_for_package_in_cpp_options $CPP_OPTIONS $n
2441 done
2442 fi
2443 try="$i/CPP_EEOPTIONS.h"
2444 if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
2445 echo " found CPP_EEOPTIONS=\"$try\""
2446 # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
2447 #**** not yet enabled ****
2448 # test_for_mpi_in_cpp_eeoptions $try
2449 #**** not yet enabled ****
2450 CPP_EEOPTIONS="$try"
2451 fi
2452 done
2453 if test "x$CPP_OPTIONS" = x ; then
2454 echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
2455 exit 1
2456 fi
2457
2458 # Here, we build the list of files to be "run through" the adjoint
2459 # compiler.
2460 if test -f ./adSrcFiles.tmp ; then
2461 rm -f ./adSrcFiles.tmp
2462 fi
2463 echo " Creating the list of files for the adjoint compiler."
2464 touch adSrcFiles.tmp
2465 for i in $SOURCEDIRS ; do
2466 list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
2467 for j in $list_files ; do
2468 cat $i/$j >> adSrcFiles.tmp
2469 done
2470 done
2471 if test ! "x"$FS = "x.f" ; then
2472 cat adSrcFiles.tmp | sed -e "s/\.f/.$FS/g" > adSrcFiles.tmp_f
2473 mv -f adSrcFiles.tmp_f adSrcFiles.tmp
2474 fi
2475
2476 echo
2477 echo "=== Creating the Makefile ==="
2478 echo " setting INCLUDES"
2479 for i in $INCLUDEDIRS ; do
2480 if test ! -d $i ; then
2481 echo "Warning: can't find INCLUDEDIRS=\"$i\""
2482 fi
2483 done
2484
2485 if test ! "x$DIVA" = x ; then
2486 echo " Creating the pseudo-MPI include directory"
2487 INCLUDES="-I./mpi_headers $INCLUDES"
2488 rm -rf ./mpi_headers
2489 mkdir -p ./mpi_headers
2490
2491 if test "x$MPIINCLUDEDIR" = x ; then
2492 if test "x$MPIHOME" = x ; then
2493 MPIHOME='/usr'
2494 fi
2495 MPIINCLUDEDIR='$MPIHOME/include'
2496 fi
2497
2498 if test -r $MPIINCLUDEDIR/mpif.h ; then
2499 for i in $MPI_HEADER_FILES; do
2500 cp -p $MPIINCLUDEDIR/$i ./mpi_headers
2501 done
2502
2503 perl -i -pe 's/MPI_DISPLACEMENT_CURRENT=-1_8/MPI_DISPLACEMENT_CURRENT=-1/g' mpi_headers/mpif.h
2504 else
2505 echo " We cannot create a copy of mpif.h!"
2506 # exit -1
2507 fi
2508 fi
2509
2510 echo " Determining the list of source and include files"
2511 rm -rf .links.tmp
2512 mkdir .links.tmp
2513 touch .links.tmp/foo
2514 if test ! -r ".links.tmp/foo" ; then
2515 echo
2516 echo "ERROR : something is wrong with your directory permissions or"
2517 echo " your user file-creation mask (\"umask\") since creating a"
2518 echo " sub-dir, touch-ing a file within it, and then reading it is"
2519 echo " not working. Please try setting your umask to something"
2520 echo " sane such as:"
2521 echo
2522 echo " umask 0002"
2523 echo
2524 echo " and please verify that you have the proper permissions for"
2525 echo " creating sub-directories and then reading files created"
2526 echo " within them."
2527 echo
2528 exit 1
2529 fi
2530 rm -f .links.tmp/foo
2531
2532 if test "x$OPENAD" != x ; then
2533 OAD_DONT_COMPILE="/dev/null"
2534 OAD_DONT_TRANSFORM="/dev/null"
2535 OAD_KEEP_ORIGINAL="/dev/null"
2536 OAD_CB2M_FILES="/dev/null"
2537 OADTOOLS="$TOOLSDIR/OAD_support"
2538 test -f "oadtempflile" && \rm -f "oadtempflile"
2539 cat >> "oadtempflile" <<EOF
2540 $OADTOOLS
2541 EOF
2542 echo " looking for dontCompile file: "
2543 for i in "." $MODS ; do
2544 if test -r $i"/dontCompile" ; then
2545 OAD_DONT_COMPILE=$i"/dontCompile"
2546 echo " found $OAD_DONT_COMPILE"
2547 break
2548 fi
2549 done
2550 echo " looking for dontTransform file: "
2551 for i in "." $MODS ; do
2552 if test -r $i"/dontTransform" ; then
2553 OAD_DONT_TRANSFORM=$i"/dontTransform"
2554 echo " found $OAD_DONT_TRANSFORM"
2555 break
2556 fi
2557 done
2558 echo " looking for keepOriginal file: "
2559 for i in "." $MODS ; do
2560 if test -r $i"/keepOriginal" ; then
2561 OAD_KEEP_ORIGINAL=$i"/keepOriginal"
2562 echo " found $OAD_KEEP_ORIGINAL"
2563 break
2564 fi
2565 done
2566 echo " looking for cb2mFiles: "
2567 for i in "." $MODS ; do
2568 if test -r $i"/cb2mFiles" ; then
2569 OAD_CB2M_FILES=$i"/cb2mFiles"
2570 echo " found $OAD_CB2M_FILES"
2571 break
2572 fi
2573 done
2574 echo " OpenAD exceptions: "
2575 fi
2576
2577 echo "# This section creates symbolic links" > srclinks.tmp
2578 echo "" >> srclinks.tmp
2579 printf 'F77_SRC_FILES = ' > F77srclist.tmp
2580 printf 'NON_AD_F77_SRC_FILES = ' > nonADF77srclist.tmp
2581 printf 'C_SRC_FILES = ' > csrclist.tmp
2582 printf 'F90_SRC_FILES = ' > F90srclist.tmp
2583 printf 'H_SRC_FILES = ' > hsrclist.tmp
2584 printf 'AD_FLOW_FILES = ' > ad_flow_files.tmp
2585 alldirs="$SOURCEDIRS $INCLUDEDIRS ."
2586 for d in $alldirs ; do
2587 deplist=
2588 sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
2589 sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
2590 if test "x$OPENAD" != x ; then
2591 sfiles=`( echo $sfiles | grep -v _cb2m\. )`
2592 fi
2593 for sf in $sfiles ; do
2594 if test ! -r ".links.tmp/$sf" ; then
2595 if test -f "$d/$sf" ; then
2596 ignore_f=f
2597 case $d/$sf in
2598 ./$PACKAGES_DOT_H)
2599 ignore_f=t
2600 ;;
2601 ./AD_CONFIG.h)
2602 ignore_f=t
2603 ;;
2604 ./FC_NAMEMANGLE.h)
2605 ignore_f=t
2606 ;;
2607 ./BUILD_INFO.h)
2608 ignore_f=t
2609 ;;
2610 ./EMBEDDED_FILES.h)
2611 ignore_f=t
2612 ;;
2613 *)
2614 # For the local directory *ONLY*,
2615 # ignore all soft-links
2616 if test "x$HAVE_TEST_L" = xt -a "x$d" = x. -a -L $sf ; then
2617 ignore_f=t
2618 else
2619 touch .links.tmp/$sf
2620 deplist="$deplist $sf"
2621 fi
2622 ;;
2623 esac
2624 if test "x$ignore_f" = xf ; then
2625 extn=`echo $sf | $AWK -F. '{print $NF}'`
2626 case $extn in
2627 F)
2628 echo " \\" >> F77srclist.tmp
2629 printf " $sf" >> F77srclist.tmp
2630 if test "x$OPENAD" != x ; then
2631 basename=${sf%%.F}
2632 isAD=`egrep ^$basename.f'[ ]*' adSrcFiles.tmp`
2633 if test -z "$isAD" ; then
2634 toBeIgnored=`egrep ^$basename'[ ]*' ${OAD_DONT_COMPILE}`
2635 if test -z "$toBeIgnored" ; then
2636 echo " \\" >> nonADF77srclist.tmp
2637 printf " $sf" >> nonADF77srclist.tmp
2638 else
2639 echo " not to be compiled : $sf"
2640 fi
2641 else # file is initially listed as an AD file we want to exclude it
2642 # or we want to retain the untransformed version
2643 notToBeTransformed=`egrep ^$basename'[ ]*' ${OAD_DONT_TRANSFORM}`
2644 untransformedVersionToBeKept=`egrep ^$basename'[ ]*' ${OAD_KEEP_ORIGINAL}`
2645 if test -n "$notToBeTransformed"; then
2646 echo " not to be transformed: $sf"
2647 fi
2648 if test -n "$untransformedVersionToBeKept" ; then
2649 echo " original to be kept : $sf"
2650 fi
2651 if test -n "$notToBeTransformed" -o -n "$untransformedVersionToBeKept" ; then
2652 echo " \\" >> nonADF77srclist.tmp
2653 printf " $sf" >> nonADF77srclist.tmp
2654 fi
2655 fi
2656 fi
2657 ;;
2658 F90)
2659 echo " \\" >> F90srclist.tmp
2660 printf " $sf" >> F90srclist.tmp
2661 ;;
2662 c)
2663 echo " \\" >> csrclist.tmp
2664 printf " $sf" >> csrclist.tmp
2665 ;;
2666 h)
2667 echo " \\" >> hsrclist.tmp
2668 printf " $sf" >> hsrclist.tmp
2669 ;;
2670 flow)
2671 echo " \\" >> ad_flow_files.tmp
2672 printf " $sf" >> ad_flow_files.tmp
2673 ;;
2674 esac
2675 fi
2676 fi
2677 fi
2678 done
2679 if test "x$deplist" != x ; then
2680 if test "$d" != "." ; then
2681 echo "" >> srclinks.tmp
2682 echo "# These files are linked from $d" >> srclinks.tmp
2683 echo "$deplist :" >> srclinks.tmp
2684 # We need to make sure that the link isn't already there.
2685 # This may happen when make thinks that a header file has to be "remade"
2686 # because a module it depends on has changed. In this case we do nothing.
2687 printf "\tif [ ! -L \$@ ]; then \$(LN) %s/\$@ \$@; fi\n" $d >> srclinks.tmp
2688 fi
2689 fi
2690 done
2691 rm -rf .links.tmp
2692 echo "" >> F77srclist.tmp
2693 echo "" >> nonADF77srclist.tmp
2694 echo "" >> csrclist.tmp
2695 echo "" >> F90srclist.tmp
2696 echo "" >> hsrclist.tmp
2697 echo "" >> ad_flow_files.tmp
2698
2699 CMDLINE=$0
2700 for xx in "$@" ; do nw=`echo $xx | wc -w`
2701 if test $nw = '1' ; then CMDLINE="$CMDLINE $xx"
2702 else CMDLINE="$CMDLINE '$xx'" ; fi
2703 done
2704
2705 if test -f $MAKEFILE ; then
2706 mv -f $MAKEFILE "$MAKEFILE.old"
2707 fi
2708 echo " Writing makefile: $MAKEFILE"
2709 echo "# Multithreaded + multi-processing makefile for:" > $MAKEFILE
2710 echo "# $MACHINE" >> $MAKEFILE
2711 echo "# This makefile was generated automatically on" >> $MAKEFILE
2712 echo "# $THISDATE" >> $MAKEFILE
2713 echo "# by the command:" >> $MAKEFILE
2714 echo "# $CMDLINE" >> $MAKEFILE
2715 echo "# executed by:" >> $MAKEFILE
2716 echo "# ${THISUSER}@${THISHOST}:${THISCWD}" >> $MAKEFILE
2717
2718 EXE_AD=$EXECUTABLE"_ad"
2719 EXE_FTL=$EXECUTABLE"_ftl"
2720 EXE_SVD=$EXECUTABLE"_svd"
2721
2722 cat >>$MAKEFILE <<EOF
2723 #
2724 # OPTFILE="$OPTFILE"
2725 #
2726 # BUILDDIR : Directory where object files are written
2727 # SOURCEDIRS : Directories containing the source (.F) files
2728 # INCLUDEDIRS : Directories containing the header-source (.h) files
2729 # EXEDIR : Directory where executable that is generated is written
2730 # EXECUTABLE : Full path of executable binary
2731 #
2732 # CPP : C-preprocessor command
2733 # INCLUDES : Directories searched for header files
2734 # DEFINES : Macro definitions for CPP
2735 # MAKEDEPEND : Dependency generator
2736 # FC : Fortran compiler command
2737 # FFLAGS : Configuration/debugging options for FC
2738 # FOPTIM : Optimization options for FC
2739 # LINK : Command for link editor program
2740 # LIBS : Library flags /or/ additional optimization/debugging flags
2741
2742 ROOTDIR = ${ROOTDIR}
2743 BUILDDIR = ${BUILDDIR}
2744 SOURCEDIRS = ${SOURCEDIRS}
2745 INCLUDEDIRS = ${INCLUDEDIRS}
2746 EXEDIR = ${EXEDIR}
2747 EXECUTABLE = \$(EXEDIR)/${EXECUTABLE}
2748 TOOLSDIR = ${TOOLSDIR}
2749 OADTOOLS = ${OADTOOLS}
2750
2751 #eh3 new defines for the adjoint work
2752 AUTODIFF = ${ROOTDIR}/pkg/autodiff
2753 EXE_AD = ${EXE_AD}
2754 EXE_FTL = ${EXE_FTL}
2755 EXE_SVD = ${EXE_SVD}
2756
2757 ENABLED_PACKAGES = ${ENABLED_PACKAGES}
2758 DISABLED_PACKAGES = ${DISABLED_PACKAGES}
2759
2760 # These files are created by Makefile
2761 SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h BUILD_INFO.h
2762 EOF
2763
2764 if test "x$EMBED_SRC" = xt ; then
2765 echo "EMBEDDED_FILES = EMBEDDED_FILES.h" >>$MAKEFILE
2766 else
2767 echo "EMBEDDED_FILES = " >>$MAKEFILE
2768 fi
2769
2770 cat >>$MAKEFILE <<EOF
2771 # Unix ln (link)
2772 LN = ${LN}
2773 # Dependency generator
2774 MAKEDEPEND = ${MAKEDEPEND}
2775 # Special preprocessor (KAP on DECs, FPP on Crays)
2776 KPP = ${KPP}
2777 # Fortran compiler
2778 FC = ${FC}
2779 # Fortran compiler
2780 F90C = ${F90C}
2781 # C compiler
2782 CC = ${CC}
2783 # Link editor
2784 LINK = ${LINK} ${LDADD}
2785
2786 # Defines for CPP
2787 DEFINES = ${DEFINES}
2788 # Includes for CPP
2789 INCLUDES = ${INCLUDES}
2790 # Flags for KPP
2791 KFLAGS1 = ${KFLAGS1}
2792 KFLAGS2 = ${KFLAGS2}
2793 # Optim./debug for FC
2794 FFLAGS = ${FFLAGS} ${FEXTRAFLAGS}
2795 FOPTIM = ${FOPTIM}
2796 # Optim./debug for FC
2797 F90FLAGS = ${F90FLAGS}
2798 F90OPTIM = ${F90OPTIM}
2799 F90FIXEDFORMAT = ${F90FIXEDFORMAT}
2800 # Flags for CC
2801 CFLAGS = ${CFLAGS}
2802 # Files that should not be optimized
2803 NOOPTFILES = ${NOOPTFILES}
2804 NOOPTFLAGS = ${NOOPTFLAGS}
2805 # Flags and libraries needed for linking
2806 LIBS = ${LIBS}
2807 # Name of the makefile
2808 MAKEFILE = ${MAKEFILE}
2809 # Name of the make program
2810 MAKE = ${MAKE}
2811
2812 EOF
2813
2814 cat F77srclist.tmp >> $MAKEFILE
2815 cat nonADF77srclist.tmp >> $MAKEFILE
2816 cat csrclist.tmp >> $MAKEFILE
2817 cat F90srclist.tmp >> $MAKEFILE
2818 cat hsrclist.tmp >> $MAKEFILE
2819 cat ad_flow_files.tmp >> $MAKEFILE
2820
2821 rm -f F77srclist.tmp nonADF77srclist.tmp csrclist.tmp F90srclist.tmp hsrclist.tmp ad_flow_files.tmp
2822
2823 echo >> $MAKEFILE
2824
2825 # add definitions for preprocessed sources
2826 # and note that not all systems allow case sensitive extensions
2827 # hence the $FS and $FS90 here.
2828 # for fixed format f90 files we use ff90 or FF90 resp
2829 # but these are not expected to be the original source files
2830
2831 echo 'F77_PP_SRC_FILES = $(F77_SRC_FILES:.F=.'$FS')' >> $MAKEFILE
2832 echo 'F90_PP_SRC_FILES = $(F90_SRC_FILES:.F90=.'$FS90')' >> $MAKEFILE
2833 echo 'OBJFILES= $(F77_SRC_FILES:.F=.o) $(C_SRC_FILES:.c=.o) $(F90_SRC_FILES:.F90=.o)' >> $MAKEFILE
2834 echo 'FLOWFILES = $(AD_FLOW_FILES:.flow=.flowdir)' >> $MAKEFILE
2835 echo >> $MAKEFILE
2836 echo '.SUFFIXES:' >> $MAKEFILE
2837 echo '.SUFFIXES: .o .'$FS' .p .F .c .f'$FS90' .'$FS90' .FF90 .F90 .flowdir .flow' >> $MAKEFILE
2838
2839 cat >>$MAKEFILE <<EOF
2840
2841 all: fwd_exe_target
2842 fwd_exe_target:
2843 @echo Update AD_CONFIG.h and make \$(EXECUTABLE)
2844 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Forward version" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN > ad_config.template
2845 @cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
2846 @-rm -f ad_config.template
2847 \$(MAKE) -f \$(MAKEFILE) \$(EXECUTABLE)
2848
2849 \$(EXECUTABLE): \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(OBJFILES) \$(EMBEDDED_FILES)
2850 @echo Creating \$@ ...
2851 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
2852
2853 depend:
2854 @\$(MAKE) -f \$(MAKEFILE) links
2855 \$(MAKEDEPEND) -f \$(MAKEFILE) -o .$FS \$(DEFINES) \$(INCLUDES) \$(F77_SRC_FILES)
2856 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
2857 -rm -f makedepend.out
2858
2859 lib: libmitgcmuv.a
2860
2861 libmitgcmuv.a: \$(OBJFILES)
2862 ar rcv libmitgcmuv.a \$(OBJFILES)
2863 ar d libmitgcmuv.a main.o
2864
2865 obj: \$(OBJFILES)
2866
2867 links: \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(SPECIAL_FILES)
2868
2869 small_f: \$(F77_PP_SRC_FILES) \$(F90_PP_SRC_FILES)
2870
2871 output.txt: \$(EXECUTABLE)
2872 @printf 'running ... '
2873 @\$(EXECUTABLE) > \$@
2874
2875 # remove most of the files that "make" generates
2876 clean:
2877 -rm -rf *.p *.$FS90 *.mod ${RMFILES} work.{pc,pcl} *.template
2878 -rm -rf *.o
2879 -rm -rf *.$FS *.flowdir
2880 -rm -rf *.f$FS90 \$(AD_CLEAN) ad_input*
2881
2882 # remove most of the files that "make" and "make depend" generate
2883 Clean:
2884 @\$(MAKE) -f \$(MAKEFILE) clean
2885 @\$(MAKE) -f \$(MAKEFILE) cleanlinks
2886 -rm -f \$(SPECIAL_FILES) f90mkdepend.log $MAKEFILE.old
2887 -rm -f taf_command taf_output taf_ad.log taf_ad_flow.log taf_ftl.log
2888 -rm -f genmake_warnings genmake_errors make.log
2889
2890 # remove also the executable, files that "genmake2" generates (except Makefile)
2891 # and output from a run (plus log files from testreport)
2892 CLEAN:
2893 @\$(MAKE) -f \$(MAKEFILE) Clean
2894 -rm -f \$(EXECUTABLE) \$(EXE_AD) \$(EXE_FTL) *.bak
2895 -rm -f $LOGFILE genmake_state genmake_*optfile
2896 -rm -f SIZE.h.mpi genmake.tr_log make.tr_log
2897 -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
2898 -find \$(EXEDIR) -name "*.data" -exec rm {} \;
2899 -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
2900 -rm -f *.txt STD* *diagnostics.log datetime
2901 -rm -f *_MIT_CE_000.opt0000 costfunction*0000
2902 -rm -rf mnc_test_*
2903
2904 makefile:
2905 $THIS_SCRIPT $G2ARGS
2906 cleanlinks:
2907 -find . -type l -exec rm {} \;
2908
2909 # Special targets (SPECIAL_FILES) which are created by make
2910 ${PACKAGES_DOT_H}:
2911 @echo Creating \$@ ...
2912 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines -bPACKAGES_CONFIG_H "Disabled packages:" \$(DISABLED_PACKAGES) " " "Enabled packages:" \$(ENABLED_PACKAGES) > \$@
2913 AD_CONFIG.h:
2914 @echo Creating \$@ ...
2915 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Default version" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN > \$@
2916 FC_NAMEMANGLE.h:
2917 @echo Creating \$@ ...
2918 echo "$FC_NAMEMANGLE" > \$@
2919
2920 BUILD_INFO.h:
2921 @echo Creating \$@ ...
2922 EOF
2923
2924 test ! "x$THISVER" = x && echo " -echo \"#define THISVER '$THISVER'\" > \$@" >> $MAKEFILE
2925 test ! "x$THISUSER" = x && echo " -echo \"#define THISUSER '$THISUSER'\" >> \$@" >> $MAKEFILE
2926 test ! "x$THISDATE" = x && echo " -echo \"#define THISDATE '$THISDATE'\" >> \$@" >> $MAKEFILE
2927 test ! "x$THISHOST" = x && echo " -echo \"#define THISHOST '$THISHOST'\" >> \$@" >> $MAKEFILE
2928
2929 if test "x$EMBED_SRC" = xt ; then
2930 cat >>$MAKEFILE <<EOF
2931
2932 decode_files.o : EMBEDDED_FILES.h
2933
2934 ## \$(F77_PP_SRC_FILES)
2935 all_fF.tar.gz : \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(F77_PP_SRC_FILES) Makefile
2936 @echo Creating \$@ ...
2937 -tar -hcf all_fF.tar \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(F77_PP_SRC_FILES) Makefile
2938 -rm -f all_fF.tar.gz
2939 -gzip all_fF.tar
2940
2941 EMBEDDED_FILES.h : all_fF.tar.gz
2942 @echo Creating \$@ ...
2943 -\${ROOTDIR}/tools/embed_encode/encode_files EMBEDDED_FILES.h all_fF.tar.gz
2944
2945 EOF
2946 fi
2947
2948 cat >>$MAKEFILE <<EOF
2949
2950 # The normal chain of rules is ( .F - .$FS - .o )
2951
2952 ## This nullifies any default implicit rules concerning these two file types:
2953 ## %.o : %.F
2954
2955 # C preprocessing and replacing the _d in constants:
2956 CPPCMD = cat \$< | ${CPP} \$(DEFINES) \$(INCLUDES) | ${S64}
2957
2958 .F.$FS:
2959 \$(CPPCMD) > \$@
2960 .$FS.o:
2961 \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
2962 .F.o:
2963 \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
2964 .F90.$FS90:
2965 \$(CPPCMD) > \$@
2966 .FF90.f$FS90:
2967 \$(CPPCMD) > \$@
2968 .$FS90.o:
2969 \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
2970 .f$FS90.o:
2971 cp \$< \$(basename \$<).f90
2972 \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$(F90FIXEDFORMAT) \$(basename \$<).f90
2973 .c.o:
2974 \$(CC) \$(CFLAGS) \$(DEFINES) \$(INCLUDES) -c \$<
2975 .flow.flowdir:
2976 \$(CPPCMD) > \$@
2977
2978 # Special exceptions that use the ( .F - .p - .$FS - .o ) rule-chain
2979 .F.p:
2980 \$(CPPCMD) > \$@
2981 .p.$FS:
2982 \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
2983
2984 EOF
2985
2986 #=========================================
2987 #=== Automatic Differentiation Rules ===
2988 #=== for TAMC/TAF ======================
2989
2990 if test "x$OPENAD" = x ; then
2991
2992 cat >>$MAKEFILE <<EOF
2993
2994 TAMC = ${TAMC}
2995 TAF = ${TAF}
2996
2997 TAF_EXTRA = ${TAF_EXTRA}
2998 TAMC_EXTRA = ${TAMC_EXTRA}
2999
3000 EOF
3001
3002 ad_vars="AD_TAMC_FLAGS AD_TAF_FLAGS"
3003 ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF_FLAGS"
3004 ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
3005 for i in $ad_vars ; do
3006 name=$i
3007 t1="t2=\$"`echo "$i"`
3008 eval $t1
3009 printf "%-20s = " $name >> $MAKEFILE
3010 echo "$t2" | sed -e 's| \+| |g' >> $MAKEFILE
3011 done
3012
3013 echo " Add the source list for AD code generation"
3014 echo >> $MAKEFILE
3015 printf "AD_FILES = " >> $MAKEFILE
3016 AD_FILES=`cat adSrcFiles.tmp`
3017 for i in $AD_FILES ; do
3018 echo " \\" >> $MAKEFILE
3019 printf " $i" >> $MAKEFILE
3020 done
3021 echo >> $MAKEFILE
3022 rm -f adSrcFiles.tmp
3023
3024 cat >>$MAKEFILE <<EOF
3025
3026 # ... AD ...
3027 adall: ad_exe_target
3028 adtaf: ad_taf_output.$FS
3029 adtamc: ad_tamc_output.$FS
3030
3031 ad_exe_target:
3032 @echo Update AD_CONFIG.h and make \$(EXE_AD)
3033 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Adjoint version" -bAD_CONFIG_H -DALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN > ad_config.template
3034 @cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
3035 @-rm -f ad_config.template
3036 \$(MAKE) -f \$(MAKEFILE) \$(EXE_AD)
3037
3038 ad_input_code.$FS: \$(AD_FILES) \$(AD_FLOW_FILES)
3039 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Adjoint version" -bAD_CONFIG_H -DALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN > ad_config.template
3040 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
3041 @-rm -f ad_config.template
3042 @\$(MAKE) -f \$(MAKEFILE) \$(F77_PP_SRC_FILES)
3043 @\$(MAKE) -f \$(MAKEFILE) \$(FLOWFILES)
3044 cat \$(FLOWFILES) \$(AD_FILES) | sed -f \$(TOOLSDIR)/remove_comments_sed > ad_input_code.$FS
3045
3046 ad_taf_output.$FS: ad_input_code.$FS
3047 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
3048 ls -l ad_input_code_ad.$FS
3049 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
3050
3051 adtafonly:
3052 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
3053 ls -l ad_input_code_ad.$FS
3054 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
3055
3056 \$(EXE_AD): \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) ad_taf_output.o \$(OBJFILES) \$(EMBEDDED_FILES)
3057 \$(LINK) -o \${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
3058
3059 ad_tamc_output.$FS: ad_input_code.$FS
3060 \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.$FS
3061 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.$FS
3062
3063 ad_tamc: ad_tamc_output.o \$(OBJFILES)
3064 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
3065
3066 adonlyfwd:
3067 patch < \$(TOOLSDIR)/ad_taf_output.f.onlyfwd.diff
3068
3069 adtrick:
3070 patch < \$(TOOLSDIR)/ad_taf_output.f.adtrick.diff
3071
3072 adobj: ad_taf_output.o \$(OBJFILES)
3073
3074 # ... FTL ...
3075 ftlall: ftl_exe_target
3076 ftltaf: ftl_taf_output.$FS
3077 ftltamc: ftl_tamc_output.$FS
3078
3079 ftl_exe_target:
3080 @echo Update AD_CONFIG.h and make \$(EXE_FTL)
3081 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "TangLin version" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -DALLOW_TANGENTLINEAR_RUN > ad_config.template
3082 @cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
3083 @-rm -f ad_config.template
3084 \$(MAKE) -f \$(MAKEFILE) \$(EXE_FTL)
3085
3086 ftl_input_code.$FS: \$(AD_FILES)
3087 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "TangLin version" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -DALLOW_TANGENTLINEAR_RUN > ad_config.template
3088 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
3089 @-rm -f ad_config.template
3090 @\$(MAKE) -f \$(MAKEFILE) \$(F77_PP_SRC_FILES)
3091 @\$(MAKE) -f \$(MAKEFILE) \$(AD_FLOW_FILES)
3092 cat \$(AD_FLOW_FILES) \$(AD_FILES) | sed -f \$(TOOLSDIR)/remove_comments_sed > ftl_input_code.$FS
3093
3094 ftl_taf_output.$FS: ftl_input_code.$FS
3095 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
3096 ls -l ftl_input_code_ftl.$FS
3097 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
3098
3099 ftltafonly:
3100 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
3101 ls -l ftl_input_code_ftl.$FS
3102 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
3103
3104 \$(EXE_FTL): \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) ftl_taf_output.o \$(OBJFILES) \$(EMBEDDED_FILES)
3105 \$(LINK) -o \${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
3106
3107 ftl_tamc_output.$FS: ftl_input_code.$FS
3108 \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.$FS
3109 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.$FS
3110
3111 ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
3112 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
3113
3114 # ... SVD ...
3115 svdtaf: ad_taf_output.$FS ftl_taf_output.$FS
3116 @echo "--->>> Only ran TAF to generate SVD code! <<<---"
3117 @echo "--->>> Do make svdall afterwards to compile. <<<---"
3118 svdall: svd_touch svd_taf
3119
3120 svd_taf: \$(OBJFILES)
3121 \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
3122
3123 @echo "--->>> Only COMPILE svd code! <<<---"
3124 @echo "--->>> Assumes you previously <<<---"
3125 @echo "--->>> did make svdtaf <<<---"
3126
3127 svd_touch:
3128 @echo "--->>> Only COMPILE svd code! <<<---"
3129 @echo "--->>> Assumes you previously <<<---"
3130 @echo "--->>> did make svdtaf <<<---"
3131 touch ad_taf_output.$FS ftl_taf_output.$FS
3132 \$(FC) \$(FFLAGS) \$(FOPTIM) -c ad_taf_output.$FS
3133 \$(FC) \$(FFLAGS) \$(FOPTIM) -c ftl_taf_output.$FS
3134 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "SVD version" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -DALLOW_TANGENTLINEAR_RUN > ad_config.template
3135 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
3136 @-rm -f ad_config.template
3137
3138 EOF
3139
3140 fi
3141
3142 #=== for OpenAD ========================
3143
3144 if test "x$OPENAD" != x ; then
3145
3146 # ============ begin OpenAD specific section ==============
3147
3148 cat >>$MAKEFILE <<EOF
3149
3150 # all the source files linked from the various locations:
3151 ALL_LINKED_FILES= \
3152 \$(F77_SRC_FILES) \
3153 \$(C_SRC_FILES) \
3154 \$(H_SRC_FILES) \
3155 \$(F90_SRC_FILES) \
3156 \$(SPECIAL_FILES)
3157
3158 ifndef OPENADROOT
3159 \$(error "Error: environment variable OPENADROOT not defined!")
3160 endif
3161
3162 ifndef XAIFSCHEMAROOT
3163 \$(error "Error: environment variable XAIFSCHEMAROOT not defined!")
3164 endif
3165
3166 ifndef XAIFBOOSTERROOT
3167 \$(error "Error: environment variable XAIFBOOSTERROOT not defined!")
3168 endif
3169
3170 EOF
3171
3172 echo " Add the source list for common block to module conversion "
3173 echo >> $MAKEFILE
3174 printf "CB2M_F90_SRC_NAMES = " >> $MAKEFILE
3175 for i in `cat ${OAD_CB2M_FILES}` ; do
3176 echo " \\" >> $MAKEFILE
3177 printf " $i" >> $MAKEFILE
3178 done
3179 echo >> $MAKEFILE
3180
3181 echo " Add the source list for AD code generation"
3182 echo >> $MAKEFILE
3183 printf "AD_FILES = " >> $MAKEFILE
3184 for i in `cat ${OAD_CB2M_FILES}` ; do
3185 echo " \\" >> $MAKEFILE
3186 printf " ${i}_mod.f$FS90" >> $MAKEFILE
3187 done
3188 AD_FILES=`cat adSrcFiles.tmp`
3189 for i in $AD_FILES ; do
3190 basename=${i%%.f}
3191 toBeIgnored=`egrep ^$basename'[ ]*' ${OAD_DONT_COMPILE} ${OAD_DONT_TRANSFORM}`
3192 if test -z "$toBeIgnored" ; then
3193 echo " \\" >> $MAKEFILE
3194 printf " $i" >> $MAKEFILE
3195 fi
3196 done
3197 echo >> $MAKEFILE
3198 rm -f adSrcFiles.tmp
3199
3200 cat >>$MAKEFILE <<EOF
3201
3202 adAll: \$(EXE_AD)
3203 .PHONY: adAll
3204
3205 CB2M_F90_PP_SRC_FILES=\$(addsuffix _mod.f$FS90, \$(CB2M_F90_SRC_NAMES))
3206
3207 .PRECIOUS: \$(CB2M_F90_PP_SRC_FILES) \$(NON_AD_F77_SRC_FILES:.F=_cb2m.f$FS90)
3208
3209 .PHONY: adDepend
3210 adDepend: \$(ALL_LINKED_FILES) \$(addsuffix _mod.h, \$(CB2M_F90_SRC_NAMES)) \$(addsuffix _mod.FF90, \$(CB2M_F90_SRC_NAMES)) \$(F77_SRC_FILES:.F=_cb2m.FF90)
3211 \$(MAKEDEPEND) -f \$(MAKEFILE) -o .$FS \$(DEFINES) \$(INCLUDES) \$(F77_SRC_FILES)
3212 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
3213 -rm -f makedepend.out
3214
3215 OPENAD_SUPPORT_F90_SRC_FILES = \
3216 w2f__types.F90 \
3217 OAD_active.F90 \
3218 OAD_cp.F90 \
3219 OAD_rev.F90 \
3220 OAD_tape.F90
3221
3222 OPENAD_SUPPORT_C_SRC_FILES = \
3223 iaddr.c \
3224 timeRatio.c
3225
3226 f95_test_mods.f90: \$(OPENAD_SUPPORT_F90_SRC_FILES:F90=$FS90)
3227 cat \$^ > \$@
3228
3229 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
3230 cat \$^ > \$@
3231
3232 f95_test.out: f95_test_mods.f90 f95_test.f90
3233 f95 -fixed -w=unused -maxcontin=132 -c f95_test_mods.f90 > \$@ 2>&1
3234 f95 -fixed -w=unused -maxcontin=132 -c -fixed f95_test.f90 >> \$@ 2>&1
3235
3236 CB2M_AD_FILES=\$(AD_FILES:.f=_cb2m.f$FS90)
3237
3238 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)
3239
3240 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)
3241
3242 \$(EXE_AD): \$(ALL_LINKED_FILES) \$(addsuffix _mod.h, \$(CB2M_F90_SRC_NAMES)) postProcess.tag \$(AD_OBJ_FILES_S2)
3243 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(AD_OBJ_FILES_S2) \$(LIBS)
3244
3245 # create sources files modules from header files containing common blocks
3246 %_mod.FF90 : %.h \${OADTOOLS}/cb2mGetModules.csh \${OADTOOLS}/cb2mGetModules.awk
3247 \${OADTOOLS}/cb2mGetModules.csh $< \${OADTOOLS}/cb2mGetModules.awk
3248
3249 # create new header files with USE statements for the new modules made above
3250 %_mod.h : %.h \${OADTOOLS}/cb2mGetHeaders.csh \${OADTOOLS}/cb2mGetHeaders.awk
3251 \${OADTOOLS}/cb2mGetHeaders.csh $< \${OADTOOLS}/cb2mGetHeaders.awk \$(CB2M_F90_SRC_NAMES)
3252
3253 # change the include directives of everybody to refer to the new header files with the USE statements
3254 %_cb2m.FF90 : %.F \${OADTOOLS}/cb2mUseModules.bash
3255 \${OADTOOLS}/cb2mUseModules.bash $< ${MPI}
3256
3257 # makefile debug rule
3258 small_f: \$(CB2M_F90_PP_SRC_FILES)
3259 .PHONY: small_f
3260
3261 ad_output.txt: \$(EXE_AD)
3262 @printf 'linking data files ... '
3263 \$(LN) -f ../input_ad/data* ../input_ad/eedata .
3264 \$(LN) -f ../../global_ocean.90x40x15/input/*.bin .
3265 @printf 'running ... '
3266 @./\$(EXE_AD) > \$@
3267
3268 ad_input_code.f$FS90: \$(CB2M_AD_FILES)
3269 cat \$^ > \$@
3270
3271 # canonicalizer
3272 ad_input_code_sf.pre.f90 : \$(CB2M_AD_FILES)
3273 \${OPENADFORTTK_BASE}/tools/SourceProcessing/preProcess.py --timing --r8 -H -S -o \$@ \$^
3274
3275 # replace stop statements (to avoid the implied unstructured control flow) with print statements
3276 ad_input_code_sf.pre.s2p.f90 : ad_input_code_sf.pre.f90
3277 cat \$< | sed -f \${OADTOOLS}/stop2print.sed > ad_input_code_sf.pre.s2p.f90
3278
3279 # F -> WHIRL
3280 ad_input_code_sf.pre.s2p.B: ad_input_code_sf.pre.s2p.f90
3281 \${OPEN64ROOT}/crayf90/sgi/mfef90 -r8 -z -F ad_input_code_sf.pre.s2p.f90
3282
3283 # WHIRL -> XAIF
3284 ad_input_code_sf.pre.s2p.xaif : ad_input_code_sf.pre.s2p.B
3285 \${OPENADFORTTK}/bin/whirl2xaif -s -n --debug 1 -o \$@ \$<
3286
3287 # XAIF -> XAIF'
3288 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
3289 \${XAIFBOOSTERROOT}/xaifBooster/algorithms/BasicBlockPreaccumulationReverse/driver/oadDriver -f -t forward_step -i \$< -c \${XAIFSCHEMAROOT}/schema/examples/inlinable_intrinsics.xaif -o \$@ -I -r
3290
3291 # XAIF' -> WHIRL'
3292 ad_input_code_sf.pre.s2p.xb.x2w.B : ad_input_code_sf.pre.s2p.xb.xaif
3293 \${OPENADFORTTK}/bin/xaif2whirl --debug 1 ad_input_code_sf.pre.s2p.B \$<
3294
3295 # WHIRL' -> F'
3296 ad_input_code_sf.pre.s2p.xb.x2w.w2f.f$FS90: ad_input_code_sf.pre.s2p.xb.x2w.B
3297 \${OPEN64ROOT}/whirl2f/whirl2f -FLIST:ftn_file=\$@ -openad \$<
3298
3299 # insert template directives
3300 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
3301 \${OADTOOLS}/insertTemplateDir.bash \$< \$@
3302
3303 PPEXTRAS=\$(wildcard \${OADTOOLS}/ad_template.*.F) \${OADTOOLS}/ad_inline.F
3304 # postprocess F'
3305 postProcess.tag: ad_input_code_sf.pre.s2p.xb.x2w.w2f.td.f$FS90 \$(PPEXTRAS:.F=.f) | w2f__types.f90
3306 \${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 \$<
3307 # the target is a placeholder to trigger a single execution of the rule
3308 touch \$@
3309 # put this so make knows about the postprocessing output
3310 OAD_intrinsics_oad.f \$(CB2M_AD_FILES:.f$FS90=_oad.f): postProcess.tag
3311
3312 # link the XAIF schema files
3313 %.xsd:
3314 \$(LN) \${XAIFSCHEMAROOT}/schema/\$@ .
3315
3316 # link the support files:
3317 \$(OPENAD_SUPPORT_F90_SRC_FILES) \$(OPENAD_SUPPORT_C_SRC_FILES):
3318 \$(LN) \${OADTOOLS}/\$@ .
3319
3320 AD_CLEAN += *_mod.h *_mod.F90 *.FF90 *.mod-whirl temp.sed oad_cp.* postProcess.tag \$(PPEXTRAS:.F=.f)
3321
3322 # ============ end OpenAD specific section ==============
3323
3324 EOF
3325
3326 fi
3327
3328 #=========================================
3329
3330 if test "x$EXEHOOK" != x ; then
3331 printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE
3332 fi
3333
3334 echo " Making list of \"exceptions\" that need \".p\" files"
3335 for i in $KPPFILES ; do
3336 base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
3337 RETVAL=$?
3338 if test "x$RETVAL" != x0 ; then
3339 echo "Error: unable to add file \"$i\" to the exceptions list"
3340 fi
3341 echo "$base.$FS: $base.p" >> $MAKEFILE
3342 done
3343
3344 echo " Making list of NOOPTFILES"
3345 for i in $NOOPTFILES ; do
3346 base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
3347 RETVAL=$?
3348 if test "x$RETVAL" != x0 ; then
3349 echo "Error: unable to add file \"$i\" to the exceptions list"
3350 fi
3351 echo "$base.o: $base.$FS" >> $MAKEFILE
3352 printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE
3353 done
3354
3355 echo " Add rules for links"
3356 cat srclinks.tmp >> $MAKEFILE
3357 rm -f srclinks.tmp
3358
3359 echo " Adding makedepend marker"
3360 printf "\n\n# DO NOT DELETE\n" >> $MAKEFILE
3361
3362 printf "\n=== Done ===\n"
3363
3364 # Create special header files
3365 $BASH $TOOLSDIR/convert_cpp_cmd2defines -bPACKAGES_CONFIG_H "Disabled packages:" $DISABLED_PACKAGES " " "Enabled packages:" $ENABLED_PACKAGES > $PACKAGES_DOT_H".tmp"
3366 if test ! -f $PACKAGES_DOT_H ; then
3367 mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
3368 else
3369 cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H > /dev/null 2>&1
3370 RETVAL=$?
3371 if test "x$RETVAL" = x0 ; then
3372 rm -f $PACKAGES_DOT_H".tmp"
3373 else
3374 mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"
3375 mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
3376 fi
3377 fi
3378 if test ! -f AD_CONFIG.h ; then
3379 $BASH $TOOLSDIR/convert_cpp_cmd2defines "Default version" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN > AD_CONFIG.h
3380 fi
3381
3382 # Write the "state" for future records
3383 if test "x$DUMPSTATE" = xt ; then
3384 printf "" > genmake_state
3385 for i in $gm_state ; do
3386 t1="t2=\$$i"
3387 eval $t1
3388 echo "$i='$t2'" | sed -e 's/ */ /g' >> genmake_state
3389 done
3390 fi

  ViewVC Help
Powered by ViewVC 1.1.22