/[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.53 - (show annotations) (download)
Fri Dec 5 15:08:33 2003 UTC (15 years, 10 months ago) by edhill
Branch: MAIN
Changes since 1.52: +3 -1 lines
 o add "# OPTFILE='...' comment to the Makefile so that it can be later
   extracted by the testing/verification scripts

1 #! /usr/bin/env bash
2 #
3 # $Header: /u/u3/gcmpack/MITgcm/tools/genmake2,v 1.52 2003/12/04 15:00:01 adcroft 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 DEFINES="$DEFINES -DALLOW_AIM"
1181 ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
1182 echo "Warning: ALLOW_AIM is set to enable aim_v23. This is REALLY ugly Jean-Michel :-)"
1183 ;;
1184 esac
1185 #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
1186
1187 done
1188
1189 echo " Adding STANDARDDIRS"
1190 BUILDDIR=${BUILDDIR:-.}
1191 if test "x$STANDARDDIRS" = x ; then
1192 STANDARDDIRS="eesupp model"
1193 fi
1194 for d in $STANDARDDIRS ; do
1195 adr="$ROOTDIR/$d/src"
1196 if test ! -d $adr ; then
1197 echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1198 echo " is correct and that you correctly specified the STANDARDDIRS option"
1199 exit 1
1200 else
1201 SOURCEDIRS="$SOURCEDIRS $adr"
1202 fi
1203 adr="$ROOTDIR/$d/inc"
1204 if test ! -d $adr ; then
1205 echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1206 echo " is correct and that you correctly specified the STANDARDDIRS option"
1207 exit 1
1208 else
1209 INCLUDEDIRS="$INCLUDEDIRS $adr"
1210 fi
1211 done
1212
1213 echo " Searching for *OPTIONS.h files in order to warn about the presence"
1214 echo " of \"#define \"-type statements that are no longer allowed:"
1215 CPP_OPTIONS=
1216 CPP_EEOPTIONS=
1217 spaths=". $INCLUDEDIRS"
1218 names=`ls -1 "$ROOTDIR/pkg"`
1219 for i in $spaths ; do
1220 try="$i/CPP_OPTIONS.h"
1221 if test -f $try -a -r $try -a "x$CPP_OPTIONS" == x ; then
1222 echo " found CPP_OPTIONS=\"$try\""
1223 CPP_OPTIONS="$try"
1224 # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
1225 for n in $names ; do
1226 test_for_package_in_cpp_options $CPP_OPTIONS $n
1227 done
1228 fi
1229 try="$i/CPP_EEOPTIONS.h"
1230 if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" == x ; then
1231 echo " found CPP_EEOPTIONS=\"$try\""
1232 # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
1233 #**** not yet enabled ****
1234 # test_for_mpi_in_cpp_eeoptions $try
1235 #**** not yet enabled ****
1236 CPP_EEOPTIONS="$try"
1237 fi
1238 done
1239 if test "x$CPP_OPTIONS" = x ; then
1240 echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
1241 exit 1
1242 fi
1243
1244 # Here, we build the list of files to be "run through" the adjoint
1245 # compiler.
1246 if test -f ./ad_files ; then
1247 rm -f ./ad_files
1248 fi
1249 echo " Creating the list of files for the adjoint compiler."
1250 for i in $SOURCEDIRS ; do
1251 list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
1252 for j in $list_files ; do
1253 cat $i/$j >> ad_files
1254 done
1255 done
1256
1257 echo
1258 echo "=== Creating the Makefile ==="
1259 echo " setting INCLUDES"
1260 for i in $INCLUDEDIRS ; do
1261 if ! test -d $i ; then
1262 # INCLUDES="$INCLUDES -I$i"
1263 # else
1264 echo "Warning: can't find INCLUDEDIRS=\"$i\""
1265 fi
1266 done
1267
1268 echo " Determining the list of source and include files"
1269 rm -rf .links.tmp
1270 mkdir .links.tmp
1271 echo "# This section creates symbolic links" > srclinks.tmp
1272 echo "" >> srclinks.tmp
1273 echo -n 'SRCFILES = ' > srclist.inc
1274 echo -n 'CSRCFILES = ' > csrclist.inc
1275 echo -n 'F90SRCFILES = ' > f90srclist.inc
1276 echo -n 'HEADERFILES = ' > hlist.inc
1277 echo -n 'AD_FLOW_FILES = ' > ad_flow_files.inc
1278 alldirs="$SOURCEDIRS $INCLUDEDIRS ."
1279 for d in $alldirs ; do
1280 deplist=
1281 sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
1282 sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
1283 for sf in $sfiles ; do
1284 if test ! -r ".links.tmp/$sf" ; then
1285 if test -f "$d/$sf" ; then
1286 case $d/$sf in
1287 ./$PACKAGES_DOT_H)
1288 ;;
1289 ./AD_CONFIG.h)
1290 ;;
1291 ./FC_NAMEMANGLE.h)
1292 ;;
1293 *)
1294 touch .links.tmp/$sf
1295 deplist="$deplist $sf"
1296 ;;
1297 esac
1298 extn=`echo $sf | $AWK -F '.' '{print $NF}'`
1299 case $extn in
1300 F)
1301 echo " \\" >> srclist.inc
1302 echo -n " $sf" >> srclist.inc
1303 ;;
1304 F90)
1305 echo " \\" >> f90srclist.inc
1306 echo -n " $sf" >> f90srclist.inc
1307 ;;
1308 c)
1309 echo " \\" >> csrclist.inc
1310 echo -n " $sf" >> csrclist.inc
1311 ;;
1312 h)
1313 echo " \\" >> hlist.inc
1314 echo -n " $sf" >> hlist.inc
1315 ;;
1316 flow)
1317 echo " \\" >> ad_flow_files.inc
1318 echo -n " $sf" >> ad_flow_files.inc
1319 ;;
1320 esac
1321 fi
1322 fi
1323 done
1324 if test "x$deplist" != x ; then
1325 echo "" >> srclinks.tmp
1326 echo "# These files are linked from $d" >> srclinks.tmp
1327 echo "$deplist :" >> srclinks.tmp
1328 printf "\t\$(LN) %s/\$@ \$@\n" $d >> srclinks.tmp
1329 fi
1330 done
1331 rm -rf .links.tmp
1332 echo "" >> srclist.inc
1333 echo "" >> csrclist.inc
1334 echo "" >> f90srclist.inc
1335 echo "" >> hlist.inc
1336 echo "" >> ad_flow_files.inc
1337
1338 if test -e $MAKEFILE ; then
1339 mv -f $MAKEFILE "$MAKEFILE.bak"
1340 fi
1341 echo " Writing makefile: $MAKEFILE"
1342 echo "# Multithreaded + multi-processing makefile for:" > $MAKEFILE
1343 echo "# $MACHINE" >> $MAKEFILE
1344 echo "# This makefile was generated automatically on" >> $MAKEFILE
1345 echo "# $THISDATE" >> $MAKEFILE
1346 echo "# by the command:" >> $MAKEFILE
1347 echo "# $0 $@" >> $MAKEFILE
1348 echo "# executed by:" >> $MAKEFILE
1349 echo "# $USER@${THISHOSTNAME}:${THISCWD}" >> $MAKEFILE
1350
1351 EXE_AD=$EXECUTABLE"_ad"
1352 EXE_FTL=$EXECUTABLE"_ftl"
1353 EXE_SVD=$EXECUTABLE"_svd"
1354
1355 cat >>$MAKEFILE <<EOF
1356 #
1357 # OPTFILE="$OPTFILE"
1358 #
1359 # BUILDDIR : Directory where object files are written
1360 # SOURCEDIRS : Directories containing the source (.F) files
1361 # INCLUDEDIRS : Directories containing the header-source (.h) files
1362 # EXEDIR : Directory where executable that is generated is written
1363 # EXECUTABLE : Full path of executable binary
1364 #
1365 # CPP : C-preprocessor command
1366 # INCLUDES : Directories searched for header files
1367 # DEFINES : Macro definitions for CPP
1368 # MAKEDEPEND : Dependency generator
1369 # KPP : Special preprocessor command (specific to platform)
1370 # KFLAGS : Flags for KPP
1371 # FC : Fortran compiler command
1372 # FFLAGS : Configuration/debugging options for FC
1373 # FOPTIM : Optimization options for FC
1374 # LINK : Command for link editor program
1375 # LIBS : Library flags /or/ additional optimization/debugging flags
1376
1377 ROOTDIR = ${ROOTDIR}
1378 BUILDDIR = ${BUILDDIR}
1379 SOURCEDIRS = ${SOURCEDIRS}
1380 INCLUDEDIRS = ${INCLUDEDIRS}
1381 EXEDIR = ${EXEDIR}
1382 EXECUTABLE = \$(EXEDIR)/${EXECUTABLE}
1383 TOOLSDIR = ${TOOLSDIR}
1384
1385 #eh3 new defines for the adjoint work
1386 AUTODIFF = ${ROOTDIR}/pkg/autodiff
1387 EXE_AD = ${EXE_AD}
1388 EXE_FTL = ${EXE_FTL}
1389 EXE_SVD = ${EXE_SVD}
1390
1391 ENABLED_PACKAGES = ${ENABLED_PACKAGES}
1392 DISABLED_PACKAGES = ${DISABLED_PACKAGES}
1393
1394 # These files are created by Makefile
1395 SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h
1396
1397 EOF
1398
1399 # Note: figure out some way to add Hyades JAM libraries here
1400
1401 cat >>$MAKEFILE <<EOF
1402 # Unix ln (link)
1403 LN = ${LN}
1404 # C preprocessor
1405 CPP = cat \$< | ${S64} | ${CPP}
1406 # Dependency generator
1407 MAKEDEPEND = ${MAKEDEPEND}
1408 # Special preprocessor (KAP on DECs, FPP on Crays)
1409 KPP = ${KPP}
1410 # Fortran compiler
1411 FC = ${FC}
1412 # Fortran compiler
1413 F90C = ${F90C}
1414 # Link editor
1415 LINK = ${LINK}
1416
1417 # Defines for CPP
1418 DEFINES = ${DEFINES}
1419 # Includes for CPP
1420 INCLUDES = ${INCLUDES}
1421 # Flags for KPP
1422 KFLAGS1 = ${KFLAGS1}
1423 KFLAGS2 = ${KFLAGS2}
1424 # Optim./debug for FC
1425 FFLAGS = ${FFLAGS}
1426 FOPTIM = ${FOPTIM}
1427 # Optim./debug for FC
1428 F90FLAGS = ${F90FLAGS}
1429 F90OPTIM = ${F90OPTIM}
1430 # Flags for CC
1431 CFLAGS = ${CFLAGS}
1432 # Files that should not be optimized
1433 NOOPTFILES = ${NOOPTFILES}
1434 NOOPTFLAGS = ${NOOPTFLAGS}
1435 # Flags and libraries needed for linking
1436 LIBS = ${LIBS} \$(XLIBS)
1437 # Name of the Mekfile
1438 MAKEFILE=${MAKEFILE}
1439
1440 EOF
1441
1442 cat srclist.inc >> $MAKEFILE
1443 cat csrclist.inc >> $MAKEFILE
1444 cat f90srclist.inc >> $MAKEFILE
1445 cat hlist.inc >> $MAKEFILE
1446 cat ad_flow_files.inc >> $MAKEFILE
1447 echo >> $MAKEFILE
1448 echo 'F77FILES = $(SRCFILES:.F=.f)' >> $MAKEFILE
1449 echo 'F90FILES = $(F90SRCFILES:.F90=.f90)' >> $MAKEFILE
1450 echo 'OBJFILES = $(SRCFILES:.F=.o) $(CSRCFILES:.c=.o) $(F90SRCFILES:.F90=.o)' >> $MAKEFILE
1451
1452 rm -f srclist.inc csrclist.inc hlist.inc flist.tmp clist.tmp f90srclist.inc
1453 rm -f ad_flow_files.inc
1454
1455 cat >>$MAKEFILE <<EOF
1456
1457 .SUFFIXES:
1458 .SUFFIXES: .o .f .p .F .c .F90 .f90
1459
1460 all: \$(EXECUTABLE)
1461 \$(EXECUTABLE): \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(OBJFILES)
1462 @echo Creating \$@ ...
1463 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
1464 depend:
1465 @make links
1466 \$(MAKEDEPEND) -o .f \$(DEFINES) \$(INCLUDES) \$(SRCFILES)
1467 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
1468
1469 links: \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(SPECIAL_FILES)
1470
1471 small_f: \$(F77FILES) \$(F90FILES)
1472
1473 output.txt: \$(EXECUTABLE)
1474 @printf 'running ... '
1475 @\$(EXECUTABLE) > \$@
1476
1477 clean:
1478 -rm -rf *.o *.f *.p *.f90 *.mod ${RMFILES} work.{pc,pcl} *.template
1479 Clean:
1480 @make clean
1481 @make cleanlinks
1482 -rm -f \$(SPECIAL_FILES)
1483 -rm -f genmake_state genmake_*optfile genmake_warnings make.log run.log *.bak
1484 CLEAN:
1485 @make Clean
1486 -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
1487 -find \$(EXEDIR) -name "*.data" -exec rm {} \;
1488 -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
1489 -rm -f \$(EXECUTABLE) output.txt
1490
1491 #eh3 Makefile: makefile
1492 makefile:
1493 $THIS_SCRIPT $@
1494 cleanlinks:
1495 -find . -type l -exec rm {} \;
1496
1497 # Special targets ($SPECIAL_FILES) which are create by make
1498 ${PACKAGES_DOT_H}:
1499 @echo Creating \$@ ...
1500 @\$(TOOLSDIR)/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -bPACKAGES_CONFIG_H "Disabled packages:" \$(DISABLED_PACKAGES) " " "Enabled packages:" \$(ENABLED_PACKAGES) > \$@
1501 AD_CONFIG.h:
1502 @echo Creating \$@ ...
1503 @\$(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 > \$@
1504 FC_NAMEMANGLE.h:
1505 @echo Creating \$@ ...
1506 echo "$FC_NAMEMANGLE" > \$@
1507
1508 # The normal chain of rules is ( .F - .f - .o )
1509 .F.f:
1510 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1511 .f.o:
1512 \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
1513 .F90.f90:
1514 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1515 .f90.o:
1516 \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
1517 .c.o:
1518 \$(CC) \$(CFLAGS) -c \$<
1519
1520 # Special exceptions that use the ( .F - .p - .f - .o ) rule-chain
1521 .F.p:
1522 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1523 .p.f:
1524 \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
1525
1526 #=========================================
1527 #=== Automatic Differentiation Rules ===
1528
1529 TAMC = ${TAMC}
1530 TAF = ${TAF}
1531
1532 TAF_EXTRA = ${TAF_EXTRA}
1533 TAMC_EXTRA = ${TAMC_EXTRA}
1534
1535 EOF
1536
1537 ad_vars="AD_TAMC_FLAGS AD_TAF_FLAGS"
1538 ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF_FLAGS"
1539 ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
1540 for i in $ad_vars ; do
1541 name=$i
1542 t1="t2=\$"`echo $i`
1543 eval $t1
1544 printf "%-20s = " $name >> $MAKEFILE
1545 echo $t2 >> $MAKEFILE
1546 done
1547
1548 echo " Add the source list for AD code generation"
1549 echo >> $MAKEFILE
1550 echo -n "AD_FILES = " >> $MAKEFILE
1551 AD_FILES=`cat ad_files`
1552 for i in $AD_FILES ; do
1553 echo " \\" >> $MAKEFILE
1554 echo -n " $i" >> $MAKEFILE
1555 done
1556 echo >> $MAKEFILE
1557 rm -f ad_files
1558
1559 cat >>$MAKEFILE <<EOF
1560
1561 # ... AD ...
1562 adall: ad_taf
1563 adtaf: ad_taf_output.f
1564 adtamc: ad_tamc_output.f
1565
1566 ad_input_code.f: \$(AD_FILES) \$(HEADERFILES)
1567 @\$(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
1568 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
1569 -rm -f ad_config.template
1570 @make \$(F77FILES)
1571 @make \$(AD_FLOW_FILES)
1572 cat \$(AD_FLOW_FILES) \$(AD_FILES) > ad_input_code.f
1573
1574 ad_taf_output.f: ad_input_code.f
1575 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f
1576 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f
1577
1578 adtafonly:
1579 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f
1580 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f
1581
1582 ad_taf: ad_taf_output.o \$(OBJFILES)
1583 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
1584
1585 ad_tamc_output.f: ad_input_code.f
1586 \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.f
1587 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.f
1588
1589 ad_tamc: ad_tamc_output.o \$(OBJFILES)
1590 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
1591
1592
1593 # ... FTL ...
1594 ftlall: ftl_taf
1595 ftltaf: ftl_taf_output.f
1596 ftltamc: ftl_tamc_output.f
1597
1598 ftl_input_code.f: \$(AD_FILES) \$(HEADERFILES)
1599 @\$(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
1600 cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
1601 -rm -f ftl_config.template
1602 @make \$(F77FILES)
1603 @make \$(AD_FLOW_FILES)
1604 cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.f
1605
1606 ftl_taf_output.f: ftl_input_code.f
1607 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f
1608 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f
1609
1610 ftltafonly:
1611 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f
1612 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f
1613
1614 ftl_taf: ftl_taf_output.o \$(OBJFILES)
1615 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
1616
1617 ftl_tamc_output.f: ftl_input_code.f
1618 \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.f
1619 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.f
1620
1621 ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
1622 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
1623
1624
1625 # ... SVD ...
1626 svdtaf: ad_taf_output.f ftl_taf_output.f
1627 svdall: svd_taf
1628
1629 svd_taf: ad_taf_output.o ftl_taf_output.o \$(OBJFILES)
1630 \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
1631
1632
1633 #=========================================
1634
1635 EOF
1636
1637 if test "x$EXEHOOK" != x ; then
1638 printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE
1639 fi
1640
1641 echo " Making list of \"exceptions\" that need \".p\" files"
1642 for i in $KPPFILES ; do
1643 base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
1644 RETVAL=$?
1645 if test "x$RETVAL" != x0 ; then
1646 echo "Error: unable to add file \"$i\" to the exceptions list"
1647 fi
1648 echo "$base.f: $base.p" >> $MAKEFILE
1649 done
1650
1651 echo " Making list of NOOPTFILES"
1652 for i in $NOOPTFILES ; do
1653 base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
1654 RETVAL=$?
1655 if test "x$RETVAL" != x0 ; then
1656 echo "Error: unable to add file \"$i\" to the exceptions list"
1657 fi
1658 echo "$base.o: $base.f" >> $MAKEFILE
1659 printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE
1660 done
1661
1662 echo " Add rules for links"
1663 cat srclinks.tmp >> $MAKEFILE
1664 rm -f srclinks.tmp
1665
1666 echo " Adding makedepend marker"
1667 printf "\n\n# DO NOT DELETE\n" >> $MAKEFILE
1668
1669 printf "\n=== Done ===\n"
1670
1671 # Create special header files
1672 $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"
1673 if test ! -f $PACKAGES_DOT_H ; then
1674 mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
1675 else
1676 cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
1677 RETVAL=$?
1678 if test "x$RETVAL" = x0 ; then
1679 rm -f $PACKAGES_DOT_H".tmp"
1680 else
1681 mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"
1682 mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
1683 fi
1684 fi
1685 if test ! -f AD_CONFIG.h ; then
1686 $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
1687 fi
1688
1689
1690 # Write the "state" for future records
1691 if test "x$DUMPSTATE" != xf ; then
1692 echo -n "" > genmake_state
1693 for i in $gm_state ; do
1694 t1="t2=\$$i"
1695 eval $t1
1696 echo "$i='$t2'" >> genmake_state
1697 done
1698 fi

  ViewVC Help
Powered by ViewVC 1.1.22