/[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.261 - (hide annotations) (download)
Thu Aug 22 16:04:18 2013 UTC (10 years, 7 months ago) by jahn
Branch: MAIN
Changes since 1.260: +18 -1 lines
check for openad pkg if using OpenAD

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

  ViewVC Help
Powered by ViewVC 1.1.22