/[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.282 - (hide annotations) (download)
Thu Mar 30 18:06:38 2017 UTC (2 years, 2 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint66g, checkpoint66f, checkpoint66o, checkpoint66n, checkpoint66m, checkpoint66l, checkpoint66k, checkpoint66j, checkpoint66i, checkpoint66h, HEAD
Changes since 1.281: +2 -2 lines
adjust help display content

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