/[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.240 - (show annotations) (download)
Sat Sep 8 20:16:23 2012 UTC (11 years, 6 months ago) by jmc
Branch: MAIN
Changes since 1.239: +5 -5 lines
changes in Makefile:
- add similar dependences for target EXE_AD & EXE_FTL as we have for EXECUTABLE
  (added by Alistair in version 1.51 for building without make depend);
- remove Header files list (H_SRC_FILES) from the dependences of targets
   ad_input_code.f & ftl_input_code.f:
  a) not very clear why it was added in the first place in version 1.23 ;
  b) does not seem necessary (was not fixing case of built without make depend)
  c) save going through staf when unrelated header file has been modified.
Note: for an intermediate target (e.g., ad_input_code.f or adtaf) without
  "make depend" step, still need to do "make links" before "make adtaf"

1 #! /usr/bin/env bash
2 #
3 # $Header: /u/gcmpack/MITgcm/tools/genmake2,v 1.239 2012/09/06 22:54:19 jmc 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 echo " looking for dontCompile file: "
2486 for i in "." $MODS ; do
2487 if test -r $i"/dontCompile" ; then
2488 OAD_DONT_COMPILE=$i"/dontCompile"
2489 echo " found $OAD_DONT_COMPILE"
2490 break
2491 fi
2492 done
2493 echo " looking for dontTransform file: "
2494 for i in "." $MODS ; do
2495 if test -r $i"/dontTransform" ; then
2496 OAD_DONT_TRANSFORM=$i"/dontTransform"
2497 echo " found $OAD_DONT_TRANSFORM"
2498 break
2499 fi
2500 done
2501 echo " looking for keepOriginal file: "
2502 for i in "." $MODS ; do
2503 if test -r $i"/keepOriginal" ; then
2504 OAD_KEEP_ORIGINAL=$i"/keepOriginal"
2505 echo " found $OAD_KEEP_ORIGINAL"
2506 break
2507 fi
2508 done
2509 echo " looking for cb2mFiles: "
2510 for i in "." $MODS ; do
2511 if test -r $i"/cb2mFiles" ; then
2512 OAD_CB2M_FILES=$i"/cb2mFiles"
2513 echo " found $OAD_CB2M_FILES"
2514 break
2515 fi
2516 done
2517 echo " OpenAD exceptions: "
2518 fi
2519
2520 echo "# This section creates symbolic links" > srclinks.tmp
2521 echo "" >> srclinks.tmp
2522 printf 'F77_SRC_FILES = ' > F77srclist.tmp
2523 printf 'NON_AD_F77_SRC_FILES = ' > nonADF77srclist.tmp
2524 printf 'C_SRC_FILES = ' > csrclist.tmp
2525 printf 'F90_SRC_FILES = ' > F90srclist.tmp
2526 printf 'H_SRC_FILES = ' > hsrclist.tmp
2527 printf 'AD_FLOW_FILES = ' > ad_flow_files.tmp
2528 alldirs="$SOURCEDIRS $INCLUDEDIRS ."
2529 for d in $alldirs ; do
2530 deplist=
2531 sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
2532 sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
2533 if test "x$OPENAD" != x ; then
2534 sfiles=`( echo $sfiles | grep -v _cb2m\. )`
2535 fi
2536 for sf in $sfiles ; do
2537 if test ! -r ".links.tmp/$sf" ; then
2538 if test -f "$d/$sf" ; then
2539 ignore_f=f
2540 case $d/$sf in
2541 ./$PACKAGES_DOT_H)
2542 ignore_f=t
2543 ;;
2544 ./AD_CONFIG.h)
2545 ignore_f=t
2546 ;;
2547 ./FC_NAMEMANGLE.h)
2548 ignore_f=t
2549 ;;
2550 ./BUILD_INFO.h)
2551 ignore_f=t
2552 ;;
2553 ./EMBEDDED_FILES.h)
2554 ignore_f=t
2555 ;;
2556 *)
2557 # For the local directory *ONLY*,
2558 # ignore all soft-links
2559 if test "x$HAVE_TEST_L" = xt -a "x$d" = x. -a -L $sf ; then
2560 ignore_f=t
2561 else
2562 touch .links.tmp/$sf
2563 deplist="$deplist $sf"
2564 fi
2565 ;;
2566 esac
2567 if test "x$ignore_f" = xf ; then
2568 extn=`echo $sf | $AWK -F. '{print $NF}'`
2569 case $extn in
2570 F)
2571 echo " \\" >> F77srclist.tmp
2572 printf " $sf" >> F77srclist.tmp
2573 if test "x$OPENAD" != x ; then
2574 basename=${sf%%.F}
2575 isAD=`egrep ^$basename.f'[ ]*' adSrcFiles.tmp`
2576 if test -z "$isAD" ; then
2577 toBeIgnored=`egrep ^$basename'[ ]*' ${OAD_DONT_COMPILE}`
2578 if test -z "$toBeIgnored" ; then
2579 echo " \\" >> nonADF77srclist.tmp
2580 printf " $sf" >> nonADF77srclist.tmp
2581 else
2582 echo " not to be compiled : $sf"
2583 fi
2584 else # file is initially listed as an AD file we want to exclude it
2585 # or we want to retain the untransformed version
2586 notToBeTransformed=`egrep ^$basename'[ ]*' ${OAD_DONT_TRANSFORM}`
2587 untransformedVersionToBeKept=`egrep ^$basename'[ ]*' ${OAD_KEEP_ORIGINAL}`
2588 if test -n "$notToBeTransformed"; then
2589 echo " not to be transformed: $sf"
2590 fi
2591 if test -n "$untransformedVersionToBeKept" ; then
2592 echo " original to be kept : $sf"
2593 fi
2594 if test -n "$notToBeTransformed" -o -n "$untransformedVersionToBeKept" ; then
2595 echo " \\" >> nonADF77srclist.tmp
2596 printf " $sf" >> nonADF77srclist.tmp
2597 fi
2598 fi
2599 fi
2600 ;;
2601 F90)
2602 echo " \\" >> F90srclist.tmp
2603 printf " $sf" >> F90srclist.tmp
2604 ;;
2605 c)
2606 echo " \\" >> csrclist.tmp
2607 printf " $sf" >> csrclist.tmp
2608 ;;
2609 h)
2610 echo " \\" >> hsrclist.tmp
2611 printf " $sf" >> hsrclist.tmp
2612 ;;
2613 flow)
2614 echo " \\" >> ad_flow_files.tmp
2615 printf " $sf" >> ad_flow_files.tmp
2616 ;;
2617 esac
2618 fi
2619 fi
2620 fi
2621 done
2622 if test "x$deplist" != x ; then
2623 if test "$d" != "." ; then
2624 echo "" >> srclinks.tmp
2625 echo "# These files are linked from $d" >> srclinks.tmp
2626 echo "$deplist :" >> srclinks.tmp
2627 # We need to make sure that the link isn't already there.
2628 # This may happen when make thinks that a header file has to be "remade"
2629 # because a module it depends on has changed. In this case we do nothing.
2630 printf "\tif [ ! -L \$@ ]; then \$(LN) %s/\$@ \$@; fi\n" $d >> srclinks.tmp
2631 fi
2632 fi
2633 done
2634 rm -rf .links.tmp
2635 echo "" >> F77srclist.tmp
2636 echo "" >> nonADF77srclist.tmp
2637 echo "" >> csrclist.tmp
2638 echo "" >> F90srclist.tmp
2639 echo "" >> hsrclist.tmp
2640 echo "" >> ad_flow_files.tmp
2641
2642 CMDLINE=$0
2643 for xx in "$@" ; do nw=`echo $xx | wc -w`
2644 if test $nw = '1' ; then CMDLINE="$CMDLINE $xx"
2645 else CMDLINE="$CMDLINE '$xx'" ; fi
2646 done
2647
2648 if test -f $MAKEFILE ; then
2649 mv -f $MAKEFILE "$MAKEFILE.old"
2650 fi
2651 echo " Writing makefile: $MAKEFILE"
2652 echo "# Multithreaded + multi-processing makefile for:" > $MAKEFILE
2653 echo "# $MACHINE" >> $MAKEFILE
2654 echo "# This makefile was generated automatically on" >> $MAKEFILE
2655 echo "# $THISDATE" >> $MAKEFILE
2656 echo "# by the command:" >> $MAKEFILE
2657 echo "# $CMDLINE" >> $MAKEFILE
2658 echo "# executed by:" >> $MAKEFILE
2659 echo "# ${THISUSER}@${THISHOST}:${THISCWD}" >> $MAKEFILE
2660
2661 EXE_AD=$EXECUTABLE"_ad"
2662 EXE_FTL=$EXECUTABLE"_ftl"
2663 EXE_SVD=$EXECUTABLE"_svd"
2664
2665 cat >>$MAKEFILE <<EOF
2666 #
2667 # OPTFILE="$OPTFILE"
2668 #
2669 # BUILDDIR : Directory where object files are written
2670 # SOURCEDIRS : Directories containing the source (.F) files
2671 # INCLUDEDIRS : Directories containing the header-source (.h) files
2672 # EXEDIR : Directory where executable that is generated is written
2673 # EXECUTABLE : Full path of executable binary
2674 #
2675 # CPP : C-preprocessor command
2676 # INCLUDES : Directories searched for header files
2677 # DEFINES : Macro definitions for CPP
2678 # MAKEDEPEND : Dependency generator
2679 # FC : Fortran compiler command
2680 # FFLAGS : Configuration/debugging options for FC
2681 # FOPTIM : Optimization options for FC
2682 # LINK : Command for link editor program
2683 # LIBS : Library flags /or/ additional optimization/debugging flags
2684
2685 ROOTDIR = ${ROOTDIR}
2686 BUILDDIR = ${BUILDDIR}
2687 SOURCEDIRS = ${SOURCEDIRS}
2688 INCLUDEDIRS = ${INCLUDEDIRS}
2689 EXEDIR = ${EXEDIR}
2690 EXECUTABLE = \$(EXEDIR)/${EXECUTABLE}
2691 TOOLSDIR = ${TOOLSDIR}
2692
2693 #eh3 new defines for the adjoint work
2694 AUTODIFF = ${ROOTDIR}/pkg/autodiff
2695 EXE_AD = ${EXE_AD}
2696 EXE_FTL = ${EXE_FTL}
2697 EXE_SVD = ${EXE_SVD}
2698
2699 ENABLED_PACKAGES = ${ENABLED_PACKAGES}
2700 DISABLED_PACKAGES = ${DISABLED_PACKAGES}
2701
2702 # These files are created by Makefile
2703 SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h BUILD_INFO.h
2704 EOF
2705
2706 if test "x$EMBED_SRC" = xt ; then
2707 echo "EMBEDDED_FILES = EMBEDDED_FILES.h" >>$MAKEFILE
2708 else
2709 echo "EMBEDDED_FILES = " >>$MAKEFILE
2710 fi
2711
2712 cat >>$MAKEFILE <<EOF
2713 # Unix ln (link)
2714 LN = ${LN}
2715 # C preprocessor
2716 CPP = cat \$< | ${S64} | ${CPP}
2717 # Dependency generator
2718 MAKEDEPEND = ${MAKEDEPEND}
2719 # Special preprocessor (KAP on DECs, FPP on Crays)
2720 KPP = ${KPP}
2721 # Fortran compiler
2722 FC = ${FC}
2723 # Fortran compiler
2724 F90C = ${F90C}
2725 # C compiler
2726 CC = ${CC}
2727 # Link editor
2728 LINK = ${LINK} ${LDADD}
2729
2730 # Defines for CPP
2731 DEFINES = ${DEFINES}
2732 # Includes for CPP
2733 INCLUDES = ${INCLUDES}
2734 # Flags for KPP
2735 KFLAGS1 = ${KFLAGS1}
2736 KFLAGS2 = ${KFLAGS2}
2737 # Optim./debug for FC
2738 FFLAGS = ${FFLAGS} ${FEXTRAFLAGS}
2739 FOPTIM = ${FOPTIM}
2740 # Optim./debug for FC
2741 F90FLAGS = ${F90FLAGS}
2742 F90OPTIM = ${F90OPTIM}
2743 F90FIXEDFORMAT = ${F90FIXEDFORMAT}
2744 # Flags for CC
2745 CFLAGS = ${CFLAGS}
2746 # Files that should not be optimized
2747 NOOPTFILES = ${NOOPTFILES}
2748 NOOPTFLAGS = ${NOOPTFLAGS}
2749 # Flags and libraries needed for linking
2750 LIBS = ${LIBS}
2751 # Name of the makefile
2752 MAKEFILE = ${MAKEFILE}
2753 # Name of the make program
2754 MAKE = ${MAKE}
2755
2756 EOF
2757
2758 cat F77srclist.tmp >> $MAKEFILE
2759 cat nonADF77srclist.tmp >> $MAKEFILE
2760 cat csrclist.tmp >> $MAKEFILE
2761 cat F90srclist.tmp >> $MAKEFILE
2762 cat hsrclist.tmp >> $MAKEFILE
2763 cat ad_flow_files.tmp >> $MAKEFILE
2764
2765 rm -f F77srclist.tmp nonADF77srclist.tmp csrclist.tmp F90srclist.tmp hsrclist.tmp ad_flow_files.tmp
2766
2767 echo >> $MAKEFILE
2768
2769 # add definitions for preprocessed sources
2770 # and note that not all systems allow case sensitive extensions
2771 # hence the $FS and $FS90 here.
2772 # for fixed format f90 files we use ff90 or FF90 resp
2773 # but these are not expected to be the original source files
2774
2775 echo 'F77_PP_SRC_FILES = $(F77_SRC_FILES:.F=.'$FS')' >> $MAKEFILE
2776 echo 'F90_PP_SRC_FILES = $(F90_SRC_FILES:.F90=.'$FS90')' >> $MAKEFILE
2777 echo 'OBJFILES= $(F77_SRC_FILES:.F=.o) $(C_SRC_FILES:.c=.o) $(F90_SRC_FILES:.F90=.o)' >> $MAKEFILE
2778 echo 'FLOWFILES = $(AD_FLOW_FILES:.flow=.flowdir)' >> $MAKEFILE
2779 echo >> $MAKEFILE
2780 echo '.SUFFIXES:' >> $MAKEFILE
2781 echo '.SUFFIXES: .o .'$FS' .p .F .c .f'$FS90' .'$FS90' .FF90 .F90 .flowdir .flow' >> $MAKEFILE
2782
2783 cat >>$MAKEFILE <<EOF
2784
2785 all: fwd_exe_target
2786 fwd_exe_target:
2787 @echo Update AD_CONFIG.h and make \$(EXECUTABLE)
2788 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Forward version" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN > ad_config.template
2789 @cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
2790 @-rm -f ad_config.template
2791 \$(MAKE) -f \$(MAKEFILE) \$(EXECUTABLE)
2792
2793 \$(EXECUTABLE): \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(OBJFILES) \$(EMBEDDED_FILES)
2794 @echo Creating \$@ ...
2795 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
2796
2797 depend:
2798 @\$(MAKE) -f \$(MAKEFILE) links
2799 \$(MAKEDEPEND) -f \$(MAKEFILE) -o .$FS \$(DEFINES) \$(INCLUDES) \$(F77_SRC_FILES)
2800 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
2801 -rm -f makedepend.out
2802
2803 lib: libmitgcmuv.a
2804
2805 libmitgcmuv.a: \$(OBJFILES)
2806 ar rcv libmitgcmuv.a \$(OBJFILES)
2807 ar d libmitgcmuv.a main.o
2808
2809 obj: \$(OBJFILES)
2810
2811 links: \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(SPECIAL_FILES)
2812
2813 small_f: \$(F77_PP_SRC_FILES) \$(F90_PP_SRC_FILES)
2814
2815 output.txt: \$(EXECUTABLE)
2816 @printf 'running ... '
2817 @\$(EXECUTABLE) > \$@
2818
2819 # remove most of the files that "make" generates
2820 clean:
2821 -rm -rf *.p *.$FS90 *.mod ${RMFILES} work.{pc,pcl} *.template
2822 -rm -rf *.o
2823 -rm -rf *.$FS *.flowdir
2824 -rm -rf *.f$FS90 \$(AD_CLEAN) ad_input*
2825
2826 # remove most of the files that "make" and "make depend" generate
2827 Clean:
2828 @\$(MAKE) -f \$(MAKEFILE) clean
2829 @\$(MAKE) -f \$(MAKEFILE) cleanlinks
2830 -rm -f \$(SPECIAL_FILES) f90mkdepend.log $MAKEFILE.old
2831 -rm -f taf_command taf_output taf_ad.log taf_ad_flow.log taf_ftl.log
2832 -rm -f genmake_warnings genmake_errors make.log
2833
2834 # remove also the executable, files that "genmake2" generates (except Makefile)
2835 # and output from a run (plus log files from testreport)
2836 CLEAN:
2837 @\$(MAKE) -f \$(MAKEFILE) Clean
2838 -rm -f \$(EXECUTABLE) \$(EXE_AD) \$(EXE_FTL) *.bak
2839 -rm -f $LOGFILE genmake_state genmake_*optfile
2840 -rm -f SIZE.h.mpi genmake.tr_log make.tr_log
2841 -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
2842 -find \$(EXEDIR) -name "*.data" -exec rm {} \;
2843 -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
2844 -rm -f *.txt STD* *diagnostics.log datetime
2845 -rm -f *_MIT_CE_000.opt0000 costfunction*0000
2846 -rm -rf mnc_test_*
2847
2848 makefile:
2849 $THIS_SCRIPT $G2ARGS
2850 cleanlinks:
2851 -find . -type l -exec rm {} \;
2852
2853 # Special targets (SPECIAL_FILES) which are created by make
2854 ${PACKAGES_DOT_H}:
2855 @echo Creating \$@ ...
2856 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines -bPACKAGES_CONFIG_H "Disabled packages:" \$(DISABLED_PACKAGES) " " "Enabled packages:" \$(ENABLED_PACKAGES) > \$@
2857 AD_CONFIG.h:
2858 @echo Creating \$@ ...
2859 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Default version" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN > \$@
2860 FC_NAMEMANGLE.h:
2861 @echo Creating \$@ ...
2862 echo "$FC_NAMEMANGLE" > \$@
2863
2864 BUILD_INFO.h:
2865 @echo Creating \$@ ...
2866 EOF
2867
2868 test ! "x$THISVER" = x && echo " -echo \"#define THISVER '$THISVER'\" > \$@" >> $MAKEFILE
2869 test ! "x$THISUSER" = x && echo " -echo \"#define THISUSER '$THISUSER'\" >> \$@" >> $MAKEFILE
2870 test ! "x$THISDATE" = x && echo " -echo \"#define THISDATE '$THISDATE'\" >> \$@" >> $MAKEFILE
2871 test ! "x$THISHOST" = x && echo " -echo \"#define THISHOST '$THISHOST'\" >> \$@" >> $MAKEFILE
2872
2873 if test "x$EMBED_SRC" = xt ; then
2874 cat >>$MAKEFILE <<EOF
2875
2876 decode_files.o : EMBEDDED_FILES.h
2877
2878 ## \$(F77_PP_SRC_FILES)
2879 all_fF.tar.gz : \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(F77_PP_SRC_FILES) Makefile
2880 @echo Creating \$@ ...
2881 -tar -hcf all_fF.tar \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(F77_PP_SRC_FILES) Makefile
2882 -rm -f all_fF.tar.gz
2883 -gzip all_fF.tar
2884
2885 EMBEDDED_FILES.h : all_fF.tar.gz
2886 @echo Creating \$@ ...
2887 -\${ROOTDIR}/tools/embed_encode/encode_files EMBEDDED_FILES.h all_fF.tar.gz
2888
2889 EOF
2890 fi
2891
2892 cat >>$MAKEFILE <<EOF
2893
2894 # The normal chain of rules is ( .F - .$FS - .o )
2895
2896 ## This nullifies any default implicit rules concerning these two file types:
2897 ## %.o : %.F
2898
2899 .F.$FS:
2900 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2901 .$FS.o:
2902 \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
2903 .F.o:
2904 \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
2905 .F90.$FS90:
2906 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2907 .FF90.f$FS90:
2908 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2909 .$FS90.o:
2910 \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
2911 .f$FS90.o:
2912 cp \$< \$(basename \$<).f90
2913 \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$(F90FIXEDFORMAT) \$(basename \$<).f90
2914 .c.o:
2915 \$(CC) \$(CFLAGS) \$(DEFINES) \$(INCLUDES) -c \$<
2916 .flow.flowdir:
2917 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2918
2919 # Special exceptions that use the ( .F - .p - .$FS - .o ) rule-chain
2920 .F.p:
2921 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2922 .p.$FS:
2923 \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
2924
2925 EOF
2926
2927 #=========================================
2928 #=== Automatic Differentiation Rules ===
2929 #=== for TAMC/TAF ======================
2930
2931 if test "x$OPENAD" = x ; then
2932
2933 cat >>$MAKEFILE <<EOF
2934
2935 TAMC = ${TAMC}
2936 TAF = ${TAF}
2937
2938 TAF_EXTRA = ${TAF_EXTRA}
2939 TAMC_EXTRA = ${TAMC_EXTRA}
2940
2941 EOF
2942
2943 ad_vars="AD_TAMC_FLAGS AD_TAF_FLAGS"
2944 ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF_FLAGS"
2945 ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
2946 for i in $ad_vars ; do
2947 name=$i
2948 t1="t2=\$"`echo "$i"`
2949 eval $t1
2950 printf "%-20s = " $name >> $MAKEFILE
2951 echo "$t2" | sed -e 's| \+| |g' >> $MAKEFILE
2952 done
2953
2954 echo " Add the source list for AD code generation"
2955 echo >> $MAKEFILE
2956 printf "AD_FILES = " >> $MAKEFILE
2957 AD_FILES=`cat adSrcFiles.tmp`
2958 for i in $AD_FILES ; do
2959 echo " \\" >> $MAKEFILE
2960 printf " $i" >> $MAKEFILE
2961 done
2962 echo >> $MAKEFILE
2963 rm -f adSrcFiles.tmp
2964
2965 cat >>$MAKEFILE <<EOF
2966
2967 # ... AD ...
2968 adall: ad_exe_target
2969 adtaf: ad_taf_output.$FS
2970 adtamc: ad_tamc_output.$FS
2971
2972 ad_exe_target:
2973 @echo Update AD_CONFIG.h and make \$(EXE_AD)
2974 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Adjoint version" -bAD_CONFIG_H -DALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN > ad_config.template
2975 @cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
2976 @-rm -f ad_config.template
2977 \$(MAKE) -f \$(MAKEFILE) \$(EXE_AD)
2978
2979 ad_input_code.$FS: \$(AD_FILES) \$(AD_FLOW_FILES)
2980 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Adjoint version" -bAD_CONFIG_H -DALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN > ad_config.template
2981 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
2982 @-rm -f ad_config.template
2983 @\$(MAKE) -f \$(MAKEFILE) \$(F77_PP_SRC_FILES)
2984 @\$(MAKE) -f \$(MAKEFILE) \$(FLOWFILES)
2985 cat \$(FLOWFILES) \$(AD_FILES) | sed -f \$(TOOLSDIR)/remove_comments_sed > ad_input_code.$FS
2986
2987 ad_taf_output.$FS: ad_input_code.$FS
2988 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2989 ls -l ad_input_code_ad.$FS
2990 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2991
2992 adtafonly:
2993 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2994 ls -l ad_input_code_ad.$FS
2995 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2996
2997 \$(EXE_AD): \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) ad_taf_output.o \$(OBJFILES) \$(EMBEDDED_FILES)
2998 \$(LINK) -o \${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
2999
3000 ad_tamc_output.$FS: ad_input_code.$FS
3001 \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.$FS
3002 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.$FS
3003
3004 ad_tamc: ad_tamc_output.o \$(OBJFILES)
3005 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
3006
3007 adonlyfwd:
3008 patch < \$(TOOLSDIR)/ad_taf_output.f.onlyfwd.diff
3009
3010 adtrick:
3011 patch < \$(TOOLSDIR)/ad_taf_output.f.adtrick.diff
3012
3013 adobj: ad_taf_output.o \$(OBJFILES)
3014
3015 # ... FTL ...
3016 ftlall: ftl_exe_target
3017 ftltaf: ftl_taf_output.$FS
3018 ftltamc: ftl_tamc_output.$FS
3019
3020 ftl_exe_target:
3021 @echo Update AD_CONFIG.h and make \$(EXE_FTL)
3022 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "TangLin version" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -DALLOW_TANGENTLINEAR_RUN > ad_config.template
3023 @cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
3024 @-rm -f ad_config.template
3025 \$(MAKE) -f \$(MAKEFILE) \$(EXE_FTL)
3026
3027 ftl_input_code.$FS: \$(AD_FILES)
3028 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "TangLin version" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -DALLOW_TANGENTLINEAR_RUN > ad_config.template
3029 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
3030 @-rm -f ad_config.template
3031 @\$(MAKE) -f \$(MAKEFILE) \$(F77_PP_SRC_FILES)
3032 @\$(MAKE) -f \$(MAKEFILE) \$(AD_FLOW_FILES)
3033 cat \$(AD_FLOW_FILES) \$(AD_FILES) | sed -f \$(TOOLSDIR)/remove_comments_sed > ftl_input_code.$FS
3034
3035 ftl_taf_output.$FS: ftl_input_code.$FS
3036 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
3037 ls -l ftl_input_code_ftl.$FS
3038 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
3039
3040 ftltafonly:
3041 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
3042 ls -l ftl_input_code_ftl.$FS
3043 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
3044
3045 \$(EXE_FTL): \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) ftl_taf_output.o \$(OBJFILES) \$(EMBEDDED_FILES)
3046 \$(LINK) -o \${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
3047
3048 ftl_tamc_output.$FS: ftl_input_code.$FS
3049 \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.$FS
3050 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.$FS
3051
3052 ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
3053 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
3054
3055 # ... SVD ...
3056 svdtaf: ad_taf_output.$FS ftl_taf_output.$FS
3057 @echo "--->>> Only ran TAF to generate SVD code! <<<---"
3058 @echo "--->>> Do make svdall afterwards to compile. <<<---"
3059 svdall: svd_touch svd_taf
3060
3061 svd_taf: \$(OBJFILES)
3062 \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
3063
3064 @echo "--->>> Only COMPILE svd code! <<<---"
3065 @echo "--->>> Assumes you previously <<<---"
3066 @echo "--->>> did make svdtaf <<<---"
3067
3068 svd_touch:
3069 @echo "--->>> Only COMPILE svd code! <<<---"
3070 @echo "--->>> Assumes you previously <<<---"
3071 @echo "--->>> did make svdtaf <<<---"
3072 touch ad_taf_output.$FS ftl_taf_output.$FS
3073 \$(FC) \$(FFLAGS) \$(FOPTIM) -c ad_taf_output.$FS
3074 \$(FC) \$(FFLAGS) \$(FOPTIM) -c ftl_taf_output.$FS
3075 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "SVD version" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -DALLOW_TANGENTLINEAR_RUN > ad_config.template
3076 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
3077 @-rm -f ad_config.template
3078
3079 EOF
3080
3081 fi
3082
3083 #=== for OpenAD ========================
3084
3085 if test "x$OPENAD" != x ; then
3086
3087 # ============ begin OpenAD specific section ==============
3088
3089 cat >>$MAKEFILE <<EOF
3090
3091 # all the source files linked from the various locations:
3092 ALL_LINKED_FILES= \
3093 \$(F77_SRC_FILES) \
3094 \$(C_SRC_FILES) \
3095 \$(H_SRC_FILES) \
3096 \$(F90_SRC_FILES) \
3097 \$(SPECIAL_FILES)
3098
3099 ifndef OPENADROOT
3100 \$(error "Error: environment variable OPENADROOT not defined!")
3101 endif
3102
3103 ifndef XAIFSCHEMAROOT
3104 \$(error "Error: environment variable XAIFSCHEMAROOT not defined!")
3105 endif
3106
3107 ifndef XAIFBOOSTERROOT
3108 \$(error "Error: environment variable XAIFBOOSTERROOT not defined!")
3109 endif
3110
3111 EOF
3112
3113 echo " Add the source list for common block to module conversion "
3114 echo >> $MAKEFILE
3115 printf "CB2M_F90_SRC_NAMES = " >> $MAKEFILE
3116 for i in `cat ${OAD_CB2M_FILES}` ; do
3117 echo " \\" >> $MAKEFILE
3118 printf " $i" >> $MAKEFILE
3119 done
3120 echo >> $MAKEFILE
3121
3122 echo " Add the source list for AD code generation"
3123 echo >> $MAKEFILE
3124 printf "AD_FILES = " >> $MAKEFILE
3125 for i in `cat ${OAD_CB2M_FILES}` ; do
3126 echo " \\" >> $MAKEFILE
3127 printf " ${i}_mod.f$FS90" >> $MAKEFILE
3128 done
3129 AD_FILES=`cat adSrcFiles.tmp`
3130 for i in $AD_FILES ; do
3131 basename=${i%%.f}
3132 toBeIgnored=`egrep ^$basename'[ ]*' ${OAD_DONT_COMPILE} ${OAD_DONT_TRANSFORM}`
3133 if test -z "$toBeIgnored" ; then
3134 echo " \\" >> $MAKEFILE
3135 printf " $i" >> $MAKEFILE
3136 fi
3137 done
3138 echo >> $MAKEFILE
3139 rm -f adSrcFiles.tmp
3140
3141 cat >>$MAKEFILE <<EOF
3142
3143 adAll: \$(EXE_AD)
3144 .PHONY: adAll
3145
3146 CB2M_F90_PP_SRC_FILES=\$(addsuffix _mod.f$FS90, \$(CB2M_F90_SRC_NAMES))
3147
3148 .PRECIOUS: \$(CB2M_F90_PP_SRC_FILES) \$(NON_AD_F77_SRC_FILES:.F=_cb2m.f$FS90)
3149
3150 .PHONY: adDepend
3151 adDepend: \$(ALL_LINKED_FILES) \$(addsuffix _mod.h, \$(CB2M_F90_SRC_NAMES)) \$(addsuffix _mod.FF90, \$(CB2M_F90_SRC_NAMES)) \$(F77_SRC_FILES:.F=_cb2m.FF90)
3152 \$(MAKEDEPEND) -f \$(MAKEFILE) -o .$FS \$(DEFINES) \$(INCLUDES) \$(F77_SRC_FILES)
3153 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
3154 -rm -f makedepend.out
3155
3156 OPENAD_SUPPORT_F90_SRC_FILES = \
3157 w2f__types.F90 \
3158 OAD_active.F90 \
3159 OAD_cp.F90 \
3160 OAD_rev.F90 \
3161 OAD_tape.F90
3162
3163 OPENAD_SUPPORT_C_SRC_FILES = \
3164 iaddr.c \
3165 timeRatio.c
3166
3167 f95_test_mods.f90: \$(OPENAD_SUPPORT_F90_SRC_FILES:F90=$FS90)
3168 cat \$^ > \$@
3169
3170 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
3171 cat \$^ > \$@
3172
3173 f95_test.out: f95_test_mods.f90 f95_test.f90
3174 f95 -fixed -w=unused -maxcontin=132 -c f95_test_mods.f90 > \$@ 2>&1
3175 f95 -fixed -w=unused -maxcontin=132 -c -fixed f95_test.f90 >> \$@ 2>&1
3176
3177 CB2M_AD_FILES=\$(AD_FILES:.f=_cb2m.f$FS90)
3178
3179 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)
3180
3181 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)
3182
3183 \$(EXE_AD): \$(ALL_LINKED_FILES) \$(addsuffix _mod.h, \$(CB2M_F90_SRC_NAMES)) postProcess.tag \$(AD_OBJ_FILES_S2)
3184 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(AD_OBJ_FILES_S2) \$(LIBS)
3185
3186 # create sources files modules from header files containing common blocks
3187 %_mod.FF90 : %.h ../OAD_support/cb2mGetModules.csh ../OAD_support/cb2mGetModules.awk
3188 ../OAD_support/cb2mGetModules.csh $< ../OAD_support/cb2mGetModules.awk
3189
3190 # create new header files with USE statements for the new modules made above
3191 %_mod.h : %.h ../OAD_support/cb2mGetHeaders.csh ../OAD_support/cb2mGetHeaders.awk
3192 ../OAD_support/cb2mGetHeaders.csh $< ../OAD_support/cb2mGetHeaders.awk \$(CB2M_F90_SRC_NAMES)
3193
3194 # change the include directives of everybody to refer to the new header files with the USE statements
3195 %_cb2m.FF90 : %.F ../OAD_support/cb2mUseModules.bash
3196 ../OAD_support/cb2mUseModules.bash $< ${MPI}
3197
3198 # makefile debug rule
3199 small_f: \$(CB2M_F90_PP_SRC_FILES)
3200 .PHONY: small_f
3201
3202 ad_output.txt: \$(EXE_AD)
3203 @printf 'linking data files ... '
3204 \$(LN) -f ../input_ad/data* ../input_ad/eedata .
3205 \$(LN) -f ../../global_ocean.90x40x15/input/*.bin .
3206 @printf 'running ... '
3207 @./\$(EXE_AD) > \$@
3208
3209 ad_input_code.f$FS90: \$(CB2M_AD_FILES)
3210 cat \$^ > \$@
3211
3212 # canonicalizer
3213 ad_input_code_sf.pre.f90 : \$(CB2M_AD_FILES)
3214 \${OPENADFORTTK_BASE}/tools/SourceProcessing/preProcess.py --timing --r8 -H -S -o \$@ \$^
3215
3216 # replace stop statements (to avoid the implied unstructured control flow) with print statements
3217 ad_input_code_sf.pre.s2p.f90 : ad_input_code_sf.pre.f90
3218 cat \$< | sed -f ../OAD_support/stop2print.sed > ad_input_code_sf.pre.s2p.f90
3219
3220 # F -> WHIRL
3221 ad_input_code_sf.pre.s2p.B: ad_input_code_sf.pre.s2p.f90
3222 \${OPEN64ROOT}/crayf90/sgi/mfef90 -r8 -z -F ad_input_code_sf.pre.s2p.f90
3223
3224 # WHIRL -> XAIF
3225 ad_input_code_sf.pre.s2p.xaif : ad_input_code_sf.pre.s2p.B
3226 \${OPENADFORTTK}/bin/whirl2xaif -s -n --debug 1 -o \$@ \$<
3227
3228 # XAIF -> XAIF'
3229 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
3230 \${XAIFBOOSTERROOT}/xaifBooster/algorithms/BasicBlockPreaccumulationReverse/driver/oadDriver -f -t forward_step -i \$< -c \${XAIFSCHEMAROOT}/schema/examples/inlinable_intrinsics.xaif -o \$@ -I -r
3231
3232 # XAIF' -> WHIRL'
3233 ad_input_code_sf.pre.s2p.xb.x2w.B : ad_input_code_sf.pre.s2p.xb.xaif
3234 \${OPENADFORTTK}/bin/xaif2whirl --debug 1 ad_input_code_sf.pre.s2p.B \$<
3235
3236 # WHIRL' -> F'
3237 ad_input_code_sf.pre.s2p.xb.x2w.w2f.f$FS90: ad_input_code_sf.pre.s2p.xb.x2w.B
3238 \${OPEN64ROOT}/whirl2f/whirl2f -FLIST:ftn_file=\$@ -openad \$<
3239
3240 # insert template directives
3241 ad_input_code_sf.pre.s2p.xb.x2w.w2f.td.f$FS90: ad_input_code_sf.pre.s2p.xb.x2w.w2f.f$FS90 ../OAD_support/insertTemplateDir.bash
3242 ../OAD_support/insertTemplateDir.bash \$< \$@
3243
3244 PPEXTRAS=\$(wildcard ../OAD_support/ad_template.*.F) ../OAD_support/ad_inline.F
3245 # postprocess F'
3246 postProcess.tag: ad_input_code_sf.pre.s2p.xb.x2w.w2f.td.f$FS90 \$(PPEXTRAS:.F=.f) | w2f__types.f90
3247 \${OPENADFORTTK_BASE}/tools/SourceProcessing/postProcess.py --progress --timing --infoUnitFile w2f__types.f90 --outputFormat=fixed --separateOutput --pathSuffix "" --filenameSuffix "_oad" -m r -i ../OAD_support/ad_inline.f \$<
3248 # the target is a placeholder to trigger a single execution of the rule
3249 touch \$@
3250 # put this so make knows about the postprocessing output
3251 OAD_intrinsics_oad.f \$(CB2M_AD_FILES:.f$FS90=_oad.f): postProcess.tag
3252
3253 # link the XAIF schema files
3254 %.xsd:
3255 \$(LN) \${XAIFSCHEMAROOT}/schema/\$@ .
3256
3257 # link the support files:
3258 \$(OPENAD_SUPPORT_F90_SRC_FILES) \$(OPENAD_SUPPORT_C_SRC_FILES):
3259 \$(LN) ../OAD_support/\$@ .
3260
3261 AD_CLEAN += *_mod.h *_mod.F90 *.FF90 *.mod-whirl temp.sed oad_cp.* postProcess.tag \$(PPEXTRAS:.F=.f)
3262
3263 # ============ end OpenAD specific section ==============
3264
3265 EOF
3266
3267 fi
3268
3269 #=========================================
3270
3271 if test "x$EXEHOOK" != x ; then
3272 printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE
3273 fi
3274
3275 echo " Making list of \"exceptions\" that need \".p\" files"
3276 for i in $KPPFILES ; do
3277 base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
3278 RETVAL=$?
3279 if test "x$RETVAL" != x0 ; then
3280 echo "Error: unable to add file \"$i\" to the exceptions list"
3281 fi
3282 echo "$base.$FS: $base.p" >> $MAKEFILE
3283 done
3284
3285 echo " Making list of NOOPTFILES"
3286 for i in $NOOPTFILES ; do
3287 base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
3288 RETVAL=$?
3289 if test "x$RETVAL" != x0 ; then
3290 echo "Error: unable to add file \"$i\" to the exceptions list"
3291 fi
3292 echo "$base.o: $base.$FS" >> $MAKEFILE
3293 printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE
3294 done
3295
3296 echo " Add rules for links"
3297 cat srclinks.tmp >> $MAKEFILE
3298 rm -f srclinks.tmp
3299
3300 echo " Adding makedepend marker"
3301 printf "\n\n# DO NOT DELETE\n" >> $MAKEFILE
3302
3303 printf "\n=== Done ===\n"
3304
3305 # Create special header files
3306 $BASH $TOOLSDIR/convert_cpp_cmd2defines -bPACKAGES_CONFIG_H "Disabled packages:" $DISABLED_PACKAGES " " "Enabled packages:" $ENABLED_PACKAGES > $PACKAGES_DOT_H".tmp"
3307 if test ! -f $PACKAGES_DOT_H ; then
3308 mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
3309 else
3310 cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H > /dev/null 2>&1
3311 RETVAL=$?
3312 if test "x$RETVAL" = x0 ; then
3313 rm -f $PACKAGES_DOT_H".tmp"
3314 else
3315 mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"
3316 mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
3317 fi
3318 fi
3319 if test ! -f AD_CONFIG.h ; then
3320 $BASH $TOOLSDIR/convert_cpp_cmd2defines "Default version" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN > AD_CONFIG.h
3321 fi
3322
3323 # Write the "state" for future records
3324 if test "x$DUMPSTATE" = xt ; then
3325 printf "" > genmake_state
3326 for i in $gm_state ; do
3327 t1="t2=\$$i"
3328 eval $t1
3329 echo "$i='$t2'" | sed -e 's/ */ /g' >> genmake_state
3330 done
3331 fi

  ViewVC Help
Powered by ViewVC 1.1.22