/[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.217 - (show annotations) (download)
Wed Dec 15 17:10:38 2010 UTC (13 years, 3 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint62p
Changes since 1.216: +2 -2 lines
minor change in previous modif

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

  ViewVC Help
Powered by ViewVC 1.1.22