/[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.66 - (show annotations) (download)
Mon Feb 23 21:51:32 2004 UTC (20 years ago) by edhill
Branch: MAIN
Changes since 1.65: +14 -2 lines
 o add automatic "discovery" of the -lnetcdf library
   - Note that this will work if the NetCDF files are installed in
     standard locations such as /usr/lib or /usr/local/lib.  If the
     NetCDF files are installed in a non-standard location, then the
     user will have to specify the path ("-L /path/to/the/lib")
     within the optfile.

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

  ViewVC Help
Powered by ViewVC 1.1.22