/[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.72 - (show annotations) (download)
Fri Mar 12 15:50:06 2004 UTC (20 years ago) by edhill
Branch: MAIN
Changes since 1.71: +5 -3 lines
 o more small fixes for CRAY SV1 systems

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

  ViewVC Help
Powered by ViewVC 1.1.22