/[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.235 - (show annotations) (download)
Sat Aug 18 05:48:34 2012 UTC (11 years, 7 months ago) by utke
Branch: MAIN
Changes since 1.234: +31 -86 lines
start removing crud from the openad build rules - the initial pass through mfef90 is no longer needed and unparse the transformed sources into file names corresponding to the oriiginal source file names.

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

  ViewVC Help
Powered by ViewVC 1.1.22