/[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.69 - (show annotations) (download)
Wed Feb 25 19:12:10 2004 UTC (20 years ago) by edhill
Branch: MAIN
Changes since 1.68: +48 -5 lines
 o increase static sizes within the Cyrus makedepend
 o add new makedepend code to genmake2

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

  ViewVC Help
Powered by ViewVC 1.1.22