/[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.215 - (hide annotations) (download)
Mon Dec 6 17:16:06 2010 UTC (13 years, 3 months ago) by jmc
Branch: MAIN
Changes since 1.214: +3 -3 lines
remove Makefile.old with "make Clean" (previously only with CLEAN target)

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

  ViewVC Help
Powered by ViewVC 1.1.22