/[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.70 - (show annotations) (download)
Sat Feb 28 05:01:12 2004 UTC (15 years, 4 months ago) by edhill
Branch: MAIN
CVS Tags: hrcube5
Changes since 1.69: +3 -2 lines
 o add "LDADD" variable

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

  ViewVC Help
Powered by ViewVC 1.1.22