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

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