/[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.119 - (show annotations) (download)
Wed Mar 9 19:57:00 2005 UTC (19 years ago) by edhill
Branch: MAIN
Changes since 1.118: +26 -13 lines
 o re-work $MAKEFILE handling for systems where the local makedepend
   implementation will die if it cannot locate a makefile

1 #! /usr/bin/env bash
2 #
3 # $Header: /u/gcmpack/MITgcm/tools/genmake2,v 1.118 2005/02/09 17:34:19 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".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 test -f $MAKEFILE && rm -f $MAKEFILE
201 test -f $MAKEFILE".tst" && mv -f $MAKEFILE".tst" $MAKEFILE
202 RV1=$?
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"
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 -mpi | --mpi
531 Include MPI header files and link to MPI libraries
532 -mpi=PATH | --mpi=PATH
533 Include MPI header files and link to MPI libraries using MPI_ROOT
534 set to PATH. i.e. Include files from \$PATH/include, link to libraries
535 from \$PATH/lib and use binaries from \$PATH/bin.
536
537 -bash NAME
538 Explicitly specify the Bourne or BASH shell to use
539
540 While it is most often a single word, the "NAME" variables specified
541 above can in many cases be a space-delimited string such as:
542
543 --enable pkg1 --enable 'pkg1 pkg2' --enable 'pkg1 pkg2 pkg3'
544 -mods=dir1 -mods='dir1' -mods='dir1 dir2 dir3'
545 -foptim='-Mvect=cachesize:512000,transform -xtypemap=real:64,double:64,integer:32'
546
547 which, depending upon your shell, may need to be single-quoted.
548
549 For more detailed genmake documentation, please see:
550
551 http://mitgcm.org/devel_HOWTO/
552
553 EOF
554
555 exit 1
556 }
557
558 # Build a CPP macro to automate calling C routines from FORTRAN
559 get_fortran_c_namemangling() {
560
561 #echo "FC_NAMEMANGLE = \"$FC_NAMEMANGLE\""
562 if test ! "x$FC_NAMEMANGLE" = x ; then
563 return 0
564 fi
565
566 default_nm="#define FC_NAMEMANGLE(X) X ## _"
567
568 cat > genmake_test.c <<EOF
569 void tcall( char * string ) { tsub( string ); }
570 EOF
571 $MAKE genmake_test.o >> genmake_warnings 2>&1
572 RETVAL=$?
573 if test "x$RETVAL" != x0 ; then
574 FC_NAMEMANGLE=$default_nm
575 cat <<EOF>> genmake_errors
576
577 WARNING: C test compile fails
578 WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
579 WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here
580 EOF
581 return 1
582 fi
583 c_tcall=`nm genmake_test.o 2>/dev/null | grep 'T ' | grep tcall | cut -d ' ' -f 3`
584 RETVAL=$?
585 if test "x$RETVAL" != x0 ; then
586 FC_NAMEMANGLE=$default_nm
587 cat <<EOF>> genmake_warnings
588
589 WARNING: The "nm" command failed.
590 WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
591 WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here
592 EOF
593 return 1
594 fi
595 cat > genmake_tcomp.$FS <<EOF
596 subroutine tcall( string )
597 character*(*) string
598 call tsub( string )
599 end
600 EOF
601 $FC $FFLAGS $DEFINES -c genmake_tcomp.$FS >> genmake_warnings 2>&1
602 RETVAL=$?
603 if test "x$RETVAL" != x0 ; then
604 FC_NAMEMANGLE=$default_nm
605 cat <<EOF>> genmake_warnings
606
607 WARNING: FORTRAN test compile fails -- please see "genmake_errors"
608 WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
609 WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here.
610 EOF
611 return 1
612 fi
613 f_tcall=`nm genmake_tcomp.o 2>/dev/null | grep 'T ' | grep tcall | cut -d ' ' -f 3`
614 RETVAL=$?
615 if test "x$RETVAL" != x0 ; then
616 FC_NAMEMANGLE=$default_nm
617 cat <<EOF>> genmake_warnings
618
619 WARNING: The "nm" command failed.
620 WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
621 WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here.
622 EOF
623 return 1
624 fi
625
626 c_a=`echo $c_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 1 | sed -e 's|Y||'`
627 f_a=`echo $f_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 1 | sed -e 's|Y||'`
628 c_b=`echo $c_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 2 | sed -e 's|Y||'`
629 f_b=`echo $f_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 2 | sed -e 's|Y||'`
630
631 nmangle="X"
632 if test "x$c_a" != "x$f_a" ; then
633 comm="echo x$f_a | sed -e 's|x$c_a||'"
634 a=`eval $comm`
635 nmangle="$a ## $nmangle"
636 fi
637 if test "x$c_b" != "x$f_b" ; then
638 comm="echo x$f_b | sed -e 's|x$c_b||'"
639 b=`eval $comm`
640 nmangle="$nmangle ## $b"
641 fi
642
643 FC_NAMEMANGLE="#define FC_NAMEMANGLE(X) $nmangle"
644
645 # cleanup the testing files
646 rm -f genmake_tcomp.* genmake_test.*
647 }
648
649
650 check_HAVE_CLOC() {
651 get_fortran_c_namemangling
652 cat <<EOF > genmake_tc_1.c
653 $FC_NAMEMANGLE
654 #include <stdio.h>
655 #include <stdlib.h>
656 #include <unistd.h>
657 #include <assert.h>
658 #include <sys/time.h>
659 void FC_NAMEMANGLE(cloc) ( double *curtim )
660 {
661 struct timeval tv1;
662 gettimeofday(&tv1 , (void *)NULL );
663 *curtim = (double)((tv1.tv_usec)+(tv1.tv_sec)*1.E6);
664 *curtim = *curtim/1.E6;
665 }
666 EOF
667 make genmake_tc_1.o >> genmake_warnings 2>&1
668 RET_C=$?
669 cat <<EOF > genmake_tc_2.$FS
670 program hello
671 Real*8 wtime
672 external cloc
673 call cloc(wtime)
674 print *," HELLO WORLD", wtime
675 end program hello
676 EOF
677 $FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o >> genmake_warnings 2>&1
678 RET_F=$?
679 test -x ./genmake_tc && ./genmake_tc >> genmake_warnings 2>&1
680 RETVAL=$?
681 if test "x$RETVAL" = x0 ; then
682 HAVE_CLOC=t
683 DEFINES="$DEFINES -DHAVE_CLOC"
684 fi
685 rm -f genmake_tc*
686 }
687
688
689 check_HAVE_STAT() {
690 get_fortran_c_namemangling
691 cat <<EOF > genmake_tc_1.c
692 $FC_NAMEMANGLE
693 #include <stdio.h>
694 #include <stdlib.h>
695 #include <unistd.h>
696 #include <sys/stat.h>
697 #include <sys/types.h>
698 void FC_NAMEMANGLE(tfsize) ( int *nbyte )
699 {
700 char name[512];
701 struct stat astat;
702
703 name[0] = 'a'; name[1] = '\0';
704 if (! stat(name, &astat))
705 *nbyte = (int)(astat.st_size);
706 else
707 *nbyte = -1;
708 }
709 EOF
710 make genmake_tc_1.o >> genmake_tc.log 2>&1
711 RET_C=$?
712 cat <<EOF > genmake_tc_2.$FS
713 program hello
714 integer nbyte
715 call tfsize(nbyte)
716 print *," HELLO WORLD", nbyte
717 end program hello
718 EOF
719 $FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o >> genmake_tc.log 2>&1
720 RET_F=$?
721 test -x ./genmake_tc && ./genmake_tc >> genmake_tc.log 2>&1
722 RETVAL=$?
723 if test "x$RETVAL" = x0 ; then
724 HAVE_STAT=t
725 DEFINES="$DEFINES -DHAVE_STAT"
726 fi
727 rm -f genmake_tc*
728 }
729
730
731 check_netcdf_libs() {
732 if test ! "x$SKIP_NETCDF_CHECK" = x ; then
733 return
734 fi
735 echo "" > genmake_tnc.log
736 cat <<EOF > genmake_tnc.F
737 program fgennc
738 #include "netcdf.inc"
739 EOF
740 if test ! "x$MPI" = x ; then
741 echo '#include "mpif.h"' >> genmake_tnc.F
742 fi
743 cat <<EOF >> genmake_tnc.F
744 integer iret, ncid, xid
745 iret = nf_create('genmake_tnc.nc', NF_CLOBBER, ncid)
746 IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
747 iret = nf_def_dim(ncid, 'X', 11, xid)
748 IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
749 iret = nf_close(ncid)
750 IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
751 end
752 EOF
753 echo "Executing:" > genmake_tnc.log
754 echo " $CPP $DEFINES $INCLUDES genmake_tnc.F > genmake_tnc.$FS" \
755 > genmake_tnc.log
756 RET_CPP=f
757 $CPP $DEFINES $INCLUDES genmake_tnc.F > genmake_tnc.$FS 2>/dev/null \
758 && RET_CPP=t
759 if test "x$RET_CPP" = xf ; then
760 echo " WARNING: CPP failed to pre-process the netcdf test." \
761 > genmake_tnc.log
762 echo " Please check that \$INCLUDES is properly set." \
763 > genmake_tnc.log
764 fi
765 echo "Executing:" > genmake_tnc.log
766 echo " $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS" > genmake_tnc.log
767 echo " $LINK -o genmake_tnc.o $LIBS" > genmake_tnc.log
768 $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1 \
769 && $LINK -o genmake_tnc genmake_tnc.o $LIBS >> genmake_tnc.log 2>&1
770 RET_COMPILE=$?
771
772 #EH3 Remove test program execution for machines that either disallow
773 #EH3 execution or cannot support it (eg. cross-compilers)
774 #EH3
775 #EH3 test -x ./genmake_tnc && ./genmake_tnc >> genmake_tnc.log 2>&1
776 #EH3 RETVAL=$?
777 #EH3 if test "x$RET_COMPILE" = x0 -a "x$RETVAL" = x0 ; then
778
779 if test "x$RET_COMPILE" = x0 ; then
780 HAVE_NETCDF=t
781 else
782 # try again with "-lnetcdf" added to the libs
783 $CPP $DEFINES $INCLUDES genmake_tnc.F > genmake_tnc.$FS 2>/dev/null \
784 && $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1 \
785 && $LINK -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf >> genmake_tnc.log 2>&1
786 RET_COMPILE=$?
787 if test "x$RET_COMPILE" = x0 ; then
788 LIBS="$LIBS -lnetcdf"
789 HAVE_NETCDF=t
790 else
791 cat genmake_tnc.log >> genmake_warnings
792 fi
793 fi
794 rm -f genmake_tnc*
795 }
796
797
798
799 ###############################################################################
800 # Sequential part of script starts here
801 ###############################################################################
802
803 # Set defaults here
804 COMMANDL="$0 $@"
805
806 PLATFORM=
807 LN=
808 S64=
809 KPP=
810 #FC=
811 #CC=gcc
812 #CPP=
813 LINK=
814 DEFINES=
815 PACKAGES=
816 ENABLE=
817 DISABLE=
818 # MAKEFILE=
819 # MAKEDEPEND=
820 PDEPEND=
821 DUMPSTATE=t
822 PDEFAULT=
823 OPTFILE=
824 INCLUDES="-I. $INCLUDES"
825 FFLAGS=
826 FOPTIM=
827 CFLAGS=
828 KFLAGS1=
829 KFLAGS2=
830 #LDADD=
831 LIBS=
832 KPPFILES=
833 NOOPTFILES=
834 NOOPTFLAGS=
835 MPI=
836 MPIPATH=
837
838 # DEFINES checked by test compilation
839 HAVE_SYSTEM=
840 HAVE_FDATE=
841 FC_NAMEMANGLE=
842 HAVE_CLOC=
843 HAVE_STAT=
844 HAVE_NETCDF=
845 HAVE_ETIME=
846
847 MODS=
848 TOOLSDIR=
849 SOURCEDIRS=
850 INCLUDEDIRS=
851 STANDARDDIRS="USE_THE_DEFAULT"
852
853 G2ARGS=
854 BASH=
855 PWD=`pwd`
856 test "x$MAKE" = x && MAKE=make
857 test "x$AWK" = x && AWK=awk
858 THISHOST=`hostname`
859 THISCWD=`pwd`
860 THISDATE=`date`
861 THISUSER=`echo $USER`
862 THISVER=
863 MACHINE=`uname -a`
864 EXECUTABLE=
865 EXEHOOK=
866 EXEDIR=
867 PACKAGES_CONF=
868 IEEE=
869 if test "x$MITGCM_IEEE" != x ; then
870 IEEE=$MITGCM_IEEE
871 fi
872 FS=
873 FS90=
874
875 AUTODIFF_PKG_USED=f
876 AD_OPTFILE=
877 TAF=
878 AD_TAF_FLAGS=
879 FTL_TAF_FLAGS=
880 SVD_TAF_FLAGS=
881 TAF_EXTRA=
882 TAMC=
883 AD_TAMC_FLAGS=
884 FTL_TAF_FLAGS=
885 SVD_TAMC_FLAGS=
886 TAMC_EXTRA=
887
888
889 # The following state can be set directly by command-line switches
890 gm_s1="OPTFILE PDEPEND PDEFAULT MAKEFILE PLATFORM ROOTDIR MODS DISABLE ENABLE"
891 gm_s2="FC CPP IEEE MPI JAM DUMPSTATE STANDARDDIRS"
892
893 # The following state is not directly set by command-line switches
894 gm_s3="LN S64 KPP LINK PACKAGES MAKEDEPEND PDEPEND PDEFAULT INCLUDES FFLAGS FOPTIM "
895 gm_s4="CFLAGS KFLAGS1 KFLAGS2 LIBS KPPFILES NOOPTFILES NOOPTFLAGS"
896 gm_s5="TOOLSDIR SOURCEDIRS INCLUDEDIRS PWD MAKE THISHOST THISUSER THISDATE THISVER MACHINE"
897 gm_s6="EXECUTABLE EXEHOOK EXEDIR PACKAGES_CONF"
898 gm_s7="HAVE_SYSTEM HAVE_FDATE FC_NAMEMANGLE HAVE_ETIME"
899
900 # The following are all related to adjoint/tangent-linear stuff
901 gm_s10="AUTODIFF_PKG_USED AD_OPTFILE TAMC TAF AD_TAMC_FLAGS AD_TAF_FLAGS"
902 gm_s11="FTL_TAMC_FLAGS FTL_TAF_FLAGS SVD_TAMC_FLAGS SVD_TAF_FLAGS"
903 gm_s12="TAF_EXTRA TAMC_EXTRA"
904
905 gm_state="COMMANDL $gm_s1 $gm_s2 $gm_s3 $gm_s4 $gm_s5 $gm_s6 $gm_s7"
906 gm_state="$gm_state $gm_s10 $gm_s11 $gm_s12"
907
908 cat <<EOF
909
910 GENMAKE :
911
912 A program for GENerating MAKEfiles for the MITgcm project. For a
913 quick list of options, use "genmake -h" or for more detail see:
914
915 http://mitgcm.org/devel_HOWTO/
916
917 EOF
918
919 echo "=== Processing options files and arguments ==="
920 gm_local="genmake_local"
921 for i in . $MODS ; do
922 if test -r $i/$gm_local ; then
923 . $i/$gm_local
924 break
925 fi
926 done
927 printf " getting local config information: "
928 if test -f $gm_local ; then
929 echo "using $gm_local"
930 . $gm_local
931 # echo "DISABLE=$DISABLE"
932 # echo "ENABLE=$ENABLE"
933 else
934 echo "none found"
935 fi
936
937 #echo "$0::$1:$2:$3:$4:$5:$6:$7:"
938 #OPTIONS=
939 #n=0
940 #for i ; do
941 # echo "$i $n"
942 # setvar="OPTIONS[$n]='$i'"
943 # # echo " $setvar"
944 # eval "$setvar"
945 # n=$(( $n + 1 ))
946 #done
947 #parse_options
948 ac_prev=
949 for ac_option in "$@" ; do
950
951 G2ARGS="$G2ARGS \"$ac_option\""
952
953 # If the previous option needs an argument, assign it.
954 if test -n "$ac_prev"; then
955 eval "$ac_prev=\$ac_option"
956 ac_prev=
957 continue
958 fi
959
960 ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
961
962 case $ac_option in
963
964 -help | --help | -h | --h)
965 usage ;;
966
967 -nooptfile | --nooptfile)
968 OPTFILE="NONE" ;;
969 -optfile | --optfile | -of | --of)
970 ac_prev=OPTFILE ;;
971 -optfile=* | --optfile=* | -of=* | --of=*)
972 OPTFILE=$ac_optarg ;;
973
974 -adoptfile | --adoptfile | -adof | --adof)
975 ac_prev=AD_OPTFILE ;;
976 -adoptfile=* | --adoptfile=* | -adof=* | --adof=*)
977 AD_OPTFILE=$ac_optarg ;;
978
979 -pdepend | --pdepend)
980 ac_prev=PDEPEND ;;
981 -pdepend=* | --pdepend=*)
982 PDEPEND=$ac_optarg ;;
983
984 -pdefault | --pdefault)
985 ac_prev=PDEFAULT ;;
986 -pdefault=* | --pdefault=*)
987 PDEFAULT=$ac_optarg ;;
988
989 -make | --make | -m | --m)
990 ac_prev=MAKE ;;
991 -make=* | --make=* | -m=* | --m=*)
992 MAKE=$ac_optarg ;;
993
994 -bash | --bash)
995 ac_prev=BASH ;;
996 -bash=* | --bash=*)
997 BASH=$ac_optarg ;;
998
999 -makedepend | --makedepend | -md | --md)
1000 ac_prev=MAKEDEPEND ;;
1001 -makedepend=* | --makedepend=* | -md=* | --md=*)
1002 MAKEDEPEND=$ac_optarg ;;
1003
1004 -makefile | --makefile | -ma | --ma)
1005 ac_prev=MAKEFILE ;;
1006 -makefile=* | --makefile=* | -ma=* | --ma=*)
1007 MAKEFILE=$ac_optarg ;;
1008
1009 -platform | --platform | -pl | --pl | -platform=* | --platform=* | -pl=* | --pl=*)
1010 echo "ERROR: The platform option has been removed. Please specify"
1011 echo " the build options using the \"optfile\" mechanism."
1012 echo
1013 usage
1014 ;;
1015
1016 -rootdir | --rootdir | -rd | --rd)
1017 ac_prev=ROOTDIR ;;
1018 -rootdir=* | --rootdir=* | -rd=* | --rd=*)
1019 ROOTDIR=$ac_optarg ;;
1020
1021 -mods | --mods | -mo | --mo)
1022 ac_prev=MODS ;;
1023 -mods=* | --mods=* | -mo=* | --mo=*)
1024 MODS=$ac_optarg ;;
1025
1026 -disable | --disable)
1027 ac_prev=DISABLE ;;
1028 -disable=* | --disable=*)
1029 DISABLE=$ac_optarg ;;
1030
1031 -enable | --enable)
1032 ac_prev=ENABLE ;;
1033 -enable=* | --enable=*)
1034 ENABLE=$ac_optarg ;;
1035
1036 -standarddirs | --standarddirs)
1037 ac_prev=STANDARDDIRS ;;
1038 -standarddirs=* | --standarddirs=*)
1039 STANDARDDIRS=$ac_optarg ;;
1040
1041 # -cpp | --cpp)
1042 # ac_prev=cpp ;;
1043 # -cpp=* | --cpp=*)
1044 # CPP=$ac_optarg ;;
1045
1046 -cc | --cc)
1047 ac_prev=CC ;;
1048 -cc=* | --cc=*)
1049 CC=$ac_optarg ;;
1050
1051 -fortran | --fortran | -fc | --fc)
1052 ac_prev=FC ;;
1053 -fc=* | --fc=*)
1054 FC=$ac_optarg ;;
1055
1056 -fs | --fs)
1057 ac_prev=FS ;;
1058 -fs=* | --fs=*)
1059 FS=$ac_optarg ;;
1060
1061 -fs90 | --fs90)
1062 ac_prev=FS90 ;;
1063 -fs90=* | --fs90=*)
1064 FS90=$ac_optarg ;;
1065
1066 -ieee | --ieee)
1067 IEEE=true ;;
1068 -noieee | --noieee)
1069 IEEE= ;;
1070
1071 -mpi | --mpi)
1072 MPI=true ;;
1073 -mpi=* | --mpi=*)
1074 MPIPATH=$ac_optarg
1075 MPI=true ;;
1076
1077 # -jam | --jam)
1078 # JAM=1 ;;
1079 # -nojam | --nojam)
1080 # JAM=0 ;;
1081
1082 -ds | --ds)
1083 DUMPSTATE=t ;;
1084
1085 -taf_extra | --taf_extra)
1086 ac_prev=TAF_EXTRA ;;
1087 -taf_extra=* | --taf_extra=*)
1088 TAF_EXTRA=$ac_optarg ;;
1089
1090 -tamc_extra | --tamc_extra)
1091 ac_prev=TAMC_EXTRA ;;
1092 -tamc_extra=* | --tamc_extra=*)
1093 TAMC_EXTRA=$ac_optarg ;;
1094
1095 -*)
1096 echo "Error: unrecognized option: "$ac_option
1097 usage
1098 ;;
1099
1100 *)
1101 echo "Error: unrecognized argument: "$ac_option
1102 usage
1103 ;;
1104
1105 esac
1106
1107 done
1108
1109
1110 if test -f ./.genmakerc ; then
1111 echo
1112 echo "WARNING: genmake2 has detected a copy of the old-style \"./.genmakerc\""
1113 echo " file. This file format is no longer supported. Please see:"
1114 echo
1115 echo " http://mitgcm.org/devel_HOWTO/"
1116 echo
1117 echo " for directions on how to setup and use the new \"genmake2\" input"
1118 echo " files and send an email to MITgcm-support@mitgcm.org if you want help."
1119 echo
1120 fi
1121
1122 # Find the MITgcm ${ROOTDIR}
1123 if test "x${ROOTDIR}" = x ; then
1124 tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1125 if test "x$tmp" = "xbin" -a -d ../model -a -d ../eesup -a -d ../pkg ; then
1126 ROOTDIR=".."
1127 else
1128 for d in . .. ../.. ../../.. ../../../.. ../../../../.. ; do
1129 if [ -d "$d/model" -a -d "$d/eesupp" -a -d "$d/pkg" ]; then
1130 ROOTDIR=$d
1131 printf "Warning: ROOTDIR was not specified but there appears to be"
1132 echo " a copy of MITgcm at \"$ROOTDIR\" so we'll try it."
1133 break
1134 fi
1135 done
1136 fi
1137 fi
1138 if test "x${ROOTDIR}" = x ; then
1139 echo "Error: Cannot determine ROOTDIR for MITgcm code."
1140 echo " Please specify a ROOTDIR using either an options "
1141 echo " file or a command-line option."
1142 exit 1
1143 fi
1144 if test ! -d ${ROOTDIR} ; then
1145 echo "Error: the specified ROOTDIR (\"$ROOTDIR\") does not exist!"
1146 exit 1
1147 fi
1148
1149 # Find the MITgcm ${THISVER}
1150 if test -f "${ROOTDIR}/doc/tag-index" ; then
1151 THISVER=`grep checkpoint ${ROOTDIR}/doc/tag-index | head -1`
1152 fi
1153
1154 if test "x$MAKEFILE" = x ; then
1155 MAKEFILE="Makefile"
1156 fi
1157
1158 echo " getting OPTFILE information: "
1159 if test "x${OPTFILE}" = x ; then
1160 if test "x$MITGCM_OF" = x ; then
1161 echo "Warning: no OPTFILE specified so we'll look for possible settings"
1162 printf "\n=== Searching for possible settings for OPTFILE ===\n"
1163 find_possible_configs
1164 else
1165 OPTFILE=$MITGCM_OF
1166 fi
1167 fi
1168 if test "x$OPTFILE" != xNONE ; then
1169 if test -f "$OPTFILE" -a -r "$OPTFILE" ; then
1170 echo " using OPTFILE=\"$OPTFILE\""
1171 . "$OPTFILE"
1172 RETVAL=$?
1173 if test "x$RETVAL" != x0 ; then
1174 printf "Error: failed to source OPTFILE \"$OPTFILE\""
1175 echo "--please check that variable syntax is bash-compatible"
1176 exit 1
1177 fi
1178 if test "x$DUMPSTATE" != xf ; then
1179 cp -f $OPTFILE "genmake_optfile"
1180 fi
1181 else
1182 echo "Error: can't read OPTFILE=\"$OPTFILE\""
1183 exit 1
1184 fi
1185 fi
1186
1187 echo " getting AD_OPTFILE information: "
1188 if test "x${AD_OPTFILE}" = x ; then
1189 if test "x$MITGCM_AD_OF" = x ; then
1190 AD_OPTFILE=$ROOTDIR/tools/adjoint_options/adjoint_default
1191 else
1192 AD_OPTFILE=$MITGCM_AD_OF
1193 fi
1194 fi
1195 if test "x${AD_OPTFILE}" != xNONE ; then
1196 if test -f "$AD_OPTFILE" -a -r "$AD_OPTFILE" ; then
1197 echo " using AD_OPTFILE=\"$AD_OPTFILE\""
1198 . "$AD_OPTFILE"
1199 RETVAL=$?
1200 if test "x$RETVAL" != x0 ; then
1201 printf "Error: failed to source AD_OPTFILE \"$AD_OPTFILE\""
1202 echo "--please check that variable syntax is bash-compatible"
1203 exit 1
1204 fi
1205 if test "x$DUMPSTATE" != xf ; then
1206 cp -f $AD_OPTFILE "genmake_ad_optfile"
1207 fi
1208 else
1209 echo "Error: can't read AD_OPTFILE=\"$AD_OPTFILE\""
1210 exit 1
1211 fi
1212 fi
1213
1214 #====================================================================
1215 # Set default values if not set by the optfile
1216 #
1217 # Check that FC, CC, LINK, CPP, S64, LN, and MAKE are defined. If not,
1218 # either set defaults or complain and abort!
1219 if test ! "x$BASH" = x ; then
1220 # add a trailing space so that it works within the Makefile syntax (see below)
1221 BASH="$BASH "
1222 fi
1223 if test "x$FC" = x ; then
1224 cat <<EOF 1>&2
1225
1226 Error: no Fortran compiler: please specify using one of the following:
1227 1) within the options file ("FC=...") as specified by "-of=OPTFILE"
1228 2) the "-fc=XXX" command-line option
1229 3) the "./genmake_local" file
1230 EOF
1231 exit 1
1232 fi
1233 if test "x$CC" = x ; then
1234 CC=cc
1235 # cat <<EOF 1>&2
1236 # Error: no C compiler: please specify using one of the following:
1237 # 1) within the options file ("CC=...") as specified by "-of=OPTFILE"
1238 # 2) the "-cc=XXX" command-line option
1239 # 3) the "./genmake_local" file
1240 # EOF
1241 # exit 1
1242 fi
1243 if test "x$LINK" = x ; then
1244 LINK=$FC
1245 fi
1246 if test "x$MAKE" = x ; then
1247 MAKE="make"
1248 fi
1249 if test "x$CPP" = x ; then
1250 CPP=cpp
1251 fi
1252 #EH3 === UGLY ===
1253 # The following is an ugly little hack to check for $CPP in /lib/ and
1254 # it should eventually be replaced with a more general function that
1255 # searches a combo of the user's path and a list of "usual suspects"
1256 # to find the correct location for binaries such as $CPP.
1257 for i in " " "/lib/" ; do
1258 echo "#define A a" | $i$CPP > test_cpp 2>&1 && CPP=$i$CPP
1259 done
1260 #EH3 === UGLY ===
1261 echo "#define A a" | $CPP > test_cpp 2>&1
1262 RETVAL=$?
1263 if test "x$RETVAL" != x0 ; then
1264 cat <<EOF 1>&2
1265
1266 Error: C pre-processor "$CPP" failed the test case: please specify using:
1267
1268 1) within the options file ("CPP=...") as specified by "-of=OPTFILE"
1269 2) the "./genmake_local" file
1270 3) with the CPP environment variable
1271
1272 EOF
1273 exit 1
1274 else
1275 rm -f test_cpp
1276 fi
1277 look_for_makedepend
1278 if test "x$LN" = x ; then
1279 LN="ln -s"
1280 fi
1281 echo "test" > genmake_test_ln
1282 $LN genmake_test_ln genmake_tlink
1283 RETVAL=$?
1284 if test "x$RETVAL" != x0 ; then
1285 cat <<EOF 1>&2
1286
1287 Error: The command "ln -s" failed -- please specify a working soft-link
1288 command in the optfile.
1289
1290 EOF
1291 exit 1
1292 fi
1293 rm -f genmake_test_ln genmake_tlink
1294
1295 # Check for broken *.F/*.f handling and fix if possible
1296 check_for_broken_Ff
1297
1298 if test ! "x$MPI" = x ; then
1299 echo " Turning on MPI cpp macros"
1300 DEFINES="$DEFINES -DALLOW_USE_MPI -DALWAYS_USE_MPI"
1301 fi
1302
1303 printf "\n=== Checking system libraries ===\n"
1304 printf " Do we have the system() command using $FC... "
1305 cat > genmake_tcomp.$FS <<EOF
1306 program hello
1307 call system('echo hi')
1308 end
1309 EOF
1310 $FC $FFLAGS $DEFINES -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1311 RETVAL=$?
1312 if test "x$RETVAL" = x0 ; then
1313 HAVE_SYSTEM=t
1314 DEFINES="$DEFINES -DHAVE_SYSTEM"
1315 echo "yes"
1316 else
1317 HAVE_SYSTEM=
1318 echo "no"
1319 fi
1320 rm -f genmake_tcomp*
1321
1322 printf " Do we have the fdate() command using $FC... "
1323 cat > genmake_tcomp.$FS <<EOF
1324 program hello
1325 CHARACTER(128) string
1326 string = ' '
1327 call fdate( string )
1328 print *, string
1329 end
1330 EOF
1331 $FC $FFLAGS $DEFINES -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1332 RETVAL=$?
1333 if test "x$RETVAL" = x0 ; then
1334 HAVE_FDATE=t
1335 DEFINES="$DEFINES -DHAVE_FDATE"
1336 echo "yes"
1337 else
1338 HAVE_FDATE=
1339 echo "no"
1340 fi
1341 rm -f genmake_tcomp*
1342
1343 printf " Do we have the etime() command using $FC... "
1344 cat > genmake_tcomp.$FS <<EOF
1345 program hello
1346 REAL*4 ACTUAL, TARRAY(2)
1347 EXTERNAL ETIME
1348 REAL*4 ETIME
1349 actual = etime( tarray )
1350 print *, tarray
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_ETIME=t
1357 DEFINES="$DEFINES -DHAVE_ETIME"
1358 echo "yes"
1359 else
1360 HAVE_ETIME=
1361 echo "no"
1362 fi
1363 rm -f genmake_tcomp*
1364
1365 printf " Can we call simple C routines (here, \"cloc()\") using $FC... "
1366 check_HAVE_CLOC
1367 if test "x$HAVE_CLOC" != x ; then
1368 echo "yes"
1369 else
1370 echo "no"
1371 fi
1372 rm -f genmake_t*
1373
1374 printf " Can we use stat() through C calls... "
1375 check_HAVE_STAT
1376 if test "x$HAVE_STAT" != x ; then
1377 echo "yes"
1378 else
1379 echo "no"
1380 fi
1381 rm -f genmake_t*
1382
1383 printf " Can we create NetCDF-enabled binaries... "
1384 check_netcdf_libs
1385 if test "x$HAVE_NETCDF" != x ; then
1386 echo "yes"
1387 else
1388 echo "no"
1389 fi
1390
1391
1392 printf "\n=== Setting defaults ===\n"
1393 printf " Adding MODS directories: "
1394 for d in $MODS ; do
1395 if test ! -d $d ; then
1396 echo
1397 echo "Error: MODS directory \"$d\" not found!"
1398 exit 1
1399 else
1400 printf " $d"
1401 SOURCEDIRS="$SOURCEDIRS $d"
1402 INCLUDEDIRS="$INCLUDEDIRS $d"
1403 fi
1404 done
1405 echo
1406
1407 if test "x${PLATFORM}" = x ; then
1408 PLATFORM=$p_PLATFORM
1409 fi
1410
1411 if test "x${EXEDIR}" = x ; then
1412 tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1413 if test "x$tmp" = "xbin" -a -d ../exe -a $ROOTDIR = .. ; then
1414 EXEDIR=../exe
1415 else
1416 EXEDIR=.
1417 fi
1418 fi
1419 if test ! -d ${EXEDIR} ; then
1420 echo "Error: the specified EXEDIR (\"$EXEDIR\") does not exist!"
1421 exit 1
1422 fi
1423
1424 if test "x${TOOLSDIR}" = x ; then
1425 TOOLSDIR="$ROOTDIR/tools"
1426 fi
1427 if test ! -d ${TOOLSDIR} ; then
1428 echo "Error: the specified TOOLSDIR (\"$TOOLSDIR\") does not exist!"
1429 exit 1
1430 fi
1431 if test "x$S64" = x ; then
1432 echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.sh > /dev/null 2>&1
1433 RETVAL=$?
1434 if test "x${RETVAL}" = x0 ; then
1435 S64='$(TOOLSDIR)/set64bitConst.sh'
1436 else
1437 echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.csh > /dev/null 2>&1
1438 RETVAL=$?
1439 if test "x${RETVAL}" = x0 ; then
1440 S64='$(TOOLSDIR)/set64bitConst.csh'
1441 else
1442 cat <<EOF
1443
1444 ERROR: neither of the two default scripts:
1445
1446 ${TOOLSDIR}/set64bitConst.sh
1447 ${TOOLSDIR}/set64bitConst.csh
1448
1449 are working so please check paths or specify (with \$S64) a
1450 working version of this script.
1451
1452 EOF
1453 exit 1
1454 fi
1455 fi
1456 fi
1457 THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`
1458
1459 EXECUTABLE=${EXECUTABLE:-mitgcmuv}
1460
1461 # We have a special set of source files in eesupp/src which are
1462 # generated from some template source files. We'll make them first so
1463 # they appear as regular source code
1464 if test -r $ROOTDIR"/eesupp/src/Makefile" ; then
1465 echo " Making source files in eesupp from templates"
1466 ( cd $ROOTDIR"/eesupp/src/" && $MAKE ) > make_eesupp.errors 2>&1
1467 RETVAL=$?
1468 if test "x${RETVAL}" = x0 ; then
1469 rm -f make_eesupp.errors
1470 else
1471 echo "Error: problem encountered while building source files in eesupp:"
1472 cat make_eesupp.errors 1>&2
1473 exit 1
1474 fi
1475 fi
1476
1477 #same for exch2
1478 if test -r $ROOTDIR"/pkg/exch2/Makefile" ; then
1479 echo " Making source files in exch2 from templates"
1480 ( cd $ROOTDIR"/pkg/exch2/" && $MAKE ) > make_exch2.errors 2>&1
1481 RETVAL=$?
1482 if test "x${RETVAL}" = x0 ; then
1483 rm -f make_exch2.errors
1484 else
1485 echo "Error: problem encountered while building source files in exch2:"
1486 cat make_exch2.errors 1>&2
1487 exit 1
1488 fi
1489 fi
1490
1491 printf "\n=== Determining package settings ===\n"
1492 if test "x${PDEPEND}" = x ; then
1493 tmp=$ROOTDIR"/pkg/pkg_depend"
1494 if test -r $tmp ; then
1495 PDEPEND=$tmp
1496 else
1497 echo "Warning: No package dependency information was specified."
1498 echo " Please check that ROOTDIR/pkg/pkg_depend exists."
1499 fi
1500 else
1501 if test ! -r ${PDEPEND} ; then
1502 echo "Error: can't read package dependency info from PDEPEND=\"$PDEPEND\""
1503 exit 1
1504 fi
1505 fi
1506 echo " getting package dependency info from $PDEPEND"
1507 # Strip the comments and then convert the dependency file into
1508 # two arrays: PNAME, DNAME
1509 cat $PDEPEND | sed -e 's/#.*$//g' \
1510 | $AWK 'BEGIN{nn=-1;} (NF>0){ for(i=2;i<=NF;i++){nn++; print "PNAME_"nn"="$1"\nDNAME_"nn"="$i}} END{print "nname="nn}' \
1511 > ./.pd_tmp
1512 RETVAL=$?
1513 if test ! "x${RETVAL}" = x0 ; then
1514 echo "Error: unable to parse package dependencies -- please check PDEPEND=\"$PDEPEND\""
1515 exit 1
1516 fi
1517 . ./.pd_tmp
1518 rm -f ./.pd_tmp
1519
1520 # Search for default packages. Note that a "$ROOTDIR/pkg/pkg_groups"
1521 # file should eventually be added so that, for convenience, one can
1522 # specify groups of packages using names like "ocean" and "atmosphere".
1523 echo " checking default package list: "
1524 if test "x${PDEFAULT}" = x ; then
1525 for i in "." $MODS ; do
1526 if test -r $i"/packages.conf" ; then
1527 PDEFAULT=$i"/packages.conf"
1528 break
1529 fi
1530 done
1531 fi
1532 if test "x${PDEFAULT}" = x ; then
1533 PDEFAULT="$ROOTDIR/pkg/pkg_default"
1534 fi
1535 if test "x${PDEFAULT}" = xNONE ; then
1536 echo " default packages file disabled"
1537 else
1538 if test ! -r $PDEFAULT ; then
1539 echo "Warning: can't read default packages from PDEFAULT=\"$PDEFAULT\""
1540 else
1541 echo " using PDEFAULT=\"$PDEFAULT\""
1542 # Strip the comments and add all the names
1543 def=`cat $PDEFAULT | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
1544 RETVAL=$?
1545 if test "x${RETVAL}" != x0 ; then
1546 printf "Error: can't parse default package list "
1547 echo "-- please check PDEFAULT=\"$PDEFAULT\""
1548 exit 1
1549 fi
1550 for i in $def ; do
1551 PACKAGES="$PACKAGES $i"
1552 done
1553 echo " before group expansion packages are: $PACKAGES"
1554 RET=1
1555 while test $RET = 1 ; do expand_pkg_groups; RET=$?; done
1556 echo " after group expansion packages are: $PACKAGES"
1557 fi
1558 fi
1559
1560 echo " applying DISABLE settings"
1561 for i in $PACKAGES ; do
1562 echo $i >> ./.tmp_pack
1563 done
1564 for i in `grep "-" ./.tmp_pack` ; do
1565 j=`echo $i | sed 's/[-]//'`
1566 DISABLE="$DISABLE $j"
1567 done
1568 pack=
1569 for p in $PACKAGES ; do
1570 addit="t"
1571 for d in $DISABLE ; do
1572 if test "x$p" = "x$d" ; then
1573 addit="f"
1574 fi
1575 done
1576 if test "x$addit" = xt ; then
1577 pack="$pack $p"
1578 fi
1579 done
1580 PACKAGES="$pack"
1581 echo " applying ENABLE settings"
1582 echo "" > ./.tmp_pack
1583 PACKAGES="$PACKAGES $ENABLE"
1584 # Test if each explicitly referenced package exists
1585 for i in $PACKAGES ; do
1586 j=`echo $i | sed 's/[-+]//'`
1587 if test ! -d "$ROOTDIR/pkg/$j" ; then
1588 echo "Error: can't find package $i at \"$ROOTDIR/pkg/$i\""
1589 exit 1
1590 fi
1591 echo $i >> ./.tmp_pack
1592 done
1593 PACKAGES=
1594 for i in `grep -v "-" ./.tmp_pack | sort | uniq` ; do
1595 PACKAGES="$PACKAGES $i"
1596 done
1597 rm -f ./.tmp_pack
1598 echo " packages are: $PACKAGES"
1599
1600 # Check availability of NetCDF and then either build the MNC template
1601 # files or delete mnc from the list of available packages.
1602 echo $PACKAGES | grep ' mnc ' > /dev/null 2>&1
1603 RETVAL=$?
1604 if test "x$RETVAL" = x0 ; then
1605 if test "x$HAVE_NETCDF" != xt ; then
1606 cat <<EOF
1607
1608 *********************************************************************
1609 WARNING: the "mnc" package was enabled but tests failed to compile
1610 NetCDF applications. Please check that:
1611
1612 1) NetCDF is correctly installed for this compiler and
1613 2) the LIBS variable (within the "optfile") specifies the correct
1614 NetCDF library to link against.
1615
1616 Due to this failure, the "mnc" package is now DISABLED.
1617 *********************************************************************
1618
1619 EOF
1620 PACKAGES=`echo $PACKAGES | sed -e 's/mnc//g'`
1621 DISABLE="$DISABLE mnc"
1622 else
1623 ( cd $ROOTDIR"/pkg/mnc" && $MAKE testclean && $MAKE templates ) > make_mnc.errors 2>&1
1624 RETVAL=$?
1625 if test "x${RETVAL}" = x0 ; then
1626 rm -f make_mnc.errors
1627 else
1628 echo "Error: problem encountered while building source files in pkg/mnc:"
1629 cat make_mnc.errors 1>&2
1630 exit 1
1631 fi
1632 fi
1633 fi
1634
1635 echo " applying package dependency rules"
1636 ck=
1637 while test "x$ck" != xtt ; do
1638 i=0
1639 # rtot=${#PNAME[@]}
1640 rtot=$nname
1641 while test $i -lt $rtot ; do
1642
1643 # Is $pname in the current $PACKAGES list?
1644 # pname=${PNAME[$i]}
1645 tmp="pname=\"\$PNAME_$i\""
1646 eval $tmp
1647 pin="f"
1648 for p in $PACKAGES ; do
1649 if test "x$p" = "x$pname" ; then
1650 pin="t"
1651 fi
1652 done
1653
1654 # Is the DNAME entry a (+) or (-) rule ?
1655 tmp="dname=\"\$DNAME_$i\""
1656 eval $tmp
1657 plus="-"
1658 echo $dname | grep '^+' > /dev/null 2>&1
1659 RETVAL=$?
1660 if test "x$RETVAL" = x0 ; then
1661 plus="+"
1662 fi
1663
1664 # Is $dname in the current $PACKAGES list?
1665 dname=`echo $dname | sed -e 's/^[+-]//'`
1666 din="f"
1667 for p in $PACKAGES ; do
1668 if test "x$p" = "x$dname" ; then
1669 din="t"
1670 fi
1671 done
1672
1673 # Do we need to add $dname according to the dependency rules?
1674 if test "x$pin" = xt -a "x$plus" = "x+" -a "x$din" = xf ; then
1675 in_dis="f"
1676 for dis in $DISABLE ; do
1677 if test "x$dis" = "x$dname" ; then
1678 in_dis="t"
1679 fi
1680 done
1681 if test "x$in_dis" = xt ; then
1682 echo "Error: can't satisfy package dependencies:"
1683 echo " \"$dname\" is required by the dependency rules"
1684 echo " but is disallowed by the DISABLE settings"
1685 exit 1
1686 else
1687 PACKAGES="$PACKAGES $dname"
1688 ck=
1689 fi
1690 fi
1691
1692 # Do we need to get rid of $dname according to the dependency rules?
1693 if test "x$pin" = xt -a "x$plus" = "x-" -a "x$din" = xt; then
1694 echo "Error: can't satisfy package dependencies:"
1695 echo " \"$pname\" was requested but is disallowed by"
1696 echo " the dependency rules for \"$dname\""
1697 exit 1
1698 fi
1699 i=`echo "$i + 1" | bc -l`
1700 #i=$(( $i + 1 ))
1701 done
1702 ck=$ck"t"
1703 done
1704 echo " packages are: $PACKAGES"
1705 for i in $PACKAGES ; do
1706 adr="$ROOTDIR/pkg/$i"
1707 if test -d $adr ; then
1708 SOURCEDIRS="$SOURCEDIRS $adr"
1709 INCLUDEDIRS="$INCLUDEDIRS $adr"
1710 if test "x$i" = xautodiff ; then
1711 AUTODIFF_PKG_USED=t
1712 fi
1713 else
1714 echo "Error: the directory \"$adr\" for package $i doesn't exist"
1715 exit 1
1716 fi
1717 done
1718
1719 # Create a list of #define and #undef to enable/disable packages
1720 PACKAGES_DOT_H=PACKAGES_CONFIG.h
1721 # The following UGLY HACK sets multiple "#undef"s and it needs to go
1722 # away. On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h
1723 # file would eventually be split up so that all package-related #define
1724 # statements could be separated and handled only by genmake.
1725 names=`ls -1 "$ROOTDIR/pkg"`
1726 all_pack=
1727 DISABLED_PACKAGES=
1728 for n in $names ; do
1729 if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
1730 has_pack="f"
1731 for pack in $PACKAGES ; do
1732 if test "x$pack" = "x$n" ; then
1733 has_pack="t"
1734 break
1735 fi
1736 done
1737 if test "x$has_pack" = xf ; then
1738 undef=`echo "ALLOW_$n" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
1739 DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
1740 fi
1741 fi
1742 done
1743 ENABLED_PACKAGES=
1744 for i in $PACKAGES ; do
1745 def=`echo "ALLOW_$i" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
1746 ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
1747 #eh3 DEFINES="$DEFINES -D$def"
1748
1749 #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
1750 case $i in
1751 aim_v23)
1752 ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
1753 echo "Warning: ALLOW_AIM is set to enable aim_v23."
1754 ;;
1755 esac
1756 #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
1757
1758 done
1759
1760 echo " Adding STANDARDDIRS"
1761 BUILDDIR=${BUILDDIR:-.}
1762 if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
1763 STANDARDDIRS="eesupp model"
1764 fi
1765 if test "x$STANDARDDIRS" != x ; then
1766 for d in $STANDARDDIRS ; do
1767 adr="$ROOTDIR/$d/src"
1768 if test ! -d $adr ; then
1769 echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1770 echo " is correct and that you correctly specified the STANDARDDIRS option"
1771 exit 1
1772 else
1773 SOURCEDIRS="$SOURCEDIRS $adr"
1774 fi
1775 adr="$ROOTDIR/$d/inc"
1776 if test ! -d $adr ; then
1777 echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1778 echo " is correct and that you correctly specified the STANDARDDIRS option"
1779 exit 1
1780 else
1781 INCLUDEDIRS="$INCLUDEDIRS $adr"
1782 fi
1783 done
1784 fi
1785
1786 echo " Searching for *OPTIONS.h files in order to warn about the presence"
1787 echo " of \"#define \"-type statements that are no longer allowed:"
1788 CPP_OPTIONS=
1789 CPP_EEOPTIONS=
1790 spaths=". $INCLUDEDIRS"
1791 names=`ls -1 "$ROOTDIR/pkg"`
1792 for i in $spaths ; do
1793 try="$i/CPP_OPTIONS.h"
1794 if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
1795 echo " found CPP_OPTIONS=\"$try\""
1796 CPP_OPTIONS="$try"
1797 # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
1798 for n in $names ; do
1799 test_for_package_in_cpp_options $CPP_OPTIONS $n
1800 done
1801 fi
1802 try="$i/CPP_EEOPTIONS.h"
1803 if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
1804 echo " found CPP_EEOPTIONS=\"$try\""
1805 # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
1806 #**** not yet enabled ****
1807 # test_for_mpi_in_cpp_eeoptions $try
1808 #**** not yet enabled ****
1809 CPP_EEOPTIONS="$try"
1810 fi
1811 done
1812 if test "x$CPP_OPTIONS" = x ; then
1813 echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
1814 exit 1
1815 fi
1816
1817 # Here, we build the list of files to be "run through" the adjoint
1818 # compiler.
1819 if test -f ./ad_files ; then
1820 rm -f ./ad_files
1821 fi
1822 echo " Creating the list of files for the adjoint compiler."
1823 for i in $SOURCEDIRS ; do
1824 list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
1825 for j in $list_files ; do
1826 cat $i/$j >> ad_files
1827 done
1828 done
1829
1830
1831 echo
1832 echo "=== Creating the Makefile ==="
1833 echo " setting INCLUDES"
1834 for i in $INCLUDEDIRS ; do
1835 if test ! -d $i ; then
1836 echo "Warning: can't find INCLUDEDIRS=\"$i\""
1837 fi
1838 done
1839
1840 echo " Determining the list of source and include files"
1841 rm -rf .links.tmp
1842 mkdir .links.tmp
1843 echo "# This section creates symbolic links" > srclinks.tmp
1844 echo "" >> srclinks.tmp
1845 printf 'SRCFILES = ' > srclist.inc
1846 printf 'CSRCFILES = ' > csrclist.inc
1847 printf 'F90SRCFILES = ' > f90srclist.inc
1848 printf 'HEADERFILES = ' > hlist.inc
1849 printf 'AD_FLOW_FILES = ' > ad_flow_files.inc
1850 alldirs="$SOURCEDIRS $INCLUDEDIRS ."
1851 for d in $alldirs ; do
1852 deplist=
1853 sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
1854 sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
1855 for sf in $sfiles ; do
1856 if test ! -r ".links.tmp/$sf" ; then
1857 if test -f "$d/$sf" ; then
1858 case $d/$sf in
1859 ./$PACKAGES_DOT_H)
1860 ;;
1861 ./AD_CONFIG.h)
1862 ;;
1863 ./FC_NAMEMANGLE.h)
1864 ;;
1865 ./BUILD_INFO.h)
1866 ;;
1867 *)
1868 touch .links.tmp/$sf
1869 deplist="$deplist $sf"
1870 ;;
1871 esac
1872 extn=`echo $sf | $AWK -F. '{print $NF}'`
1873 case $extn in
1874 F)
1875 echo " \\" >> srclist.inc
1876 printf " $sf" >> srclist.inc
1877 ;;
1878 F90)
1879 echo " \\" >> f90srclist.inc
1880 printf " $sf" >> f90srclist.inc
1881 ;;
1882 c)
1883 echo " \\" >> csrclist.inc
1884 printf " $sf" >> csrclist.inc
1885 ;;
1886 h)
1887 echo " \\" >> hlist.inc
1888 printf " $sf" >> hlist.inc
1889 ;;
1890 flow)
1891 echo " \\" >> ad_flow_files.inc
1892 printf " $sf" >> ad_flow_files.inc
1893 ;;
1894 esac
1895 fi
1896 fi
1897 done
1898 if test "x$deplist" != x ; then
1899 echo "" >> srclinks.tmp
1900 echo "# These files are linked from $d" >> srclinks.tmp
1901 echo "$deplist :" >> srclinks.tmp
1902 printf "\t\$(LN) %s/\$@ \$@\n" $d >> srclinks.tmp
1903 fi
1904 done
1905 rm -rf .links.tmp
1906 echo "" >> srclist.inc
1907 echo "" >> csrclist.inc
1908 echo "" >> f90srclist.inc
1909 echo "" >> hlist.inc
1910 echo "" >> ad_flow_files.inc
1911
1912 if test -f $MAKEFILE ; then
1913 mv -f $MAKEFILE "$MAKEFILE.bak"
1914 fi
1915 echo " Writing makefile: $MAKEFILE"
1916 echo "# Multithreaded + multi-processing makefile for:" > $MAKEFILE
1917 echo "# $MACHINE" >> $MAKEFILE
1918 echo "# This makefile was generated automatically on" >> $MAKEFILE
1919 echo "# $THISDATE" >> $MAKEFILE
1920 echo "# by the command:" >> $MAKEFILE
1921 echo "# $0 $G2ARGS" >> $MAKEFILE
1922 echo "# executed by:" >> $MAKEFILE
1923 echo "# ${THISUSER}@${THISHOST}:${THISCWD}" >> $MAKEFILE
1924
1925 EXE_AD=$EXECUTABLE"_ad"
1926 EXE_FTL=$EXECUTABLE"_ftl"
1927 EXE_SVD=$EXECUTABLE"_svd"
1928
1929 cat >>$MAKEFILE <<EOF
1930 #
1931 # OPTFILE="$OPTFILE"
1932 #
1933 # BUILDDIR : Directory where object files are written
1934 # SOURCEDIRS : Directories containing the source (.F) files
1935 # INCLUDEDIRS : Directories containing the header-source (.h) files
1936 # EXEDIR : Directory where executable that is generated is written
1937 # EXECUTABLE : Full path of executable binary
1938 #
1939 # CPP : C-preprocessor command
1940 # INCLUDES : Directories searched for header files
1941 # DEFINES : Macro definitions for CPP
1942 # MAKEDEPEND : Dependency generator
1943 # KPP : Special preprocessor command (specific to platform)
1944 # KFLAGS : Flags for KPP
1945 # FC : Fortran compiler command
1946 # FFLAGS : Configuration/debugging options for FC
1947 # FOPTIM : Optimization options for FC
1948 # LINK : Command for link editor program
1949 # LIBS : Library flags /or/ additional optimization/debugging flags
1950
1951 ROOTDIR = ${ROOTDIR}
1952 BUILDDIR = ${BUILDDIR}
1953 SOURCEDIRS = ${SOURCEDIRS}
1954 INCLUDEDIRS = ${INCLUDEDIRS}
1955 EXEDIR = ${EXEDIR}
1956 EXECUTABLE = \$(EXEDIR)/${EXECUTABLE}
1957 TOOLSDIR = ${TOOLSDIR}
1958
1959 #eh3 new defines for the adjoint work
1960 AUTODIFF = ${ROOTDIR}/pkg/autodiff
1961 EXE_AD = ${EXE_AD}
1962 EXE_FTL = ${EXE_FTL}
1963 EXE_SVD = ${EXE_SVD}
1964
1965 ENABLED_PACKAGES = ${ENABLED_PACKAGES}
1966 DISABLED_PACKAGES = ${DISABLED_PACKAGES}
1967
1968 # These files are created by Makefile
1969 SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h BUILD_INFO.h
1970
1971 EOF
1972
1973 # Note: figure out some way to add Hyades JAM libraries here
1974
1975 cat >>$MAKEFILE <<EOF
1976 # Unix ln (link)
1977 LN = ${LN}
1978 # C preprocessor
1979 CPP = cat \$< | ${S64} | ${CPP}
1980 # Dependency generator
1981 MAKEDEPEND = ${MAKEDEPEND}
1982 # Special preprocessor (KAP on DECs, FPP on Crays)
1983 KPP = ${KPP}
1984 # Fortran compiler
1985 FC = ${FC}
1986 # Fortran compiler
1987 F90C = ${F90C}
1988 # C compiler
1989 CC = ${CC}
1990 # Link editor
1991 LINK = ${LINK} ${LDADD}
1992
1993 # Defines for CPP
1994 DEFINES = ${DEFINES}
1995 # Includes for CPP
1996 INCLUDES = ${INCLUDES}
1997 # Flags for KPP
1998 KFLAGS1 = ${KFLAGS1}
1999 KFLAGS2 = ${KFLAGS2}
2000 # Optim./debug for FC
2001 FFLAGS = ${FFLAGS}
2002 FOPTIM = ${FOPTIM}
2003 # Optim./debug for FC
2004 F90FLAGS = ${F90FLAGS}
2005 F90OPTIM = ${F90OPTIM}
2006 # Flags for CC
2007 CFLAGS = ${CFLAGS}
2008 # Files that should not be optimized
2009 NOOPTFILES = ${NOOPTFILES}
2010 NOOPTFLAGS = ${NOOPTFLAGS}
2011 # Flags and libraries needed for linking
2012 LIBS = ${LIBS}
2013 # Name of the Mekfile
2014 MAKEFILE=${MAKEFILE}
2015
2016 EOF
2017
2018 cat srclist.inc >> $MAKEFILE
2019 cat csrclist.inc >> $MAKEFILE
2020 cat f90srclist.inc >> $MAKEFILE
2021 cat hlist.inc >> $MAKEFILE
2022 cat ad_flow_files.inc >> $MAKEFILE
2023 echo >> $MAKEFILE
2024 echo 'F77FILES = $(SRCFILES:.F=.'$FS')' >> $MAKEFILE
2025 echo 'F90FILES = $(F90SRCFILES:.F=.'$FS90')' >> $MAKEFILE
2026 echo 'OBJFILES = $(SRCFILES:.F=.o) $(CSRCFILES:.c=.o) $(F90SRCFILES:.F90=.o)' >> $MAKEFILE
2027 echo >> $MAKEFILE
2028 echo '.SUFFIXES:' >> $MAKEFILE
2029 echo '.SUFFIXES: .o .'$FS' .p .F .c .'$FS90' .F90' >> $MAKEFILE
2030 rm -f srclist.inc csrclist.inc hlist.inc flist.tmp clist.tmp f90srclist.inc
2031 rm -f ad_flow_files.inc
2032
2033 cat >>$MAKEFILE <<EOF
2034
2035 all: \$(EXECUTABLE)
2036 \$(EXECUTABLE): \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(OBJFILES)
2037 @echo Creating \$@ ...
2038 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
2039 depend:
2040 @make links
2041 \$(MAKEDEPEND) -o .$FS \$(DEFINES) \$(INCLUDES) \$(SRCFILES)
2042 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
2043 -rm -f makedepend.out
2044
2045 links: \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(SPECIAL_FILES)
2046
2047 small_f: \$(F77FILES) \$(F90FILES)
2048
2049 output.txt: \$(EXECUTABLE)
2050 @printf 'running ... '
2051 @\$(EXECUTABLE) > \$@
2052
2053 clean:
2054 -rm -rf *.o *.$FS *.p *.$FS90 *.mod ${RMFILES} work.{pc,pcl} *.template
2055 Clean:
2056 @make clean
2057 @make cleanlinks
2058 -rm -f \$(SPECIAL_FILES)
2059 -rm -f genmake_state genmake_*optfile genmake_warnings make.log run.log *.bak
2060 CLEAN:
2061 @make Clean
2062 -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
2063 -find \$(EXEDIR) -name "*.data" -exec rm {} \;
2064 -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
2065 -rm -f \$(EXECUTABLE) output.txt STD*
2066
2067 #eh3 Makefile: makefile
2068 makefile:
2069 $THIS_SCRIPT $G2ARGS
2070 cleanlinks:
2071 -find . -type l -exec rm {} \;
2072
2073 # Special targets (SPECIAL_FILES) which are create by make
2074 ${PACKAGES_DOT_H}:
2075 @echo Creating \$@ ...
2076 @$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) > \$@
2077 AD_CONFIG.h:
2078 @echo Creating \$@ ...
2079 @$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 > \$@
2080 FC_NAMEMANGLE.h:
2081 @echo Creating \$@ ...
2082 echo "$FC_NAMEMANGLE" > \$@
2083
2084 BUILD_INFO.h:
2085 @echo Creating \$@ ...
2086 EOF
2087
2088 test ! "x$THISVER" = x && echo " -echo \"#define THISVER '$THISVER'\" > \$@" >> $MAKEFILE
2089 test ! "x$THISUSER" = x && echo " -echo \"#define THISUSER '$THISUSER'\" >> \$@" >> $MAKEFILE
2090 test ! "x$THISDATE" = x && echo " -echo \"#define THISDATE '$THISDATE'\" >> \$@" >> $MAKEFILE
2091 test ! "x$THISHOST" = x && echo " -echo \"#define THISHOST '$THISHOST'\" >> \$@" >> $MAKEFILE
2092
2093 cat >>$MAKEFILE <<EOF
2094
2095 # The normal chain of rules is ( .F - .$FS - .o )
2096
2097 ## This nullifies any default implicit rules concerning these two file types:
2098 ## %.o : %.F
2099
2100 .F.$FS:
2101 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2102 .$FS.o:
2103 \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
2104 .F90.$FS90:
2105 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2106 .$FS90.o:
2107 \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
2108 .c.o:
2109 \$(CC) \$(CFLAGS) -c \$<
2110
2111 # Special exceptions that use the ( .F - .p - .$FS - .o ) rule-chain
2112 .F.p:
2113 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2114 .p.$FS:
2115 \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
2116
2117 #=========================================
2118 #=== Automatic Differentiation Rules ===
2119
2120 TAMC = ${TAMC}
2121 TAF = ${TAF}
2122
2123 TAF_EXTRA = ${TAF_EXTRA}
2124 TAMC_EXTRA = ${TAMC_EXTRA}
2125
2126 EOF
2127
2128 ad_vars="AD_TAMC_FLAGS AD_TAF_FLAGS"
2129 ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF_FLAGS"
2130 ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
2131 for i in $ad_vars ; do
2132 name=$i
2133 t1="t2=\$"`echo $i`
2134 eval $t1
2135 printf "%-20s = " $name >> $MAKEFILE
2136 echo $t2 >> $MAKEFILE
2137 done
2138
2139 echo " Add the source list for AD code generation"
2140 echo >> $MAKEFILE
2141 printf "AD_FILES = " >> $MAKEFILE
2142 AD_FILES=`cat ad_files`
2143 for i in $AD_FILES ; do
2144 echo " \\" >> $MAKEFILE
2145 printf " $i" >> $MAKEFILE
2146 done
2147 echo >> $MAKEFILE
2148 rm -f ad_files
2149
2150 cat >>$MAKEFILE <<EOF
2151
2152 # ... AD ...
2153 adall: ad_taf
2154 adtaf: ad_taf_output.f
2155 adtamc: ad_tamc_output.f
2156
2157 ad_input_code.f: \$(AD_FILES) \$(HEADERFILES)
2158 @$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
2159 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
2160 -rm -f ad_config.template
2161 @make \$(F77FILES)
2162 @make \$(AD_FLOW_FILES)
2163 cat \$(AD_FLOW_FILES) \$(AD_FILES) > ad_input_code.f
2164
2165 ad_taf_output.f: ad_input_code.f
2166 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f
2167 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f
2168
2169 adtafonly:
2170 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f
2171 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f
2172
2173 ad_taf: ad_taf_output.o \$(OBJFILES)
2174 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
2175
2176 ad_tamc_output.f: ad_input_code.f
2177 \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.f
2178 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.f
2179
2180 ad_tamc: ad_tamc_output.o \$(OBJFILES)
2181 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
2182
2183 adonlyfwd:
2184 patch < \$(TOOLSDIR)/ad_taf_output.f.onlyfwd.diff
2185
2186 adtrick:
2187 patch < \$(TOOLSDIR)/ad_taf_output.f.adtrick.diff
2188
2189 # ... FTL ...
2190 ftlall: ftl_taf
2191 ftltaf: ftl_taf_output.f
2192 ftltamc: ftl_tamc_output.f
2193
2194 ftl_input_code.f: \$(AD_FILES) \$(HEADERFILES)
2195 @$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
2196 cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
2197 -rm -f ftl_config.template
2198 @make \$(F77FILES)
2199 @make \$(AD_FLOW_FILES)
2200 cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.f
2201
2202 ftl_taf_output.f: ftl_input_code.f
2203 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f
2204 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f
2205
2206 ftltafonly:
2207 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f
2208 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f
2209
2210 ftl_taf: ftl_taf_output.o \$(OBJFILES)
2211 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
2212
2213 ftl_tamc_output.f: ftl_input_code.f
2214 \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.f
2215 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.f
2216
2217 ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
2218 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
2219
2220
2221 # ... SVD ...
2222 svdtaf: ad_taf_output.f ftl_taf_output.f
2223 @echo "--->>> Only ran TAF to generate SVD code! <<<---"
2224 @echo "--->>> Do make svdall afterwards to compile. <<<---"
2225 svdall: svd_touch svd_taf
2226
2227 svd_taf: \$(OBJFILES)
2228 \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
2229
2230 @echo "--->>> Only COMPILE svd code! <<<---"
2231 @echo "--->>> Assumes you previously <<<---"
2232 @echo "--->>> did make svdtaf <<<---"
2233
2234 svd_touch:
2235 @echo "--->>> Only COMPILE svd code! <<<---"
2236 @echo "--->>> Assumes you previously <<<---"
2237 @echo "--->>> did make svdtaf <<<---"
2238 touch ad_taf_output.f ftl_taf_output.f
2239 \$(FC) \$(FFLAGS) \$(FOPTIM) -c ad_taf_output.f
2240 \$(FC) \$(FFLAGS) \$(FOPTIM) -c ftl_taf_output.f
2241 @$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
2242 cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
2243 -rm -f ftl_config.template
2244
2245 #=========================================
2246
2247 EOF
2248
2249 if test "x$EXEHOOK" != x ; then
2250 printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE
2251 fi
2252
2253 echo " Making list of \"exceptions\" that need \".p\" files"
2254 for i in $KPPFILES ; do
2255 base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
2256 RETVAL=$?
2257 if test "x$RETVAL" != x0 ; then
2258 echo "Error: unable to add file \"$i\" to the exceptions list"
2259 fi
2260 echo "$base.$FS: $base.p" >> $MAKEFILE
2261 done
2262
2263 echo " Making list of NOOPTFILES"
2264 for i in $NOOPTFILES ; do
2265 base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
2266 RETVAL=$?
2267 if test "x$RETVAL" != x0 ; then
2268 echo "Error: unable to add file \"$i\" to the exceptions list"
2269 fi
2270 echo "$base.o: $base.$FS" >> $MAKEFILE
2271 printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE
2272 done
2273
2274 echo " Add rules for links"
2275 cat srclinks.tmp >> $MAKEFILE
2276 rm -f srclinks.tmp
2277
2278 echo " Adding makedepend marker"
2279 printf "\n\n# DO NOT DELETE\n" >> $MAKEFILE
2280
2281 printf "\n=== Done ===\n"
2282
2283 # Create special header files
2284 $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"
2285 if test ! -f $PACKAGES_DOT_H ; then
2286 mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
2287 else
2288 cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H > /dev/null 2>&1
2289 RETVAL=$?
2290 if test "x$RETVAL" = x0 ; then
2291 rm -f $PACKAGES_DOT_H".tmp"
2292 else
2293 mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"
2294 mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
2295 fi
2296 fi
2297 if test ! -f AD_CONFIG.h ; then
2298 $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
2299 fi
2300
2301
2302 # Write the "state" for future records
2303 if test "x$DUMPSTATE" != xf ; then
2304 printf "" > genmake_state
2305 for i in $gm_state ; do
2306 t1="t2=\$$i"
2307 eval $t1
2308 echo "$i='$t2'" >> genmake_state
2309 done
2310 fi

  ViewVC Help
Powered by ViewVC 1.1.22