/[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.249 - (hide annotations) (download)
Sat Feb 23 04:24:42 2013 UTC (6 years, 9 months ago) by utke
Branch: MAIN
CVS Tags: checkpoint64e, checkpoint64f
Changes since 1.248: +3 -2 lines
revolve loop

1 edhill 1.86 #! /usr/bin/env bash
2 edhill 1.1 #
3 utke 1.249 # $Header: /u/gcmpack/MITgcm/tools/genmake2,v 1.248 2013/01/24 19:07:04 jmc Exp $
4 jmc 1.233 # $Name: $
5 edhill 1.1 #
6     # Makefile generator for MITgcm UV codes
7     # created by cnh 03/98
8     # adapted by aja 06/98
9     # modified by aja 01/00
10     # rewritten in bash by eh3 08/03
11    
12 jmc 1.214 # Explain usage
13     usage() {
14     cat <<EOF
15    
16     Usage: "$0" [OPTIONS]
17     where [OPTIONS] can be:
18    
19     -help | --help | -h | --h
20 jmc 1.237 Print this help message and exit.
21 jmc 1.214
22     -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 jmc 1.245 #if test ! "x$MPI" = x ; then
911     # echo '#include "mpif.h"' >> genmake_tnc.F
912     #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 jmc 1.244 check_HAVE_FLUSH() {
1096     if test ! "x$SKIP_CHECK_FLUSH" = x ; then
1097     return
1098     fi
1099     echo >> $LOGFILE
1100     echo "running: check_HAVE_FLUSH()" >> $LOGFILE
1101     cat <<EOF > genmake_tflsh.$FS
1102     program fgenflsh
1103     integer iounit
1104     character*9 fname
1105     iounit = 26
1106     fname = 'tmp.tflsh'
1107     open(iounit,FILE=fname,STATUS='unknown')
1108     write(iounit,*) 'genmake_tflsh: hello'
1109     call flush(iounit)
1110     close(iounit)
1111     end
1112     EOF
1113     echo "=== genmake_tflsh.$FS >>>" > genmake_tflsh.log
1114     cat genmake_tflsh.$FS >> genmake_tflsh.log
1115     echo "<<< genmake_tflsh.$FS ===" >> genmake_tflsh.log
1116    
1117     echo "$FC $FFLAGS $FOPTIM -c genmake_tflsh.$FS \ " >> genmake_tflsh.log
1118     echo " && $LINK $FFLAGS $FOPTIM -o genmake_tflsh.o $LIBS" >> genmake_tflsh.log
1119     $FC $FFLAGS $FOPTIM -c genmake_tflsh.$FS >> genmake_tflsh.log 2>&1 \
1120     && $LINK $FFLAGS $FOPTIM -o genmake_tflsh genmake_tflsh.o $LIBS >> genmake_tflsh.log 2>&1
1121     RET_COMPILE=$?
1122    
1123     if test "x$RET_COMPILE" = x0 ; then
1124     HAVE_FLUSH=t
1125     #cat genmake_tflsh.log >> $LOGFILE
1126     echo " check_HAVE_FLUSH: successful" >> $LOGFILE
1127     else
1128     HAVE_FLUSH=f
1129     cat genmake_tflsh.log >> $LOGFILE
1130     fi
1131     rm -f genmake_tflsh*
1132     echo " --> set HAVE_FLUSH='$HAVE_FLUSH'" >> $LOGFILE
1133     }
1134 edhill 1.60
1135 adcroft 1.67 ###############################################################################
1136     # Sequential part of script starts here
1137     ###############################################################################
1138    
1139 edhill 1.1 # Set defaults here
1140 edhill 1.5 COMMANDL="$0 $@"
1141    
1142 edhill 1.1 PLATFORM=
1143     LN=
1144     S64=
1145     KPP=
1146 edhill 1.114 #FC=
1147 edhill 1.93 #CC=gcc
1148 edhill 1.114 #CPP=
1149 edhill 1.1 LINK=
1150 edhill 1.31 DEFINES=
1151 edhill 1.1 PACKAGES=
1152     ENABLE=
1153     DISABLE=
1154 edhill 1.119 # MAKEFILE=
1155     # MAKEDEPEND=
1156 jmc 1.208 PKG_DEPEND=
1157     PKG_GROUPS=
1158 jmc 1.211 DUMPSTATE=f
1159 edhill 1.1 OPTFILE=
1160 edhill 1.111 INCLUDES="-I. $INCLUDES"
1161 edhill 1.1 FFLAGS=
1162     FOPTIM=
1163 mlosch 1.165 FEXTRAFLAGS=
1164 jmc 1.181 USE_EXTENDED_SRC=
1165     EXTENDED_SRC_FLAG=
1166 jmc 1.216 GET_FC_VERSION=
1167 edhill 1.1 CFLAGS=
1168     KFLAGS1=
1169     KFLAGS2=
1170 edhill 1.70 #LDADD=
1171 edhill 1.1 LIBS=
1172     KPPFILES=
1173     NOOPTFILES=
1174     NOOPTFLAGS=
1175 adcroft 1.67 MPI=
1176     MPIPATH=
1177 jmc 1.187 OMP=
1178     OMPFLAG=
1179 jmc 1.203 USE_R4=
1180 ce107 1.126 TS=
1181 ce107 1.139 PAPIS=
1182 ce107 1.147 PCLS=
1183 ce107 1.139 FOOLAD=
1184     PAPI=
1185 ce107 1.147 PCL=
1186 ce107 1.139 HPMT=
1187     GSL=
1188 ce107 1.160 DEVEL=
1189 edhill 1.131 HAVE_TEST_L=
1190 edhill 1.1
1191 jahn 1.246 # comment this line out to enable lapack test
1192     SKIP_LAPACK_CHECK=t
1193    
1194 edhill 1.124 # DEFINES checked by test compilation or command-line
1195 edhill 1.29 HAVE_SYSTEM=
1196     HAVE_FDATE=
1197     FC_NAMEMANGLE=
1198 edhill 1.39 HAVE_CLOC=
1199 edhill 1.151 # HAVE_SETRLSTK=
1200 edhill 1.108 HAVE_STAT=
1201 edhill 1.60 HAVE_NETCDF=
1202 cnh 1.81 HAVE_ETIME=
1203 edhill 1.124 IGNORE_TIME=
1204 jahn 1.232 HAVE_LAPACK=
1205 jmc 1.244 HAVE_FLUSH=
1206 edhill 1.29
1207 edhill 1.1 MODS=
1208     TOOLSDIR=
1209     SOURCEDIRS=
1210     INCLUDEDIRS=
1211 edhill 1.57 STANDARDDIRS="USE_THE_DEFAULT"
1212 edhill 1.1
1213 jmc 1.237 #- local config file
1214     gm_local="genmake_local"
1215    
1216 edhill 1.73 G2ARGS=
1217 edhill 1.71 BASH=
1218 edhill 1.1 PWD=`pwd`
1219 edhill 1.114 test "x$MAKE" = x && MAKE=make
1220     test "x$AWK" = x && AWK=awk
1221 edhill 1.141 EMBED_SRC=
1222 edhill 1.97 THISHOST=`hostname`
1223 edhill 1.1 THISCWD=`pwd`
1224     THISDATE=`date`
1225 edhill 1.97 THISUSER=`echo $USER`
1226     THISVER=
1227 edhill 1.1 MACHINE=`uname -a`
1228 edhill 1.7 EXECUTABLE=
1229     EXEHOOK=
1230     EXEDIR=
1231 edhill 1.12 IEEE=
1232     if test "x$MITGCM_IEEE" != x ; then
1233     IEEE=$MITGCM_IEEE
1234     fi
1235 edhill 1.76 FS=
1236     FS90=
1237 edhill 1.1
1238 edhill 1.14 AUTODIFF_PKG_USED=f
1239     AD_OPTFILE=
1240 edhill 1.17 TAF=
1241     AD_TAF_FLAGS=
1242     FTL_TAF_FLAGS=
1243     SVD_TAF_FLAGS=
1244     TAF_EXTRA=
1245     TAMC=
1246     AD_TAMC_FLAGS=
1247     FTL_TAF_FLAGS=
1248     SVD_TAMC_FLAGS=
1249     TAMC_EXTRA=
1250    
1251 edhill 1.5 # The following state can be set directly by command-line switches
1252 jmc 1.238 gm_s1="ROOTDIR STANDARDDIRS MODS PKG_DEPEND PKG_GROUPS DISABLE ENABLE"
1253     gm_s2="PLATFORM OPTFILE MAKE MAKEFILE MAKEDEPEND FC CC MPI OMP USE_R4"
1254     gm_s3="FEXTRAFLAGS IEEE DEVEL GSL TS PAPIS PCLS PAPI PCL HPMT DUMPSTATE"
1255 edhill 1.5
1256     # The following state is not directly set by command-line switches
1257 jmc 1.238 gm_s4="LN S64 LINK PACKAGES INCLUDES FFLAGS FOPTIM"
1258 jmc 1.222 gm_s5="CFLAGS LIBS KPP KFLAGS1 KFLAGS2 KPPFILES NOOPTFILES NOOPTFLAGS"
1259 jmc 1.244 gm_s6="PWD TOOLSDIR SOURCEDIRS INCLUDEDIRS EXEDIR EXECUTABLE EXEHOOK"
1260     gm_s7="THISHOST THISUSER THISDATE THISVER MACHINE FC_NAMEMANGLE"
1261     gm_s8="HAVE_NETCDF HAVE_SYSTEM HAVE_FDATE HAVE_ETIME HAVE_LAPACK HAVE_FLUSH"
1262 edhill 1.5
1263 edhill 1.14 # The following are all related to adjoint/tangent-linear stuff
1264 edhill 1.29 gm_s10="AUTODIFF_PKG_USED AD_OPTFILE TAMC TAF AD_TAMC_FLAGS AD_TAF_FLAGS"
1265     gm_s11="FTL_TAMC_FLAGS FTL_TAF_FLAGS SVD_TAMC_FLAGS SVD_TAF_FLAGS"
1266     gm_s12="TAF_EXTRA TAMC_EXTRA"
1267 edhill 1.14
1268 jmc 1.222 gm_state="COMMANDL $gm_s1 $gm_s2 $gm_s3 $gm_s4 $gm_s5 $gm_s6 $gm_s7 $gm_s8"
1269 edhill 1.29 gm_state="$gm_state $gm_s10 $gm_s11 $gm_s12"
1270 edhill 1.5
1271 edhill 1.41 cat <<EOF
1272    
1273     GENMAKE :
1274    
1275 jmc 1.211 A program for GENerating MAKEfiles for the MITgcm project.
1276     For a quick list of options, use "genmake2 -h"
1277     or for more detail see the Developer's HOWTO manual at:
1278     http://mitgcm.org/public/docs.html
1279 edhill 1.41
1280     EOF
1281 edhill 1.5
1282 jmc 1.211 LOGFILE="genmake.log"
1283 jmc 1.210 #- clean-up previous genmake logfiles:
1284 jmc 1.211 rm -f genmake_state genmake_*optfile $LOGFILE
1285 jmc 1.209
1286 edhill 1.2 echo "=== Processing options files and arguments ==="
1287 edhill 1.1
1288 edhill 1.103 #echo "$0::$1:$2:$3:$4:$5:$6:$7:"
1289 edhill 1.2 #parse_options
1290     ac_prev=
1291 edhill 1.102 for ac_option in "$@" ; do
1292 edhill 1.2
1293 edhill 1.73 G2ARGS="$G2ARGS \"$ac_option\""
1294    
1295 edhill 1.2 # If the previous option needs an argument, assign it.
1296     if test -n "$ac_prev"; then
1297     eval "$ac_prev=\$ac_option"
1298     ac_prev=
1299     continue
1300     fi
1301 jmc 1.206
1302 edhill 1.2 ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
1303 jmc 1.206
1304 edhill 1.2 case $ac_option in
1305 jmc 1.236
1306 edhill 1.2 -help | --help | -h | --h)
1307     usage ;;
1308 jmc 1.236
1309 edhill 1.2 -nooptfile | --nooptfile)
1310     OPTFILE="NONE" ;;
1311     -optfile | --optfile | -of | --of)
1312 edhill 1.4 ac_prev=OPTFILE ;;
1313 edhill 1.2 -optfile=* | --optfile=* | -of=* | --of=*)
1314     OPTFILE=$ac_optarg ;;
1315 jmc 1.236
1316 edhill 1.50 -adoptfile | --adoptfile | -adof | --adof)
1317 edhill 1.14 ac_prev=AD_OPTFILE ;;
1318     -adoptfile=* | --adoptfile=* | -adof=* | --adof=*)
1319     AD_OPTFILE=$ac_optarg ;;
1320 jmc 1.236
1321 edhill 1.2 -pdepend | --pdepend)
1322 jmc 1.208 ac_prev=PKG_DEPEND ;;
1323 edhill 1.2 -pdepend=* | --pdepend=*)
1324 jmc 1.208 PKG_DEPEND=$ac_optarg ;;
1325 jmc 1.236
1326 jmc 1.208 -pgroups | --pgroups)
1327     ac_prev=PKG_GROUPS ;;
1328     -pgroups=* | --pgroups=*)
1329     PKG_GROUPS=$ac_optarg ;;
1330 jmc 1.236
1331 edhill 1.6 -make | --make | -m | --m)
1332     ac_prev=MAKE ;;
1333     -make=* | --make=* | -m=* | --m=*)
1334     MAKE=$ac_optarg ;;
1335 jmc 1.236
1336 edhill 1.71 -bash | --bash)
1337     ac_prev=BASH ;;
1338     -bash=* | --bash=*)
1339     BASH=$ac_optarg ;;
1340 jmc 1.236
1341 edhill 1.69 -makedepend | --makedepend | -md | --md)
1342     ac_prev=MAKEDEPEND ;;
1343     -makedepend=* | --makedepend=* | -md=* | --md=*)
1344     MAKEDEPEND=$ac_optarg ;;
1345 jmc 1.236
1346 jmc 1.237 -makefile | --makefile | -mf | --mf)
1347 edhill 1.4 ac_prev=MAKEFILE ;;
1348 jmc 1.237 -makefile=* | --makefile=* | -mf=* | --mf=*)
1349 edhill 1.2 MAKEFILE=$ac_optarg ;;
1350 jmc 1.236
1351 edhill 1.41 -platform | --platform | -pl | --pl | -platform=* | --platform=* | -pl=* | --pl=*)
1352     echo "ERROR: The platform option has been removed. Please specify"
1353     echo " the build options using the \"optfile\" mechanism."
1354     echo
1355     usage
1356     ;;
1357 jmc 1.236
1358 edhill 1.2 -rootdir | --rootdir | -rd | --rd)
1359 edhill 1.4 ac_prev=ROOTDIR ;;
1360 edhill 1.2 -rootdir=* | --rootdir=* | -rd=* | --rd=*)
1361     ROOTDIR=$ac_optarg ;;
1362 jmc 1.236
1363 edhill 1.2 -mods | --mods | -mo | --mo)
1364 edhill 1.4 ac_prev=MODS ;;
1365 edhill 1.2 -mods=* | --mods=* | -mo=* | --mo=*)
1366     MODS=$ac_optarg ;;
1367 jmc 1.236
1368 edhill 1.2 -disable | --disable)
1369 edhill 1.4 ac_prev=DISABLE ;;
1370 edhill 1.2 -disable=* | --disable=*)
1371     DISABLE=$ac_optarg ;;
1372 jmc 1.236
1373 edhill 1.2 -enable | --enable)
1374 edhill 1.4 ac_prev=ENABLE ;;
1375 edhill 1.2 -enable=* | --enable=*)
1376     ENABLE=$ac_optarg ;;
1377 jmc 1.236
1378 edhill 1.12 -standarddirs | --standarddirs)
1379     ac_prev=STANDARDDIRS ;;
1380     -standarddirs=* | --standarddirs=*)
1381     STANDARDDIRS=$ac_optarg ;;
1382    
1383 edhill 1.2 # -cpp | --cpp)
1384     # ac_prev=cpp ;;
1385     # -cpp=* | --cpp=*)
1386     # CPP=$ac_optarg ;;
1387 jmc 1.236
1388 edhill 1.91 -cc | --cc)
1389     ac_prev=CC ;;
1390     -cc=* | --cc=*)
1391     CC=$ac_optarg ;;
1392 jmc 1.236
1393 edhill 1.2 -fortran | --fortran | -fc | --fc)
1394 edhill 1.4 ac_prev=FC ;;
1395 edhill 1.2 -fc=* | --fc=*)
1396     FC=$ac_optarg ;;
1397 jmc 1.236
1398 edhill 1.76 -fs | --fs)
1399     ac_prev=FS ;;
1400     -fs=* | --fs=*)
1401     FS=$ac_optarg ;;
1402 jmc 1.236
1403 edhill 1.76 -fs90 | --fs90)
1404     ac_prev=FS90 ;;
1405     -fs90=* | --fs90=*)
1406     FS90=$ac_optarg ;;
1407 jmc 1.236
1408 jmc 1.220 -use_real4 | -use_r4 | -ur4 | --use_real4 | --use_r4 | --ur4 )
1409     USE_R4=true ;;
1410    
1411 edhill 1.2 -ieee | --ieee)
1412 edhill 1.12 IEEE=true ;;
1413 edhill 1.2 -noieee | --noieee)
1414 jmc 1.220 echo "Warning: ignore option '$ac_option' (default is already without '-ieee')" ;;
1415 jmc 1.237 -devel | --devel)
1416 jmc 1.220 IEEE=true ; DEVEL=true ;;
1417 jmc 1.237 -gsl | --gsl)
1418 jmc 1.220 GSL=true ;;
1419 jmc 1.203
1420 ce107 1.126 -ts | --ts)
1421     TS=true ;;
1422 ce107 1.139 -papis | --papis)
1423     PAPIS=true ;;
1424 ce107 1.147 -pcls | --pcls)
1425     PCLS=true ;;
1426 ce107 1.139 -foolad | --foolad)
1427     FOOLAD=true ;;
1428     -papi | --papi)
1429     PAPI=true ;;
1430 ce107 1.147 -pcl | --pcl)
1431     PCL=true ;;
1432 ce107 1.139 -hpmt | --hpmt)
1433     HPMT=true ;;
1434    
1435 adcroft 1.67 -mpi | --mpi)
1436     MPI=true ;;
1437     -mpi=* | --mpi=*)
1438     MPIPATH=$ac_optarg
1439     MPI=true ;;
1440 jmc 1.236
1441     -omp | --omp)
1442     OMP=true ;;
1443 jmc 1.187 -omp=* | --omp=*)
1444     OMPFLAG=$ac_optarg
1445     OMP=true ;;
1446 jmc 1.236
1447 edhill 1.5 -ds | --ds)
1448     DUMPSTATE=t ;;
1449 jmc 1.236
1450 jmc 1.222 -extra_flag | --extra_flag)
1451     ac_prev=FEXTRAFLAGS ;;
1452     -extra_flag=* | --extra_flag=*)
1453     FEXTRAFLAGS=$ac_optarg ;;
1454 jmc 1.236
1455 edhill 1.17 -taf_extra | --taf_extra)
1456     ac_prev=TAF_EXTRA ;;
1457     -taf_extra=* | --taf_extra=*)
1458     TAF_EXTRA=$ac_optarg ;;
1459    
1460     -tamc_extra | --tamc_extra)
1461     ac_prev=TAMC_EXTRA ;;
1462     -tamc_extra=* | --tamc_extra=*)
1463     TAMC_EXTRA=$ac_optarg ;;
1464 jmc 1.236
1465 edhill 1.124 -ignoretime | -ignore_time | --ignoretime | --ignore_time)
1466     IGNORE_TIME="-DIGNORE_TIME" ;;
1467 edhill 1.17
1468 edhill 1.141 -es | --es | -embed-source | --embed-source)
1469     EMBED_SRC=t ;;
1470    
1471 edhill 1.2 -*)
1472     echo "Error: unrecognized option: "$ac_option
1473     usage
1474     ;;
1475 jmc 1.236
1476 edhill 1.2 *)
1477     echo "Error: unrecognized argument: "$ac_option
1478     usage
1479     ;;
1480 jmc 1.236
1481 edhill 1.2 esac
1482 jmc 1.206
1483 edhill 1.1 done
1484    
1485 jmc 1.237 printf " getting local config information: "
1486     if test -f $gm_local ; then
1487     echo "using $gm_local"
1488     . $gm_local
1489     else
1490     echo "none found"
1491     fi
1492    
1493 edhill 1.12 if test -f ./.genmakerc ; then
1494     echo
1495     echo "WARNING: genmake2 has detected a copy of the old-style \"./.genmakerc\""
1496 jmc 1.161 echo " file. This file format is no longer supported. For directions on"
1497     echo " how to setup and use the new \"genmake2\" script, please see:"
1498 jmc 1.220 echo " http://mitgcm.org/public/devel_HOWTO/"
1499 jmc 1.161 echo " and send an email to MITgcm-support@mitgcm.org if you need help."
1500     echo "WARNING: ignore \"./.genmakerc\" and continue."
1501 jmc 1.206 echo
1502 edhill 1.12 fi
1503    
1504 edhill 1.97 # Find the MITgcm ${ROOTDIR}
1505 edhill 1.11 if test "x${ROOTDIR}" = x ; then
1506 edhill 1.112 tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1507 edhill 1.154 if test "x$tmp" = "xbin" -a -d ../model -a -d ../eesupp -a -d ../pkg ; then
1508 edhill 1.11 ROOTDIR=".."
1509     else
1510     for d in . .. ../.. ../../.. ../../../.. ../../../../.. ; do
1511     if [ -d "$d/model" -a -d "$d/eesupp" -a -d "$d/pkg" ]; then
1512     ROOTDIR=$d
1513 jmc 1.218 printf "Warning: ROOTDIR was not specified ;"
1514     echo " try using a local copy of MITgcm found at \"$ROOTDIR\""
1515 edhill 1.11 break
1516     fi
1517     done
1518     fi
1519     fi
1520     if test "x${ROOTDIR}" = x ; then
1521     echo "Error: Cannot determine ROOTDIR for MITgcm code."
1522     echo " Please specify a ROOTDIR using either an options "
1523     echo " file or a command-line option."
1524     exit 1
1525     fi
1526     if test ! -d ${ROOTDIR} ; then
1527     echo "Error: the specified ROOTDIR (\"$ROOTDIR\") does not exist!"
1528     exit 1
1529     fi
1530    
1531 edhill 1.97 # Find the MITgcm ${THISVER}
1532 jmc 1.179 version_file="${ROOTDIR}/doc/tag-index"
1533     if test -f $version_file ; then
1534 jmc 1.200 THISVER=`$AWK '/^checkpoint/{print $1; exit}' $version_file`
1535 jmc 1.179 #- remove ./BUILD_INFO.h file if older than version_file
1536     if test -f ./BUILD_INFO.h -a ./BUILD_INFO.h -ot $version_file ; then
1537     echo " remove ./BUILD_INFO.h (older than ${version_file})"
1538     rm -f ./BUILD_INFO.h
1539     fi
1540 edhill 1.97 fi
1541    
1542 edhill 1.119 if test "x$MAKEFILE" = x ; then
1543     MAKEFILE="Makefile"
1544     fi
1545    
1546 jmc 1.222 echo " getting OPTFILE information:"
1547 edhill 1.1 if test "x${OPTFILE}" = x ; then
1548 edhill 1.11 if test "x$MITGCM_OF" = x ; then
1549     echo "Warning: no OPTFILE specified so we'll look for possible settings"
1550     printf "\n=== Searching for possible settings for OPTFILE ===\n"
1551 jmc 1.212 find_possible_optfile
1552 edhill 1.1 else
1553 edhill 1.11 OPTFILE=$MITGCM_OF
1554     fi
1555     fi
1556     if test "x$OPTFILE" != xNONE ; then
1557     if test -f "$OPTFILE" -a -r "$OPTFILE" ; then
1558     echo " using OPTFILE=\"$OPTFILE\""
1559 edhill 1.34 . "$OPTFILE"
1560 edhill 1.11 RETVAL=$?
1561     if test "x$RETVAL" != x0 ; then
1562 edhill 1.71 printf "Error: failed to source OPTFILE \"$OPTFILE\""
1563 edhill 1.11 echo "--please check that variable syntax is bash-compatible"
1564 edhill 1.1 exit 1
1565     fi
1566 jmc 1.211 if test "x$DUMPSTATE" = xt ; then
1567 edhill 1.12 cp -f $OPTFILE "genmake_optfile"
1568 edhill 1.11 fi
1569     else
1570     echo "Error: can't read OPTFILE=\"$OPTFILE\""
1571     exit 1
1572 edhill 1.1 fi
1573     fi
1574 edhill 1.8
1575 jmc 1.222 echo " getting AD_OPTFILE information:"
1576 edhill 1.14 if test "x${AD_OPTFILE}" = x ; then
1577     if test "x$MITGCM_AD_OF" = x ; then
1578     AD_OPTFILE=$ROOTDIR/tools/adjoint_options/adjoint_default
1579     else
1580     AD_OPTFILE=$MITGCM_AD_OF
1581     fi
1582     fi
1583     if test "x${AD_OPTFILE}" != xNONE ; then
1584     if test -f "$AD_OPTFILE" -a -r "$AD_OPTFILE" ; then
1585     echo " using AD_OPTFILE=\"$AD_OPTFILE\""
1586 edhill 1.34 . "$AD_OPTFILE"
1587 edhill 1.14 RETVAL=$?
1588     if test "x$RETVAL" != x0 ; then
1589 edhill 1.71 printf "Error: failed to source AD_OPTFILE \"$AD_OPTFILE\""
1590 edhill 1.14 echo "--please check that variable syntax is bash-compatible"
1591     exit 1
1592     fi
1593 jmc 1.211 if test "x$DUMPSTATE" = xt ; then
1594 edhill 1.14 cp -f $AD_OPTFILE "genmake_ad_optfile"
1595     fi
1596     else
1597     echo "Error: can't read AD_OPTFILE=\"$AD_OPTFILE\""
1598     exit 1
1599     fi
1600     fi
1601    
1602 edhill 1.119 #====================================================================
1603     # Set default values if not set by the optfile
1604     #
1605 edhill 1.91 # Check that FC, CC, LINK, CPP, S64, LN, and MAKE are defined. If not,
1606 edhill 1.39 # either set defaults or complain and abort!
1607 edhill 1.71 if test ! "x$BASH" = x ; then
1608     # add a trailing space so that it works within the Makefile syntax (see below)
1609     BASH="$BASH "
1610     fi
1611 edhill 1.8 if test "x$FC" = x ; then
1612     cat <<EOF 1>&2
1613    
1614     Error: no Fortran compiler: please specify using one of the following:
1615     1) within the options file ("FC=...") as specified by "-of=OPTFILE"
1616     2) the "-fc=XXX" command-line option
1617 edhill 1.12 3) the "./genmake_local" file
1618 edhill 1.8 EOF
1619     exit 1
1620     fi
1621 jmc 1.216 if test "x$GET_FC_VERSION" != x ; then
1622     echo "Get compiler version using: $FC $GET_FC_VERSION" >> $LOGFILE
1623 jmc 1.225 ff=`echo $FC | sed 's/ .*//'` ; xx=`echo $ff | sed 's/^./& /' | sed 's/ .*//'`
1624     if test $xx != '/' ; then which $ff >> $LOGFILE ; fi
1625 jmc 1.224 $FC $GET_FC_VERSION > genmake_fc_vers1 2> genmake_fc_vers2
1626     if test -s genmake_fc_vers1 ; then
1627     cat genmake_fc_vers1 >> $LOGFILE
1628     else
1629     cat genmake_fc_vers2 >> $LOGFILE
1630     fi
1631 jmc 1.217 echo "<-- compiler version ----" >> $LOGFILE
1632 jmc 1.224 rm -f genmake_fc_vers1 genmake_fc_vers2
1633 jmc 1.216 fi
1634 jmc 1.212
1635 edhill 1.91 if test "x$CC" = x ; then
1636 jmc 1.212 look_for_C_compilers
1637 edhill 1.91 fi
1638 jmc 1.212
1639 edhill 1.8 if test "x$LINK" = x ; then
1640     LINK=$FC
1641     fi
1642 edhill 1.39 if test "x$MAKE" = x ; then
1643     MAKE="make"
1644     fi
1645 edhill 1.63 if test "x$CPP" = x ; then
1646 jmc 1.212 CPP="cpp -traditional -P"
1647 edhill 1.63 fi
1648     #EH3 === UGLY ===
1649 edhill 1.76 # The following is an ugly little hack to check for $CPP in /lib/ and
1650     # it should eventually be replaced with a more general function that
1651 edhill 1.63 # searches a combo of the user's path and a list of "usual suspects"
1652     # to find the correct location for binaries such as $CPP.
1653     for i in " " "/lib/" ; do
1654     echo "#define A a" | $i$CPP > test_cpp 2>&1 && CPP=$i$CPP
1655     done
1656     #EH3 === UGLY ===
1657 edhill 1.13 echo "#define A a" | $CPP > test_cpp 2>&1
1658 edhill 1.11 RETVAL=$?
1659     if test "x$RETVAL" != x0 ; then
1660 edhill 1.8 cat <<EOF 1>&2
1661    
1662 edhill 1.11 Error: C pre-processor "$CPP" failed the test case: please specify using:
1663    
1664 edhill 1.8 1) within the options file ("CPP=...") as specified by "-of=OPTFILE"
1665 edhill 1.12 2) the "./genmake_local" file
1666 edhill 1.30 3) with the CPP environment variable
1667 edhill 1.11
1668 edhill 1.8 EOF
1669     exit 1
1670 edhill 1.11 else
1671     rm -f test_cpp
1672 edhill 1.8 fi
1673 jmc 1.212
1674 edhill 1.84 look_for_makedepend
1675 jmc 1.212
1676     # Check that soft-link command is set and usable
1677 edhill 1.35 if test "x$LN" = x ; then
1678     LN="ln -s"
1679     fi
1680     echo "test" > genmake_test_ln
1681     $LN genmake_test_ln genmake_tlink
1682     RETVAL=$?
1683     if test "x$RETVAL" != x0 ; then
1684     cat <<EOF 1>&2
1685 edhill 1.29
1686 jmc 1.212 Error: The command "$LN" failed -- please specify a working soft-link
1687 edhill 1.35 command in the optfile.
1688    
1689     EOF
1690     exit 1
1691     fi
1692 edhill 1.131 test -L genmake_tlink > /dev/null 2>&1
1693     RETVAL=$?
1694     if test "x$RETVAL" = x0 ; then
1695     HAVE_TEST_L=t
1696     fi
1697 edhill 1.35 rm -f genmake_test_ln genmake_tlink
1698 edhill 1.77
1699     # Check for broken *.F/*.f handling and fix if possible
1700     check_for_broken_Ff
1701 edhill 1.29
1702 adcroft 1.67 if test ! "x$MPI" = x ; then
1703     echo " Turning on MPI cpp macros"
1704 jmc 1.239 DEFINES="$DEFINES -DALLOW_USE_MPI"
1705 jmc 1.248 #- To compile code older than checkpoint63s (2012/09/05), un-comment the following line:
1706     # DEFINES="$DEFINES -DALWAYS_USE_MPI"
1707 adcroft 1.67 fi
1708 jmc 1.187 if test ! "x$OMP" = x ; then
1709     echo " Add OMPFLAG and turn on OpenMP cpp macros"
1710     FFLAGS="$FFLAGS $OMPFLAG"
1711     F90FLAGS="$F90FLAGS $OMPFLAG"
1712     DEFINES="$DEFINES -DUSE_OMP_THREADING"
1713     fi
1714 edhill 1.39
1715 jmc 1.203 if test ! "x$USE_R4" = x ; then
1716     echo " Turning on LET_RS_BE_REAL4 cpp flag"
1717     DEFINES="$DEFINES -DLET_RS_BE_REAL4"
1718     fi
1719    
1720 ce107 1.126 if test ! "x$TS" = x ; then
1721     echo " Turning on timing per timestep"
1722 ce107 1.139 if test ! "x$FOOLAD" = x ; then
1723 jmc 1.236 DEFINES="$DEFINES -DTIME_PER_TIMESTEP_SFP"
1724 ce107 1.139 else
1725     DEFINES="$DEFINES -DTIME_PER_TIMESTEP"
1726     fi
1727 ce107 1.164 PACKAGES="$PACKAGES showflops"
1728 ce107 1.139 fi
1729     if test ! "x$PAPIS" = x ; then
1730     echo " Turning on PAPI flop summary per timestep"
1731     echo " Please make sure PAPIINC, PAPILIB are defined"
1732     if test ! "x$FOOLAD" = x ; then
1733     DEFINES="$DEFINES -DUSE_PAPI_FLOPS_SFP"
1734     else
1735     DEFINES="$DEFINES -DUSE_PAPI_FLOPS"
1736     fi
1737     INCLUDES="$INCLUDES $PAPIINC"
1738     LIBS="$LIBS $PAPILIB"
1739 ce107 1.164 PACKAGES="$PACKAGES showflops"
1740 ce107 1.139 fi
1741 ce107 1.147 if test ! "x$PCLS" = x ; then
1742     echo " Turning on PCL counter summary per timestep"
1743     echo " Please make sure PCLINC, PCLLIB are defined"
1744     if test ! "x$FOOLAD" = x ; then
1745     DEFINES="$DEFINES -DUSE_PCL_FLOPS_SFP"
1746     else
1747     DEFINES="$DEFINES -DUSE_PCL_FLOPS"
1748     fi
1749     INCLUDES="$INCLUDES $PCLINC"
1750     LIBS="$LIBS $PCLLIB"
1751 ce107 1.164 PACKAGES="$PACKAGES showflops"
1752 ce107 1.147 fi
1753 ce107 1.139 if test ! "x$PAPI" = x ; then
1754     if test ! "x$PAPIS" = x ; then
1755     echo " PAPI performance analysis and flop summary per timestep cannot co-exist!"
1756     echo " Sticking with PAPI flop summary per timestep!"
1757     else
1758     echo " Turning on performance analysis with PAPI"
1759 jmc 1.236 echo " Please make sure PAPIINC, PAPILIB are defined"
1760 ce107 1.139 DEFINES="$DEFINES -DUSE_PAPI"
1761     INCLUDES="$INCLUDES $PAPIINC"
1762     LIBS="$LIBS $PAPILIB"
1763     fi
1764     fi
1765 ce107 1.147 if test ! "x$PCL" = x ; then
1766     if test ! "x$PCLS" = x ; then
1767     echo " PCL performance analysis and flop summary per timestep cannot co-exist!"
1768     echo " Sticking with PCL flop summary per timestep!"
1769     else
1770     echo " Turning on performance analysis with PCL"
1771 jmc 1.236 echo " Please make sure PCLINC, PCLLIB are defined"
1772 ce107 1.147 DEFINES="$DEFINES -DUSE_PCL"
1773     INCLUDES="$INCLUDES $PCLINC"
1774     LIBS="$LIBS $PCLLIB"
1775     fi
1776     fi
1777 ce107 1.139 if test ! "x$HPMT" = x ; then
1778     if test ! "x$PAPI" = x ; then
1779     echo " PAPI and the HPM Toolkit cannot co-exist!"
1780     echo " Sticking with PAPI!"
1781 jmc 1.237 else
1782     if test ! "x$PCL" = x ; then
1783 ce107 1.147 echo " PCL and the HPM Toolkit cannot co-exist!"
1784     echo " Sticking with PCL!"
1785 jmc 1.237 else
1786 ce107 1.139 echo " Turning on performance analysis with the HPM Toolkit"
1787 jmc 1.236 echo " Please make sure HPMTINC, HPMTLIB are defined"
1788 ce107 1.139 DEFINES="$DEFINES -DUSE_LIBHPM"
1789 jmc 1.236 INCLUDES="$INCLUDES $HPMTINC"
1790 ce107 1.139 LIBS="$LIBS $HPMTLIB"
1791 jmc 1.237 fi
1792 ce107 1.148 fi
1793 ce107 1.139 fi
1794     if test ! "x$GSL" = x ; then
1795     echo " Turning on use of GSL to control floating point calculations"
1796     echo " Please make sure GSLINC, GSLLIB are defined"
1797     DEFINES="$DEFINES -DUSE_GSL_IEEE"
1798     INCLUDES="$INCLUDES $GSLINC"
1799     LIBS="$LIBS $GSLLIB"
1800 ce107 1.126 fi
1801 jmc 1.181 #- if USE_EXTENDED_SRC is set, add EXTENDED_SRC_FLAG to FFLAGS :
1802     if test ! "x$USE_EXTENDED_SRC" = x ; then
1803     FFLAGS="$FFLAGS $EXTENDED_SRC_FLAG"
1804     F90FIXEDFORMAT="$F90FIXEDFORMAT $EXTENDED_SRC_FLAG"
1805     fi
1806 ce107 1.126
1807 edhill 1.29 printf "\n=== Checking system libraries ===\n"
1808 edhill 1.71 printf " Do we have the system() command using $FC... "
1809 edhill 1.118 cat > genmake_tcomp.$FS <<EOF
1810 edhill 1.29 program hello
1811     call system('echo hi')
1812     end
1813     EOF
1814 edhill 1.134 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1815 edhill 1.29 RETVAL=$?
1816     if test "x$RETVAL" = x0 ; then
1817     HAVE_SYSTEM=t
1818     DEFINES="$DEFINES -DHAVE_SYSTEM"
1819     echo "yes"
1820     else
1821     HAVE_SYSTEM=
1822     echo "no"
1823     fi
1824     rm -f genmake_tcomp*
1825    
1826 edhill 1.71 printf " Do we have the fdate() command using $FC... "
1827 edhill 1.118 cat > genmake_tcomp.$FS <<EOF
1828 edhill 1.29 program hello
1829 edhill 1.129 CHARACTER*(128) string
1830 edhill 1.29 string = ' '
1831     call fdate( string )
1832     print *, string
1833     end
1834     EOF
1835 edhill 1.134 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1836 edhill 1.29 RETVAL=$?
1837     if test "x$RETVAL" = x0 ; then
1838     HAVE_FDATE=t
1839     DEFINES="$DEFINES -DHAVE_FDATE"
1840     echo "yes"
1841     else
1842     HAVE_FDATE=
1843     echo "no"
1844     fi
1845     rm -f genmake_tcomp*
1846    
1847 cnh 1.81 printf " Do we have the etime() command using $FC... "
1848 edhill 1.118 cat > genmake_tcomp.$FS <<EOF
1849 cnh 1.81 program hello
1850 cnh 1.82 REAL*4 ACTUAL, TARRAY(2)
1851     EXTERNAL ETIME
1852     REAL*4 ETIME
1853     actual = etime( tarray )
1854 cnh 1.81 print *, tarray
1855     end
1856     EOF
1857 edhill 1.134 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1858 cnh 1.81 RETVAL=$?
1859     if test "x$RETVAL" = x0 ; then
1860     HAVE_ETIME=t
1861     DEFINES="$DEFINES -DHAVE_ETIME"
1862     echo "yes"
1863     else
1864     HAVE_ETIME=
1865     echo "no"
1866     fi
1867     rm -f genmake_tcomp*
1868    
1869 edhill 1.71 printf " Can we call simple C routines (here, \"cloc()\") using $FC... "
1870 edhill 1.39 check_HAVE_CLOC
1871     if test "x$HAVE_CLOC" != x ; then
1872 jmc 1.230 DEFINES="$DEFINES -DHAVE_CLOC"
1873 edhill 1.39 echo "yes"
1874     else
1875     echo "no"
1876 edhill 1.141 if test "x$EMBED_SRC" = xt ; then
1877     echo " WARNING: you requested file embedding but it has"
1878     echo " been disabled since C code cannot be called"
1879     EMBED_SRC=
1880     fi
1881 edhill 1.29 fi
1882 edhill 1.39 rm -f genmake_t*
1883 edhill 1.29
1884 edhill 1.130 printf " Can we unlimit the stack size using $FC... "
1885     check_HAVE_SETRLSTK
1886 edhill 1.151 if test "x$HAVE_SETRLSTK" = xt ; then
1887 jmc 1.230 DEFINES="$DEFINES -DHAVE_SETRLSTK"
1888 edhill 1.130 echo "yes"
1889     else
1890     echo "no"
1891     fi
1892     rm -f genmake_t*
1893    
1894 edhill 1.137 printf " Can we register a signal handler using $FC... "
1895     check_HAVE_SIGREG
1896 edhill 1.150 if test "x$HAVE_SIGREG" = xt ; then
1897 jmc 1.230 DEFINES="$DEFINES -DHAVE_SIGREG"
1898 edhill 1.137 echo "yes"
1899     else
1900     echo "no"
1901     fi
1902     rm -f genmake_t*
1903    
1904 edhill 1.108 printf " Can we use stat() through C calls... "
1905     check_HAVE_STAT
1906     if test "x$HAVE_STAT" != x ; then
1907 jmc 1.230 DEFINES="$DEFINES -DHAVE_STAT"
1908 edhill 1.108 echo "yes"
1909     else
1910     echo "no"
1911     fi
1912     rm -f genmake_t*
1913    
1914 edhill 1.71 printf " Can we create NetCDF-enabled binaries... "
1915 edhill 1.60 check_netcdf_libs
1916     if test "x$HAVE_NETCDF" != x ; then
1917 jmc 1.230 DEFINES="$DEFINES -DHAVE_NETCDF"
1918 edhill 1.60 echo "yes"
1919     else
1920     echo "no"
1921     fi
1922 jahn 1.232
1923     printf " Can we create LAPACK-enabled binaries... "
1924     check_lapack_libs
1925     if test "x$HAVE_LAPACK" != x ; then
1926     DEFINES="$DEFINES -DHAVE_LAPACK"
1927     echo "yes"
1928     else
1929     echo "no"
1930     fi
1931 jmc 1.244
1932     printf " Can we call FLUSH intrinsic subroutine... "
1933     check_HAVE_FLUSH
1934     if test "x$HAVE_FLUSH" = xt ; then
1935     DEFINES="$DEFINES -DHAVE_FLUSH"
1936     echo "yes"
1937     else
1938     echo "no"
1939     fi
1940    
1941 edhill 1.124 DEFINES="$DEFINES $IGNORE_TIME"
1942 edhill 1.141 if test "x$EMBED_SRC" = xt ; then
1943     build_embed_encode
1944     fi
1945     if test "x$EMBED_SRC" = xt ; then
1946     ENABLE="$ENABLE embed_files"
1947 jmc 1.230 # DEFINES="$DEFINES -DHAVE_EMBED_SRC"
1948 edhill 1.141 fi
1949    
1950 edhill 1.2 printf "\n=== Setting defaults ===\n"
1951 jmc 1.185 printf " Adding MODS directories: "
1952 edhill 1.1 for d in $MODS ; do
1953     if test ! -d $d ; then
1954 edhill 1.2 echo
1955     echo "Error: MODS directory \"$d\" not found!"
1956 edhill 1.1 exit 1
1957     else
1958 jmc 1.185 printf "$d "
1959 edhill 1.1 SOURCEDIRS="$SOURCEDIRS $d"
1960     INCLUDEDIRS="$INCLUDEDIRS $d"
1961     fi
1962     done
1963     echo
1964    
1965 jmc 1.212 #if test "x${PLATFORM}" = x ; then
1966     # PLATFORM=$p_PLATFORM
1967     #fi
1968 edhill 1.1
1969     if test "x${EXEDIR}" = x ; then
1970 edhill 1.112 tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1971 edhill 1.87 if test "x$tmp" = "xbin" -a -d ../exe -a $ROOTDIR = .. ; then
1972 edhill 1.1 EXEDIR=../exe
1973     else
1974     EXEDIR=.
1975     fi
1976     fi
1977     if test ! -d ${EXEDIR} ; then
1978     echo "Error: the specified EXEDIR (\"$EXEDIR\") does not exist!"
1979     exit 1
1980     fi
1981    
1982     if test "x${TOOLSDIR}" = x ; then
1983     TOOLSDIR="$ROOTDIR/tools"
1984     fi
1985     if test ! -d ${TOOLSDIR} ; then
1986 cnh 1.65 echo "Error: the specified TOOLSDIR (\"$TOOLSDIR\") does not exist!"
1987 edhill 1.1 exit 1
1988     fi
1989 edhill 1.11 if test "x$S64" = x ; then
1990 edhill 1.104 echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.sh > /dev/null 2>&1
1991     RETVAL=$?
1992     if test "x${RETVAL}" = x0 ; then
1993     S64='$(TOOLSDIR)/set64bitConst.sh'
1994     else
1995     echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.csh > /dev/null 2>&1
1996     RETVAL=$?
1997     if test "x${RETVAL}" = x0 ; then
1998     S64='$(TOOLSDIR)/set64bitConst.csh'
1999     else
2000     cat <<EOF
2001    
2002     ERROR: neither of the two default scripts:
2003    
2004     ${TOOLSDIR}/set64bitConst.sh
2005     ${TOOLSDIR}/set64bitConst.csh
2006    
2007 jmc 1.206 are working so please check paths or specify (with \$S64) a
2008 edhill 1.104 working version of this script.
2009    
2010     EOF
2011     exit 1
2012     fi
2013     fi
2014 edhill 1.11 fi
2015 adcroft 1.44 THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`
2016 edhill 1.1
2017     EXECUTABLE=${EXECUTABLE:-mitgcmuv}
2018    
2019 jmc 1.205 # Set Standard Code Directories:
2020     if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
2021     STANDARDDIRS="eesupp model"
2022     fi
2023     # if model in Standard-Code-Dir, add eesupp (needed to compile model)
2024     echo " $STANDARDDIRS " | grep ' model ' > /dev/null 2>&1
2025     ckM=$?
2026     echo " $STANDARDDIRS " | grep ' eesupp ' > /dev/null 2>&1
2027     ckE=$?
2028 jmc 1.206 if test $ckM = 0 -a $ckE = 1 ; then
2029 jmc 1.205 STANDARDDIRS="$STANDARDDIRS eesupp"
2030     fi
2031    
2032 edhill 1.1 # We have a special set of source files in eesupp/src which are
2033     # generated from some template source files. We'll make them first so
2034     # they appear as regular source code
2035     if test -r $ROOTDIR"/eesupp/src/Makefile" ; then
2036     echo " Making source files in eesupp from templates"
2037 jmc 1.207 ( cd $ROOTDIR"/eesupp/src/" && $MAKE clean_old && $MAKE \
2038     ) > make_eesupp.errors 2>&1
2039 edhill 1.1 RETVAL=$?
2040 edhill 1.2 if test "x${RETVAL}" = x0 ; then
2041 edhill 1.1 rm -f make_eesupp.errors
2042     else
2043     echo "Error: problem encountered while building source files in eesupp:"
2044 edhill 1.62 cat make_eesupp.errors 1>&2
2045 edhill 1.1 exit 1
2046 afe 1.58 fi
2047     fi
2048    
2049 edhill 1.154 #same for pkg/exch2 and pkg/regrid
2050     for pdir in exch2 regrid ; do
2051     if test -r $ROOTDIR"/pkg/${pdir}/Makefile" ; then
2052     echo " Making source files in pkg/${pdir} from templates"
2053 jmc 1.207 ( cd $ROOTDIR"/pkg/"${pdir} && $MAKE clean_old && $MAKE \
2054     ) > make_${pdir}.errors 2>&1
2055 edhill 1.154 RETVAL=$?
2056     if test "x${RETVAL}" = x0 ; then
2057     rm -f make_${pdir}.errors
2058     else
2059     echo "Error: problem encountered while building source files in pkg/${pdir}:"
2060     cat make_${pdir}.errors 1>&2
2061     exit 1
2062     fi
2063 edhill 1.1 fi
2064 edhill 1.154 done
2065 edhill 1.1
2066 edhill 1.2 printf "\n=== Determining package settings ===\n"
2067 jmc 1.208 if test "x${PKG_DEPEND}" = x ; then
2068 edhill 1.1 tmp=$ROOTDIR"/pkg/pkg_depend"
2069 jmc 1.208 if test -r $tmp ; then PKG_DEPEND=$tmp ; fi
2070     fi
2071     if test "x${PKG_DEPEND}" = x ; then
2072 edhill 1.1 echo "Warning: No package dependency information was specified."
2073     echo " Please check that ROOTDIR/pkg/pkg_depend exists."
2074 jmc 1.208 else
2075     if test ! -r ${PKG_DEPEND} ; then
2076     echo "Error: can't read package dependency info from PKG_DEPEND=\"$PKG_DEPEND\""
2077     exit 1
2078 edhill 1.1 fi
2079 jmc 1.208 echo " getting package dependency info from $PKG_DEPEND"
2080     # Strip the comments and then convert the dependency file into arrays: PNAME, DNAME
2081     get_pdepend_list $PKG_DEPEND
2082     fi
2083    
2084     # A default package groups file "$ROOTDIR/pkg/pkg_groups" is provided
2085     # to define the "default_pkg_list" and package groups (for convenience, one
2086     # can specify a group of packages using names like "ocean" and "atmosphere").
2087     if test "x${PKG_GROUPS}" = x ; then
2088     tmp=$ROOTDIR"/pkg/pkg_groups"
2089     if test -r $tmp ; then PKG_GROUPS=$tmp ; fi
2090     fi
2091     if test "x${PKG_GROUPS}" = x ; then
2092     echo "Warning: No package groups information was specified."
2093     echo " Please check that ROOTDIR/pkg/pkg_groups exists."
2094 edhill 1.1 else
2095 jmc 1.208 if test ! -r ${PKG_GROUPS} ; then
2096     echo "Error: can't read package groups info from PKG_GROUPS=\"$PKG_GROUPS\""
2097 edhill 1.1 exit 1
2098     fi
2099 jmc 1.208 echo " getting package groups info from $PKG_GROUPS"
2100 edhill 1.1 fi
2101 jmc 1.208
2102     # Search for packages to compile.
2103     echo " checking list of packages to compile:"
2104     PKG_LIST=
2105     if test "x${PKG_LIST}" = x ; then
2106 edhill 1.12 for i in "." $MODS ; do
2107     if test -r $i"/packages.conf" ; then
2108 jmc 1.208 PKG_LIST=$i"/packages.conf"
2109 edhill 1.12 break
2110     fi
2111     done
2112     fi
2113 jmc 1.208 if test "x${PKG_LIST}" = x ; then
2114     pkg_list='default_pkg_list'
2115     if test "x${PKG_GROUPS}" = x ; then
2116     echo "Error: need package groups info to expand pkg_list=\"$pkg_list\""
2117     exit 1
2118     fi
2119 edhill 1.1 else
2120 jmc 1.208 if test ! -r $PKG_LIST ; then
2121     echo "Error: can't read package list from PKG_LIST=\"$PKG_LIST\""
2122     exit 1
2123 edhill 1.1 else
2124 jmc 1.208 echo " using PKG_LIST=\"$PKG_LIST\""
2125 jmc 1.237 # Strip the comments and add all the names
2126 jmc 1.208 pkg_list=`cat $PKG_LIST | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
2127 edhill 1.1 RETVAL=$?
2128     if test "x${RETVAL}" != x0 ; then
2129 jmc 1.208 printf "Error: can't parse package list "
2130     echo "-- please check PKG_LIST=\"$PKG_LIST\""
2131 edhill 1.1 exit 1
2132     fi
2133     fi
2134     fi
2135 jmc 1.208 for i in $pkg_list ; do
2136     PACKAGES="$PACKAGES $i"
2137     done
2138     echo " before group expansion packages are:$PACKAGES"
2139     if test "x${PKG_GROUPS}" != x ; then
2140     RET=1
2141     while test $RET = 1 ; do expand_pkg_groups; RET=$?; done
2142     echo " after group expansion packages are: $PACKAGES"
2143     fi
2144 edhill 1.1
2145     echo " applying DISABLE settings"
2146 jmc 1.205 echo "" > ./.tmp_pack
2147 adcroft 1.74 for i in $PACKAGES ; do
2148     echo $i >> ./.tmp_pack
2149     done
2150     for i in `grep "-" ./.tmp_pack` ; do
2151     j=`echo $i | sed 's/[-]//'`
2152     DISABLE="$DISABLE $j"
2153     done
2154 edhill 1.1 pack=
2155     for p in $PACKAGES ; do
2156     addit="t"
2157     for d in $DISABLE ; do
2158     if test "x$p" = "x$d" ; then
2159     addit="f"
2160     fi
2161     done
2162     if test "x$addit" = xt ; then
2163     pack="$pack $p"
2164     fi
2165     done
2166     PACKAGES="$pack"
2167     echo " applying ENABLE settings"
2168 edhill 1.12 echo "" > ./.tmp_pack
2169 edhill 1.1 PACKAGES="$PACKAGES $ENABLE"
2170 adcroft 1.74 # Test if each explicitly referenced package exists
2171 edhill 1.1 for i in $PACKAGES ; do
2172 adcroft 1.74 j=`echo $i | sed 's/[-+]//'`
2173     if test ! -d "$ROOTDIR/pkg/$j" ; then
2174 jmc 1.208 echo "Error: dir '$ROOTDIR/pkg/$i' missing for package '$i'"
2175 jmc 1.236 exit 1
2176 edhill 1.1 fi
2177     echo $i >> ./.tmp_pack
2178     done
2179     PACKAGES=
2180 adcroft 1.74 for i in `grep -v "-" ./.tmp_pack | sort | uniq` ; do
2181 edhill 1.1 PACKAGES="$PACKAGES $i"
2182     done
2183 adcroft 1.74 rm -f ./.tmp_pack
2184 jmc 1.205 echo " packages are: $PACKAGES"
2185 edhill 1.1
2186 jmc 1.206 # Check for package MNC: if NetCDF is available, then build the MNC
2187 jmc 1.161 # template files ; otherwise, delete mnc from the list of packages.
2188 jmc 1.205 echo " $PACKAGES " | grep ' mnc ' > /dev/null 2>&1
2189 jmc 1.206 mnc_in=$?
2190     if test "x$HAVE_NETCDF" != xt ; then
2191     if test "x$mnc_in" = x0 ; then
2192 edhill 1.100 cat <<EOF
2193     *********************************************************************
2194     WARNING: the "mnc" package was enabled but tests failed to compile
2195     NetCDF applications. Please check that:
2196    
2197     1) NetCDF is correctly installed for this compiler and
2198 jmc 1.206 2) the LIBS variable (within the "optfile") specifies the correct
2199 edhill 1.100 NetCDF library to link against.
2200    
2201     Due to this failure, the "mnc" package is now DISABLED.
2202     *********************************************************************
2203     EOF
2204     PACKAGES=`echo $PACKAGES | sed -e 's/mnc//g'`
2205     DISABLE="$DISABLE mnc"
2206     else
2207 jmc 1.206 # this prevent to add mnc (due to pdepend rules) if not available
2208     DISABLE="$DISABLE mnc"
2209     fi
2210     else
2211     # we have NetCDF, we try to build MNC template files
2212     ( cd $ROOTDIR"/pkg/mnc" && $MAKE testclean && $MAKE templates ) > make_mnc.errors 2>&1
2213     RETVAL=$?
2214     if test "x${RETVAL}" = x0 ; then
2215     rm -f make_mnc.errors
2216     else
2217     echo "Error: problem encountered while building source files in pkg/mnc:"
2218     cat make_mnc.errors 1>&2
2219     if test "x$mnc_in" = x0 ; then
2220 jmc 1.237 exit 1
2221 edhill 1.100 else
2222 jmc 1.206 DISABLE="$DISABLE mnc"
2223 edhill 1.100 fi
2224     fi
2225     fi
2226    
2227 jmc 1.161 # Check for package PROFILES: if NetCDF is not available,
2228     # then delete profiles from the list of available packages.
2229 jmc 1.206 if test "x$HAVE_NETCDF" != xt ; then
2230     echo " $PACKAGES " | grep ' profiles ' > /dev/null 2>&1
2231     RETVAL=$?
2232     if test "x$RETVAL" = x0 ; then
2233 jmc 1.161 cat <<EOF
2234     *********************************************************************
2235     WARNING: the "profiles" package was enabled but tests failed to
2236     compile NetCDF applications. Please check that:
2237    
2238     1) NetCDF is correctly installed for this compiler and
2239 jmc 1.206 2) the LIBS variable (within the "optfile") specifies the correct
2240 jmc 1.161 NetCDF library to link against.
2241    
2242     Due to this failure, the "profiles" package is now DISABLED.
2243     *********************************************************************
2244     EOF
2245     PACKAGES=`echo $PACKAGES | sed -e 's/profiles//g'`
2246     DISABLE="$DISABLE profiles"
2247 jmc 1.206 else
2248     # this prevent to add profiles (due to pdepend rules) if not available
2249     DISABLE="$DISABLE profiles"
2250 jmc 1.161 fi
2251     fi
2252    
2253 jahn 1.232 # Check for package RADTRANS: if LAPACK is not available,
2254     # then issue a warning that the direct radtrans solver is not available.
2255     if test "x$HAVE_LAPACK" != xt ; then
2256     echo " $PACKAGES " | grep ' radtrans ' > /dev/null 2>&1
2257     RETVAL=$?
2258     if test "x$RETVAL" = x0 ; then
2259     cat <<EOF
2260     *********************************************************************
2261     WARNING: the "radtrans" package was enabled but tests failed to
2262     compile LAPACK applications. This means that the direct radtrans
2263     solver is not available and compilation will fail if it is enabled.
2264     If you want to use the direct solver, please check that:
2265    
2266     1) LAPACK is correctly installed for this compiler and
2267     2) the LIBS variable (within the "optfile") specifies the correct
2268     LAPACK library to link against.
2269     *********************************************************************
2270     EOF
2271     fi
2272     fi
2273    
2274 jmc 1.208 if test "x${PKG_DEPEND}" != x ; then
2275     echo " applying package dependency rules"
2276     ck=
2277     while test "x$ck" != xtt ; do
2278 edhill 1.1 i=0
2279 edhill 1.2 # rtot=${#PNAME[@]}
2280     rtot=$nname
2281 jmc 1.162 while test $i -le $rtot ; do
2282 edhill 1.1
2283     # Is $pname in the current $PACKAGES list?
2284 edhill 1.2 # pname=${PNAME[$i]}
2285     tmp="pname=\"\$PNAME_$i\""
2286     eval $tmp
2287 edhill 1.1 pin="f"
2288     for p in $PACKAGES ; do
2289     if test "x$p" = "x$pname" ; then
2290     pin="t"
2291     fi
2292     done
2293 jmc 1.205 # or in the current $STANDARDDIRS list?
2294     for p in $STANDARDDIRS ; do
2295     if test "x$p" = "x$pname" ; then pin="t" ; fi
2296     done
2297 edhill 1.1
2298     # Is the DNAME entry a (+) or (-) rule ?
2299 edhill 1.2 tmp="dname=\"\$DNAME_$i\""
2300     eval $tmp
2301 edhill 1.1 plus="-"
2302 edhill 1.2 echo $dname | grep '^+' > /dev/null 2>&1
2303 edhill 1.1 RETVAL=$?
2304     if test "x$RETVAL" = x0 ; then
2305     plus="+"
2306     fi
2307    
2308     # Is $dname in the current $PACKAGES list?
2309 edhill 1.2 dname=`echo $dname | sed -e 's/^[+-]//'`
2310 edhill 1.1 din="f"
2311     for p in $PACKAGES ; do
2312     if test "x$p" = "x$dname" ; then
2313     din="t"
2314     fi
2315     done
2316    
2317     # Do we need to add $dname according to the dependency rules?
2318     if test "x$pin" = xt -a "x$plus" = "x+" -a "x$din" = xf ; then
2319 jmc 1.236 #echo " " $pname ": need to add :" $dname
2320 edhill 1.1 in_dis="f"
2321     for dis in $DISABLE ; do
2322     if test "x$dis" = "x$dname" ; then
2323     in_dis="t"
2324     fi
2325     done
2326     if test "x$in_dis" = xt ; then
2327     echo "Error: can't satisfy package dependencies:"
2328     echo " \"$dname\" is required by the dependency rules"
2329     echo " but is disallowed by the DISABLE settings"
2330     exit 1
2331     else
2332     PACKAGES="$PACKAGES $dname"
2333     ck=
2334     fi
2335     fi
2336    
2337     # Do we need to get rid of $dname according to the dependency rules?
2338     if test "x$pin" = xt -a "x$plus" = "x-" -a "x$din" = xt; then
2339     echo "Error: can't satisfy package dependencies:"
2340 jmc 1.206 echo " \"$pname\" was requested but is disallowed by"
2341 edhill 1.1 echo " the dependency rules for \"$dname\""
2342     exit 1
2343     fi
2344 jmc 1.236 i=`echo "$i + 1" | bc -l`
2345 edhill 1.87 #i=$(( $i + 1 ))
2346 edhill 1.1 done
2347     ck=$ck"t"
2348 jmc 1.208 done
2349     echo " packages are: $PACKAGES"
2350     fi
2351 edhill 1.1 for i in $PACKAGES ; do
2352     adr="$ROOTDIR/pkg/$i"
2353     if test -d $adr ; then
2354     SOURCEDIRS="$SOURCEDIRS $adr"
2355     INCLUDEDIRS="$INCLUDEDIRS $adr"
2356 edhill 1.14 if test "x$i" = xautodiff ; then
2357     AUTODIFF_PKG_USED=t
2358     fi
2359 edhill 1.1 else
2360     echo "Error: the directory \"$adr\" for package $i doesn't exist"
2361     exit 1
2362     fi
2363     done
2364    
2365 edhill 1.12 # Create a list of #define and #undef to enable/disable packages
2366     PACKAGES_DOT_H=PACKAGES_CONFIG.h
2367 jmc 1.206 # The following UGLY HACK sets multiple "#undef"s and it needs to go
2368     # away. On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h
2369 edhill 1.1 # file would eventually be split up so that all package-related #define
2370     # statements could be separated and handled only by genmake.
2371     names=`ls -1 "$ROOTDIR/pkg"`
2372     all_pack=
2373 adcroft 1.44 DISABLED_PACKAGES=
2374 edhill 1.1 for n in $names ; do
2375     if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
2376     has_pack="f"
2377     for pack in $PACKAGES ; do
2378     if test "x$pack" = "x$n" ; then
2379     has_pack="t"
2380     break
2381     fi
2382     done
2383     if test "x$has_pack" = xf ; then
2384 edhill 1.116 undef=`echo "ALLOW_$n" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2385 jmc 1.236 DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
2386 edhill 1.1 fi
2387     fi
2388     done
2389 adcroft 1.44 ENABLED_PACKAGES=
2390 edhill 1.1 for i in $PACKAGES ; do
2391 edhill 1.116 def=`echo "ALLOW_$i" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2392 adcroft 1.44 ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
2393 edhill 1.12 #eh3 DEFINES="$DEFINES -D$def"
2394 edhill 1.1
2395     #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
2396 jmc 1.206 case $i in
2397 edhill 1.1 aim_v23)
2398 jmc 1.236 ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
2399 jmc 1.55 echo "Warning: ALLOW_AIM is set to enable aim_v23."
2400 edhill 1.1 ;;
2401     esac
2402     #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
2403    
2404     done
2405    
2406 jmc 1.205 echo " Adding STANDARDDIRS='$STANDARDDIRS'"
2407 edhill 1.1 BUILDDIR=${BUILDDIR:-.}
2408 edhill 1.57 if test "x$STANDARDDIRS" != x ; then
2409     for d in $STANDARDDIRS ; do
2410     adr="$ROOTDIR/$d/src"
2411     if test ! -d $adr ; then
2412     echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2413     echo " is correct and that you correctly specified the STANDARDDIRS option"
2414     exit 1
2415     else
2416     SOURCEDIRS="$SOURCEDIRS $adr"
2417     fi
2418     adr="$ROOTDIR/$d/inc"
2419     if test ! -d $adr ; then
2420     echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2421     echo " is correct and that you correctly specified the STANDARDDIRS option"
2422     exit 1
2423     else
2424     INCLUDEDIRS="$INCLUDEDIRS $adr"
2425     fi
2426     done
2427     fi
2428 edhill 1.1
2429 adcroft 1.52 echo " Searching for *OPTIONS.h files in order to warn about the presence"
2430     echo " of \"#define \"-type statements that are no longer allowed:"
2431 edhill 1.12 CPP_OPTIONS=
2432 adcroft 1.52 CPP_EEOPTIONS=
2433 edhill 1.12 spaths=". $INCLUDEDIRS"
2434 adcroft 1.52 names=`ls -1 "$ROOTDIR/pkg"`
2435 edhill 1.12 for i in $spaths ; do
2436     try="$i/CPP_OPTIONS.h"
2437 edhill 1.54 if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
2438 edhill 1.12 echo " found CPP_OPTIONS=\"$try\""
2439     CPP_OPTIONS="$try"
2440 jmc 1.236 # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
2441     for n in $names ; do
2442     test_for_package_in_cpp_options $CPP_OPTIONS $n
2443     done
2444 adcroft 1.52 fi
2445     try="$i/CPP_EEOPTIONS.h"
2446 edhill 1.54 if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
2447 adcroft 1.52 echo " found CPP_EEOPTIONS=\"$try\""
2448 jmc 1.236 # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
2449 adcroft 1.52 #**** not yet enabled ****
2450     # test_for_mpi_in_cpp_eeoptions $try
2451     #**** not yet enabled ****
2452     CPP_EEOPTIONS="$try"
2453 edhill 1.12 fi
2454     done
2455     if test "x$CPP_OPTIONS" = x ; then
2456     echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
2457     exit 1
2458     fi
2459 edhill 1.1
2460 edhill 1.14 # Here, we build the list of files to be "run through" the adjoint
2461     # compiler.
2462 jmc 1.176 if test -f ./adSrcFiles.tmp ; then
2463     rm -f ./adSrcFiles.tmp
2464 edhill 1.14 fi
2465     echo " Creating the list of files for the adjoint compiler."
2466 jmc 1.207 touch adSrcFiles.tmp
2467 edhill 1.14 for i in $SOURCEDIRS ; do
2468     list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
2469     for j in $list_files ; do
2470 jmc 1.176 cat $i/$j >> adSrcFiles.tmp
2471 edhill 1.14 done
2472     done
2473 edhill 1.121 if test ! "x"$FS = "x.f" ; then
2474 jmc 1.176 cat adSrcFiles.tmp | sed -e "s/\.f/.$FS/g" > adSrcFiles.tmp_f
2475     mv -f adSrcFiles.tmp_f adSrcFiles.tmp
2476 edhill 1.121 fi
2477 edhill 1.14
2478 edhill 1.2 echo
2479     echo "=== Creating the Makefile ==="
2480 edhill 1.1 echo " setting INCLUDES"
2481     for i in $INCLUDEDIRS ; do
2482 edhill 1.87 if test ! -d $i ; then
2483 edhill 1.1 echo "Warning: can't find INCLUDEDIRS=\"$i\""
2484     fi
2485     done
2486    
2487 ce107 1.139 if test ! "x$DIVA" = x ; then
2488 ce107 1.140 echo " Creating the pseudo-MPI include directory"
2489 ce107 1.139 INCLUDES="-I./mpi_headers $INCLUDES"
2490     rm -rf ./mpi_headers
2491     mkdir -p ./mpi_headers
2492    
2493     if test "x$MPIINCLUDEDIR" = x ; then
2494     if test "x$MPIHOME" = x ; then
2495     MPIHOME='/usr'
2496     fi
2497     MPIINCLUDEDIR='$MPIHOME/include'
2498     fi
2499 jmc 1.206
2500 ce107 1.139 if test -r $MPIINCLUDEDIR/mpif.h ; then
2501     for i in $MPI_HEADER_FILES; do
2502     cp -p $MPIINCLUDEDIR/$i ./mpi_headers
2503     done
2504    
2505     perl -i -pe 's/MPI_DISPLACEMENT_CURRENT=-1_8/MPI_DISPLACEMENT_CURRENT=-1/g' mpi_headers/mpif.h
2506     else
2507     echo " We cannot create a copy of mpif.h!"
2508 heimbach 1.156 # exit -1
2509 ce107 1.139 fi
2510     fi
2511    
2512 edhill 1.1 echo " Determining the list of source and include files"
2513     rm -rf .links.tmp
2514     mkdir .links.tmp
2515 edhill 1.142 touch .links.tmp/foo
2516     if test ! -r ".links.tmp/foo" ; then
2517     echo
2518     echo "ERROR : something is wrong with your directory permissions or"
2519     echo " your user file-creation mask (\"umask\") since creating a"
2520     echo " sub-dir, touch-ing a file within it, and then reading it is"
2521     echo " not working. Please try setting your umask to something"
2522     echo " sane such as:"
2523     echo
2524     echo " umask 0002"
2525     echo
2526     echo " and please verify that you have the proper permissions for"
2527     echo " creating sub-directories and then reading files created"
2528     echo " within them."
2529     echo
2530     exit 1
2531     fi
2532     rm -f .links.tmp/foo
2533 jmc 1.176
2534 jmc 1.206 if test "x$OPENAD" != x ; then
2535 jmc 1.176 OAD_DONT_COMPILE="/dev/null"
2536     OAD_DONT_TRANSFORM="/dev/null"
2537     OAD_KEEP_ORIGINAL="/dev/null"
2538     OAD_CB2M_FILES="/dev/null"
2539 heimbach 1.242 OADTOOLS="$TOOLSDIR/OAD_support"
2540     test -f "oadtempflile" && \rm -f "oadtempflile"
2541     cat >> "oadtempflile" <<EOF
2542     $OADTOOLS
2543     EOF
2544 jmc 1.176 echo " looking for dontCompile file: "
2545     for i in "." $MODS ; do
2546     if test -r $i"/dontCompile" ; then
2547     OAD_DONT_COMPILE=$i"/dontCompile"
2548     echo " found $OAD_DONT_COMPILE"
2549     break
2550     fi
2551     done
2552     echo " looking for dontTransform file: "
2553     for i in "." $MODS ; do
2554     if test -r $i"/dontTransform" ; then
2555     OAD_DONT_TRANSFORM=$i"/dontTransform"
2556     echo " found $OAD_DONT_TRANSFORM"
2557     break
2558     fi
2559     done
2560     echo " looking for keepOriginal file: "
2561     for i in "." $MODS ; do
2562     if test -r $i"/keepOriginal" ; then
2563     OAD_KEEP_ORIGINAL=$i"/keepOriginal"
2564     echo " found $OAD_KEEP_ORIGINAL"
2565     break
2566     fi
2567     done
2568     echo " looking for cb2mFiles: "
2569     for i in "." $MODS ; do
2570     if test -r $i"/cb2mFiles" ; then
2571     OAD_CB2M_FILES=$i"/cb2mFiles"
2572     echo " found $OAD_CB2M_FILES"
2573     break
2574     fi
2575     done
2576     echo " OpenAD exceptions: "
2577     fi
2578    
2579 edhill 1.1 echo "# This section creates symbolic links" > srclinks.tmp
2580     echo "" >> srclinks.tmp
2581 jmc 1.176 printf 'F77_SRC_FILES = ' > F77srclist.tmp
2582     printf 'NON_AD_F77_SRC_FILES = ' > nonADF77srclist.tmp
2583     printf 'C_SRC_FILES = ' > csrclist.tmp
2584     printf 'F90_SRC_FILES = ' > F90srclist.tmp
2585     printf 'H_SRC_FILES = ' > hsrclist.tmp
2586     printf 'AD_FLOW_FILES = ' > ad_flow_files.tmp
2587 adcroft 1.9 alldirs="$SOURCEDIRS $INCLUDEDIRS ."
2588 edhill 1.1 for d in $alldirs ; do
2589     deplist=
2590 edhill 1.14 sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
2591 cnh 1.3 sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
2592 jmc 1.206 if test "x$OPENAD" != x ; then
2593 jmc 1.176 sfiles=`( echo $sfiles | grep -v _cb2m\. )`
2594     fi
2595 edhill 1.1 for sf in $sfiles ; do
2596     if test ! -r ".links.tmp/$sf" ; then
2597     if test -f "$d/$sf" ; then
2598 edhill 1.131 ignore_f=f
2599 jmc 1.236 case $d/$sf in
2600     ./$PACKAGES_DOT_H)
2601 edhill 1.141 ignore_f=t
2602 adcroft 1.44 ;;
2603 jmc 1.236 ./AD_CONFIG.h)
2604 edhill 1.141 ignore_f=t
2605 adcroft 1.44 ;;
2606 jmc 1.236 ./FC_NAMEMANGLE.h)
2607 edhill 1.141 ignore_f=t
2608 adcroft 1.44 ;;
2609 jmc 1.236 ./BUILD_INFO.h)
2610 edhill 1.141 ignore_f=t
2611     ;;
2612 jmc 1.236 ./EMBEDDED_FILES.h)
2613 edhill 1.141 ignore_f=t
2614 edhill 1.98 ;;
2615 jmc 1.236 *)
2616 edhill 1.131 # For the local directory *ONLY*,
2617     # ignore all soft-links
2618     if test "x$HAVE_TEST_L" = xt -a "x$d" = x. -a -L $sf ; then
2619     ignore_f=t
2620     else
2621     touch .links.tmp/$sf
2622     deplist="$deplist $sf"
2623     fi
2624 adcroft 1.44 ;;
2625 jmc 1.236 esac
2626 edhill 1.131 if test "x$ignore_f" = xf ; then
2627     extn=`echo $sf | $AWK -F. '{print $NF}'`
2628     case $extn in
2629 jmc 1.176 F)
2630     echo " \\" >> F77srclist.tmp
2631     printf " $sf" >> F77srclist.tmp
2632 jmc 1.206 if test "x$OPENAD" != x ; then
2633 jmc 1.176 basename=${sf%%.F}
2634     isAD=`egrep ^$basename.f'[ ]*' adSrcFiles.tmp`
2635 jmc 1.206 if test -z "$isAD" ; then
2636 jmc 1.176 toBeIgnored=`egrep ^$basename'[ ]*' ${OAD_DONT_COMPILE}`
2637 jmc 1.206 if test -z "$toBeIgnored" ; then
2638 jmc 1.176 echo " \\" >> nonADF77srclist.tmp
2639     printf " $sf" >> nonADF77srclist.tmp
2640 jmc 1.206 else
2641 jmc 1.176 echo " not to be compiled : $sf"
2642     fi
2643 jmc 1.206 else # file is initially listed as an AD file we want to exclude it
2644 jmc 1.176 # or we want to retain the untransformed version
2645     notToBeTransformed=`egrep ^$basename'[ ]*' ${OAD_DONT_TRANSFORM}`
2646     untransformedVersionToBeKept=`egrep ^$basename'[ ]*' ${OAD_KEEP_ORIGINAL}`
2647 jmc 1.206 if test -n "$notToBeTransformed"; then
2648 jmc 1.176 echo " not to be transformed: $sf"
2649     fi
2650     if test -n "$untransformedVersionToBeKept" ; then
2651     echo " original to be kept : $sf"
2652 jmc 1.206 fi
2653 jmc 1.176 if test -n "$notToBeTransformed" -o -n "$untransformedVersionToBeKept" ; then
2654     echo " \\" >> nonADF77srclist.tmp
2655     printf " $sf" >> nonADF77srclist.tmp
2656     fi
2657     fi
2658     fi
2659     ;;
2660     F90)
2661     echo " \\" >> F90srclist.tmp
2662     printf " $sf" >> F90srclist.tmp
2663     ;;
2664     c)
2665     echo " \\" >> csrclist.tmp
2666     printf " $sf" >> csrclist.tmp
2667     ;;
2668     h)
2669     echo " \\" >> hsrclist.tmp
2670     printf " $sf" >> hsrclist.tmp
2671     ;;
2672 jmc 1.236 flow)
2673 jmc 1.176 echo " \\" >> ad_flow_files.tmp
2674     printf " $sf" >> ad_flow_files.tmp
2675     ;;
2676     esac
2677     fi
2678 edhill 1.1 fi
2679     fi
2680     done
2681     if test "x$deplist" != x ; then
2682 jmc 1.176 if test "$d" != "." ; then
2683 jmc 1.236 echo "" >> srclinks.tmp
2684 edhill 1.2 echo "# These files are linked from $d" >> srclinks.tmp
2685 edhill 1.1 echo "$deplist :" >> srclinks.tmp
2686 jahn 1.170 # We need to make sure that the link isn't already there.
2687     # This may happen when make thinks that a header file has to be "remade"
2688     # because a module it depends on has changed. In this case we do nothing.
2689     printf "\tif [ ! -L \$@ ]; then \$(LN) %s/\$@ \$@; fi\n" $d >> srclinks.tmp
2690 jmc 1.176 fi
2691 edhill 1.1 fi
2692     done
2693     rm -rf .links.tmp
2694 jmc 1.176 echo "" >> F77srclist.tmp
2695     echo "" >> nonADF77srclist.tmp
2696     echo "" >> csrclist.tmp
2697     echo "" >> F90srclist.tmp
2698     echo "" >> hsrclist.tmp
2699     echo "" >> ad_flow_files.tmp
2700 edhill 1.1
2701 jmc 1.192 CMDLINE=$0
2702     for xx in "$@" ; do nw=`echo $xx | wc -w`
2703     if test $nw = '1' ; then CMDLINE="$CMDLINE $xx"
2704 jmc 1.237 else CMDLINE="$CMDLINE '$xx'" ; fi
2705 jmc 1.192 done
2706    
2707 edhill 1.88 if test -f $MAKEFILE ; then
2708 jmc 1.205 mv -f $MAKEFILE "$MAKEFILE.old"
2709 edhill 1.1 fi
2710     echo " Writing makefile: $MAKEFILE"
2711     echo "# Multithreaded + multi-processing makefile for:" > $MAKEFILE
2712     echo "# $MACHINE" >> $MAKEFILE
2713     echo "# This makefile was generated automatically on" >> $MAKEFILE
2714     echo "# $THISDATE" >> $MAKEFILE
2715     echo "# by the command:" >> $MAKEFILE
2716 jmc 1.192 echo "# $CMDLINE" >> $MAKEFILE
2717 edhill 1.1 echo "# executed by:" >> $MAKEFILE
2718 edhill 1.97 echo "# ${THISUSER}@${THISHOST}:${THISCWD}" >> $MAKEFILE
2719 edhill 1.21
2720     EXE_AD=$EXECUTABLE"_ad"
2721     EXE_FTL=$EXECUTABLE"_ftl"
2722     EXE_SVD=$EXECUTABLE"_svd"
2723    
2724 edhill 1.1 cat >>$MAKEFILE <<EOF
2725 edhill 1.53 #
2726     # OPTFILE="$OPTFILE"
2727 jmc 1.205 #
2728 edhill 1.1 # BUILDDIR : Directory where object files are written
2729     # SOURCEDIRS : Directories containing the source (.F) files
2730     # INCLUDEDIRS : Directories containing the header-source (.h) files
2731     # EXEDIR : Directory where executable that is generated is written
2732     # EXECUTABLE : Full path of executable binary
2733     #
2734     # CPP : C-preprocessor command
2735     # INCLUDES : Directories searched for header files
2736     # DEFINES : Macro definitions for CPP
2737     # MAKEDEPEND : Dependency generator
2738     # FC : Fortran compiler command
2739     # FFLAGS : Configuration/debugging options for FC
2740     # FOPTIM : Optimization options for FC
2741     # LINK : Command for link editor program
2742     # LIBS : Library flags /or/ additional optimization/debugging flags
2743    
2744     ROOTDIR = ${ROOTDIR}
2745 jmc 1.205 BUILDDIR = ${BUILDDIR}
2746 edhill 1.1 SOURCEDIRS = ${SOURCEDIRS}
2747     INCLUDEDIRS = ${INCLUDEDIRS}
2748     EXEDIR = ${EXEDIR}
2749     EXECUTABLE = \$(EXEDIR)/${EXECUTABLE}
2750     TOOLSDIR = ${TOOLSDIR}
2751 heimbach 1.242 OADTOOLS = ${OADTOOLS}
2752 edhill 1.1
2753 edhill 1.14 #eh3 new defines for the adjoint work
2754     AUTODIFF = ${ROOTDIR}/pkg/autodiff
2755 edhill 1.21 EXE_AD = ${EXE_AD}
2756     EXE_FTL = ${EXE_FTL}
2757     EXE_SVD = ${EXE_SVD}
2758 edhill 1.14
2759 adcroft 1.44 ENABLED_PACKAGES = ${ENABLED_PACKAGES}
2760     DISABLED_PACKAGES = ${DISABLED_PACKAGES}
2761    
2762 adcroft 1.52 # These files are created by Makefile
2763 edhill 1.97 SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h BUILD_INFO.h
2764 edhill 1.141 EOF
2765 adcroft 1.52
2766 edhill 1.141 if test "x$EMBED_SRC" = xt ; then
2767     echo "EMBEDDED_FILES = EMBEDDED_FILES.h" >>$MAKEFILE
2768     else
2769     echo "EMBEDDED_FILES = " >>$MAKEFILE
2770     fi
2771 edhill 1.1
2772 jahn 1.247 # extract default cpp search path so we can pass it to makedepend
2773     CPPINCLUDES=`cat /dev/null | $CPP -v 2>&1 | awk '/^End of search/{f=0}!/^\#/{if(f){printf " -I%s", $1;}}/^\#include "..." search start/{f=1}'`
2774    
2775 edhill 1.1 cat >>$MAKEFILE <<EOF
2776     # Unix ln (link)
2777     LN = ${LN}
2778     # Dependency generator
2779     MAKEDEPEND = ${MAKEDEPEND}
2780     # Special preprocessor (KAP on DECs, FPP on Crays)
2781     KPP = ${KPP}
2782     # Fortran compiler
2783 edhill 1.94 FC = ${FC}
2784 cnh 1.3 # Fortran compiler
2785     F90C = ${F90C}
2786 edhill 1.92 # C compiler
2787     CC = ${CC}
2788 edhill 1.1 # Link editor
2789 edhill 1.70 LINK = ${LINK} ${LDADD}
2790 edhill 1.1
2791     # Defines for CPP
2792     DEFINES = ${DEFINES}
2793     # Includes for CPP
2794     INCLUDES = ${INCLUDES}
2795 jahn 1.247 # default CPP includes for makedepend
2796     CPPINCLUDES = ${CPPINCLUDES}
2797 edhill 1.1 # Flags for KPP
2798     KFLAGS1 = ${KFLAGS1}
2799     KFLAGS2 = ${KFLAGS2}
2800     # Optim./debug for FC
2801 mlosch 1.165 FFLAGS = ${FFLAGS} ${FEXTRAFLAGS}
2802 edhill 1.1 FOPTIM = ${FOPTIM}
2803 cnh 1.3 # Optim./debug for FC
2804     F90FLAGS = ${F90FLAGS}
2805     F90OPTIM = ${F90OPTIM}
2806 jmc 1.176 F90FIXEDFORMAT = ${F90FIXEDFORMAT}
2807 edhill 1.1 # Flags for CC
2808     CFLAGS = ${CFLAGS}
2809     # Files that should not be optimized
2810     NOOPTFILES = ${NOOPTFILES}
2811     NOOPTFLAGS = ${NOOPTFLAGS}
2812     # Flags and libraries needed for linking
2813 edhill 1.107 LIBS = ${LIBS}
2814 jmc 1.228 # Name of the makefile
2815 jmc 1.238 MAKEFILE = ${MAKEFILE}
2816     # Name of the make program
2817     MAKE = ${MAKE}
2818 edhill 1.1
2819     EOF
2820    
2821 jmc 1.176 cat F77srclist.tmp >> $MAKEFILE
2822     cat nonADF77srclist.tmp >> $MAKEFILE
2823     cat csrclist.tmp >> $MAKEFILE
2824     cat F90srclist.tmp >> $MAKEFILE
2825     cat hsrclist.tmp >> $MAKEFILE
2826     cat ad_flow_files.tmp >> $MAKEFILE
2827    
2828     rm -f F77srclist.tmp nonADF77srclist.tmp csrclist.tmp F90srclist.tmp hsrclist.tmp ad_flow_files.tmp
2829    
2830 edhill 1.75 echo >> $MAKEFILE
2831 jmc 1.176
2832 jmc 1.205 # add definitions for preprocessed sources
2833     # and note that not all systems allow case sensitive extensions
2834     # hence the $FS and $FS90 here.
2835     # for fixed format f90 files we use ff90 or FF90 resp
2836 jmc 1.176 # but these are not expected to be the original source files
2837    
2838     echo 'F77_PP_SRC_FILES = $(F77_SRC_FILES:.F=.'$FS')' >> $MAKEFILE
2839     echo 'F90_PP_SRC_FILES = $(F90_SRC_FILES:.F90=.'$FS90')' >> $MAKEFILE
2840     echo 'OBJFILES= $(F77_SRC_FILES:.F=.o) $(C_SRC_FILES:.c=.o) $(F90_SRC_FILES:.F90=.o)' >> $MAKEFILE
2841 jmc 1.236 echo 'FLOWFILES = $(AD_FLOW_FILES:.flow=.flowdir)' >> $MAKEFILE
2842 edhill 1.75 echo >> $MAKEFILE
2843     echo '.SUFFIXES:' >> $MAKEFILE
2844 jmc 1.176 echo '.SUFFIXES: .o .'$FS' .p .F .c .f'$FS90' .'$FS90' .FF90 .F90 .flowdir .flow' >> $MAKEFILE
2845 edhill