/[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.245 - (hide annotations) (download)
Sat Nov 17 20:04:10 2012 UTC (7 years ago) by jmc
Branch: MAIN
Changes since 1.244: +4 -4 lines
comment out "mpif.h" include in NetCDF program test (genmake_tnc.F)

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