/[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.234 - (hide annotations) (download)
Fri Aug 17 17:27:57 2012 UTC (6 years, 9 months ago) by jmc
Branch: MAIN
Changes since 1.233: +2 -2 lines
remove comments from ftl_input_code.f (using same script 'remove_comments_sed'
 as for AD target) before sending source code to TAF

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