/[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.224 - (hide annotations) (download)
Fri Aug 12 21:03:25 2011 UTC (12 years, 7 months ago) by jmc
Branch: MAIN
Changes since 1.223: +8 -2 lines
refine previous modif (getting compiler version)

1 edhill 1.86 #! /usr/bin/env bash
2 edhill 1.1 #
3 jmc 1.224 # $Header: /u/gcmpack/MITgcm/tools/genmake2,v 1.223 2011/08/10 19:39:35 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.224 $FC $GET_FC_VERSION > genmake_fc_vers1 2> genmake_fc_vers2
1526     if test -s genmake_fc_vers1 ; then
1527     cat genmake_fc_vers1 >> $LOGFILE
1528     else
1529     cat genmake_fc_vers2 >> $LOGFILE
1530     fi
1531 jmc 1.217 echo "<-- compiler version ----" >> $LOGFILE
1532 jmc 1.224 rm -f genmake_fc_vers1 genmake_fc_vers2
1533 jmc 1.216 fi
1534 jmc 1.212
1535 edhill 1.91 if test "x$CC" = x ; then
1536 jmc 1.212 look_for_C_compilers
1537 edhill 1.91 fi
1538 jmc 1.212
1539 edhill 1.8 if test "x$LINK" = x ; then
1540     LINK=$FC
1541     fi
1542 edhill 1.39 if test "x$MAKE" = x ; then
1543     MAKE="make"
1544     fi
1545 edhill 1.63 if test "x$CPP" = x ; then
1546 jmc 1.212 CPP="cpp -traditional -P"
1547 edhill 1.63 fi
1548     #EH3 === UGLY ===
1549 edhill 1.76 # The following is an ugly little hack to check for $CPP in /lib/ and
1550     # it should eventually be replaced with a more general function that
1551 edhill 1.63 # searches a combo of the user's path and a list of "usual suspects"
1552     # to find the correct location for binaries such as $CPP.
1553     for i in " " "/lib/" ; do
1554     echo "#define A a" | $i$CPP > test_cpp 2>&1 && CPP=$i$CPP
1555     done
1556     #EH3 === UGLY ===
1557 edhill 1.13 echo "#define A a" | $CPP > test_cpp 2>&1
1558 edhill 1.11 RETVAL=$?
1559     if test "x$RETVAL" != x0 ; then
1560 edhill 1.8 cat <<EOF 1>&2
1561    
1562 edhill 1.11 Error: C pre-processor "$CPP" failed the test case: please specify using:
1563    
1564 edhill 1.8 1) within the options file ("CPP=...") as specified by "-of=OPTFILE"
1565 edhill 1.12 2) the "./genmake_local" file
1566 edhill 1.30 3) with the CPP environment variable
1567 edhill 1.11
1568 edhill 1.8 EOF
1569     exit 1
1570 edhill 1.11 else
1571     rm -f test_cpp
1572 edhill 1.8 fi
1573 jmc 1.212
1574 edhill 1.84 look_for_makedepend
1575 jmc 1.212
1576     # Check that soft-link command is set and usable
1577 edhill 1.35 if test "x$LN" = x ; then
1578     LN="ln -s"
1579     fi
1580     echo "test" > genmake_test_ln
1581     $LN genmake_test_ln genmake_tlink
1582     RETVAL=$?
1583     if test "x$RETVAL" != x0 ; then
1584     cat <<EOF 1>&2
1585 edhill 1.29
1586 jmc 1.212 Error: The command "$LN" failed -- please specify a working soft-link
1587 edhill 1.35 command in the optfile.
1588    
1589     EOF
1590     exit 1
1591     fi
1592 edhill 1.131 test -L genmake_tlink > /dev/null 2>&1
1593     RETVAL=$?
1594     if test "x$RETVAL" = x0 ; then
1595     HAVE_TEST_L=t
1596     fi
1597 edhill 1.35 rm -f genmake_test_ln genmake_tlink
1598 edhill 1.77
1599     # Check for broken *.F/*.f handling and fix if possible
1600     check_for_broken_Ff
1601 edhill 1.29
1602 adcroft 1.67 if test ! "x$MPI" = x ; then
1603     echo " Turning on MPI cpp macros"
1604 adcroft 1.68 DEFINES="$DEFINES -DALLOW_USE_MPI -DALWAYS_USE_MPI"
1605 adcroft 1.67 fi
1606 jmc 1.187 if test ! "x$OMP" = x ; then
1607     echo " Add OMPFLAG and turn on OpenMP cpp macros"
1608     FFLAGS="$FFLAGS $OMPFLAG"
1609     F90FLAGS="$F90FLAGS $OMPFLAG"
1610     DEFINES="$DEFINES -DUSE_OMP_THREADING"
1611     fi
1612 edhill 1.39
1613 jmc 1.203 if test ! "x$USE_R4" = x ; then
1614     echo " Turning on LET_RS_BE_REAL4 cpp flag"
1615     DEFINES="$DEFINES -DLET_RS_BE_REAL4"
1616     fi
1617    
1618 ce107 1.126 if test ! "x$TS" = x ; then
1619     echo " Turning on timing per timestep"
1620 ce107 1.139 if test ! "x$FOOLAD" = x ; then
1621     DEFINES="$DEFINES -DTIME_PER_TIMESTEP_SFP"
1622     else
1623     DEFINES="$DEFINES -DTIME_PER_TIMESTEP"
1624     fi
1625 ce107 1.164 PACKAGES="$PACKAGES showflops"
1626 ce107 1.139 fi
1627     if test ! "x$PAPIS" = x ; then
1628     echo " Turning on PAPI flop summary per timestep"
1629     echo " Please make sure PAPIINC, PAPILIB are defined"
1630     if test ! "x$FOOLAD" = x ; then
1631     DEFINES="$DEFINES -DUSE_PAPI_FLOPS_SFP"
1632     else
1633     DEFINES="$DEFINES -DUSE_PAPI_FLOPS"
1634     fi
1635     INCLUDES="$INCLUDES $PAPIINC"
1636     LIBS="$LIBS $PAPILIB"
1637 ce107 1.164 PACKAGES="$PACKAGES showflops"
1638 ce107 1.139 fi
1639 ce107 1.147 if test ! "x$PCLS" = x ; then
1640     echo " Turning on PCL counter summary per timestep"
1641     echo " Please make sure PCLINC, PCLLIB are defined"
1642     if test ! "x$FOOLAD" = x ; then
1643     DEFINES="$DEFINES -DUSE_PCL_FLOPS_SFP"
1644     else
1645     DEFINES="$DEFINES -DUSE_PCL_FLOPS"
1646     fi
1647     INCLUDES="$INCLUDES $PCLINC"
1648     LIBS="$LIBS $PCLLIB"
1649 ce107 1.164 PACKAGES="$PACKAGES showflops"
1650 ce107 1.147 fi
1651 ce107 1.139 if test ! "x$PAPI" = x ; then
1652     if test ! "x$PAPIS" = x ; then
1653     echo " PAPI performance analysis and flop summary per timestep cannot co-exist!"
1654     echo " Sticking with PAPI flop summary per timestep!"
1655     else
1656     echo " Turning on performance analysis with PAPI"
1657     echo " Please make sure PAPIINC, PAPILIB are defined"
1658     DEFINES="$DEFINES -DUSE_PAPI"
1659     INCLUDES="$INCLUDES $PAPIINC"
1660     LIBS="$LIBS $PAPILIB"
1661     fi
1662     fi
1663 ce107 1.147 if test ! "x$PCL" = x ; then
1664     if test ! "x$PCLS" = x ; then
1665     echo " PCL performance analysis and flop summary per timestep cannot co-exist!"
1666     echo " Sticking with PCL flop summary per timestep!"
1667     else
1668     echo " Turning on performance analysis with PCL"
1669     echo " Please make sure PCLINC, PCLLIB are defined"
1670     DEFINES="$DEFINES -DUSE_PCL"
1671     INCLUDES="$INCLUDES $PCLINC"
1672     LIBS="$LIBS $PCLLIB"
1673     fi
1674     fi
1675 ce107 1.139 if test ! "x$HPMT" = x ; then
1676     if test ! "x$PAPI" = x ; then
1677     echo " PAPI and the HPM Toolkit cannot co-exist!"
1678     echo " Sticking with PAPI!"
1679 ce107 1.147 else if test ! "x$PCL" = x ; then
1680     echo " PCL and the HPM Toolkit cannot co-exist!"
1681     echo " Sticking with PCL!"
1682 ce107 1.139 else
1683     echo " Turning on performance analysis with the HPM Toolkit"
1684     echo " Please make sure HPMTINC, HPMTLIB are defined"
1685     DEFINES="$DEFINES -DUSE_LIBHPM"
1686     INCLUDES="$INCLUDES $HPMTINC"
1687     LIBS="$LIBS $HPMTLIB"
1688     fi
1689 ce107 1.148 fi
1690 ce107 1.139 fi
1691     if test ! "x$GSL" = x ; then
1692     echo " Turning on use of GSL to control floating point calculations"
1693     echo " Please make sure GSLINC, GSLLIB are defined"
1694     DEFINES="$DEFINES -DUSE_GSL_IEEE"
1695     INCLUDES="$INCLUDES $GSLINC"
1696     LIBS="$LIBS $GSLLIB"
1697 ce107 1.126 fi
1698 jmc 1.181 #- if USE_EXTENDED_SRC is set, add EXTENDED_SRC_FLAG to FFLAGS :
1699     if test ! "x$USE_EXTENDED_SRC" = x ; then
1700     FFLAGS="$FFLAGS $EXTENDED_SRC_FLAG"
1701     F90FIXEDFORMAT="$F90FIXEDFORMAT $EXTENDED_SRC_FLAG"
1702     fi
1703 ce107 1.126
1704 edhill 1.29 printf "\n=== Checking system libraries ===\n"
1705 edhill 1.71 printf " Do we have the system() command using $FC... "
1706 edhill 1.118 cat > genmake_tcomp.$FS <<EOF
1707 edhill 1.29 program hello
1708     call system('echo hi')
1709     end
1710     EOF
1711 edhill 1.134 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1712 edhill 1.29 RETVAL=$?
1713     if test "x$RETVAL" = x0 ; then
1714     HAVE_SYSTEM=t
1715     DEFINES="$DEFINES -DHAVE_SYSTEM"
1716     echo "yes"
1717     else
1718     HAVE_SYSTEM=
1719     echo "no"
1720     fi
1721     rm -f genmake_tcomp*
1722    
1723 edhill 1.71 printf " Do we have the fdate() command using $FC... "
1724 edhill 1.118 cat > genmake_tcomp.$FS <<EOF
1725 edhill 1.29 program hello
1726 edhill 1.129 CHARACTER*(128) string
1727 edhill 1.29 string = ' '
1728     call fdate( string )
1729     print *, string
1730     end
1731     EOF
1732 edhill 1.134 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1733 edhill 1.29 RETVAL=$?
1734     if test "x$RETVAL" = x0 ; then
1735     HAVE_FDATE=t
1736     DEFINES="$DEFINES -DHAVE_FDATE"
1737     echo "yes"
1738     else
1739     HAVE_FDATE=
1740     echo "no"
1741     fi
1742     rm -f genmake_tcomp*
1743    
1744 cnh 1.81 printf " Do we have the etime() command using $FC... "
1745 edhill 1.118 cat > genmake_tcomp.$FS <<EOF
1746 cnh 1.81 program hello
1747 cnh 1.82 REAL*4 ACTUAL, TARRAY(2)
1748     EXTERNAL ETIME
1749     REAL*4 ETIME
1750     actual = etime( tarray )
1751 cnh 1.81 print *, tarray
1752     end
1753     EOF
1754 edhill 1.134 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1755 cnh 1.81 RETVAL=$?
1756     if test "x$RETVAL" = x0 ; then
1757     HAVE_ETIME=t
1758     DEFINES="$DEFINES -DHAVE_ETIME"
1759     echo "yes"
1760     else
1761     HAVE_ETIME=
1762     echo "no"
1763     fi
1764     rm -f genmake_tcomp*
1765    
1766 edhill 1.71 printf " Can we call simple C routines (here, \"cloc()\") using $FC... "
1767 edhill 1.39 check_HAVE_CLOC
1768     if test "x$HAVE_CLOC" != x ; then
1769     echo "yes"
1770     else
1771     echo "no"
1772 edhill 1.141 if test "x$EMBED_SRC" = xt ; then
1773     echo " WARNING: you requested file embedding but it has"
1774     echo " been disabled since C code cannot be called"
1775     EMBED_SRC=
1776     fi
1777 edhill 1.29 fi
1778 edhill 1.39 rm -f genmake_t*
1779 edhill 1.29
1780 edhill 1.130 printf " Can we unlimit the stack size using $FC... "
1781     check_HAVE_SETRLSTK
1782 edhill 1.151 if test "x$HAVE_SETRLSTK" = xt ; then
1783 edhill 1.130 echo "yes"
1784     else
1785     echo "no"
1786     fi
1787     rm -f genmake_t*
1788    
1789 edhill 1.137 printf " Can we register a signal handler using $FC... "
1790     check_HAVE_SIGREG
1791 edhill 1.150 if test "x$HAVE_SIGREG" = xt ; then
1792 edhill 1.137 echo "yes"
1793     else
1794     echo "no"
1795     fi
1796     rm -f genmake_t*
1797    
1798 edhill 1.108 printf " Can we use stat() through C calls... "
1799     check_HAVE_STAT
1800     if test "x$HAVE_STAT" != x ; then
1801     echo "yes"
1802     else
1803     echo "no"
1804     fi
1805     rm -f genmake_t*
1806    
1807 edhill 1.71 printf " Can we create NetCDF-enabled binaries... "
1808 edhill 1.60 check_netcdf_libs
1809     if test "x$HAVE_NETCDF" != x ; then
1810     echo "yes"
1811     else
1812     echo "no"
1813     fi
1814 edhill 1.124 DEFINES="$DEFINES $IGNORE_TIME"
1815 edhill 1.8
1816 edhill 1.141 if test "x$EMBED_SRC" = xt ; then
1817     build_embed_encode
1818     fi
1819     if test "x$EMBED_SRC" = xt ; then
1820     ENABLE="$ENABLE embed_files"
1821     fi
1822    
1823 edhill 1.2 printf "\n=== Setting defaults ===\n"
1824 jmc 1.185 printf " Adding MODS directories: "
1825 edhill 1.1 for d in $MODS ; do
1826     if test ! -d $d ; then
1827 edhill 1.2 echo
1828     echo "Error: MODS directory \"$d\" not found!"
1829 edhill 1.1 exit 1
1830     else
1831 jmc 1.185 printf "$d "
1832 edhill 1.1 SOURCEDIRS="$SOURCEDIRS $d"
1833     INCLUDEDIRS="$INCLUDEDIRS $d"
1834     fi
1835     done
1836     echo
1837    
1838 jmc 1.212 #if test "x${PLATFORM}" = x ; then
1839     # PLATFORM=$p_PLATFORM
1840     #fi
1841 edhill 1.1
1842     if test "x${EXEDIR}" = x ; then
1843 edhill 1.112 tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1844 edhill 1.87 if test "x$tmp" = "xbin" -a -d ../exe -a $ROOTDIR = .. ; then
1845 edhill 1.1 EXEDIR=../exe
1846     else
1847     EXEDIR=.
1848     fi
1849     fi
1850     if test ! -d ${EXEDIR} ; then
1851     echo "Error: the specified EXEDIR (\"$EXEDIR\") does not exist!"
1852     exit 1
1853     fi
1854    
1855     if test "x${TOOLSDIR}" = x ; then
1856     TOOLSDIR="$ROOTDIR/tools"
1857     fi
1858     if test ! -d ${TOOLSDIR} ; then
1859 cnh 1.65 echo "Error: the specified TOOLSDIR (\"$TOOLSDIR\") does not exist!"
1860 edhill 1.1 exit 1
1861     fi
1862 edhill 1.11 if test "x$S64" = x ; then
1863 edhill 1.104 echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.sh > /dev/null 2>&1
1864     RETVAL=$?
1865     if test "x${RETVAL}" = x0 ; then
1866     S64='$(TOOLSDIR)/set64bitConst.sh'
1867     else
1868     echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.csh > /dev/null 2>&1
1869     RETVAL=$?
1870     if test "x${RETVAL}" = x0 ; then
1871     S64='$(TOOLSDIR)/set64bitConst.csh'
1872     else
1873     cat <<EOF
1874    
1875     ERROR: neither of the two default scripts:
1876    
1877     ${TOOLSDIR}/set64bitConst.sh
1878     ${TOOLSDIR}/set64bitConst.csh
1879    
1880 jmc 1.206 are working so please check paths or specify (with \$S64) a
1881 edhill 1.104 working version of this script.
1882    
1883     EOF
1884     exit 1
1885     fi
1886     fi
1887 edhill 1.11 fi
1888 adcroft 1.44 THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`
1889 edhill 1.1
1890     EXECUTABLE=${EXECUTABLE:-mitgcmuv}
1891    
1892 jmc 1.205 # Set Standard Code Directories:
1893     if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
1894     STANDARDDIRS="eesupp model"
1895     fi
1896     # if model in Standard-Code-Dir, add eesupp (needed to compile model)
1897     echo " $STANDARDDIRS " | grep ' model ' > /dev/null 2>&1
1898     ckM=$?
1899     echo " $STANDARDDIRS " | grep ' eesupp ' > /dev/null 2>&1
1900     ckE=$?
1901 jmc 1.206 if test $ckM = 0 -a $ckE = 1 ; then
1902 jmc 1.205 STANDARDDIRS="$STANDARDDIRS eesupp"
1903     fi
1904    
1905 edhill 1.1 # We have a special set of source files in eesupp/src which are
1906     # generated from some template source files. We'll make them first so
1907     # they appear as regular source code
1908     if test -r $ROOTDIR"/eesupp/src/Makefile" ; then
1909     echo " Making source files in eesupp from templates"
1910 jmc 1.207 ( cd $ROOTDIR"/eesupp/src/" && $MAKE clean_old && $MAKE \
1911     ) > make_eesupp.errors 2>&1
1912 edhill 1.1 RETVAL=$?
1913 edhill 1.2 if test "x${RETVAL}" = x0 ; then
1914 edhill 1.1 rm -f make_eesupp.errors
1915     else
1916     echo "Error: problem encountered while building source files in eesupp:"
1917 edhill 1.62 cat make_eesupp.errors 1>&2
1918 edhill 1.1 exit 1
1919 afe 1.58 fi
1920     fi
1921    
1922 edhill 1.154 #same for pkg/exch2 and pkg/regrid
1923     for pdir in exch2 regrid ; do
1924     if test -r $ROOTDIR"/pkg/${pdir}/Makefile" ; then
1925     echo " Making source files in pkg/${pdir} from templates"
1926 jmc 1.207 ( cd $ROOTDIR"/pkg/"${pdir} && $MAKE clean_old && $MAKE \
1927     ) > make_${pdir}.errors 2>&1
1928 edhill 1.154 RETVAL=$?
1929     if test "x${RETVAL}" = x0 ; then
1930     rm -f make_${pdir}.errors
1931     else
1932     echo "Error: problem encountered while building source files in pkg/${pdir}:"
1933     cat make_${pdir}.errors 1>&2
1934     exit 1
1935     fi
1936 edhill 1.1 fi
1937 edhill 1.154 done
1938 edhill 1.1
1939 edhill 1.2 printf "\n=== Determining package settings ===\n"
1940 jmc 1.208 if test "x${PKG_DEPEND}" = x ; then
1941 edhill 1.1 tmp=$ROOTDIR"/pkg/pkg_depend"
1942 jmc 1.208 if test -r $tmp ; then PKG_DEPEND=$tmp ; fi
1943     fi
1944     if test "x${PKG_DEPEND}" = x ; then
1945 edhill 1.1 echo "Warning: No package dependency information was specified."
1946     echo " Please check that ROOTDIR/pkg/pkg_depend exists."
1947 jmc 1.208 else
1948     if test ! -r ${PKG_DEPEND} ; then
1949     echo "Error: can't read package dependency info from PKG_DEPEND=\"$PKG_DEPEND\""
1950     exit 1
1951 edhill 1.1 fi
1952 jmc 1.208 echo " getting package dependency info from $PKG_DEPEND"
1953     # Strip the comments and then convert the dependency file into arrays: PNAME, DNAME
1954     get_pdepend_list $PKG_DEPEND
1955     fi
1956    
1957     # A default package groups file "$ROOTDIR/pkg/pkg_groups" is provided
1958     # to define the "default_pkg_list" and package groups (for convenience, one
1959     # can specify a group of packages using names like "ocean" and "atmosphere").
1960     if test "x${PKG_GROUPS}" = x ; then
1961     tmp=$ROOTDIR"/pkg/pkg_groups"
1962     if test -r $tmp ; then PKG_GROUPS=$tmp ; fi
1963     fi
1964     if test "x${PKG_GROUPS}" = x ; then
1965     echo "Warning: No package groups information was specified."
1966     echo " Please check that ROOTDIR/pkg/pkg_groups exists."
1967 edhill 1.1 else
1968 jmc 1.208 if test ! -r ${PKG_GROUPS} ; then
1969     echo "Error: can't read package groups info from PKG_GROUPS=\"$PKG_GROUPS\""
1970 edhill 1.1 exit 1
1971     fi
1972 jmc 1.208 echo " getting package groups info from $PKG_GROUPS"
1973 edhill 1.1 fi
1974 jmc 1.208
1975     # Search for packages to compile.
1976     echo " checking list of packages to compile:"
1977     PKG_LIST=
1978     if test "x${PKG_LIST}" = x ; then
1979 edhill 1.12 for i in "." $MODS ; do
1980     if test -r $i"/packages.conf" ; then
1981 jmc 1.208 PKG_LIST=$i"/packages.conf"
1982 edhill 1.12 break
1983     fi
1984     done
1985     fi
1986 jmc 1.208 if test "x${PKG_LIST}" = x ; then
1987     pkg_list='default_pkg_list'
1988     if test "x${PKG_GROUPS}" = x ; then
1989     echo "Error: need package groups info to expand pkg_list=\"$pkg_list\""
1990     exit 1
1991     fi
1992 edhill 1.1 else
1993 jmc 1.208 if test ! -r $PKG_LIST ; then
1994     echo "Error: can't read package list from PKG_LIST=\"$PKG_LIST\""
1995     exit 1
1996 edhill 1.1 else
1997 jmc 1.208 echo " using PKG_LIST=\"$PKG_LIST\""
1998 edhill 1.1 # Strip the comments and add all the names
1999 jmc 1.208 pkg_list=`cat $PKG_LIST | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
2000 edhill 1.1 RETVAL=$?
2001     if test "x${RETVAL}" != x0 ; then
2002 jmc 1.208 printf "Error: can't parse package list "
2003     echo "-- please check PKG_LIST=\"$PKG_LIST\""
2004 edhill 1.1 exit 1
2005     fi
2006     fi
2007     fi
2008 jmc 1.208 for i in $pkg_list ; do
2009     PACKAGES="$PACKAGES $i"
2010     done
2011     echo " before group expansion packages are:$PACKAGES"
2012     if test "x${PKG_GROUPS}" != x ; then
2013     RET=1
2014     while test $RET = 1 ; do expand_pkg_groups; RET=$?; done
2015     echo " after group expansion packages are: $PACKAGES"
2016     fi
2017 edhill 1.1
2018     echo " applying DISABLE settings"
2019 jmc 1.205 echo "" > ./.tmp_pack
2020 adcroft 1.74 for i in $PACKAGES ; do
2021     echo $i >> ./.tmp_pack
2022     done
2023     for i in `grep "-" ./.tmp_pack` ; do
2024     j=`echo $i | sed 's/[-]//'`
2025     DISABLE="$DISABLE $j"
2026     done
2027 edhill 1.1 pack=
2028     for p in $PACKAGES ; do
2029     addit="t"
2030     for d in $DISABLE ; do
2031     if test "x$p" = "x$d" ; then
2032     addit="f"
2033     fi
2034     done
2035     if test "x$addit" = xt ; then
2036     pack="$pack $p"
2037     fi
2038     done
2039     PACKAGES="$pack"
2040     echo " applying ENABLE settings"
2041 edhill 1.12 echo "" > ./.tmp_pack
2042 edhill 1.1 PACKAGES="$PACKAGES $ENABLE"
2043 adcroft 1.74 # Test if each explicitly referenced package exists
2044 edhill 1.1 for i in $PACKAGES ; do
2045 adcroft 1.74 j=`echo $i | sed 's/[-+]//'`
2046     if test ! -d "$ROOTDIR/pkg/$j" ; then
2047 jmc 1.208 echo "Error: dir '$ROOTDIR/pkg/$i' missing for package '$i'"
2048 adcroft 1.74 exit 1
2049 edhill 1.1 fi
2050     echo $i >> ./.tmp_pack
2051     done
2052     PACKAGES=
2053 adcroft 1.74 for i in `grep -v "-" ./.tmp_pack | sort | uniq` ; do
2054 edhill 1.1 PACKAGES="$PACKAGES $i"
2055     done
2056 adcroft 1.74 rm -f ./.tmp_pack
2057 jmc 1.205 echo " packages are: $PACKAGES"
2058 edhill 1.1
2059 jmc 1.206 # Check for package MNC: if NetCDF is available, then build the MNC
2060 jmc 1.161 # template files ; otherwise, delete mnc from the list of packages.
2061 jmc 1.205 echo " $PACKAGES " | grep ' mnc ' > /dev/null 2>&1
2062 jmc 1.206 mnc_in=$?
2063     if test "x$HAVE_NETCDF" != xt ; then
2064     if test "x$mnc_in" = x0 ; then
2065 edhill 1.100 cat <<EOF
2066     *********************************************************************
2067     WARNING: the "mnc" package was enabled but tests failed to compile
2068     NetCDF applications. Please check that:
2069    
2070     1) NetCDF is correctly installed for this compiler and
2071 jmc 1.206 2) the LIBS variable (within the "optfile") specifies the correct
2072 edhill 1.100 NetCDF library to link against.
2073    
2074     Due to this failure, the "mnc" package is now DISABLED.
2075     *********************************************************************
2076     EOF
2077     PACKAGES=`echo $PACKAGES | sed -e 's/mnc//g'`
2078     DISABLE="$DISABLE mnc"
2079     else
2080 jmc 1.206 # this prevent to add mnc (due to pdepend rules) if not available
2081     DISABLE="$DISABLE mnc"
2082     fi
2083     else
2084     # we have NetCDF, we try to build MNC template files
2085     ( cd $ROOTDIR"/pkg/mnc" && $MAKE testclean && $MAKE templates ) > make_mnc.errors 2>&1
2086     RETVAL=$?
2087     if test "x${RETVAL}" = x0 ; then
2088     rm -f make_mnc.errors
2089     else
2090     echo "Error: problem encountered while building source files in pkg/mnc:"
2091     cat make_mnc.errors 1>&2
2092     if test "x$mnc_in" = x0 ; then
2093     exit 1
2094 edhill 1.100 else
2095 jmc 1.206 DISABLE="$DISABLE mnc"
2096 edhill 1.100 fi
2097     fi
2098     fi
2099    
2100 jmc 1.161 # Check for package PROFILES: if NetCDF is not available,
2101     # then delete profiles from the list of available packages.
2102 jmc 1.206 if test "x$HAVE_NETCDF" != xt ; then
2103     echo " $PACKAGES " | grep ' profiles ' > /dev/null 2>&1
2104     RETVAL=$?
2105     if test "x$RETVAL" = x0 ; then
2106 jmc 1.161 cat <<EOF
2107     *********************************************************************
2108     WARNING: the "profiles" package was enabled but tests failed to
2109     compile NetCDF applications. Please check that:
2110    
2111     1) NetCDF is correctly installed for this compiler and
2112 jmc 1.206 2) the LIBS variable (within the "optfile") specifies the correct
2113 jmc 1.161 NetCDF library to link against.
2114    
2115     Due to this failure, the "profiles" package is now DISABLED.
2116     *********************************************************************
2117     EOF
2118     PACKAGES=`echo $PACKAGES | sed -e 's/profiles//g'`
2119     DISABLE="$DISABLE profiles"
2120 jmc 1.206 else
2121     # this prevent to add profiles (due to pdepend rules) if not available
2122     DISABLE="$DISABLE profiles"
2123 jmc 1.161 fi
2124     fi
2125    
2126 jmc 1.208 if test "x${PKG_DEPEND}" != x ; then
2127     echo " applying package dependency rules"
2128     ck=
2129     while test "x$ck" != xtt ; do
2130 edhill 1.1 i=0
2131 edhill 1.2 # rtot=${#PNAME[@]}
2132     rtot=$nname
2133 jmc 1.162 while test $i -le $rtot ; do
2134 edhill 1.1
2135     # Is $pname in the current $PACKAGES list?
2136 edhill 1.2 # pname=${PNAME[$i]}
2137     tmp="pname=\"\$PNAME_$i\""
2138     eval $tmp
2139 edhill 1.1 pin="f"
2140     for p in $PACKAGES ; do
2141     if test "x$p" = "x$pname" ; then
2142     pin="t"
2143     fi
2144     done
2145 jmc 1.205 # or in the current $STANDARDDIRS list?
2146     for p in $STANDARDDIRS ; do
2147     if test "x$p" = "x$pname" ; then pin="t" ; fi
2148     done
2149 edhill 1.1
2150     # Is the DNAME entry a (+) or (-) rule ?
2151 edhill 1.2 tmp="dname=\"\$DNAME_$i\""
2152     eval $tmp
2153 edhill 1.1 plus="-"
2154 edhill 1.2 echo $dname | grep '^+' > /dev/null 2>&1
2155 edhill 1.1 RETVAL=$?
2156     if test "x$RETVAL" = x0 ; then
2157     plus="+"
2158     fi
2159    
2160     # Is $dname in the current $PACKAGES list?
2161 edhill 1.2 dname=`echo $dname | sed -e 's/^[+-]//'`
2162 edhill 1.1 din="f"
2163     for p in $PACKAGES ; do
2164     if test "x$p" = "x$dname" ; then
2165     din="t"
2166     fi
2167     done
2168    
2169     # Do we need to add $dname according to the dependency rules?
2170     if test "x$pin" = xt -a "x$plus" = "x+" -a "x$din" = xf ; then
2171 jmc 1.162 #echo " " $pname ": need to add :" $dname
2172 edhill 1.1 in_dis="f"
2173     for dis in $DISABLE ; do
2174     if test "x$dis" = "x$dname" ; then
2175     in_dis="t"
2176     fi
2177     done
2178     if test "x$in_dis" = xt ; then
2179     echo "Error: can't satisfy package dependencies:"
2180     echo " \"$dname\" is required by the dependency rules"
2181     echo " but is disallowed by the DISABLE settings"
2182     exit 1
2183     else
2184     PACKAGES="$PACKAGES $dname"
2185     ck=
2186     fi
2187     fi
2188    
2189     # Do we need to get rid of $dname according to the dependency rules?
2190     if test "x$pin" = xt -a "x$plus" = "x-" -a "x$din" = xt; then
2191     echo "Error: can't satisfy package dependencies:"
2192 jmc 1.206 echo " \"$pname\" was requested but is disallowed by"
2193 edhill 1.1 echo " the dependency rules for \"$dname\""
2194     exit 1
2195     fi
2196 edhill 1.87 i=`echo "$i + 1" | bc -l`
2197     #i=$(( $i + 1 ))
2198 edhill 1.1 done
2199     ck=$ck"t"
2200 jmc 1.208 done
2201     echo " packages are: $PACKAGES"
2202     fi
2203 edhill 1.1 for i in $PACKAGES ; do
2204     adr="$ROOTDIR/pkg/$i"
2205     if test -d $adr ; then
2206     SOURCEDIRS="$SOURCEDIRS $adr"
2207     INCLUDEDIRS="$INCLUDEDIRS $adr"
2208 edhill 1.14 if test "x$i" = xautodiff ; then
2209     AUTODIFF_PKG_USED=t
2210     fi
2211 edhill 1.1 else
2212     echo "Error: the directory \"$adr\" for package $i doesn't exist"
2213     exit 1
2214     fi
2215     done
2216    
2217 edhill 1.12 # Create a list of #define and #undef to enable/disable packages
2218     PACKAGES_DOT_H=PACKAGES_CONFIG.h
2219 jmc 1.206 # The following UGLY HACK sets multiple "#undef"s and it needs to go
2220     # away. On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h
2221 edhill 1.1 # file would eventually be split up so that all package-related #define
2222     # statements could be separated and handled only by genmake.
2223     names=`ls -1 "$ROOTDIR/pkg"`
2224     all_pack=
2225 adcroft 1.44 DISABLED_PACKAGES=
2226 edhill 1.1 for n in $names ; do
2227     if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
2228     has_pack="f"
2229     for pack in $PACKAGES ; do
2230     if test "x$pack" = "x$n" ; then
2231     has_pack="t"
2232     break
2233     fi
2234     done
2235     if test "x$has_pack" = xf ; then
2236 edhill 1.116 undef=`echo "ALLOW_$n" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2237 adcroft 1.44 DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
2238 edhill 1.1 fi
2239     fi
2240     done
2241 adcroft 1.44 ENABLED_PACKAGES=
2242 edhill 1.1 for i in $PACKAGES ; do
2243 edhill 1.116 def=`echo "ALLOW_$i" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2244 adcroft 1.44 ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
2245 edhill 1.12 #eh3 DEFINES="$DEFINES -D$def"
2246 edhill 1.1
2247     #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
2248 jmc 1.206 case $i in
2249 edhill 1.1 aim_v23)
2250 adcroft 1.46 ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
2251 jmc 1.55 echo "Warning: ALLOW_AIM is set to enable aim_v23."
2252 edhill 1.1 ;;
2253     esac
2254     #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
2255    
2256     done
2257    
2258 jmc 1.205 echo " Adding STANDARDDIRS='$STANDARDDIRS'"
2259 edhill 1.1 BUILDDIR=${BUILDDIR:-.}
2260 edhill 1.57 if test "x$STANDARDDIRS" != x ; then
2261     for d in $STANDARDDIRS ; do
2262     adr="$ROOTDIR/$d/src"
2263     if test ! -d $adr ; then
2264     echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2265     echo " is correct and that you correctly specified the STANDARDDIRS option"
2266     exit 1
2267     else
2268     SOURCEDIRS="$SOURCEDIRS $adr"
2269     fi
2270     adr="$ROOTDIR/$d/inc"
2271     if test ! -d $adr ; then
2272     echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2273     echo " is correct and that you correctly specified the STANDARDDIRS option"
2274     exit 1
2275     else
2276     INCLUDEDIRS="$INCLUDEDIRS $adr"
2277     fi
2278     done
2279     fi
2280 edhill 1.1
2281 adcroft 1.52 echo " Searching for *OPTIONS.h files in order to warn about the presence"
2282     echo " of \"#define \"-type statements that are no longer allowed:"
2283 edhill 1.12 CPP_OPTIONS=
2284 adcroft 1.52 CPP_EEOPTIONS=
2285 edhill 1.12 spaths=". $INCLUDEDIRS"
2286 adcroft 1.52 names=`ls -1 "$ROOTDIR/pkg"`
2287 edhill 1.12 for i in $spaths ; do
2288     try="$i/CPP_OPTIONS.h"
2289 edhill 1.54 if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
2290 edhill 1.12 echo " found CPP_OPTIONS=\"$try\""
2291     CPP_OPTIONS="$try"
2292 adcroft 1.52 # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
2293     for n in $names ; do
2294     test_for_package_in_cpp_options $CPP_OPTIONS $n
2295     done
2296     fi
2297     try="$i/CPP_EEOPTIONS.h"
2298 edhill 1.54 if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
2299 adcroft 1.52 echo " found CPP_EEOPTIONS=\"$try\""
2300     # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
2301     #**** not yet enabled ****
2302     # test_for_mpi_in_cpp_eeoptions $try
2303     #**** not yet enabled ****
2304     CPP_EEOPTIONS="$try"
2305 edhill 1.12 fi
2306     done
2307     if test "x$CPP_OPTIONS" = x ; then
2308     echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
2309     exit 1
2310     fi
2311 edhill 1.1
2312 edhill 1.14 # Here, we build the list of files to be "run through" the adjoint
2313     # compiler.
2314 jmc 1.176 if test -f ./adSrcFiles.tmp ; then
2315     rm -f ./adSrcFiles.tmp
2316 edhill 1.14 fi
2317     echo " Creating the list of files for the adjoint compiler."
2318 jmc 1.207 touch adSrcFiles.tmp
2319 edhill 1.14 for i in $SOURCEDIRS ; do
2320     list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
2321     for j in $list_files ; do
2322 jmc 1.176 cat $i/$j >> adSrcFiles.tmp
2323 edhill 1.14 done
2324     done
2325 edhill 1.121 if test ! "x"$FS = "x.f" ; then
2326 jmc 1.176 cat adSrcFiles.tmp | sed -e "s/\.f/.$FS/g" > adSrcFiles.tmp_f
2327     mv -f adSrcFiles.tmp_f adSrcFiles.tmp
2328 edhill 1.121 fi
2329 edhill 1.14
2330 edhill 1.2 echo
2331     echo "=== Creating the Makefile ==="
2332 edhill 1.1 echo " setting INCLUDES"
2333     for i in $INCLUDEDIRS ; do
2334 edhill 1.87 if test ! -d $i ; then
2335 edhill 1.1 echo "Warning: can't find INCLUDEDIRS=\"$i\""
2336     fi
2337     done
2338    
2339 ce107 1.139 if test ! "x$DIVA" = x ; then
2340 ce107 1.140 echo " Creating the pseudo-MPI include directory"
2341 ce107 1.139 INCLUDES="-I./mpi_headers $INCLUDES"
2342     rm -rf ./mpi_headers
2343     mkdir -p ./mpi_headers
2344    
2345     if test "x$MPIINCLUDEDIR" = x ; then
2346     if test "x$MPIHOME" = x ; then
2347     MPIHOME='/usr'
2348     fi
2349     MPIINCLUDEDIR='$MPIHOME/include'
2350     fi
2351 jmc 1.206
2352 ce107 1.139 if test -r $MPIINCLUDEDIR/mpif.h ; then
2353     for i in $MPI_HEADER_FILES; do
2354     cp -p $MPIINCLUDEDIR/$i ./mpi_headers
2355     done
2356    
2357     perl -i -pe 's/MPI_DISPLACEMENT_CURRENT=-1_8/MPI_DISPLACEMENT_CURRENT=-1/g' mpi_headers/mpif.h
2358     else
2359     echo " We cannot create a copy of mpif.h!"
2360 heimbach 1.156 # exit -1
2361 ce107 1.139 fi
2362     fi
2363    
2364 edhill 1.1 echo " Determining the list of source and include files"
2365     rm -rf .links.tmp
2366     mkdir .links.tmp
2367 edhill 1.142 touch .links.tmp/foo
2368     if test ! -r ".links.tmp/foo" ; then
2369     echo
2370     echo "ERROR : something is wrong with your directory permissions or"
2371     echo " your user file-creation mask (\"umask\") since creating a"
2372     echo " sub-dir, touch-ing a file within it, and then reading it is"
2373     echo " not working. Please try setting your umask to something"
2374     echo " sane such as:"
2375     echo
2376     echo " umask 0002"
2377     echo
2378     echo " and please verify that you have the proper permissions for"
2379     echo " creating sub-directories and then reading files created"
2380     echo " within them."
2381     echo
2382     exit 1
2383     fi
2384     rm -f .links.tmp/foo
2385 jmc 1.176
2386 jmc 1.206 if test "x$OPENAD" != x ; then
2387 jmc 1.176 OAD_DONT_COMPILE="/dev/null"
2388     OAD_DONT_TRANSFORM="/dev/null"
2389     OAD_KEEP_ORIGINAL="/dev/null"
2390     OAD_CB2M_FILES="/dev/null"
2391     echo " looking for dontCompile file: "
2392     for i in "." $MODS ; do
2393     if test -r $i"/dontCompile" ; then
2394     OAD_DONT_COMPILE=$i"/dontCompile"
2395     echo " found $OAD_DONT_COMPILE"
2396     break
2397     fi
2398     done
2399     echo " looking for dontTransform file: "
2400     for i in "." $MODS ; do
2401     if test -r $i"/dontTransform" ; then
2402     OAD_DONT_TRANSFORM=$i"/dontTransform"
2403     echo " found $OAD_DONT_TRANSFORM"
2404     break
2405     fi
2406     done
2407     echo " looking for keepOriginal file: "
2408     for i in "." $MODS ; do
2409     if test -r $i"/keepOriginal" ; then
2410     OAD_KEEP_ORIGINAL=$i"/keepOriginal"
2411     echo " found $OAD_KEEP_ORIGINAL"
2412     break
2413     fi
2414     done
2415     echo " looking for cb2mFiles: "
2416     for i in "." $MODS ; do
2417     if test -r $i"/cb2mFiles" ; then
2418     OAD_CB2M_FILES=$i"/cb2mFiles"
2419     echo " found $OAD_CB2M_FILES"
2420     break
2421     fi
2422     done
2423     echo " OpenAD exceptions: "
2424     fi
2425    
2426 edhill 1.1 echo "# This section creates symbolic links" > srclinks.tmp
2427     echo "" >> srclinks.tmp
2428 jmc 1.176 printf 'F77_SRC_FILES = ' > F77srclist.tmp
2429     printf 'NON_AD_F77_SRC_FILES = ' > nonADF77srclist.tmp
2430     printf 'C_SRC_FILES = ' > csrclist.tmp
2431     printf 'F90_SRC_FILES = ' > F90srclist.tmp
2432     printf 'H_SRC_FILES = ' > hsrclist.tmp
2433     printf 'AD_FLOW_FILES = ' > ad_flow_files.tmp
2434 adcroft 1.9 alldirs="$SOURCEDIRS $INCLUDEDIRS ."
2435 edhill 1.1 for d in $alldirs ; do
2436     deplist=
2437 edhill 1.14 sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
2438 cnh 1.3 sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
2439 jmc 1.206 if test "x$OPENAD" != x ; then
2440 jmc 1.176 sfiles=`( echo $sfiles | grep -v _cb2m\. )`
2441     fi
2442 edhill 1.1 for sf in $sfiles ; do
2443     if test ! -r ".links.tmp/$sf" ; then
2444     if test -f "$d/$sf" ; then
2445 edhill 1.131 ignore_f=f
2446 adcroft 1.44 case $d/$sf in
2447     ./$PACKAGES_DOT_H)
2448 edhill 1.141 ignore_f=t
2449 adcroft 1.44 ;;
2450     ./AD_CONFIG.h)
2451 edhill 1.141 ignore_f=t
2452 adcroft 1.44 ;;
2453     ./FC_NAMEMANGLE.h)
2454 edhill 1.141 ignore_f=t
2455 adcroft 1.44 ;;
2456 edhill 1.98 ./BUILD_INFO.h)
2457 edhill 1.141 ignore_f=t
2458     ;;
2459     ./EMBEDDED_FILES.h)
2460     ignore_f=t
2461 edhill 1.98 ;;
2462 adcroft 1.44 *)
2463 edhill 1.131 # For the local directory *ONLY*,
2464     # ignore all soft-links
2465     if test "x$HAVE_TEST_L" = xt -a "x$d" = x. -a -L $sf ; then
2466     ignore_f=t
2467     else
2468     touch .links.tmp/$sf
2469     deplist="$deplist $sf"
2470     fi
2471 adcroft 1.44 ;;
2472     esac
2473 edhill 1.131 if test "x$ignore_f" = xf ; then
2474     extn=`echo $sf | $AWK -F. '{print $NF}'`
2475     case $extn in
2476 jmc 1.176 F)
2477     echo " \\" >> F77srclist.tmp
2478     printf " $sf" >> F77srclist.tmp
2479 jmc 1.206 if test "x$OPENAD" != x ; then
2480 jmc 1.176 basename=${sf%%.F}
2481     isAD=`egrep ^$basename.f'[ ]*' adSrcFiles.tmp`
2482 jmc 1.206 if test -z "$isAD" ; then
2483 jmc 1.176 toBeIgnored=`egrep ^$basename'[ ]*' ${OAD_DONT_COMPILE}`
2484 jmc 1.206 if test -z "$toBeIgnored" ; then
2485 jmc 1.176 echo " \\" >> nonADF77srclist.tmp
2486     printf " $sf" >> nonADF77srclist.tmp
2487 jmc 1.206 else
2488 jmc 1.176 echo " not to be compiled : $sf"
2489     fi
2490 jmc 1.206 else # file is initially listed as an AD file we want to exclude it
2491 jmc 1.176 # or we want to retain the untransformed version
2492     notToBeTransformed=`egrep ^$basename'[ ]*' ${OAD_DONT_TRANSFORM}`
2493     untransformedVersionToBeKept=`egrep ^$basename'[ ]*' ${OAD_KEEP_ORIGINAL}`
2494 jmc 1.206 if test -n "$notToBeTransformed"; then
2495 jmc 1.176 echo " not to be transformed: $sf"
2496     fi
2497     if test -n "$untransformedVersionToBeKept" ; then
2498     echo " original to be kept : $sf"
2499 jmc 1.206 fi
2500 jmc 1.176 if test -n "$notToBeTransformed" -o -n "$untransformedVersionToBeKept" ; then
2501     echo " \\" >> nonADF77srclist.tmp
2502     printf " $sf" >> nonADF77srclist.tmp
2503     fi
2504     fi
2505     fi
2506     ;;
2507     F90)
2508     echo " \\" >> F90srclist.tmp
2509     printf " $sf" >> F90srclist.tmp
2510     ;;
2511     c)
2512     echo " \\" >> csrclist.tmp
2513     printf " $sf" >> csrclist.tmp
2514     ;;
2515     h)
2516     echo " \\" >> hsrclist.tmp
2517     printf " $sf" >> hsrclist.tmp
2518     ;;
2519     flow)
2520     echo " \\" >> ad_flow_files.tmp
2521     printf " $sf" >> ad_flow_files.tmp
2522     ;;
2523     esac
2524     fi
2525 edhill 1.1 fi
2526     fi
2527     done
2528     if test "x$deplist" != x ; then
2529 jmc 1.176 if test "$d" != "." ; then
2530     echo "" >> srclinks.tmp
2531 edhill 1.2 echo "# These files are linked from $d" >> srclinks.tmp
2532 edhill 1.1 echo "$deplist :" >> srclinks.tmp
2533 jahn 1.170 # We need to make sure that the link isn't already there.
2534     # This may happen when make thinks that a header file has to be "remade"
2535     # because a module it depends on has changed. In this case we do nothing.
2536     printf "\tif [ ! -L \$@ ]; then \$(LN) %s/\$@ \$@; fi\n" $d >> srclinks.tmp
2537 jmc 1.176 fi
2538 edhill 1.1 fi
2539     done
2540     rm -rf .links.tmp
2541 jmc 1.176 echo "" >> F77srclist.tmp
2542     echo "" >> nonADF77srclist.tmp
2543     echo "" >> csrclist.tmp
2544     echo "" >> F90srclist.tmp
2545     echo "" >> hsrclist.tmp
2546     echo "" >> ad_flow_files.tmp
2547 edhill 1.1
2548 jmc 1.192 CMDLINE=$0
2549     for xx in "$@" ; do nw=`echo $xx | wc -w`
2550     if test $nw = '1' ; then CMDLINE="$CMDLINE $xx"
2551     else CMDLINE="$CMDLINE '$xx'" ; fi
2552     done
2553    
2554 edhill 1.88 if test -f $MAKEFILE ; then
2555 jmc 1.205 mv -f $MAKEFILE "$MAKEFILE.old"
2556 edhill 1.1 fi
2557     echo " Writing makefile: $MAKEFILE"
2558     echo "# Multithreaded + multi-processing makefile for:" > $MAKEFILE
2559     echo "# $MACHINE" >> $MAKEFILE
2560     echo "# This makefile was generated automatically on" >> $MAKEFILE
2561     echo "# $THISDATE" >> $MAKEFILE
2562     echo "# by the command:" >> $MAKEFILE
2563 jmc 1.192 echo "# $CMDLINE" >> $MAKEFILE
2564 edhill 1.1 echo "# executed by:" >> $MAKEFILE
2565 edhill 1.97 echo "# ${THISUSER}@${THISHOST}:${THISCWD}" >> $MAKEFILE
2566 edhill 1.21
2567     EXE_AD=$EXECUTABLE"_ad"
2568     EXE_FTL=$EXECUTABLE"_ftl"
2569     EXE_SVD=$EXECUTABLE"_svd"
2570    
2571 edhill 1.1 cat >>$MAKEFILE <<EOF
2572 edhill 1.53 #
2573     # OPTFILE="$OPTFILE"
2574 jmc 1.205 #
2575 edhill 1.1 # BUILDDIR : Directory where object files are written
2576     # SOURCEDIRS : Directories containing the source (.F) files
2577     # INCLUDEDIRS : Directories containing the header-source (.h) files
2578     # EXEDIR : Directory where executable that is generated is written
2579     # EXECUTABLE : Full path of executable binary
2580     #
2581     # CPP : C-preprocessor command
2582     # INCLUDES : Directories searched for header files
2583     # DEFINES : Macro definitions for CPP
2584     # MAKEDEPEND : Dependency generator
2585     # KPP : Special preprocessor command (specific to platform)
2586     # KFLAGS : Flags for KPP
2587     # FC : Fortran compiler command
2588     # FFLAGS : Configuration/debugging options for FC
2589     # FOPTIM : Optimization options for FC
2590     # LINK : Command for link editor program
2591     # LIBS : Library flags /or/ additional optimization/debugging flags
2592    
2593     ROOTDIR = ${ROOTDIR}
2594 jmc 1.205 BUILDDIR = ${BUILDDIR}
2595 edhill 1.1 SOURCEDIRS = ${SOURCEDIRS}
2596     INCLUDEDIRS = ${INCLUDEDIRS}
2597     EXEDIR = ${EXEDIR}
2598     EXECUTABLE = \$(EXEDIR)/${EXECUTABLE}
2599     TOOLSDIR = ${TOOLSDIR}
2600    
2601 edhill 1.14 #eh3 new defines for the adjoint work
2602     AUTODIFF = ${ROOTDIR}/pkg/autodiff
2603 edhill 1.21 EXE_AD = ${EXE_AD}
2604     EXE_FTL = ${EXE_FTL}
2605     EXE_SVD = ${EXE_SVD}
2606 edhill 1.14
2607 adcroft 1.44 ENABLED_PACKAGES = ${ENABLED_PACKAGES}
2608     DISABLED_PACKAGES = ${DISABLED_PACKAGES}
2609    
2610 adcroft 1.52 # These files are created by Makefile
2611 edhill 1.97 SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h BUILD_INFO.h
2612 edhill 1.141 EOF
2613 adcroft 1.52
2614 edhill 1.141 if test "x$EMBED_SRC" = xt ; then
2615     echo "EMBEDDED_FILES = EMBEDDED_FILES.h" >>$MAKEFILE
2616     else
2617     echo "EMBEDDED_FILES = " >>$MAKEFILE
2618     fi
2619 edhill 1.1
2620     cat >>$MAKEFILE <<EOF
2621     # Unix ln (link)
2622     LN = ${LN}
2623     # C preprocessor
2624     CPP = cat \$< | ${S64} | ${CPP}
2625     # Dependency generator
2626     MAKEDEPEND = ${MAKEDEPEND}
2627     # Special preprocessor (KAP on DECs, FPP on Crays)
2628     KPP = ${KPP}
2629     # Fortran compiler
2630 edhill 1.94 FC = ${FC}
2631 cnh 1.3 # Fortran compiler
2632     F90C = ${F90C}
2633 edhill 1.92 # C compiler
2634     CC = ${CC}
2635 edhill 1.1 # Link editor
2636 edhill 1.70 LINK = ${LINK} ${LDADD}
2637 edhill 1.1
2638     # Defines for CPP
2639     DEFINES = ${DEFINES}
2640     # Includes for CPP
2641     INCLUDES = ${INCLUDES}
2642     # Flags for KPP
2643     KFLAGS1 = ${KFLAGS1}
2644     KFLAGS2 = ${KFLAGS2}
2645     # Optim./debug for FC
2646 mlosch 1.165 FFLAGS = ${FFLAGS} ${FEXTRAFLAGS}
2647 edhill 1.1 FOPTIM = ${FOPTIM}
2648 cnh 1.3 # Optim./debug for FC
2649     F90FLAGS = ${F90FLAGS}
2650     F90OPTIM = ${F90OPTIM}
2651 jmc 1.176 F90FIXEDFORMAT = ${F90FIXEDFORMAT}
2652 edhill 1.1 # Flags for CC
2653     CFLAGS = ${CFLAGS}
2654     # Files that should not be optimized
2655     NOOPTFILES = ${NOOPTFILES}
2656     NOOPTFLAGS = ${NOOPTFLAGS}
2657     # Flags and libraries needed for linking
2658 edhill 1.107 LIBS = ${LIBS}
2659 cnh 1.3 # Name of the Mekfile
2660     MAKEFILE=${MAKEFILE}
2661 edhill 1.1
2662     EOF
2663    
2664 jmc 1.176 cat F77srclist.tmp >> $MAKEFILE
2665     cat nonADF77srclist.tmp >> $MAKEFILE
2666     cat csrclist.tmp >> $MAKEFILE
2667     cat F90srclist.tmp >> $MAKEFILE
2668     cat hsrclist.tmp >> $MAKEFILE
2669     cat ad_flow_files.tmp >> $MAKEFILE
2670    
2671     rm -f F77srclist.tmp nonADF77srclist.tmp csrclist.tmp F90srclist.tmp hsrclist.tmp ad_flow_files.tmp
2672    
2673 edhill 1.75 echo >> $MAKEFILE
2674 jmc 1.176
2675 jmc 1.205 # add definitions for preprocessed sources
2676     # and note that not all systems allow case sensitive extensions
2677     # hence the $FS and $FS90 here.
2678     # for fixed format f90 files we use ff90 or FF90 resp
2679 jmc 1.176 # but these are not expected to be the original source files
2680    
2681     echo 'F77_PP_SRC_FILES = $(F77_SRC_FILES:.F=.'$FS')' >> $MAKEFILE
2682     echo 'F90_PP_SRC_FILES = $(F90_SRC_FILES:.F90=.'$FS90')' >> $MAKEFILE
2683     echo 'OBJFILES= $(F77_SRC_FILES:.F=.o) $(C_SRC_FILES:.c=.o) $(F90_SRC_FILES:.F90=.o)' >> $MAKEFILE
2684 dfer 1.172 echo 'FLOFILES = $(AD_FLOW_FILES:.flow=.flowdir)' >> $MAKEFILE
2685 edhill 1.75 echo >> $MAKEFILE
2686     echo '.SUFFIXES:' >> $MAKEFILE
2687 jmc 1.176 echo '.SUFFIXES: .o .'$FS' .p .F .c .f'$FS90' .'$FS90' .FF90 .F90 .flowdir .flow' >> $MAKEFILE
2688 edhill 1.1
2689     cat >>$MAKEFILE <<EOF
2690    
2691     all: \$(EXECUTABLE)
2692 jmc 1.176 \$(EXECUTABLE): \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(OBJFILES) \$(EMBEDDED_FILES)
2693 adcroft 1.44 @echo Creating \$@ ...
2694 edhill 1.1 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
2695 jmc 1.222
2696 edhill 1.1 depend:
2697     @make links
2698 jmc 1.176 \$(MAKEDEPEND) -o .$FS \$(DEFINES) \$(INCLUDES) \$(F77_SRC_FILES)
2699 adcroft 1.44 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
2700 edhill 1.72 -rm -f makedepend.out
2701 edhill 1.1
2702 cnh 1.132 lib: libmitgcmuv.a
2703    
2704     libmitgcmuv.a: \$(OBJFILES)
2705     ar rcv libmitgcmuv.a \$(OBJFILES)
2706 cnh 1.159 ar d libmitgcmuv.a main.o
2707 cnh 1.132
2708 jmc 1.222 obj: \$(OBJFILES)
2709    
2710 jmc 1.176 links: \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(SPECIAL_FILES)
2711 edhill 1.1
2712 jmc 1.176 small_f: \$(F77_PP_SRC_FILES) \$(F90_PP_SRC_FILES)
2713 edhill 1.1
2714     output.txt: \$(EXECUTABLE)
2715     @printf 'running ... '
2716     @\$(EXECUTABLE) > \$@
2717    
2718 jmc 1.210 # remove most of the files that "make" generates
2719 edhill 1.1 clean:
2720 heimbach 1.157 -rm -rf *.p *.$FS90 *.mod ${RMFILES} work.{pc,pcl} *.template
2721     -rm -rf *.o
2722 dfer 1.172 -rm -rf *.$FS *.flowdir
2723 utke 1.193 -rm -rf *.f$FS90 \$(AD_CLEAN) ad_input*
2724 jmc 1.210
2725     # remove most of the files that "make" and "make depend" generate
2726 edhill 1.1 Clean:
2727     @make clean
2728     @make cleanlinks
2729 jmc 1.215 -rm -f \$(SPECIAL_FILES) f90mkdepend.log $MAKEFILE.old
2730 jmc 1.166 -rm -f taf_command taf_output taf_ad.log taf_ad_flow.log
2731 jmc 1.211 -rm -f genmake_warnings genmake_errors make.log
2732 jmc 1.210
2733     # remove also the executable, files that "genmake2" generates (except Makefile)
2734 jmc 1.211 # and output from a run (plus log files from testreport)
2735 edhill 1.1 CLEAN:
2736     @make Clean
2737 jmc 1.215 -rm -f \$(EXECUTABLE) \$(EXE_AD) *.bak
2738 jmc 1.219 -rm -f $LOGFILE genmake_state genmake_*optfile
2739     -rm -f SIZE.h.mpi genmake.tr_log make.tr_log
2740 edhill 1.1 -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
2741     -find \$(EXEDIR) -name "*.data" -exec rm {} \;
2742     -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
2743 jmc 1.210 -rm -f *.txt STD* *diagnostics.log datetime
2744 jmc 1.166 -rm -f *_MIT_CE_000.opt0000 costfunction*0000
2745 edhill 1.144 -rm -rf mnc_test_*
2746 edhill 1.1
2747     makefile:
2748 edhill 1.73 $THIS_SCRIPT $G2ARGS
2749 edhill 1.1 cleanlinks:
2750     -find . -type l -exec rm {} \;
2751    
2752 jmc 1.176 # Special targets (SPECIAL_FILES) which are created by make
2753 adcroft 1.44 ${PACKAGES_DOT_H}:
2754     @echo Creating \$@ ...
2755 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) > \$@
2756 adcroft 1.44 AD_CONFIG.h:
2757     @echo Creating \$@ ...
2758 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 > \$@
2759 adcroft 1.52 FC_NAMEMANGLE.h:
2760     @echo Creating \$@ ...
2761     echo "$FC_NAMEMANGLE" > \$@
2762 adcroft 1.44
2763 edhill 1.97 BUILD_INFO.h:
2764     @echo Creating \$@ ...
2765     EOF
2766    
2767     test ! "x$THISVER" = x && echo " -echo \"#define THISVER '$THISVER'\" > \$@" >> $MAKEFILE
2768     test ! "x$THISUSER" = x && echo " -echo \"#define THISUSER '$THISUSER'\" >> \$@" >> $MAKEFILE
2769     test ! "x$THISDATE" = x && echo " -echo \"#define THISDATE '$THISDATE'\" >> \$@" >> $MAKEFILE
2770     test ! "x$THISHOST" = x && echo " -echo \"#define THISHOST '$THISHOST'\" >> \$@" >> $MAKEFILE
2771    
2772 edhill 1.141 if test "x$EMBED_SRC" = xt ; then
2773     cat >>$MAKEFILE <<EOF
2774    
2775     decode_files.o : EMBEDDED_FILES.h
2776    
2777 jmc 1.205 ## \$(F77_PP_SRC_FILES)
2778 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
2779 edhill 1.141 @echo Creating \$@ ...
2780 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
2781 edhill 1.141 -rm -f all_fF.tar.gz
2782     -gzip all_fF.tar
2783    
2784     EMBEDDED_FILES.h : all_fF.tar.gz
2785     @echo Creating \$@ ...
2786     -\${ROOTDIR}/tools/embed_encode/encode_files EMBEDDED_FILES.h all_fF.tar.gz
2787    
2788     EOF
2789     fi
2790    
2791 edhill 1.97 cat >>$MAKEFILE <<EOF
2792    
2793 edhill 1.76 # The normal chain of rules is ( .F - .$FS - .o )
2794    
2795 edhill 1.101 ## This nullifies any default implicit rules concerning these two file types:
2796 jmc 1.177 ## %.o : %.F
2797 edhill 1.76
2798     .F.$FS:
2799 edhill 1.1 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2800 edhill 1.76 .$FS.o:
2801 edhill 1.1 \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
2802 jmc 1.214 .F.o:
2803     \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
2804 jmc 1.176 .F90.$FS90:
2805     \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2806     .FF90.f$FS90:
2807     \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2808     .$FS90.o:
2809 cnh 1.3 \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
2810 jmc 1.176 .f$FS90.o:
2811     cp \$< \$(basename \$<).f90
2812     \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$(F90FIXEDFORMAT) \$(basename \$<).f90
2813 edhill 1.1 .c.o:
2814 ce107 1.139 \$(CC) \$(CFLAGS) \$(DEFINES) \$(INCLUDES) -c \$<
2815 dfer 1.172 .flow.flowdir:
2816 heimbach 1.171 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2817 edhill 1.1
2818 edhill 1.76 # Special exceptions that use the ( .F - .p - .$FS - .o ) rule-chain
2819     .F.p:
2820 edhill 1.1 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2821 edhill 1.76 .p.$FS:
2822 edhill 1.1 \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
2823 edhill 1.14
2824 jmc 1.176 EOF
2825    
2826 edhill 1.14 #=========================================
2827     #=== Automatic Differentiation Rules ===
2828 jmc 1.176 #=== for TAMC/TAF ======================
2829    
2830 jmc 1.206 if test "x$OPENAD" = x ; then
2831 jmc 1.176
2832     cat >>$MAKEFILE <<EOF
2833 edhill 1.14
2834     TAMC = ${TAMC}
2835     TAF = ${TAF}
2836    
2837 edhill 1.17 TAF_EXTRA = ${TAF_EXTRA}
2838     TAMC_EXTRA = ${TAMC_EXTRA}
2839    
2840 edhill 1.14 EOF
2841    
2842     ad_vars="AD_TAMC_FLAGS AD_TAF_FLAGS"
2843     ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF_FLAGS"
2844     ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
2845     for i in $ad_vars ; do
2846     name=$i
2847 edhill 1.151 t1="t2=\$"`echo "$i"`
2848 edhill 1.14 eval $t1
2849     printf "%-20s = " $name >> $MAKEFILE
2850 edhill 1.151 echo "$t2" | sed -e 's| \+| |g' >> $MAKEFILE
2851 edhill 1.14 done
2852    
2853     echo " Add the source list for AD code generation"
2854     echo >> $MAKEFILE
2855 edhill 1.71 printf "AD_FILES = " >> $MAKEFILE
2856 jmc 1.176 AD_FILES=`cat adSrcFiles.tmp`
2857 edhill 1.14 for i in $AD_FILES ; do
2858     echo " \\" >> $MAKEFILE
2859 edhill 1.71 printf " $i" >> $MAKEFILE
2860 edhill 1.14 done
2861     echo >> $MAKEFILE
2862 jmc 1.176 rm -f adSrcFiles.tmp
2863 edhill 1.14
2864     cat >>$MAKEFILE <<EOF
2865    
2866 edhill 1.16 # ... AD ...
2867 jmc 1.152 adall: \$(EXE_AD)
2868 edhill 1.121 adtaf: ad_taf_output.$FS
2869     adtamc: ad_tamc_output.$FS
2870 edhill 1.21
2871 jmc 1.189 ad_input_code.$FS: \$(AD_FILES) \$(H_SRC_FILES) \$(AD_FLOW_FILES)
2872 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
2873 edhill 1.23 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
2874 adcroft 1.44 -rm -f ad_config.template
2875 jmc 1.176 @make \$(F77_PP_SRC_FILES)
2876 heimbach 1.171 @make \$(FLOFILES)
2877 mlosch 1.198 cat \$(FLOFILES) \$(AD_FILES) | sed -f \$(TOOLSDIR)/remove_comments_sed > ad_input_code.$FS
2878 edhill 1.22
2879 edhill 1.121 ad_taf_output.$FS: ad_input_code.$FS
2880     \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2881 jmc 1.173 ls -l ad_input_code_ad.$FS
2882 edhill 1.121 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2883 heimbach 1.37
2884     adtafonly:
2885 edhill 1.121 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2886 jmc 1.173 ls -l ad_input_code_ad.$FS
2887 edhill 1.121 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2888 edhill 1.14
2889 jmc 1.152 \${EXE_AD}: ad_taf_output.o \$(OBJFILES)
2890 jmc 1.206 \$(LINK) -o \${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
2891 edhill 1.14
2892 edhill 1.121 ad_tamc_output.$FS: ad_input_code.$FS
2893     \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.$FS
2894     cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.$FS
2895 edhill 1.14
2896     ad_tamc: ad_tamc_output.o \$(OBJFILES)
2897 jmc 1.206 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
2898 edhill 1.14
2899 heimbach 1.105 adonlyfwd:
2900 edhill 1.106 patch < \$(TOOLSDIR)/ad_taf_output.f.onlyfwd.diff
2901 jmc 1.206
2902 heimbach 1.105 adtrick:
2903 edhill 1.106 patch < \$(TOOLSDIR)/ad_taf_output.f.adtrick.diff
2904 edhill 1.14
2905 edhill 1.19 # ... FTL ...
2906 edhill 1.23 ftlall: ftl_taf
2907 edhill 1.121 ftltaf: ftl_taf_output.$FS
2908     ftltamc: ftl_tamc_output.$FS
2909 edhill 1.21
2910 jmc 1.176 ftl_input_code.$FS: \$(AD_FILES) \$(H_SRC_FILES)
2911 edhill 1.71 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -UALLOW_ADJOINT_RUN -DALLOW_TANGENTLINEAR_RUN -UALLOW_ECCO_OPTIMIZATION > ftl_config.template
2912 edhill 1.23 cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
2913 adcroft 1.44 -rm -f ftl_config.template
2914 jmc 1.176 @make \$(F77_PP_SRC_FILES)
2915 edhill 1.22 @make \$(AD_FLOW_FILES)
2916 edhill 1.121 cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.$FS
2917 edhill 1.22
2918 edhill 1.121 ftl_taf_output.$FS: ftl_input_code.$FS
2919     \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
2920 jmc 1.173 ls -l ftl_input_code_ftl.$FS
2921 edhill 1.121 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
2922 edhill 1.14
2923 heimbach 1.40 ftltafonly:
2924 edhill 1.121 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
2925 jmc 1.173 ls -l ftl_input_code_ftl.$FS
2926 edhill 1.121 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
2927 heimbach 1.40
2928 edhill 1.19 ftl_taf: ftl_taf_output.o \$(OBJFILES)
2929 jmc 1.206 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
2930 edhill 1.14
2931 edhill 1.121 ftl_tamc_output.$FS: ftl_input_code.$FS
2932     \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.$FS
2933     cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.$FS
2934 edhill 1.16
2935 edhill 1.19 ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
2936 jmc 1.206 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
2937 edhill 1.16
2938     # ... SVD ...
2939 edhill 1.121 svdtaf: ad_taf_output.$FS ftl_taf_output.$FS
2940 heimbach 1.109 @echo "--->>> Only ran TAF to generate SVD code! <<<---"
2941     @echo "--->>> Do make svdall afterwards to compile. <<<---"
2942     svdall: svd_touch svd_taf
2943 edhill 1.16
2944 heimbach 1.109 svd_taf: \$(OBJFILES)
2945 heimbach 1.40 \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
2946 edhill 1.14
2947 heimbach 1.109 @echo "--->>> Only COMPILE svd code! <<<---"
2948     @echo "--->>> Assumes you previously <<<---"
2949     @echo "--->>> did make svdtaf <<<---"
2950    
2951     svd_touch:
2952     @echo "--->>> Only COMPILE svd code! <<<---"
2953     @echo "--->>> Assumes you previously <<<---"
2954     @echo "--->>> did make svdtaf <<<---"
2955 edhill 1.121 touch ad_taf_output.$FS ftl_taf_output.$FS
2956     \$(FC) \$(FFLAGS) \$(FOPTIM) -c ad_taf_output.$FS
2957     \$(FC) \$(FFLAGS) \$(FOPTIM) -c ftl_taf_output.$FS
2958 heimbach 1.109 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -UALLOW_ADJOINT_RUN -DALLOW_TANGENTLINEAR_RUN -UALLOW_ECCO_OPTIMIZATION > ftl_config.template
2959     cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
2960     -rm -f ftl_config.template
2961 edhill 1.14
2962 jmc 1.176 EOF
2963    
2964 jmc 1.206 fi
2965 jmc 1.176
2966     #=== for OpenAD ========================
2967    
2968 jmc 1.206 if test "x$OPENAD" != x ; then
2969 jmc 1.176
2970     # ============ begin OpenAD specific section ==============
2971    
2972     cat >>$MAKEFILE <<EOF
2973    
2974 jmc 1.206 # all the source files linked from the various locations:
2975 jmc 1.176 ALL_LINKED_FILES= \
2976     \$(F77_SRC_FILES) \
2977     \$(C_SRC_FILES) \
2978     \$(H_SRC_FILES) \
2979     \$(F90_SRC_FILES) \
2980     \$(SPECIAL_FILES)
2981    
2982     ifndef OPENADROOT
2983     \$(error "Error: environment variable OPENADROOT not defined!")
2984     endif
2985    
2986     ifndef XAIFSCHEMAROOT
2987     \$(error "Error: environment variable XAIFSCHEMAROOT not defined!")
2988     endif
2989    
2990     ifndef XAIFBOOSTERROOT
2991     \$(error "Error: environment variable XAIFBOOSTERROOT not defined!")
2992     endif
2993    
2994     EOF
2995    
2996     echo " Add the source list for common block to module conversion "
2997     echo >> $MAKEFILE
2998     printf "CB2M_F90_SRC_NAMES = " >> $MAKEFILE
2999     for i in `cat ${OAD_CB2M_FILES}` ; do
3000     echo " \\" >> $MAKEFILE
3001     printf " $i" >> $MAKEFILE
3002     done
3003     echo >> $MAKEFILE
3004    
3005     echo " Add the source list for AD code generation"
3006     echo >> $MAKEFILE
3007     printf "AD_FILES = " >> $MAKEFILE
3008     for i in `cat ${OAD_CB2M_FILES}` ; do
3009     echo " \\" >> $MAKEFILE
3010     printf " ${i}_mod.f$FS90" >> $MAKEFILE
3011     done
3012     AD_FILES=`cat adSrcFiles.tmp`
3013     for i in $AD_FILES ; do
3014     basename=${i%%.f}
3015     toBeIgnored=`egrep ^$basename'[ ]*' ${OAD_DONT_COMPILE} ${OAD_DONT_TRANSFORM}`
3016     if test -z "$toBeIgnored" ; then
3017     echo " \\" >> $MAKEFILE
3018     printf " $i" >> $MAKEFILE
3019     fi
3020     done
3021     echo >> $MAKEFILE
3022     rm -f adSrcFiles.tmp
3023    
3024     cat >>$MAKEFILE <<EOF
3025    
3026 jmc 1.206 adAll: \$(EXE_AD)
3027 jmc 1.176 .PHONY: adAll
3028    
3029     CB2M_F90_PP_SRC_FILES=\$(addsuffix _mod.f$FS90, \$(CB2M_F90_SRC_NAMES))
3030    
3031     .PRECIOUS: \$(CB2M_F90_PP_SRC_FILES) \$(NON_AD_F77_SRC_FILES:.F=_cb2m.f$FS90)
3032    
3033     .PHONY: adDepend
3034     adDepend: \$(ALL_LINKED_FILES) \$(addsuffix _mod.h, \$(CB2M_F90_SRC_NAMES)) \$(addsuffix _mod.FF90, \$(CB2M_F90_SRC_NAMES)) \$(F77_SRC_FILES:.F=_cb2m.FF90)
3035     \$(MAKEDEPEND) -o .$FS \$(DEFINES) \$(INCLUDES) \$(F77_SRC_FILES)
3036     \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
3037     -rm -f makedepend.out
3038    
3039     OPENAD_SUPPORT_F90_SRC_FILES = \
3040     w2f__types.F90 \
3041     OAD_active.F90 \
3042     OAD_cp.F90 \
3043     OAD_rev.F90 \
3044 jmc 1.206 OAD_tape.F90
3045 jmc 1.176
3046     OPENAD_SUPPORT_C_SRC_FILES = \
3047     iaddr.c \
3048     timeRatio.c
3049    
3050     f95_test_mods.f90: \$(OPENAD_SUPPORT_F90_SRC_FILES:F90=$FS90)
3051     cat \$^ > \$@
3052    
3053 jmc 1.206 f95_test.f90: all_mods.xb.x2w.w2f.pp.f$FS90 \$(NON_AD_F77_SRC_FILES:.F=_cb2m.f$FS90) ad_input_code.w2f.pre.xb.x2w.w2f.td.pp.f$FS90
3054 jmc 1.176 cat \$^ > \$@
3055    
3056     f95_test.out: f95_test_mods.f90 f95_test.f90
3057     f95 -fixed -w=unused -maxcontin=132 -c f95_test_mods.f90 > \$@ 2>&1
3058     f95 -fixed -w=unused -maxcontin=132 -c -fixed f95_test.f90 >> \$@ 2>&1
3059    
3060 jmc 1.206 # the file included below is created by the
3061     # postProcessor and its inclusion sets the
3062 utke 1.193 # variable POSTPROCESSEDFILES
3063 jmc 1.206 # used below. Because the file is made during
3064     # make it won't be read until the second (recursive)
3065 utke 1.193 # invocation in the rule below
3066     -include postProcess.make
3067    
3068     AD_OBJ_FILES_S1=\$(OPENAD_SUPPORT_F90_SRC_FILES:.F90=.o) \$(OPENAD_SUPPORT_C_SRC_FILES:.c=.o) \$(POSTPROCESSEDFILES:.f$FS90=.o)
3069    
3070     AD_OBJ_FILES_S2=\$(AD_OBJ_FILES_S1) \$(NON_AD_F77_SRC_FILES:.F=_cb2m.o) \$(C_SRC_FILES:.c=.o) \$(F90_SRC_FILES:.F90=.o)
3071    
3072     postProcess.comp: \$(ALL_LINKED_FILES) \$(addsuffix _mod.h, \$(CB2M_F90_SRC_NAMES)) postProcess.tag \$(AD_OBJ_FILES_S1)
3073     ifeq (\$(MAKELEVEL),0)
3074     \$(MAKE) adAll
3075     else
3076     touch \$@
3077     endif
3078 jmc 1.176
3079 utke 1.193 \$(EXE_AD): \$(ALL_LINKED_FILES) \$(addsuffix _mod.h, \$(CB2M_F90_SRC_NAMES)) postProcess.comp \$(AD_OBJ_FILES_S2)
3080     ifeq (\$(MAKELEVEL),1)
3081     \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(AD_OBJ_FILES_S2) \$(LIBS)
3082     else
3083     touch \$@
3084     endif
3085 jmc 1.176
3086     # makefile debug rule
3087 utke 1.178 openad: ad_input_code.w2f.pre.xb.x2w.w2f.td.pp.f$FS90
3088 jmc 1.176 .PHONY: openad
3089    
3090 jmc 1.206 # create the module files
3091     %_mod.FF90 : %.h ../OAD_support/cb2mGetModules.csh ../OAD_support/cb2mGetModules.awk
3092 jmc 1.176 ../OAD_support/cb2mGetModules.csh $< ../OAD_support/cb2mGetModules.awk
3093    
3094 jmc 1.206 # create the header files
3095     %_mod.h : %.h ../OAD_support/cb2mGetHeaders.csh ../OAD_support/cb2mGetHeaders.awk
3096 jmc 1.176 ../OAD_support/cb2mGetHeaders.csh $< ../OAD_support/cb2mGetHeaders.awk \$(CB2M_F90_SRC_NAMES)
3097    
3098     # change everybody else to use the new module files:
3099     %_cb2m.FF90 : %.F ../OAD_support/cb2mUseModules.bash
3100     ../OAD_support/cb2mUseModules.bash $< ${MPI}
3101    
3102     # makefile debug rule
3103     small_f: \$(CB2M_F90_PP_SRC_FILES)
3104     .PHONY: small_f
3105    
3106     ad_output.txt: \$(EXE_AD)
3107     @printf 'linking data files ... '
3108     \$(LN) -f ../input_ad/data* ../input_ad/eedata .
3109     \$(LN) -f ../../global_ocean.90x40x15/input/*.bin .
3110     @printf 'running ... '
3111     @./\$(EXE_AD) > \$@
3112    
3113     CB2M_AD_FILES=\$(AD_FILES:.f=_cb2m.f$FS90)
3114 utke 1.194 ad_input_code.f$FS90: \$(CB2M_AD_FILES)
3115 jmc 1.176 cat \$^ > \$@
3116    
3117 jmc 1.206 # strip all comments and blanks to reduce
3118     # the file size in order to reduce perl's memory requirements
3119     ad_input_code_sf.f$FS90 : ad_input_code.f$FS90
3120 jmc 1.176 cat \$^ | sed -f ../OAD_support/strip.sed | sed -f ../OAD_support/stop2print.sed > \$@
3121    
3122     # mfef90 preprocessing
3123 jmc 1.206 # expand statement functions
3124     # expose mfef90 specific substring handling
3125 jmc 1.176 # add the w2f__types module
3126     ad_input_code_sf.w2f.f$FS90: ad_input_code_sf.f$FS90 mfef90 whirl2f whirl2f_be w2f__types.f90
3127 jmc 1.206 ./mfef90 -r8 -z -F -N132 \$<
3128     mv \$<.B \$(basename \$<).B
3129 jmc 1.176 ./whirl2f -openad \$(basename \$<).B
3130     cat w2f__types.f90 \$(basename \$<).w2f.f > \$@
3131    
3132     # canonicalizer
3133 utke 1.178 ad_input_code_sf.w2f.pre.f$FS90: ad_input_code_sf.w2f.f$FS90 preProcess.py
3134 utke 1.201 ./preProcess.py --timing --r8 -H -S \$< -o \$@
3135 jmc 1.176
3136     # F -> WHIRL
3137 jmc 1.206 # note that the canonicalized version cuts off at col 72
3138     # doing this also for string constants which is ok as long
3139     # as we are in fixed mode and cut of exactly there.
3140     # Otherwise mfef90 patches in spaces to fill up to 72 (or 132)
3141 jmc 1.176 # characters respectively.
3142 utke 1.178 ad_input_code_sf.w2f.pre.B: ad_input_code_sf.w2f.pre.f$FS90 mfef90
3143 jmc 1.176 ./mfef90 -r8 -z -F \$<
3144     mv \$<.B \$@
3145    
3146     # WHIRL -> XAIF
3147 utke 1.178 ad_input_code_sf.w2f.pre.xaif : ad_input_code_sf.w2f.pre.B whirl2xaif
3148 jmc 1.176 ./whirl2xaif -s -n --debug 1 -o \$@ \$<
3149    
3150     # XAIF -> XAIF'
3151 utke 1.183 ad_input_code_sf.w2f.pre.xb.xaif : ad_input_code_sf.w2f.pre.xaif xaif.xsd xaif_base.xsd xaif_inlinable_intrinsics.xsd xaif_derivative_propagator.xsd xaif_output.xsd oadDriver
3152     ./oadDriver -f -t forward_step -i \$< -c \${XAIFSCHEMAROOT}/schema/examples/inlinable_intrinsics.xaif -o \$@ -I -r
3153 jmc 1.176
3154     # XAIF' -> WHIRL'
3155 utke 1.178 ad_input_code_sf.w2f.pre.xb.x2w.B : ad_input_code_sf.w2f.pre.xb.xaif xaif2whirl
3156 utke 1.196 ./xaif2whirl --debug 1 ad_input_code_sf.w2f.pre.B \$<
3157 jmc 1.176
3158     # WHIRL' -> F'
3159 utke 1.178 ad_input_code_sf.w2f.pre.xb.x2w.w2f.f$FS90: ad_input_code_sf.w2f.pre.xb.x2w.B whirl2f whirl2f_be
3160 jmc 1.206 ./whirl2f -FLIST:ftn_file=\$@ -openad \$<
3161 jmc 1.176
3162     # insert template directives
3163 utke 1.178 ad_input_code_sf.w2f.pre.xb.x2w.w2f.td.f$FS90: ad_input_code_sf.w2f.pre.xb.x2w.w2f.f$FS90 ../OAD_support/insertTemplateDir.bash
3164     ../OAD_support/insertTemplateDir.bash \$< \$@
3165 jmc 1.176
3166 utke 1.184 PPEXTRAS=\$(wildcard ../OAD_support/ad_template.*.F) ../OAD_support/ad_inline.F
3167 jmc 1.176 # postprocess F'
3168 utke 1.193 postProcess.tag: ad_input_code_sf.w2f.pre.xb.x2w.w2f.td.f$FS90 postProcess.py \$(PPEXTRAS:.F=.f)
3169 jmc 1.206 # the target is a placeholder to signal execution of the rule
3170 utke 1.193 touch \$@
3171 jmc 1.206 # this step also creates the file postProcess.make but we cannot
3172     # name it as the target or else make will try to remake it for
3173 utke 1.193 # the include directive above for any rule, e.g. make clean
3174 utke 1.199 ./postProcess.py --progress --timing --outputFormat=fixed -m r -i ../OAD_support/ad_inline.f --width 4 \$<
3175 jmc 1.176
3176     # setup some links
3177     %.xsd:
3178     \$(LN) \${XAIFSCHEMAROOT}/schema/\$@ .
3179    
3180 jmc 1.206 mfef90:
3181 jmc 1.176 \$(LN) \${OPEN64ROOT}/crayf90/sgi/mfef90 .
3182    
3183     # link the support files:
3184 jmc 1.206 \$(OPENAD_SUPPORT_F90_SRC_FILES) \$(OPENAD_SUPPORT_C_SRC_FILES):
3185 jmc 1.176 \$(LN) ../OAD_support/\$@ .
3186    
3187 jmc 1.206 whirl2xaif xaif2whirl:
3188 jmc 1.176 \$(LN) \${OPENADFORTTK}/bin/\$@ .
3189    
3190 jmc 1.206 preProcess.py postProcess.py:
3191 utke 1.178 \$(LN) \${OPENADFORTTK_BASE}/tools/SourceProcessing/\$@ .
3192 jmc 1.176
3193     whirl2f whirl2f_be:
3194     \$(LN) \${OPEN64ROOT}/whirl2f/\$@ .
3195    
3196 utke 1.183 oadDriver:
3197     \$(LN) \${XAIFBOOSTERROOT}/xaifBooster/algorithms/BasicBlockPreaccumulationReverse/driver/oadDriver \$@
3198 jmc 1.176
3199 utke 1.197 AD_CLEAN += *_mod.h *_mod.F90 *.FF90 *.mod-whirl temp.sed oad_cp.* postProcess.make postProcess.tag postProcess.comp \$(PPEXTRAS:.F=.f)
3200 utke 1.193
3201 jmc 1.176 # ============ end OpenAD specific section ==============
3202 edhill 1.1
3203     EOF
3204 edhill 1.7
3205 jmc 1.176 fi
3206    
3207     #=========================================
3208    
3209 edhill 1.7 if test "x$EXEHOOK" != x ; then
3210     printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE
3211     fi
3212 edhill 1.1
3213     echo " Making list of \"exceptions\" that need \".p\" files"
3214     for i in $KPPFILES ; do
3215     base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
3216     RETVAL=$?
3217     if test "x$RETVAL" != x0 ; then
3218     echo "Error: unable to add file \"$i\" to the exceptions list"
3219     fi
3220 edhill 1.76 echo "$base.$FS: $base.p" >> $MAKEFILE
3221 edhill 1.1 done
3222    
3223     echo " Making list of NOOPTFILES"
3224     for i in $NOOPTFILES ; do
3225     base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
3226     RETVAL=$?
3227     if test "x$RETVAL" != x0 ; then
3228     echo "Error: unable to add file \"$i\" to the exceptions list"
3229     fi
3230 edhill 1.76 echo "$base.o: $base.$FS" >> $MAKEFILE
3231 edhill 1.2 printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE
3232 edhill 1.1 done
3233    
3234     echo " Add rules for links"
3235     cat srclinks.tmp >> $MAKEFILE
3236     rm -f srclinks.tmp
3237    
3238     echo " Adding makedepend marker"
3239 edhill 1.2 printf "\n\n# DO NOT DELETE\n" >> $MAKEFILE
3240 edhill 1.1
3241 edhill 1.2 printf "\n=== Done ===\n"
3242 adcroft 1.47
3243     # Create special header files
3244 jmc 1.206 $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 > $PACKAGES_DOT_H".tmp"
3245 adcroft 1.47 if test ! -f $PACKAGES_DOT_H ; then
3246     mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
3247     else
3248 edhill 1.61 cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H > /dev/null 2>&1
3249 adcroft 1.47 RETVAL=$?
3250     if test "x$RETVAL" = x0 ; then
3251     rm -f $PACKAGES_DOT_H".tmp"
3252     else
3253     mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"
3254     mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
3255     fi
3256     fi
3257     if test ! -f AD_CONFIG.h ; then
3258 edhill 1.71 $BASH $TOOLSDIR/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -UALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN -UALLOW_ECCO_OPTIMIZATION > AD_CONFIG.h
3259 adcroft 1.47 fi
3260 edhill 1.5
3261     # Write the "state" for future records
3262 jmc 1.211 if test "x$DUMPSTATE" = xt ; then
3263 edhill 1.71 printf "" > genmake_state
3264 edhill 1.5 for i in $gm_state ; do
3265     t1="t2=\$$i"
3266     eval $t1
3267 jmc 1.222 echo "$i='$t2'" | sed -e 's/ */ /g' >> genmake_state
3268 edhill 1.5 done
3269     fi

  ViewVC Help
Powered by ViewVC 1.1.22