/[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.71 - (show annotations) (download)
Wed Mar 10 23:34:04 2004 UTC (20 years ago) by edhill
Branch: MAIN
CVS Tags: checkpoint52l_pre, checkpoint52l_post
Changes since 1.70: +46 -33 lines
 o fixes for baroque-n CRAY systems
   - replace all "echo -n" commands with the more portable "printf"
   - add a "-bash /path/to/shell" option so that a Bourne- or
     BASH-compatible shell can be explicitly specified within
     the Makefile

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

  ViewVC Help
Powered by ViewVC 1.1.22