/[MITgcm]/MITgcm/tools/genmake2
ViewVC logotype

Annotation of /MITgcm/tools/genmake2

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.276 - (hide annotations) (download)
Thu Jan 7 20:21:42 2016 UTC (8 years, 2 months ago) by jmc
Branch: MAIN
Changes since 1.275: +22 -9 lines
change test for etime (using S/R call instead of Function call):
 check that it compiles, runs and gives meaningfull results.

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

  ViewVC Help
Powered by ViewVC 1.1.22