/[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.57 - (show annotations) (download)
Tue Dec 9 18:58:24 2003 UTC (20 years, 3 months ago) by edhill
Branch: MAIN
CVS Tags: checkpoint52e_pre, checkpoint52e_post, checkpoint52d_post, checkpoint52f_post, checkpoint52f_pre
Branch point for: netcdf-sm0
Changes since 1.56: +23 -21 lines
 o change --standarddirs option so that one can specify -standarddirs=""
   and actually remove all the standard directories from use

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

  ViewVC Help
Powered by ViewVC 1.1.22