/[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.223 - (hide annotations) (download)
Wed Aug 10 19:39:35 2011 UTC (8 years, 1 month ago) by jmc
Branch: MAIN
Changes since 1.222: +2 -2 lines
modify the way to get the compiler version

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