/[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.215 - (show annotations) (download)
Mon Dec 6 17:16:06 2010 UTC (13 years, 3 months ago) by jmc
Branch: MAIN
Changes since 1.214: +3 -3 lines
remove Makefile.old with "make Clean" (previously only with CLEAN target)

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

  ViewVC Help
Powered by ViewVC 1.1.22