/[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.73 - (show annotations) (download)
Tue Mar 16 18:20:34 2004 UTC (20 years ago) by edhill
Branch: MAIN
Changes since 1.72: +6 -3 lines
 o fix for arguments requiring quotes to protect them from the shell
   eg: -mods="../a ../b" becomes " -mods=../a ../b" in the Makefile

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

  ViewVC Help
Powered by ViewVC 1.1.22