/[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.243 - (show annotations) (download)
Tue Sep 25 21:16:29 2012 UTC (11 years, 6 months ago) by utke
Branch: MAIN
CVS Tags: checkpoint64
Changes since 1.242: +2 -2 lines
should not remove in make what is created  by genmake

1 #! /usr/bin/env bash
2 #
3 # $Header: /u/gcmpack/MITgcm/tools/genmake2,v 1.242 2012/09/20 23:12:47 heimbach Exp $
4 # $Name: $
5 #
6 # Makefile generator for MITgcm UV codes
7 # created by cnh 03/98
8 # adapted by aja 06/98
9 # modified by aja 01/00
10 # rewritten in bash by eh3 08/03
11
12 # Explain usage
13 usage() {
14 cat <<EOF
15
16 Usage: "$0" [OPTIONS]
17 where [OPTIONS] can be:
18
19 -help | --help | -h | --h
20 Print this help message and exit.
21
22 -adoptfile NAME | --adoptfile NAME | -adof NAME | --adof NAME
23 -adoptfile=NAME | --adoptfile=NAME | -adof=NAME | --adof=NAME
24 Use "NAME" as the adoptfile. By default, the file at
25 "tools/adjoint_options/adjoint_default" will be used.
26
27 -nooptfile | --nooptfile
28 -optfile NAME | --optfile NAME | -of NAME | --of NAME
29 -optfile=NAME | --optfile=NAME | -of=NAME | --of=NAME
30 Use "NAME" as the optfile. By default, an attempt will be
31 made to find an appropriate "standard" optfile in the
32 tools/build_options/ directory.
33
34 -pdepend NAME | --pdepend NAME
35 -pdepend=NAME | --pdepend=NAME
36 Get package dependency information from "NAME".
37
38 -pgroups NAME | --pgroups NAME
39 -pgroups=NAME | --pgroups=NAME
40 Get the package groups information from "NAME".
41
42 -bash NAME
43 Explicitly specify the Bourne or BASH shell to use
44
45 -make NAME | -m NAME
46 --make=NAME | -m=NAME
47 Use "NAME" for the MAKE program. The default is "make" but
48 many platforms, "gmake" is the preferred choice.
49
50 -makefile NAME | -mf NAME
51 --makefile=NAME | -mf=NAME
52 Call the makefile "NAME". The default is "Makefile".
53
54 -makedepend NAME | -md NAME
55 --makedepend=NAME | -md=NAME
56 Use "NAME" for the MAKEDEPEND program.
57
58 -rootdir NAME | --rootdir NAME | -rd NAME | --rd NAME
59 -rootdir=NAME | --rootdir=NAME | -rd=NAME | --rd=NAME
60 Specify the location of the MITgcm ROOTDIR as "NAME".
61 By default, genamke will try to find the location by
62 looking in parent directories (up to the 5th parent).
63
64 -mods NAME | --mods NAME | -mo NAME | --mo NAME
65 -mods=NAME | --mods=NAME | -mo=NAME | --mo=NAME
66 Here, "NAME" specifies a list of directories that are
67 used for additional source code. Files found in the
68 "mods list" are given preference over files of the same
69 name found elsewhere.
70
71 -disable NAME | --disable NAME
72 -disable=NAME | --disable=NAME
73 Here "NAME" specifies a list of packages that we don't
74 want to use. If this violates package dependencies,
75 genamke will exit with an error message.
76
77 -enable NAME | --enable NAME
78 -enable=NAME | --enable=NAME
79 Here "NAME" specifies a list of packages that we wish
80 to specifically enable. If this violates package
81 dependencies, genamke will exit with an error message.
82
83 -standarddirs NAME | --standarddirs NAME
84 -standarddirs=NAME | --standarddirs=NAME
85 Here, "NAME" specifies a list of directories to be
86 used as the "standard" code.
87
88 -fortran NAME | --fortran NAME | -fc NAME | --fc NAME
89 -fc=NAME | --fc=NAME
90 Use "NAME" as the fortran compiler. By default, genmake
91 will search for a working compiler by trying a list of
92 "usual suspects" such as g77, f77, etc.
93
94 -cc NAME | --cc NAME | -cc=NAME | --cc=NAME
95 Use "NAME" as the C compiler. By default, genmake
96 will search for a working compiler by trying a list of
97 "usual suspects" such as gcc, c89, cc, etc.
98
99 -use_real4 | -use_r4 | -ur4 | --use_real4 | --use_r4 | --ur4
100 Use "real*4" type for _RS variable (#undef REAL4_IS_SLOW)
101 *only* works if CPP_EEOPTIONS.h allows this.
102
103 -ignoretime | -ignore_time | --ignoretime | --ignore_time
104 Ignore all the "wall clock" routines entirely. This will
105 not in any way hurt the model results -- it simply means
106 that the code that checks how long the model spends in
107 various routines will give junk values.
108
109 -ts | --ts
110 Produce timing information per timestep
111 -papis | --papis
112 Produce summary MFlop/s (and IPC) with PAPI per timestep
113 -pcls | --pcls
114 Produce summary MFlop/s etc. with PCL per timestep
115 -foolad | --foolad
116 Fool the AD code generator
117 -papi | --papi
118 Performance analysis with PAPI
119 -pcl | --pcl
120 Performance analysis with PCL
121 -hpmt | --hpmt
122 Performance analysis with the HPM Toolkit
123
124 -ieee | --ieee
125 use IEEE numerics. Note that this option *only* works
126 if it is supported by the OPTFILE that is being used.
127 -devel | --devel
128 Add additional warning and debugging flags for development
129 (if supported by the OPTFILE); also switch to IEEE numerics.
130 -gsl | --gsl
131 Use GSL to control floating point rounding and precision
132
133 -mpi | --mpi
134 Include MPI header files and link to MPI libraries
135 -mpi=PATH | --mpi=PATH
136 Include MPI header files and link to MPI libraries using MPI_ROOT
137 set to PATH. i.e. Include files from \$PATH/include, link to libraries
138 from \$PATH/lib and use binaries from \$PATH/bin.
139
140 -omp | --omp
141 Activate OpenMP code + use Compiler option OMPFLAG
142 -omp=OMPFLAG | --omp=OMPFLAG
143 Activate OpenMP code + use Compiler option OMPFLAG
144
145 -es | --es | -embed-source | --embed-source
146 Embed a tarball containing the full source code
147 (including the Makefile, etc.) used to build the
148 executable [off by default]
149
150 -ds | --ds
151 Report genmake internal variables status (DUMPSTATE)
152 to file "genmake_state" (for debug purpose)
153
154 While it is most often a single word, the "NAME" variables specified
155 above can in many cases be a space-delimited string such as:
156
157 --enable pkg1 --enable 'pkg1 pkg2' --enable 'pkg1 pkg2 pkg3'
158 -mods=dir1 -mods='dir1' -mods='dir1 dir2 dir3'
159 -foptim='-Mvect=cachesize:512000,transform -xtypemap=real:64,double:64,integer:32'
160
161 which, depending upon your shell, may need to be single-quoted.
162
163 For more detailed genmake documentation, please see:
164
165 http://mitgcm.org/public/devel_HOWTO/
166
167 EOF
168
169 exit 1
170 }
171
172 # Search for particular CPP #cmds associated with packages
173 # usage: test_for_package_in_cpp_options CPP_file package_name
174 test_for_package_in_cpp_options() {
175 cpp_options=$1
176 pkg=$2
177 test_for_string_in_file $cpp_options "^ *# *define *\<ALLOW_$pkg\>"
178 test_for_string_in_file $cpp_options "^ *# *undef *\<ALLOW_$pkg\>"
179 test_for_string_in_file $cpp_options "^ *# *define *\<DISABLE_$pkg\>"
180 test_for_string_in_file $cpp_options "^ *# *undef *\<DISABLE_$pkg\>"
181 }
182
183 # Search for particular CPP #cmds associated with MPI
184 # usage: test_for_mpi_in_cpp_eeoptions CPP_file
185 test_for_mpi_in_cpp_eeoptions() {
186 cpp_options=$1
187 test_for_string_in_file $cpp_options "^ *# *define *\<ALLOW_USE_MPI\>"
188 test_for_string_in_file $cpp_options "^ *# *undef *\<ALLOW_USE_MPI\>"
189 }
190
191 # Search for particular string in a file. Return 1 if detected, 0 if not
192 # usage: test_for_string_in_file file string
193 test_for_string_in_file() {
194 file=$1
195 strng=$2
196 grep "$strng" $file > /dev/null 2>&1
197 RETVAL=$?
198 if test "x${RETVAL}" = x0 ; then
199 printf "Error: In $file there is an illegal line: "
200 grep -i "$strng" $file
201 exit 99
202 fi
203 return 0
204 }
205
206 # Read the $ROOTDIR/pkg/pkg_groups file and expand any references to
207 # the package list.
208 expand_pkg_groups() {
209 new_packages=
210 if test -r $PKG_GROUPS ; then
211 cat $PKG_GROUPS | sed -e 's/#.*$//g' | sed -e 's/:/ : /g' > ./p1.tmp
212 cat ./p1.tmp | $AWK '(NF>2 && $2==":"){ print $0 }' > ./p2.tmp
213 matched=0
214 for i in $PACKAGES ; do
215 line=`grep "^ *$i" ./p2.tmp`
216 RETVAL=$?
217 if test "x$RETVAL" = x0 ; then
218 matched=1
219 replace=`echo $line | $AWK '{ $1=""; $2=""; print $0 }'`
220 echo " replacing \"$i\" with:$replace"
221 new_packages="$new_packages $replace"
222 else
223 new_packages="$new_packages $i"
224 fi
225 done
226 PACKAGES=$new_packages
227 rm -f ./p[1,2].tmp
228 return $matched
229 else
230 echo "Warning: can't read package groups definition file: $PKG_GROUPS"
231 fi
232 }
233
234 # Check for broken environments (eg. cygwin, MacOSX w/HFS+) that
235 # cannot distinguish [*.F/*.F90] from [*.f/*.f90] files.
236 check_for_broken_Ff() {
237 # Do we have defaults for $FS and/or $FS90 ?
238 tfs=f
239 tfs9=f90
240 if test "x$FS" != x ; then
241 tfs="$FS"
242 fi
243 if test "x$FS90" != x ; then
244 tfs9="$FS90"
245 fi
246
247 # First check the ability to create a *.F/.f pair.
248 cat <<EOF >> genmake_hello.F
249 program hello
250 write(*,*) 'hi'
251 stop
252 end
253 EOF
254 cp genmake_hello.F "genmake_hello."$tfs > /dev/null 2>&1
255 RETVAL=$?
256 if test "x$RETVAL" != x0 ; then
257 if test "x$FS" = x ; then
258 FS='for'
259 FS90='fr9'
260 check_for_broken_Ff
261 else
262 cat <<EOF 2>&1
263 ERROR: Your file system cannot distinguish between *.F and *.f files
264 (fails the "cp" test) and this program cannot find a suitable
265 replacement extension. Please try a different build environment or
266 contact the <MITgcm-support@mitgcm.org> list for help.
267
268 EOF
269 exit -1
270 fi
271 return
272 fi
273 rm -f genmake_hello.*
274
275 # Check the ability of ${MAKE} and ${LN} to use the current set
276 # of extensions.
277 cat <<EOF >> genmake_hello.F
278 program hello
279 write(*,*) 'hi'
280 stop
281 end
282 EOF
283 test -f $MAKEFILE && mv -f $MAKEFILE $MAKEFILE".tst"
284 cat <<EOF >> $MAKEFILE
285 .SUFFIXES:
286 .SUFFIXES: .$tfs .F
287 .F.$tfs:
288 $LN \$< \$@
289 EOF
290 $MAKE -f $MAKEFILE "genmake_hello."$tfs > /dev/null 2>&1
291 RETVAL=$?
292 if test "x$RETVAL" != x0 -o ! -f "genmake_hello."$tfs ; then
293 if test "x$FS" = x ; then
294 FS='for'
295 FS90='fr9'
296 check_for_broken_Ff
297 else
298 echo "ERROR: test: '$MAKE -f $MAKEFILE genmake_hello.$tfs' Failed"
299 echo " see simple makefile: '$MAKEFILE' (left here)"
300 echo " Please check (1) your '$MAKE' command, (2) your '$LN' command"
301 echo " and (3) the allowed sufix '.F' and '.$tfs' in makefile"
302 echo " or contact the <MITgcm-support@mitgcm.org> list for help."
303 echo ""
304 exit -1
305 return
306 fi
307 fi
308 rm -f genmake_hello.* $MAKEFILE
309 test -f $MAKEFILE".tst" && mv -f $MAKEFILE".tst" $MAKEFILE
310
311 # If we make it here, use the extensions
312 FS=$tfs
313 FS90=$tfs9
314 return
315 }
316
317 look_for_makedepend() {
318
319 # The "original" makedepend is part of the Imake system that is
320 # most often distributed with XFree86 or with an XFree86 source
321 # package. As a result, many machines (eg. generic Linux) do not
322 # have a system-default "makedepend" available. For those
323 # systems, we have two fall-back options:
324 #
325 # 1) a makedepend implementation shipped with the cyrus-imapd
326 # package: ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/
327 #
328 # 2) a known-buggy xmakedpend shell script
329 #
330 # So the choices are, in order:
331 #
332 # 1) use the user-specified program
333 # 2) use a system-wide default
334 # 3) locally build and use the cyrus implementation
335 # 4) fall back to the buggy local xmakedpend script
336 #
337 echo >> $LOGFILE
338 echo "running: look_for_makedepend()" >> $LOGFILE
339 if test "x${MAKEDEPEND}" != x ; then
340 echo "${MAKEDEPEND}" | grep -i cyrus > /dev/null 2>&1
341 RETVAL=$?
342 if test x"$RETVAL" = x0 ; then
343 build_cyrus_makedepend
344 RETVAL=$?
345 if test "x$RETVAL" != x0 ; then
346 echo "WARNING: unable to build cyrus-makedepend. Try 'makedepend'"
347 MAKEDEPEND=
348 fi
349 else
350 echo "${MAKEDEPEND}" | grep 'tools.xmakedepend' > /dev/null 2>&1
351 RETVAL=$?
352 if test "x$RETVAL" = x0 ; then
353 MAKEDEPEND='$(TOOLSDIR)/xmakedepend'
354 fi
355 echo " --> MAKEDEPEND=${MAKEDEPEND}" >> $LOGFILE
356 fi
357 fi
358 if test "x${MAKEDEPEND}" = x ; then
359 which makedepend > /dev/null 2>&1
360 RV0=$?
361 test -f $MAKEFILE && mv -f $MAKEFILE $MAKEFILE".tst"
362 # echo 'MAKEFILE="'$MAKEFILE'"'
363 cat <<EOF >> $MAKEFILE
364 # THIS IS A TEST MAKEFILE GENERATED BY "genmake2"
365 #
366 # Some "makedepend" implementations will die if they cannot
367 # find a Makefile -- so this file is here to gives them an
368 # empty one to find and parse.
369 EOF
370 cat <<EOF >> genmake_tc.f
371 program test
372 write(*,*) 'test'
373 stop
374 end
375 EOF
376 makedepend -f $MAKEFILE genmake_tc.f > /dev/null 2>&1
377 RV1=$?
378 test -f $MAKEFILE && rm -f $MAKEFILE
379 test -f $MAKEFILE".tst" && mv -f $MAKEFILE".tst" $MAKEFILE
380 if test "x${RV0}${RV1}" = x00 ; then
381 MAKEDEPEND=makedepend
382 echo " --> set MAKEDEPEND=${MAKEDEPEND}" >> $LOGFILE
383 else
384 echo " system-default makedepend not found. Try to build cyrus-makedepend"
385 # Try to build the cyrus implementation
386 build_cyrus_makedepend
387 RETVAL=$?
388 if test "x$RETVAL" != x0 ; then
389 echo "WARNING: unable to build cyrus-makedepend. Use local xmakedepend"
390 MAKEDEPEND='$(TOOLSDIR)/xmakedepend'
391 echo " --> set MAKEDEPEND=${MAKEDEPEND}" >> $LOGFILE
392 fi
393 fi
394 fi
395 }
396
397 build_cyrus_makedepend() {
398 echo >> $LOGFILE
399 echo "running: build_cyrus_makedepend()" >> $LOGFILE
400 rm -f ./genmake_cy_md
401 (
402 cd $ROOTDIR/tools/cyrus-imapd-makedepend \
403 && ./configure > /dev/null 2>&1 \
404 && $MAKE > /dev/null 2>&1
405 if test -x ./makedepend.exe ; then
406 $LN ./makedepend.exe ./makedepend
407 fi
408 ./makedepend ifparser.c > /dev/null 2>&1 \
409 && echo "true"
410 ) > ./genmake_cy_md
411 grep true ./genmake_cy_md > /dev/null 2>&1
412 RETVAL=$?
413 rm -f ./genmake_cy_md
414 if test "x$RETVAL" = x0 ; then
415 MAKEDEPEND='$(TOOLSDIR)/cyrus-imapd-makedepend/makedepend'
416 echo " --> set MAKEDEPEND=${MAKEDEPEND}" >> $LOGFILE
417 return 0
418 else
419 echo "WARNING: fail to build cyrus-imapd-makedepend" >> $LOGFILE
420 return 1
421 fi
422 }
423
424 build_embed_encode()
425 {
426 printf " building the embed-encode utility... "
427 if test ! -e "$ROOTDIR/tools/embed_encode/encode_files" ; then
428 if test ! -d "$ROOTDIR/tools/embed_encode" ; then
429 echo
430 echo " Error: can't locate \"$ROOTDIR/tools/embed_encode\""
431 echo
432 EMBED_SRC=f
433 return 1
434 fi
435 clist="cc gcc c89 $CC"
436 for ic in $clist ; do
437 comm="$ic -o encode_files encode_files.c"
438 ( cd $ROOTDIR/tools/embed_encode && $comm ) > /dev/null 2>&1
439 RETVAL=$?
440 if test "x$RETVAL" = x0 ; then
441 echo "OK"
442 return 0
443 fi
444 done
445 echo
446 echo " Error: unable to build $ROOTDIR/embed_encode/encode_files"
447 echo " so it has been disabled"
448 echo
449 EMBED_SRC=f
450 return 1
451 fi
452 echo "OK"
453 }
454
455 # look for possible C compilers
456 look_for_C_compilers() {
457 echo >> $LOGFILE
458 echo "running: look_for_C_compilers()" >> $LOGFILE
459 rm -f ./genmake_hello.c ./genmake_hello
460 cat >> genmake_hello.c << EOF
461 #include <stdio.h>
462 int main(int argc, char **argv) {
463 printf("Hello!\n");
464 return 0;
465 }
466 EOF
467 tmp="$MITGCM_CC $CC gcc c89 cc c99 mpicc icc"
468 p_CC=
469 for c in $tmp ; do
470 COMM="$c $CFLAGS -o genmake_hello genmake_hello.c"
471 echo $COMM >> $LOGFILE
472 $COMM >> $LOGFILE 2>&1
473 RETVAL=$?
474 if test "x${RETVAL}" = x0 ; then
475 echo " $c test successful" >> $LOGFILE
476 p_CC="$p_CC $c"
477 fi
478 done
479 rm -f ./genmake_hello.c ./genmake_hello
480 if test "x${p_CC}" = x ; then
481 cat 1>&2 <<EOF
482
483 Error: No C compilers were found in your path. Please specify one using:
484
485 1) an "optfile" on (eg. "-optfile=path/to/OPTFILE"),
486 2) the CC or MITGCM_CC environment variables.
487
488 EOF
489 exit 1
490 else
491 echo " The possible C compilers found in your path are: $p_CC" | tee -a $LOGFILE
492 if test "x$CC" = x ; then
493 CC=`echo $p_CC | $AWK '{print $1}'`
494 echo " Setting C compiler to: "$CC
495 fi
496 fi
497 echo " --> set CC='$CC'" >> $LOGFILE
498 }
499
500 # Guess possible config options for this host
501 find_possible_optfile() {
502
503 echo >> $LOGFILE
504 echo "running: find_possible_optfile()" >> $LOGFILE
505 tmp1=`uname`"_"`uname -m`
506 tmp2=`echo $tmp1 | sed -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
507 tmp3=`echo $tmp2 | sed -e 's/power macintosh/ppc/'`
508 tmp1=`echo $tmp3 | sed -e 's|x86_64|amd64|'`
509 tmp2=`echo $tmp1 | sed -e 's/i[3-6]86/ia32/' | sed -e 's/athlon/ia32/'`
510 tmp3=`echo $tmp2 | sed -e 's/cray sv1/craysv1/'`
511 PLATFORM=$tmp3
512 echo $PLATFORM | grep cygwin > /dev/null 2>&1 && PLATFORM=cygwin_ia32
513 OFLIST=`(cd $ROOTDIR/tools/build_options; ls | grep "^$PLATFORM")`
514 echo " The platform appears to be: $PLATFORM" | tee -a $LOGFILE
515
516 #================================================================
517 # look for possible FORTRAN compilers
518 echo " look for possible FORTRAN compilers" >> $LOGFILE
519 tmp="$MITGCM_FC $FC efc gfortran g77 f77 pgf77 pgf95 ifc ifort f90 f95 mpif77 mpf77 mpxlf95 g95"
520 p_FC=
521 rm -f ./genmake_hello.f
522 cat >> genmake_hello.f <<EOF
523 program hello
524 do i=1,3
525 print *, 'hello world : ', i
526 enddo
527 end
528 EOF
529 for f in $tmp ; do
530 COMM="$f -o genmake_hello genmake_hello.f"
531 echo $COMM >> $LOGFILE
532 $COMM >> $LOGFILE 2>&1
533 RETVAL=$?
534 if test "x${RETVAL}" = x0 ; then
535 echo " $f test successful" >> $LOGFILE
536 p_FC="$p_FC $f"
537 fi
538 done
539 rm -f ./genmake_hello.f ./genmake_hello
540 if test "x${p_FC}" = x ; then
541 cat 1>&2 <<EOF
542
543 Error: No Fortran compilers were found in your path. Please specify one using:
544
545 1) an "optfile" on (eg. "-optfile=path/to/OPTFILE"),
546 2) a command-line option (eg. "-fc NAME"), or
547 3) the FC or MITGCM_FC environment variables.
548
549 EOF
550 exit 1
551 else
552 echo " The possible FORTRAN compilers found in your path are: $p_FC" | tee -a $LOGFILE
553 fi
554
555 # Use the first of the compilers found in the current PATH
556 # that has a correctly-named optfile
557 if test "x$OPTFILE" = x -a "x$FC" = x ; then
558 for i in $p_FC ; do
559 OPTFILE=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$i
560 if test -r $OPTFILE ; then
561 echo " Setting OPTFILE to: "$OPTFILE | tee -a $LOGFILE
562 break
563 fi
564 done
565 fi
566
567 if test "x$OPTFILE" = x ; then
568 OPTFILE=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$FC
569 if test ! -r $OPTFILE ; then
570 echo " I looked for the file "$OPTFILE" but did not find it"
571 fi
572 fi
573
574 if test "x$OPTFILE" = x ; then
575 cat 1>&2 <<EOF
576
577 Error: No options file was found in: $ROOTDIR/tools/build_options/
578 that matches this platform ("$PLATFORM") and the compilers found in
579 your path. Please specify an "optfile" using:
580
581 1) the command line (eg. "-optfile=path/to/OPTFILE"), or
582 2) the MITGCM_OF environment variable.
583
584 If you need help, please contact the developers at <MITgcm-support@mitgcm.org>.
585
586 EOF
587 exit 1
588 fi
589 }
590
591 # Parse the package dependency information
592 get_pdepend_list() {
593
594 # strip the comments and then convert the dependency file into
595 # two arrays: PNAME, DNAME
596 cat $1 | sed -e 's/#.*$//g' \
597 | $AWK 'BEGIN{nn=-1;} (NF>0){ for(i=2;i<=NF;i++){nn++; print "PNAME_"nn"="$1"\nDNAME_"nn"="$i}} END{print "nname="nn}' \
598 > ./.pd_tmp
599 RETVAL=$?
600 if test ! "x${RETVAL}" = x0 ; then
601 echo "Error: unable to parse package dependencies -- please check PKG_DEPEND=\"$1\""
602 exit 1
603 fi
604 . ./.pd_tmp
605 rm -f ./.pd_tmp
606 }
607
608 # Build a CPP macro to automate calling C routines from FORTRAN
609 get_fortran_c_namemangling() {
610
611 #echo "FC_NAMEMANGLE = \"$FC_NAMEMANGLE\""
612 if test ! "x$FC_NAMEMANGLE" = x ; then
613 return 0
614 fi
615 echo " running: get_fortran_c_namemangling()" >> $LOGFILE
616
617 default_nm="#define FC_NAMEMANGLE(X) X ## _"
618
619 cat > genmake_test.c <<EOF
620 void tcall( char * string ) { tsub( string ); }
621 EOF
622 COMM="$CC $CFLAGS -c genmake_test.c"
623 echo ' '$COMM >> $LOGFILE
624 $COMM >> $LOGFILE 2>&1
625 RETVAL=$?
626 if test "x$RETVAL" != x0 ; then
627 FC_NAMEMANGLE=$default_nm
628 cat <<EOF>> $LOGFILE
629
630 WARNING: C test compile fails
631 WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
632 WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here
633 EOF
634 return 1
635 fi
636 c_tcall=`nm genmake_test.o 2>/dev/null | grep 'T ' | grep tcall | cut -d ' ' -f 3`
637 RETVAL=$?
638 if test "x$RETVAL" != x0 ; then
639 FC_NAMEMANGLE=$default_nm
640 cat <<EOF>> $LOGFILE
641
642 WARNING: The "nm" command failed.
643 WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
644 WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here
645 EOF
646 return 1
647 fi
648 cat > genmake_tcomp.$FS <<EOF
649 subroutine tcall( string )
650 character*(*) string
651 call tsub( string )
652 end
653 EOF
654 COMM="$FC $FFLAGS -c genmake_tcomp.$FS"
655 echo ' '$COMM >> $LOGFILE
656 $COMM >> $LOGFILE 2>&1
657 RETVAL=$?
658 if test "x$RETVAL" != x0 ; then
659 FC_NAMEMANGLE=$default_nm
660 cat <<EOF>> $LOGFILE
661
662 WARNING: FORTRAN test compile fails -- please see '$LOGFILE'
663 WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
664 WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here.
665 EOF
666 return 1
667 fi
668 f_tcall=`nm genmake_tcomp.o 2>/dev/null | grep 'T ' | grep tcall | cut -d ' ' -f 3`
669 RETVAL=$?
670 if test "x$RETVAL" != x0 ; then
671 FC_NAMEMANGLE=$default_nm
672 cat <<EOF>> $LOGFILE
673
674 WARNING: The "nm" command failed.
675 WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
676 WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here.
677 EOF
678 return 1
679 fi
680
681 c_a=`echo $c_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 1 | sed -e 's|Y||'`
682 f_a=`echo $f_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 1 | sed -e 's|Y||'`
683 c_b=`echo $c_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 2 | sed -e 's|Y||'`
684 f_b=`echo $f_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 2 | sed -e 's|Y||'`
685
686 nmangle="X"
687 if test "x$c_a" != "x$f_a" ; then
688 comm="echo x$f_a | sed -e 's|x$c_a||'"
689 a=`eval $comm`
690 nmangle="$a ## $nmangle"
691 fi
692 if test "x$c_b" != "x$f_b" ; then
693 comm="echo x$f_b | sed -e 's|x$c_b||'"
694 b=`eval $comm`
695 nmangle="$nmangle ## $b"
696 fi
697
698 FC_NAMEMANGLE="#define FC_NAMEMANGLE(X) $nmangle"
699
700 # cleanup the testing files
701 rm -f genmake_tcomp.* genmake_test.*
702
703 echo " --> set FC_NAMEMANGLE='$FC_NAMEMANGLE'" >> $LOGFILE
704 }
705
706 check_HAVE_CLOC() {
707 echo >> $LOGFILE
708 echo "running: check_HAVE_CLOC()" >> $LOGFILE
709 get_fortran_c_namemangling
710 cat <<EOF > genmake_tc_1.c
711 $FC_NAMEMANGLE
712 #include <stdio.h>
713 #include <stdlib.h>
714 #include <unistd.h>
715 #include <assert.h>
716 #include <sys/time.h>
717 void FC_NAMEMANGLE(cloc) ( double *curtim )
718 {
719 struct timeval tv1;
720 gettimeofday(&tv1 , (void *)NULL );
721 *curtim = (double)((tv1.tv_usec)+(tv1.tv_sec)*1.E6);
722 *curtim = *curtim/1.E6;
723 }
724 EOF
725 COMM="$CC $CFLAGS -c genmake_tc_1.c"
726 echo $COMM >> $LOGFILE
727 $COMM >> $LOGFILE 2>&1
728 RET_C=$?
729 cat <<EOF > genmake_tc_2.$FS
730 program hello
731 REAL*8 wtime
732 external cloc
733 call cloc(wtime)
734 print *," HELLO WORLD", wtime
735 end
736 EOF
737 COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
738 echo $COMM >> $LOGFILE
739 $COMM >> $LOGFILE 2>&1
740 RET_F=$?
741 test -x ./genmake_tc && ./genmake_tc >> $LOGFILE 2>&1
742 RETVAL=$?
743 if test "x$RETVAL" = x0 ; then
744 HAVE_CLOC=t
745 fi
746 rm -f genmake_tc*
747 echo " --> set HAVE_CLOC='$HAVE_CLOC'" >> $LOGFILE
748 }
749
750 check_HAVE_SIGREG() {
751 if test ! "x$HAVE_SIGREG" = x ; then
752 return
753 fi
754 echo >> $LOGFILE
755 echo "running: check_HAVE_SIGREG()" >> $LOGFILE
756 get_fortran_c_namemangling
757 cat <<EOF > genmake_tc_1.c
758 $FC_NAMEMANGLE
759 #include <stdlib.h>
760 #include <stdio.h>
761 #include <signal.h>
762 #include <errno.h>
763 #include <ucontext.h>
764
765 int * ip;
766
767 static void killhandler(
768 unsigned int sn, siginfo_t si, struct ucontext *sc )
769 {
770 *ip = *ip + 1;
771 return;
772 }
773
774 void FC_NAMEMANGLE(sigreg) (int * aip)
775 {
776 struct sigaction s;
777 ip = aip;
778 s.sa_flags = SA_SIGINFO;
779 s.sa_sigaction = (void *)killhandler;
780 if(sigaction (SIGTERM,&s,(struct sigaction *)NULL)) {
781 printf("Sigaction returned error = %d\n", errno);
782 exit(0);
783 }
784 return;
785 }
786 EOF
787 COMM="$CC $CFLAGS -c genmake_tc_1.c"
788 echo $COMM >> $LOGFILE
789 $COMM >> $LOGFILE 2>&1
790 RET_C=$?
791 cat <<EOF > genmake_tc_2.$FS
792 program hello
793 integer anint
794 common /iv/ anint
795 external sigreg
796 call sigreg(anint)
797 end
798 EOF
799 cat genmake_tc_2.$FS >> $LOGFILE
800 COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
801 echo $COMM >> $LOGFILE
802 $COMM >> $LOGFILE 2>&1
803 RETVAL=$?
804 if test "x$RETVAL" = x0 ; then
805 HAVE_SIGREG=t
806 fi
807 rm -f genmake_tc*
808 echo " --> set HAVE_SIGREG='$HAVE_SIGREG'" >> $LOGFILE
809 }
810
811 check_HAVE_SETRLSTK() {
812 if test ! "x$HAVE_SETRLSTK" = x ; then
813 return
814 fi
815 echo >> $LOGFILE
816 echo "running: check_HAVE_SETRLSTK()" >> $LOGFILE
817 get_fortran_c_namemangling
818 cat <<EOF > genmake_tc_1.c
819 $FC_NAMEMANGLE
820 #include <sys/time.h>
821 #include <sys/resource.h>
822 #include <unistd.h>
823 void FC_NAMEMANGLE(setrlstk) ()
824 {
825 struct rlimit rls;
826 rls.rlim_cur = RLIM_INFINITY;
827 rls.rlim_max = RLIM_INFINITY;
828 setrlimit(RLIMIT_STACK, &rls);
829 return;
830 }
831 EOF
832 COMM="$CC $CFLAGS -c genmake_tc_1.c"
833 echo $COMM >> $LOGFILE
834 $COMM >> $LOGFILE 2>&1
835 RET_C=$?
836 cat <<EOF > genmake_tc_2.$FS
837 program hello
838 external setrlstk
839 call setrlstk()
840 end
841 EOF
842 cat genmake_tc_2.$FS >> $LOGFILE
843 COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
844 echo $COMM >> $LOGFILE
845 $COMM >> $LOGFILE 2>&1
846 RETVAL=$?
847 if test "x$RETVAL" = x0 ; then
848 HAVE_SETRLSTK=t
849 fi
850 rm -f genmake_tc*
851 echo " --> set HAVE_SETRLSTK='$HAVE_SETRLSTK'" >> $LOGFILE
852 }
853
854 check_HAVE_STAT() {
855 echo >> $LOGFILE
856 echo "running: check_HAVE_STAT()" >> $LOGFILE
857 get_fortran_c_namemangling
858 cat <<EOF > genmake_tc_1.c
859 $FC_NAMEMANGLE
860 #include <stdio.h>
861 #include <stdlib.h>
862 #include <unistd.h>
863 #include <sys/stat.h>
864 #include <sys/types.h>
865 void FC_NAMEMANGLE(tfsize) ( int *nbyte )
866 {
867 char name[512];
868 struct stat astat;
869
870 name[0] = 'a'; name[1] = '\0';
871 if (! stat(name, &astat))
872 *nbyte = (int)(astat.st_size);
873 else
874 *nbyte = -1;
875 }
876 EOF
877 COMM="$CC $CFLAGS -c genmake_tc_1.c"
878 echo $COMM >> $LOGFILE
879 $COMM >> genmake_tc.log 2>&1
880 RET_C=$?
881 cat <<EOF > genmake_tc_2.$FS
882 program hello
883 integer nbyte
884 call tfsize(nbyte)
885 print *," HELLO WORLD", nbyte
886 end
887 EOF
888 cat genmake_tc_2.$FS >> $LOGFILE
889 COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
890 echo $COMM >> $LOGFILE
891 $COMM >> genmake_tc.log 2>&1
892 RETVAL=$?
893 if test "x$RETVAL" = x0 ; then
894 HAVE_STAT=t
895 fi
896 rm -f genmake_tc*
897 echo " --> set HAVE_STAT='$HAVE_STAT'" >> $LOGFILE
898 }
899
900 check_netcdf_libs() {
901 if test ! "x$SKIP_NETCDF_CHECK" = x ; then
902 return
903 fi
904 echo >> $LOGFILE
905 echo "running: check_netcdf_libs()" >> $LOGFILE
906 cat <<EOF > genmake_tnc.F
907 program fgennc
908 #include "netcdf.inc"
909 EOF
910 if test ! "x$MPI" = x ; then
911 echo '#include "mpif.h"' >> genmake_tnc.F
912 fi
913 cat <<EOF >> genmake_tnc.F
914 integer iret, ncid, xid
915 iret = nf_create('genmake_tnc.nc', NF_CLOBBER, ncid)
916 IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
917 iret = nf_def_dim(ncid, 'X', 11, xid)
918 IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
919 iret = nf_close(ncid)
920 IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
921 end
922 EOF
923 echo "=== genmake_tnc.F >>>" > genmake_tnc.log
924 cat genmake_tnc.F >> genmake_tnc.log
925 echo "<<< genmake_tnc.F ===" >> genmake_tnc.log
926 RET_CPP=f
927 COMM="cat genmake_tnc.F | $CPP $DEFINES $INCLUDES"
928 echo "$COMM" >> genmake_tnc.log
929 eval $COMM > genmake_tnc.$FS 2>/dev/null && RET_CPP=t
930 if test "x$RET_CPP" = xf ; then
931 echo " WARNING: CPP failed to pre-process the netcdf test." \
932 >> genmake_tnc.log
933 echo " Please check that \$INCLUDES is properly set." \
934 >> genmake_tnc.log
935 fi
936 echo "$FC $FFLAGS $FOPTIM -c genmake_tnc.$FS \ " >> genmake_tnc.log
937 echo " && $LINK $FFLAGS $FOPTIM -o genmake_tnc.o $LIBS" >> genmake_tnc.log
938 $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1 \
939 && $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS >> genmake_tnc.log 2>&1
940 RET_COMPILE=$?
941 cat genmake_tnc.log >> $LOGFILE
942
943 #EH3 Remove test program execution for machines that either disallow
944 #EH3 execution or cannot support it (eg. cross-compilers)
945 #EH3
946 #EH3 test -x ./genmake_tnc && ./genmake_tnc >> genmake_tnc.log 2>&1
947 #EH3 RETVAL=$?
948 #EH3 if test "x$RET_COMPILE" = x0 -a "x$RETVAL" = x0 ; then
949
950 if test "x$RET_COMPILE" = x0 ; then
951 HAVE_NETCDF=t
952 echo "check_netcdf: successful" >> $LOGFILE
953 else
954 # try again with "-lnetcdf" added to the libs
955 echo "==> try again with added '-lnetcdf'" > genmake_tnc.log
956 echo "cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS \ " >> genmake_tnc.log
957 echo " && $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS \ " >> genmake_tnc.log
958 echo " && $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf" >> genmake_tnc.log
959 cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS 2>/dev/null \
960 && $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1 \
961 && $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf >> genmake_tnc.log 2>&1
962 RET_COMPILE=$?
963 echo >> $LOGFILE
964 cat genmake_tnc.log >> $LOGFILE
965 if test "x$RET_COMPILE" = x0 ; then
966 LIBS="$LIBS -lnetcdf"
967 HAVE_NETCDF=t
968 echo "check_netcdf: successful" >> $LOGFILE
969 else
970 # try again with "-lnetcdff" added to the libs
971 echo "==> try again with added '-lnetcdff -lnetcdf'" > genmake_tnc.log
972 echo "cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS \ " >> genmake_tnc.log
973 echo " && $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS \ " >> genmake_tnc.log
974 echo " && $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf" >> genmake_tnc.log
975 cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS 2>/dev/null \
976 && $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1 \
977 && $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdff -lnetcdf >> genmake_tnc.log 2>&1
978 RET_COMPILE=$?
979 echo >> $LOGFILE
980 cat genmake_tnc.log >> $LOGFILE
981 if test "x$RET_COMPILE" = x0 ; then
982 LIBS="$LIBS -lnetcdff -lnetcdf"
983 HAVE_NETCDF=t
984 echo "check_netcdf: successful" >> $LOGFILE
985 fi
986 fi
987 fi
988 rm -f genmake_tnc*
989 echo " --> set HAVE_NETCDF='$HAVE_NETCDF'" >> $LOGFILE
990 }
991
992 check_lapack_libs() {
993 if test ! "x$SKIP_LAPACK_CHECK" = x ; then
994 return
995 fi
996 echo >> $LOGFILE
997 echo "running: check_lapack_libs()" >> $LOGFILE
998 cat <<EOF > genmake_tla.F
999 program fgenla
1000 integer info
1001 integer ipiv( 2 )
1002 double precision ab( 4, 2 ), b( 2 )
1003 data ab / 0., 0., 1., 2., 0., 2., 1., 0. /
1004 data b / 1., 1. /
1005 call dgbsv( 2, 1, 1, 1, ab, 4, ipiv, b, 2, info )
1006 IF (info .NE. 0) write(*,*) 'Error:', info
1007 write(*,*) b
1008 end
1009 EOF
1010 echo "=== genmake_tla.F >>>" > genmake_tla.log
1011 cat genmake_tla.F >> genmake_tla.log
1012 echo "<<< genmake_tla.F ===" >> genmake_tla.log
1013 RET_CPP=f
1014 COMM="cat genmake_tla.F | $CPP $DEFINES $INCLUDES"
1015 echo "$COMM" >> genmake_tla.log
1016 eval $COMM > genmake_tla.$FS 2>/dev/null && RET_CPP=t
1017 if test "x$RET_CPP" = xf ; then
1018 echo " WARNING: CPP failed to pre-process the lapack test." \
1019 >> genmake_tla.log
1020 echo " Please check that \$INCLUDES is properly set." \
1021 >> genmake_tla.log
1022 fi
1023 echo "$FC $FFLAGS $FOPTIM -c genmake_tla.$FS \ " >> genmake_tla.log
1024 echo " && $LINK $FFLAGS $FOPTIM -o genmake_tla.o $LIBS" >> genmake_tla.log
1025 $FC $FFLAGS $FOPTIM -c genmake_tla.$FS >> genmake_tla.log 2>&1 \
1026 && $LINK $FFLAGS $FOPTIM -o genmake_tla genmake_tla.o $LIBS >> genmake_tla.log 2>&1
1027 RET_COMPILE=$?
1028 cat genmake_tla.log >> $LOGFILE
1029
1030 # test program execution not always possible (see check_netcdf_libs)
1031 #
1032 #test -x ./genmake_tla && ./genmake_tla >> genmake_tla.log 2>&1
1033 #RETVAL=$?
1034 #if test "x$RET_COMPILE" = x0 -a "x$RETVAL" = x0 ; then
1035
1036 if test "x$RET_COMPILE" = x0 ; then
1037 HAVE_LAPACK=t
1038 echo "check_lapack: successful" >> $LOGFILE
1039 else
1040 # try again with "-llapack" added to the libs
1041 echo "==> try again with added '-llapack'" > genmake_tla.log
1042 echo "cat genmake_tla.F | $CPP $DEFINES $INCLUDES > genmake_tla.$FS \ " >> genmake_tla.log
1043 echo " && $FC $FFLAGS $FOPTIM -c genmake_tla.$FS \ " >> genmake_tla.log
1044 echo " && $LINK $FFLAGS $FOPTIM -o genmake_tla genmake_tla.o $LIBS -llapack" >> genmake_tla.log
1045 cat genmake_tla.F | $CPP $DEFINES $INCLUDES > genmake_tla.$FS 2>/dev/null \
1046 && $FC $FFLAGS $FOPTIM -c genmake_tla.$FS >> genmake_tla.log 2>&1 \
1047 && $LINK $FFLAGS $FOPTIM -o genmake_tla genmake_tla.o $LIBS -llapack >> genmake_tla.log 2>&1
1048 RET_COMPILE=$?
1049 echo >> $LOGFILE
1050 cat genmake_tla.log >> $LOGFILE
1051 if test "x$RET_COMPILE" = x0 ; then
1052 LIBS="$LIBS -llapack"
1053 HAVE_LAPACK=t
1054 echo "check_lapack: successful" >> $LOGFILE
1055 else
1056 # try again with "-lf77blas -lcblas" added to the libs
1057 echo "==> try again with added '-llapack -lf77blas -lcblas'" > genmake_tla.log
1058 echo "cat genmake_tla.F | $CPP $DEFINES $INCLUDES > genmake_tla.$FS \ " >> genmake_tla.log
1059 echo " && $FC $FFLAGS $FOPTIM -c genmake_tla.$FS \ " >> genmake_tla.log
1060 echo " && $LINK $FFLAGS $FOPTIM -o genmake_tla genmake_tla.o $LIBS -llapack -lf77blas -lcblas" >> genmake_tla.log
1061 cat genmake_tla.F | $CPP $DEFINES $INCLUDES > genmake_tla.$FS 2>/dev/null \
1062 && $FC $FFLAGS $FOPTIM -c genmake_tla.$FS >> genmake_tla.log 2>&1 \
1063 && $LINK $FFLAGS $FOPTIM -o genmake_tla genmake_tla.o $LIBS -llapack -lf77blas -lcblas >> genmake_tla.log 2>&1
1064 RET_COMPILE=$?
1065 echo >> $LOGFILE
1066 cat genmake_tla.log >> $LOGFILE
1067 if test "x$RET_COMPILE" = x0 ; then
1068 LIBS="$LIBS -llapack -lf77blas -lcblas"
1069 HAVE_LAPACK=t
1070 echo "check_lapack: successful" >> $LOGFILE
1071 else
1072 # try again with "-latlas" added to the libs
1073 echo "==> try again with added '-llapack -lf77blas -lcblas -latlas'" > genmake_tla.log
1074 echo "cat genmake_tla.F | $CPP $DEFINES $INCLUDES > genmake_tla.$FS \ " >> genmake_tla.log
1075 echo " && $FC $FFLAGS $FOPTIM -c genmake_tla.$FS \ " >> genmake_tla.log
1076 echo " && $LINK $FFLAGS $FOPTIM -o genmake_tla genmake_tla.o $LIBS -llapack -lf77blas -lcblas -latlas" >> genmake_tla.log
1077 cat genmake_tla.F | $CPP $DEFINES $INCLUDES > genmake_tla.$FS 2>/dev/null \
1078 && $FC $FFLAGS $FOPTIM -c genmake_tla.$FS >> genmake_tla.log 2>&1 \
1079 && $LINK $FFLAGS $FOPTIM -o genmake_tla genmake_tla.o $LIBS -llapack -lf77blas -lcblas -latlas >> genmake_tla.log 2>&1
1080 RET_COMPILE=$?
1081 echo >> $LOGFILE
1082 cat genmake_tla.log >> $LOGFILE
1083 if test "x$RET_COMPILE" = x0 ; then
1084 LIBS="$LIBS -llapack -lf77blas -lcblas -latlas"
1085 HAVE_LAPACK=t
1086 echo "check_lapack: successful" >> $LOGFILE
1087 fi
1088 fi
1089 fi
1090 fi
1091 rm -f genmake_tla*
1092 echo " --> set HAVE_LAPACK='$HAVE_LAPACK'" >> $LOGFILE
1093 }
1094
1095
1096 ###############################################################################
1097 # Sequential part of script starts here
1098 ###############################################################################
1099
1100 # Set defaults here
1101 COMMANDL="$0 $@"
1102
1103 PLATFORM=
1104 LN=
1105 S64=
1106 KPP=
1107 #FC=
1108 #CC=gcc
1109 #CPP=
1110 LINK=
1111 DEFINES=
1112 PACKAGES=
1113 ENABLE=
1114 DISABLE=
1115 # MAKEFILE=
1116 # MAKEDEPEND=
1117 PKG_DEPEND=
1118 PKG_GROUPS=
1119 DUMPSTATE=f
1120 OPTFILE=
1121 INCLUDES="-I. $INCLUDES"
1122 FFLAGS=
1123 FOPTIM=
1124 FEXTRAFLAGS=
1125 USE_EXTENDED_SRC=
1126 EXTENDED_SRC_FLAG=
1127 GET_FC_VERSION=
1128 CFLAGS=
1129 KFLAGS1=
1130 KFLAGS2=
1131 #LDADD=
1132 LIBS=
1133 KPPFILES=
1134 NOOPTFILES=
1135 NOOPTFLAGS=
1136 MPI=
1137 MPIPATH=
1138 OMP=
1139 OMPFLAG=
1140 USE_R4=
1141 TS=
1142 PAPIS=
1143 PCLS=
1144 FOOLAD=
1145 PAPI=
1146 PCL=
1147 HPMT=
1148 GSL=
1149 DEVEL=
1150 HAVE_TEST_L=
1151
1152 # DEFINES checked by test compilation or command-line
1153 HAVE_SYSTEM=
1154 HAVE_FDATE=
1155 FC_NAMEMANGLE=
1156 HAVE_CLOC=
1157 # HAVE_SETRLSTK=
1158 HAVE_STAT=
1159 HAVE_NETCDF=
1160 HAVE_ETIME=
1161 IGNORE_TIME=
1162 HAVE_LAPACK=
1163
1164 MODS=
1165 TOOLSDIR=
1166 SOURCEDIRS=
1167 INCLUDEDIRS=
1168 STANDARDDIRS="USE_THE_DEFAULT"
1169
1170 #- local config file
1171 gm_local="genmake_local"
1172
1173 G2ARGS=
1174 BASH=
1175 PWD=`pwd`
1176 test "x$MAKE" = x && MAKE=make
1177 test "x$AWK" = x && AWK=awk
1178 EMBED_SRC=
1179 THISHOST=`hostname`
1180 THISCWD=`pwd`
1181 THISDATE=`date`
1182 THISUSER=`echo $USER`
1183 THISVER=
1184 MACHINE=`uname -a`
1185 EXECUTABLE=
1186 EXEHOOK=
1187 EXEDIR=
1188 IEEE=
1189 if test "x$MITGCM_IEEE" != x ; then
1190 IEEE=$MITGCM_IEEE
1191 fi
1192 FS=
1193 FS90=
1194
1195 AUTODIFF_PKG_USED=f
1196 AD_OPTFILE=
1197 TAF=
1198 AD_TAF_FLAGS=
1199 FTL_TAF_FLAGS=
1200 SVD_TAF_FLAGS=
1201 TAF_EXTRA=
1202 TAMC=
1203 AD_TAMC_FLAGS=
1204 FTL_TAF_FLAGS=
1205 SVD_TAMC_FLAGS=
1206 TAMC_EXTRA=
1207
1208 # The following state can be set directly by command-line switches
1209 gm_s1="ROOTDIR STANDARDDIRS MODS PKG_DEPEND PKG_GROUPS DISABLE ENABLE"
1210 gm_s2="PLATFORM OPTFILE MAKE MAKEFILE MAKEDEPEND FC CC MPI OMP USE_R4"
1211 gm_s3="FEXTRAFLAGS IEEE DEVEL GSL TS PAPIS PCLS PAPI PCL HPMT DUMPSTATE"
1212
1213 # The following state is not directly set by command-line switches
1214 gm_s4="LN S64 LINK PACKAGES INCLUDES FFLAGS FOPTIM"
1215 gm_s5="CFLAGS LIBS KPP KFLAGS1 KFLAGS2 KPPFILES NOOPTFILES NOOPTFLAGS"
1216 gm_s6="TOOLSDIR SOURCEDIRS INCLUDEDIRS EXEDIR EXECUTABLE EXEHOOK"
1217 gm_s7="PWD THISHOST THISUSER THISDATE THISVER MACHINE"
1218 gm_s8="FC_NAMEMANGLE HAVE_NETCDF HAVE_SYSTEM HAVE_FDATE HAVE_ETIME HAVE_LAPACK"
1219
1220 # The following are all related to adjoint/tangent-linear stuff
1221 gm_s10="AUTODIFF_PKG_USED AD_OPTFILE TAMC TAF AD_TAMC_FLAGS AD_TAF_FLAGS"
1222 gm_s11="FTL_TAMC_FLAGS FTL_TAF_FLAGS SVD_TAMC_FLAGS SVD_TAF_FLAGS"
1223 gm_s12="TAF_EXTRA TAMC_EXTRA"
1224
1225 gm_state="COMMANDL $gm_s1 $gm_s2 $gm_s3 $gm_s4 $gm_s5 $gm_s6 $gm_s7 $gm_s8"
1226 gm_state="$gm_state $gm_s10 $gm_s11 $gm_s12"
1227
1228 cat <<EOF
1229
1230 GENMAKE :
1231
1232 A program for GENerating MAKEfiles for the MITgcm project.
1233 For a quick list of options, use "genmake2 -h"
1234 or for more detail see the Developer's HOWTO manual at:
1235 http://mitgcm.org/public/docs.html
1236
1237 EOF
1238
1239 LOGFILE="genmake.log"
1240 #- clean-up previous genmake logfiles:
1241 rm -f genmake_state genmake_*optfile $LOGFILE
1242
1243 echo "=== Processing options files and arguments ==="
1244
1245 #echo "$0::$1:$2:$3:$4:$5:$6:$7:"
1246 #parse_options
1247 ac_prev=
1248 for ac_option in "$@" ; do
1249
1250 G2ARGS="$G2ARGS \"$ac_option\""
1251
1252 # If the previous option needs an argument, assign it.
1253 if test -n "$ac_prev"; then
1254 eval "$ac_prev=\$ac_option"
1255 ac_prev=
1256 continue
1257 fi
1258
1259 ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
1260
1261 case $ac_option in
1262
1263 -help | --help | -h | --h)
1264 usage ;;
1265
1266 -nooptfile | --nooptfile)
1267 OPTFILE="NONE" ;;
1268 -optfile | --optfile | -of | --of)
1269 ac_prev=OPTFILE ;;
1270 -optfile=* | --optfile=* | -of=* | --of=*)
1271 OPTFILE=$ac_optarg ;;
1272
1273 -adoptfile | --adoptfile | -adof | --adof)
1274 ac_prev=AD_OPTFILE ;;
1275 -adoptfile=* | --adoptfile=* | -adof=* | --adof=*)
1276 AD_OPTFILE=$ac_optarg ;;
1277
1278 -pdepend | --pdepend)
1279 ac_prev=PKG_DEPEND ;;
1280 -pdepend=* | --pdepend=*)
1281 PKG_DEPEND=$ac_optarg ;;
1282
1283 -pgroups | --pgroups)
1284 ac_prev=PKG_GROUPS ;;
1285 -pgroups=* | --pgroups=*)
1286 PKG_GROUPS=$ac_optarg ;;
1287
1288 -make | --make | -m | --m)
1289 ac_prev=MAKE ;;
1290 -make=* | --make=* | -m=* | --m=*)
1291 MAKE=$ac_optarg ;;
1292
1293 -bash | --bash)
1294 ac_prev=BASH ;;
1295 -bash=* | --bash=*)
1296 BASH=$ac_optarg ;;
1297
1298 -makedepend | --makedepend | -md | --md)
1299 ac_prev=MAKEDEPEND ;;
1300 -makedepend=* | --makedepend=* | -md=* | --md=*)
1301 MAKEDEPEND=$ac_optarg ;;
1302
1303 -makefile | --makefile | -mf | --mf)
1304 ac_prev=MAKEFILE ;;
1305 -makefile=* | --makefile=* | -mf=* | --mf=*)
1306 MAKEFILE=$ac_optarg ;;
1307
1308 -platform | --platform | -pl | --pl | -platform=* | --platform=* | -pl=* | --pl=*)
1309 echo "ERROR: The platform option has been removed. Please specify"
1310 echo " the build options using the \"optfile\" mechanism."
1311 echo
1312 usage
1313 ;;
1314
1315 -rootdir | --rootdir | -rd | --rd)
1316 ac_prev=ROOTDIR ;;
1317 -rootdir=* | --rootdir=* | -rd=* | --rd=*)
1318 ROOTDIR=$ac_optarg ;;
1319
1320 -mods | --mods | -mo | --mo)
1321 ac_prev=MODS ;;
1322 -mods=* | --mods=* | -mo=* | --mo=*)
1323 MODS=$ac_optarg ;;
1324
1325 -disable | --disable)
1326 ac_prev=DISABLE ;;
1327 -disable=* | --disable=*)
1328 DISABLE=$ac_optarg ;;
1329
1330 -enable | --enable)
1331 ac_prev=ENABLE ;;
1332 -enable=* | --enable=*)
1333 ENABLE=$ac_optarg ;;
1334
1335 -standarddirs | --standarddirs)
1336 ac_prev=STANDARDDIRS ;;
1337 -standarddirs=* | --standarddirs=*)
1338 STANDARDDIRS=$ac_optarg ;;
1339
1340 # -cpp | --cpp)
1341 # ac_prev=cpp ;;
1342 # -cpp=* | --cpp=*)
1343 # CPP=$ac_optarg ;;
1344
1345 -cc | --cc)
1346 ac_prev=CC ;;
1347 -cc=* | --cc=*)
1348 CC=$ac_optarg ;;
1349
1350 -fortran | --fortran | -fc | --fc)
1351 ac_prev=FC ;;
1352 -fc=* | --fc=*)
1353 FC=$ac_optarg ;;
1354
1355 -fs | --fs)
1356 ac_prev=FS ;;
1357 -fs=* | --fs=*)
1358 FS=$ac_optarg ;;
1359
1360 -fs90 | --fs90)
1361 ac_prev=FS90 ;;
1362 -fs90=* | --fs90=*)
1363 FS90=$ac_optarg ;;
1364
1365 -use_real4 | -use_r4 | -ur4 | --use_real4 | --use_r4 | --ur4 )
1366 USE_R4=true ;;
1367
1368 -ieee | --ieee)
1369 IEEE=true ;;
1370 -noieee | --noieee)
1371 echo "Warning: ignore option '$ac_option' (default is already without '-ieee')" ;;
1372 -devel | --devel)
1373 IEEE=true ; DEVEL=true ;;
1374 -gsl | --gsl)
1375 GSL=true ;;
1376
1377 -ts | --ts)
1378 TS=true ;;
1379 -papis | --papis)
1380 PAPIS=true ;;
1381 -pcls | --pcls)
1382 PCLS=true ;;
1383 -foolad | --foolad)
1384 FOOLAD=true ;;
1385 -papi | --papi)
1386 PAPI=true ;;
1387 -pcl | --pcl)
1388 PCL=true ;;
1389 -hpmt | --hpmt)
1390 HPMT=true ;;
1391
1392 -mpi | --mpi)
1393 MPI=true ;;
1394 -mpi=* | --mpi=*)
1395 MPIPATH=$ac_optarg
1396 MPI=true ;;
1397
1398 -omp | --omp)
1399 OMP=true ;;
1400 -omp=* | --omp=*)
1401 OMPFLAG=$ac_optarg
1402 OMP=true ;;
1403
1404 -ds | --ds)
1405 DUMPSTATE=t ;;
1406
1407 -extra_flag | --extra_flag)
1408 ac_prev=FEXTRAFLAGS ;;
1409 -extra_flag=* | --extra_flag=*)
1410 FEXTRAFLAGS=$ac_optarg ;;
1411
1412 -taf_extra | --taf_extra)
1413 ac_prev=TAF_EXTRA ;;
1414 -taf_extra=* | --taf_extra=*)
1415 TAF_EXTRA=$ac_optarg ;;
1416
1417 -tamc_extra | --tamc_extra)
1418 ac_prev=TAMC_EXTRA ;;
1419 -tamc_extra=* | --tamc_extra=*)
1420 TAMC_EXTRA=$ac_optarg ;;
1421
1422 -ignoretime | -ignore_time | --ignoretime | --ignore_time)
1423 IGNORE_TIME="-DIGNORE_TIME" ;;
1424
1425 -es | --es | -embed-source | --embed-source)
1426 EMBED_SRC=t ;;
1427
1428 -*)
1429 echo "Error: unrecognized option: "$ac_option
1430 usage
1431 ;;
1432
1433 *)
1434 echo "Error: unrecognized argument: "$ac_option
1435 usage
1436 ;;
1437
1438 esac
1439
1440 done
1441
1442 printf " getting local config information: "
1443 if test -f $gm_local ; then
1444 echo "using $gm_local"
1445 . $gm_local
1446 else
1447 echo "none found"
1448 fi
1449
1450 if test -f ./.genmakerc ; then
1451 echo
1452 echo "WARNING: genmake2 has detected a copy of the old-style \"./.genmakerc\""
1453 echo " file. This file format is no longer supported. For directions on"
1454 echo " how to setup and use the new \"genmake2\" script, please see:"
1455 echo " http://mitgcm.org/public/devel_HOWTO/"
1456 echo " and send an email to MITgcm-support@mitgcm.org if you need help."
1457 echo "WARNING: ignore \"./.genmakerc\" and continue."
1458 echo
1459 fi
1460
1461 # Find the MITgcm ${ROOTDIR}
1462 if test "x${ROOTDIR}" = x ; then
1463 tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1464 if test "x$tmp" = "xbin" -a -d ../model -a -d ../eesupp -a -d ../pkg ; then
1465 ROOTDIR=".."
1466 else
1467 for d in . .. ../.. ../../.. ../../../.. ../../../../.. ; do
1468 if [ -d "$d/model" -a -d "$d/eesupp" -a -d "$d/pkg" ]; then
1469 ROOTDIR=$d
1470 printf "Warning: ROOTDIR was not specified ;"
1471 echo " try using a local copy of MITgcm found at \"$ROOTDIR\""
1472 break
1473 fi
1474 done
1475 fi
1476 fi
1477 if test "x${ROOTDIR}" = x ; then
1478 echo "Error: Cannot determine ROOTDIR for MITgcm code."
1479 echo " Please specify a ROOTDIR using either an options "
1480 echo " file or a command-line option."
1481 exit 1
1482 fi
1483 if test ! -d ${ROOTDIR} ; then
1484 echo "Error: the specified ROOTDIR (\"$ROOTDIR\") does not exist!"
1485 exit 1
1486 fi
1487
1488 # Find the MITgcm ${THISVER}
1489 version_file="${ROOTDIR}/doc/tag-index"
1490 if test -f $version_file ; then
1491 THISVER=`$AWK '/^checkpoint/{print $1; exit}' $version_file`
1492 #- remove ./BUILD_INFO.h file if older than version_file
1493 if test -f ./BUILD_INFO.h -a ./BUILD_INFO.h -ot $version_file ; then
1494 echo " remove ./BUILD_INFO.h (older than ${version_file})"
1495 rm -f ./BUILD_INFO.h
1496 fi
1497 fi
1498
1499 if test "x$MAKEFILE" = x ; then
1500 MAKEFILE="Makefile"
1501 fi
1502
1503 echo " getting OPTFILE information:"
1504 if test "x${OPTFILE}" = x ; then
1505 if test "x$MITGCM_OF" = x ; then
1506 echo "Warning: no OPTFILE specified so we'll look for possible settings"
1507 printf "\n=== Searching for possible settings for OPTFILE ===\n"
1508 find_possible_optfile
1509 else
1510 OPTFILE=$MITGCM_OF
1511 fi
1512 fi
1513 if test "x$OPTFILE" != xNONE ; then
1514 if test -f "$OPTFILE" -a -r "$OPTFILE" ; then
1515 echo " using OPTFILE=\"$OPTFILE\""
1516 . "$OPTFILE"
1517 RETVAL=$?
1518 if test "x$RETVAL" != x0 ; then
1519 printf "Error: failed to source OPTFILE \"$OPTFILE\""
1520 echo "--please check that variable syntax is bash-compatible"
1521 exit 1
1522 fi
1523 if test "x$DUMPSTATE" = xt ; then
1524 cp -f $OPTFILE "genmake_optfile"
1525 fi
1526 else
1527 echo "Error: can't read OPTFILE=\"$OPTFILE\""
1528 exit 1
1529 fi
1530 fi
1531
1532 echo " getting AD_OPTFILE information:"
1533 if test "x${AD_OPTFILE}" = x ; then
1534 if test "x$MITGCM_AD_OF" = x ; then
1535 AD_OPTFILE=$ROOTDIR/tools/adjoint_options/adjoint_default
1536 else
1537 AD_OPTFILE=$MITGCM_AD_OF
1538 fi
1539 fi
1540 if test "x${AD_OPTFILE}" != xNONE ; then
1541 if test -f "$AD_OPTFILE" -a -r "$AD_OPTFILE" ; then
1542 echo " using AD_OPTFILE=\"$AD_OPTFILE\""
1543 . "$AD_OPTFILE"
1544 RETVAL=$?
1545 if test "x$RETVAL" != x0 ; then
1546 printf "Error: failed to source AD_OPTFILE \"$AD_OPTFILE\""
1547 echo "--please check that variable syntax is bash-compatible"
1548 exit 1
1549 fi
1550 if test "x$DUMPSTATE" = xt ; then
1551 cp -f $AD_OPTFILE "genmake_ad_optfile"
1552 fi
1553 else
1554 echo "Error: can't read AD_OPTFILE=\"$AD_OPTFILE\""
1555 exit 1
1556 fi
1557 fi
1558
1559 #====================================================================
1560 # Set default values if not set by the optfile
1561 #
1562 # Check that FC, CC, LINK, CPP, S64, LN, and MAKE are defined. If not,
1563 # either set defaults or complain and abort!
1564 if test ! "x$BASH" = x ; then
1565 # add a trailing space so that it works within the Makefile syntax (see below)
1566 BASH="$BASH "
1567 fi
1568 if test "x$FC" = x ; then
1569 cat <<EOF 1>&2
1570
1571 Error: no Fortran compiler: please specify using one of the following:
1572 1) within the options file ("FC=...") as specified by "-of=OPTFILE"
1573 2) the "-fc=XXX" command-line option
1574 3) the "./genmake_local" file
1575 EOF
1576 exit 1
1577 fi
1578 if test "x$GET_FC_VERSION" != x ; then
1579 echo "Get compiler version using: $FC $GET_FC_VERSION" >> $LOGFILE
1580 ff=`echo $FC | sed 's/ .*//'` ; xx=`echo $ff | sed 's/^./& /' | sed 's/ .*//'`
1581 if test $xx != '/' ; then which $ff >> $LOGFILE ; fi
1582 $FC $GET_FC_VERSION > genmake_fc_vers1 2> genmake_fc_vers2
1583 if test -s genmake_fc_vers1 ; then
1584 cat genmake_fc_vers1 >> $LOGFILE
1585 else
1586 cat genmake_fc_vers2 >> $LOGFILE
1587 fi
1588 echo "<-- compiler version ----" >> $LOGFILE
1589 rm -f genmake_fc_vers1 genmake_fc_vers2
1590 fi
1591
1592 if test "x$CC" = x ; then
1593 look_for_C_compilers
1594 fi
1595
1596 if test "x$LINK" = x ; then
1597 LINK=$FC
1598 fi
1599 if test "x$MAKE" = x ; then
1600 MAKE="make"
1601 fi
1602 if test "x$CPP" = x ; then
1603 CPP="cpp -traditional -P"
1604 fi
1605 #EH3 === UGLY ===
1606 # The following is an ugly little hack to check for $CPP in /lib/ and
1607 # it should eventually be replaced with a more general function that
1608 # searches a combo of the user's path and a list of "usual suspects"
1609 # to find the correct location for binaries such as $CPP.
1610 for i in " " "/lib/" ; do
1611 echo "#define A a" | $i$CPP > test_cpp 2>&1 && CPP=$i$CPP
1612 done
1613 #EH3 === UGLY ===
1614 echo "#define A a" | $CPP > test_cpp 2>&1
1615 RETVAL=$?
1616 if test "x$RETVAL" != x0 ; then
1617 cat <<EOF 1>&2
1618
1619 Error: C pre-processor "$CPP" failed the test case: please specify using:
1620
1621 1) within the options file ("CPP=...") as specified by "-of=OPTFILE"
1622 2) the "./genmake_local" file
1623 3) with the CPP environment variable
1624
1625 EOF
1626 exit 1
1627 else
1628 rm -f test_cpp
1629 fi
1630
1631 look_for_makedepend
1632
1633 # Check that soft-link command is set and usable
1634 if test "x$LN" = x ; then
1635 LN="ln -s"
1636 fi
1637 echo "test" > genmake_test_ln
1638 $LN genmake_test_ln genmake_tlink
1639 RETVAL=$?
1640 if test "x$RETVAL" != x0 ; then
1641 cat <<EOF 1>&2
1642
1643 Error: The command "$LN" failed -- please specify a working soft-link
1644 command in the optfile.
1645
1646 EOF
1647 exit 1
1648 fi
1649 test -L genmake_tlink > /dev/null 2>&1
1650 RETVAL=$?
1651 if test "x$RETVAL" = x0 ; then
1652 HAVE_TEST_L=t
1653 fi
1654 rm -f genmake_test_ln genmake_tlink
1655
1656 # Check for broken *.F/*.f handling and fix if possible
1657 check_for_broken_Ff
1658
1659 if test ! "x$MPI" = x ; then
1660 echo " Turning on MPI cpp macros"
1661 DEFINES="$DEFINES -DALLOW_USE_MPI"
1662 fi
1663 if test ! "x$OMP" = x ; then
1664 echo " Add OMPFLAG and turn on OpenMP cpp macros"
1665 FFLAGS="$FFLAGS $OMPFLAG"
1666 F90FLAGS="$F90FLAGS $OMPFLAG"
1667 DEFINES="$DEFINES -DUSE_OMP_THREADING"
1668 fi
1669
1670 if test ! "x$USE_R4" = x ; then
1671 echo " Turning on LET_RS_BE_REAL4 cpp flag"
1672 DEFINES="$DEFINES -DLET_RS_BE_REAL4"
1673 fi
1674
1675 if test ! "x$TS" = x ; then
1676 echo " Turning on timing per timestep"
1677 if test ! "x$FOOLAD" = x ; then
1678 DEFINES="$DEFINES -DTIME_PER_TIMESTEP_SFP"
1679 else
1680 DEFINES="$DEFINES -DTIME_PER_TIMESTEP"
1681 fi
1682 PACKAGES="$PACKAGES showflops"
1683 fi
1684 if test ! "x$PAPIS" = x ; then
1685 echo " Turning on PAPI flop summary per timestep"
1686 echo " Please make sure PAPIINC, PAPILIB are defined"
1687 if test ! "x$FOOLAD" = x ; then
1688 DEFINES="$DEFINES -DUSE_PAPI_FLOPS_SFP"
1689 else
1690 DEFINES="$DEFINES -DUSE_PAPI_FLOPS"
1691 fi
1692 INCLUDES="$INCLUDES $PAPIINC"
1693 LIBS="$LIBS $PAPILIB"
1694 PACKAGES="$PACKAGES showflops"
1695 fi
1696 if test ! "x$PCLS" = x ; then
1697 echo " Turning on PCL counter summary per timestep"
1698 echo " Please make sure PCLINC, PCLLIB are defined"
1699 if test ! "x$FOOLAD" = x ; then
1700 DEFINES="$DEFINES -DUSE_PCL_FLOPS_SFP"
1701 else
1702 DEFINES="$DEFINES -DUSE_PCL_FLOPS"
1703 fi
1704 INCLUDES="$INCLUDES $PCLINC"
1705 LIBS="$LIBS $PCLLIB"
1706 PACKAGES="$PACKAGES showflops"
1707 fi
1708 if test ! "x$PAPI" = x ; then
1709 if test ! "x$PAPIS" = x ; then
1710 echo " PAPI performance analysis and flop summary per timestep cannot co-exist!"
1711 echo " Sticking with PAPI flop summary per timestep!"
1712 else
1713 echo " Turning on performance analysis with PAPI"
1714 echo " Please make sure PAPIINC, PAPILIB are defined"
1715 DEFINES="$DEFINES -DUSE_PAPI"
1716 INCLUDES="$INCLUDES $PAPIINC"
1717 LIBS="$LIBS $PAPILIB"
1718 fi
1719 fi
1720 if test ! "x$PCL" = x ; then
1721 if test ! "x$PCLS" = x ; then
1722 echo " PCL performance analysis and flop summary per timestep cannot co-exist!"
1723 echo " Sticking with PCL flop summary per timestep!"
1724 else
1725 echo " Turning on performance analysis with PCL"
1726 echo " Please make sure PCLINC, PCLLIB are defined"
1727 DEFINES="$DEFINES -DUSE_PCL"
1728 INCLUDES="$INCLUDES $PCLINC"
1729 LIBS="$LIBS $PCLLIB"
1730 fi
1731 fi
1732 if test ! "x$HPMT" = x ; then
1733 if test ! "x$PAPI" = x ; then
1734 echo " PAPI and the HPM Toolkit cannot co-exist!"
1735 echo " Sticking with PAPI!"
1736 else
1737 if test ! "x$PCL" = x ; then
1738 echo " PCL and the HPM Toolkit cannot co-exist!"
1739 echo " Sticking with PCL!"
1740 else
1741 echo " Turning on performance analysis with the HPM Toolkit"
1742 echo " Please make sure HPMTINC, HPMTLIB are defined"
1743 DEFINES="$DEFINES -DUSE_LIBHPM"
1744 INCLUDES="$INCLUDES $HPMTINC"
1745 LIBS="$LIBS $HPMTLIB"
1746 fi
1747 fi
1748 fi
1749 if test ! "x$GSL" = x ; then
1750 echo " Turning on use of GSL to control floating point calculations"
1751 echo " Please make sure GSLINC, GSLLIB are defined"
1752 DEFINES="$DEFINES -DUSE_GSL_IEEE"
1753 INCLUDES="$INCLUDES $GSLINC"
1754 LIBS="$LIBS $GSLLIB"
1755 fi
1756 #- if USE_EXTENDED_SRC is set, add EXTENDED_SRC_FLAG to FFLAGS :
1757 if test ! "x$USE_EXTENDED_SRC" = x ; then
1758 FFLAGS="$FFLAGS $EXTENDED_SRC_FLAG"
1759 F90FIXEDFORMAT="$F90FIXEDFORMAT $EXTENDED_SRC_FLAG"
1760 fi
1761
1762 printf "\n=== Checking system libraries ===\n"
1763 printf " Do we have the system() command using $FC... "
1764 cat > genmake_tcomp.$FS <<EOF
1765 program hello
1766 call system('echo hi')
1767 end
1768 EOF
1769 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1770 RETVAL=$?
1771 if test "x$RETVAL" = x0 ; then
1772 HAVE_SYSTEM=t
1773 DEFINES="$DEFINES -DHAVE_SYSTEM"
1774 echo "yes"
1775 else
1776 HAVE_SYSTEM=
1777 echo "no"
1778 fi
1779 rm -f genmake_tcomp*
1780
1781 printf " Do we have the fdate() command using $FC... "
1782 cat > genmake_tcomp.$FS <<EOF
1783 program hello
1784 CHARACTER*(128) string
1785 string = ' '
1786 call fdate( string )
1787 print *, string
1788 end
1789 EOF
1790 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1791 RETVAL=$?
1792 if test "x$RETVAL" = x0 ; then
1793 HAVE_FDATE=t
1794 DEFINES="$DEFINES -DHAVE_FDATE"
1795 echo "yes"
1796 else
1797 HAVE_FDATE=
1798 echo "no"
1799 fi
1800 rm -f genmake_tcomp*
1801
1802 printf " Do we have the etime() command using $FC... "
1803 cat > genmake_tcomp.$FS <<EOF
1804 program hello
1805 REAL*4 ACTUAL, TARRAY(2)
1806 EXTERNAL ETIME
1807 REAL*4 ETIME
1808 actual = etime( tarray )
1809 print *, tarray
1810 end
1811 EOF
1812 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1813 RETVAL=$?
1814 if test "x$RETVAL" = x0 ; then
1815 HAVE_ETIME=t
1816 DEFINES="$DEFINES -DHAVE_ETIME"
1817 echo "yes"
1818 else
1819 HAVE_ETIME=
1820 echo "no"
1821 fi
1822 rm -f genmake_tcomp*
1823
1824 printf " Can we call simple C routines (here, \"cloc()\") using $FC... "
1825 check_HAVE_CLOC
1826 if test "x$HAVE_CLOC" != x ; then
1827 DEFINES="$DEFINES -DHAVE_CLOC"
1828 echo "yes"
1829 else
1830 echo "no"
1831 if test "x$EMBED_SRC" = xt ; then
1832 echo " WARNING: you requested file embedding but it has"
1833 echo " been disabled since C code cannot be called"
1834 EMBED_SRC=
1835 fi
1836 fi
1837 rm -f genmake_t*
1838
1839 printf " Can we unlimit the stack size using $FC... "
1840 check_HAVE_SETRLSTK
1841 if test "x$HAVE_SETRLSTK" = xt ; then
1842 DEFINES="$DEFINES -DHAVE_SETRLSTK"
1843 echo "yes"
1844 else
1845 echo "no"
1846 fi
1847 rm -f genmake_t*
1848
1849 printf " Can we register a signal handler using $FC... "
1850 check_HAVE_SIGREG
1851 if test "x$HAVE_SIGREG" = xt ; then
1852 DEFINES="$DEFINES -DHAVE_SIGREG"
1853 echo "yes"
1854 else
1855 echo "no"
1856 fi
1857 rm -f genmake_t*
1858
1859 printf " Can we use stat() through C calls... "
1860 check_HAVE_STAT
1861 if test "x$HAVE_STAT" != x ; then
1862 DEFINES="$DEFINES -DHAVE_STAT"
1863 echo "yes"
1864 else
1865 echo "no"
1866 fi
1867 rm -f genmake_t*
1868
1869 printf " Can we create NetCDF-enabled binaries... "
1870 check_netcdf_libs
1871 if test "x$HAVE_NETCDF" != x ; then
1872 DEFINES="$DEFINES -DHAVE_NETCDF"
1873 echo "yes"
1874 else
1875 echo "no"
1876 fi
1877
1878 printf " Can we create LAPACK-enabled binaries... "
1879 check_lapack_libs
1880 if test "x$HAVE_LAPACK" != x ; then
1881 DEFINES="$DEFINES -DHAVE_LAPACK"
1882 echo "yes"
1883 else
1884 echo "no"
1885 fi
1886 DEFINES="$DEFINES $IGNORE_TIME"
1887
1888 if test "x$EMBED_SRC" = xt ; then
1889 build_embed_encode
1890 fi
1891 if test "x$EMBED_SRC" = xt ; then
1892 ENABLE="$ENABLE embed_files"
1893 # DEFINES="$DEFINES -DHAVE_EMBED_SRC"
1894 fi
1895
1896 printf "\n=== Setting defaults ===\n"
1897 printf " Adding MODS directories: "
1898 for d in $MODS ; do
1899 if test ! -d $d ; then
1900 echo
1901 echo "Error: MODS directory \"$d\" not found!"
1902 exit 1
1903 else
1904 printf "$d "
1905 SOURCEDIRS="$SOURCEDIRS $d"
1906 INCLUDEDIRS="$INCLUDEDIRS $d"
1907 fi
1908 done
1909 echo
1910
1911 #if test "x${PLATFORM}" = x ; then
1912 # PLATFORM=$p_PLATFORM
1913 #fi
1914
1915 if test "x${EXEDIR}" = x ; then
1916 tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1917 if test "x$tmp" = "xbin" -a -d ../exe -a $ROOTDIR = .. ; then
1918 EXEDIR=../exe
1919 else
1920 EXEDIR=.
1921 fi
1922 fi
1923 if test ! -d ${EXEDIR} ; then
1924 echo "Error: the specified EXEDIR (\"$EXEDIR\") does not exist!"
1925 exit 1
1926 fi
1927
1928 if test "x${TOOLSDIR}" = x ; then
1929 TOOLSDIR="$ROOTDIR/tools"
1930 fi
1931 if test ! -d ${TOOLSDIR} ; then
1932 echo "Error: the specified TOOLSDIR (\"$TOOLSDIR\") does not exist!"
1933 exit 1
1934 fi
1935 if test "x$S64" = x ; then
1936 echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.sh > /dev/null 2>&1
1937 RETVAL=$?
1938 if test "x${RETVAL}" = x0 ; then
1939 S64='$(TOOLSDIR)/set64bitConst.sh'
1940 else
1941 echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.csh > /dev/null 2>&1
1942 RETVAL=$?
1943 if test "x${RETVAL}" = x0 ; then
1944 S64='$(TOOLSDIR)/set64bitConst.csh'
1945 else
1946 cat <<EOF
1947
1948 ERROR: neither of the two default scripts:
1949
1950 ${TOOLSDIR}/set64bitConst.sh
1951 ${TOOLSDIR}/set64bitConst.csh
1952
1953 are working so please check paths or specify (with \$S64) a
1954 working version of this script.
1955
1956 EOF
1957 exit 1
1958 fi
1959 fi
1960 fi
1961 THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`
1962
1963 EXECUTABLE=${EXECUTABLE:-mitgcmuv}
1964
1965 # Set Standard Code Directories:
1966 if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
1967 STANDARDDIRS="eesupp model"
1968 fi
1969 # if model in Standard-Code-Dir, add eesupp (needed to compile model)
1970 echo " $STANDARDDIRS " | grep ' model ' > /dev/null 2>&1
1971 ckM=$?
1972 echo " $STANDARDDIRS " | grep ' eesupp ' > /dev/null 2>&1
1973 ckE=$?
1974 if test $ckM = 0 -a $ckE = 1 ; then
1975 STANDARDDIRS="$STANDARDDIRS eesupp"
1976 fi
1977
1978 # We have a special set of source files in eesupp/src which are
1979 # generated from some template source files. We'll make them first so
1980 # they appear as regular source code
1981 if test -r $ROOTDIR"/eesupp/src/Makefile" ; then
1982 echo " Making source files in eesupp from templates"
1983 ( cd $ROOTDIR"/eesupp/src/" && $MAKE clean_old && $MAKE \
1984 ) > make_eesupp.errors 2>&1
1985 RETVAL=$?
1986 if test "x${RETVAL}" = x0 ; then
1987 rm -f make_eesupp.errors
1988 else
1989 echo "Error: problem encountered while building source files in eesupp:"
1990 cat make_eesupp.errors 1>&2
1991 exit 1
1992 fi
1993 fi
1994
1995 #same for pkg/exch2 and pkg/regrid
1996 for pdir in exch2 regrid ; do
1997 if test -r $ROOTDIR"/pkg/${pdir}/Makefile" ; then
1998 echo " Making source files in pkg/${pdir} from templates"
1999 ( cd $ROOTDIR"/pkg/"${pdir} && $MAKE clean_old && $MAKE \
2000 ) > make_${pdir}.errors 2>&1
2001 RETVAL=$?
2002 if test "x${RETVAL}" = x0 ; then
2003 rm -f make_${pdir}.errors
2004 else
2005 echo "Error: problem encountered while building source files in pkg/${pdir}:"
2006 cat make_${pdir}.errors 1>&2
2007 exit 1
2008 fi
2009 fi
2010 done
2011
2012 printf "\n=== Determining package settings ===\n"
2013 if test "x${PKG_DEPEND}" = x ; then
2014 tmp=$ROOTDIR"/pkg/pkg_depend"
2015 if test -r $tmp ; then PKG_DEPEND=$tmp ; fi
2016 fi
2017 if test "x${PKG_DEPEND}" = x ; then
2018 echo "Warning: No package dependency information was specified."
2019 echo " Please check that ROOTDIR/pkg/pkg_depend exists."
2020 else
2021 if test ! -r ${PKG_DEPEND} ; then
2022 echo "Error: can't read package dependency info from PKG_DEPEND=\"$PKG_DEPEND\""
2023 exit 1
2024 fi
2025 echo " getting package dependency info from $PKG_DEPEND"
2026 # Strip the comments and then convert the dependency file into arrays: PNAME, DNAME
2027 get_pdepend_list $PKG_DEPEND
2028 fi
2029
2030 # A default package groups file "$ROOTDIR/pkg/pkg_groups" is provided
2031 # to define the "default_pkg_list" and package groups (for convenience, one
2032 # can specify a group of packages using names like "ocean" and "atmosphere").
2033 if test "x${PKG_GROUPS}" = x ; then
2034 tmp=$ROOTDIR"/pkg/pkg_groups"
2035 if test -r $tmp ; then PKG_GROUPS=$tmp ; fi
2036 fi
2037 if test "x${PKG_GROUPS}" = x ; then
2038 echo "Warning: No package groups information was specified."
2039 echo " Please check that ROOTDIR/pkg/pkg_groups exists."
2040 else
2041 if test ! -r ${PKG_GROUPS} ; then
2042 echo "Error: can't read package groups info from PKG_GROUPS=\"$PKG_GROUPS\""
2043 exit 1
2044 fi
2045 echo " getting package groups info from $PKG_GROUPS"
2046 fi
2047
2048 # Search for packages to compile.
2049 echo " checking list of packages to compile:"
2050 PKG_LIST=
2051 if test "x${PKG_LIST}" = x ; then
2052 for i in "." $MODS ; do
2053 if test -r $i"/packages.conf" ; then
2054 PKG_LIST=$i"/packages.conf"
2055 break
2056 fi
2057 done
2058 fi
2059 if test "x${PKG_LIST}" = x ; then
2060 pkg_list='default_pkg_list'
2061 if test "x${PKG_GROUPS}" = x ; then
2062 echo "Error: need package groups info to expand pkg_list=\"$pkg_list\""
2063 exit 1
2064 fi
2065 else
2066 if test ! -r $PKG_LIST ; then
2067 echo "Error: can't read package list from PKG_LIST=\"$PKG_LIST\""
2068 exit 1
2069 else
2070 echo " using PKG_LIST=\"$PKG_LIST\""
2071 # Strip the comments and add all the names
2072 pkg_list=`cat $PKG_LIST | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
2073 RETVAL=$?
2074 if test "x${RETVAL}" != x0 ; then
2075 printf "Error: can't parse package list "
2076 echo "-- please check PKG_LIST=\"$PKG_LIST\""
2077 exit 1
2078 fi
2079 fi
2080 fi
2081 for i in $pkg_list ; do
2082 PACKAGES="$PACKAGES $i"
2083 done
2084 echo " before group expansion packages are:$PACKAGES"
2085 if test "x${PKG_GROUPS}" != x ; then
2086 RET=1
2087 while test $RET = 1 ; do expand_pkg_groups; RET=$?; done
2088 echo " after group expansion packages are: $PACKAGES"
2089 fi
2090
2091 echo " applying DISABLE settings"
2092 echo "" > ./.tmp_pack
2093 for i in $PACKAGES ; do
2094 echo $i >> ./.tmp_pack
2095 done
2096 for i in `grep "-" ./.tmp_pack` ; do
2097 j=`echo $i | sed 's/[-]//'`
2098 DISABLE="$DISABLE $j"
2099 done
2100 pack=
2101 for p in $PACKAGES ; do
2102 addit="t"
2103 for d in $DISABLE ; do
2104 if test "x$p" = "x$d" ; then
2105 addit="f"
2106 fi
2107 done
2108 if test "x$addit" = xt ; then
2109 pack="$pack $p"
2110 fi
2111 done
2112 PACKAGES="$pack"
2113 echo " applying ENABLE settings"
2114 echo "" > ./.tmp_pack
2115 PACKAGES="$PACKAGES $ENABLE"
2116 # Test if each explicitly referenced package exists
2117 for i in $PACKAGES ; do
2118 j=`echo $i | sed 's/[-+]//'`
2119 if test ! -d "$ROOTDIR/pkg/$j" ; then
2120 echo "Error: dir '$ROOTDIR/pkg/$i' missing for package '$i'"
2121 exit 1
2122 fi
2123 echo $i >> ./.tmp_pack
2124 done
2125 PACKAGES=
2126 for i in `grep -v "-" ./.tmp_pack | sort | uniq` ; do
2127 PACKAGES="$PACKAGES $i"
2128 done
2129 rm -f ./.tmp_pack
2130 echo " packages are: $PACKAGES"
2131
2132 # Check for package MNC: if NetCDF is available, then build the MNC
2133 # template files ; otherwise, delete mnc from the list of packages.
2134 echo " $PACKAGES " | grep ' mnc ' > /dev/null 2>&1
2135 mnc_in=$?
2136 if test "x$HAVE_NETCDF" != xt ; then
2137 if test "x$mnc_in" = x0 ; then
2138 cat <<EOF
2139 *********************************************************************
2140 WARNING: the "mnc" package was enabled but tests failed to compile
2141 NetCDF applications. Please check that:
2142
2143 1) NetCDF is correctly installed for this compiler and
2144 2) the LIBS variable (within the "optfile") specifies the correct
2145 NetCDF library to link against.
2146
2147 Due to this failure, the "mnc" package is now DISABLED.
2148 *********************************************************************
2149 EOF
2150 PACKAGES=`echo $PACKAGES | sed -e 's/mnc//g'`
2151 DISABLE="$DISABLE mnc"
2152 else
2153 # this prevent to add mnc (due to pdepend rules) if not available
2154 DISABLE="$DISABLE mnc"
2155 fi
2156 else
2157 # we have NetCDF, we try to build MNC template files
2158 ( cd $ROOTDIR"/pkg/mnc" && $MAKE testclean && $MAKE templates ) > make_mnc.errors 2>&1
2159 RETVAL=$?
2160 if test "x${RETVAL}" = x0 ; then
2161 rm -f make_mnc.errors
2162 else
2163 echo "Error: problem encountered while building source files in pkg/mnc:"
2164 cat make_mnc.errors 1>&2
2165 if test "x$mnc_in" = x0 ; then
2166 exit 1
2167 else
2168 DISABLE="$DISABLE mnc"
2169 fi
2170 fi
2171 fi
2172
2173 # Check for package PROFILES: if NetCDF is not available,
2174 # then delete profiles from the list of available packages.
2175 if test "x$HAVE_NETCDF" != xt ; then
2176 echo " $PACKAGES " | grep ' profiles ' > /dev/null 2>&1
2177 RETVAL=$?
2178 if test "x$RETVAL" = x0 ; then
2179 cat <<EOF
2180 *********************************************************************
2181 WARNING: the "profiles" package was enabled but tests failed to
2182 compile NetCDF applications. Please check that:
2183
2184 1) NetCDF is correctly installed for this compiler and
2185 2) the LIBS variable (within the "optfile") specifies the correct
2186 NetCDF library to link against.
2187
2188 Due to this failure, the "profiles" package is now DISABLED.
2189 *********************************************************************
2190 EOF
2191 PACKAGES=`echo $PACKAGES | sed -e 's/profiles//g'`
2192 DISABLE="$DISABLE profiles"
2193 else
2194 # this prevent to add profiles (due to pdepend rules) if not available
2195 DISABLE="$DISABLE profiles"
2196 fi
2197 fi
2198
2199 # Check for package RADTRANS: if LAPACK is not available,
2200 # then issue a warning that the direct radtrans solver is not available.
2201 if test "x$HAVE_LAPACK" != xt ; then
2202 echo " $PACKAGES " | grep ' radtrans ' > /dev/null 2>&1
2203 RETVAL=$?
2204 if test "x$RETVAL" = x0 ; then
2205 cat <<EOF
2206 *********************************************************************
2207 WARNING: the "radtrans" package was enabled but tests failed to
2208 compile LAPACK applications. This means that the direct radtrans
2209 solver is not available and compilation will fail if it is enabled.
2210 If you want to use the direct solver, please check that:
2211
2212 1) LAPACK is correctly installed for this compiler and
2213 2) the LIBS variable (within the "optfile") specifies the correct
2214 LAPACK library to link against.
2215 *********************************************************************
2216 EOF
2217 fi
2218 fi
2219
2220 if test "x${PKG_DEPEND}" != x ; then
2221 echo " applying package dependency rules"
2222 ck=
2223 while test "x$ck" != xtt ; do
2224 i=0
2225 # rtot=${#PNAME[@]}
2226 rtot=$nname
2227 while test $i -le $rtot ; do
2228
2229 # Is $pname in the current $PACKAGES list?
2230 # pname=${PNAME[$i]}
2231 tmp="pname=\"\$PNAME_$i\""
2232 eval $tmp
2233 pin="f"
2234 for p in $PACKAGES ; do
2235 if test "x$p" = "x$pname" ; then
2236 pin="t"
2237 fi
2238 done
2239 # or in the current $STANDARDDIRS list?
2240 for p in $STANDARDDIRS ; do
2241 if test "x$p" = "x$pname" ; then pin="t" ; fi
2242 done
2243
2244 # Is the DNAME entry a (+) or (-) rule ?
2245 tmp="dname=\"\$DNAME_$i\""
2246 eval $tmp
2247 plus="-"
2248 echo $dname | grep '^+' > /dev/null 2>&1
2249 RETVAL=$?
2250 if test "x$RETVAL" = x0 ; then
2251 plus="+"
2252 fi
2253
2254 # Is $dname in the current $PACKAGES list?
2255 dname=`echo $dname | sed -e 's/^[+-]//'`
2256 din="f"
2257 for p in $PACKAGES ; do
2258 if test "x$p" = "x$dname" ; then
2259 din="t"
2260 fi
2261 done
2262
2263 # Do we need to add $dname according to the dependency rules?
2264 if test "x$pin" = xt -a "x$plus" = "x+" -a "x$din" = xf ; then
2265 #echo " " $pname ": need to add :" $dname
2266 in_dis="f"
2267 for dis in $DISABLE ; do
2268 if test "x$dis" = "x$dname" ; then
2269 in_dis="t"
2270 fi
2271 done
2272 if test "x$in_dis" = xt ; then
2273 echo "Error: can't satisfy package dependencies:"
2274 echo " \"$dname\" is required by the dependency rules"
2275 echo " but is disallowed by the DISABLE settings"
2276 exit 1
2277 else
2278 PACKAGES="$PACKAGES $dname"
2279 ck=
2280 fi
2281 fi
2282
2283 # Do we need to get rid of $dname according to the dependency rules?
2284 if test "x$pin" = xt -a "x$plus" = "x-" -a "x$din" = xt; then
2285 echo "Error: can't satisfy package dependencies:"
2286 echo " \"$pname\" was requested but is disallowed by"
2287 echo " the dependency rules for \"$dname\""
2288 exit 1
2289 fi
2290 i=`echo "$i + 1" | bc -l`
2291 #i=$(( $i + 1 ))
2292 done
2293 ck=$ck"t"
2294 done
2295 echo " packages are: $PACKAGES"
2296 fi
2297 for i in $PACKAGES ; do
2298 adr="$ROOTDIR/pkg/$i"
2299 if test -d $adr ; then
2300 SOURCEDIRS="$SOURCEDIRS $adr"
2301 INCLUDEDIRS="$INCLUDEDIRS $adr"
2302 if test "x$i" = xautodiff ; then
2303 AUTODIFF_PKG_USED=t
2304 fi
2305 else
2306 echo "Error: the directory \"$adr\" for package $i doesn't exist"
2307 exit 1
2308 fi
2309 done
2310
2311 # Create a list of #define and #undef to enable/disable packages
2312 PACKAGES_DOT_H=PACKAGES_CONFIG.h
2313 # The following UGLY HACK sets multiple "#undef"s and it needs to go
2314 # away. On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h
2315 # file would eventually be split up so that all package-related #define
2316 # statements could be separated and handled only by genmake.
2317 names=`ls -1 "$ROOTDIR/pkg"`
2318 all_pack=
2319 DISABLED_PACKAGES=
2320 for n in $names ; do
2321 if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
2322 has_pack="f"
2323 for pack in $PACKAGES ; do
2324 if test "x$pack" = "x$n" ; then
2325 has_pack="t"
2326 break
2327 fi
2328 done
2329 if test "x$has_pack" = xf ; then
2330 undef=`echo "ALLOW_$n" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2331 DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
2332 fi
2333 fi
2334 done
2335 ENABLED_PACKAGES=
2336 for i in $PACKAGES ; do
2337 def=`echo "ALLOW_$i" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2338 ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
2339 #eh3 DEFINES="$DEFINES -D$def"
2340
2341 #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
2342 case $i in
2343 aim_v23)
2344 ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
2345 echo "Warning: ALLOW_AIM is set to enable aim_v23."
2346 ;;
2347 esac
2348 #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
2349
2350 done
2351
2352 echo " Adding STANDARDDIRS='$STANDARDDIRS'"
2353 BUILDDIR=${BUILDDIR:-.}
2354 if test "x$STANDARDDIRS" != x ; then
2355 for d in $STANDARDDIRS ; do
2356 adr="$ROOTDIR/$d/src"
2357 if test ! -d $adr ; then
2358 echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2359 echo " is correct and that you correctly specified the STANDARDDIRS option"
2360 exit 1
2361 else
2362 SOURCEDIRS="$SOURCEDIRS $adr"
2363 fi
2364 adr="$ROOTDIR/$d/inc"
2365 if test ! -d $adr ; then
2366 echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2367 echo " is correct and that you correctly specified the STANDARDDIRS option"
2368 exit 1
2369 else
2370 INCLUDEDIRS="$INCLUDEDIRS $adr"
2371 fi
2372 done
2373 fi
2374
2375 echo " Searching for *OPTIONS.h files in order to warn about the presence"
2376 echo " of \"#define \"-type statements that are no longer allowed:"
2377 CPP_OPTIONS=
2378 CPP_EEOPTIONS=
2379 spaths=". $INCLUDEDIRS"
2380 names=`ls -1 "$ROOTDIR/pkg"`
2381 for i in $spaths ; do
2382 try="$i/CPP_OPTIONS.h"
2383 if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
2384 echo " found CPP_OPTIONS=\"$try\""
2385 CPP_OPTIONS="$try"
2386 # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
2387 for n in $names ; do
2388 test_for_package_in_cpp_options $CPP_OPTIONS $n
2389 done
2390 fi
2391 try="$i/CPP_EEOPTIONS.h"
2392 if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
2393 echo " found CPP_EEOPTIONS=\"$try\""
2394 # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
2395 #**** not yet enabled ****
2396 # test_for_mpi_in_cpp_eeoptions $try
2397 #**** not yet enabled ****
2398 CPP_EEOPTIONS="$try"
2399 fi
2400 done
2401 if test "x$CPP_OPTIONS" = x ; then
2402 echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
2403 exit 1
2404 fi
2405
2406 # Here, we build the list of files to be "run through" the adjoint
2407 # compiler.
2408 if test -f ./adSrcFiles.tmp ; then
2409 rm -f ./adSrcFiles.tmp
2410 fi
2411 echo " Creating the list of files for the adjoint compiler."
2412 touch adSrcFiles.tmp
2413 for i in $SOURCEDIRS ; do
2414 list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
2415 for j in $list_files ; do
2416 cat $i/$j >> adSrcFiles.tmp
2417 done
2418 done
2419 if test ! "x"$FS = "x.f" ; then
2420 cat adSrcFiles.tmp | sed -e "s/\.f/.$FS/g" > adSrcFiles.tmp_f
2421 mv -f adSrcFiles.tmp_f adSrcFiles.tmp
2422 fi
2423
2424 echo
2425 echo "=== Creating the Makefile ==="
2426 echo " setting INCLUDES"
2427 for i in $INCLUDEDIRS ; do
2428 if test ! -d $i ; then
2429 echo "Warning: can't find INCLUDEDIRS=\"$i\""
2430 fi
2431 done
2432
2433 if test ! "x$DIVA" = x ; then
2434 echo " Creating the pseudo-MPI include directory"
2435 INCLUDES="-I./mpi_headers $INCLUDES"
2436 rm -rf ./mpi_headers
2437 mkdir -p ./mpi_headers
2438
2439 if test "x$MPIINCLUDEDIR" = x ; then
2440 if test "x$MPIHOME" = x ; then
2441 MPIHOME='/usr'
2442 fi
2443 MPIINCLUDEDIR='$MPIHOME/include'
2444 fi
2445
2446 if test -r $MPIINCLUDEDIR/mpif.h ; then
2447 for i in $MPI_HEADER_FILES; do
2448 cp -p $MPIINCLUDEDIR/$i ./mpi_headers
2449 done
2450
2451 perl -i -pe 's/MPI_DISPLACEMENT_CURRENT=-1_8/MPI_DISPLACEMENT_CURRENT=-1/g' mpi_headers/mpif.h
2452 else
2453 echo " We cannot create a copy of mpif.h!"
2454 # exit -1
2455 fi
2456 fi
2457
2458 echo " Determining the list of source and include files"
2459 rm -rf .links.tmp
2460 mkdir .links.tmp
2461 touch .links.tmp/foo
2462 if test ! -r ".links.tmp/foo" ; then
2463 echo
2464 echo "ERROR : something is wrong with your directory permissions or"
2465 echo " your user file-creation mask (\"umask\") since creating a"
2466 echo " sub-dir, touch-ing a file within it, and then reading it is"
2467 echo " not working. Please try setting your umask to something"
2468 echo " sane such as:"
2469 echo
2470 echo " umask 0002"
2471 echo
2472 echo " and please verify that you have the proper permissions for"
2473 echo " creating sub-directories and then reading files created"
2474 echo " within them."
2475 echo
2476 exit 1
2477 fi
2478 rm -f .links.tmp/foo
2479
2480 if test "x$OPENAD" != x ; then
2481 OAD_DONT_COMPILE="/dev/null"
2482 OAD_DONT_TRANSFORM="/dev/null"
2483 OAD_KEEP_ORIGINAL="/dev/null"
2484 OAD_CB2M_FILES="/dev/null"
2485 OADTOOLS="$TOOLSDIR/OAD_support"
2486 test -f "oadtempflile" && \rm -f "oadtempflile"
2487 cat >> "oadtempflile" <<EOF
2488 $OADTOOLS
2489 EOF
2490 echo " looking for dontCompile file: "
2491 for i in "." $MODS ; do
2492 if test -r $i"/dontCompile" ; then
2493 OAD_DONT_COMPILE=$i"/dontCompile"
2494 echo " found $OAD_DONT_COMPILE"
2495 break
2496 fi
2497 done
2498 echo " looking for dontTransform file: "
2499 for i in "." $MODS ; do
2500 if test -r $i"/dontTransform" ; then
2501 OAD_DONT_TRANSFORM=$i"/dontTransform"
2502 echo " found $OAD_DONT_TRANSFORM"
2503 break
2504 fi
2505 done
2506 echo " looking for keepOriginal file: "
2507 for i in "." $MODS ; do
2508 if test -r $i"/keepOriginal" ; then
2509 OAD_KEEP_ORIGINAL=$i"/keepOriginal"
2510 echo " found $OAD_KEEP_ORIGINAL"
2511 break
2512 fi
2513 done
2514 echo " looking for cb2mFiles: "
2515 for i in "." $MODS ; do
2516 if test -r $i"/cb2mFiles" ; then
2517 OAD_CB2M_FILES=$i"/cb2mFiles"
2518 echo " found $OAD_CB2M_FILES"
2519 break
2520 fi
2521 done
2522 echo " OpenAD exceptions: "
2523 fi
2524
2525 echo "# This section creates symbolic links" > srclinks.tmp
2526 echo "" >> srclinks.tmp
2527 printf 'F77_SRC_FILES = ' > F77srclist.tmp
2528 printf 'NON_AD_F77_SRC_FILES = ' > nonADF77srclist.tmp
2529 printf 'C_SRC_FILES = ' > csrclist.tmp
2530 printf 'F90_SRC_FILES = ' > F90srclist.tmp
2531 printf 'H_SRC_FILES = ' > hsrclist.tmp
2532 printf 'AD_FLOW_FILES = ' > ad_flow_files.tmp
2533 alldirs="$SOURCEDIRS $INCLUDEDIRS ."
2534 for d in $alldirs ; do
2535 deplist=
2536 sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
2537 sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
2538 if test "x$OPENAD" != x ; then
2539 sfiles=`( echo $sfiles | grep -v _cb2m\. )`
2540 fi
2541 for sf in $sfiles ; do
2542 if test ! -r ".links.tmp/$sf" ; then
2543 if test -f "$d/$sf" ; then
2544 ignore_f=f
2545 case $d/$sf in
2546 ./$PACKAGES_DOT_H)
2547 ignore_f=t
2548 ;;
2549 ./AD_CONFIG.h)
2550 ignore_f=t
2551 ;;
2552 ./FC_NAMEMANGLE.h)
2553 ignore_f=t
2554 ;;
2555 ./BUILD_INFO.h)
2556 ignore_f=t
2557 ;;
2558 ./EMBEDDED_FILES.h)
2559 ignore_f=t
2560 ;;
2561 *)
2562 # For the local directory *ONLY*,
2563 # ignore all soft-links
2564 if test "x$HAVE_TEST_L" = xt -a "x$d" = x. -a -L $sf ; then
2565 ignore_f=t
2566 else
2567 touch .links.tmp/$sf
2568 deplist="$deplist $sf"
2569 fi
2570 ;;
2571 esac
2572 if test "x$ignore_f" = xf ; then
2573 extn=`echo $sf | $AWK -F. '{print $NF}'`
2574 case $extn in
2575 F)
2576 echo " \\" >> F77srclist.tmp
2577 printf " $sf" >> F77srclist.tmp
2578 if test "x$OPENAD" != x ; then
2579 basename=${sf%%.F}
2580 isAD=`egrep ^$basename.f'[ ]*' adSrcFiles.tmp`
2581 if test -z "$isAD" ; then
2582 toBeIgnored=`egrep ^$basename'[ ]*' ${OAD_DONT_COMPILE}`
2583 if test -z "$toBeIgnored" ; then
2584 echo " \\" >> nonADF77srclist.tmp
2585 printf " $sf" >> nonADF77srclist.tmp
2586 else
2587 echo " not to be compiled : $sf"
2588 fi
2589 else # file is initially listed as an AD file we want to exclude it
2590 # or we want to retain the untransformed version
2591 notToBeTransformed=`egrep ^$basename'[ ]*' ${OAD_DONT_TRANSFORM}`
2592 untransformedVersionToBeKept=`egrep ^$basename'[ ]*' ${OAD_KEEP_ORIGINAL}`
2593 if test -n "$notToBeTransformed"; then
2594 echo " not to be transformed: $sf"
2595 fi
2596 if test -n "$untransformedVersionToBeKept" ; then
2597 echo " original to be kept : $sf"
2598 fi
2599 if test -n "$notToBeTransformed" -o -n "$untransformedVersionToBeKept" ; then
2600 echo " \\" >> nonADF77srclist.tmp
2601 printf " $sf" >> nonADF77srclist.tmp
2602 fi
2603 fi
2604 fi
2605 ;;
2606 F90)
2607 echo " \\" >> F90srclist.tmp
2608 printf " $sf" >> F90srclist.tmp
2609 ;;
2610 c)
2611 echo " \\" >> csrclist.tmp
2612 printf " $sf" >> csrclist.tmp
2613 ;;
2614 h)
2615 echo " \\" >> hsrclist.tmp
2616 printf " $sf" >> hsrclist.tmp
2617 ;;
2618 flow)
2619 echo " \\" >> ad_flow_files.tmp
2620 printf " $sf" >> ad_flow_files.tmp
2621 ;;
2622 esac
2623 fi
2624 fi
2625 fi
2626 done
2627 if test "x$deplist" != x ; then
2628 if test "$d" != "." ; then
2629 echo "" >> srclinks.tmp
2630 echo "# These files are linked from $d" >> srclinks.tmp
2631 echo "$deplist :" >> srclinks.tmp
2632 # We need to make sure that the link isn't already there.
2633 # This may happen when make thinks that a header file has to be "remade"
2634 # because a module it depends on has changed. In this case we do nothing.
2635 printf "\tif [ ! -L \$@ ]; then \$(LN) %s/\$@ \$@; fi\n" $d >> srclinks.tmp
2636 fi
2637 fi
2638 done
2639 rm -rf .links.tmp
2640 echo "" >> F77srclist.tmp
2641 echo "" >> nonADF77srclist.tmp
2642 echo "" >> csrclist.tmp
2643 echo "" >> F90srclist.tmp
2644 echo "" >> hsrclist.tmp
2645 echo "" >> ad_flow_files.tmp
2646
2647 CMDLINE=$0
2648 for xx in "$@" ; do nw=`echo $xx | wc -w`
2649 if test $nw = '1' ; then CMDLINE="$CMDLINE $xx"
2650 else CMDLINE="$CMDLINE '$xx'" ; fi
2651 done
2652
2653 if test -f $MAKEFILE ; then
2654 mv -f $MAKEFILE "$MAKEFILE.old"
2655 fi
2656 echo " Writing makefile: $MAKEFILE"
2657 echo "# Multithreaded + multi-processing makefile for:" > $MAKEFILE
2658 echo "# $MACHINE" >> $MAKEFILE
2659 echo "# This makefile was generated automatically on" >> $MAKEFILE
2660 echo "# $THISDATE" >> $MAKEFILE
2661 echo "# by the command:" >> $MAKEFILE
2662 echo "# $CMDLINE" >> $MAKEFILE
2663 echo "# executed by:" >> $MAKEFILE
2664 echo "# ${THISUSER}@${THISHOST}:${THISCWD}" >> $MAKEFILE
2665
2666 EXE_AD=$EXECUTABLE"_ad"
2667 EXE_FTL=$EXECUTABLE"_ftl"
2668 EXE_SVD=$EXECUTABLE"_svd"
2669
2670 cat >>$MAKEFILE <<EOF
2671 #
2672 # OPTFILE="$OPTFILE"
2673 #
2674 # BUILDDIR : Directory where object files are written
2675 # SOURCEDIRS : Directories containing the source (.F) files
2676 # INCLUDEDIRS : Directories containing the header-source (.h) files
2677 # EXEDIR : Directory where executable that is generated is written
2678 # EXECUTABLE : Full path of executable binary
2679 #
2680 # CPP : C-preprocessor command
2681 # INCLUDES : Directories searched for header files
2682 # DEFINES : Macro definitions for CPP
2683 # MAKEDEPEND : Dependency generator
2684 # FC : Fortran compiler command
2685 # FFLAGS : Configuration/debugging options for FC
2686 # FOPTIM : Optimization options for FC
2687 # LINK : Command for link editor program
2688 # LIBS : Library flags /or/ additional optimization/debugging flags
2689
2690 ROOTDIR = ${ROOTDIR}
2691 BUILDDIR = ${BUILDDIR}
2692 SOURCEDIRS = ${SOURCEDIRS}
2693 INCLUDEDIRS = ${INCLUDEDIRS}
2694 EXEDIR = ${EXEDIR}
2695 EXECUTABLE = \$(EXEDIR)/${EXECUTABLE}
2696 TOOLSDIR = ${TOOLSDIR}
2697 OADTOOLS = ${OADTOOLS}
2698
2699 #eh3 new defines for the adjoint work
2700 AUTODIFF = ${ROOTDIR}/pkg/autodiff
2701 EXE_AD = ${EXE_AD}
2702 EXE_FTL = ${EXE_FTL}
2703 EXE_SVD = ${EXE_SVD}
2704
2705 ENABLED_PACKAGES = ${ENABLED_PACKAGES}
2706 DISABLED_PACKAGES = ${DISABLED_PACKAGES}
2707
2708 # These files are created by Makefile
2709 SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h BUILD_INFO.h
2710 EOF
2711
2712 if test "x$EMBED_SRC" = xt ; then
2713 echo "EMBEDDED_FILES = EMBEDDED_FILES.h" >>$MAKEFILE
2714 else
2715 echo "EMBEDDED_FILES = " >>$MAKEFILE
2716 fi
2717
2718 cat >>$MAKEFILE <<EOF
2719 # Unix ln (link)
2720 LN = ${LN}
2721 # Dependency generator
2722 MAKEDEPEND = ${MAKEDEPEND}
2723 # Special preprocessor (KAP on DECs, FPP on Crays)
2724 KPP = ${KPP}
2725 # Fortran compiler
2726 FC = ${FC}
2727 # Fortran compiler
2728 F90C = ${F90C}
2729 # C compiler
2730 CC = ${CC}
2731 # Link editor
2732 LINK = ${LINK} ${LDADD}
2733
2734 # Defines for CPP
2735 DEFINES = ${DEFINES}
2736 # Includes for CPP
2737 INCLUDES = ${INCLUDES}
2738 # Flags for KPP
2739 KFLAGS1 = ${KFLAGS1}
2740 KFLAGS2 = ${KFLAGS2}
2741 # Optim./debug for FC
2742 FFLAGS = ${FFLAGS} ${FEXTRAFLAGS}
2743 FOPTIM = ${FOPTIM}
2744 # Optim./debug for FC
2745 F90FLAGS = ${F90FLAGS}
2746 F90OPTIM = ${F90OPTIM}
2747 F90FIXEDFORMAT = ${F90FIXEDFORMAT}
2748 # Flags for CC
2749 CFLAGS = ${CFLAGS}
2750 # Files that should not be optimized
2751 NOOPTFILES = ${NOOPTFILES}
2752 NOOPTFLAGS = ${NOOPTFLAGS}
2753 # Flags and libraries needed for linking
2754 LIBS = ${LIBS}
2755 # Name of the makefile
2756 MAKEFILE = ${MAKEFILE}
2757 # Name of the make program
2758 MAKE = ${MAKE}
2759
2760 EOF
2761
2762 cat F77srclist.tmp >> $MAKEFILE
2763 cat nonADF77srclist.tmp >> $MAKEFILE
2764 cat csrclist.tmp >> $MAKEFILE
2765 cat F90srclist.tmp >> $MAKEFILE
2766 cat hsrclist.tmp >> $MAKEFILE
2767 cat ad_flow_files.tmp >> $MAKEFILE
2768
2769 rm -f F77srclist.tmp nonADF77srclist.tmp csrclist.tmp F90srclist.tmp hsrclist.tmp ad_flow_files.tmp
2770
2771 echo >> $MAKEFILE
2772
2773 # add definitions for preprocessed sources
2774 # and note that not all systems allow case sensitive extensions
2775 # hence the $FS and $FS90 here.
2776 # for fixed format f90 files we use ff90 or FF90 resp
2777 # but these are not expected to be the original source files
2778
2779 echo 'F77_PP_SRC_FILES = $(F77_SRC_FILES:.F=.'$FS')' >> $MAKEFILE
2780 echo 'F90_PP_SRC_FILES = $(F90_SRC_FILES:.F90=.'$FS90')' >> $MAKEFILE
2781 echo 'OBJFILES= $(F77_SRC_FILES:.F=.o) $(C_SRC_FILES:.c=.o) $(F90_SRC_FILES:.F90=.o)' >> $MAKEFILE
2782 echo 'FLOWFILES = $(AD_FLOW_FILES:.flow=.flowdir)' >> $MAKEFILE
2783 echo >> $MAKEFILE
2784 echo '.SUFFIXES:' >> $MAKEFILE
2785 echo '.SUFFIXES: .o .'$FS' .p .F .c .f'$FS90' .'$FS90' .FF90 .F90 .flowdir .flow' >> $MAKEFILE
2786
2787 cat >>$MAKEFILE <<EOF
2788
2789 all: fwd_exe_target
2790 fwd_exe_target:
2791 @echo Update AD_CONFIG.h and make \$(EXECUTABLE)
2792 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Forward version" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN > ad_config.template
2793 @cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
2794 @-rm -f ad_config.template
2795 \$(MAKE) -f \$(MAKEFILE) \$(EXECUTABLE)
2796
2797 \$(EXECUTABLE): \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(OBJFILES) \$(EMBEDDED_FILES)
2798 @echo Creating \$@ ...
2799 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
2800
2801 depend:
2802 @\$(MAKE) -f \$(MAKEFILE) links
2803 \$(MAKEDEPEND) -f \$(MAKEFILE) -o .$FS \$(DEFINES) \$(INCLUDES) \$(F77_SRC_FILES)
2804 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
2805 -rm -f makedepend.out
2806
2807 lib: libmitgcmuv.a
2808
2809 libmitgcmuv.a: \$(OBJFILES)
2810 ar rcv libmitgcmuv.a \$(OBJFILES)
2811 ar d libmitgcmuv.a main.o
2812
2813 obj: \$(OBJFILES)
2814
2815 links: \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(SPECIAL_FILES)
2816
2817 small_f: \$(F77_PP_SRC_FILES) \$(F90_PP_SRC_FILES)
2818
2819 output.txt: \$(EXECUTABLE)
2820 @printf 'running ... '
2821 @\$(EXECUTABLE) > \$@
2822
2823 # remove most of the files that "make" generates
2824 clean:
2825 -rm -rf *.p *.$FS90 *.mod ${RMFILES} work.{pc,pcl} *.template
2826 -rm -rf *.o
2827 -rm -rf *.$FS *.flowdir
2828 -rm -rf *.f$FS90 \$(AD_CLEAN) ad_input*
2829
2830 # remove most of the files that "make" and "make depend" generate
2831 Clean:
2832 @\$(MAKE) -f \$(MAKEFILE) clean
2833 @\$(MAKE) -f \$(MAKEFILE) cleanlinks
2834 -rm -f \$(SPECIAL_FILES) f90mkdepend.log $MAKEFILE.old
2835 -rm -f taf_command taf_output taf_ad.log taf_ad_flow.log taf_ftl.log
2836 -rm -f genmake_warnings genmake_errors make.log
2837
2838 # remove also the executable, files that "genmake2" generates (except Makefile)
2839 # and output from a run (plus log files from testreport)
2840 CLEAN:
2841 @\$(MAKE) -f \$(MAKEFILE) Clean
2842 -rm -f \$(EXECUTABLE) \$(EXE_AD) \$(EXE_FTL) *.bak
2843 -rm -f $LOGFILE genmake_state genmake_*optfile
2844 -rm -f SIZE.h.mpi genmake.tr_log make.tr_log
2845 -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
2846 -find \$(EXEDIR) -name "*.data" -exec rm {} \;
2847 -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
2848 -rm -f *.txt STD* *diagnostics.log datetime
2849 -rm -f *_MIT_CE_000.opt0000 costfunction*0000
2850 -rm -rf mnc_test_*
2851
2852 makefile:
2853 $THIS_SCRIPT $G2ARGS
2854 cleanlinks:
2855 -find . -type l -exec rm {} \;
2856
2857 # Special targets (SPECIAL_FILES) which are created by make
2858 ${PACKAGES_DOT_H}:
2859 @echo Creating \$@ ...
2860 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines -bPACKAGES_CONFIG_H "Disabled packages:" \$(DISABLED_PACKAGES) " " "Enabled packages:" \$(ENABLED_PACKAGES) > \$@
2861 AD_CONFIG.h:
2862 @echo Creating \$@ ...
2863 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Default version" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN > \$@
2864 FC_NAMEMANGLE.h:
2865 @echo Creating \$@ ...
2866 echo "$FC_NAMEMANGLE" > \$@
2867
2868 BUILD_INFO.h:
2869 @echo Creating \$@ ...
2870 EOF
2871
2872 test ! "x$THISVER" = x && echo " -echo \"#define THISVER '$THISVER'\" > \$@" >> $MAKEFILE
2873 test ! "x$THISUSER" = x && echo " -echo \"#define THISUSER '$THISUSER'\" >> \$@" >> $MAKEFILE
2874 test ! "x$THISDATE" = x && echo " -echo \"#define THISDATE '$THISDATE'\" >> \$@" >> $MAKEFILE
2875 test ! "x$THISHOST" = x && echo " -echo \"#define THISHOST '$THISHOST'\" >> \$@" >> $MAKEFILE
2876
2877 if test "x$EMBED_SRC" = xt ; then
2878 cat >>$MAKEFILE <<EOF
2879
2880 decode_files.o : EMBEDDED_FILES.h
2881
2882 ## \$(F77_PP_SRC_FILES)
2883 all_fF.tar.gz : \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(F77_PP_SRC_FILES) Makefile
2884 @echo Creating \$@ ...
2885 -tar -hcf all_fF.tar \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(F77_PP_SRC_FILES) Makefile
2886 -rm -f all_fF.tar.gz
2887 -gzip all_fF.tar
2888
2889 EMBEDDED_FILES.h : all_fF.tar.gz
2890 @echo Creating \$@ ...
2891 -\${ROOTDIR}/tools/embed_encode/encode_files EMBEDDED_FILES.h all_fF.tar.gz
2892
2893 EOF
2894 fi
2895
2896 cat >>$MAKEFILE <<EOF
2897
2898 # The normal chain of rules is ( .F - .$FS - .o )
2899
2900 ## This nullifies any default implicit rules concerning these two file types:
2901 ## %.o : %.F
2902
2903 # C preprocessing and replacing the _d in constants:
2904 CPPCMD = cat \$< | ${CPP} \$(DEFINES) \$(INCLUDES) | ${S64}
2905
2906 .F.$FS:
2907 \$(CPPCMD) > \$@
2908 .$FS.o:
2909 \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
2910 .F.o:
2911 \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
2912 .F90.$FS90:
2913 \$(CPPCMD) > \$@
2914 .FF90.f$FS90:
2915 \$(CPPCMD) > \$@
2916 .$FS90.o:
2917 \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
2918 .f$FS90.o:
2919 cp \$< \$(basename \$<).f90
2920 \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$(F90FIXEDFORMAT) \$(basename \$<).f90
2921 .c.o:
2922 \$(CC) \$(CFLAGS) \$(DEFINES) \$(INCLUDES) -c \$<
2923 .flow.flowdir:
2924 \$(CPPCMD) > \$@
2925
2926 # Special exceptions that use the ( .F - .p - .$FS - .o ) rule-chain
2927 .F.p:
2928 \$(CPPCMD) > \$@
2929 .p.$FS:
2930 \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
2931
2932 EOF
2933
2934 #=========================================
2935 #=== Automatic Differentiation Rules ===
2936 #=== for TAMC/TAF ======================
2937
2938 if test "x$OPENAD" = x ; then
2939
2940 cat >>$MAKEFILE <<EOF
2941
2942 TAMC = ${TAMC}
2943 TAF = ${TAF}
2944
2945 TAF_EXTRA = ${TAF_EXTRA}
2946 TAMC_EXTRA = ${TAMC_EXTRA}
2947
2948 EOF
2949
2950 ad_vars="AD_TAMC_FLAGS AD_TAF_FLAGS"
2951 ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF_FLAGS"
2952 ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
2953 for i in $ad_vars ; do
2954 name=$i
2955 t1="t2=\$"`echo "$i"`
2956 eval $t1
2957 printf "%-20s = " $name >> $MAKEFILE
2958 echo "$t2" | sed -e 's| \+| |g' >> $MAKEFILE
2959 done
2960
2961 echo " Add the source list for AD code generation"
2962 echo >> $MAKEFILE
2963 printf "AD_FILES = " >> $MAKEFILE
2964 AD_FILES=`cat adSrcFiles.tmp`
2965 for i in $AD_FILES ; do
2966 echo " \\" >> $MAKEFILE
2967 printf " $i" >> $MAKEFILE
2968 done
2969 echo >> $MAKEFILE
2970 rm -f adSrcFiles.tmp
2971
2972 cat >>$MAKEFILE <<EOF
2973
2974 # ... AD ...
2975 adall: ad_exe_target
2976 adtaf: ad_taf_output.$FS
2977 adtamc: ad_tamc_output.$FS
2978
2979 ad_exe_target:
2980 @echo Update AD_CONFIG.h and make \$(EXE_AD)
2981 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Adjoint version" -bAD_CONFIG_H -DALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN > ad_config.template
2982 @cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
2983 @-rm -f ad_config.template
2984 \$(MAKE) -f \$(MAKEFILE) \$(EXE_AD)
2985
2986 ad_input_code.$FS: \$(AD_FILES) \$(AD_FLOW_FILES)
2987 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Adjoint version" -bAD_CONFIG_H -DALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN > ad_config.template
2988 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
2989 @-rm -f ad_config.template
2990 @\$(MAKE) -f \$(MAKEFILE) \$(F77_PP_SRC_FILES)
2991 @\$(MAKE) -f \$(MAKEFILE) \$(FLOWFILES)
2992 cat \$(FLOWFILES) \$(AD_FILES) | sed -f \$(TOOLSDIR)/remove_comments_sed > ad_input_code.$FS
2993
2994 ad_taf_output.$FS: ad_input_code.$FS
2995 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2996 ls -l ad_input_code_ad.$FS
2997 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2998
2999 adtafonly:
3000 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
3001 ls -l ad_input_code_ad.$FS
3002 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
3003
3004 \$(EXE_AD): \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) ad_taf_output.o \$(OBJFILES) \$(EMBEDDED_FILES)
3005 \$(LINK) -o \${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
3006
3007 ad_tamc_output.$FS: ad_input_code.$FS
3008 \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.$FS
3009 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.$FS
3010
3011 ad_tamc: ad_tamc_output.o \$(OBJFILES)
3012 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
3013
3014 adonlyfwd:
3015 patch < \$(TOOLSDIR)/ad_taf_output.f.onlyfwd.diff
3016
3017 adtrick:
3018 patch < \$(TOOLSDIR)/ad_taf_output.f.adtrick.diff
3019
3020 adobj: ad_taf_output.o \$(OBJFILES)
3021
3022 # ... FTL ...
3023 ftlall: ftl_exe_target
3024 ftltaf: ftl_taf_output.$FS
3025 ftltamc: ftl_tamc_output.$FS
3026
3027 ftl_exe_target:
3028 @echo Update AD_CONFIG.h and make \$(EXE_FTL)
3029 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "TangLin version" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -DALLOW_TANGENTLINEAR_RUN > ad_config.template
3030 @cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
3031 @-rm -f ad_config.template
3032 \$(MAKE) -f \$(MAKEFILE) \$(EXE_FTL)
3033
3034 ftl_input_code.$FS: \$(AD_FILES)
3035 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "TangLin version" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -DALLOW_TANGENTLINEAR_RUN > ad_config.template
3036 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
3037 @-rm -f ad_config.template
3038 @\$(MAKE) -f \$(MAKEFILE) \$(F77_PP_SRC_FILES)
3039 @\$(MAKE) -f \$(MAKEFILE) \$(AD_FLOW_FILES)
3040 cat \$(AD_FLOW_FILES) \$(AD_FILES) | sed -f \$(TOOLSDIR)/remove_comments_sed > ftl_input_code.$FS
3041
3042 ftl_taf_output.$FS: ftl_input_code.$FS
3043 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
3044 ls -l ftl_input_code_ftl.$FS
3045 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
3046
3047 ftltafonly:
3048 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
3049 ls -l ftl_input_code_ftl.$FS
3050 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
3051
3052 \$(EXE_FTL): \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) ftl_taf_output.o \$(OBJFILES) \$(EMBEDDED_FILES)
3053 \$(LINK) -o \${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
3054
3055 ftl_tamc_output.$FS: ftl_input_code.$FS
3056 \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.$FS
3057 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.$FS
3058
3059 ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
3060 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
3061
3062 # ... SVD ...
3063 svdtaf: ad_taf_output.$FS ftl_taf_output.$FS
3064 @echo "--->>> Only ran TAF to generate SVD code! <<<---"
3065 @echo "--->>> Do make svdall afterwards to compile. <<<---"
3066 svdall: svd_touch svd_taf
3067
3068 svd_taf: \$(OBJFILES)
3069 \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
3070
3071 @echo "--->>> Only COMPILE svd code! <<<---"
3072 @echo "--->>> Assumes you previously <<<---"
3073 @echo "--->>> did make svdtaf <<<---"
3074
3075 svd_touch:
3076 @echo "--->>> Only COMPILE svd code! <<<---"
3077 @echo "--->>> Assumes you previously <<<---"
3078 @echo "--->>> did make svdtaf <<<---"
3079 touch ad_taf_output.$FS ftl_taf_output.$FS
3080 \$(FC) \$(FFLAGS) \$(FOPTIM) -c ad_taf_output.$FS
3081 \$(FC) \$(FFLAGS) \$(FOPTIM) -c ftl_taf_output.$FS
3082 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "SVD version" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -DALLOW_TANGENTLINEAR_RUN > ad_config.template
3083 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
3084 @-rm -f ad_config.template
3085
3086 EOF
3087
3088 fi
3089
3090 #=== for OpenAD ========================
3091
3092 if test "x$OPENAD" != x ; then
3093
3094 # ============ begin OpenAD specific section ==============
3095
3096 cat >>$MAKEFILE <<EOF
3097
3098 # all the source files linked from the various locations:
3099 ALL_LINKED_FILES= \
3100 \$(F77_SRC_FILES) \
3101 \$(C_SRC_FILES) \
3102 \$(H_SRC_FILES) \
3103 \$(F90_SRC_FILES) \
3104 \$(SPECIAL_FILES)
3105
3106 ifndef OPENADROOT
3107 \$(error "Error: environment variable OPENADROOT not defined!")
3108 endif
3109
3110 ifndef XAIFSCHEMAROOT
3111 \$(error "Error: environment variable XAIFSCHEMAROOT not defined!")
3112 endif
3113
3114 ifndef XAIFBOOSTERROOT
3115 \$(error "Error: environment variable XAIFBOOSTERROOT not defined!")
3116 endif
3117
3118 EOF
3119
3120 echo " Add the source list for common block to module conversion "
3121 echo >> $MAKEFILE
3122 printf "CB2M_F90_SRC_NAMES = " >> $MAKEFILE
3123 for i in `cat ${OAD_CB2M_FILES}` ; do
3124 echo " \\" >> $MAKEFILE
3125 printf " $i" >> $MAKEFILE
3126 done
3127 echo >> $MAKEFILE
3128
3129 echo " Add the source list for AD code generation"
3130 echo >> $MAKEFILE
3131 printf "AD_FILES = " >> $MAKEFILE
3132 for i in `cat ${OAD_CB2M_FILES}` ; do
3133 echo " \\" >> $MAKEFILE
3134 printf " ${i}_mod.f$FS90" >> $MAKEFILE
3135 done
3136 AD_FILES=`cat adSrcFiles.tmp`
3137 for i in $AD_FILES ; do
3138 basename=${i%%.f}
3139 toBeIgnored=`egrep ^$basename'[ ]*' ${OAD_DONT_COMPILE} ${OAD_DONT_TRANSFORM}`
3140 if test -z "$toBeIgnored" ; then
3141 echo " \\" >> $MAKEFILE
3142 printf " $i" >> $MAKEFILE
3143 fi
3144 done
3145 echo >> $MAKEFILE
3146 rm -f adSrcFiles.tmp
3147
3148 cat >>$MAKEFILE <<EOF
3149
3150 adAll: \$(EXE_AD)
3151 .PHONY: adAll
3152
3153 CB2M_F90_PP_SRC_FILES=\$(addsuffix _mod.f$FS90, \$(CB2M_F90_SRC_NAMES))
3154
3155 .PRECIOUS: \$(CB2M_F90_PP_SRC_FILES) \$(NON_AD_F77_SRC_FILES:.F=_cb2m.f$FS90)
3156
3157 .PHONY: adDepend
3158 adDepend: \$(ALL_LINKED_FILES) \$(addsuffix _mod.h, \$(CB2M_F90_SRC_NAMES)) \$(addsuffix _mod.FF90, \$(CB2M_F90_SRC_NAMES)) \$(F77_SRC_FILES:.F=_cb2m.FF90)
3159 \$(MAKEDEPEND) -f \$(MAKEFILE) -o .$FS \$(DEFINES) \$(INCLUDES) \$(F77_SRC_FILES)
3160 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
3161 -rm -f makedepend.out
3162
3163 OPENAD_SUPPORT_F90_SRC_FILES = \
3164 w2f__types.F90 \
3165 OAD_active.F90 \
3166 OAD_cp.F90 \
3167 OAD_rev.F90 \
3168 OAD_tape.F90
3169
3170 OPENAD_SUPPORT_C_SRC_FILES = \
3171 iaddr.c \
3172 timeRatio.c
3173
3174 f95_test_mods.f90: \$(OPENAD_SUPPORT_F90_SRC_FILES:F90=$FS90)
3175 cat \$^ > \$@
3176
3177 f95_test.f90: all_mods.xb.x2w.w2f.pp.f$FS90 \$(NON_AD_F77_SRC_FILES:.F=_cb2m.f$FS90) ad_input_code.w2f.pre.xb.x2w.w2f.td.pp.f$FS90
3178 cat \$^ > \$@
3179
3180 f95_test.out: f95_test_mods.f90 f95_test.f90
3181 f95 -fixed -w=unused -maxcontin=132 -c f95_test_mods.f90 > \$@ 2>&1
3182 f95 -fixed -w=unused -maxcontin=132 -c -fixed f95_test.f90 >> \$@ 2>&1
3183
3184 CB2M_AD_FILES=\$(AD_FILES:.f=_cb2m.f$FS90)
3185
3186 AD_OBJ_FILES_S1=\$(OPENAD_SUPPORT_F90_SRC_FILES:.F90=.o) \$(OPENAD_SUPPORT_C_SRC_FILES:.c=.o) OAD_intrinsics_oad.o \$(CB2M_AD_FILES:.f$FS90=_oad.o)
3187
3188 AD_OBJ_FILES_S2=\$(AD_OBJ_FILES_S1) \$(NON_AD_F77_SRC_FILES:.F=_cb2m.o) \$(C_SRC_FILES:.c=.o) \$(F90_SRC_FILES:.F90=.o)
3189
3190 \$(EXE_AD): \$(ALL_LINKED_FILES) \$(addsuffix _mod.h, \$(CB2M_F90_SRC_NAMES)) postProcess.tag \$(AD_OBJ_FILES_S2)
3191 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(AD_OBJ_FILES_S2) \$(LIBS)
3192
3193 # create sources files modules from header files containing common blocks
3194 %_mod.FF90 : %.h \${OADTOOLS}/cb2mGetModules.csh \${OADTOOLS}/cb2mGetModules.awk
3195 \${OADTOOLS}/cb2mGetModules.csh $< \${OADTOOLS}/cb2mGetModules.awk
3196
3197 # create new header files with USE statements for the new modules made above
3198 %_mod.h : %.h \${OADTOOLS}/cb2mGetHeaders.csh \${OADTOOLS}/cb2mGetHeaders.awk
3199 \${OADTOOLS}/cb2mGetHeaders.csh $< \${OADTOOLS}/cb2mGetHeaders.awk \$(CB2M_F90_SRC_NAMES)
3200
3201 # change the include directives of everybody to refer to the new header files with the USE statements
3202 %_cb2m.FF90 : %.F \${OADTOOLS}/cb2mUseModules.bash
3203 \${OADTOOLS}/cb2mUseModules.bash $< ${MPI}
3204
3205 # makefile debug rule
3206 small_f: \$(CB2M_F90_PP_SRC_FILES)
3207 .PHONY: small_f
3208
3209 ad_output.txt: \$(EXE_AD)
3210 @printf 'linking data files ... '
3211 \$(LN) -f ../input_ad/data* ../input_ad/eedata .
3212 \$(LN) -f ../../global_ocean.90x40x15/input/*.bin .
3213 @printf 'running ... '
3214 @./\$(EXE_AD) > \$@
3215
3216 ad_input_code.f$FS90: \$(CB2M_AD_FILES)
3217 cat \$^ > \$@
3218
3219 # canonicalizer
3220 ad_input_code_sf.pre.f90 : \$(CB2M_AD_FILES)
3221 \${OPENADFORTTK_BASE}/tools/SourceProcessing/preProcess.py --timing --r8 -H -S -o \$@ \$^
3222
3223 # replace stop statements (to avoid the implied unstructured control flow) with print statements
3224 ad_input_code_sf.pre.s2p.f90 : ad_input_code_sf.pre.f90
3225 cat \$< | sed -f \${OADTOOLS}/stop2print.sed > ad_input_code_sf.pre.s2p.f90
3226
3227 # F -> WHIRL
3228 ad_input_code_sf.pre.s2p.B: ad_input_code_sf.pre.s2p.f90
3229 \${OPEN64ROOT}/crayf90/sgi/mfef90 -r8 -z -F ad_input_code_sf.pre.s2p.f90
3230
3231 # WHIRL -> XAIF
3232 ad_input_code_sf.pre.s2p.xaif : ad_input_code_sf.pre.s2p.B
3233 \${OPENADFORTTK}/bin/whirl2xaif -s -n --debug 1 -o \$@ \$<
3234
3235 # XAIF -> XAIF'
3236 ad_input_code_sf.pre.s2p.xb.xaif : ad_input_code_sf.pre.s2p.xaif xaif.xsd xaif_base.xsd xaif_inlinable_intrinsics.xsd xaif_derivative_propagator.xsd xaif_output.xsd
3237 \${XAIFBOOSTERROOT}/xaifBooster/algorithms/BasicBlockPreaccumulationReverse/driver/oadDriver -f -t forward_step -i \$< -c \${XAIFSCHEMAROOT}/schema/examples/inlinable_intrinsics.xaif -o \$@ -I -r
3238
3239 # XAIF' -> WHIRL'
3240 ad_input_code_sf.pre.s2p.xb.x2w.B : ad_input_code_sf.pre.s2p.xb.xaif
3241 \${OPENADFORTTK}/bin/xaif2whirl --debug 1 ad_input_code_sf.pre.s2p.B \$<
3242
3243 # WHIRL' -> F'
3244 ad_input_code_sf.pre.s2p.xb.x2w.w2f.f$FS90: ad_input_code_sf.pre.s2p.xb.x2w.B
3245 \${OPEN64ROOT}/whirl2f/whirl2f -FLIST:ftn_file=\$@ -openad \$<
3246
3247 # insert template directives
3248 ad_input_code_sf.pre.s2p.xb.x2w.w2f.td.f$FS90: ad_input_code_sf.pre.s2p.xb.x2w.w2f.f$FS90 \${OADTOOLS}/insertTemplateDir.bash
3249 \${OADTOOLS}/insertTemplateDir.bash \$< \$@
3250
3251 PPEXTRAS=\$(wildcard \${OADTOOLS}/ad_template.*.F) \${OADTOOLS}/ad_inline.F
3252 # postprocess F'
3253 postProcess.tag: ad_input_code_sf.pre.s2p.xb.x2w.w2f.td.f$FS90 \$(PPEXTRAS:.F=.f) | w2f__types.f90
3254 \${OPENADFORTTK_BASE}/tools/SourceProcessing/postProcess.py --progress --timing --infoUnitFile w2f__types.f90 --outputFormat=fixed --separateOutput --pathSuffix "" --filenameSuffix "_oad" -m r -i \${OADTOOLS}/ad_inline.f \$<
3255 # the target is a placeholder to trigger a single execution of the rule
3256 touch \$@
3257 # put this so make knows about the postprocessing output
3258 OAD_intrinsics_oad.f \$(CB2M_AD_FILES:.f$FS90=_oad.f): postProcess.tag
3259
3260 # link the XAIF schema files
3261 %.xsd:
3262 \$(LN) \${XAIFSCHEMAROOT}/schema/\$@ .
3263
3264 # link the support files:
3265 \$(OPENAD_SUPPORT_F90_SRC_FILES) \$(OPENAD_SUPPORT_C_SRC_FILES):
3266 \$(LN) \${OADTOOLS}/\$@ .
3267
3268 AD_CLEAN += *_mod.h *_mod.F90 *.FF90 *.mod-whirl temp.sed oad_cp.* postProcess.tag \$(PPEXTRAS:.F=.f)
3269
3270 # ============ end OpenAD specific section ==============
3271
3272 EOF
3273
3274 fi
3275
3276 #=========================================
3277
3278 if test "x$EXEHOOK" != x ; then
3279 printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE
3280 fi
3281
3282 echo " Making list of \"exceptions\" that need \".p\" files"
3283 for i in $KPPFILES ; do
3284 base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
3285 RETVAL=$?
3286 if test "x$RETVAL" != x0 ; then
3287 echo "Error: unable to add file \"$i\" to the exceptions list"
3288 fi
3289 echo "$base.$FS: $base.p" >> $MAKEFILE
3290 done
3291
3292 echo " Making list of NOOPTFILES"
3293 for i in $NOOPTFILES ; do
3294 base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
3295 RETVAL=$?
3296 if test "x$RETVAL" != x0 ; then
3297 echo "Error: unable to add file \"$i\" to the exceptions list"
3298 fi
3299 echo "$base.o: $base.$FS" >> $MAKEFILE
3300 printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE
3301 done
3302
3303 echo " Add rules for links"
3304 cat srclinks.tmp >> $MAKEFILE
3305 rm -f srclinks.tmp
3306
3307 echo " Adding makedepend marker"
3308 printf "\n\n# DO NOT DELETE\n" >> $MAKEFILE
3309
3310 printf "\n=== Done ===\n"
3311
3312 # Create special header files
3313 $BASH $TOOLSDIR/convert_cpp_cmd2defines -bPACKAGES_CONFIG_H "Disabled packages:" $DISABLED_PACKAGES " " "Enabled packages:" $ENABLED_PACKAGES > $PACKAGES_DOT_H".tmp"
3314 if test ! -f $PACKAGES_DOT_H ; then
3315 mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
3316 else
3317 cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H > /dev/null 2>&1
3318 RETVAL=$?
3319 if test "x$RETVAL" = x0 ; then
3320 rm -f $PACKAGES_DOT_H".tmp"
3321 else
3322 mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"
3323 mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
3324 fi
3325 fi
3326 if test ! -f AD_CONFIG.h ; then
3327 $BASH $TOOLSDIR/convert_cpp_cmd2defines "Default version" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN > AD_CONFIG.h
3328 fi
3329
3330 # Write the "state" for future records
3331 if test "x$DUMPSTATE" = xt ; then
3332 printf "" > genmake_state
3333 for i in $gm_state ; do
3334 t1="t2=\$$i"
3335 eval $t1
3336 echo "$i='$t2'" | sed -e 's/ */ /g' >> genmake_state
3337 done
3338 fi

  ViewVC Help
Powered by ViewVC 1.1.22