/[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.75 - (show annotations) (download)
Wed Apr 7 20:28:09 2004 UTC (19 years, 11 months ago) by edhill
Branch: MAIN
Changes since 1.74: +65 -16 lines
 o first step towards fixing the *.F/*.f problem that exists within cygwin
   and MacOSX environments

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

  ViewVC Help
Powered by ViewVC 1.1.22