/[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.230 - (hide annotations) (download)
Sat Jun 23 23:21:43 2012 UTC (11 years, 8 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint63p, checkpoint63o
Changes since 1.229: +7 -11 lines
add "-DHAVE_NETCDF" to the DEFINES list when NetCDF is available ;
comment out addition of "-DHAVE_EMBED_SRC" (currently unused) to the DEFINES list

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

  ViewVC Help
Powered by ViewVC 1.1.22