/[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.216 - (hide annotations) (download)
Mon Dec 13 22:07:20 2010 UTC (13 years, 3 months ago) by jmc
Branch: MAIN
Changes since 1.215: +7 -1 lines
add flag to get the FC version to echo to LOGFILE

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

  ViewVC Help
Powered by ViewVC 1.1.22