/[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.89 - (show annotations) (download)
Wed Jul 21 16:34:46 2004 UTC (19 years, 8 months ago) by edhill
Branch: MAIN
CVS Tags: checkpoint54d_post
Changes since 1.88: +10 -3 lines
 o netcdf (mnc) now compiles and runs on halem

1 #! /usr/bin/env bash
2 #
3 # $Header: /u/gcmpack/MITgcm/tools/genmake2,v 1.88 2004/07/20 19:43:45 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.bak
126 cat <<EOF >> Makefile
127 %.$tfs : %.F
128 .SUFFIXES:
129 genmake_hello.$tfs: genmake_hello.F
130 $LN genmake_hello.F genmake_hello.$tfs
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 && mv -f Makefile.bak 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 cat <<EOF >> genmake_tc.f
185 program test
186 write(*,*) 'test'
187 stop
188 end
189 EOF
190 makedepend genmake_tc.f > /dev/null 2>&1
191 RV1=$?
192 if test "x${RV0}${RV1}" = x00 ; then
193 MAKEDEPEND=makedepend
194 else
195 echo " a system-default makedepend was not found."
196
197 # Try to build the cyrus implementation
198 rm -f ./genmake_cy_md
199 (
200 cd $ROOTDIR/tools/cyrus-imapd-makedepend \
201 && ./configure > /dev/null 2>&1 \
202 && make > /dev/null 2>&1
203 if test -x ./makedepend.exe ; then
204 $LN ./makedepend.exe ./makedepend
205 fi
206 ./makedepend ifparser.c > /dev/null 2>&1 \
207 && echo "true"
208 ) > ./genmake_cy_md
209 grep true ./genmake_cy_md > /dev/null 2>&1
210 RETVAL=$?
211 if test "x$RETVAL" = x0 ; then
212 MAKEDEPEND='$(TOOLSDIR)/cyrus-imapd-makedepend/makedepend'
213 else
214 MAKEDEPEND='$(TOOLSDIR)/xmakedepend'
215 fi
216 rm -f ./genmake_cy_md
217 fi
218 fi
219 }
220
221
222 # Guess possible config options for this host
223 find_possible_configs() {
224
225 tmp1=`uname`"_"`uname -m`
226 tmp2=`echo $tmp1 | sed -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
227 tmp3=`echo $tmp2 | sed -e 's/power macintosh/ppc/'`
228 tmp1=`echo $tmp3 | sed -e 's|x86_64|amd64|'`
229 tmp2=`echo $tmp1 | sed -e 's/i[3-6]86/ia32/' | sed -e 's/athlon/ia32/'`
230 tmp3=`echo $tmp2 | sed -e 's/cray sv1/craysv1/'`
231 PLATFORM=$tmp3
232 echo $PLATFORM | grep cygwin > /dev/null 2>&1 && PLATFORM=cygwin_ia32
233 OFLIST=`(cd $ROOTDIR/tools/build_options; ls | grep "^$PLATFORM")`
234 echo " The platform appears to be: $PLATFORM"
235
236 echo "test" > test
237 ln -s ./test link
238 RETVAL=$?
239 if test "x${RETVAL}" = x0 ; then
240 LN="ln -s"
241 else
242 echo "Error: \"ln -s\" does not appear to work on this system!"
243 echo " For help, please contact <MITgcm-support@mitgcm.org>."
244 exit 1
245 fi
246 rm -f test link
247
248 if test "x$CPP" = x ; then
249 CPP="cpp -traditional -P"
250 fi
251
252 look_for_makedepend
253
254 # look for possible fortran compilers
255 tmp="$MITGCM_FC $FC efc g77 f77 pgf77 pgf95 ifc f90 f95 mpif77 mpf77 mpxlf95"
256 p_FC=
257 for c in $tmp ; do
258 rm -f ./hello.f ./hello
259 cat >> hello.f <<EOF
260 program hello
261 do i=1,3
262 print *, 'hello world : ', i
263 enddo
264 end
265 EOF
266 $c -o hello hello.f > /dev/null 2>&1
267 RETVAL=$?
268 if test "x${RETVAL}" = x0 ; then
269 p_FC="$p_FC $c"
270 fi
271 done
272 rm -f ./hello.f ./hello
273 if test "x${p_FC}" = x ; then
274 cat 1>&2 <<EOF
275
276 Error: No Fortran compilers were found in your path. Please specify one using:
277
278 1) an "optfile" on (eg. "-optfile=path/to/OPTFILE"),
279 2) a command-line option (eg. "-fc NAME"), or
280 3) the MITGCM_FC environment variable.
281
282 EOF
283 exit 1
284 else
285 echo " The possible FORTRAN compilers found in your path are:"
286 echo " "$p_FC
287 if test "x$FC" = x ; then
288 FC=`echo $p_FC | $AWK '{print $1}'`
289 echo " Setting FORTRAN compiler to: "$FC
290 fi
291 fi
292
293 if test "x$OPTFILE" = x ; then
294 OPTFILE=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$FC
295 if test ! -r $OPTFILE ; then
296 echo " I looked for the file "$OPTFILE" but did not find it"
297 fi
298 fi
299 # echo " The options file: $p_OF"
300 # echo " appears to match so we'll use it."
301 # for i in $p_FC ; do
302 #p_OF=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$i
303 #if test -r $p_OF ; then
304 # OPTFILE=$p_OF
305 # echo " The options file: $p_OF"
306 # echo " appears to match so we'll use it."
307 # break
308 #fi
309 # done
310 if test "x$OPTFILE" = x ; then
311 cat 1>&2 <<EOF
312
313 Error: No options file was found in: $ROOTDIR/tools/build_options/
314 that matches this platform ("$PLATFORM") and the compilers found in
315 your path. Please specify an "optfile" using:
316
317 1) the command line (eg. "-optfile=path/to/OPTFILE"), or
318 2) the MITGCM_OF environment variable.
319
320 If you need help, please contact the developers at <MITgcm-support@mitgcm.org>.
321
322 EOF
323 exit 1
324 fi
325
326 # # look for possible MPI libraries
327 # mpi_libs=
328 # mpi_fort=`which mpif77 2>/dev/null`
329 # RETVAL=$?
330 # if test "x${RETVAL}" = x0 ; then
331 # cat >>test.f <<EOF
332 # PROGRAM HELLO
333 # DO 10, I=1,10
334 # PRINT *,'Hello World'
335 # 10 CONTINUE
336 # STOP
337 # END
338 # EOF
339 # eval "$mpi_fort -showme test.f > out"
340 # RETVAL=$?
341 # if test "x${RETVAL}" = x0 ; then
342 # a=`cat out`
343 # for i in $a ; do
344 # case $i in
345 # -*)
346 # mpi_libs="$mpi_libs $i" ;;
347 # esac
348 # done
349 # echo "The MPI libs appear to be:"
350 # echo " "$mpi_libs
351 # fi
352 # rm -f test.f out
353 # fi
354
355 }
356
357 # Parse the package dependency information
358 get_pdepend_list() {
359
360 # strip the comments and then convert the dependency file into
361 # two arrays: PNAME, DNAME
362 cat $1 | sed -e 's/#.*$//g' \
363 | $AWK 'BEGIN{nn=0;} (NF>0){ for(i=2;i<=NF;i++){nn++; print "PNAME["nn"]="$1"\nDNAME["nn"]="$i} }' \
364 > ./.pd_tmp
365 . ./.pd_tmp
366 rm -f ./.pd_tmp
367
368 printf "PNAME = "${}
369 }
370
371
372 # Explain usage
373 usage() {
374 cat <<EOF
375
376 Usage: "$0" [OPTIONS]
377 where [OPTIONS] can be:
378
379 -help | --help | -h | --h
380 Print this help message and exit.
381
382 -adoptfile NAME | --adoptfile NAME | -adof NAME | --adof NAME
383 -adoptfile=NAME | --adoptfile=NAME | -adof=NAME | --adof=NAME
384 Use "NAME" as the adoptfile. By default, the file at
385 "tools/adjoint_options/adjoint_default" will be used.
386
387 -nooptfile | --nooptfile
388 -optfile NAME | --optfile NAME | -of NAME | --of NAME
389 -optfile=NAME | --optfile=NAME | -of=NAME | --of=NAME
390 Use "NAME" as the optfile. By default, an attempt will be
391 made to find an appropriate "standard" optfile in the
392 tools/build_options/ directory.
393
394 -pdepend NAME | --pdepend NAME
395 -pdepend=NAME | --pdepend=NAME
396 Get package dependency information from "NAME".
397
398 -pdefault NAME | --pdefault NAME
399 -pdefault=NAME | --pdefault=NAME
400 Get the default package list from "NAME".
401
402 -make NAME | -m NAME
403 --make=NAME | -m=NAME
404 Use "NAME" for the MAKE program. The default is "make" but
405 many platforms, "gmake" is the preferred choice.
406
407 -makefile NAME | -mf NAME
408 --makefile=NAME | -mf=NAME
409 Call the makefile "NAME". The default is "Makefile".
410
411 -makedepend NAME | -md NAME
412 --makedepend=NAME | -md=NAME
413 Use "NAME" for the MAKEDEPEND program.
414
415 -rootdir NAME | --rootdir NAME | -rd NAME | --rd NAME
416 -rootdir=NAME | --rootdir=NAME | -rd=NAME | --rd=NAME
417 Specify the location of the MITgcm ROOTDIR as "NAME".
418 By default, genamke will try to find the location by
419 looking in parent directories (up to the 5th parent).
420
421 -mods NAME | --mods NAME | -mo NAME | --mo NAME
422 -mods=NAME | --mods=NAME | -mo=NAME | --mo=NAME
423 Here, "NAME" specifies a list of directories that are
424 used for additional source code. Files found in the
425 "mods list" are given preference over files of the same
426 name found elsewhere.
427
428 -disable NAME | --disable NAME
429 -disable=NAME | --disable=NAME
430 Here "NAME" specifies a list of packages that we don't
431 want to use. If this violates package dependencies,
432 genamke will exit with an error message.
433
434 -enable NAME | --enable NAME
435 -enable=NAME | --enable=NAME
436 Here "NAME" specifies a list of packages that we wish
437 to specifically enable. If this violates package
438 dependencies, genamke will exit with an error message.
439
440 -standarddirs NAME | --standarddirs NAME
441 -standarddirs=NAME | --standarddirs=NAME
442 Here, "NAME" specifies a list of directories to be
443 used as the "standard" code.
444
445 -fortran NAME | --fortran NAME | -fc NAME | --fc NAME
446 -fc=NAME | --fc=NAME
447 Use "NAME" as the fortran compiler. By default, genmake
448 will search for a working compiler by trying a list of
449 "usual suspects" such as g77, f77, etc.
450
451 -[no]ieee | --[no]ieee
452 Do or don't use IEEE numerics. Note that this option
453 *only* works if it is supported by the OPTFILE that
454 is being used.
455
456 -mpi | --mpi
457 Include MPI header files and link to MPI libraries
458 -mpi=PATH | --mpi=PATH
459 Include MPI header files and link to MPI libraries using MPI_ROOT
460 set to PATH. i.e. Include files from $PATH/include, link to libraries
461 from $PATH/lib and use binaries from $PATH/bin.
462
463 -bash NAME
464 Explicitly specify the Bourne or BASH shell to use
465
466 While it is most often a single word, the "NAME" variables specified
467 above can in many cases be a space-delimited string such as:
468
469 --enable pkg1 --enable 'pkg1 pkg2' --enable 'pkg1 pkg2 pkg3'
470 -mods=dir1 -mods='dir1' -mods='dir1 dir2 dir3'
471 -foptim='-Mvect=cachesize:512000,transform -xtypemap=real:64,double:64,integer:32'
472
473 which, depending upon your shell, may need to be single-quoted.
474
475 For more detailed genmake documentation, please see:
476
477 http://mitgcm.org/devel_HOWTO/
478
479 EOF
480
481 exit 1
482 }
483
484 # Build a CPP macro to automate calling C routines from FORTRAN
485 get_fortran_c_namemangling() {
486
487 #echo "FC_NAMEMANGLE = \"$FC_NAMEMANGLE\""
488 if test ! "x$FC_NAMEMANGLE" = x ; then
489 return 0
490 fi
491
492 default_nm="#define FC_NAMEMANGLE(X) X ## _"
493
494 cat > genmake_test.c <<EOF
495 void tcall( char * string ) { tsub( string ); }
496 EOF
497 $MAKE genmake_test.o >> genmake_warnings 2>&1
498 RETVAL=$?
499 if test "x$RETVAL" != x0 ; then
500 FC_NAMEMANGLE=$default_nm
501 cat <<EOF>> genmake_errors
502
503 WARNING: C test compile fails
504 WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
505 WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here
506 EOF
507 return 1
508 fi
509 c_tcall=`nm genmake_test.o | grep 'T ' | grep tcall | cut -d ' ' -f 3`
510 RETVAL=$?
511 if test "x$RETVAL" != x0 ; then
512 FC_NAMEMANGLE=$default_nm
513 cat <<EOF>> genmake_warnings
514
515 WARNING: The "nm" command failed.
516 WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
517 WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here
518 EOF
519 return 1
520 fi
521 cat > genmake_tcomp.f <<EOF
522 subroutine tcall( string )
523 character*(*) string
524 call tsub( string )
525 end
526 EOF
527 $FC $FFLAGS $DEFINES -c genmake_tcomp.f >> genmake_warnings 2>&1
528 RETVAL=$?
529 if test "x$RETVAL" != x0 ; then
530 FC_NAMEMANGLE=$default_nm
531 cat <<EOF>> genmake_warnings
532
533 WARNING: FORTRAN test compile fails -- please see "genmake_errors"
534 WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
535 WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here.
536 EOF
537 return 1
538 fi
539 f_tcall=`nm genmake_tcomp.o | grep 'T ' | grep tcall | cut -d ' ' -f 3`
540 RETVAL=$?
541 if test "x$RETVAL" != x0 ; then
542 FC_NAMEMANGLE=$default_nm
543 cat <<EOF>> genmake_warnings
544
545 WARNING: The "nm" command failed.
546 WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
547 WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here.
548 EOF
549 return 1
550 fi
551
552 c_a=`echo $c_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 1 | sed -e 's|Y||'`
553 f_a=`echo $f_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 1 | sed -e 's|Y||'`
554 c_b=`echo $c_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 2 | sed -e 's|Y||'`
555 f_b=`echo $f_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 2 | sed -e 's|Y||'`
556
557 nmangle="X"
558 if test "x$c_a" != "x$f_a" ; then
559 comm="echo x$f_a | sed -e 's|x$c_a||'"
560 a=`eval $comm`
561 nmangle="$a ## $nmangle"
562 fi
563 if test "x$c_b" != "x$f_b" ; then
564 comm="echo x$f_b | sed -e 's|x$c_b||'"
565 b=`eval $comm`
566 nmangle="$nmangle ## $b"
567 fi
568
569 FC_NAMEMANGLE="#define FC_NAMEMANGLE(X) $nmangle"
570
571 # cleanup the testing files
572 rm -f genmake_tcomp.* genmake_test.*
573 }
574
575
576 check_HAVE_CLOC() {
577 get_fortran_c_namemangling
578 cat <<EOF > genmake_tc_1.c
579 $FC_NAMEMANGLE
580 #include <stdio.h>
581 #include <stdlib.h>
582 #include <unistd.h>
583 #include <assert.h>
584 #include <sys/time.h>
585 void FC_NAMEMANGLE(cloc) ( double *curtim )
586 {
587 struct timeval tv1;
588 gettimeofday(&tv1 , (void *)NULL );
589 *curtim = (double)((tv1.tv_usec)+(tv1.tv_sec)*1.E6);
590 *curtim = *curtim/1.E6;
591 }
592 EOF
593 make genmake_tc_1.o >> genmake_tc.log 2>&1
594 RET_C=$?
595 cat <<EOF > genmake_tc_2.f
596 program hello
597 Real*8 wtime
598 external cloc
599 call cloc(wtime)
600 print *," HELLO WORLD", wtime
601 end program hello
602 EOF
603 $FC $FFLAGS -o genmake_tc genmake_tc_2.f genmake_tc_1.o >> genmake_tc.log 2>&1
604 RET_F=$?
605 test -x ./genmake_tc && ./genmake_tc >> genmake_tc.log 2>&1
606 RETVAL=$?
607 if test "x$RETVAL" = x0 ; then
608 HAVE_CLOC=t
609 DEFINES="$DEFINES -DHAVE_CLOC"
610 fi
611 rm -f genmake_tc*
612 }
613
614
615 check_netcdf_libs() {
616 cat <<EOF > genmake_tnc.for
617 program fgennc
618 #include "netcdf.inc"
619 integer iret, ncid, xid
620 iret = nf_create('genmake_tnc.nc', NF_CLOBBER, ncid)
621 IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
622 iret = nf_def_dim(ncid, 'X', 11, xid)
623 IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
624 iret = nf_close(ncid)
625 IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
626 end
627 EOF
628 #echo "$CPP $DEFINES $INCLUDES"
629 $CPP $DEFINES $INCLUDES genmake_tnc.for > genmake_tnc.f \
630 && $FC $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.f $LIBS >> genmake_tnc.log 2>&1
631 RET_COMPILE=$?
632 test -x ./genmake_tnc && ./genmake_tnc >> genmake_tnc.log 2>&1
633 RETVAL=$?
634 if test "x$RET_COMPILE" = x0 -a "x$RETVAL" = x0 ; then
635 HAVE_NETCDF=t
636 else
637 # try again with "-lnetcdf" added to the libs
638 $CPP $DEFINES $INCLUDES genmake_tnc.for > genmake_tnc.f \
639 && $FC $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.f \
640 $LIBS -lnetcdf >> genmake_tnc_2.log 2>&1
641 RET_COMPILE=$?
642 test -x ./genmake_tnc && ./genmake_tnc >> genmake_tnc.log 2>&1
643 RETVAL=$?
644 if test "x$RET_COMPILE" = x0 -a "x$RETVAL" = x0 ; then
645 LIBS="$LIBS -lnetcdf"
646 HAVE_NETCDF=t
647 else
648 cat genmake_tnc.log >> genmake_warnings
649 fi
650 fi
651 rm -f genmake_tnc*
652 }
653
654
655
656 ###############################################################################
657 # Sequential part of script starts here
658 ###############################################################################
659
660 # Set defaults here
661 COMMANDL="$0 $@"
662
663 PLATFORM=
664 LN=
665 S64=
666 KPP=
667 FC=
668 CPP=
669 LINK=
670 DEFINES=
671 PACKAGES=
672 ENABLE=
673 DISABLE=
674 MAKEFILE=
675 MAKEDEPEND=
676 PDEPEND=
677 DUMPSTATE=t
678 PDEFAULT=
679 OPTFILE=
680 INCLUDES="-I."
681 FFLAGS=
682 FOPTIM=
683 CFLAGS=
684 KFLAGS1=
685 KFLAGS2=
686 #LDADD=
687 LIBS=
688 KPPFILES=
689 NOOPTFILES=
690 NOOPTFLAGS=
691 MPI=
692 MPIPATH=
693
694 # DEFINES checked by test compilation
695 HAVE_SYSTEM=
696 HAVE_FDATE=
697 FC_NAMEMANGLE=
698 HAVE_CLOC=
699 HAVE_NETCDF=
700 HAVE_ETIME=
701
702 MODS=
703 TOOLSDIR=
704 SOURCEDIRS=
705 INCLUDEDIRS=
706 STANDARDDIRS="USE_THE_DEFAULT"
707
708 G2ARGS=
709 BASH=
710 PWD=`pwd`
711 MAKE=make
712 AWK=awk
713 THISHOSTNAME=`hostname`
714 THISCWD=`pwd`
715 THISDATE=`date`
716 MACHINE=`uname -a`
717 EXECUTABLE=
718 EXEHOOK=
719 EXEDIR=
720 PACKAGES_CONF=
721 IEEE=
722 if test "x$MITGCM_IEEE" != x ; then
723 IEEE=$MITGCM_IEEE
724 fi
725 FS=
726 FS90=
727
728 AUTODIFF_PKG_USED=f
729 AD_OPTFILE=
730 TAF=
731 AD_TAF_FLAGS=
732 FTL_TAF_FLAGS=
733 SVD_TAF_FLAGS=
734 TAF_EXTRA=
735 TAMC=
736 AD_TAMC_FLAGS=
737 FTL_TAF_FLAGS=
738 SVD_TAMC_FLAGS=
739 TAMC_EXTRA=
740
741
742 # The following state can be set directly by command-line switches
743 gm_s1="OPTFILE PDEPEND PDEFAULT MAKEFILE PLATFORM ROOTDIR MODS DISABLE ENABLE"
744 gm_s2="FC CPP IEEE MPI JAM DUMPSTATE STANDARDDIRS"
745
746 # The following state is not directly set by command-line switches
747 gm_s3="LN S64 KPP LINK PACKAGES MAKEDEPEND PDEPEND PDEFAULT INCLUDES FFLAGS FOPTIM "
748 gm_s4="CFLAGS KFLAGS1 KFLAGS2 LIBS KPPFILES NOOPTFILES NOOPTFLAGS"
749 gm_s5="TOOLSDIR SOURCEDIRS INCLUDEDIRS PWD MAKE THISHOSTNAME THISDATE MACHINE"
750 gm_s6="EXECUTABLE EXEHOOK EXEDIR PACKAGES_CONF"
751 gm_s7="HAVE_SYSTEM HAVE_FDATE FC_NAMEMANGLE HAVE_ETIME"
752
753 # The following are all related to adjoint/tangent-linear stuff
754 gm_s10="AUTODIFF_PKG_USED AD_OPTFILE TAMC TAF AD_TAMC_FLAGS AD_TAF_FLAGS"
755 gm_s11="FTL_TAMC_FLAGS FTL_TAF_FLAGS SVD_TAMC_FLAGS SVD_TAF_FLAGS"
756 gm_s12="TAF_EXTRA TAMC_EXTRA"
757
758 gm_state="COMMANDL $gm_s1 $gm_s2 $gm_s3 $gm_s4 $gm_s5 $gm_s6 $gm_s7"
759 gm_state="$gm_state $gm_s10 $gm_s11 $gm_s12"
760
761 cat <<EOF
762
763 GENMAKE :
764
765 A program for GENerating MAKEfiles for the MITgcm project. For a
766 quick list of options, use "genmake -h" or for more detail see:
767
768 http://mitgcm.org/devel_HOWTO/
769
770 EOF
771
772 echo "=== Processing options files and arguments ==="
773 gm_local="genmake_local"
774 for i in . $MODS ; do
775 if test -r $i/$gm_local ; then
776 . $i/$gm_local
777 break
778 fi
779 done
780 printf " getting local config information: "
781 if test -f $gm_local ; then
782 echo "using $gm_local"
783 . $gm_local
784 # echo "DISABLE=$DISABLE"
785 # echo "ENABLE=$ENABLE"
786 else
787 echo "none found"
788 fi
789
790 # echo "$0::$1:$2:$3:$4:$5:$6:$7:"
791 #OPTIONS=
792 #n=0
793 #for i ; do
794 # echo "$i $n"
795 # setvar="OPTIONS[$n]='$i'"
796 # # echo " $setvar"
797 # eval "$setvar"
798 # n=$(( $n + 1 ))
799 #done
800 #parse_options
801 ac_prev=
802 for ac_option in $@ ; do
803
804 G2ARGS="$G2ARGS \"$ac_option\""
805
806 # If the previous option needs an argument, assign it.
807 if test -n "$ac_prev"; then
808 eval "$ac_prev=\$ac_option"
809 ac_prev=
810 continue
811 fi
812
813 ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
814
815 case $ac_option in
816
817 -help | --help | -h | --h)
818 usage ;;
819
820 -nooptfile | --nooptfile)
821 OPTFILE="NONE" ;;
822 -optfile | --optfile | -of | --of)
823 ac_prev=OPTFILE ;;
824 -optfile=* | --optfile=* | -of=* | --of=*)
825 OPTFILE=$ac_optarg ;;
826
827 -adoptfile | --adoptfile | -adof | --adof)
828 ac_prev=AD_OPTFILE ;;
829 -adoptfile=* | --adoptfile=* | -adof=* | --adof=*)
830 AD_OPTFILE=$ac_optarg ;;
831
832 -pdepend | --pdepend)
833 ac_prev=PDEPEND ;;
834 -pdepend=* | --pdepend=*)
835 PDEPEND=$ac_optarg ;;
836
837 -pdefault | --pdefault)
838 ac_prev=PDEFAULT ;;
839 -pdefault=* | --pdefault=*)
840 PDEFAULT=$ac_optarg ;;
841
842 -make | --make | -m | --m)
843 ac_prev=MAKE ;;
844 -make=* | --make=* | -m=* | --m=*)
845 MAKE=$ac_optarg ;;
846
847 -bash | --bash)
848 ac_prev=BASH ;;
849 -bash=* | --bash=*)
850 BASH=$ac_optarg ;;
851
852 -makedepend | --makedepend | -md | --md)
853 ac_prev=MAKEDEPEND ;;
854 -makedepend=* | --makedepend=* | -md=* | --md=*)
855 MAKEDEPEND=$ac_optarg ;;
856
857 -makefile | --makefile | -ma | --ma)
858 ac_prev=MAKEFILE ;;
859 -makefile=* | --makefile=* | -ma=* | --ma=*)
860 MAKEFILE=$ac_optarg ;;
861
862 -platform | --platform | -pl | --pl | -platform=* | --platform=* | -pl=* | --pl=*)
863 echo "ERROR: The platform option has been removed. Please specify"
864 echo " the build options using the \"optfile\" mechanism."
865 echo
866 usage
867 ;;
868
869 -rootdir | --rootdir | -rd | --rd)
870 ac_prev=ROOTDIR ;;
871 -rootdir=* | --rootdir=* | -rd=* | --rd=*)
872 ROOTDIR=$ac_optarg ;;
873
874 -mods | --mods | -mo | --mo)
875 ac_prev=MODS ;;
876 -mods=* | --mods=* | -mo=* | --mo=*)
877 MODS=$ac_optarg ;;
878
879 -disable | --disable)
880 ac_prev=DISABLE ;;
881 -disable=* | --disable=*)
882 DISABLE=$ac_optarg ;;
883
884 -enable | --enable)
885 ac_prev=ENABLE ;;
886 -enable=* | --enable=*)
887 ENABLE=$ac_optarg ;;
888
889 -standarddirs | --standarddirs)
890 ac_prev=STANDARDDIRS ;;
891 -standarddirs=* | --standarddirs=*)
892 STANDARDDIRS=$ac_optarg ;;
893
894 # -cpp | --cpp)
895 # ac_prev=cpp ;;
896 # -cpp=* | --cpp=*)
897 # CPP=$ac_optarg ;;
898
899 -fortran | --fortran | -fc | --fc)
900 ac_prev=FC ;;
901 -fc=* | --fc=*)
902 FC=$ac_optarg ;;
903
904 -fs | --fs)
905 ac_prev=FS ;;
906 -fs=* | --fs=*)
907 FS=$ac_optarg ;;
908
909 -fs90 | --fs90)
910 ac_prev=FS90 ;;
911 -fs90=* | --fs90=*)
912 FS90=$ac_optarg ;;
913
914 -ieee | --ieee)
915 IEEE=true ;;
916 -noieee | --noieee)
917 IEEE= ;;
918
919 -mpi | --mpi)
920 MPI=true ;;
921 -mpi=* | --mpi=*)
922 MPIPATH=$ac_optarg
923 MPI=true ;;
924
925 # -jam | --jam)
926 # JAM=1 ;;
927 # -nojam | --nojam)
928 # JAM=0 ;;
929
930 -ds | --ds)
931 DUMPSTATE=t ;;
932
933 -taf_extra | --taf_extra)
934 ac_prev=TAF_EXTRA ;;
935 -taf_extra=* | --taf_extra=*)
936 TAF_EXTRA=$ac_optarg ;;
937
938 -tamc_extra | --tamc_extra)
939 ac_prev=TAMC_EXTRA ;;
940 -tamc_extra=* | --tamc_extra=*)
941 TAMC_EXTRA=$ac_optarg ;;
942
943 -*)
944 echo "Error: unrecognized option: "$ac_option
945 usage
946 ;;
947
948 *)
949 echo "Error: unrecognized argument: "$ac_option
950 usage
951 ;;
952
953 esac
954
955 done
956
957 if test -f ./.genmakerc ; then
958 echo
959 echo "WARNING: genmake2 has detected a copy of the old-style \"./.genmakerc\""
960 echo " file. This file format is no longer supported. Please see:"
961 echo
962 echo " http://mitgcm.org/devel_HOWTO/"
963 echo
964 echo " for directions on how to setup and use the new \"genmake2\" input"
965 echo " files and send an email to MITgcm-support@mitgcm.org if you want help."
966 echo
967 fi
968
969 if test "x${ROOTDIR}" = x ; then
970 tmp=`echo $PWD | sed -e 's/\// /g' | awk '{print $NR}'`
971 if test "x$tmp" = "xbin" -a -d ../model -a -d ../eesup -a -d ../pkg ; then
972 ROOTDIR=".."
973 else
974 for d in . .. ../.. ../../.. ../../../.. ../../../../.. ; do
975 if [ -d "$d/model" -a -d "$d/eesupp" -a -d "$d/pkg" ]; then
976 ROOTDIR=$d
977 printf "Warning: ROOTDIR was not specified but there appears to be"
978 echo " a copy of MITgcm at \"$ROOTDIR\" so we'll try it."
979 break
980 fi
981 done
982 fi
983 fi
984 if test "x${ROOTDIR}" = x ; then
985 echo "Error: Cannot determine ROOTDIR for MITgcm code."
986 echo " Please specify a ROOTDIR using either an options "
987 echo " file or a command-line option."
988 exit 1
989 fi
990 if test ! -d ${ROOTDIR} ; then
991 echo "Error: the specified ROOTDIR (\"$ROOTDIR\") does not exist!"
992 exit 1
993 fi
994
995 echo " getting OPTFILE information: "
996 if test "x${OPTFILE}" = x ; then
997 if test "x$MITGCM_OF" = x ; then
998 echo "Warning: no OPTFILE specified so we'll look for possible settings"
999 printf "\n=== Searching for possible settings for OPTFILE ===\n"
1000 find_possible_configs
1001 else
1002 OPTFILE=$MITGCM_OF
1003 fi
1004 fi
1005 if test "x$OPTFILE" != xNONE ; then
1006 if test -f "$OPTFILE" -a -r "$OPTFILE" ; then
1007 echo " using OPTFILE=\"$OPTFILE\""
1008 . "$OPTFILE"
1009 RETVAL=$?
1010 if test "x$RETVAL" != x0 ; then
1011 printf "Error: failed to source OPTFILE \"$OPTFILE\""
1012 echo "--please check that variable syntax is bash-compatible"
1013 exit 1
1014 fi
1015 if test "x$DUMPSTATE" != xf ; then
1016 cp -f $OPTFILE "genmake_optfile"
1017 fi
1018 else
1019 echo "Error: can't read OPTFILE=\"$OPTFILE\""
1020 exit 1
1021 fi
1022 fi
1023
1024 # Check for broken systems that cannot correctly distinguish *.F and *.f files
1025 # check_for_broken_Ff
1026
1027 echo " getting AD_OPTFILE information: "
1028 if test "x${AD_OPTFILE}" = x ; then
1029 if test "x$MITGCM_AD_OF" = x ; then
1030 AD_OPTFILE=$ROOTDIR/tools/adjoint_options/adjoint_default
1031 else
1032 AD_OPTFILE=$MITGCM_AD_OF
1033 fi
1034 fi
1035 if test "x${AD_OPTFILE}" != xNONE ; then
1036 if test -f "$AD_OPTFILE" -a -r "$AD_OPTFILE" ; then
1037 echo " using AD_OPTFILE=\"$AD_OPTFILE\""
1038 . "$AD_OPTFILE"
1039 RETVAL=$?
1040 if test "x$RETVAL" != x0 ; then
1041 printf "Error: failed to source AD_OPTFILE \"$AD_OPTFILE\""
1042 echo "--please check that variable syntax is bash-compatible"
1043 exit 1
1044 fi
1045 if test "x$DUMPSTATE" != xf ; then
1046 cp -f $AD_OPTFILE "genmake_ad_optfile"
1047 fi
1048 else
1049 echo "Error: can't read AD_OPTFILE=\"$AD_OPTFILE\""
1050 exit 1
1051 fi
1052 fi
1053
1054 # Check that FC, LINK, CPP, S64, LN, and MAKE are defined. If not,
1055 # either set defaults or complain and abort!
1056 if test ! "x$BASH" = x ; then
1057 # add a trailing space so that it works within the Makefile syntax (see below)
1058 BASH="$BASH "
1059 fi
1060 if test "x$FC" = x ; then
1061 cat <<EOF 1>&2
1062
1063 Error: no Fortran compiler: please specify using one of the following:
1064 1) within the options file ("FC=...") as specified by "-of=OPTFILE"
1065 2) the "-fc=XXX" command-line option
1066 3) the "./genmake_local" file
1067 EOF
1068 exit 1
1069 fi
1070 if test "x$LINK" = x ; then
1071 LINK=$FC
1072 fi
1073 if test "x$MAKE" = x ; then
1074 MAKE="make"
1075 fi
1076 if test "x$CPP" = x ; then
1077 CPP=cpp
1078 fi
1079 #EH3 === UGLY ===
1080 # The following is an ugly little hack to check for $CPP in /lib/ and
1081 # it should eventually be replaced with a more general function that
1082 # searches a combo of the user's path and a list of "usual suspects"
1083 # to find the correct location for binaries such as $CPP.
1084 for i in " " "/lib/" ; do
1085 echo "#define A a" | $i$CPP > test_cpp 2>&1 && CPP=$i$CPP
1086 done
1087 #EH3 === UGLY ===
1088 echo "#define A a" | $CPP > test_cpp 2>&1
1089 RETVAL=$?
1090 if test "x$RETVAL" != x0 ; then
1091 cat <<EOF 1>&2
1092
1093 Error: C pre-processor "$CPP" failed the test case: please specify using:
1094
1095 1) within the options file ("CPP=...") as specified by "-of=OPTFILE"
1096 2) the "./genmake_local" file
1097 3) with the CPP environment variable
1098
1099 EOF
1100 exit 1
1101 else
1102 rm -f test_cpp
1103 fi
1104 look_for_makedepend
1105 if test "x$LN" = x ; then
1106 LN="ln -s"
1107 fi
1108 echo "test" > genmake_test_ln
1109 $LN genmake_test_ln genmake_tlink
1110 RETVAL=$?
1111 if test "x$RETVAL" != x0 ; then
1112 cat <<EOF 1>&2
1113
1114 Error: The command "ln -s" failed -- please specify a working soft-link
1115 command in the optfile.
1116
1117 EOF
1118 exit 1
1119 fi
1120 rm -f genmake_test_ln genmake_tlink
1121
1122 # Check for broken *.F/*.f handling and fix if possible
1123 check_for_broken_Ff
1124
1125 if test ! "x$MPI" = x ; then
1126 echo " Turning on MPI cpp macros"
1127 DEFINES="$DEFINES -DALLOW_USE_MPI -DALWAYS_USE_MPI"
1128 fi
1129
1130 printf "\n=== Checking system libraries ===\n"
1131 printf " Do we have the system() command using $FC... "
1132 cat > genmake_tcomp.f <<EOF
1133 program hello
1134 call system('echo hi')
1135 end
1136 EOF
1137 $FC $FFLAGS $DEFINES -o genmake_tcomp genmake_tcomp.f > genmake_tcomp.log 2>&1
1138 RETVAL=$?
1139 if test "x$RETVAL" = x0 ; then
1140 HAVE_SYSTEM=t
1141 DEFINES="$DEFINES -DHAVE_SYSTEM"
1142 echo "yes"
1143 else
1144 HAVE_SYSTEM=
1145 echo "no"
1146 fi
1147 rm -f genmake_tcomp*
1148
1149 printf " Do we have the fdate() command using $FC... "
1150 cat > genmake_tcomp.f <<EOF
1151 program hello
1152 CHARACTER(128) string
1153 string = ' '
1154 call fdate( string )
1155 print *, string
1156 end
1157 EOF
1158 $FC $FFLAGS $DEFINES -o genmake_tcomp genmake_tcomp.f > genmake_tcomp.log 2>&1
1159 RETVAL=$?
1160 if test "x$RETVAL" = x0 ; then
1161 HAVE_FDATE=t
1162 DEFINES="$DEFINES -DHAVE_FDATE"
1163 echo "yes"
1164 else
1165 HAVE_FDATE=
1166 echo "no"
1167 fi
1168 rm -f genmake_tcomp*
1169
1170 printf " Do we have the etime() command using $FC... "
1171 cat > genmake_tcomp.f <<EOF
1172 program hello
1173 REAL*4 ACTUAL, TARRAY(2)
1174 EXTERNAL ETIME
1175 REAL*4 ETIME
1176 actual = etime( tarray )
1177 print *, tarray
1178 end
1179 EOF
1180 $FC $FFLAGS $DEFINES -o genmake_tcomp genmake_tcomp.f > genmake_tcomp.log 2>&1
1181 RETVAL=$?
1182 if test "x$RETVAL" = x0 ; then
1183 HAVE_ETIME=t
1184 DEFINES="$DEFINES -DHAVE_ETIME"
1185 echo "yes"
1186 else
1187 HAVE_ETIME=
1188 echo "no"
1189 fi
1190 rm -f genmake_tcomp*
1191
1192 printf " Can we call simple C routines (here, \"cloc()\") using $FC... "
1193 check_HAVE_CLOC
1194 if test "x$HAVE_CLOC" != x ; then
1195 echo "yes"
1196 else
1197 echo "no"
1198 fi
1199 rm -f genmake_t*
1200
1201 printf " Can we create NetCDF-enabled binaries... "
1202 check_netcdf_libs
1203 if test "x$HAVE_NETCDF" != x ; then
1204 echo "yes"
1205 else
1206 echo "no"
1207 fi
1208
1209
1210 printf "\n=== Setting defaults ===\n"
1211 printf " Adding MODS directories: "
1212 for d in $MODS ; do
1213 if test ! -d $d ; then
1214 echo
1215 echo "Error: MODS directory \"$d\" not found!"
1216 exit 1
1217 else
1218 printf " $d"
1219 SOURCEDIRS="$SOURCEDIRS $d"
1220 INCLUDEDIRS="$INCLUDEDIRS $d"
1221 fi
1222 done
1223 echo
1224
1225 if test "x$MAKEFILE" = x ; then
1226 MAKEFILE="Makefile"
1227 fi
1228 if test "x${PLATFORM}" = x ; then
1229 PLATFORM=$p_PLATFORM
1230 fi
1231
1232 if test "x${EXEDIR}" = x ; then
1233 tmp=`echo $PWD | sed -e 's/\// /g' | awk '{print $NR}'`
1234 if test "x$tmp" = "xbin" -a -d ../exe -a $ROOTDIR = .. ; then
1235 EXEDIR=../exe
1236 else
1237 EXEDIR=.
1238 fi
1239 fi
1240 if test ! -d ${EXEDIR} ; then
1241 echo "Error: the specified EXEDIR (\"$EXEDIR\") does not exist!"
1242 exit 1
1243 fi
1244
1245 if test "x${TOOLSDIR}" = x ; then
1246 TOOLSDIR="$ROOTDIR/tools"
1247 fi
1248 if test ! -d ${TOOLSDIR} ; then
1249 echo "Error: the specified TOOLSDIR (\"$TOOLSDIR\") does not exist!"
1250 exit 1
1251 fi
1252 if test "x$S64" = x ; then
1253 S64='$(TOOLSDIR)/set64bitConst.sh'
1254 fi
1255 THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`
1256
1257 EXECUTABLE=${EXECUTABLE:-mitgcmuv}
1258
1259 # We have a special set of source files in eesupp/src which are
1260 # generated from some template source files. We'll make them first so
1261 # they appear as regular source code
1262 if test -r $ROOTDIR"/eesupp/src/Makefile" ; then
1263 echo " Making source files in eesupp from templates"
1264 ( cd $ROOTDIR"/eesupp/src/" && $MAKE ) > make_eesupp.errors 2>&1
1265 RETVAL=$?
1266 if test "x${RETVAL}" = x0 ; then
1267 rm -f make_eesupp.errors
1268 else
1269 echo "Error: problem encountered while building source files in eesupp:"
1270 cat make_eesupp.errors 1>&2
1271 exit 1
1272 fi
1273 fi
1274
1275 #same for exch2
1276 if test -r $ROOTDIR"/pkg/exch2/Makefile" ; then
1277 echo " Making source files in exch2 from templates"
1278 ( cd $ROOTDIR"/pkg/exch2/" && $MAKE ) > make_exch2.errors 2>&1
1279 RETVAL=$?
1280 if test "x${RETVAL}" = x0 ; then
1281 rm -f make_exch2.errors
1282 else
1283 echo "Error: problem encountered while building source files in exch2:"
1284 cat make_exch2.errors 1>&2
1285 exit 1
1286 fi
1287 fi
1288
1289 printf "\n=== Determining package settings ===\n"
1290 if test "x${PDEPEND}" = x ; then
1291 tmp=$ROOTDIR"/pkg/pkg_depend"
1292 if test -r $tmp ; then
1293 PDEPEND=$tmp
1294 else
1295 echo "Warning: No package dependency information was specified."
1296 echo " Please check that ROOTDIR/pkg/pkg_depend exists."
1297 fi
1298 else
1299 if test ! -r ${PDEPEND} ; then
1300 echo "Error: can't read package dependency info from PDEPEND=\"$PDEPEND\""
1301 exit 1
1302 fi
1303 fi
1304 echo " getting package dependency info from $PDEPEND"
1305 # Strip the comments and then convert the dependency file into
1306 # two arrays: PNAME, DNAME
1307 cat $PDEPEND | sed -e 's/#.*$//g' \
1308 | $AWK 'BEGIN{nn=-1;} (NF>0){ for(i=2;i<=NF;i++){nn++; print "PNAME_"nn"="$1"\nDNAME_"nn"="$i}} END{print "nname="nn}' \
1309 > ./.pd_tmp
1310 RETVAL=$?
1311 if test ! "x${RETVAL}" = x0 ; then
1312 echo "Error: unable to parse package dependencies -- please check PDEPEND=\"$PDEPEND\""
1313 exit 1
1314 fi
1315 . ./.pd_tmp
1316 rm -f ./.pd_tmp
1317
1318 # Search for default packages. Note that a "$ROOTDIR/pkg/pkg_groups"
1319 # file should eventually be added so that, for convenience, one can
1320 # specify groups of packages using names like "ocean" and "atmosphere".
1321 echo " checking default package list: "
1322 if test "x${PDEFAULT}" = x ; then
1323 for i in "." $MODS ; do
1324 if test -r $i"/packages.conf" ; then
1325 PDEFAULT=$i"/packages.conf"
1326 break
1327 fi
1328 done
1329 fi
1330 if test "x${PDEFAULT}" = x ; then
1331 PDEFAULT="$ROOTDIR/pkg/pkg_default"
1332 fi
1333 if test "x${PDEFAULT}" = xNONE ; then
1334 echo " default packages file disabled"
1335 else
1336 if test ! -r $PDEFAULT ; then
1337 echo "Warning: can't read default packages from PDEFAULT=\"$PDEFAULT\""
1338 else
1339 echo " using PDEFAULT=\"$PDEFAULT\""
1340 # Strip the comments and add all the names
1341 def=`cat $PDEFAULT | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
1342 RETVAL=$?
1343 if test "x${RETVAL}" != x0 ; then
1344 printf "Error: can't parse default package list "
1345 echo "-- please check PDEFAULT=\"$PDEFAULT\""
1346 exit 1
1347 fi
1348 for i in $def ; do
1349 PACKAGES="$PACKAGES $i"
1350 done
1351 echo " before group expansion packages are: $PACKAGES"
1352 RET=1
1353 while test $RET = 1 ; do expand_pkg_groups; RET=$?; done
1354 echo " after group expansion packages are: $PACKAGES"
1355 fi
1356 fi
1357
1358 echo " applying DISABLE settings"
1359 for i in $PACKAGES ; do
1360 echo $i >> ./.tmp_pack
1361 done
1362 for i in `grep "-" ./.tmp_pack` ; do
1363 j=`echo $i | sed 's/[-]//'`
1364 DISABLE="$DISABLE $j"
1365 done
1366 pack=
1367 for p in $PACKAGES ; do
1368 addit="t"
1369 for d in $DISABLE ; do
1370 if test "x$p" = "x$d" ; then
1371 addit="f"
1372 fi
1373 done
1374 if test "x$addit" = xt ; then
1375 pack="$pack $p"
1376 fi
1377 done
1378 PACKAGES="$pack"
1379 echo " applying ENABLE settings"
1380 echo "" > ./.tmp_pack
1381 PACKAGES="$PACKAGES $ENABLE"
1382 # Test if each explicitly referenced package exists
1383 for i in $PACKAGES ; do
1384 j=`echo $i | sed 's/[-+]//'`
1385 if test ! -d "$ROOTDIR/pkg/$j" ; then
1386 echo "Error: can't find package $i at \"$ROOTDIR/pkg/$i\""
1387 exit 1
1388 fi
1389 echo $i >> ./.tmp_pack
1390 done
1391 PACKAGES=
1392 for i in `grep -v "-" ./.tmp_pack | sort | uniq` ; do
1393 PACKAGES="$PACKAGES $i"
1394 done
1395 rm -f ./.tmp_pack
1396 echo " packages are: $PACKAGES"
1397
1398 echo " applying package dependency rules"
1399 ck=
1400 while test "x$ck" != xtt ; do
1401 i=0
1402 # rtot=${#PNAME[@]}
1403 rtot=$nname
1404 while test $i -lt $rtot ; do
1405
1406 # Is $pname in the current $PACKAGES list?
1407 # pname=${PNAME[$i]}
1408 tmp="pname=\"\$PNAME_$i\""
1409 eval $tmp
1410 pin="f"
1411 for p in $PACKAGES ; do
1412 if test "x$p" = "x$pname" ; then
1413 pin="t"
1414 fi
1415 done
1416
1417 # Is the DNAME entry a (+) or (-) rule ?
1418 tmp="dname=\"\$DNAME_$i\""
1419 eval $tmp
1420 plus="-"
1421 echo $dname | grep '^+' > /dev/null 2>&1
1422 RETVAL=$?
1423 if test "x$RETVAL" = x0 ; then
1424 plus="+"
1425 fi
1426
1427 # Is $dname in the current $PACKAGES list?
1428 dname=`echo $dname | sed -e 's/^[+-]//'`
1429 din="f"
1430 for p in $PACKAGES ; do
1431 if test "x$p" = "x$dname" ; then
1432 din="t"
1433 fi
1434 done
1435
1436 # Do we need to add $dname according to the dependency rules?
1437 if test "x$pin" = xt -a "x$plus" = "x+" -a "x$din" = xf ; then
1438 in_dis="f"
1439 for dis in $DISABLE ; do
1440 if test "x$dis" = "x$dname" ; then
1441 in_dis="t"
1442 fi
1443 done
1444 if test "x$in_dis" = xt ; then
1445 echo "Error: can't satisfy package dependencies:"
1446 echo " \"$dname\" is required by the dependency rules"
1447 echo " but is disallowed by the DISABLE settings"
1448 exit 1
1449 else
1450 PACKAGES="$PACKAGES $dname"
1451 ck=
1452 fi
1453 fi
1454
1455 # Do we need to get rid of $dname according to the dependency rules?
1456 if test "x$pin" = xt -a "x$plus" = "x-" -a "x$din" = xt; then
1457 echo "Error: can't satisfy package dependencies:"
1458 echo " \"$pname\" was requested but is disallowed by"
1459 echo " the dependency rules for \"$dname\""
1460 exit 1
1461 fi
1462 i=`echo "$i + 1" | bc -l`
1463 #i=$(( $i + 1 ))
1464 done
1465 ck=$ck"t"
1466 done
1467 echo " packages are: $PACKAGES"
1468 for i in $PACKAGES ; do
1469 adr="$ROOTDIR/pkg/$i"
1470 if test -d $adr ; then
1471 SOURCEDIRS="$SOURCEDIRS $adr"
1472 INCLUDEDIRS="$INCLUDEDIRS $adr"
1473 if test "x$i" = xautodiff ; then
1474 AUTODIFF_PKG_USED=t
1475 fi
1476 else
1477 echo "Error: the directory \"$adr\" for package $i doesn't exist"
1478 exit 1
1479 fi
1480 done
1481
1482 # Build MNC templates and check for ability to build and use NetCDF
1483 echo $PACKAGES | grep ' mnc ' > /dev/null 2>&1
1484 RETVAL=$?
1485 if test "x$RETVAL" = x0 ; then
1486 ( cd $ROOTDIR"/pkg/mnc" && $MAKE templates ) > make_mnc.errors 2>&1
1487 RETVAL=$?
1488 if test "x${RETVAL}" = x0 ; then
1489 rm -f make_mnc.errors
1490 else
1491 echo "Error: problem encountered while building source files in pkg/mnc:"
1492 cat make_mnc.errors 1>&2
1493 exit 1
1494 fi
1495 if test "x$HAVE_NETCDF" != xt ; then
1496 cat <<EOF
1497
1498 WARNING: the "mnc" package has been enabled but tests failed to
1499 compile and/or execute NetCDF applications. Please check that:
1500
1501 1) NetCDF is installed for your compiler and
1502 2) the LIBS variable (within the 'optfile") specifies the correct
1503 NetCDF library to link against.
1504
1505 EOF
1506 fi
1507 fi
1508
1509 # Create a list of #define and #undef to enable/disable packages
1510 PACKAGES_DOT_H=PACKAGES_CONFIG.h
1511 # The following UGLY HACK sets multiple "#undef"s and it needs to go
1512 # away. On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h
1513 # file would eventually be split up so that all package-related #define
1514 # statements could be separated and handled only by genmake.
1515 names=`ls -1 "$ROOTDIR/pkg"`
1516 all_pack=
1517 DISABLED_PACKAGES=
1518 for n in $names ; do
1519 if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
1520 has_pack="f"
1521 for pack in $PACKAGES ; do
1522 if test "x$pack" = "x$n" ; then
1523 has_pack="t"
1524 break
1525 fi
1526 done
1527 if test "x$has_pack" = xf ; then
1528 undef=`echo "ALLOW_$n" | $AWK '{print toupper($0)}'`
1529 DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
1530 fi
1531 fi
1532 done
1533 ENABLED_PACKAGES=
1534 for i in $PACKAGES ; do
1535 def=`echo "ALLOW_$i" | $AWK '{print toupper($0)}'`
1536 ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
1537 #eh3 DEFINES="$DEFINES -D$def"
1538
1539 #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
1540 case $i in
1541 aim_v23)
1542 ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
1543 echo "Warning: ALLOW_AIM is set to enable aim_v23."
1544 ;;
1545 esac
1546 #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
1547
1548 done
1549
1550 echo " Adding STANDARDDIRS"
1551 BUILDDIR=${BUILDDIR:-.}
1552 if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
1553 STANDARDDIRS="eesupp model"
1554 fi
1555 if test "x$STANDARDDIRS" != x ; then
1556 for d in $STANDARDDIRS ; do
1557 adr="$ROOTDIR/$d/src"
1558 if test ! -d $adr ; then
1559 echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1560 echo " is correct and that you correctly specified the STANDARDDIRS option"
1561 exit 1
1562 else
1563 SOURCEDIRS="$SOURCEDIRS $adr"
1564 fi
1565 adr="$ROOTDIR/$d/inc"
1566 if test ! -d $adr ; then
1567 echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1568 echo " is correct and that you correctly specified the STANDARDDIRS option"
1569 exit 1
1570 else
1571 INCLUDEDIRS="$INCLUDEDIRS $adr"
1572 fi
1573 done
1574 fi
1575
1576 echo " Searching for *OPTIONS.h files in order to warn about the presence"
1577 echo " of \"#define \"-type statements that are no longer allowed:"
1578 CPP_OPTIONS=
1579 CPP_EEOPTIONS=
1580 spaths=". $INCLUDEDIRS"
1581 names=`ls -1 "$ROOTDIR/pkg"`
1582 for i in $spaths ; do
1583 try="$i/CPP_OPTIONS.h"
1584 if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
1585 echo " found CPP_OPTIONS=\"$try\""
1586 CPP_OPTIONS="$try"
1587 # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
1588 for n in $names ; do
1589 test_for_package_in_cpp_options $CPP_OPTIONS $n
1590 done
1591 fi
1592 try="$i/CPP_EEOPTIONS.h"
1593 if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
1594 echo " found CPP_EEOPTIONS=\"$try\""
1595 # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
1596 #**** not yet enabled ****
1597 # test_for_mpi_in_cpp_eeoptions $try
1598 #**** not yet enabled ****
1599 CPP_EEOPTIONS="$try"
1600 fi
1601 done
1602 if test "x$CPP_OPTIONS" = x ; then
1603 echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
1604 exit 1
1605 fi
1606
1607 # Here, we build the list of files to be "run through" the adjoint
1608 # compiler.
1609 if test -f ./ad_files ; then
1610 rm -f ./ad_files
1611 fi
1612 echo " Creating the list of files for the adjoint compiler."
1613 for i in $SOURCEDIRS ; do
1614 list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
1615 for j in $list_files ; do
1616 cat $i/$j >> ad_files
1617 done
1618 done
1619
1620
1621 echo
1622 echo "=== Creating the Makefile ==="
1623 echo " setting INCLUDES"
1624 for i in $INCLUDEDIRS ; do
1625 if test ! -d $i ; then
1626 echo "Warning: can't find INCLUDEDIRS=\"$i\""
1627 fi
1628 done
1629
1630 echo " Determining the list of source and include files"
1631 rm -rf .links.tmp
1632 mkdir .links.tmp
1633 echo "# This section creates symbolic links" > srclinks.tmp
1634 echo "" >> srclinks.tmp
1635 printf 'SRCFILES = ' > srclist.inc
1636 printf 'CSRCFILES = ' > csrclist.inc
1637 printf 'F90SRCFILES = ' > f90srclist.inc
1638 printf 'HEADERFILES = ' > hlist.inc
1639 printf 'AD_FLOW_FILES = ' > ad_flow_files.inc
1640 alldirs="$SOURCEDIRS $INCLUDEDIRS ."
1641 for d in $alldirs ; do
1642 deplist=
1643 sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
1644 sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
1645 for sf in $sfiles ; do
1646 if test ! -r ".links.tmp/$sf" ; then
1647 if test -f "$d/$sf" ; then
1648 case $d/$sf in
1649 ./$PACKAGES_DOT_H)
1650 ;;
1651 ./AD_CONFIG.h)
1652 ;;
1653 ./FC_NAMEMANGLE.h)
1654 ;;
1655 *)
1656 touch .links.tmp/$sf
1657 deplist="$deplist $sf"
1658 ;;
1659 esac
1660 extn=`echo $sf | $AWK -F '.' '{print $NF}'`
1661 case $extn in
1662 F)
1663 echo " \\" >> srclist.inc
1664 printf " $sf" >> srclist.inc
1665 ;;
1666 F90)
1667 echo " \\" >> f90srclist.inc
1668 printf " $sf" >> f90srclist.inc
1669 ;;
1670 c)
1671 echo " \\" >> csrclist.inc
1672 printf " $sf" >> csrclist.inc
1673 ;;
1674 h)
1675 echo " \\" >> hlist.inc
1676 printf " $sf" >> hlist.inc
1677 ;;
1678 flow)
1679 echo " \\" >> ad_flow_files.inc
1680 printf " $sf" >> ad_flow_files.inc
1681 ;;
1682 esac
1683 fi
1684 fi
1685 done
1686 if test "x$deplist" != x ; then
1687 echo "" >> srclinks.tmp
1688 echo "# These files are linked from $d" >> srclinks.tmp
1689 echo "$deplist :" >> srclinks.tmp
1690 printf "\t\$(LN) %s/\$@ \$@\n" $d >> srclinks.tmp
1691 fi
1692 done
1693 rm -rf .links.tmp
1694 echo "" >> srclist.inc
1695 echo "" >> csrclist.inc
1696 echo "" >> f90srclist.inc
1697 echo "" >> hlist.inc
1698 echo "" >> ad_flow_files.inc
1699
1700 if test -f $MAKEFILE ; then
1701 mv -f $MAKEFILE "$MAKEFILE.bak"
1702 fi
1703 echo " Writing makefile: $MAKEFILE"
1704 echo "# Multithreaded + multi-processing makefile for:" > $MAKEFILE
1705 echo "# $MACHINE" >> $MAKEFILE
1706 echo "# This makefile was generated automatically on" >> $MAKEFILE
1707 echo "# $THISDATE" >> $MAKEFILE
1708 echo "# by the command:" >> $MAKEFILE
1709 echo "# $0 $G2ARGS" >> $MAKEFILE
1710 echo "# executed by:" >> $MAKEFILE
1711 echo "# $USER@${THISHOSTNAME}:${THISCWD}" >> $MAKEFILE
1712
1713 EXE_AD=$EXECUTABLE"_ad"
1714 EXE_FTL=$EXECUTABLE"_ftl"
1715 EXE_SVD=$EXECUTABLE"_svd"
1716
1717 cat >>$MAKEFILE <<EOF
1718 #
1719 # OPTFILE="$OPTFILE"
1720 #
1721 # BUILDDIR : Directory where object files are written
1722 # SOURCEDIRS : Directories containing the source (.F) files
1723 # INCLUDEDIRS : Directories containing the header-source (.h) files
1724 # EXEDIR : Directory where executable that is generated is written
1725 # EXECUTABLE : Full path of executable binary
1726 #
1727 # CPP : C-preprocessor command
1728 # INCLUDES : Directories searched for header files
1729 # DEFINES : Macro definitions for CPP
1730 # MAKEDEPEND : Dependency generator
1731 # KPP : Special preprocessor command (specific to platform)
1732 # KFLAGS : Flags for KPP
1733 # FC : Fortran compiler command
1734 # FFLAGS : Configuration/debugging options for FC
1735 # FOPTIM : Optimization options for FC
1736 # LINK : Command for link editor program
1737 # LIBS : Library flags /or/ additional optimization/debugging flags
1738
1739 ROOTDIR = ${ROOTDIR}
1740 BUILDDIR = ${BUILDDIR}
1741 SOURCEDIRS = ${SOURCEDIRS}
1742 INCLUDEDIRS = ${INCLUDEDIRS}
1743 EXEDIR = ${EXEDIR}
1744 EXECUTABLE = \$(EXEDIR)/${EXECUTABLE}
1745 TOOLSDIR = ${TOOLSDIR}
1746
1747 #eh3 new defines for the adjoint work
1748 AUTODIFF = ${ROOTDIR}/pkg/autodiff
1749 EXE_AD = ${EXE_AD}
1750 EXE_FTL = ${EXE_FTL}
1751 EXE_SVD = ${EXE_SVD}
1752
1753 ENABLED_PACKAGES = ${ENABLED_PACKAGES}
1754 DISABLED_PACKAGES = ${DISABLED_PACKAGES}
1755
1756 # These files are created by Makefile
1757 SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h
1758
1759 EOF
1760
1761 # Note: figure out some way to add Hyades JAM libraries here
1762
1763 cat >>$MAKEFILE <<EOF
1764 # Unix ln (link)
1765 LN = ${LN}
1766 # C preprocessor
1767 CPP = cat \$< | ${S64} | ${CPP}
1768 # Dependency generator
1769 MAKEDEPEND = ${MAKEDEPEND}
1770 # Special preprocessor (KAP on DECs, FPP on Crays)
1771 KPP = ${KPP}
1772 # Fortran compiler
1773 FC = ${FC}
1774 # Fortran compiler
1775 F90C = ${F90C}
1776 # Link editor
1777 LINK = ${LINK} ${LDADD}
1778
1779 # Defines for CPP
1780 DEFINES = ${DEFINES}
1781 # Includes for CPP
1782 INCLUDES = ${INCLUDES}
1783 # Flags for KPP
1784 KFLAGS1 = ${KFLAGS1}
1785 KFLAGS2 = ${KFLAGS2}
1786 # Optim./debug for FC
1787 FFLAGS = ${FFLAGS}
1788 FOPTIM = ${FOPTIM}
1789 # Optim./debug for FC
1790 F90FLAGS = ${F90FLAGS}
1791 F90OPTIM = ${F90OPTIM}
1792 # Flags for CC
1793 CFLAGS = ${CFLAGS}
1794 # Files that should not be optimized
1795 NOOPTFILES = ${NOOPTFILES}
1796 NOOPTFLAGS = ${NOOPTFLAGS}
1797 # Flags and libraries needed for linking
1798 LIBS = ${LIBS} \$(XLIBS)
1799 # Name of the Mekfile
1800 MAKEFILE=${MAKEFILE}
1801
1802 EOF
1803
1804 cat srclist.inc >> $MAKEFILE
1805 cat csrclist.inc >> $MAKEFILE
1806 cat f90srclist.inc >> $MAKEFILE
1807 cat hlist.inc >> $MAKEFILE
1808 cat ad_flow_files.inc >> $MAKEFILE
1809 echo >> $MAKEFILE
1810 echo 'F77FILES = $(SRCFILES:.F=.'$FS')' >> $MAKEFILE
1811 echo 'F90FILES = $(F90SRCFILES:.F=.'$FS90')' >> $MAKEFILE
1812 echo 'OBJFILES = $(SRCFILES:.F=.o) $(CSRCFILES:.c=.o) $(F90SRCFILES:.F90=.o)' >> $MAKEFILE
1813 echo >> $MAKEFILE
1814 echo '.SUFFIXES:' >> $MAKEFILE
1815 echo '.SUFFIXES: .o .'$FS' .p .F .c .'$FS90' .F90' >> $MAKEFILE
1816 rm -f srclist.inc csrclist.inc hlist.inc flist.tmp clist.tmp f90srclist.inc
1817 rm -f ad_flow_files.inc
1818
1819 cat >>$MAKEFILE <<EOF
1820
1821 all: \$(EXECUTABLE)
1822 \$(EXECUTABLE): \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(OBJFILES)
1823 @echo Creating \$@ ...
1824 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
1825 depend:
1826 @make links
1827 \$(MAKEDEPEND) -o .$FS \$(DEFINES) \$(INCLUDES) \$(SRCFILES)
1828 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
1829 -rm -f makedepend.out
1830
1831 links: \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(SPECIAL_FILES)
1832
1833 small_f: \$(F77FILES) \$(F90FILES)
1834
1835 output.txt: \$(EXECUTABLE)
1836 @printf 'running ... '
1837 @\$(EXECUTABLE) > \$@
1838
1839 clean:
1840 -rm -rf *.o *.$FS *.p *.$FS90 *.mod ${RMFILES} work.{pc,pcl} *.template
1841 Clean:
1842 @make clean
1843 @make cleanlinks
1844 -rm -f \$(SPECIAL_FILES)
1845 -rm -f genmake_state genmake_*optfile genmake_warnings make.log run.log *.bak
1846 CLEAN:
1847 @make Clean
1848 -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
1849 -find \$(EXEDIR) -name "*.data" -exec rm {} \;
1850 -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
1851 -rm -f \$(EXECUTABLE) output.txt STD*
1852
1853 #eh3 Makefile: makefile
1854 makefile:
1855 $THIS_SCRIPT $G2ARGS
1856 cleanlinks:
1857 -find . -type l -exec rm {} \;
1858
1859 # Special targets ($SPECIAL_FILES) which are create by make
1860 ${PACKAGES_DOT_H}:
1861 @echo Creating \$@ ...
1862 @$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) > \$@
1863 AD_CONFIG.h:
1864 @echo Creating \$@ ...
1865 @$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 > \$@
1866 FC_NAMEMANGLE.h:
1867 @echo Creating \$@ ...
1868 echo "$FC_NAMEMANGLE" > \$@
1869
1870 # The normal chain of rules is ( .F - .$FS - .o )
1871
1872 %.o : %.F
1873
1874 .F.$FS:
1875 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1876 .$FS.o:
1877 \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
1878 .F90.$FS90:
1879 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1880 .$FS90.o:
1881 \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
1882 .c.o:
1883 \$(CC) \$(CFLAGS) -c \$<
1884
1885 # Special exceptions that use the ( .F - .p - .$FS - .o ) rule-chain
1886 .F.p:
1887 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1888 .p.$FS:
1889 \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
1890
1891 #=========================================
1892 #=== Automatic Differentiation Rules ===
1893
1894 TAMC = ${TAMC}
1895 TAF = ${TAF}
1896
1897 TAF_EXTRA = ${TAF_EXTRA}
1898 TAMC_EXTRA = ${TAMC_EXTRA}
1899
1900 EOF
1901
1902 ad_vars="AD_TAMC_FLAGS AD_TAF_FLAGS"
1903 ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF_FLAGS"
1904 ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
1905 for i in $ad_vars ; do
1906 name=$i
1907 t1="t2=\$"`echo $i`
1908 eval $t1
1909 printf "%-20s = " $name >> $MAKEFILE
1910 echo $t2 >> $MAKEFILE
1911 done
1912
1913 echo " Add the source list for AD code generation"
1914 echo >> $MAKEFILE
1915 printf "AD_FILES = " >> $MAKEFILE
1916 AD_FILES=`cat ad_files`
1917 for i in $AD_FILES ; do
1918 echo " \\" >> $MAKEFILE
1919 printf " $i" >> $MAKEFILE
1920 done
1921 echo >> $MAKEFILE
1922 rm -f ad_files
1923
1924 cat >>$MAKEFILE <<EOF
1925
1926 # ... AD ...
1927 adall: ad_taf
1928 adtaf: ad_taf_output.f
1929 adtamc: ad_tamc_output.f
1930
1931 ad_input_code.f: \$(AD_FILES) \$(HEADERFILES)
1932 @$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
1933 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
1934 -rm -f ad_config.template
1935 @make \$(F77FILES)
1936 @make \$(AD_FLOW_FILES)
1937 cat \$(AD_FLOW_FILES) \$(AD_FILES) > ad_input_code.f
1938
1939 ad_taf_output.f: ad_input_code.f
1940 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f
1941 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f
1942
1943 adtafonly:
1944 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f
1945 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f
1946
1947 ad_taf: ad_taf_output.o \$(OBJFILES)
1948 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
1949
1950 ad_tamc_output.f: ad_input_code.f
1951 \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.f
1952 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.f
1953
1954 ad_tamc: ad_tamc_output.o \$(OBJFILES)
1955 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
1956
1957
1958 # ... FTL ...
1959 ftlall: ftl_taf
1960 ftltaf: ftl_taf_output.f
1961 ftltamc: ftl_tamc_output.f
1962
1963 ftl_input_code.f: \$(AD_FILES) \$(HEADERFILES)
1964 @$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
1965 cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
1966 -rm -f ftl_config.template
1967 @make \$(F77FILES)
1968 @make \$(AD_FLOW_FILES)
1969 cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.f
1970
1971 ftl_taf_output.f: ftl_input_code.f
1972 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f
1973 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f
1974
1975 ftltafonly:
1976 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f
1977 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f
1978
1979 ftl_taf: ftl_taf_output.o \$(OBJFILES)
1980 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
1981
1982 ftl_tamc_output.f: ftl_input_code.f
1983 \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.f
1984 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.f
1985
1986 ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
1987 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
1988
1989
1990 # ... SVD ...
1991 svdtaf: ad_taf_output.f ftl_taf_output.f
1992 svdall: svd_taf
1993
1994 svd_taf: ad_taf_output.o ftl_taf_output.o \$(OBJFILES)
1995 \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
1996
1997
1998 #=========================================
1999
2000 EOF
2001
2002 if test "x$EXEHOOK" != x ; then
2003 printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE
2004 fi
2005
2006 echo " Making list of \"exceptions\" that need \".p\" files"
2007 for i in $KPPFILES ; do
2008 base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
2009 RETVAL=$?
2010 if test "x$RETVAL" != x0 ; then
2011 echo "Error: unable to add file \"$i\" to the exceptions list"
2012 fi
2013 echo "$base.$FS: $base.p" >> $MAKEFILE
2014 done
2015
2016 echo " Making list of NOOPTFILES"
2017 for i in $NOOPTFILES ; do
2018 base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
2019 RETVAL=$?
2020 if test "x$RETVAL" != x0 ; then
2021 echo "Error: unable to add file \"$i\" to the exceptions list"
2022 fi
2023 echo "$base.o: $base.$FS" >> $MAKEFILE
2024 printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE
2025 done
2026
2027 echo " Add rules for links"
2028 cat srclinks.tmp >> $MAKEFILE
2029 rm -f srclinks.tmp
2030
2031 echo " Adding makedepend marker"
2032 printf "\n\n# DO NOT DELETE\n" >> $MAKEFILE
2033
2034 printf "\n=== Done ===\n"
2035
2036 # Create special header files
2037 $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"
2038 if test ! -f $PACKAGES_DOT_H ; then
2039 mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
2040 else
2041 cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H > /dev/null 2>&1
2042 RETVAL=$?
2043 if test "x$RETVAL" = x0 ; then
2044 rm -f $PACKAGES_DOT_H".tmp"
2045 else
2046 mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"
2047 mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
2048 fi
2049 fi
2050 if test ! -f AD_CONFIG.h ; then
2051 $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
2052 fi
2053
2054
2055 # Write the "state" for future records
2056 if test "x$DUMPSTATE" != xf ; then
2057 printf "" > genmake_state
2058 for i in $gm_state ; do
2059 t1="t2=\$$i"
2060 eval $t1
2061 echo "$i='$t2'" >> genmake_state
2062 done
2063 fi

  ViewVC Help
Powered by ViewVC 1.1.22