/[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.211 - (show annotations) (download)
Tue Nov 2 22:45:07 2010 UTC (13 years, 4 months ago) by jmc
Branch: MAIN
Changes since 1.210: +59 -59 lines
-only 1 log file "genmake.log" (previously genmake_warnings & genmake_errors)
-change DUMPSTATE default to false (can use "-ds" option to switch it to T)
-update link to devel_HOWTO document

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

  ViewVC Help
Powered by ViewVC 1.1.22