/[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.81 - (show annotations) (download)
Wed Jun 30 00:58:06 2004 UTC (19 years, 8 months ago) by cnh
Branch: MAIN
Changes since 1.80: +23 -2 lines
Update to genmake that makes it check for ETIME and sets HAVE_ETIME accordingly.
#ifdef HAVE_ETIME added to timers.F for this

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

  ViewVC Help
Powered by ViewVC 1.1.22