/[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.138 - (show annotations) (download)
Sun Dec 4 13:57:08 2005 UTC (18 years, 3 months ago) by edhill
Branch: MAIN
CVS Tags: checkpoint57y_post, checkpoint57y_pre, checkpoint57x_post
Changes since 1.137: +2 -2 lines
 o fix bad syntax -- as reported by Martin Losch

1 #! /usr/bin/env bash
2 #
3 # $Header: /u/gcmpack/MITgcm/tools/genmake2,v 1.137 2005/12/03 08:30:32 edhill 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" || exit 99
17 test_for_string_in_file $cpp_options "^[ ]*#undef.*ALLOW_$pkg" || exit 99
18 test_for_string_in_file $cpp_options "^[ ]*#define.*DISABLE_$pkg" || exit 99
19 test_for_string_in_file $cpp_options "^[ ]*#undef.*DISABLE_$pkg" || exit 99
20 }
21
22 # Search for particular CPP #cmds associated with MPI
23 # usage: test_for_mpi_in_cpp_eeoptions CPP_file
24 test_for_mpi_in_cpp_eeoptions() {
25 cpp_options=$1
26 test_for_string_in_file $cpp_options "^[ ]*#define.*ALLOW_USE_MPI" || exit 99
27 test_for_string_in_file $cpp_options "^[ ]*#undef.*ALLOW_USE_MPI" || exit 99
28 test_for_string_in_file $cpp_options "^[ ]*#define.*ALWAYS_USE_MPI" || exit 99
29 test_for_string_in_file $cpp_options "^[ ]*#undef.*ALWAYS_USE_MPI" || exit 99
30 }
31
32 # Search for particular string in a file. Return 1 if detected, 0 if not
33 # usage: test_for_string_in_file file string
34 test_for_string_in_file() {
35 file=$1
36 strng=$2
37 grep -i "$strng" $file > /dev/null 2>&1
38 RETVAL=$?
39 if test "x${RETVAL}" = x0 ; then
40 printf "Error: In $file there is an illegal line: "
41 grep -i "$strng" $file
42 return 1
43 fi
44 return 0
45 }
46
47 # Read the $ROOTDIR/pkg/pkg_groups file and expand any references to
48 # the package list.
49 expand_pkg_groups() {
50 new_packages=
51 PKG_GROUPS=$ROOTDIR"/pkg/pkg_groups"
52 if test -r $PKG_GROUPS ; then
53 cat $PKG_GROUPS | sed -e 's/#.*$//g' | sed -e 's/:/ : /g' > ./p1.tmp
54 cat ./p1.tmp | $AWK '(NF>2 && $2==":"){ print $0 }' > ./p2.tmp
55 matched=0
56 for i in $PACKAGES ; do
57 line=`grep "^ *$i" ./p2.tmp`
58 RETVAL=$?
59 if test "x$RETVAL" = x0 ; then
60 matched=1
61 replace=`echo $line | $AWK '{ $1=""; $2=""; print $0 }'`
62 echo " replacing \"$i\" with: $replace"
63 new_packages="$new_packages $replace"
64 else
65 new_packages="$new_packages $i"
66 fi
67 done
68 PACKAGES=$new_packages
69 rm -f ./p[1,2].tmp
70 return $matched
71 else
72 echo "Warning: can't read package groups definition file: $PKG_GROUPS"
73 fi
74 }
75
76 # Check for broken environments (eg. cygwin, MacOSX w/HFS+) that
77 # cannot distinguish [*.F/*.F90] from [*.f/*.f90] files.
78 check_for_broken_Ff() {
79 # Do we have defaults for $FS and/or $FS90 ?
80 tfs=f
81 tfs9=f90
82 if test "x$FS" != x ; then
83 tfs="$FS"
84 fi
85 if test "x$FS90" != x ; then
86 tfs9="$FS90"
87 fi
88
89 # First check the ability to create a *.F/.f pair.
90 cat <<EOF >> genmake_hello.F
91 program hello
92 write(*,*) 'hi'
93 stop
94 end
95 EOF
96 cp genmake_hello.F "genmake_hello."$tfs > /dev/null 2>&1
97 RETVAL=$?
98 if test "x$RETVAL" != x0 ; then
99 if test "x$FS" = x ; then
100 FS='for'
101 FS90='fr9'
102 check_for_broken_Ff
103 else
104 cat <<EOF 2>&1
105 ERROR: Your file system cannot distinguish between *.F and *.f files
106 (fails the "cp" test) and this program cannot find a suitable
107 replacement extension. Please try a different build environment or
108 contact the <MITgcm-support@mitgcm.org> list for help.
109
110 EOF
111 exit -1
112 fi
113 return
114 fi
115 rm -f genmake_hello.*
116
117 # Check the ability of ${MAKE} and ${LN} to use the current set
118 # of extensions.
119 cat <<EOF >> genmake_hello.F
120 program hello
121 write(*,*) 'hi'
122 stop
123 end
124 EOF
125 test -f $MAKEFILE && mv -f $MAKEFILE $MAKEFILE".tst"
126 cat <<EOF >> $MAKEFILE
127 .SUFFIXES:
128 .SUFFIXES: .$tfs .F
129 .F.$tfs:
130 $LN \$< \$@
131 EOF
132 $MAKE "genmake_hello."$tfs > /dev/null 2>&1
133 RETVAL=$?
134 if test "x$RETVAL" != x0 -o ! -f "genmake_hello."$tfs ; then
135 if test "x$FS" = x ; then
136 FS='for'
137 FS90='fr9'
138 check_for_broken_Ff
139 else
140 cat <<EOF 2>&1
141 ERROR: Your file system cannot distinguish between *.F and *.f files
142 (fails the "make/ln" test) and this program cannot find a suitable
143 replacement extension. Please try a different build environment or
144 contact the <MITgcm-support@mitgcm.org> list for help.
145
146 EOF
147 exit -1
148 return
149 fi
150 fi
151 rm -f genmake_hello.* $MAKEFILE
152 test -f $MAKEFILE".tst" && mv -f $MAKEFILE".tst" $MAKEFILE
153
154 # If we make it here, use the extensions
155 FS=$tfs
156 FS90=$tfs9
157 return
158 }
159
160
161 look_for_makedepend() {
162
163 # The "original" makedepend is part of the Imake system that is
164 # most often distributed with XFree86 or with an XFree86 source
165 # package. As a result, many machines (eg. generic Linux) do not
166 # have a system-default "makedepend" available. For those
167 # systems, we have two fall-back options:
168 #
169 # 1) a makedepend implementation shipped with the cyrus-imapd
170 # package: ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/
171 #
172 # 2) a known-buggy xmakedpend shell script
173 #
174 # So the choices are, in order:
175 #
176 # 1) use the user-specified program
177 # 2) use a system-wide default
178 # 3) locally build and use the cyrus implementation
179 # 4) fall back to the buggy local xmakedpend script
180 #
181 if test "x${MAKEDEPEND}" = x ; then
182 which makedepend > /dev/null 2>&1
183 RV0=$?
184 test -f $MAKEFILE && mv -f $MAKEFILE $MAKEFILE".tst"
185 # echo 'MAKEFILE="'$MAKEFILE'"'
186 cat <<EOF >> $MAKEFILE
187 # THIS IS A TEST MAKEFILE GENERATED BY "genmake2"
188 #
189 # Some "makedepend" implementations will die if they cannot
190 # find a Makefile -- so this file is here to gives them an
191 # empty one to find and parse.
192 EOF
193 cat <<EOF >> genmake_tc.f
194 program test
195 write(*,*) 'test'
196 stop
197 end
198 EOF
199 makedepend genmake_tc.f > /dev/null 2>&1
200 RV1=$?
201 test -f $MAKEFILE && rm -f $MAKEFILE
202 test -f $MAKEFILE".tst" && mv -f $MAKEFILE".tst" $MAKEFILE
203 if test "x${RV0}${RV1}" = x00 ; then
204 MAKEDEPEND=makedepend
205 else
206 echo " a system-default makedepend was not found."
207
208 # Try to build the cyrus implementation
209 build_cyrus_makedepend
210 RETVAL=$?
211 if test "x$RETVAL" != x0 ; then
212 MAKEDEPEND='$(TOOLSDIR)/xmakedepend'
213 fi
214 rm -f ./genmake_cy_md
215 fi
216 else
217 # echo "MAKEDEPEND=${MAKEDEPEND}"
218 echo "${MAKEDEPEND}" | grep -i cyrus > /dev/null 2>&1
219 RETVAL=$?
220 if test x"$RETVAL" = x0 ; then
221 build_cyrus_makedepend
222 fi
223 fi
224 }
225
226
227 build_cyrus_makedepend() {
228 rm -f ./genmake_cy_md
229 (
230 cd $ROOTDIR/tools/cyrus-imapd-makedepend \
231 && ./configure > /dev/null 2>&1 \
232 && make > /dev/null 2>&1
233 if test -x ./makedepend.exe ; then
234 $LN ./makedepend.exe ./makedepend
235 fi
236 ./makedepend ifparser.c > /dev/null 2>&1 \
237 && echo "true"
238 ) > ./genmake_cy_md
239 grep true ./genmake_cy_md > /dev/null 2>&1
240 RETVAL=$?
241 rm -f ./genmake_cy_md
242 if test "x$RETVAL" = x0 ; then
243 MAKEDEPEND='$(TOOLSDIR)/cyrus-imapd-makedepend/makedepend'
244 return 0
245 else
246 echo "WARNING: unable to build cyrus-imapd-makedepend"
247 return 1
248 fi
249 }
250
251 # Guess possible config options for this host
252 find_possible_configs() {
253
254 tmp1=`uname`"_"`uname -m`
255 tmp2=`echo $tmp1 | sed -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
256 tmp3=`echo $tmp2 | sed -e 's/power macintosh/ppc/'`
257 tmp1=`echo $tmp3 | sed -e 's|x86_64|amd64|'`
258 tmp2=`echo $tmp1 | sed -e 's/i[3-6]86/ia32/' | sed -e 's/athlon/ia32/'`
259 tmp3=`echo $tmp2 | sed -e 's/cray sv1/craysv1/'`
260 PLATFORM=$tmp3
261 echo $PLATFORM | grep cygwin > /dev/null 2>&1 && PLATFORM=cygwin_ia32
262 OFLIST=`(cd $ROOTDIR/tools/build_options; ls | grep "^$PLATFORM")`
263 echo " The platform appears to be: $PLATFORM"
264
265 echo "test" > test
266 ln -s ./test link
267 RETVAL=$?
268 if test "x${RETVAL}" = x0 ; then
269 LN="ln -s"
270 else
271 echo "Error: \"ln -s\" does not appear to work on this system!"
272 echo " For help, please contact <MITgcm-support@mitgcm.org>."
273 exit 1
274 fi
275 rm -f test link
276
277 if test "x$CPP" = x ; then
278 CPP="cpp -traditional -P"
279 fi
280
281 look_for_makedepend
282
283 #================================================================
284 # look for possible C compilers
285 tmp="$MITGCM_CC $CC gcc c89 cc c99 mpicc"
286 p_CC=
287 for c in $tmp ; do
288 rm -f ./genmake_hello.c ./genmake_hello
289 cat >> genmake_hello.c << EOF
290 #include <stdio.h>
291 int main(int argc, char **argv) {
292 printf("Hello!\n");
293 return 0;
294 }
295 EOF
296 $c -o genmake_hello genmake_hello.c > /dev/null 2>&1
297 RETVAL=$?
298 if test "x${RETVAL}" = x0 ; then
299 p_CC="$p_CC $c"
300 fi
301 done
302 rm -f ./genmake_hello.c ./genmake_hello
303 if test "x${p_CC}" = x ; then
304 cat 1>&2 <<EOF
305
306 Error: No C compilers were found in your path. Please specify one using:
307
308 1) an "optfile" on (eg. "-optfile=path/to/OPTFILE"),
309 2) the CC or MITGCM_CC environment variables.
310
311 EOF
312 exit 1
313 else
314 echo " The possible C compilers found in your path are:"
315 echo " "$p_CC
316 if test "x$CC" = x ; then
317 CC=`echo $p_CC | $AWK '{print $1}'`
318 echo " Setting C compiler to: "$CC
319 fi
320 fi
321
322 #================================================================
323 # look for possible FORTRAN compilers
324 tmp="$MITGCM_FC $FC efc g77 f77 pgf77 pgf95 ifc f90 f95 mpif77 mpf77 mpxlf95 gfortran"
325 p_FC=
326 for c in $tmp ; do
327 rm -f ./hello.f ./hello
328 cat >> hello.f <<EOF
329 program hello
330 do i=1,3
331 print *, 'hello world : ', i
332 enddo
333 end
334 EOF
335 $c -o hello hello.f > /dev/null 2>&1
336 RETVAL=$?
337 if test "x${RETVAL}" = x0 ; then
338 p_FC="$p_FC $c"
339 fi
340 done
341 rm -f ./hello.f ./hello
342 if test "x${p_FC}" = x ; then
343 cat 1>&2 <<EOF
344
345 Error: No Fortran compilers were found in your path. Please specify one using:
346
347 1) an "optfile" on (eg. "-optfile=path/to/OPTFILE"),
348 2) a command-line option (eg. "-fc NAME"), or
349 3) the FC or MITGCM_FC environment variables.
350
351 EOF
352 exit 1
353 else
354 echo " The possible FORTRAN compilers found in your path are:"
355 echo " "$p_FC
356 fi
357
358 # Use the first of the compilers found in the current PATH
359 # that has a correctly-named optfile
360 if test "x$OPTFILE" = x -a "x$FC" = x ; then
361 for i in $p_FC ; do
362 OPTFILE=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$i
363 if test -r $OPTFILE ; then
364 echo " Setting OPTFILE to: "$OPTFILE
365 break
366 fi
367 done
368 fi
369
370 if test "x$OPTFILE" = x ; then
371 OPTFILE=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$FC
372 if test ! -r $OPTFILE ; then
373 echo " I looked for the file "$OPTFILE" but did not find it"
374 fi
375 fi
376 # echo " The options file: $p_OF"
377 # echo " appears to match so we'll use it."
378 # for i in $p_FC ; do
379 #p_OF=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$i
380 #if test -r $p_OF ; then
381 # OPTFILE=$p_OF
382 # echo " The options file: $p_OF"
383 # echo " appears to match so we'll use it."
384 # break
385 #fi
386 # done
387 if test "x$OPTFILE" = x ; then
388 cat 1>&2 <<EOF
389
390 Error: No options file was found in: $ROOTDIR/tools/build_options/
391 that matches this platform ("$PLATFORM") and the compilers found in
392 your path. Please specify an "optfile" using:
393
394 1) the command line (eg. "-optfile=path/to/OPTFILE"), or
395 2) the MITGCM_OF environment variable.
396
397 If you need help, please contact the developers at <MITgcm-support@mitgcm.org>.
398
399 EOF
400 exit 1
401 fi
402
403 # # look for possible MPI libraries
404 # mpi_libs=
405 # mpi_fort=`which mpif77 2>/dev/null`
406 # RETVAL=$?
407 # if test "x${RETVAL}" = x0 ; then
408 # cat >>test.f <<EOF
409 # PROGRAM HELLO
410 # DO 10, I=1,10
411 # PRINT *,'Hello World'
412 # 10 CONTINUE
413 # STOP
414 # END
415 # EOF
416 # eval "$mpi_fort -showme test.f > out"
417 # RETVAL=$?
418 # if test "x${RETVAL}" = x0 ; then
419 # a=`cat out`
420 # for i in $a ; do
421 # case $i in
422 # -*)
423 # mpi_libs="$mpi_libs $i" ;;
424 # esac
425 # done
426 # echo "The MPI libs appear to be:"
427 # echo " "$mpi_libs
428 # fi
429 # rm -f test.f out
430 # fi
431
432 }
433
434 # Parse the package dependency information
435 get_pdepend_list() {
436
437 # strip the comments and then convert the dependency file into
438 # two arrays: PNAME, DNAME
439 cat $1 | sed -e 's/#.*$//g' \
440 | $AWK 'BEGIN{nn=0;} (NF>0){ for(i=2;i<=NF;i++){nn++; print "PNAME["nn"]="$1"\nDNAME["nn"]="$i} }' \
441 > ./.pd_tmp
442 . ./.pd_tmp
443 rm -f ./.pd_tmp
444
445 printf "PNAME = "${}
446 }
447
448
449 # Explain usage
450 usage() {
451 cat <<EOF
452
453 Usage: "$0" [OPTIONS]
454 where [OPTIONS] can be:
455
456 -help | --help | -h | --h
457 Print this help message and exit.
458
459 -adoptfile NAME | --adoptfile NAME | -adof NAME | --adof NAME
460 -adoptfile=NAME | --adoptfile=NAME | -adof=NAME | --adof=NAME
461 Use "NAME" as the adoptfile. By default, the file at
462 "tools/adjoint_options/adjoint_default" will be used.
463
464 -nooptfile | --nooptfile
465 -optfile NAME | --optfile NAME | -of NAME | --of NAME
466 -optfile=NAME | --optfile=NAME | -of=NAME | --of=NAME
467 Use "NAME" as the optfile. By default, an attempt will be
468 made to find an appropriate "standard" optfile in the
469 tools/build_options/ directory.
470
471 -pdepend NAME | --pdepend NAME
472 -pdepend=NAME | --pdepend=NAME
473 Get package dependency information from "NAME".
474
475 -pdefault NAME | --pdefault NAME
476 -pdefault=NAME | --pdefault=NAME
477 Get the default package list from "NAME".
478
479 -make NAME | -m NAME
480 --make=NAME | -m=NAME
481 Use "NAME" for the MAKE program. The default is "make" but
482 many platforms, "gmake" is the preferred choice.
483
484 -makefile NAME | -mf NAME
485 --makefile=NAME | -mf=NAME
486 Call the makefile "NAME". The default is "Makefile".
487
488 -makedepend NAME | -md NAME
489 --makedepend=NAME | -md=NAME
490 Use "NAME" for the MAKEDEPEND program.
491
492 -rootdir NAME | --rootdir NAME | -rd NAME | --rd NAME
493 -rootdir=NAME | --rootdir=NAME | -rd=NAME | --rd=NAME
494 Specify the location of the MITgcm ROOTDIR as "NAME".
495 By default, genamke will try to find the location by
496 looking in parent directories (up to the 5th parent).
497
498 -mods NAME | --mods NAME | -mo NAME | --mo NAME
499 -mods=NAME | --mods=NAME | -mo=NAME | --mo=NAME
500 Here, "NAME" specifies a list of directories that are
501 used for additional source code. Files found in the
502 "mods list" are given preference over files of the same
503 name found elsewhere.
504
505 -disable NAME | --disable NAME
506 -disable=NAME | --disable=NAME
507 Here "NAME" specifies a list of packages that we don't
508 want to use. If this violates package dependencies,
509 genamke will exit with an error message.
510
511 -enable NAME | --enable NAME
512 -enable=NAME | --enable=NAME
513 Here "NAME" specifies a list of packages that we wish
514 to specifically enable. If this violates package
515 dependencies, genamke will exit with an error message.
516
517 -standarddirs NAME | --standarddirs NAME
518 -standarddirs=NAME | --standarddirs=NAME
519 Here, "NAME" specifies a list of directories to be
520 used as the "standard" code.
521
522 -fortran NAME | --fortran NAME | -fc NAME | --fc NAME
523 -fc=NAME | --fc=NAME
524 Use "NAME" as the fortran compiler. By default, genmake
525 will search for a working compiler by trying a list of
526 "usual suspects" such as g77, f77, etc.
527
528 -cc NAME | --cc NAME | -cc=NAME | --cc=NAME
529 Use "NAME" as the C compiler. By default, genmake
530 will search for a working compiler by trying a list of
531 "usual suspects" such as gcc, c89, cc, etc.
532
533 -[no]ieee | --[no]ieee
534 Do or don't use IEEE numerics. Note that this option
535 *only* works if it is supported by the OPTFILE that
536 is being used.
537
538 -ts | --ts
539 Produce timing information per timestep
540
541 -mpi | --mpi
542 Include MPI header files and link to MPI libraries
543 -mpi=PATH | --mpi=PATH
544 Include MPI header files and link to MPI libraries using MPI_ROOT
545 set to PATH. i.e. Include files from \$PATH/include, link to libraries
546 from \$PATH/lib and use binaries from \$PATH/bin.
547
548 -bash NAME
549 Explicitly specify the Bourne or BASH shell to use
550
551 While it is most often a single word, the "NAME" variables specified
552 above can in many cases be a space-delimited string such as:
553
554 --enable pkg1 --enable 'pkg1 pkg2' --enable 'pkg1 pkg2 pkg3'
555 -mods=dir1 -mods='dir1' -mods='dir1 dir2 dir3'
556 -foptim='-Mvect=cachesize:512000,transform -xtypemap=real:64,double:64,integer:32'
557
558 which, depending upon your shell, may need to be single-quoted.
559
560 For more detailed genmake documentation, please see:
561
562 http://mitgcm.org/devel_HOWTO/
563
564 EOF
565
566 exit 1
567 }
568
569 # Build a CPP macro to automate calling C routines from FORTRAN
570 get_fortran_c_namemangling() {
571
572 #echo "FC_NAMEMANGLE = \"$FC_NAMEMANGLE\""
573 if test ! "x$FC_NAMEMANGLE" = x ; then
574 return 0
575 fi
576
577 default_nm="#define FC_NAMEMANGLE(X) X ## _"
578
579 cat > genmake_test.c <<EOF
580 void tcall( char * string ) { tsub( string ); }
581 EOF
582 $MAKE genmake_test.o >> genmake_warnings 2>&1
583 RETVAL=$?
584 if test "x$RETVAL" != x0 ; then
585 FC_NAMEMANGLE=$default_nm
586 cat <<EOF>> genmake_errors
587
588 WARNING: C test compile fails
589 WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
590 WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here
591 EOF
592 return 1
593 fi
594 c_tcall=`nm genmake_test.o 2>/dev/null | grep 'T ' | grep tcall | cut -d ' ' -f 3`
595 RETVAL=$?
596 if test "x$RETVAL" != x0 ; then
597 FC_NAMEMANGLE=$default_nm
598 cat <<EOF>> genmake_warnings
599
600 WARNING: The "nm" command failed.
601 WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
602 WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here
603 EOF
604 return 1
605 fi
606 cat > genmake_tcomp.$FS <<EOF
607 subroutine tcall( string )
608 character*(*) string
609 call tsub( string )
610 end
611 EOF
612 $FC $FFLAGS -c genmake_tcomp.$FS >> genmake_warnings 2>&1
613 RETVAL=$?
614 if test "x$RETVAL" != x0 ; then
615 FC_NAMEMANGLE=$default_nm
616 cat <<EOF>> genmake_warnings
617
618 WARNING: FORTRAN test compile fails -- please see "genmake_errors"
619 WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
620 WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here.
621 EOF
622 return 1
623 fi
624 f_tcall=`nm genmake_tcomp.o 2>/dev/null | grep 'T ' | grep tcall | cut -d ' ' -f 3`
625 RETVAL=$?
626 if test "x$RETVAL" != x0 ; then
627 FC_NAMEMANGLE=$default_nm
628 cat <<EOF>> genmake_warnings
629
630 WARNING: The "nm" command failed.
631 WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
632 WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here.
633 EOF
634 return 1
635 fi
636
637 c_a=`echo $c_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 1 | sed -e 's|Y||'`
638 f_a=`echo $f_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 1 | sed -e 's|Y||'`
639 c_b=`echo $c_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 2 | sed -e 's|Y||'`
640 f_b=`echo $f_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 2 | sed -e 's|Y||'`
641
642 nmangle="X"
643 if test "x$c_a" != "x$f_a" ; then
644 comm="echo x$f_a | sed -e 's|x$c_a||'"
645 a=`eval $comm`
646 nmangle="$a ## $nmangle"
647 fi
648 if test "x$c_b" != "x$f_b" ; then
649 comm="echo x$f_b | sed -e 's|x$c_b||'"
650 b=`eval $comm`
651 nmangle="$nmangle ## $b"
652 fi
653
654 FC_NAMEMANGLE="#define FC_NAMEMANGLE(X) $nmangle"
655
656 # cleanup the testing files
657 rm -f genmake_tcomp.* genmake_test.*
658 }
659
660
661 check_HAVE_CLOC() {
662 get_fortran_c_namemangling
663 cat <<EOF > genmake_tc_1.c
664 $FC_NAMEMANGLE
665 #include <stdio.h>
666 #include <stdlib.h>
667 #include <unistd.h>
668 #include <assert.h>
669 #include <sys/time.h>
670 void FC_NAMEMANGLE(cloc) ( double *curtim )
671 {
672 struct timeval tv1;
673 gettimeofday(&tv1 , (void *)NULL );
674 *curtim = (double)((tv1.tv_usec)+(tv1.tv_sec)*1.E6);
675 *curtim = *curtim/1.E6;
676 }
677 EOF
678 make genmake_tc_1.o >> genmake_warnings 2>&1
679 RET_C=$?
680 cat <<EOF > genmake_tc_2.$FS
681 program hello
682 REAL*8 wtime
683 external cloc
684 call cloc(wtime)
685 print *," HELLO WORLD", wtime
686 end
687 EOF
688 $FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o >> genmake_warnings 2>&1
689 RET_F=$?
690 test -x ./genmake_tc && ./genmake_tc >> genmake_warnings 2>&1
691 RETVAL=$?
692 if test "x$RETVAL" = x0 ; then
693 HAVE_CLOC=t
694 DEFINES="$DEFINES -DHAVE_CLOC"
695 fi
696 rm -f genmake_tc*
697 }
698
699
700 check_HAVE_SIGREG() {
701 get_fortran_c_namemangling
702 cat <<EOF > genmake_tc_1.c
703 $FC_NAMEMANGLE
704 #include <stdlib.h>
705 #include <stdio.h>
706 #include <signal.h>
707 #include <errno.h>
708 #include <ucontext.h>
709
710 int * ip;
711
712 static void killhandler(
713 unsigned int sn, siginfo_t si, struct ucontext *sc )
714 {
715 *ip = *ip + 1;
716 return;
717 }
718
719 void FC_NAMEMANGLE(sigreg) (int * aip)
720 {
721 struct sigaction s;
722 ip = aip;
723 s.sa_flags = SA_SIGINFO;
724 s.sa_sigaction = (void *)killhandler;
725 if(sigaction (SIGTERM,&s,(struct sigaction *)NULL)) {
726 printf("Sigaction returned error = %d\n", errno);
727 exit(0);
728 }
729 return;
730 }
731 EOF
732 make genmake_tc_1.o >> genmake_warnings 2>&1
733 RET_C=$?
734 cat <<EOF > genmake_tc_2.$FS
735 program hello
736 integer anint
737 common /iv/ anint
738 external sigreg
739 call sigreg(anint)
740 end
741 EOF
742 echo >> genmake_warnings
743 echo "running: check_HAVE_SIGREG()" >> genmake_warnings
744 cat genmake_tc_2.$FS >> genmake_warnings
745 COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
746 echo $COMM >> genmake_warnings
747 $COMM >> genmake_warnings 2>&1
748 RETVAL=$?
749 if test "x$RETVAL" = x0 ; then
750 HAVE_SIGREG=t
751 DEFINES="$DEFINES -DHAVE_SIGREG"
752 fi
753 rm -f genmake_tc*
754 }
755
756
757 check_HAVE_SETRLSTK() {
758 get_fortran_c_namemangling
759 cat <<EOF > genmake_tc_1.c
760 $FC_NAMEMANGLE
761 #include <sys/time.h>
762 #include <sys/resource.h>
763 #include <unistd.h>
764 void FC_NAMEMANGLE(setrlstk) ()
765 {
766 struct rlimit rls;
767 rls.rlim_cur = RLIM_INFINITY;
768 rls.rlim_max = RLIM_INFINITY;
769 setrlimit(RLIMIT_STACK, &rls);
770 return;
771 }
772 EOF
773 make genmake_tc_1.o >> genmake_warnings 2>&1
774 RET_C=$?
775 cat <<EOF > genmake_tc_2.$FS
776 program hello
777 external setrlstk
778 call setrlstk()
779 end
780 EOF
781 echo >> genmake_warnings
782 echo "running: check_HAVE_SETRLSTK()" >> genmake_warnings
783 cat genmake_tc_2.$FS >> genmake_warnings
784 COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
785 echo $COMM >> genmake_warnings
786 $COMM >> genmake_warnings 2>&1
787 RETVAL=$?
788 if test "x$RETVAL" = x0 ; then
789 HAVE_SETRLSTK=t
790 DEFINES="$DEFINES -DHAVE_SETRLSTK"
791 fi
792 rm -f genmake_tc*
793 }
794
795
796 check_HAVE_STAT() {
797 get_fortran_c_namemangling
798 cat <<EOF > genmake_tc_1.c
799 $FC_NAMEMANGLE
800 #include <stdio.h>
801 #include <stdlib.h>
802 #include <unistd.h>
803 #include <sys/stat.h>
804 #include <sys/types.h>
805 void FC_NAMEMANGLE(tfsize) ( int *nbyte )
806 {
807 char name[512];
808 struct stat astat;
809
810 name[0] = 'a'; name[1] = '\0';
811 if (! stat(name, &astat))
812 *nbyte = (int)(astat.st_size);
813 else
814 *nbyte = -1;
815 }
816 EOF
817 make genmake_tc_1.o >> genmake_tc.log 2>&1
818 RET_C=$?
819 cat <<EOF > genmake_tc_2.$FS
820 program hello
821 integer nbyte
822 call tfsize(nbyte)
823 print *," HELLO WORLD", nbyte
824 end
825 EOF
826 echo >> genmake_warnings
827 echo "running: check_HAVE_STAT()" >> genmake_warnings
828 cat genmake_tc_2.$FS >> genmake_warnings
829 COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
830 echo $COMM >> genmake_warnings
831 $COMM >> genmake_tc.log 2>&1
832 RETVAL=$?
833 if test "x$RETVAL" = x0 ; then
834 HAVE_STAT=t
835 DEFINES="$DEFINES -DHAVE_STAT"
836 fi
837 rm -f genmake_tc*
838 }
839
840
841 check_netcdf_libs() {
842 if test ! "x$SKIP_NETCDF_CHECK" = x ; then
843 return
844 fi
845 echo >> genmake_warnings
846 echo "running: check_netcdf_libs()" >> genmake_warnings
847 cat <<EOF > genmake_tnc.F
848 program fgennc
849 #include "netcdf.inc"
850 EOF
851 if test ! "x$MPI" = x ; then
852 echo '#include "mpif.h"' >> genmake_tnc.F
853 fi
854 cat <<EOF >> genmake_tnc.F
855 integer iret, ncid, xid
856 iret = nf_create('genmake_tnc.nc', NF_CLOBBER, ncid)
857 IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
858 iret = nf_def_dim(ncid, 'X', 11, xid)
859 IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
860 iret = nf_close(ncid)
861 IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
862 end
863 EOF
864 echo "=== genmake_tnc.F ===" > genmake_tnc.log
865 cat genmake_tnc.F >> genmake_tnc.log
866 echo "=== genmake_tnc.F ===" >> genmake_tnc.log
867 RET_CPP=f
868 COMM="$CPP $DEFINES $INCLUDES genmake_tnc.F"
869 echo "$COMM" >> genmake_tnc.log
870 $COMM > genmake_tnc.$FS 2>/dev/null && RET_CPP=t
871 if test "x$RET_CPP" = xf ; then
872 echo " WARNING: CPP failed to pre-process the netcdf test." \
873 >> genmake_tnc.log
874 echo " Please check that \$INCLUDES is properly set." \
875 >> genmake_tnc.log
876 fi
877 echo "$FC $FFLAGS $FOPTIM -c genmake_tnc.$FS \ " >> genmake_tnc.log
878 echo " && $LINK -o genmake_tnc.o $LIBS" >> genmake_tnc.log
879 $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1 \
880 && $LINK -o genmake_tnc genmake_tnc.o $LIBS >> genmake_tnc.log 2>&1
881 RET_COMPILE=$?
882 cat genmake_tnc.log >> genmake_warnings
883
884 #EH3 Remove test program execution for machines that either disallow
885 #EH3 execution or cannot support it (eg. cross-compilers)
886 #EH3
887 #EH3 test -x ./genmake_tnc && ./genmake_tnc >> genmake_tnc.log 2>&1
888 #EH3 RETVAL=$?
889 #EH3 if test "x$RET_COMPILE" = x0 -a "x$RETVAL" = x0 ; then
890
891 if test "x$RET_COMPILE" = x0 ; then
892 HAVE_NETCDF=t
893 else
894 # try again with "-lnetcdf" added to the libs
895 echo "try again with added '-lnetcdf'" > genmake_tnc.log
896 echo "$CPP $DEFINES $INCLUDES genmake_tnc.F > genmake_tnc.$FS \ " >> genmake_tnc.log
897 echo " && $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS \ " >> genmake_tnc.log
898 echo " && $LINK -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf" >> genmake_tnc.log
899 $CPP $DEFINES $INCLUDES genmake_tnc.F > genmake_tnc.$FS 2>/dev/null \
900 && $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1 \
901 && $LINK -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf >> genmake_tnc.log 2>&1
902 RET_COMPILE=$?
903 cat genmake_tnc.log >> genmake_warnings
904 if test "x$RET_COMPILE" = x0 ; then
905 LIBS="$LIBS -lnetcdf"
906 HAVE_NETCDF=t
907 fi
908 fi
909 rm -f genmake_tnc*
910 }
911
912
913
914 ###############################################################################
915 # Sequential part of script starts here
916 ###############################################################################
917
918 # Set defaults here
919 COMMANDL="$0 $@"
920
921 PLATFORM=
922 LN=
923 S64=
924 KPP=
925 #FC=
926 #CC=gcc
927 #CPP=
928 LINK=
929 DEFINES=
930 PACKAGES=
931 ENABLE=
932 DISABLE=
933 # MAKEFILE=
934 # MAKEDEPEND=
935 PDEPEND=
936 DUMPSTATE=t
937 PDEFAULT=
938 OPTFILE=
939 INCLUDES="-I. $INCLUDES"
940 FFLAGS=
941 FOPTIM=
942 CFLAGS=
943 KFLAGS1=
944 KFLAGS2=
945 #LDADD=
946 LIBS=
947 KPPFILES=
948 NOOPTFILES=
949 NOOPTFLAGS=
950 MPI=
951 MPIPATH=
952 TS=
953 HAVE_TEST_L=
954
955 # DEFINES checked by test compilation or command-line
956 HAVE_SYSTEM=
957 HAVE_FDATE=
958 FC_NAMEMANGLE=
959 HAVE_CLOC=
960 HAVE_SETRLSTK=
961 HAVE_STAT=
962 HAVE_NETCDF=
963 HAVE_ETIME=
964 IGNORE_TIME=
965
966 MODS=
967 TOOLSDIR=
968 SOURCEDIRS=
969 INCLUDEDIRS=
970 STANDARDDIRS="USE_THE_DEFAULT"
971
972 G2ARGS=
973 BASH=
974 PWD=`pwd`
975 test "x$MAKE" = x && MAKE=make
976 test "x$AWK" = x && AWK=awk
977 THISHOST=`hostname`
978 THISCWD=`pwd`
979 THISDATE=`date`
980 THISUSER=`echo $USER`
981 THISVER=
982 MACHINE=`uname -a`
983 EXECUTABLE=
984 EXEHOOK=
985 EXEDIR=
986 PACKAGES_CONF=
987 IEEE=
988 if test "x$MITGCM_IEEE" != x ; then
989 IEEE=$MITGCM_IEEE
990 fi
991 FS=
992 FS90=
993
994 AUTODIFF_PKG_USED=f
995 AD_OPTFILE=
996 TAF=
997 AD_TAF_FLAGS=
998 FTL_TAF_FLAGS=
999 SVD_TAF_FLAGS=
1000 TAF_EXTRA=
1001 TAMC=
1002 AD_TAMC_FLAGS=
1003 FTL_TAF_FLAGS=
1004 SVD_TAMC_FLAGS=
1005 TAMC_EXTRA=
1006
1007
1008 # The following state can be set directly by command-line switches
1009 gm_s1="OPTFILE PDEPEND PDEFAULT MAKEFILE PLATFORM ROOTDIR MODS DISABLE ENABLE"
1010 gm_s2="FC CPP IEEE TS MPI JAM DUMPSTATE STANDARDDIRS"
1011
1012 # The following state is not directly set by command-line switches
1013 gm_s3="LN S64 KPP LINK PACKAGES MAKEDEPEND PDEPEND PDEFAULT INCLUDES FFLAGS FOPTIM "
1014 gm_s4="CFLAGS KFLAGS1 KFLAGS2 LIBS KPPFILES NOOPTFILES NOOPTFLAGS"
1015 gm_s5="TOOLSDIR SOURCEDIRS INCLUDEDIRS PWD MAKE THISHOST THISUSER THISDATE THISVER MACHINE"
1016 gm_s6="EXECUTABLE EXEHOOK EXEDIR PACKAGES_CONF"
1017 gm_s7="HAVE_SYSTEM HAVE_FDATE FC_NAMEMANGLE HAVE_ETIME"
1018
1019 # The following are all related to adjoint/tangent-linear stuff
1020 gm_s10="AUTODIFF_PKG_USED AD_OPTFILE TAMC TAF AD_TAMC_FLAGS AD_TAF_FLAGS"
1021 gm_s11="FTL_TAMC_FLAGS FTL_TAF_FLAGS SVD_TAMC_FLAGS SVD_TAF_FLAGS"
1022 gm_s12="TAF_EXTRA TAMC_EXTRA"
1023
1024 gm_state="COMMANDL $gm_s1 $gm_s2 $gm_s3 $gm_s4 $gm_s5 $gm_s6 $gm_s7"
1025 gm_state="$gm_state $gm_s10 $gm_s11 $gm_s12"
1026
1027 cat <<EOF
1028
1029 GENMAKE :
1030
1031 A program for GENerating MAKEfiles for the MITgcm project. For a
1032 quick list of options, use "genmake -h" or for more detail see:
1033
1034 http://mitgcm.org/devel_HOWTO/
1035
1036 EOF
1037
1038 echo "=== Processing options files and arguments ==="
1039 gm_local="genmake_local"
1040 for i in . $MODS ; do
1041 if test -r $i/$gm_local ; then
1042 . $i/$gm_local
1043 break
1044 fi
1045 done
1046 printf " getting local config information: "
1047 if test -f $gm_local ; then
1048 echo "using $gm_local"
1049 . $gm_local
1050 # echo "DISABLE=$DISABLE"
1051 # echo "ENABLE=$ENABLE"
1052 else
1053 echo "none found"
1054 fi
1055
1056 #echo "$0::$1:$2:$3:$4:$5:$6:$7:"
1057 #OPTIONS=
1058 #n=0
1059 #for i ; do
1060 # echo "$i $n"
1061 # setvar="OPTIONS[$n]='$i'"
1062 # # echo " $setvar"
1063 # eval "$setvar"
1064 # n=$(( $n + 1 ))
1065 #done
1066 #parse_options
1067 ac_prev=
1068 for ac_option in "$@" ; do
1069
1070 G2ARGS="$G2ARGS \"$ac_option\""
1071
1072 # If the previous option needs an argument, assign it.
1073 if test -n "$ac_prev"; then
1074 eval "$ac_prev=\$ac_option"
1075 ac_prev=
1076 continue
1077 fi
1078
1079 ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
1080
1081 case $ac_option in
1082
1083 -help | --help | -h | --h)
1084 usage ;;
1085
1086 -nooptfile | --nooptfile)
1087 OPTFILE="NONE" ;;
1088 -optfile | --optfile | -of | --of)
1089 ac_prev=OPTFILE ;;
1090 -optfile=* | --optfile=* | -of=* | --of=*)
1091 OPTFILE=$ac_optarg ;;
1092
1093 -adoptfile | --adoptfile | -adof | --adof)
1094 ac_prev=AD_OPTFILE ;;
1095 -adoptfile=* | --adoptfile=* | -adof=* | --adof=*)
1096 AD_OPTFILE=$ac_optarg ;;
1097
1098 -pdepend | --pdepend)
1099 ac_prev=PDEPEND ;;
1100 -pdepend=* | --pdepend=*)
1101 PDEPEND=$ac_optarg ;;
1102
1103 -pdefault | --pdefault)
1104 ac_prev=PDEFAULT ;;
1105 -pdefault=* | --pdefault=*)
1106 PDEFAULT=$ac_optarg ;;
1107
1108 -make | --make | -m | --m)
1109 ac_prev=MAKE ;;
1110 -make=* | --make=* | -m=* | --m=*)
1111 MAKE=$ac_optarg ;;
1112
1113 -bash | --bash)
1114 ac_prev=BASH ;;
1115 -bash=* | --bash=*)
1116 BASH=$ac_optarg ;;
1117
1118 -makedepend | --makedepend | -md | --md)
1119 ac_prev=MAKEDEPEND ;;
1120 -makedepend=* | --makedepend=* | -md=* | --md=*)
1121 MAKEDEPEND=$ac_optarg ;;
1122
1123 -makefile | --makefile | -ma | --ma)
1124 ac_prev=MAKEFILE ;;
1125 -makefile=* | --makefile=* | -ma=* | --ma=*)
1126 MAKEFILE=$ac_optarg ;;
1127
1128 -platform | --platform | -pl | --pl | -platform=* | --platform=* | -pl=* | --pl=*)
1129 echo "ERROR: The platform option has been removed. Please specify"
1130 echo " the build options using the \"optfile\" mechanism."
1131 echo
1132 usage
1133 ;;
1134
1135 -rootdir | --rootdir | -rd | --rd)
1136 ac_prev=ROOTDIR ;;
1137 -rootdir=* | --rootdir=* | -rd=* | --rd=*)
1138 ROOTDIR=$ac_optarg ;;
1139
1140 -mods | --mods | -mo | --mo)
1141 ac_prev=MODS ;;
1142 -mods=* | --mods=* | -mo=* | --mo=*)
1143 MODS=$ac_optarg ;;
1144
1145 -disable | --disable)
1146 ac_prev=DISABLE ;;
1147 -disable=* | --disable=*)
1148 DISABLE=$ac_optarg ;;
1149
1150 -enable | --enable)
1151 ac_prev=ENABLE ;;
1152 -enable=* | --enable=*)
1153 ENABLE=$ac_optarg ;;
1154
1155 -standarddirs | --standarddirs)
1156 ac_prev=STANDARDDIRS ;;
1157 -standarddirs=* | --standarddirs=*)
1158 STANDARDDIRS=$ac_optarg ;;
1159
1160 # -cpp | --cpp)
1161 # ac_prev=cpp ;;
1162 # -cpp=* | --cpp=*)
1163 # CPP=$ac_optarg ;;
1164
1165 -cc | --cc)
1166 ac_prev=CC ;;
1167 -cc=* | --cc=*)
1168 CC=$ac_optarg ;;
1169
1170 -fortran | --fortran | -fc | --fc)
1171 ac_prev=FC ;;
1172 -fc=* | --fc=*)
1173 FC=$ac_optarg ;;
1174
1175 -fs | --fs)
1176 ac_prev=FS ;;
1177 -fs=* | --fs=*)
1178 FS=$ac_optarg ;;
1179
1180 -fs90 | --fs90)
1181 ac_prev=FS90 ;;
1182 -fs90=* | --fs90=*)
1183 FS90=$ac_optarg ;;
1184
1185 -ieee | --ieee)
1186 IEEE=true ;;
1187 -noieee | --noieee)
1188 IEEE= ;;
1189
1190 -ts | --ts)
1191 TS=true ;;
1192
1193 -mpi | --mpi)
1194 MPI=true ;;
1195 -mpi=* | --mpi=*)
1196 MPIPATH=$ac_optarg
1197 MPI=true ;;
1198
1199 # -jam | --jam)
1200 # JAM=1 ;;
1201 # -nojam | --nojam)
1202 # JAM=0 ;;
1203
1204 -ds | --ds)
1205 DUMPSTATE=t ;;
1206
1207 -taf_extra | --taf_extra)
1208 ac_prev=TAF_EXTRA ;;
1209 -taf_extra=* | --taf_extra=*)
1210 TAF_EXTRA=$ac_optarg ;;
1211
1212 -tamc_extra | --tamc_extra)
1213 ac_prev=TAMC_EXTRA ;;
1214 -tamc_extra=* | --tamc_extra=*)
1215 TAMC_EXTRA=$ac_optarg ;;
1216
1217 -ignoretime | -ignore_time | --ignoretime | --ignore_time)
1218 IGNORE_TIME="-DIGNORE_TIME" ;;
1219
1220 -*)
1221 echo "Error: unrecognized option: "$ac_option
1222 usage
1223 ;;
1224
1225 *)
1226 echo "Error: unrecognized argument: "$ac_option
1227 usage
1228 ;;
1229
1230 esac
1231
1232 done
1233
1234
1235 if test -f ./.genmakerc ; then
1236 echo
1237 echo "WARNING: genmake2 has detected a copy of the old-style \"./.genmakerc\""
1238 echo " file. This file format is no longer supported. Please see:"
1239 echo
1240 echo " http://mitgcm.org/devel_HOWTO/"
1241 echo
1242 echo " for directions on how to setup and use the new \"genmake2\" input"
1243 echo " files and send an email to MITgcm-support@mitgcm.org if you want help."
1244 echo
1245 fi
1246
1247 # Find the MITgcm ${ROOTDIR}
1248 if test "x${ROOTDIR}" = x ; then
1249 tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1250 if test "x$tmp" = "xbin" -a -d ../model -a -d ../eesup -a -d ../pkg ; then
1251 ROOTDIR=".."
1252 else
1253 for d in . .. ../.. ../../.. ../../../.. ../../../../.. ; do
1254 if [ -d "$d/model" -a -d "$d/eesupp" -a -d "$d/pkg" ]; then
1255 ROOTDIR=$d
1256 printf "Warning: ROOTDIR was not specified but there appears to be"
1257 echo " a copy of MITgcm at \"$ROOTDIR\" so we'll try it."
1258 break
1259 fi
1260 done
1261 fi
1262 fi
1263 if test "x${ROOTDIR}" = x ; then
1264 echo "Error: Cannot determine ROOTDIR for MITgcm code."
1265 echo " Please specify a ROOTDIR using either an options "
1266 echo " file or a command-line option."
1267 exit 1
1268 fi
1269 if test ! -d ${ROOTDIR} ; then
1270 echo "Error: the specified ROOTDIR (\"$ROOTDIR\") does not exist!"
1271 exit 1
1272 fi
1273
1274 # Find the MITgcm ${THISVER}
1275 if test -f "${ROOTDIR}/doc/tag-index" ; then
1276 THISVER=`grep '^checkpoint' ${ROOTDIR}/doc/tag-index | head -1`
1277 fi
1278
1279 if test "x$MAKEFILE" = x ; then
1280 MAKEFILE="Makefile"
1281 fi
1282
1283 echo " getting OPTFILE information: "
1284 if test "x${OPTFILE}" = x ; then
1285 if test "x$MITGCM_OF" = x ; then
1286 echo "Warning: no OPTFILE specified so we'll look for possible settings"
1287 printf "\n=== Searching for possible settings for OPTFILE ===\n"
1288 find_possible_configs
1289 else
1290 OPTFILE=$MITGCM_OF
1291 fi
1292 fi
1293 if test "x$OPTFILE" != xNONE ; then
1294 if test -f "$OPTFILE" -a -r "$OPTFILE" ; then
1295 echo " using OPTFILE=\"$OPTFILE\""
1296 . "$OPTFILE"
1297 RETVAL=$?
1298 if test "x$RETVAL" != x0 ; then
1299 printf "Error: failed to source OPTFILE \"$OPTFILE\""
1300 echo "--please check that variable syntax is bash-compatible"
1301 exit 1
1302 fi
1303 if test "x$DUMPSTATE" != xf ; then
1304 cp -f $OPTFILE "genmake_optfile"
1305 fi
1306 else
1307 echo "Error: can't read OPTFILE=\"$OPTFILE\""
1308 exit 1
1309 fi
1310 fi
1311
1312 echo " getting AD_OPTFILE information: "
1313 if test "x${AD_OPTFILE}" = x ; then
1314 if test "x$MITGCM_AD_OF" = x ; then
1315 AD_OPTFILE=$ROOTDIR/tools/adjoint_options/adjoint_default
1316 else
1317 AD_OPTFILE=$MITGCM_AD_OF
1318 fi
1319 fi
1320 if test "x${AD_OPTFILE}" != xNONE ; then
1321 if test -f "$AD_OPTFILE" -a -r "$AD_OPTFILE" ; then
1322 echo " using AD_OPTFILE=\"$AD_OPTFILE\""
1323 . "$AD_OPTFILE"
1324 RETVAL=$?
1325 if test "x$RETVAL" != x0 ; then
1326 printf "Error: failed to source AD_OPTFILE \"$AD_OPTFILE\""
1327 echo "--please check that variable syntax is bash-compatible"
1328 exit 1
1329 fi
1330 if test "x$DUMPSTATE" != xf ; then
1331 cp -f $AD_OPTFILE "genmake_ad_optfile"
1332 fi
1333 else
1334 echo "Error: can't read AD_OPTFILE=\"$AD_OPTFILE\""
1335 exit 1
1336 fi
1337 fi
1338
1339 #====================================================================
1340 # Set default values if not set by the optfile
1341 #
1342 # Check that FC, CC, LINK, CPP, S64, LN, and MAKE are defined. If not,
1343 # either set defaults or complain and abort!
1344 if test ! "x$BASH" = x ; then
1345 # add a trailing space so that it works within the Makefile syntax (see below)
1346 BASH="$BASH "
1347 fi
1348 if test "x$FC" = x ; then
1349 cat <<EOF 1>&2
1350
1351 Error: no Fortran compiler: please specify using one of the following:
1352 1) within the options file ("FC=...") as specified by "-of=OPTFILE"
1353 2) the "-fc=XXX" command-line option
1354 3) the "./genmake_local" file
1355 EOF
1356 exit 1
1357 fi
1358 if test "x$CC" = x ; then
1359 CC=cc
1360 # cat <<EOF 1>&2
1361 # Error: no C compiler: please specify using one of the following:
1362 # 1) within the options file ("CC=...") as specified by "-of=OPTFILE"
1363 # 2) the "-cc=XXX" command-line option
1364 # 3) the "./genmake_local" file
1365 # EOF
1366 # exit 1
1367 fi
1368 if test "x$LINK" = x ; then
1369 LINK=$FC
1370 fi
1371 if test "x$MAKE" = x ; then
1372 MAKE="make"
1373 fi
1374 if test "x$CPP" = x ; then
1375 CPP=cpp
1376 fi
1377 #EH3 === UGLY ===
1378 # The following is an ugly little hack to check for $CPP in /lib/ and
1379 # it should eventually be replaced with a more general function that
1380 # searches a combo of the user's path and a list of "usual suspects"
1381 # to find the correct location for binaries such as $CPP.
1382 for i in " " "/lib/" ; do
1383 echo "#define A a" | $i$CPP > test_cpp 2>&1 && CPP=$i$CPP
1384 done
1385 #EH3 === UGLY ===
1386 echo "#define A a" | $CPP > test_cpp 2>&1
1387 RETVAL=$?
1388 if test "x$RETVAL" != x0 ; then
1389 cat <<EOF 1>&2
1390
1391 Error: C pre-processor "$CPP" failed the test case: please specify using:
1392
1393 1) within the options file ("CPP=...") as specified by "-of=OPTFILE"
1394 2) the "./genmake_local" file
1395 3) with the CPP environment variable
1396
1397 EOF
1398 exit 1
1399 else
1400 rm -f test_cpp
1401 fi
1402 look_for_makedepend
1403 if test "x$LN" = x ; then
1404 LN="ln -s"
1405 fi
1406 echo "test" > genmake_test_ln
1407 $LN genmake_test_ln genmake_tlink
1408 RETVAL=$?
1409 if test "x$RETVAL" != x0 ; then
1410 cat <<EOF 1>&2
1411
1412 Error: The command "ln -s" failed -- please specify a working soft-link
1413 command in the optfile.
1414
1415 EOF
1416 exit 1
1417 fi
1418 test -L genmake_tlink > /dev/null 2>&1
1419 RETVAL=$?
1420 if test "x$RETVAL" = x0 ; then
1421 HAVE_TEST_L=t
1422 fi
1423 rm -f genmake_test_ln genmake_tlink
1424
1425 # Check for broken *.F/*.f handling and fix if possible
1426 check_for_broken_Ff
1427
1428 if test ! "x$MPI" = x ; then
1429 echo " Turning on MPI cpp macros"
1430 DEFINES="$DEFINES -DALLOW_USE_MPI -DALWAYS_USE_MPI"
1431 fi
1432
1433 if test ! "x$TS" = x ; then
1434 echo " Turning on timing per timestep"
1435 DEFINES="$DEFINES -DTIME_PER_TIMESTEP"
1436 fi
1437
1438 printf "\n=== Checking system libraries ===\n"
1439 printf " Do we have the system() command using $FC... "
1440 cat > genmake_tcomp.$FS <<EOF
1441 program hello
1442 call system('echo hi')
1443 end
1444 EOF
1445 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1446 RETVAL=$?
1447 if test "x$RETVAL" = x0 ; then
1448 HAVE_SYSTEM=t
1449 DEFINES="$DEFINES -DHAVE_SYSTEM"
1450 echo "yes"
1451 else
1452 HAVE_SYSTEM=
1453 echo "no"
1454 fi
1455 rm -f genmake_tcomp*
1456
1457 printf " Do we have the fdate() command using $FC... "
1458 cat > genmake_tcomp.$FS <<EOF
1459 program hello
1460 CHARACTER*(128) string
1461 string = ' '
1462 call fdate( string )
1463 print *, string
1464 end
1465 EOF
1466 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1467 RETVAL=$?
1468 if test "x$RETVAL" = x0 ; then
1469 HAVE_FDATE=t
1470 DEFINES="$DEFINES -DHAVE_FDATE"
1471 echo "yes"
1472 else
1473 HAVE_FDATE=
1474 echo "no"
1475 fi
1476 rm -f genmake_tcomp*
1477
1478 printf " Do we have the etime() command using $FC... "
1479 cat > genmake_tcomp.$FS <<EOF
1480 program hello
1481 REAL*4 ACTUAL, TARRAY(2)
1482 EXTERNAL ETIME
1483 REAL*4 ETIME
1484 actual = etime( tarray )
1485 print *, tarray
1486 end
1487 EOF
1488 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1489 RETVAL=$?
1490 if test "x$RETVAL" = x0 ; then
1491 HAVE_ETIME=t
1492 DEFINES="$DEFINES -DHAVE_ETIME"
1493 echo "yes"
1494 else
1495 HAVE_ETIME=
1496 echo "no"
1497 fi
1498 rm -f genmake_tcomp*
1499
1500 printf " Can we call simple C routines (here, \"cloc()\") using $FC... "
1501 check_HAVE_CLOC
1502 if test "x$HAVE_CLOC" != x ; then
1503 echo "yes"
1504 else
1505 echo "no"
1506 fi
1507 rm -f genmake_t*
1508
1509 printf " Can we unlimit the stack size using $FC... "
1510 check_HAVE_SETRLSTK
1511 if test "x$HAVE_SETRLSTK" != x ; then
1512 echo "yes"
1513 else
1514 echo "no"
1515 fi
1516 rm -f genmake_t*
1517
1518 printf " Can we register a signal handler using $FC... "
1519 check_HAVE_SIGREG
1520 if test "x$HAVE_SIGREG" != x ; then
1521 echo "yes"
1522 else
1523 echo "no"
1524 fi
1525 rm -f genmake_t*
1526
1527 printf " Can we use stat() through C calls... "
1528 check_HAVE_STAT
1529 if test "x$HAVE_STAT" != x ; then
1530 echo "yes"
1531 else
1532 echo "no"
1533 fi
1534 rm -f genmake_t*
1535
1536 printf " Can we create NetCDF-enabled binaries... "
1537 check_netcdf_libs
1538 if test "x$HAVE_NETCDF" != x ; then
1539 echo "yes"
1540 else
1541 echo "no"
1542 fi
1543 DEFINES="$DEFINES $IGNORE_TIME"
1544
1545 printf "\n=== Setting defaults ===\n"
1546 printf " Adding MODS directories: "
1547 for d in $MODS ; do
1548 if test ! -d $d ; then
1549 echo
1550 echo "Error: MODS directory \"$d\" not found!"
1551 exit 1
1552 else
1553 printf " $d"
1554 SOURCEDIRS="$SOURCEDIRS $d"
1555 INCLUDEDIRS="$INCLUDEDIRS $d"
1556 fi
1557 done
1558 echo
1559
1560 if test "x${PLATFORM}" = x ; then
1561 PLATFORM=$p_PLATFORM
1562 fi
1563
1564 if test "x${EXEDIR}" = x ; then
1565 tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1566 if test "x$tmp" = "xbin" -a -d ../exe -a $ROOTDIR = .. ; then
1567 EXEDIR=../exe
1568 else
1569 EXEDIR=.
1570 fi
1571 fi
1572 if test ! -d ${EXEDIR} ; then
1573 echo "Error: the specified EXEDIR (\"$EXEDIR\") does not exist!"
1574 exit 1
1575 fi
1576
1577 if test "x${TOOLSDIR}" = x ; then
1578 TOOLSDIR="$ROOTDIR/tools"
1579 fi
1580 if test ! -d ${TOOLSDIR} ; then
1581 echo "Error: the specified TOOLSDIR (\"$TOOLSDIR\") does not exist!"
1582 exit 1
1583 fi
1584 if test "x$S64" = x ; then
1585 echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.sh > /dev/null 2>&1
1586 RETVAL=$?
1587 if test "x${RETVAL}" = x0 ; then
1588 S64='$(TOOLSDIR)/set64bitConst.sh'
1589 else
1590 echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.csh > /dev/null 2>&1
1591 RETVAL=$?
1592 if test "x${RETVAL}" = x0 ; then
1593 S64='$(TOOLSDIR)/set64bitConst.csh'
1594 else
1595 cat <<EOF
1596
1597 ERROR: neither of the two default scripts:
1598
1599 ${TOOLSDIR}/set64bitConst.sh
1600 ${TOOLSDIR}/set64bitConst.csh
1601
1602 are working so please check paths or specify (with \$S64) a
1603 working version of this script.
1604
1605 EOF
1606 exit 1
1607 fi
1608 fi
1609 fi
1610 THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`
1611
1612 EXECUTABLE=${EXECUTABLE:-mitgcmuv}
1613
1614 # We have a special set of source files in eesupp/src which are
1615 # generated from some template source files. We'll make them first so
1616 # they appear as regular source code
1617 if test -r $ROOTDIR"/eesupp/src/Makefile" ; then
1618 echo " Making source files in eesupp from templates"
1619 ( cd $ROOTDIR"/eesupp/src/" && $MAKE ) > make_eesupp.errors 2>&1
1620 RETVAL=$?
1621 if test "x${RETVAL}" = x0 ; then
1622 rm -f make_eesupp.errors
1623 else
1624 echo "Error: problem encountered while building source files in eesupp:"
1625 cat make_eesupp.errors 1>&2
1626 exit 1
1627 fi
1628 fi
1629
1630 #same for exch2
1631 if test -r $ROOTDIR"/pkg/exch2/Makefile" ; then
1632 echo " Making source files in exch2 from templates"
1633 ( cd $ROOTDIR"/pkg/exch2/" && $MAKE ) > make_exch2.errors 2>&1
1634 RETVAL=$?
1635 if test "x${RETVAL}" = x0 ; then
1636 rm -f make_exch2.errors
1637 else
1638 echo "Error: problem encountered while building source files in exch2:"
1639 cat make_exch2.errors 1>&2
1640 exit 1
1641 fi
1642 fi
1643
1644 printf "\n=== Determining package settings ===\n"
1645 if test "x${PDEPEND}" = x ; then
1646 tmp=$ROOTDIR"/pkg/pkg_depend"
1647 if test -r $tmp ; then
1648 PDEPEND=$tmp
1649 else
1650 echo "Warning: No package dependency information was specified."
1651 echo " Please check that ROOTDIR/pkg/pkg_depend exists."
1652 fi
1653 else
1654 if test ! -r ${PDEPEND} ; then
1655 echo "Error: can't read package dependency info from PDEPEND=\"$PDEPEND\""
1656 exit 1
1657 fi
1658 fi
1659 echo " getting package dependency info from $PDEPEND"
1660 # Strip the comments and then convert the dependency file into
1661 # two arrays: PNAME, DNAME
1662 cat $PDEPEND | sed -e 's/#.*$//g' \
1663 | $AWK 'BEGIN{nn=-1;} (NF>0){ for(i=2;i<=NF;i++){nn++; print "PNAME_"nn"="$1"\nDNAME_"nn"="$i}} END{print "nname="nn}' \
1664 > ./.pd_tmp
1665 RETVAL=$?
1666 if test ! "x${RETVAL}" = x0 ; then
1667 echo "Error: unable to parse package dependencies -- please check PDEPEND=\"$PDEPEND\""
1668 exit 1
1669 fi
1670 . ./.pd_tmp
1671 rm -f ./.pd_tmp
1672
1673 # Search for default packages. Note that a "$ROOTDIR/pkg/pkg_groups"
1674 # file should eventually be added so that, for convenience, one can
1675 # specify groups of packages using names like "ocean" and "atmosphere".
1676 echo " checking default package list: "
1677 if test "x${PDEFAULT}" = x ; then
1678 for i in "." $MODS ; do
1679 if test -r $i"/packages.conf" ; then
1680 PDEFAULT=$i"/packages.conf"
1681 break
1682 fi
1683 done
1684 fi
1685 if test "x${PDEFAULT}" = x ; then
1686 PDEFAULT="$ROOTDIR/pkg/pkg_default"
1687 fi
1688 if test "x${PDEFAULT}" = xNONE ; then
1689 echo " default packages file disabled"
1690 else
1691 if test ! -r $PDEFAULT ; then
1692 echo "Warning: can't read default packages from PDEFAULT=\"$PDEFAULT\""
1693 else
1694 echo " using PDEFAULT=\"$PDEFAULT\""
1695 # Strip the comments and add all the names
1696 def=`cat $PDEFAULT | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
1697 RETVAL=$?
1698 if test "x${RETVAL}" != x0 ; then
1699 printf "Error: can't parse default package list "
1700 echo "-- please check PDEFAULT=\"$PDEFAULT\""
1701 exit 1
1702 fi
1703 for i in $def ; do
1704 PACKAGES="$PACKAGES $i"
1705 done
1706 echo " before group expansion packages are: $PACKAGES"
1707 RET=1
1708 while test $RET = 1 ; do expand_pkg_groups; RET=$?; done
1709 echo " after group expansion packages are: $PACKAGES"
1710 fi
1711 fi
1712
1713 echo " applying DISABLE settings"
1714 for i in $PACKAGES ; do
1715 echo $i >> ./.tmp_pack
1716 done
1717 for i in `grep "-" ./.tmp_pack` ; do
1718 j=`echo $i | sed 's/[-]//'`
1719 DISABLE="$DISABLE $j"
1720 done
1721 pack=
1722 for p in $PACKAGES ; do
1723 addit="t"
1724 for d in $DISABLE ; do
1725 if test "x$p" = "x$d" ; then
1726 addit="f"
1727 fi
1728 done
1729 if test "x$addit" = xt ; then
1730 pack="$pack $p"
1731 fi
1732 done
1733 PACKAGES="$pack"
1734 echo " applying ENABLE settings"
1735 echo "" > ./.tmp_pack
1736 PACKAGES="$PACKAGES $ENABLE"
1737 # Test if each explicitly referenced package exists
1738 for i in $PACKAGES ; do
1739 j=`echo $i | sed 's/[-+]//'`
1740 if test ! -d "$ROOTDIR/pkg/$j" ; then
1741 echo "Error: can't find package $i at \"$ROOTDIR/pkg/$i\""
1742 exit 1
1743 fi
1744 echo $i >> ./.tmp_pack
1745 done
1746 PACKAGES=
1747 for i in `grep -v "-" ./.tmp_pack | sort | uniq` ; do
1748 PACKAGES="$PACKAGES $i"
1749 done
1750 rm -f ./.tmp_pack
1751 echo " packages are: $PACKAGES"
1752
1753 # Check availability of NetCDF and then either build the MNC template
1754 # files or delete mnc from the list of available packages.
1755 echo $PACKAGES | grep ' mnc ' > /dev/null 2>&1
1756 RETVAL=$?
1757 if test "x$RETVAL" = x0 ; then
1758 if test "x$HAVE_NETCDF" != xt ; then
1759 cat <<EOF
1760
1761 *********************************************************************
1762 WARNING: the "mnc" package was enabled but tests failed to compile
1763 NetCDF applications. Please check that:
1764
1765 1) NetCDF is correctly installed for this compiler and
1766 2) the LIBS variable (within the "optfile") specifies the correct
1767 NetCDF library to link against.
1768
1769 Due to this failure, the "mnc" package is now DISABLED.
1770 *********************************************************************
1771
1772 EOF
1773 PACKAGES=`echo $PACKAGES | sed -e 's/mnc//g'`
1774 DISABLE="$DISABLE mnc"
1775 else
1776 ( cd $ROOTDIR"/pkg/mnc" && $MAKE testclean && $MAKE templates ) > make_mnc.errors 2>&1
1777 RETVAL=$?
1778 if test "x${RETVAL}" = x0 ; then
1779 rm -f make_mnc.errors
1780 else
1781 echo "Error: problem encountered while building source files in pkg/mnc:"
1782 cat make_mnc.errors 1>&2
1783 exit 1
1784 fi
1785 fi
1786 fi
1787
1788 echo " applying package dependency rules"
1789 ck=
1790 while test "x$ck" != xtt ; do
1791 i=0
1792 # rtot=${#PNAME[@]}
1793 rtot=$nname
1794 while test $i -lt $rtot ; do
1795
1796 # Is $pname in the current $PACKAGES list?
1797 # pname=${PNAME[$i]}
1798 tmp="pname=\"\$PNAME_$i\""
1799 eval $tmp
1800 pin="f"
1801 for p in $PACKAGES ; do
1802 if test "x$p" = "x$pname" ; then
1803 pin="t"
1804 fi
1805 done
1806
1807 # Is the DNAME entry a (+) or (-) rule ?
1808 tmp="dname=\"\$DNAME_$i\""
1809 eval $tmp
1810 plus="-"
1811 echo $dname | grep '^+' > /dev/null 2>&1
1812 RETVAL=$?
1813 if test "x$RETVAL" = x0 ; then
1814 plus="+"
1815 fi
1816
1817 # Is $dname in the current $PACKAGES list?
1818 dname=`echo $dname | sed -e 's/^[+-]//'`
1819 din="f"
1820 for p in $PACKAGES ; do
1821 if test "x$p" = "x$dname" ; then
1822 din="t"
1823 fi
1824 done
1825
1826 # Do we need to add $dname according to the dependency rules?
1827 if test "x$pin" = xt -a "x$plus" = "x+" -a "x$din" = xf ; then
1828 in_dis="f"
1829 for dis in $DISABLE ; do
1830 if test "x$dis" = "x$dname" ; then
1831 in_dis="t"
1832 fi
1833 done
1834 if test "x$in_dis" = xt ; then
1835 echo "Error: can't satisfy package dependencies:"
1836 echo " \"$dname\" is required by the dependency rules"
1837 echo " but is disallowed by the DISABLE settings"
1838 exit 1
1839 else
1840 PACKAGES="$PACKAGES $dname"
1841 ck=
1842 fi
1843 fi
1844
1845 # Do we need to get rid of $dname according to the dependency rules?
1846 if test "x$pin" = xt -a "x$plus" = "x-" -a "x$din" = xt; then
1847 echo "Error: can't satisfy package dependencies:"
1848 echo " \"$pname\" was requested but is disallowed by"
1849 echo " the dependency rules for \"$dname\""
1850 exit 1
1851 fi
1852 i=`echo "$i + 1" | bc -l`
1853 #i=$(( $i + 1 ))
1854 done
1855 ck=$ck"t"
1856 done
1857 echo " packages are: $PACKAGES"
1858 for i in $PACKAGES ; do
1859 adr="$ROOTDIR/pkg/$i"
1860 if test -d $adr ; then
1861 SOURCEDIRS="$SOURCEDIRS $adr"
1862 INCLUDEDIRS="$INCLUDEDIRS $adr"
1863 if test "x$i" = xautodiff ; then
1864 AUTODIFF_PKG_USED=t
1865 fi
1866 else
1867 echo "Error: the directory \"$adr\" for package $i doesn't exist"
1868 exit 1
1869 fi
1870 done
1871
1872 # Create a list of #define and #undef to enable/disable packages
1873 PACKAGES_DOT_H=PACKAGES_CONFIG.h
1874 # The following UGLY HACK sets multiple "#undef"s and it needs to go
1875 # away. On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h
1876 # file would eventually be split up so that all package-related #define
1877 # statements could be separated and handled only by genmake.
1878 names=`ls -1 "$ROOTDIR/pkg"`
1879 all_pack=
1880 DISABLED_PACKAGES=
1881 for n in $names ; do
1882 if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
1883 has_pack="f"
1884 for pack in $PACKAGES ; do
1885 if test "x$pack" = "x$n" ; then
1886 has_pack="t"
1887 break
1888 fi
1889 done
1890 if test "x$has_pack" = xf ; then
1891 undef=`echo "ALLOW_$n" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
1892 DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
1893 fi
1894 fi
1895 done
1896 ENABLED_PACKAGES=
1897 for i in $PACKAGES ; do
1898 def=`echo "ALLOW_$i" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
1899 ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
1900 #eh3 DEFINES="$DEFINES -D$def"
1901
1902 #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
1903 case $i in
1904 aim_v23)
1905 ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
1906 echo "Warning: ALLOW_AIM is set to enable aim_v23."
1907 ;;
1908 esac
1909 #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
1910
1911 done
1912
1913 echo " Adding STANDARDDIRS"
1914 BUILDDIR=${BUILDDIR:-.}
1915 if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
1916 STANDARDDIRS="eesupp model"
1917 fi
1918 if test "x$STANDARDDIRS" != x ; then
1919 for d in $STANDARDDIRS ; do
1920 adr="$ROOTDIR/$d/src"
1921 if test ! -d $adr ; then
1922 echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1923 echo " is correct and that you correctly specified the STANDARDDIRS option"
1924 exit 1
1925 else
1926 SOURCEDIRS="$SOURCEDIRS $adr"
1927 fi
1928 adr="$ROOTDIR/$d/inc"
1929 if test ! -d $adr ; then
1930 echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1931 echo " is correct and that you correctly specified the STANDARDDIRS option"
1932 exit 1
1933 else
1934 INCLUDEDIRS="$INCLUDEDIRS $adr"
1935 fi
1936 done
1937 fi
1938
1939 echo " Searching for *OPTIONS.h files in order to warn about the presence"
1940 echo " of \"#define \"-type statements that are no longer allowed:"
1941 CPP_OPTIONS=
1942 CPP_EEOPTIONS=
1943 spaths=". $INCLUDEDIRS"
1944 names=`ls -1 "$ROOTDIR/pkg"`
1945 for i in $spaths ; do
1946 try="$i/CPP_OPTIONS.h"
1947 if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
1948 echo " found CPP_OPTIONS=\"$try\""
1949 CPP_OPTIONS="$try"
1950 # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
1951 for n in $names ; do
1952 test_for_package_in_cpp_options $CPP_OPTIONS $n
1953 done
1954 fi
1955 try="$i/CPP_EEOPTIONS.h"
1956 if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
1957 echo " found CPP_EEOPTIONS=\"$try\""
1958 # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
1959 #**** not yet enabled ****
1960 # test_for_mpi_in_cpp_eeoptions $try
1961 #**** not yet enabled ****
1962 CPP_EEOPTIONS="$try"
1963 fi
1964 done
1965 if test "x$CPP_OPTIONS" = x ; then
1966 echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
1967 exit 1
1968 fi
1969
1970 # Here, we build the list of files to be "run through" the adjoint
1971 # compiler.
1972 if test -f ./ad_files ; then
1973 rm -f ./ad_files
1974 fi
1975 echo " Creating the list of files for the adjoint compiler."
1976 for i in $SOURCEDIRS ; do
1977 list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
1978 for j in $list_files ; do
1979 cat $i/$j >> ad_files
1980 done
1981 done
1982 if test ! "x"$FS = "x.f" ; then
1983 cat ad_files | sed -e "s/\.f/.$FS/g" > ad_files_f
1984 mv -f ad_files_f ad_files
1985 fi
1986
1987 echo
1988 echo "=== Creating the Makefile ==="
1989 echo " setting INCLUDES"
1990 for i in $INCLUDEDIRS ; do
1991 if test ! -d $i ; then
1992 echo "Warning: can't find INCLUDEDIRS=\"$i\""
1993 fi
1994 done
1995
1996 echo " Determining the list of source and include files"
1997 rm -rf .links.tmp
1998 mkdir .links.tmp
1999 echo "# This section creates symbolic links" > srclinks.tmp
2000 echo "" >> srclinks.tmp
2001 printf 'SRCFILES = ' > srclist.inc
2002 printf 'CSRCFILES = ' > csrclist.inc
2003 printf 'F90SRCFILES = ' > f90srclist.inc
2004 printf 'HEADERFILES = ' > hlist.inc
2005 printf 'AD_FLOW_FILES = ' > ad_flow_files.inc
2006 alldirs="$SOURCEDIRS $INCLUDEDIRS ."
2007 for d in $alldirs ; do
2008 deplist=
2009 sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
2010 sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
2011 for sf in $sfiles ; do
2012 if test ! -r ".links.tmp/$sf" ; then
2013 if test -f "$d/$sf" ; then
2014 ignore_f=f
2015 case $d/$sf in
2016 ./$PACKAGES_DOT_H)
2017 ;;
2018 ./AD_CONFIG.h)
2019 ;;
2020 ./FC_NAMEMANGLE.h)
2021 ;;
2022 ./BUILD_INFO.h)
2023 ;;
2024 *)
2025 # For the local directory *ONLY*,
2026 # ignore all soft-links
2027 if test "x$HAVE_TEST_L" = xt -a "x$d" = x. -a -L $sf ; then
2028 ignore_f=t
2029 else
2030 touch .links.tmp/$sf
2031 deplist="$deplist $sf"
2032 fi
2033 ;;
2034 esac
2035 if test "x$ignore_f" = xf ; then
2036 extn=`echo $sf | $AWK -F. '{print $NF}'`
2037 case $extn in
2038 F)
2039 echo " \\" >> srclist.inc
2040 printf " $sf" >> srclist.inc
2041 ;;
2042 F90)
2043 echo " \\" >> f90srclist.inc
2044 printf " $sf" >> f90srclist.inc
2045 ;;
2046 c)
2047 echo " \\" >> csrclist.inc
2048 printf " $sf" >> csrclist.inc
2049 ;;
2050 h)
2051 echo " \\" >> hlist.inc
2052 printf " $sf" >> hlist.inc
2053 ;;
2054 flow)
2055 echo " \\" >> ad_flow_files.inc
2056 printf " $sf" >> ad_flow_files.inc
2057 ;;
2058 esac
2059 fi
2060 fi
2061 fi
2062 done
2063 if test "x$deplist" != x ; then
2064 echo "" >> srclinks.tmp
2065 echo "# These files are linked from $d" >> srclinks.tmp
2066 echo "$deplist :" >> srclinks.tmp
2067 printf "\t\$(LN) %s/\$@ \$@\n" $d >> srclinks.tmp
2068 fi
2069 done
2070 rm -rf .links.tmp
2071 echo "" >> srclist.inc
2072 echo "" >> csrclist.inc
2073 echo "" >> f90srclist.inc
2074 echo "" >> hlist.inc
2075 echo "" >> ad_flow_files.inc
2076
2077 if test -f $MAKEFILE ; then
2078 mv -f $MAKEFILE "$MAKEFILE.bak"
2079 fi
2080 echo " Writing makefile: $MAKEFILE"
2081 echo "# Multithreaded + multi-processing makefile for:" > $MAKEFILE
2082 echo "# $MACHINE" >> $MAKEFILE
2083 echo "# This makefile was generated automatically on" >> $MAKEFILE
2084 echo "# $THISDATE" >> $MAKEFILE
2085 echo "# by the command:" >> $MAKEFILE
2086 echo "# $0 $G2ARGS" >> $MAKEFILE
2087 echo "# executed by:" >> $MAKEFILE
2088 echo "# ${THISUSER}@${THISHOST}:${THISCWD}" >> $MAKEFILE
2089
2090 EXE_AD=$EXECUTABLE"_ad"
2091 EXE_FTL=$EXECUTABLE"_ftl"
2092 EXE_SVD=$EXECUTABLE"_svd"
2093
2094 cat >>$MAKEFILE <<EOF
2095 #
2096 # OPTFILE="$OPTFILE"
2097 #
2098 # BUILDDIR : Directory where object files are written
2099 # SOURCEDIRS : Directories containing the source (.F) files
2100 # INCLUDEDIRS : Directories containing the header-source (.h) files
2101 # EXEDIR : Directory where executable that is generated is written
2102 # EXECUTABLE : Full path of executable binary
2103 #
2104 # CPP : C-preprocessor command
2105 # INCLUDES : Directories searched for header files
2106 # DEFINES : Macro definitions for CPP
2107 # MAKEDEPEND : Dependency generator
2108 # KPP : Special preprocessor command (specific to platform)
2109 # KFLAGS : Flags for KPP
2110 # FC : Fortran compiler command
2111 # FFLAGS : Configuration/debugging options for FC
2112 # FOPTIM : Optimization options for FC
2113 # LINK : Command for link editor program
2114 # LIBS : Library flags /or/ additional optimization/debugging flags
2115
2116 ROOTDIR = ${ROOTDIR}
2117 BUILDDIR = ${BUILDDIR}
2118 SOURCEDIRS = ${SOURCEDIRS}
2119 INCLUDEDIRS = ${INCLUDEDIRS}
2120 EXEDIR = ${EXEDIR}
2121 EXECUTABLE = \$(EXEDIR)/${EXECUTABLE}
2122 TOOLSDIR = ${TOOLSDIR}
2123
2124 #eh3 new defines for the adjoint work
2125 AUTODIFF = ${ROOTDIR}/pkg/autodiff
2126 EXE_AD = ${EXE_AD}
2127 EXE_FTL = ${EXE_FTL}
2128 EXE_SVD = ${EXE_SVD}
2129
2130 ENABLED_PACKAGES = ${ENABLED_PACKAGES}
2131 DISABLED_PACKAGES = ${DISABLED_PACKAGES}
2132
2133 # These files are created by Makefile
2134 SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h BUILD_INFO.h
2135
2136 EOF
2137
2138 # Note: figure out some way to add Hyades JAM libraries here
2139
2140 cat >>$MAKEFILE <<EOF
2141 # Unix ln (link)
2142 LN = ${LN}
2143 # C preprocessor
2144 CPP = cat \$< | ${S64} | ${CPP}
2145 # Dependency generator
2146 MAKEDEPEND = ${MAKEDEPEND}
2147 # Special preprocessor (KAP on DECs, FPP on Crays)
2148 KPP = ${KPP}
2149 # Fortran compiler
2150 FC = ${FC}
2151 # Fortran compiler
2152 F90C = ${F90C}
2153 # C compiler
2154 CC = ${CC}
2155 # Link editor
2156 LINK = ${LINK} ${LDADD}
2157
2158 # Defines for CPP
2159 DEFINES = ${DEFINES}
2160 # Includes for CPP
2161 INCLUDES = ${INCLUDES}
2162 # Flags for KPP
2163 KFLAGS1 = ${KFLAGS1}
2164 KFLAGS2 = ${KFLAGS2}
2165 # Optim./debug for FC
2166 FFLAGS = ${FFLAGS}
2167 FOPTIM = ${FOPTIM}
2168 # Optim./debug for FC
2169 F90FLAGS = ${F90FLAGS}
2170 F90OPTIM = ${F90OPTIM}
2171 # Flags for CC
2172 CFLAGS = ${CFLAGS}
2173 # Files that should not be optimized
2174 NOOPTFILES = ${NOOPTFILES}
2175 NOOPTFLAGS = ${NOOPTFLAGS}
2176 # Flags and libraries needed for linking
2177 LIBS = ${LIBS}
2178 # Name of the Mekfile
2179 MAKEFILE=${MAKEFILE}
2180
2181 EOF
2182
2183 cat srclist.inc >> $MAKEFILE
2184 cat csrclist.inc >> $MAKEFILE
2185 cat f90srclist.inc >> $MAKEFILE
2186 cat hlist.inc >> $MAKEFILE
2187 cat ad_flow_files.inc >> $MAKEFILE
2188 echo >> $MAKEFILE
2189 echo 'F77FILES = $(SRCFILES:.F=.'$FS')' >> $MAKEFILE
2190 echo 'F90FILES = $(F90SRCFILES:.F90=.'$FS90')' >> $MAKEFILE
2191 echo 'OBJFILES = $(SRCFILES:.F=.o) $(CSRCFILES:.c=.o) $(F90SRCFILES:.F90=.o)' >> $MAKEFILE
2192 echo >> $MAKEFILE
2193 echo '.SUFFIXES:' >> $MAKEFILE
2194 echo '.SUFFIXES: .o .'$FS' .p .F .c .'$FS90' .F90' >> $MAKEFILE
2195 rm -f srclist.inc csrclist.inc hlist.inc flist.tmp clist.tmp f90srclist.inc
2196 rm -f ad_flow_files.inc
2197
2198 cat >>$MAKEFILE <<EOF
2199
2200 all: \$(EXECUTABLE)
2201 \$(EXECUTABLE): \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(OBJFILES)
2202 @echo Creating \$@ ...
2203 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
2204 depend:
2205 @make links
2206 \$(MAKEDEPEND) -o .$FS \$(DEFINES) \$(INCLUDES) \$(SRCFILES)
2207 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
2208 -rm -f makedepend.out
2209
2210 lib: libmitgcmuv.a
2211
2212 libmitgcmuv.a: \$(OBJFILES)
2213 ar rcv libmitgcmuv.a \$(OBJFILES)
2214
2215 links: \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(SPECIAL_FILES)
2216
2217 small_f: \$(F77FILES) \$(F90FILES)
2218
2219 output.txt: \$(EXECUTABLE)
2220 @printf 'running ... '
2221 @\$(EXECUTABLE) > \$@
2222
2223 clean:
2224 -rm -rf *.o *.$FS *.p *.$FS90 *.mod ${RMFILES} work.{pc,pcl} *.template
2225 Clean:
2226 @make clean
2227 @make cleanlinks
2228 -rm -f \$(SPECIAL_FILES)
2229 -rm -f genmake_state genmake_*optfile genmake_warnings make.log run.log *.bak
2230 CLEAN:
2231 @make Clean
2232 -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
2233 -find \$(EXEDIR) -name "*.data" -exec rm {} \;
2234 -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
2235 -rm -f \$(EXECUTABLE) output.txt STD*
2236
2237 #eh3 Makefile: makefile
2238 makefile:
2239 $THIS_SCRIPT $G2ARGS
2240 cleanlinks:
2241 -find . -type l -exec rm {} \;
2242
2243 # Special targets (SPECIAL_FILES) which are create by make
2244 ${PACKAGES_DOT_H}:
2245 @echo Creating \$@ ...
2246 @$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) > \$@
2247 AD_CONFIG.h:
2248 @echo Creating \$@ ...
2249 @$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 > \$@
2250 FC_NAMEMANGLE.h:
2251 @echo Creating \$@ ...
2252 echo "$FC_NAMEMANGLE" > \$@
2253
2254 BUILD_INFO.h:
2255 @echo Creating \$@ ...
2256 EOF
2257
2258 test ! "x$THISVER" = x && echo " -echo \"#define THISVER '$THISVER'\" > \$@" >> $MAKEFILE
2259 test ! "x$THISUSER" = x && echo " -echo \"#define THISUSER '$THISUSER'\" >> \$@" >> $MAKEFILE
2260 test ! "x$THISDATE" = x && echo " -echo \"#define THISDATE '$THISDATE'\" >> \$@" >> $MAKEFILE
2261 test ! "x$THISHOST" = x && echo " -echo \"#define THISHOST '$THISHOST'\" >> \$@" >> $MAKEFILE
2262
2263 cat >>$MAKEFILE <<EOF
2264
2265 # The normal chain of rules is ( .F - .$FS - .o )
2266
2267 ## This nullifies any default implicit rules concerning these two file types:
2268 ## %.o : %.F
2269
2270 .F.$FS:
2271 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2272 .$FS.o:
2273 \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
2274 .F90.$FS90:
2275 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2276 .$FS90.o:
2277 \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
2278 .c.o:
2279 \$(CC) \$(CFLAGS) -c \$<
2280
2281 # Special exceptions that use the ( .F - .p - .$FS - .o ) rule-chain
2282 .F.p:
2283 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2284 .p.$FS:
2285 \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
2286
2287 #=========================================
2288 #=== Automatic Differentiation Rules ===
2289
2290 TAMC = ${TAMC}
2291 TAF = ${TAF}
2292
2293 TAF_EXTRA = ${TAF_EXTRA}
2294 TAMC_EXTRA = ${TAMC_EXTRA}
2295
2296 EOF
2297
2298 ad_vars="AD_TAMC_FLAGS AD_TAF_FLAGS"
2299 ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF_FLAGS"
2300 ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
2301 for i in $ad_vars ; do
2302 name=$i
2303 t1="t2=\$"`echo $i`
2304 eval $t1
2305 printf "%-20s = " $name >> $MAKEFILE
2306 echo $t2 >> $MAKEFILE
2307 done
2308
2309 echo " Add the source list for AD code generation"
2310 echo >> $MAKEFILE
2311 printf "AD_FILES = " >> $MAKEFILE
2312 AD_FILES=`cat ad_files`
2313 for i in $AD_FILES ; do
2314 echo " \\" >> $MAKEFILE
2315 printf " $i" >> $MAKEFILE
2316 done
2317 echo >> $MAKEFILE
2318 rm -f ad_files
2319
2320 cat >>$MAKEFILE <<EOF
2321
2322 # ... AD ...
2323 adall: ad_taf
2324 adtaf: ad_taf_output.$FS
2325 adtamc: ad_tamc_output.$FS
2326
2327 ad_input_code.$FS: \$(AD_FILES) \$(HEADERFILES)
2328 @$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
2329 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
2330 -rm -f ad_config.template
2331 @make \$(F77FILES)
2332 @make \$(AD_FLOW_FILES)
2333 cat \$(AD_FLOW_FILES) \$(AD_FILES) > ad_input_code.$FS
2334
2335 ad_taf_output.$FS: ad_input_code.$FS
2336 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2337 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2338
2339 adtafonly:
2340 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2341 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2342
2343 ad_taf: ad_taf_output.o \$(OBJFILES)
2344 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
2345
2346 ad_tamc_output.$FS: ad_input_code.$FS
2347 \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.$FS
2348 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.$FS
2349
2350 ad_tamc: ad_tamc_output.o \$(OBJFILES)
2351 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
2352
2353 adonlyfwd:
2354 patch < \$(TOOLSDIR)/ad_taf_output.f.onlyfwd.diff
2355
2356 adtrick:
2357 patch < \$(TOOLSDIR)/ad_taf_output.f.adtrick.diff
2358
2359 # ... FTL ...
2360 ftlall: ftl_taf
2361 ftltaf: ftl_taf_output.$FS
2362 ftltamc: ftl_tamc_output.$FS
2363
2364 ftl_input_code.$FS: \$(AD_FILES) \$(HEADERFILES)
2365 @$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
2366 cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
2367 -rm -f ftl_config.template
2368 @make \$(F77FILES)
2369 @make \$(AD_FLOW_FILES)
2370 cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.$FS
2371
2372 ftl_taf_output.$FS: ftl_input_code.$FS
2373 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
2374 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
2375
2376 ftltafonly:
2377 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
2378 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
2379
2380 ftl_taf: ftl_taf_output.o \$(OBJFILES)
2381 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
2382
2383 ftl_tamc_output.$FS: ftl_input_code.$FS
2384 \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.$FS
2385 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.$FS
2386
2387 ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
2388 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
2389
2390
2391 # ... SVD ...
2392 svdtaf: ad_taf_output.$FS ftl_taf_output.$FS
2393 @echo "--->>> Only ran TAF to generate SVD code! <<<---"
2394 @echo "--->>> Do make svdall afterwards to compile. <<<---"
2395 svdall: svd_touch svd_taf
2396
2397 svd_taf: \$(OBJFILES)
2398 \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
2399
2400 @echo "--->>> Only COMPILE svd code! <<<---"
2401 @echo "--->>> Assumes you previously <<<---"
2402 @echo "--->>> did make svdtaf <<<---"
2403
2404 svd_touch:
2405 @echo "--->>> Only COMPILE svd code! <<<---"
2406 @echo "--->>> Assumes you previously <<<---"
2407 @echo "--->>> did make svdtaf <<<---"
2408 touch ad_taf_output.$FS ftl_taf_output.$FS
2409 \$(FC) \$(FFLAGS) \$(FOPTIM) -c ad_taf_output.$FS
2410 \$(FC) \$(FFLAGS) \$(FOPTIM) -c ftl_taf_output.$FS
2411 @$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
2412 cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
2413 -rm -f ftl_config.template
2414
2415 #=========================================
2416
2417 EOF
2418
2419 if test "x$EXEHOOK" != x ; then
2420 printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE
2421 fi
2422
2423 echo " Making list of \"exceptions\" that need \".p\" files"
2424 for i in $KPPFILES ; do
2425 base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
2426 RETVAL=$?
2427 if test "x$RETVAL" != x0 ; then
2428 echo "Error: unable to add file \"$i\" to the exceptions list"
2429 fi
2430 echo "$base.$FS: $base.p" >> $MAKEFILE
2431 done
2432
2433 echo " Making list of NOOPTFILES"
2434 for i in $NOOPTFILES ; do
2435 base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
2436 RETVAL=$?
2437 if test "x$RETVAL" != x0 ; then
2438 echo "Error: unable to add file \"$i\" to the exceptions list"
2439 fi
2440 echo "$base.o: $base.$FS" >> $MAKEFILE
2441 printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE
2442 done
2443
2444 echo " Add rules for links"
2445 cat srclinks.tmp >> $MAKEFILE
2446 rm -f srclinks.tmp
2447
2448 echo " Adding makedepend marker"
2449 printf "\n\n# DO NOT DELETE\n" >> $MAKEFILE
2450
2451 printf "\n=== Done ===\n"
2452
2453 # Create special header files
2454 $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"
2455 if test ! -f $PACKAGES_DOT_H ; then
2456 mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
2457 else
2458 cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H > /dev/null 2>&1
2459 RETVAL=$?
2460 if test "x$RETVAL" = x0 ; then
2461 rm -f $PACKAGES_DOT_H".tmp"
2462 else
2463 mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"
2464 mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
2465 fi
2466 fi
2467 if test ! -f AD_CONFIG.h ; then
2468 $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
2469 fi
2470
2471
2472 # Write the "state" for future records
2473 if test "x$DUMPSTATE" != xf ; then
2474 printf "" > genmake_state
2475 for i in $gm_state ; do
2476 t1="t2=\$$i"
2477 eval $t1
2478 echo "$i='$t2'" >> genmake_state
2479 done
2480 fi

  ViewVC Help
Powered by ViewVC 1.1.22