/[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.252 - (show annotations) (download)
Mon Jul 22 19:11:31 2013 UTC (10 years, 8 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint64k
Changes since 1.251: +5 -8 lines
- do not produce file oadtempflile (OAD_support & Makefile no longer need it)
- add few more files to makefile target "CLEAN"

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

  ViewVC Help
Powered by ViewVC 1.1.22