/[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.90 - (show annotations) (download)
Tue Jul 27 20:59:19 2004 UTC (15 years, 2 months ago) by edhill
Branch: MAIN
Changes since 1.89: +35 -17 lines
 o make it easy to specify the "cyrus" makedepend

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

  ViewVC Help
Powered by ViewVC 1.1.22