/[MITgcm]/MITgcm_contrib/heimbach/OpenAD/code_shallow_openad/genmake2
ViewVC logotype

Contents of /MITgcm_contrib/heimbach/OpenAD/code_shallow_openad/genmake2

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.4 - (show annotations) (download)
Wed Jan 11 06:05:47 2006 UTC (20 years, 10 months ago) by utke
Branch: MAIN
Changes since 1.3: +10 -6 lines
add logic to handle the extra template and the temp fix for the data statements

1 #! /usr/bin/env bash
2 #
3 # $Header: /u/gcmpack/MITgcm_contrib/heimbach/OpenAD/code_shallow_openad/genmake2,v 1.3 2006/01/03 19:21:36 utke 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".tst"
126 cat <<EOF >> $MAKEFILE
127 .SUFFIXES:
128 .SUFFIXES: .$tfs .F
129 .F.$tfs:
130 $LN \$< \$@
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".tst" && mv -f $MAKEFILE".tst" $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 test -f $MAKEFILE && mv -f $MAKEFILE $MAKEFILE".tst"
185 # echo 'MAKEFILE="'$MAKEFILE'"'
186 cat <<EOF >> $MAKEFILE
187 # THIS IS A TEST MAKEFILE GENERATED BY "genmake2"
188 #
189 # Some "makedepend" implementations will die if they cannot
190 # find a Makefile -- so this file is here to gives them an
191 # empty one to find and parse.
192 EOF
193 cat <<EOF >> genmake_tc.f
194 program test
195 write(*,*) 'test'
196 stop
197 end
198 EOF
199 makedepend genmake_tc.f > /dev/null 2>&1
200 RV1=$?
201 test -f $MAKEFILE && rm -f $MAKEFILE
202 test -f $MAKEFILE".tst" && mv -f $MAKEFILE".tst" $MAKEFILE
203 if test "x${RV0}${RV1}" = x00 ; then
204 MAKEDEPEND=makedepend
205 else
206 echo " a system-default makedepend was not found."
207
208 # Try to build the cyrus implementation
209 build_cyrus_makedepend
210 RETVAL=$?
211 if test "x$RETVAL" != x0 ; then
212 MAKEDEPEND='$(TOOLSDIR)/xmakedepend'
213 fi
214 rm -f ./genmake_cy_md
215 fi
216 else
217 # echo "MAKEDEPEND=${MAKEDEPEND}"
218 echo "${MAKEDEPEND}" | grep -i cyrus > /dev/null 2>&1
219 RETVAL=$?
220 if test x"$RETVAL" = x0 ; then
221 build_cyrus_makedepend
222 fi
223 fi
224 }
225
226
227 build_cyrus_makedepend() {
228 rm -f ./genmake_cy_md
229 (
230 cd $ROOTDIR/tools/cyrus-imapd-makedepend \
231 && ./configure > /dev/null 2>&1 \
232 && make > /dev/null 2>&1
233 if test -x ./makedepend.exe ; then
234 $LN ./makedepend.exe ./makedepend
235 fi
236 ./makedepend ifparser.c > /dev/null 2>&1 \
237 && echo "true"
238 ) > ./genmake_cy_md
239 grep true ./genmake_cy_md > /dev/null 2>&1
240 RETVAL=$?
241 rm -f ./genmake_cy_md
242 if test "x$RETVAL" = x0 ; then
243 MAKEDEPEND='$(TOOLSDIR)/cyrus-imapd-makedepend/makedepend'
244 return 0
245 else
246 echo "WARNING: unable to build cyrus-imapd-makedepend"
247 return 1
248 fi
249 }
250
251 # Guess possible config options for this host
252 find_possible_configs() {
253
254 tmp1=`uname`"_"`uname -m`
255 tmp2=`echo $tmp1 | sed -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
256 tmp3=`echo $tmp2 | sed -e 's/power macintosh/ppc/'`
257 tmp1=`echo $tmp3 | sed -e 's|x86_64|amd64|'`
258 tmp2=`echo $tmp1 | sed -e 's/i[3-6]86/ia32/' | sed -e 's/athlon/ia32/'`
259 tmp3=`echo $tmp2 | sed -e 's/cray sv1/craysv1/'`
260 PLATFORM=$tmp3
261 echo $PLATFORM | grep cygwin > /dev/null 2>&1 && PLATFORM=cygwin_ia32
262 OFLIST=`(cd $ROOTDIR/tools/build_options; ls | grep "^$PLATFORM")`
263 echo " The platform appears to be: $PLATFORM"
264
265 echo "test" > test
266 ln -s ./test link
267 RETVAL=$?
268 if test "x${RETVAL}" = x0 ; then
269 LN="ln -s"
270 else
271 echo "Error: \"ln -s\" does not appear to work on this system!"
272 echo " For help, please contact <MITgcm-support@mitgcm.org>."
273 exit 1
274 fi
275 rm -f test link
276
277 if test "x$CPP" = x ; then
278 CPP="cpp -traditional -P"
279 fi
280
281 look_for_makedepend
282
283 #================================================================
284 # look for possible C compilers
285 tmp="$MITGCM_CC $CC gcc c89 cc c99 mpicc"
286 p_CC=
287 for c in $tmp ; do
288 rm -f ./genmake_hello.c ./genmake_hello
289 cat >> genmake_hello.c << EOF
290 #include <stdio.h>
291 int main(int argc, char **argv) {
292 printf("Hello!\n");
293 return 0;
294 }
295 EOF
296 $c -o genmake_hello genmake_hello.c > /dev/null 2>&1
297 RETVAL=$?
298 if test "x${RETVAL}" = x0 ; then
299 p_CC="$p_CC $c"
300 fi
301 done
302 rm -f ./genmake_hello.c ./genmake_hello
303 if test "x${p_CC}" = x ; then
304 cat 1>&2 <<EOF
305
306 Error: No C compilers were found in your path. Please specify one using:
307
308 1) an "optfile" on (eg. "-optfile=path/to/OPTFILE"),
309 2) the CC or MITGCM_CC environment variables.
310
311 EOF
312 exit 1
313 else
314 echo " The possible C compilers found in your path are:"
315 echo " "$p_CC
316 if test "x$CC" = x ; then
317 CC=`echo $p_CC | $AWK '{print $1}'`
318 echo " Setting C compiler to: "$CC
319 fi
320 fi
321
322 #================================================================
323 # look for possible FORTRAN compilers
324 tmp="$MITGCM_FC $FC efc g77 f77 pgf77 pgf95 ifc f90 f95 mpif77 mpf77 mpxlf95 gfortran"
325 p_FC=
326 for c in $tmp ; do
327 rm -f ./hello.f ./hello
328 cat >> hello.f <<EOF
329 program hello
330 do i=1,3
331 print *, 'hello world : ', i
332 enddo
333 end
334 EOF
335 $c -o hello hello.f > /dev/null 2>&1
336 RETVAL=$?
337 if test "x${RETVAL}" = x0 ; then
338 p_FC="$p_FC $c"
339 fi
340 done
341 rm -f ./hello.f ./hello
342 if test "x${p_FC}" = x ; then
343 cat 1>&2 <<EOF
344
345 Error: No Fortran compilers were found in your path. Please specify one using:
346
347 1) an "optfile" on (eg. "-optfile=path/to/OPTFILE"),
348 2) a command-line option (eg. "-fc NAME"), or
349 3) the FC or MITGCM_FC environment variables.
350
351 EOF
352 exit 1
353 else
354 echo " The possible FORTRAN compilers found in your path are:"
355 echo " "$p_FC
356 if test "x$FC" = x ; then
357 FC=`echo $p_FC | $AWK '{print $1}'`
358 echo " Setting FORTRAN compiler to: "$FC
359 fi
360 fi
361
362 if test "x$OPTFILE" = x ; then
363 OPTFILE=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$FC
364 if test ! -r $OPTFILE ; then
365 echo " I looked for the file "$OPTFILE" but did not find it"
366 fi
367 fi
368 # echo " The options file: $p_OF"
369 # echo " appears to match so we'll use it."
370 # for i in $p_FC ; do
371 #p_OF=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$i
372 #if test -r $p_OF ; then
373 # OPTFILE=$p_OF
374 # echo " The options file: $p_OF"
375 # echo " appears to match so we'll use it."
376 # break
377 #fi
378 # done
379 if test "x$OPTFILE" = x ; then
380 cat 1>&2 <<EOF
381
382 Error: No options file was found in: $ROOTDIR/tools/build_options/
383 that matches this platform ("$PLATFORM") and the compilers found in
384 your path. Please specify an "optfile" using:
385
386 1) the command line (eg. "-optfile=path/to/OPTFILE"), or
387 2) the MITGCM_OF environment variable.
388
389 If you need help, please contact the developers at <MITgcm-support@mitgcm.org>.
390
391 EOF
392 exit 1
393 fi
394
395 # # look for possible MPI libraries
396 # mpi_libs=
397 # mpi_fort=`which mpif77 2>/dev/null`
398 # RETVAL=$?
399 # if test "x${RETVAL}" = x0 ; then
400 # cat >>test.f <<EOF
401 # PROGRAM HELLO
402 # DO 10, I=1,10
403 # PRINT *,'Hello World'
404 # 10 CONTINUE
405 # STOP
406 # END
407 # EOF
408 # eval "$mpi_fort -showme test.f > out"
409 # RETVAL=$?
410 # if test "x${RETVAL}" = x0 ; then
411 # a=`cat out`
412 # for i in $a ; do
413 # case $i in
414 # -*)
415 # mpi_libs="$mpi_libs $i" ;;
416 # esac
417 # done
418 # echo "The MPI libs appear to be:"
419 # echo " "$mpi_libs
420 # fi
421 # rm -f test.f out
422 # fi
423
424 }
425
426 # Parse the package dependency information
427 get_pdepend_list() {
428
429 # strip the comments and then convert the dependency file into
430 # two arrays: PNAME, DNAME
431 cat $1 | sed -e 's/#.*$//g' \
432 | $AWK 'BEGIN{nn=0;} (NF>0){ for(i=2;i<=NF;i++){nn++; print "PNAME["nn"]="$1"\nDNAME["nn"]="$i} }' \
433 > ./.pd_tmp
434 . ./.pd_tmp
435 rm -f ./.pd_tmp
436
437 printf "PNAME = "${}
438 }
439
440
441 # Explain usage
442 usage() {
443 cat <<EOF
444
445 Usage: "$0" [OPTIONS]
446 where [OPTIONS] can be:
447
448 -help | --help | -h | --h
449 Print this help message and exit.
450
451 -adoptfile NAME | --adoptfile NAME | -adof NAME | --adof NAME
452 -adoptfile=NAME | --adoptfile=NAME | -adof=NAME | --adof=NAME
453 Use "NAME" as the adoptfile. By default, the file at
454 "tools/adjoint_options/adjoint_default" will be used.
455
456 -nooptfile | --nooptfile
457 -optfile NAME | --optfile NAME | -of NAME | --of NAME
458 -optfile=NAME | --optfile=NAME | -of=NAME | --of=NAME
459 Use "NAME" as the optfile. By default, an attempt will be
460 made to find an appropriate "standard" optfile in the
461 tools/build_options/ directory.
462
463 -pdepend NAME | --pdepend NAME
464 -pdepend=NAME | --pdepend=NAME
465 Get package dependency information from "NAME".
466
467 -pdefault NAME | --pdefault NAME
468 -pdefault=NAME | --pdefault=NAME
469 Get the default package list from "NAME".
470
471 -make NAME | -m NAME
472 --make=NAME | -m=NAME
473 Use "NAME" for the MAKE program. The default is "make" but
474 many platforms, "gmake" is the preferred choice.
475
476 -makefile NAME | -mf NAME
477 --makefile=NAME | -mf=NAME
478 Call the makefile "NAME". The default is "Makefile".
479
480 -makedepend NAME | -md NAME
481 --makedepend=NAME | -md=NAME
482 Use "NAME" for the MAKEDEPEND program.
483
484 -rootdir NAME | --rootdir NAME | -rd NAME | --rd NAME
485 -rootdir=NAME | --rootdir=NAME | -rd=NAME | --rd=NAME
486 Specify the location of the MITgcm ROOTDIR as "NAME".
487 By default, genamke will try to find the location by
488 looking in parent directories (up to the 5th parent).
489
490 -mods NAME | --mods NAME | -mo NAME | --mo NAME
491 -mods=NAME | --mods=NAME | -mo=NAME | --mo=NAME
492 Here, "NAME" specifies a list of directories that are
493 used for additional source code. Files found in the
494 "mods list" are given preference over files of the same
495 name found elsewhere.
496
497 -disable NAME | --disable NAME
498 -disable=NAME | --disable=NAME
499 Here "NAME" specifies a list of packages that we don't
500 want to use. If this violates package dependencies,
501 genamke will exit with an error message.
502
503 -enable NAME | --enable NAME
504 -enable=NAME | --enable=NAME
505 Here "NAME" specifies a list of packages that we wish
506 to specifically enable. If this violates package
507 dependencies, genamke will exit with an error message.
508
509 -standarddirs NAME | --standarddirs NAME
510 -standarddirs=NAME | --standarddirs=NAME
511 Here, "NAME" specifies a list of directories to be
512 used as the "standard" code.
513
514 -fortran NAME | --fortran NAME | -fc NAME | --fc NAME
515 -fc=NAME | --fc=NAME
516 Use "NAME" as the fortran compiler. By default, genmake
517 will search for a working compiler by trying a list of
518 "usual suspects" such as g77, f77, etc.
519
520 -cc NAME | --cc NAME | -cc=NAME | --cc=NAME
521 Use "NAME" as the C compiler. By default, genmake
522 will search for a working compiler by trying a list of
523 "usual suspects" such as gcc, c89, cc, etc.
524
525 -[no]ieee | --[no]ieee
526 Do or don't use IEEE numerics. Note that this option
527 *only* works if it is supported by the OPTFILE that
528 is being used.
529
530 -ts | --ts
531 Produce timing information per timestep
532
533 -mpi | --mpi
534 Include MPI header files and link to MPI libraries
535 -mpi=PATH | --mpi=PATH
536 Include MPI header files and link to MPI libraries using MPI_ROOT
537 set to PATH. i.e. Include files from \$PATH/include, link to libraries
538 from \$PATH/lib and use binaries from \$PATH/bin.
539
540 -bash NAME
541 Explicitly specify the Bourne or BASH shell to use
542
543 While it is most often a single word, the "NAME" variables specified
544 above can in many cases be a space-delimited string such as:
545
546 --enable pkg1 --enable 'pkg1 pkg2' --enable 'pkg1 pkg2 pkg3'
547 -mods=dir1 -mods='dir1' -mods='dir1 dir2 dir3'
548 -foptim='-Mvect=cachesize:512000,transform -xtypemap=real:64,double:64,integer:32'
549
550 which, depending upon your shell, may need to be single-quoted.
551
552 For more detailed genmake documentation, please see:
553
554 http://mitgcm.org/devel_HOWTO/
555
556 EOF
557
558 exit 1
559 }
560
561 # Build a CPP macro to automate calling C routines from FORTRAN
562 get_fortran_c_namemangling() {
563
564 #echo "FC_NAMEMANGLE = \"$FC_NAMEMANGLE\""
565 if test ! "x$FC_NAMEMANGLE" = x ; then
566 return 0
567 fi
568
569 default_nm="#define FC_NAMEMANGLE(X) X ## _"
570
571 cat > genmake_test.c <<EOF
572 void tcall( char * string ) { tsub( string ); }
573 EOF
574 $MAKE genmake_test.o >> genmake_warnings 2>&1
575 RETVAL=$?
576 if test "x$RETVAL" != x0 ; then
577 FC_NAMEMANGLE=$default_nm
578 cat <<EOF>> genmake_errors
579
580 WARNING: C test compile fails
581 WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
582 WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here
583 EOF
584 return 1
585 fi
586 c_tcall=`nm genmake_test.o 2>/dev/null | grep 'T ' | grep tcall | cut -d ' ' -f 3`
587 RETVAL=$?
588 if test "x$RETVAL" != x0 ; then
589 FC_NAMEMANGLE=$default_nm
590 cat <<EOF>> genmake_warnings
591
592 WARNING: The "nm" command failed.
593 WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
594 WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here
595 EOF
596 return 1
597 fi
598 cat > genmake_tcomp.$FS <<EOF
599 subroutine tcall( string )
600 character*(*) string
601 call tsub( string )
602 end
603 EOF
604 $FC $FFLAGS $DEFINES -c genmake_tcomp.$FS >> genmake_warnings 2>&1
605 RETVAL=$?
606 if test "x$RETVAL" != x0 ; then
607 FC_NAMEMANGLE=$default_nm
608 cat <<EOF>> genmake_warnings
609
610 WARNING: FORTRAN test compile fails -- please see "genmake_errors"
611 WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
612 WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here.
613 EOF
614 return 1
615 fi
616 f_tcall=`nm genmake_tcomp.o 2>/dev/null | grep 'T ' | grep tcall | cut -d ' ' -f 3`
617 RETVAL=$?
618 if test "x$RETVAL" != x0 ; then
619 FC_NAMEMANGLE=$default_nm
620 cat <<EOF>> genmake_warnings
621
622 WARNING: The "nm" command failed.
623 WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
624 WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here.
625 EOF
626 return 1
627 fi
628
629 c_a=`echo $c_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 1 | sed -e 's|Y||'`
630 f_a=`echo $f_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 1 | sed -e 's|Y||'`
631 c_b=`echo $c_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 2 | sed -e 's|Y||'`
632 f_b=`echo $f_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 2 | sed -e 's|Y||'`
633
634 nmangle="X"
635 if test "x$c_a" != "x$f_a" ; then
636 comm="echo x$f_a | sed -e 's|x$c_a||'"
637 a=`eval $comm`
638 nmangle="$a ## $nmangle"
639 fi
640 if test "x$c_b" != "x$f_b" ; then
641 comm="echo x$f_b | sed -e 's|x$c_b||'"
642 b=`eval $comm`
643 nmangle="$nmangle ## $b"
644 fi
645
646 FC_NAMEMANGLE="#define FC_NAMEMANGLE(X) $nmangle"
647
648 # cleanup the testing files
649 rm -f genmake_tcomp.* genmake_test.*
650 }
651
652
653 check_HAVE_CLOC() {
654 get_fortran_c_namemangling
655 cat <<EOF > genmake_tc_1.c
656 $FC_NAMEMANGLE
657 #include <stdio.h>
658 #include <stdlib.h>
659 #include <unistd.h>
660 #include <assert.h>
661 #include <sys/time.h>
662 void FC_NAMEMANGLE(cloc) ( double *curtim )
663 {
664 struct timeval tv1;
665 gettimeofday(&tv1 , (void *)NULL );
666 *curtim = (double)((tv1.tv_usec)+(tv1.tv_sec)*1.E6);
667 *curtim = *curtim/1.E6;
668 }
669 EOF
670 make genmake_tc_1.o >> genmake_warnings 2>&1
671 RET_C=$?
672 cat <<EOF > genmake_tc_2.$FS
673 program hello
674 Real*8 wtime
675 external cloc
676 call cloc(wtime)
677 print *," HELLO WORLD", wtime
678 end program hello
679 EOF
680 $FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o >> genmake_warnings 2>&1
681 RET_F=$?
682 test -x ./genmake_tc && ./genmake_tc >> genmake_warnings 2>&1
683 RETVAL=$?
684 if test "x$RETVAL" = x0 ; then
685 HAVE_CLOC=t
686 DEFINES="$DEFINES -DHAVE_CLOC"
687 fi
688 rm -f genmake_tc*
689 }
690
691
692 check_HAVE_STAT() {
693 get_fortran_c_namemangling
694 cat <<EOF > genmake_tc_1.c
695 $FC_NAMEMANGLE
696 #include <stdio.h>
697 #include <stdlib.h>
698 #include <unistd.h>
699 #include <sys/stat.h>
700 #include <sys/types.h>
701 void FC_NAMEMANGLE(tfsize) ( int *nbyte )
702 {
703 char name[512];
704 struct stat astat;
705
706 name[0] = 'a'; name[1] = '\0';
707 if (! stat(name, &astat))
708 *nbyte = (int)(astat.st_size);
709 else
710 *nbyte = -1;
711 }
712 EOF
713 make genmake_tc_1.o >> genmake_tc.log 2>&1
714 RET_C=$?
715 cat <<EOF > genmake_tc_2.$FS
716 program hello
717 integer nbyte
718 call tfsize(nbyte)
719 print *," HELLO WORLD", nbyte
720 end program hello
721 EOF
722 $FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o >> genmake_tc.log 2>&1
723 RET_F=$?
724 test -x ./genmake_tc && ./genmake_tc >> genmake_tc.log 2>&1
725 RETVAL=$?
726 if test "x$RETVAL" = x0 ; then
727 HAVE_STAT=t
728 DEFINES="$DEFINES -DHAVE_STAT"
729 fi
730 rm -f genmake_tc*
731 }
732
733
734 check_netcdf_libs() {
735 if test ! "x$SKIP_NETCDF_CHECK" = x ; then
736 return
737 fi
738 echo "" > genmake_tnc.log
739 cat <<EOF > genmake_tnc.F
740 program fgennc
741 #include "netcdf.inc"
742 EOF
743 if test ! "x$MPI" = x ; then
744 echo '#include "mpif.h"' >> genmake_tnc.F
745 fi
746 cat <<EOF >> genmake_tnc.F
747 integer iret, ncid, xid
748 iret = nf_create('genmake_tnc.nc', NF_CLOBBER, ncid)
749 IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
750 iret = nf_def_dim(ncid, 'X', 11, xid)
751 IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
752 iret = nf_close(ncid)
753 IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
754 end
755 EOF
756 echo "Executing:" > genmake_tnc.log
757 echo " $CPP $DEFINES $INCLUDES genmake_tnc.F > genmake_tnc.$FS" \
758 > genmake_tnc.log
759 RET_CPP=f
760 $CPP $DEFINES $INCLUDES genmake_tnc.F > genmake_tnc.$FS 2>/dev/null \
761 && RET_CPP=t
762 if test "x$RET_CPP" = xf ; then
763 echo " WARNING: CPP failed to pre-process the netcdf test." \
764 > genmake_tnc.log
765 echo " Please check that \$INCLUDES is properly set." \
766 > genmake_tnc.log
767 fi
768 echo "Executing:" > genmake_tnc.log
769 echo " $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS" > genmake_tnc.log
770 echo " $LINK -o genmake_tnc.o $LIBS" > genmake_tnc.log
771 $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1 \
772 && $LINK -o genmake_tnc genmake_tnc.o $LIBS >> genmake_tnc.log 2>&1
773 RET_COMPILE=$?
774
775 #EH3 Remove test program execution for machines that either disallow
776 #EH3 execution or cannot support it (eg. cross-compilers)
777 #EH3
778 #EH3 test -x ./genmake_tnc && ./genmake_tnc >> genmake_tnc.log 2>&1
779 #EH3 RETVAL=$?
780 #EH3 if test "x$RET_COMPILE" = x0 -a "x$RETVAL" = x0 ; then
781
782 if test "x$RET_COMPILE" = x0 ; then
783 HAVE_NETCDF=t
784 else
785 # try again with "-lnetcdf" added to the libs
786 $CPP $DEFINES $INCLUDES genmake_tnc.F > genmake_tnc.$FS 2>/dev/null \
787 && $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1 \
788 && $LINK -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf >> genmake_tnc.log 2>&1
789 RET_COMPILE=$?
790 if test "x$RET_COMPILE" = x0 ; then
791 LIBS="$LIBS -lnetcdf"
792 HAVE_NETCDF=t
793 else
794 cat genmake_tnc.log >> genmake_warnings
795 fi
796 fi
797 rm -f genmake_tnc*
798 }
799
800
801
802 ###############################################################################
803 # Sequential part of script starts here
804 ###############################################################################
805
806 # Set defaults here
807 COMMANDL="$0 $@"
808
809 PLATFORM=
810 LN=
811 S64=
812 KPP=
813 #FC=
814 #CC=gcc
815 #CPP=
816 LINK=
817 DEFINES=
818 PACKAGES=
819 ENABLE=
820 DISABLE=
821 # MAKEFILE=
822 # MAKEDEPEND=
823 PDEPEND=
824 DUMPSTATE=t
825 PDEFAULT=
826 OPTFILE=
827 INCLUDES="-I. $INCLUDES"
828 FFLAGS=
829 FOPTIM=
830 CFLAGS=
831 KFLAGS1=
832 KFLAGS2=
833 #LDADD=
834 LIBS=
835 KPPFILES=
836 NOOPTFILES=
837 NOOPTFLAGS=
838 MPI=
839 MPIPATH=
840 TS=
841
842 # DEFINES checked by test compilation or command-line
843 HAVE_SYSTEM=
844 HAVE_FDATE=
845 FC_NAMEMANGLE=
846 HAVE_CLOC=
847 HAVE_STAT=
848 HAVE_NETCDF=
849 HAVE_ETIME=
850 IGNORE_TIME=
851
852 MODS=
853 TOOLSDIR=
854 SOURCEDIRS=
855 INCLUDEDIRS=
856 STANDARDDIRS="USE_THE_DEFAULT"
857
858 G2ARGS=
859 BASH=
860 PWD=`pwd`
861 test "x$MAKE" = x && MAKE=make
862 test "x$AWK" = x && AWK=awk
863 THISHOST=`hostname`
864 THISCWD=`pwd`
865 THISDATE=`date`
866 THISUSER=`echo $USER`
867 THISVER=
868 MACHINE=`uname -a`
869 EXECUTABLE=
870 EXEHOOK=
871 EXEDIR=
872 PACKAGES_CONF=
873 IEEE=
874 if test "x$MITGCM_IEEE" != x ; then
875 IEEE=$MITGCM_IEEE
876 fi
877 FS=
878 FS90=
879
880 AUTODIFF_PKG_USED=f
881 AD_OPTFILE=
882 TAF=
883 AD_TAF_FLAGS=
884 FTL_TAF_FLAGS=
885 SVD_TAF_FLAGS=
886 TAF_EXTRA=
887 TAMC=
888 AD_TAMC_FLAGS=
889 FTL_TAF_FLAGS=
890 SVD_TAMC_FLAGS=
891 TAMC_EXTRA=
892
893
894 # The following state can be set directly by command-line switches
895 gm_s1="OPTFILE PDEPEND PDEFAULT MAKEFILE PLATFORM ROOTDIR MODS DISABLE ENABLE"
896 gm_s2="FC CPP IEEE TS MPI JAM DUMPSTATE STANDARDDIRS"
897
898 # The following state is not directly set by command-line switches
899 gm_s3="LN S64 KPP LINK PACKAGES MAKEDEPEND PDEPEND PDEFAULT INCLUDES FFLAGS FOPTIM "
900 gm_s4="CFLAGS KFLAGS1 KFLAGS2 LIBS KPPFILES NOOPTFILES NOOPTFLAGS"
901 gm_s5="TOOLSDIR SOURCEDIRS INCLUDEDIRS PWD MAKE THISHOST THISUSER THISDATE THISVER MACHINE"
902 gm_s6="EXECUTABLE EXEHOOK EXEDIR PACKAGES_CONF"
903 gm_s7="HAVE_SYSTEM HAVE_FDATE FC_NAMEMANGLE HAVE_ETIME"
904
905 # The following are all related to adjoint/tangent-linear stuff
906 gm_s10="AUTODIFF_PKG_USED AD_OPTFILE TAMC TAF AD_TAMC_FLAGS AD_TAF_FLAGS"
907 gm_s11="FTL_TAMC_FLAGS FTL_TAF_FLAGS SVD_TAMC_FLAGS SVD_TAF_FLAGS"
908 gm_s12="TAF_EXTRA TAMC_EXTRA"
909
910 gm_state="COMMANDL $gm_s1 $gm_s2 $gm_s3 $gm_s4 $gm_s5 $gm_s6 $gm_s7"
911 gm_state="$gm_state $gm_s10 $gm_s11 $gm_s12"
912
913 cat <<EOF
914
915 GENMAKE :
916
917 A program for GENerating MAKEfiles for the MITgcm project. For a
918 quick list of options, use "genmake -h" or for more detail see:
919
920 http://mitgcm.org/devel_HOWTO/
921
922 EOF
923
924 echo "=== Processing options files and arguments ==="
925 gm_local="genmake_local"
926 modsCount=0
927 for i in . $MODS ; do
928 if test -r $i/$gm_local ; then
929 . $i/$gm_local
930 break
931 fi
932 let modsCount=modsCount+1
933 done
934 if test modsCount -gt 1 ; then
935 echo "ERROR: some uses of MODS break with more than one directory specified"
936 exit -1;
937 fi
938 printf " getting local config information: "
939 if test -f $gm_local ; then
940 echo "using $gm_local"
941 . $gm_local
942 # echo "DISABLE=$DISABLE"
943 # echo "ENABLE=$ENABLE"
944 else
945 echo "none found"
946 fi
947
948 #echo "$0::$1:$2:$3:$4:$5:$6:$7:"
949 #OPTIONS=
950 #n=0
951 #for i ; do
952 # echo "$i $n"
953 # setvar="OPTIONS[$n]='$i'"
954 # # echo " $setvar"
955 # eval "$setvar"
956 # n=$(( $n + 1 ))
957 #done
958 #parse_options
959 ac_prev=
960 for ac_option in "$@" ; do
961
962 G2ARGS="$G2ARGS \"$ac_option\""
963
964 # If the previous option needs an argument, assign it.
965 if test -n "$ac_prev"; then
966 eval "$ac_prev=\$ac_option"
967 ac_prev=
968 continue
969 fi
970
971 ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
972
973 case $ac_option in
974
975 -help | --help | -h | --h)
976 usage ;;
977
978 -nooptfile | --nooptfile)
979 OPTFILE="NONE" ;;
980 -optfile | --optfile | -of | --of)
981 ac_prev=OPTFILE ;;
982 -optfile=* | --optfile=* | -of=* | --of=*)
983 OPTFILE=$ac_optarg ;;
984
985 -adoptfile | --adoptfile | -adof | --adof)
986 ac_prev=AD_OPTFILE ;;
987 -adoptfile=* | --adoptfile=* | -adof=* | --adof=*)
988 AD_OPTFILE=$ac_optarg ;;
989
990 -pdepend | --pdepend)
991 ac_prev=PDEPEND ;;
992 -pdepend=* | --pdepend=*)
993 PDEPEND=$ac_optarg ;;
994
995 -pdefault | --pdefault)
996 ac_prev=PDEFAULT ;;
997 -pdefault=* | --pdefault=*)
998 PDEFAULT=$ac_optarg ;;
999
1000 -make | --make | -m | --m)
1001 ac_prev=MAKE ;;
1002 -make=* | --make=* | -m=* | --m=*)
1003 MAKE=$ac_optarg ;;
1004
1005 -bash | --bash)
1006 ac_prev=BASH ;;
1007 -bash=* | --bash=*)
1008 BASH=$ac_optarg ;;
1009
1010 -makedepend | --makedepend | -md | --md)
1011 ac_prev=MAKEDEPEND ;;
1012 -makedepend=* | --makedepend=* | -md=* | --md=*)
1013 MAKEDEPEND=$ac_optarg ;;
1014
1015 -makefile | --makefile | -ma | --ma)
1016 ac_prev=MAKEFILE ;;
1017 -makefile=* | --makefile=* | -ma=* | --ma=*)
1018 MAKEFILE=$ac_optarg ;;
1019
1020 -platform | --platform | -pl | --pl | -platform=* | --platform=* | -pl=* | --pl=*)
1021 echo "ERROR: The platform option has been removed. Please specify"
1022 echo " the build options using the \"optfile\" mechanism."
1023 echo
1024 usage
1025 ;;
1026
1027 -rootdir | --rootdir | -rd | --rd)
1028 ac_prev=ROOTDIR ;;
1029 -rootdir=* | --rootdir=* | -rd=* | --rd=*)
1030 ROOTDIR=$ac_optarg ;;
1031
1032 -mods | --mods | -mo | --mo)
1033 ac_prev=MODS ;;
1034 -mods=* | --mods=* | -mo=* | --mo=*)
1035 MODS=$ac_optarg ;;
1036
1037 -disable | --disable)
1038 ac_prev=DISABLE ;;
1039 -disable=* | --disable=*)
1040 DISABLE=$ac_optarg ;;
1041
1042 -enable | --enable)
1043 ac_prev=ENABLE ;;
1044 -enable=* | --enable=*)
1045 ENABLE=$ac_optarg ;;
1046
1047 -standarddirs | --standarddirs)
1048 ac_prev=STANDARDDIRS ;;
1049 -standarddirs=* | --standarddirs=*)
1050 STANDARDDIRS=$ac_optarg ;;
1051
1052 # -cpp | --cpp)
1053 # ac_prev=cpp ;;
1054 # -cpp=* | --cpp=*)
1055 # CPP=$ac_optarg ;;
1056
1057 -cc | --cc)
1058 ac_prev=CC ;;
1059 -cc=* | --cc=*)
1060 CC=$ac_optarg ;;
1061
1062 -fortran | --fortran | -fc | --fc)
1063 ac_prev=FC ;;
1064 -fc=* | --fc=*)
1065 FC=$ac_optarg ;;
1066
1067 -fs | --fs)
1068 ac_prev=FS ;;
1069 -fs=* | --fs=*)
1070 FS=$ac_optarg ;;
1071
1072 -fs90 | --fs90)
1073 ac_prev=FS90 ;;
1074 -fs90=* | --fs90=*)
1075 FS90=$ac_optarg ;;
1076
1077 -ieee | --ieee)
1078 IEEE=true ;;
1079 -noieee | --noieee)
1080 IEEE= ;;
1081
1082 -ts | --ts)
1083 TS=true ;;
1084
1085 -mpi | --mpi)
1086 MPI=true ;;
1087 -mpi=* | --mpi=*)
1088 MPIPATH=$ac_optarg
1089 MPI=true ;;
1090
1091 # -jam | --jam)
1092 # JAM=1 ;;
1093 # -nojam | --nojam)
1094 # JAM=0 ;;
1095
1096 -ds | --ds)
1097 DUMPSTATE=t ;;
1098
1099 -taf_extra | --taf_extra)
1100 ac_prev=TAF_EXTRA ;;
1101 -taf_extra=* | --taf_extra=*)
1102 TAF_EXTRA=$ac_optarg ;;
1103
1104 -tamc_extra | --tamc_extra)
1105 ac_prev=TAMC_EXTRA ;;
1106 -tamc_extra=* | --tamc_extra=*)
1107 TAMC_EXTRA=$ac_optarg ;;
1108
1109 -ignoretime | -ignore_time | --ignoretime | --ignore_time)
1110 IGNORE_TIME="-DIGNORE_TIME" ;;
1111
1112 -*)
1113 echo "Error: unrecognized option: "$ac_option
1114 usage
1115 ;;
1116
1117 *)
1118 echo "Error: unrecognized argument: "$ac_option
1119 usage
1120 ;;
1121
1122 esac
1123
1124 done
1125
1126
1127 if test -f ./.genmakerc ; then
1128 echo
1129 echo "WARNING: genmake2 has detected a copy of the old-style \"./.genmakerc\""
1130 echo " file. This file format is no longer supported. Please see:"
1131 echo
1132 echo " http://mitgcm.org/devel_HOWTO/"
1133 echo
1134 echo " for directions on how to setup and use the new \"genmake2\" input"
1135 echo " files and send an email to MITgcm-support@mitgcm.org if you want help."
1136 echo
1137 fi
1138
1139 # Find the MITgcm ${ROOTDIR}
1140 if test "x${ROOTDIR}" = x ; then
1141 tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1142 if test "x$tmp" = "xbin" -a -d ../model -a -d ../eesup -a -d ../pkg ; then
1143 ROOTDIR=".."
1144 else
1145 for d in . .. ../.. ../../.. ../../../.. ../../../../.. ; do
1146 if [ -d "$d/model" -a -d "$d/eesupp" -a -d "$d/pkg" ]; then
1147 ROOTDIR=$d
1148 printf "Warning: ROOTDIR was not specified but there appears to be"
1149 echo " a copy of MITgcm at \"$ROOTDIR\" so we'll try it."
1150 break
1151 fi
1152 done
1153 fi
1154 fi
1155 if test "x${ROOTDIR}" = x ; then
1156 echo "Error: Cannot determine ROOTDIR for MITgcm code."
1157 echo " Please specify a ROOTDIR using either an options "
1158 echo " file or a command-line option."
1159 exit 1
1160 fi
1161 if test ! -d ${ROOTDIR} ; then
1162 echo "Error: the specified ROOTDIR (\"$ROOTDIR\") does not exist!"
1163 exit 1
1164 fi
1165
1166 # Find the MITgcm ${THISVER}
1167 if test -f "${ROOTDIR}/doc/tag-index" ; then
1168 THISVER=`grep '^checkpoint' ${ROOTDIR}/doc/tag-index | head -1`
1169 fi
1170
1171 if test "x$MAKEFILE" = x ; then
1172 MAKEFILE="Makefile"
1173 fi
1174
1175 echo " getting OPTFILE information: "
1176 if test "x${OPTFILE}" = x ; then
1177 if test "x$MITGCM_OF" = x ; then
1178 echo "Warning: no OPTFILE specified so we'll look for possible settings"
1179 printf "\n=== Searching for possible settings for OPTFILE ===\n"
1180 find_possible_configs
1181 else
1182 OPTFILE=$MITGCM_OF
1183 fi
1184 fi
1185 if test "x$OPTFILE" != xNONE ; then
1186 if test -f "$OPTFILE" -a -r "$OPTFILE" ; then
1187 echo " using OPTFILE=\"$OPTFILE\""
1188 . "$OPTFILE"
1189 RETVAL=$?
1190 if test "x$RETVAL" != x0 ; then
1191 printf "Error: failed to source OPTFILE \"$OPTFILE\""
1192 echo "--please check that variable syntax is bash-compatible"
1193 exit 1
1194 fi
1195 if test "x$DUMPSTATE" != xf ; then
1196 cp -f $OPTFILE "genmake_optfile"
1197 fi
1198 else
1199 echo "Error: can't read OPTFILE=\"$OPTFILE\""
1200 exit 1
1201 fi
1202 fi
1203
1204 echo " getting AD_OPTFILE information: "
1205 if test "x${AD_OPTFILE}" = x ; then
1206 if test "x$MITGCM_AD_OF" = x ; then
1207 AD_OPTFILE=$ROOTDIR/tools/adjoint_options/adjoint_default
1208 else
1209 AD_OPTFILE=$MITGCM_AD_OF
1210 fi
1211 fi
1212 if test "x${AD_OPTFILE}" != xNONE ; then
1213 if test -f "$AD_OPTFILE" -a -r "$AD_OPTFILE" ; then
1214 echo " using AD_OPTFILE=\"$AD_OPTFILE\""
1215 . "$AD_OPTFILE"
1216 RETVAL=$?
1217 if test "x$RETVAL" != x0 ; then
1218 printf "Error: failed to source AD_OPTFILE \"$AD_OPTFILE\""
1219 echo "--please check that variable syntax is bash-compatible"
1220 exit 1
1221 fi
1222 if test "x$DUMPSTATE" != xf ; then
1223 cp -f $AD_OPTFILE "genmake_ad_optfile"
1224 fi
1225 else
1226 echo "Error: can't read AD_OPTFILE=\"$AD_OPTFILE\""
1227 exit 1
1228 fi
1229 fi
1230
1231 #====================================================================
1232 # Set default values if not set by the optfile
1233 #
1234 # Check that FC, CC, LINK, CPP, S64, LN, and MAKE are defined. If not,
1235 # either set defaults or complain and abort!
1236 if test ! "x$BASH" = x ; then
1237 # add a trailing space so that it works within the Makefile syntax (see below)
1238 BASH="$BASH "
1239 fi
1240 if test "x$FC" = x ; then
1241 cat <<EOF 1>&2
1242
1243 Error: no Fortran compiler: please specify using one of the following:
1244 1) within the options file ("FC=...") as specified by "-of=OPTFILE"
1245 2) the "-fc=XXX" command-line option
1246 3) the "./genmake_local" file
1247 EOF
1248 exit 1
1249 fi
1250 if test "x$CC" = x ; then
1251 CC=cc
1252 # cat <<EOF 1>&2
1253 # Error: no C compiler: please specify using one of the following:
1254 # 1) within the options file ("CC=...") as specified by "-of=OPTFILE"
1255 # 2) the "-cc=XXX" command-line option
1256 # 3) the "./genmake_local" file
1257 # EOF
1258 # exit 1
1259 fi
1260 if test "x$LINK" = x ; then
1261 LINK=$FC
1262 fi
1263 if test "x$MAKE" = x ; then
1264 MAKE="make"
1265 fi
1266 if test "x$CPP" = x ; then
1267 CPP=cpp
1268 fi
1269 #EH3 === UGLY ===
1270 # The following is an ugly little hack to check for $CPP in /lib/ and
1271 # it should eventually be replaced with a more general function that
1272 # searches a combo of the user's path and a list of "usual suspects"
1273 # to find the correct location for binaries such as $CPP.
1274 for i in " " "/lib/" ; do
1275 echo "#define A a" | $i$CPP > test_cpp 2>&1 && CPP=$i$CPP
1276 done
1277 #EH3 === UGLY ===
1278 echo "#define A a" | $CPP > test_cpp 2>&1
1279 RETVAL=$?
1280 if test "x$RETVAL" != x0 ; then
1281 cat <<EOF 1>&2
1282
1283 Error: C pre-processor "$CPP" failed the test case: please specify using:
1284
1285 1) within the options file ("CPP=...") as specified by "-of=OPTFILE"
1286 2) the "./genmake_local" file
1287 3) with the CPP environment variable
1288
1289 EOF
1290 exit 1
1291 else
1292 rm -f test_cpp
1293 fi
1294 look_for_makedepend
1295 if test "x$LN" = x ; then
1296 LN="ln -s"
1297 fi
1298 echo "test" > genmake_test_ln
1299 $LN genmake_test_ln genmake_tlink
1300 RETVAL=$?
1301 if test "x$RETVAL" != x0 ; then
1302 cat <<EOF 1>&2
1303
1304 Error: The command "ln -s" failed -- please specify a working soft-link
1305 command in the optfile.
1306
1307 EOF
1308 exit 1
1309 fi
1310 rm -f genmake_test_ln genmake_tlink
1311
1312 # Check for broken *.F/*.f handling and fix if possible
1313 check_for_broken_Ff
1314
1315 if test ! "x$MPI" = x ; then
1316 echo " Turning on MPI cpp macros"
1317 DEFINES="$DEFINES -DALLOW_USE_MPI -DALWAYS_USE_MPI"
1318 fi
1319
1320 if test ! "x$TS" = x ; then
1321 echo " Turning on timing per timestep"
1322 DEFINES="$DEFINES -DTIME_PER_TIMESTEP"
1323 fi
1324
1325 printf "\n=== Checking system libraries ===\n"
1326 printf " Do we have the system() command using $FC... "
1327 cat > genmake_tcomp.$FS <<EOF
1328 program hello
1329 call system('echo hi')
1330 end
1331 EOF
1332 $FC $FFLAGS $DEFINES -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1333 RETVAL=$?
1334 if test "x$RETVAL" = x0 ; then
1335 HAVE_SYSTEM=t
1336 DEFINES="$DEFINES -DHAVE_SYSTEM"
1337 echo "yes"
1338 else
1339 HAVE_SYSTEM=
1340 echo "no"
1341 fi
1342 rm -f genmake_tcomp*
1343
1344 printf " Do we have the fdate() command using $FC... "
1345 cat > genmake_tcomp.$FS <<EOF
1346 program hello
1347 CHARACTER(128) string
1348 string = ' '
1349 call fdate( string )
1350 print *, string
1351 end
1352 EOF
1353 $FC $FFLAGS $DEFINES -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1354 RETVAL=$?
1355 if test "x$RETVAL" = x0 ; then
1356 HAVE_FDATE=t
1357 DEFINES="$DEFINES -DHAVE_FDATE"
1358 echo "yes"
1359 else
1360 HAVE_FDATE=
1361 echo "no"
1362 fi
1363 rm -f genmake_tcomp*
1364
1365 printf " Do we have the etime() command using $FC... "
1366 cat > genmake_tcomp.$FS <<EOF
1367 program hello
1368 REAL*4 ACTUAL, TARRAY(2)
1369 EXTERNAL ETIME
1370 REAL*4 ETIME
1371 actual = etime( tarray )
1372 print *, tarray
1373 end
1374 EOF
1375 $FC $FFLAGS $DEFINES -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1376 RETVAL=$?
1377 if test "x$RETVAL" = x0 ; then
1378 HAVE_ETIME=t
1379 DEFINES="$DEFINES -DHAVE_ETIME"
1380 echo "yes"
1381 else
1382 HAVE_ETIME=
1383 echo "no"
1384 fi
1385 rm -f genmake_tcomp*
1386
1387 printf " Can we call simple C routines (here, \"cloc()\") using $FC... "
1388 check_HAVE_CLOC
1389 if test "x$HAVE_CLOC" != x ; then
1390 echo "yes"
1391 else
1392 echo "no"
1393 fi
1394 rm -f genmake_t*
1395
1396 printf " Can we use stat() through C calls... "
1397 check_HAVE_STAT
1398 if test "x$HAVE_STAT" != x ; then
1399 echo "yes"
1400 else
1401 echo "no"
1402 fi
1403 rm -f genmake_t*
1404
1405 printf " Can we create NetCDF-enabled binaries... "
1406 check_netcdf_libs
1407 if test "x$HAVE_NETCDF" != x ; then
1408 echo "yes"
1409 else
1410 echo "no"
1411 fi
1412 DEFINES="$DEFINES $IGNORE_TIME"
1413
1414 printf "\n=== Setting defaults ===\n"
1415 printf " Adding MODS directories: "
1416 for d in $MODS ; do
1417 if test ! -d $d ; then
1418 echo
1419 echo "Error: MODS directory \"$d\" not found!"
1420 exit 1
1421 else
1422 printf " $d"
1423 SOURCEDIRS="$SOURCEDIRS $d"
1424 INCLUDEDIRS="$INCLUDEDIRS $d"
1425 fi
1426 done
1427 echo
1428
1429 if test "x${PLATFORM}" = x ; then
1430 PLATFORM=$p_PLATFORM
1431 fi
1432
1433 if test "x${EXEDIR}" = x ; then
1434 tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1435 if test "x$tmp" = "xbin" -a -d ../exe -a $ROOTDIR = .. ; then
1436 EXEDIR=../exe
1437 else
1438 EXEDIR=.
1439 fi
1440 fi
1441 if test ! -d ${EXEDIR} ; then
1442 echo "Error: the specified EXEDIR (\"$EXEDIR\") does not exist!"
1443 exit 1
1444 fi
1445
1446 if test "x${TOOLSDIR}" = x ; then
1447 TOOLSDIR="$ROOTDIR/tools"
1448 fi
1449 if test ! -d ${TOOLSDIR} ; then
1450 echo "Error: the specified TOOLSDIR (\"$TOOLSDIR\") does not exist!"
1451 exit 1
1452 fi
1453 if test "x$S64" = x ; then
1454 echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.sh > /dev/null 2>&1
1455 RETVAL=$?
1456 if test "x${RETVAL}" = x0 ; then
1457 S64='$(TOOLSDIR)/set64bitConst.sh'
1458 else
1459 echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.csh > /dev/null 2>&1
1460 RETVAL=$?
1461 if test "x${RETVAL}" = x0 ; then
1462 S64='$(TOOLSDIR)/set64bitConst.csh'
1463 else
1464 cat <<EOF
1465
1466 ERROR: neither of the two default scripts:
1467
1468 ${TOOLSDIR}/set64bitConst.sh
1469 ${TOOLSDIR}/set64bitConst.csh
1470
1471 are working so please check paths or specify (with \$S64) a
1472 working version of this script.
1473
1474 EOF
1475 exit 1
1476 fi
1477 fi
1478 fi
1479 THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`
1480
1481 EXECUTABLE=${EXECUTABLE:-mitgcmuv}
1482
1483 # We have a special set of source files in eesupp/src which are
1484 # generated from some template source files. We'll make them first so
1485 # they appear as regular source code
1486 if test -r $ROOTDIR"/eesupp/src/Makefile" ; then
1487 echo " Making source files in eesupp from templates"
1488 ( cd $ROOTDIR"/eesupp/src/" && $MAKE ) > make_eesupp.errors 2>&1
1489 RETVAL=$?
1490 if test "x${RETVAL}" = x0 ; then
1491 rm -f make_eesupp.errors
1492 else
1493 echo "Error: problem encountered while building source files in eesupp:"
1494 cat make_eesupp.errors 1>&2
1495 exit 1
1496 fi
1497 fi
1498
1499 #same for exch2
1500 if test -r $ROOTDIR"/pkg/exch2/Makefile" ; then
1501 echo " Making source files in exch2 from templates"
1502 ( cd $ROOTDIR"/pkg/exch2/" && $MAKE ) > make_exch2.errors 2>&1
1503 RETVAL=$?
1504 if test "x${RETVAL}" = x0 ; then
1505 rm -f make_exch2.errors
1506 else
1507 echo "Error: problem encountered while building source files in exch2:"
1508 cat make_exch2.errors 1>&2
1509 exit 1
1510 fi
1511 fi
1512
1513 printf "\n=== Determining package settings ===\n"
1514 if test "x${PDEPEND}" = x ; then
1515 tmp=$ROOTDIR"/pkg/pkg_depend"
1516 if test -r $tmp ; then
1517 PDEPEND=$tmp
1518 else
1519 echo "Warning: No package dependency information was specified."
1520 echo " Please check that ROOTDIR/pkg/pkg_depend exists."
1521 fi
1522 else
1523 if test ! -r ${PDEPEND} ; then
1524 echo "Error: can't read package dependency info from PDEPEND=\"$PDEPEND\""
1525 exit 1
1526 fi
1527 fi
1528 echo " getting package dependency info from $PDEPEND"
1529 # Strip the comments and then convert the dependency file into
1530 # two arrays: PNAME, DNAME
1531 cat $PDEPEND | sed -e 's/#.*$//g' \
1532 | $AWK 'BEGIN{nn=-1;} (NF>0){ for(i=2;i<=NF;i++){nn++; print "PNAME_"nn"="$1"\nDNAME_"nn"="$i}} END{print "nname="nn}' \
1533 > ./.pd_tmp
1534 RETVAL=$?
1535 if test ! "x${RETVAL}" = x0 ; then
1536 echo "Error: unable to parse package dependencies -- please check PDEPEND=\"$PDEPEND\""
1537 exit 1
1538 fi
1539 . ./.pd_tmp
1540 rm -f ./.pd_tmp
1541
1542 # Search for default packages. Note that a "$ROOTDIR/pkg/pkg_groups"
1543 # file should eventually be added so that, for convenience, one can
1544 # specify groups of packages using names like "ocean" and "atmosphere".
1545 echo " checking default package list: "
1546 if test "x${PDEFAULT}" = x ; then
1547 for i in "." $MODS ; do
1548 if test -r $i"/packages.conf" ; then
1549 PDEFAULT=$i"/packages.conf"
1550 break
1551 fi
1552 done
1553 fi
1554 if test "x${PDEFAULT}" = x ; then
1555 PDEFAULT="$ROOTDIR/pkg/pkg_default"
1556 fi
1557 if test "x${PDEFAULT}" = xNONE ; then
1558 echo " default packages file disabled"
1559 else
1560 if test ! -r $PDEFAULT ; then
1561 echo "Warning: can't read default packages from PDEFAULT=\"$PDEFAULT\""
1562 else
1563 echo " using PDEFAULT=\"$PDEFAULT\""
1564 # Strip the comments and add all the names
1565 def=`cat $PDEFAULT | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
1566 RETVAL=$?
1567 if test "x${RETVAL}" != x0 ; then
1568 printf "Error: can't parse default package list "
1569 echo "-- please check PDEFAULT=\"$PDEFAULT\""
1570 exit 1
1571 fi
1572 for i in $def ; do
1573 PACKAGES="$PACKAGES $i"
1574 done
1575 echo " before group expansion packages are: $PACKAGES"
1576 RET=1
1577 while test $RET = 1 ; do expand_pkg_groups; RET=$?; done
1578 echo " after group expansion packages are: $PACKAGES"
1579 fi
1580 fi
1581
1582 echo " applying DISABLE settings"
1583 for i in $PACKAGES ; do
1584 echo $i >> ./.tmp_pack
1585 done
1586 for i in `grep "-" ./.tmp_pack` ; do
1587 j=`echo $i | sed 's/[-]//'`
1588 DISABLE="$DISABLE $j"
1589 done
1590 pack=
1591 for p in $PACKAGES ; do
1592 addit="t"
1593 for d in $DISABLE ; do
1594 if test "x$p" = "x$d" ; then
1595 addit="f"
1596 fi
1597 done
1598 if test "x$addit" = xt ; then
1599 pack="$pack $p"
1600 fi
1601 done
1602 PACKAGES="$pack"
1603 echo " applying ENABLE settings"
1604 echo "" > ./.tmp_pack
1605 PACKAGES="$PACKAGES $ENABLE"
1606 # Test if each explicitly referenced package exists
1607 for i in $PACKAGES ; do
1608 j=`echo $i | sed 's/[-+]//'`
1609 if test ! -d "$ROOTDIR/pkg/$j" ; then
1610 echo "Error: can't find package $i at \"$ROOTDIR/pkg/$i\""
1611 exit 1
1612 fi
1613 echo $i >> ./.tmp_pack
1614 done
1615 PACKAGES=
1616 for i in `grep -v "-" ./.tmp_pack | sort | uniq` ; do
1617 PACKAGES="$PACKAGES $i"
1618 done
1619 rm -f ./.tmp_pack
1620 echo " packages are: $PACKAGES"
1621
1622 # Check availability of NetCDF and then either build the MNC template
1623 # files or delete mnc from the list of available packages.
1624 echo $PACKAGES | grep ' mnc ' > /dev/null 2>&1
1625 RETVAL=$?
1626 if test "x$RETVAL" = x0 ; then
1627 if test "x$HAVE_NETCDF" != xt ; then
1628 cat <<EOF
1629
1630 *********************************************************************
1631 WARNING: the "mnc" package was enabled but tests failed to compile
1632 NetCDF applications. Please check that:
1633
1634 1) NetCDF is correctly installed for this compiler and
1635 2) the LIBS variable (within the "optfile") specifies the correct
1636 NetCDF library to link against.
1637
1638 Due to this failure, the "mnc" package is now DISABLED.
1639 *********************************************************************
1640
1641 EOF
1642 PACKAGES=`echo $PACKAGES | sed -e 's/mnc//g'`
1643 DISABLE="$DISABLE mnc"
1644 else
1645 ( cd $ROOTDIR"/pkg/mnc" && $MAKE testclean && $MAKE templates ) > make_mnc.errors 2>&1
1646 RETVAL=$?
1647 if test "x${RETVAL}" = x0 ; then
1648 rm -f make_mnc.errors
1649 else
1650 echo "Error: problem encountered while building source files in pkg/mnc:"
1651 cat make_mnc.errors 1>&2
1652 exit 1
1653 fi
1654 fi
1655 fi
1656
1657 echo " applying package dependency rules"
1658 ck=
1659 while test "x$ck" != xtt ; do
1660 i=0
1661 # rtot=${#PNAME[@]}
1662 rtot=$nname
1663 while test $i -lt $rtot ; do
1664
1665 # Is $pname in the current $PACKAGES list?
1666 # pname=${PNAME[$i]}
1667 tmp="pname=\"\$PNAME_$i\""
1668 eval $tmp
1669 pin="f"
1670 for p in $PACKAGES ; do
1671 if test "x$p" = "x$pname" ; then
1672 pin="t"
1673 fi
1674 done
1675
1676 # Is the DNAME entry a (+) or (-) rule ?
1677 tmp="dname=\"\$DNAME_$i\""
1678 eval $tmp
1679 plus="-"
1680 echo $dname | grep '^+' > /dev/null 2>&1
1681 RETVAL=$?
1682 if test "x$RETVAL" = x0 ; then
1683 plus="+"
1684 fi
1685
1686 # Is $dname in the current $PACKAGES list?
1687 dname=`echo $dname | sed -e 's/^[+-]//'`
1688 din="f"
1689 for p in $PACKAGES ; do
1690 if test "x$p" = "x$dname" ; then
1691 din="t"
1692 fi
1693 done
1694
1695 # Do we need to add $dname according to the dependency rules?
1696 if test "x$pin" = xt -a "x$plus" = "x+" -a "x$din" = xf ; then
1697 in_dis="f"
1698 for dis in $DISABLE ; do
1699 if test "x$dis" = "x$dname" ; then
1700 in_dis="t"
1701 fi
1702 done
1703 if test "x$in_dis" = xt ; then
1704 echo "Error: can't satisfy package dependencies:"
1705 echo " \"$dname\" is required by the dependency rules"
1706 echo " but is disallowed by the DISABLE settings"
1707 exit 1
1708 else
1709 PACKAGES="$PACKAGES $dname"
1710 ck=
1711 fi
1712 fi
1713
1714 # Do we need to get rid of $dname according to the dependency rules?
1715 if test "x$pin" = xt -a "x$plus" = "x-" -a "x$din" = xt; then
1716 echo "Error: can't satisfy package dependencies:"
1717 echo " \"$pname\" was requested but is disallowed by"
1718 echo " the dependency rules for \"$dname\""
1719 exit 1
1720 fi
1721 i=`echo "$i + 1" | bc -l`
1722 #i=$(( $i + 1 ))
1723 done
1724 ck=$ck"t"
1725 done
1726 echo " packages are: $PACKAGES"
1727 for i in $PACKAGES ; do
1728 adr="$ROOTDIR/pkg/$i"
1729 if test -d $adr ; then
1730 SOURCEDIRS="$SOURCEDIRS $adr"
1731 INCLUDEDIRS="$INCLUDEDIRS $adr"
1732 if test "x$i" = xautodiff ; then
1733 AUTODIFF_PKG_USED=t
1734 fi
1735 else
1736 echo "Error: the directory \"$adr\" for package $i doesn't exist"
1737 exit 1
1738 fi
1739 done
1740
1741 # Create a list of #define and #undef to enable/disable packages
1742 PACKAGES_DOT_H=PACKAGES_CONFIG.h
1743 # The following UGLY HACK sets multiple "#undef"s and it needs to go
1744 # away. On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h
1745 # file would eventually be split up so that all package-related #define
1746 # statements could be separated and handled only by genmake.
1747 names=`ls -1 "$ROOTDIR/pkg"`
1748 all_pack=
1749 DISABLED_PACKAGES=
1750 for n in $names ; do
1751 if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
1752 has_pack="f"
1753 for pack in $PACKAGES ; do
1754 if test "x$pack" = "x$n" ; then
1755 has_pack="t"
1756 break
1757 fi
1758 done
1759 if test "x$has_pack" = xf ; then
1760 undef=`echo "ALLOW_$n" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
1761 DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
1762 fi
1763 fi
1764 done
1765 ENABLED_PACKAGES=
1766 for i in $PACKAGES ; do
1767 def=`echo "ALLOW_$i" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
1768 ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
1769 #eh3 DEFINES="$DEFINES -D$def"
1770
1771 #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
1772 case $i in
1773 aim_v23)
1774 ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
1775 echo "Warning: ALLOW_AIM is set to enable aim_v23."
1776 ;;
1777 esac
1778 #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
1779
1780 done
1781
1782 echo " Adding STANDARDDIRS"
1783 BUILDDIR=${BUILDDIR:-.}
1784 if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
1785 STANDARDDIRS="eesupp model"
1786 fi
1787 if test "x$STANDARDDIRS" != x ; then
1788 for d in $STANDARDDIRS ; do
1789 adr="$ROOTDIR/$d/src"
1790 if test ! -d $adr ; then
1791 echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1792 echo " is correct and that you correctly specified the STANDARDDIRS option"
1793 exit 1
1794 else
1795 SOURCEDIRS="$SOURCEDIRS $adr"
1796 fi
1797 adr="$ROOTDIR/$d/inc"
1798 if test ! -d $adr ; then
1799 echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1800 echo " is correct and that you correctly specified the STANDARDDIRS option"
1801 exit 1
1802 else
1803 INCLUDEDIRS="$INCLUDEDIRS $adr"
1804 fi
1805 done
1806 fi
1807
1808 echo " Searching for *OPTIONS.h files in order to warn about the presence"
1809 echo " of \"#define \"-type statements that are no longer allowed:"
1810 CPP_OPTIONS=
1811 CPP_EEOPTIONS=
1812 spaths=". $INCLUDEDIRS"
1813 names=`ls -1 "$ROOTDIR/pkg"`
1814 for i in $spaths ; do
1815 try="$i/CPP_OPTIONS.h"
1816 if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
1817 echo " found CPP_OPTIONS=\"$try\""
1818 CPP_OPTIONS="$try"
1819 # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
1820 for n in $names ; do
1821 test_for_package_in_cpp_options $CPP_OPTIONS $n
1822 done
1823 fi
1824 try="$i/CPP_EEOPTIONS.h"
1825 if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
1826 echo " found CPP_EEOPTIONS=\"$try\""
1827 # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
1828 #**** not yet enabled ****
1829 # test_for_mpi_in_cpp_eeoptions $try
1830 #**** not yet enabled ****
1831 CPP_EEOPTIONS="$try"
1832 fi
1833 done
1834 if test "x$CPP_OPTIONS" = x ; then
1835 echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
1836 exit 1
1837 fi
1838
1839 # Here, we build the list of files to be "run through" the adjoint
1840 # compiler.
1841 if test -f ./adSrcFiles.tmp ; then
1842 rm -f ./adSrcFiles.tmp
1843 fi
1844 echo " Creating the list of files for the adjoint compiler."
1845 for i in $SOURCEDIRS ; do
1846 list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
1847 for j in $list_files ; do
1848 cat $i/$j >> adSrcFiles.tmp
1849 done
1850 done
1851
1852 if test ! "x"$FS = "x.f" ; then
1853 cat adSrcFiles.tmp | sed -e "s/\.f/.$FS/g" > adSrcFiles.tmp_f
1854 mv -f adSrcFiles.tmp_f adSrcFiles.tmp
1855 fi
1856
1857 echo
1858 echo "=== Creating the Makefile ==="
1859 echo " setting INCLUDES"
1860 for i in $INCLUDEDIRS ; do
1861 if test ! -d $i ; then
1862 echo "Warning: can't find INCLUDEDIRS=\"$i\""
1863 fi
1864 done
1865
1866 echo " Determining the list of source and include files"
1867 rm -rf .links.tmp
1868 mkdir .links.tmp
1869 echo "# This section creates symbolic links" > srclinks.tmp
1870 echo "" >> srclinks.tmp
1871 printf 'F77_SRC_FILES = ' > F77srclist.tmp
1872 printf 'NON_AD_F77_SRC_FILES = ' > nonADF77srclist.tmp
1873 printf 'C_SRC_FILES = ' > csrclist.tmp
1874 printf 'F90_SRC_FILES = ' > F90srclist.tmp
1875 printf 'H_SRC_FILES = ' > hsrclist.tmp
1876 alldirs="$SOURCEDIRS $INCLUDEDIRS ."
1877 for d in $alldirs ; do
1878 deplist=
1879 sfiles=`( cd $d; echo *.[h,c,F] | grep -v _cb2m)`
1880 sfiles=`( echo $sfiles; cd $d; echo *.F90 | grep -v _cb2m)`
1881 for sf in $sfiles ; do
1882 if test ! -r ".links.tmp/$sf" ; then
1883 if test -f "$d/$sf" ; then
1884 case $d/$sf in
1885 ./$PACKAGES_DOT_H)
1886 ;;
1887 ./AD_CONFIG.h)
1888 ;;
1889 ./FC_NAMEMANGLE.h)
1890 ;;
1891 ./BUILD_INFO.h)
1892 ;;
1893 *)
1894 touch .links.tmp/$sf
1895 deplist="$deplist $sf"
1896 ;;
1897 esac
1898 extn=`echo $sf | $AWK -F. '{print $NF}'`
1899 case $extn in
1900 F)
1901 echo " \\" >> F77srclist.tmp
1902 printf " $sf" >> F77srclist.tmp
1903 basename=${sf%%.F}
1904 isAD=`egrep ^$basename.f'[ ]*' adSrcFiles.tmp`
1905 if test -z "$isAD" ; then
1906 toBeIgnored=`egrep ^$basename'[ ]*' ${MODS}/dontCompile`
1907 if test -z "$toBeIgnored" ; then
1908 echo " \\" >> nonADF77srclist.tmp
1909 printf " $sf" >> nonADF77srclist.tmp
1910 fi
1911 fi
1912 ;;
1913 F90)
1914 echo " \\" >> F90srclist.tmp
1915 printf " $sf" >> F90srclist.tmp
1916 ;;
1917 c)
1918 echo " \\" >> csrclist.tmp
1919 printf " $sf" >> csrclist.tmp
1920 ;;
1921 h)
1922 echo " \\" >> hsrclist.tmp
1923 printf " $sf" >> hsrclist.tmp
1924 ;;
1925 esac
1926 fi
1927 fi
1928 done
1929 if test "x$deplist" != x ; then
1930 if test "$d" != "." ; then
1931 echo "" >> srclinks.tmp
1932 echo "# These files are linked from $d" >> srclinks.tmp
1933 echo "$deplist :" >> srclinks.tmp
1934 printf "\t\$(LN) %s/\$@ \$@\n" $d >> srclinks.tmp
1935 fi
1936 fi
1937 done
1938 rm -rf .links.tmp
1939 echo "" >> F77srclist.tmp
1940 echo "" >> nonADF77srclist.tmp
1941 echo "" >> csrclist.tmp
1942 echo "" >> F90srclist.tmp
1943 echo "" >> hsrclist.tmp
1944
1945 if test -f $MAKEFILE ; then
1946 mv -f $MAKEFILE "$MAKEFILE.bak"
1947 fi
1948
1949 echo " Writing makefile: $MAKEFILE"
1950
1951 echo "# Multithreaded + multi-processing makefile for:" > $MAKEFILE
1952 echo "# $MACHINE" >> $MAKEFILE
1953 echo "# This makefile was generated automatically on" >> $MAKEFILE
1954 echo "# $THISDATE" >> $MAKEFILE
1955 echo "# by the command:" >> $MAKEFILE
1956 echo "# $0 $G2ARGS" >> $MAKEFILE
1957 echo "# executed by:" >> $MAKEFILE
1958 echo "# ${THISUSER}@${THISHOST}:${THISCWD}" >> $MAKEFILE
1959
1960 EXE_AD=$EXECUTABLE"_ad"
1961 EXE_FTL=$EXECUTABLE"_ftl"
1962 EXE_SVD=$EXECUTABLE"_svd"
1963
1964 cat >>$MAKEFILE <<EOF
1965 #
1966 # OPTFILE="$OPTFILE"
1967 #
1968 # BUILDDIR : Directory where object files are written
1969 # SOURCEDIRS : Directories containing the source (.F) files
1970 # INCLUDEDIRS : Directories containing the header-source (.h) files
1971 # EXEDIR : Directory where executable that is generated is written
1972 # EXECUTABLE : Full path of executable binary
1973 #
1974 # CPP : C-preprocessor command
1975 # INCLUDES : Directories searched for header files
1976 # DEFINES : Macro definitions for CPP
1977 # MAKEDEPEND : Dependency generator
1978 # KPP : Special preprocessor command (specific to platform)
1979 # KFLAGS : Flags for KPP
1980 # FC : Fortran compiler command
1981 # FFLAGS : Configuration/debugging options for FC
1982 # FOPTIM : Optimization options for FC
1983 # LINK : Command for link editor program
1984 # LIBS : Library flags /or/ additional optimization/debugging flags
1985
1986 ROOTDIR = ${ROOTDIR}
1987 BUILDDIR = ${BUILDDIR}
1988 SOURCEDIRS = ${SOURCEDIRS}
1989 INCLUDEDIRS = ${INCLUDEDIRS}
1990 EXEDIR = ${EXEDIR}
1991 EXECUTABLE = \$(EXEDIR)/${EXECUTABLE}
1992 TOOLSDIR = ${TOOLSDIR}
1993
1994 #eh3 new defines for the adjoint work
1995 AUTODIFF = ${ROOTDIR}/pkg/autodiff
1996 EXE_AD = ${EXE_AD}
1997 EXE_FTL = ${EXE_FTL}
1998 EXE_SVD = ${EXE_SVD}
1999
2000 ENABLED_PACKAGES = ${ENABLED_PACKAGES}
2001 DISABLED_PACKAGES = ${DISABLED_PACKAGES}
2002
2003 # These files are created by Makefile
2004 SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h BUILD_INFO.h
2005
2006 EOF
2007
2008 # Note: figure out some way to add Hyades JAM libraries here
2009
2010 cat >>$MAKEFILE <<EOF
2011 # Unix ln (link)
2012 LN = ${LN}
2013 # C preprocessor
2014 CPP = cat \$< | ${S64} | ${CPP}
2015 # Dependency generator
2016 MAKEDEPEND = ${MAKEDEPEND}
2017 # Special preprocessor (KAP on DECs, FPP on Crays)
2018 KPP = ${KPP}
2019 # Fortran compiler
2020 FC = ${FC}
2021 # Fortran compiler
2022 F90C = ${F90C}
2023 # C compiler
2024 CC = ${CC}
2025 # Link editor
2026 LINK = ${LINK} ${LDADD}
2027
2028 # Defines for CPP
2029 DEFINES = ${DEFINES}
2030 # Includes for CPP
2031 INCLUDES = ${INCLUDES}
2032 # Flags for KPP
2033 KFLAGS1 = ${KFLAGS1}
2034 KFLAGS2 = ${KFLAGS2}
2035 # Optim./debug for FC
2036 FFLAGS = ${FFLAGS}
2037 FOPTIM = ${FOPTIM}
2038 # Optim./debug/format for FC
2039 F90FLAGS = ${F90FLAGS}
2040 F90OPTIM = ${F90OPTIM}
2041 F90FIXEDFORMAT = ${F90FIXEDFORMAT}
2042 # Flags for CC
2043 CFLAGS = ${CFLAGS}
2044 # Files that should not be optimized
2045 NOOPTFILES = ${NOOPTFILES}
2046 NOOPTFLAGS = ${NOOPTFLAGS}
2047 # Flags and libraries needed for linking
2048 LIBS = ${LIBS}
2049 # Name of the Mekfile
2050 MAKEFILE=${MAKEFILE}
2051
2052 EOF
2053
2054 cat F77srclist.tmp >> $MAKEFILE
2055 cat nonADF77srclist.tmp >> $MAKEFILE
2056 cat csrclist.tmp >> $MAKEFILE
2057 cat F90srclist.tmp >> $MAKEFILE
2058 cat hsrclist.tmp >> $MAKEFILE
2059
2060 rm -f F77srclist.tmp nonADF77srclist.tmp csrclist.tmp hsrclist.tmp flist.tmp clist.tmp F90srclist.tmp
2061
2062 echo >> $MAKEFILE
2063
2064 # add definitions for preprocessed sources
2065 # and note that not all systems allow case sensitive extensions
2066 # hence the $FS and $FS90 here.
2067 # for fixed format f90 files we use ff90 or FF90 resp
2068 # but these are not expected to be the original source files
2069
2070 echo 'F77_PP_SRC_FILES = $(F77_SRC_FILES:.F=.'$FS')' >> $MAKEFILE
2071 echo 'F90_PP_SRC_FILES = $(F90_SRC_FILES:.F90=.'$FS90')' >> $MAKEFILE
2072 echo >> $MAKEFILE
2073 echo '.SUFFIXES:' >> $MAKEFILE
2074 echo '.SUFFIXES: .o .'$FS' .p .F .c .f'$FS90' .'$FS90' .FF90 .F90' >> $MAKEFILE
2075
2076 cat >>$MAKEFILE <<EOF
2077
2078 # all the source files linked from the various locations:
2079 ALL_LINKED_FILES= \
2080 \$(F77_SRC_FILES) \
2081 \$(C_SRC_FILES) \
2082 \$(H_SRC_FILES) \
2083 \$(F90_SRC_FILES) \
2084 \$(SPECIAL_FILES)
2085
2086 all: depend \$(EXECUTABLE)
2087
2088 depend: \$(ALL_LINKED_FILES)
2089 \$(MAKEDEPEND) -o .$FS \$(DEFINES) \$(INCLUDES) \$(F77_SRC_FILES)
2090 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
2091 -rm -f makedepend.out
2092
2093 .PHONY: depend
2094
2095 OBJFILES= \$(F77_SRC_FILES:.F=.o) \$(C_SRC_FILES:.c=.o) \$(F90_SRC_FILES:.F90=.o)
2096
2097 \$(EXECUTABLE): \$(OBJFILES)
2098 @echo Creating \$@ ...
2099 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
2100
2101 output.txt: \$(EXECUTABLE)
2102 @printf 'running ... '
2103 @\$(EXECUTABLE) > \$@
2104
2105 # Special targets (SPECIAL_FILES) which are created by make
2106 ${PACKAGES_DOT_H}:
2107 @echo Creating \$@ ...
2108 @$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) > \$@
2109 AD_CONFIG.h:
2110 @echo Creating \$@ ...
2111 @$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 > \$@
2112 FC_NAMEMANGLE.h:
2113 @echo Creating \$@ ...
2114 echo "$FC_NAMEMANGLE" > \$@
2115
2116 BUILD_INFO.h:
2117 @echo Creating \$@ ...
2118 EOF
2119
2120 test ! "x$THISVER" = x && echo " -echo \"#define THISVER '$THISVER'\" > \$@" >> $MAKEFILE
2121 test ! "x$THISUSER" = x && echo " -echo \"#define THISUSER '$THISUSER'\" >> \$@" >> $MAKEFILE
2122 test ! "x$THISDATE" = x && echo " -echo \"#define THISDATE '$THISDATE'\" >> \$@" >> $MAKEFILE
2123 test ! "x$THISHOST" = x && echo " -echo \"#define THISHOST '$THISHOST'\" >> \$@" >> $MAKEFILE
2124
2125 cat >>$MAKEFILE <<EOF
2126
2127 # The normal chain of rules is ( .F - .$FS - .o )
2128
2129 ## This nullifies any default implicit rules concerning these two file types:
2130 %.o : %.F
2131
2132 .F.$FS:
2133 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2134 .$FS.o:
2135 \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
2136 .F90.$FS90:
2137 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2138 .FF90.f$FS90:
2139 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2140 .$FS90.o:
2141 \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
2142 .f$FS90.o:
2143 \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$(F90FIXEDFORMAT) \$<
2144 .c.o:
2145 \$(CC) \$(CFLAGS) -c \$<
2146
2147 # Special exceptions that use the ( .F - .p - .$FS - .o ) rule-chain
2148 .F.p:
2149 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2150 .p.$FS:
2151 \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
2152
2153 #=========================================
2154 #=== Cleanup Rules ===
2155
2156 CLEAN: Clean
2157 -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
2158 -find \$(EXEDIR) -name "*.data" -exec rm {} \;
2159 -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
2160 -rm -f \$(EXECUTABLE) output.txt ad_output.txt STD*
2161
2162 Clean: clean cleanlinks
2163 -rm -f *.F
2164 -rm -f \$(SPECIAL_FILES)
2165 -rm -f genmake_state genmake_*optfile genmake_warnings make.log run.log *.bak
2166
2167 clean:
2168 -rm -rf *.o *.$FS *.p *.f$FS90 *.$FS90 *.mod ${RMFILES} work.{pc,pcl} *.template *_mod.h *_mod.F90 *.FF90 *.mod-whirl ad_input*
2169 -rm -rf temp.sed reslice.dat
2170
2171 cleanlinks:
2172 -find . -type l -exec rm {} \;
2173
2174 .PHONY: clean Clean CLEAN
2175
2176
2177 #=========================================
2178 #=== self regeneration ===
2179 # can't call this target "Makefile"
2180 # because unfortunately the genmake script
2181 # invoked here uses
2182 # make itself for checking things and we
2183 # end up in a recursion.
2184
2185 makefile:
2186 $THIS_SCRIPT $G2ARGS
2187
2188 # because the file is called Makefile
2189 .PHONY: makefile
2190
2191 #====================================
2192 #=== Automatic Differentiation ===
2193
2194 ifndef OPENADROOT
2195 \$(error "Error: environment variable OPENADROOT not defined!")
2196 endif
2197
2198 ifndef XAIFSCHEMAROOT
2199 \$(error "Error: environment variable XAIFSCHEMAROOT not defined!")
2200 endif
2201
2202 ifndef XAIFBOOSTERROOT
2203 \$(error "Error: environment variable XAIFBOOSTERROOT not defined!")
2204 endif
2205
2206 EOF
2207
2208 echo " Add the source list for AD code generation"
2209 echo >> $MAKEFILE
2210 printf "AD_FILES = " >> $MAKEFILE
2211 AD_FILES=`cat adSrcFiles.tmp`
2212 for i in $AD_FILES ; do
2213 echo " \\" >> $MAKEFILE
2214 printf " $i" >> $MAKEFILE
2215 done
2216 echo >> $MAKEFILE
2217 rm -f adSrcFiles.tmp
2218
2219 cat >>$MAKEFILE <<EOF
2220
2221
2222 # files to be converted:
2223 # right now there is no quick hack
2224 # to pick these out automatically
2225 # but we will be using the
2226 # canonicalizer anyway
2227 CB2M_F90_SRC_NAMES = \
2228 SIZE \
2229 EEPARAMS \
2230 PARAMS \
2231 BAR2 \
2232 BARRIER \
2233 CD_CODE_VARS \
2234 CG2D \
2235 CG3D \
2236 DFILE \
2237 DYNVARS \
2238 EEIO \
2239 EESUPPORT \
2240 EOS \
2241 EXCH_JAM \
2242 EXCH \
2243 FC_NAMEMANGLE \
2244 FFIELDS \
2245 GAD \
2246 GLOBAL_MAX \
2247 GLOBAL_SUM \
2248 GRID \
2249 MPI_INFO \
2250 SOLVE_FOR_PRESSURE3D \
2251 SOLVE_FOR_PRESSURE \
2252 SURFACE \
2253 tamc \
2254 tamc_keys \
2255 cost \
2256 g_cost \
2257 ctrl \
2258 ctrl_dummy \
2259 ctrl_weights \
2260 optim \
2261 grdchk
2262
2263 .PHONY: adAll
2264 adAll: \$(EXE_AD)
2265
2266 # these are all fixed format:
2267 CB2M_F77_TO_FF90_SRC_FILES=\$(F77_SRC_FILES:.F=_cb2m.FF90)
2268 CB2M_F90_SRC_FILES=\$(addsuffix _mod.FF90, \$(CB2M_F90_SRC_NAMES))
2269 CB2M_F90_PP_SRC_FILES=\$(addsuffix _mod.f$FS90, \$(CB2M_F90_SRC_NAMES))
2270
2271 .PRECIOUS: \$(CB2M_F90_PP_SRC_FILES) \$(NON_AD_F77_SRC_FILES:.F=_cb2m.ff90)
2272
2273 .PHONY: adDepend
2274 #this file is included at the bottom
2275 adDepend: \$(ALL_LINKED_FILES) \$(CB2M_F90_SRC_FILES) \$(CB2M_F77_TO_FF90_SRC_FILES)
2276 \$(MAKEDEPEND) -o .$FS \$(DEFINES) \$(INCLUDES) \$(F77_SRC_FILES)
2277 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
2278 -rm -f makedepend.out
2279
2280
2281 OPENAD_SUPPORT_F90_SRC_FILES = \
2282 w2f__types.f90 \
2283 active_module.f90 \
2284 OpenAD_checkpoints.f90 \
2285 OpenAD_dct.f90 \
2286 OpenAD_rev.f90 \
2287 OpenAD_tape.f90
2288
2289 OPENAD_SUPPORT_C_SRC_FILES = \
2290 iaddr.c
2291
2292 AD_OBJ_FILES=\$(OPENAD_SUPPORT_F90_SRC_FILES:.f90=.o) \$(OPENAD_SUPPORT_C_SRC_FILES:.c=.o) all_mods.xb.x2w.w2f.pp.o ad_input_code.w2f.canon.xb.x2w.w2f.rs.pp.o \$(NON_AD_F77_SRC_FILES:.F=_cb2m.o) \$(C_SRC_FILES:.c=.o) \$(F90_SRC_FILES:.F90=.o)
2293
2294 \$(EXE_AD): \$(AD_OBJ_FILES)
2295 @echo Creating \$@ ...
2296 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$^ \$(LIBS)
2297
2298 # makefile debug rule
2299 openad: ad_input_code.w2f.canon.xb.x2w.w2f.rs.pp.f
2300 .PHONY: openad
2301
2302 CB2MFILES= cb2m1.csh cb2m1.awk cb2m2.bash
2303 # create the module files and change the header files
2304 \$(CB2M_F90_SRC_FILES) \$(addsuffix _mod.h, \$(CB2M_F90_SRC_NAMES)) : \$(ALL_LINKED_FILES) \$(CB2MFILES)
2305 ./cb2m1.csh \$(CB2M_F90_SRC_NAMES)
2306
2307 # change everybody else to use the module files:
2308 \$(CB2M_F77_TO_FF90_SRC_FILES): \$(addsuffix _mod.h, \$(CB2M_F90_SRC_NAMES)) \$(CB2M_F90_SRC_FILES)
2309 ./cb2m2.bash
2310
2311 # makefile debug rule
2312 small_f: \$(CB2M_F77_PP_SRC_FILES) \$(CB2M_F90_PP_SRC_FILES)
2313 .PHONY: small_f
2314
2315 ad_output.txt: \$(EXE_AD)
2316 @printf 'linking data files ... '
2317 \$(LN) -f ../input_ad/data* ../input_ad/eedata .
2318 \$(LN) -f ../../global_ocean.90x40x15/input/*.bin .
2319 @printf 'running ... '
2320 @./\$(EXE_AD) > \$@
2321
2322 CB2M_AD_FILES=\$(AD_FILES:.f=_cb2m.ff90)
2323 ad_input_code.$FS: ${MODS}/maxMinDefs.f \$(CB2M_AD_FILES)
2324 cat \$^ > \$@
2325
2326 \$(CB2MFILES):
2327 \$(LN) \$(addprefix ${MODS}/, \$(CB2MFILES)) .
2328
2329 # strip all comments and blanks to reduce
2330 # the file size in order to reduce perl's memory requirements
2331 ad_input_code_sf.f : ad_input_code.f
2332 cat \$^ | sed -f ${MODS}/strip.sed | sed -f ${MODS}/stop2print.sed > \$@
2333
2334 # mfef90 preprocessing
2335 # expand statement functions
2336 # expose mfef90 specific substring handling
2337 # add the w2f__types module
2338 ad_input_code_sf.w2f.f: ad_input_code_sf.f mfef90 whirl2f whirl2f_be w2f__types.f90
2339 ./mfef90 -F -N132 \$<
2340 ./whirl2f \$<
2341 cat w2f__types.f90 \$@ > \$@.1
2342 mv \$@.1 \$@
2343
2344 # canonicalizer
2345 ad_input_code_sf.w2f.canon.f: ad_input_code_sf.w2f.f canon.v1.py
2346 python canon.v1.py \$< > \$@
2347
2348 # F -> WHIRL
2349 # note that the canonicalized version cuts off at col 72
2350 # doing this also for string constants which is ok as long
2351 # as we are in fixed mode and cut of exactly there.
2352 # Otherwise mfef90 patches in spaces to fill up to 72 (or 132)
2353 # characters respectively.
2354 ad_input_code_sf.w2f.canon.B: ad_input_code_sf.w2f.canon.f mfef90
2355 ./mfef90 -F \$<
2356
2357 # WHIRL -> XAIF
2358 ad_input_code_sf.w2f.canon.xaif : ad_input_code_sf.w2f.canon.B whirl2xaif
2359 ./whirl2xaif --debug 1 -o \$@ \$<
2360
2361 # XAIF -> XAIF'
2362 ad_input_code_sf.w2f.canon.xb.xaif : ad_input_code_sf.w2f.canon.xaif xaif.xsd xaif_base.xsd xaif_inlinable_intrinsics.xsd xaif_derivative_propagator.xsd xaif_output.xsd openad_adm
2363 ./openad_adm -i \$< -c \${XAIFSCHEMAROOT}/schema/examples/inlinable_intrinsics.xaif -o \$@ -I
2364
2365 # XAIF' -> WHIRL'
2366 ad_input_code_sf.w2f.canon.xb.x2w.B : ad_input_code_sf.w2f.canon.xb.xaif xaif2whirl
2367 ./xaif2whirl --structured ad_input_code_sf.w2f.canon.B \$<
2368
2369 # WHIRL' -> F'
2370 ad_input_code_sf.w2f.canon.xb.x2w.w2f.f: ad_input_code_sf.w2f.canon.xb.x2w.B whirl2f whirl2f_be
2371 ./whirl2f -openad \$<
2372
2373 # undo slice hiding
2374 # insert template directives
2375 ad_input_code_sf.w2f.canon.xb.x2w.w2f.rs.f: ad_input_code_sf.w2f.canon.xb.x2w.w2f.f reslicer.py ${MODS}/insertTemplateDir.bash
2376 python reslicer.py \$< > \$<.1
2377 ${MODS}/insertTemplateDir.bash \$<.1 \$@
2378 rm \$<.1
2379
2380 # postprocess F'
2381 ad_input_code_sf.w2f.canon.xb.x2w.w2f.rs.pp.f: ad_input_code_sf.w2f.canon.xb.x2w.w2f.rs.f multi-pp.pl ${MODS}/ad_inline.f ${MODS}/ad_template.checkpoint.f ${MODS}/ad_template.plain.f ${MODS}/ad_template.split.f ${MODS}/ad_template.sa_cg2d.f
2382 perl multi-pp.pl -inline=${MODS}/ad_inline.f \$<
2383 cat \$@ | sed 's/RETURN//' > \$@.1
2384 mv \$@.1 \$@
2385
2386 # extract all transformed modules
2387 all_mods.xb.x2w.w2f.pp.f: ad_input_code_sf.w2f.canon.xb.x2w.w2f.rs.pp.f
2388 cat \$< | sed -n '/MODULE /,/END MODULE/p' > \$@
2389
2390 # remove the transformed globals module from the
2391 # transformed ad_input_code file
2392 # and remove for now the duplicate variables
2393 # and fix 2 data statements
2394 ad_input_code.w2f.canon.xb.x2w.w2f.rs.pp.f: ad_input_code_sf.w2f.canon.xb.x2w.w2f.rs.pp.f ${MODS}/fixData.sed
2395 cat \$< | sed '/MODULE /,/END MODULE/d' | sed '/^ INTEGER(w2f__i4) DOLOOP_UB/d' | sed -f ${MODS}/fixData.sed > \$@
2396
2397 # setup some links
2398 %.xsd:
2399 \$(LN) \${XAIFSCHEMAROOT}/schema/\$@ .
2400
2401 mfef90:
2402 \$(LN) \${OPENADROOT}/Open64/osprey1.0/targ_ia32_ia64_linux/crayf90/sgi/mfef90 .
2403
2404 # link the support files:
2405 \$(OPENAD_SUPPORT_F90_SRC_FILES) \$(OPENAD_SUPPORT_C_SRC_FILES) :
2406 \$(LN) ${MODS}/\$@ .
2407
2408 whirl2xaif xaif2whirl:
2409 \$(LN) \${OPENADROOT}/OpenADFortTk/OpenADFortTk-i686-Linux/bin/\$@ .
2410
2411 %.pl:
2412 \$(LN) \${OPENADROOT}/OpenADFortTk/OpenADFortTk-i686-Linux/bin/\$@ .
2413
2414 %.py:
2415 \$(LN) \${OPENADROOT}/OpenADFortTk/tools/canonicalize/\$@ .
2416
2417 whirl2f whirl2f_be:
2418 \$(LN) \${OPENADROOT}/Open64/osprey1.0/targ_ia32_ia64_linux/whirl2f/\$@ .
2419
2420 openad_adm:
2421 \$(LN) \${XAIFBOOSTERROOT}/xaifBooster/algorithms/BasicBlockPreaccumulationReverse/test/t \$@
2422
2423 EOF
2424
2425 if test "x$EXEHOOK" != x ; then
2426 printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE
2427 fi
2428
2429 echo " Making list of \"exceptions\" that need \".p\" files"
2430 for i in $KPPFILES ; do
2431 base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
2432 RETVAL=$?
2433 if test "x$RETVAL" != x0 ; then
2434 echo "Error: unable to add file \"$i\" to the exceptions list"
2435 fi
2436 echo "$base.$FS: $base.p" >> $MAKEFILE
2437 done
2438
2439 echo " Making list of NOOPTFILES"
2440 for i in $NOOPTFILES ; do
2441 base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
2442 RETVAL=$?
2443 if test "x$RETVAL" != x0 ; then
2444 echo "Error: unable to add file \"$i\" to the exceptions list"
2445 fi
2446 echo "$base.o: $base.$FS" >> $MAKEFILE
2447 printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE
2448 done
2449
2450 echo " Add rules for links"
2451 cat srclinks.tmp >> $MAKEFILE
2452 rm -f srclinks.tmp
2453
2454 printf "\n=== Done ===\n"
2455
2456 # Create special header files
2457 $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"
2458 if test ! -f $PACKAGES_DOT_H ; then
2459 mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
2460 else
2461 cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H > /dev/null 2>&1
2462 RETVAL=$?
2463 if test "x$RETVAL" = x0 ; then
2464 rm -f $PACKAGES_DOT_H".tmp"
2465 else
2466 mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"
2467 mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
2468 fi
2469 fi
2470 if test ! -f AD_CONFIG.h ; then
2471 $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
2472 fi
2473
2474
2475 # Write the "state" for future records
2476 if test "x$DUMPSTATE" != xf ; then
2477 printf "" > genmake_state
2478 for i in $gm_state ; do
2479 t1="t2=\$$i"
2480 eval $t1
2481 echo "$i='$t2'" >> genmake_state
2482 done
2483 fi

  ViewVC Help
Powered by ViewVC 1.1.22