/[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.221 - (hide annotations) (download)
Fri Jun 24 22:03:39 2011 UTC (12 years, 8 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint63a, checkpoint63
Changes since 1.220: +6 -1 lines
interpret a makedepend argument which contains "tools?xmakedepend"
 as the local xmakedepend (in MITgcm/tools dir); this is similar to
 what is done with the cyrus makedepend.

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

  ViewVC Help
Powered by ViewVC 1.1.22