/[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.55 - (show annotations) (download)
Sat Dec 6 00:34:29 2003 UTC (20 years, 3 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint52d_pre
Changes since 1.54: +2 -3 lines
no more DEFINES="-DALLOW_AIM" ; no longer "REALLY ugly", but still a little

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

  ViewVC Help
Powered by ViewVC 1.1.22