/[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.220 - (hide annotations) (download)
Fri Jun 3 19:53:45 2011 UTC (12 years, 9 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint62z
Changes since 1.219: +17 -20 lines
- ignore "-noieee" option (this is the default anyway) and add a warning.
- option "-devel" also switch on "-ieee"

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

  ViewVC Help
Powered by ViewVC 1.1.22