/[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.86 - (show annotations) (download)
Sat Jul 17 02:52:14 2004 UTC (15 years, 4 months ago) by edhill
Branch: MAIN
Changes since 1.85: +2 -2 lines
 o http://mitgcm.org/pipermail/mitgcm-support/2004-July/002343.html

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

  ViewVC Help
Powered by ViewVC 1.1.22