/[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.256 - (hide annotations) (download)
Fri Aug 9 01:02:24 2013 UTC (10 years, 7 months ago) by jmc
Branch: MAIN
Changes since 1.255: +18 -12 lines
revert some changes made for TAF version-2: process through TAF the same
files as before (from all *ad_diff.list files)

1 edhill 1.86 #! /usr/bin/env bash
2 edhill 1.1 #
3 jmc 1.256 # $Header: /u/gcmpack/MITgcm/tools/genmake2,v 1.255 2013/08/08 17:34:27 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     cat $PKG_GROUPS | sed -e 's/#.*$//g' | sed -e 's/:/ : /g' > ./p1.tmp
212 edhill 1.15 cat ./p1.tmp | $AWK '(NF>2 && $2==":"){ print $0 }' > ./p2.tmp
213 edhill 1.12 matched=0
214     for i in $PACKAGES ; do
215     line=`grep "^ *$i" ./p2.tmp`
216     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     rm -f ./p[1,2].tmp
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     gm_s7="THISHOST THISUSER THISDATE THISVER MACHINE FC_NAMEMANGLE"
1355     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.237 printf " getting local config information: "
1580     if test -f $gm_local ; then
1581     echo "using $gm_local"
1582     . $gm_local
1583     else
1584     echo "none found"
1585     fi
1586    
1587 edhill 1.12 if test -f ./.genmakerc ; then
1588     echo
1589     echo "WARNING: genmake2 has detected a copy of the old-style \"./.genmakerc\""
1590 jmc 1.161 echo " file. This file format is no longer supported. For directions on"
1591     echo " how to setup and use the new \"genmake2\" script, please see:"
1592 jmc 1.220 echo " http://mitgcm.org/public/devel_HOWTO/"
1593 jmc 1.161 echo " and send an email to MITgcm-support@mitgcm.org if you need help."
1594     echo "WARNING: ignore \"./.genmakerc\" and continue."
1595 jmc 1.206 echo
1596 edhill 1.12 fi
1597    
1598 edhill 1.97 # Find the MITgcm ${ROOTDIR}
1599 edhill 1.11 if test "x${ROOTDIR}" = x ; then
1600 edhill 1.112 tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1601 edhill 1.154 if test "x$tmp" = "xbin" -a -d ../model -a -d ../eesupp -a -d ../pkg ; then
1602 edhill 1.11 ROOTDIR=".."
1603     else
1604     for d in . .. ../.. ../../.. ../../../.. ../../../../.. ; do
1605     if [ -d "$d/model" -a -d "$d/eesupp" -a -d "$d/pkg" ]; then
1606     ROOTDIR=$d
1607 jmc 1.218 printf "Warning: ROOTDIR was not specified ;"
1608     echo " try using a local copy of MITgcm found at \"$ROOTDIR\""
1609 edhill 1.11 break
1610     fi
1611     done
1612     fi
1613     fi
1614     if test "x${ROOTDIR}" = x ; then
1615     echo "Error: Cannot determine ROOTDIR for MITgcm code."
1616     echo " Please specify a ROOTDIR using either an options "
1617     echo " file or a command-line option."
1618     exit 1
1619     fi
1620     if test ! -d ${ROOTDIR} ; then
1621     echo "Error: the specified ROOTDIR (\"$ROOTDIR\") does not exist!"
1622     exit 1
1623     fi
1624    
1625 edhill 1.97 # Find the MITgcm ${THISVER}
1626 jmc 1.179 version_file="${ROOTDIR}/doc/tag-index"
1627     if test -f $version_file ; then
1628 jmc 1.200 THISVER=`$AWK '/^checkpoint/{print $1; exit}' $version_file`
1629 jmc 1.179 #- remove ./BUILD_INFO.h file if older than version_file
1630     if test -f ./BUILD_INFO.h -a ./BUILD_INFO.h -ot $version_file ; then
1631     echo " remove ./BUILD_INFO.h (older than ${version_file})"
1632     rm -f ./BUILD_INFO.h
1633     fi
1634 edhill 1.97 fi
1635    
1636 edhill 1.119 if test "x$MAKEFILE" = x ; then
1637     MAKEFILE="Makefile"
1638     fi
1639    
1640 jmc 1.222 echo " getting OPTFILE information:"
1641 edhill 1.1 if test "x${OPTFILE}" = x ; then
1642 edhill 1.11 if test "x$MITGCM_OF" = x ; then
1643     echo "Warning: no OPTFILE specified so we'll look for possible settings"
1644     printf "\n=== Searching for possible settings for OPTFILE ===\n"
1645 jmc 1.212 find_possible_optfile
1646 edhill 1.1 else
1647 edhill 1.11 OPTFILE=$MITGCM_OF
1648     fi
1649     fi
1650     if test "x$OPTFILE" != xNONE ; then
1651     if test -f "$OPTFILE" -a -r "$OPTFILE" ; then
1652     echo " using OPTFILE=\"$OPTFILE\""
1653 edhill 1.34 . "$OPTFILE"
1654 edhill 1.11 RETVAL=$?
1655     if test "x$RETVAL" != x0 ; then
1656 edhill 1.71 printf "Error: failed to source OPTFILE \"$OPTFILE\""
1657 edhill 1.11 echo "--please check that variable syntax is bash-compatible"
1658 edhill 1.1 exit 1
1659     fi
1660 jmc 1.211 if test "x$DUMPSTATE" = xt ; then
1661 edhill 1.12 cp -f $OPTFILE "genmake_optfile"
1662 edhill 1.11 fi
1663     else
1664     echo "Error: can't read OPTFILE=\"$OPTFILE\""
1665     exit 1
1666 edhill 1.1 fi
1667     fi
1668 edhill 1.8
1669 jmc 1.222 echo " getting AD_OPTFILE information:"
1670 edhill 1.14 if test "x${AD_OPTFILE}" = x ; then
1671     if test "x$MITGCM_AD_OF" = x ; then
1672     AD_OPTFILE=$ROOTDIR/tools/adjoint_options/adjoint_default
1673     else
1674     AD_OPTFILE=$MITGCM_AD_OF
1675     fi
1676     fi
1677     if test "x${AD_OPTFILE}" != xNONE ; then
1678     if test -f "$AD_OPTFILE" -a -r "$AD_OPTFILE" ; then
1679     echo " using AD_OPTFILE=\"$AD_OPTFILE\""
1680 edhill 1.34 . "$AD_OPTFILE"
1681 edhill 1.14 RETVAL=$?
1682     if test "x$RETVAL" != x0 ; then
1683 edhill 1.71 printf "Error: failed to source AD_OPTFILE \"$AD_OPTFILE\""
1684 edhill 1.14 echo "--please check that variable syntax is bash-compatible"
1685     exit 1
1686     fi
1687 jmc 1.211 if test "x$DUMPSTATE" = xt ; then
1688 edhill 1.14 cp -f $AD_OPTFILE "genmake_ad_optfile"
1689     fi
1690     else
1691     echo "Error: can't read AD_OPTFILE=\"$AD_OPTFILE\""
1692     exit 1
1693     fi
1694     fi
1695    
1696 edhill 1.119 #====================================================================
1697     # Set default values if not set by the optfile
1698     #
1699 edhill 1.91 # Check that FC, CC, LINK, CPP, S64, LN, and MAKE are defined. If not,
1700 edhill 1.39 # either set defaults or complain and abort!
1701 edhill 1.71 if test ! "x$BASH" = x ; then
1702     # add a trailing space so that it works within the Makefile syntax (see below)
1703     BASH="$BASH "
1704     fi
1705 edhill 1.8 if test "x$FC" = x ; then
1706     cat <<EOF 1>&2
1707    
1708     Error: no Fortran compiler: please specify using one of the following:
1709     1) within the options file ("FC=...") as specified by "-of=OPTFILE"
1710     2) the "-fc=XXX" command-line option
1711 edhill 1.12 3) the "./genmake_local" file
1712 edhill 1.8 EOF
1713     exit 1
1714     fi
1715 jmc 1.216 if test "x$GET_FC_VERSION" != x ; then
1716     echo "Get compiler version using: $FC $GET_FC_VERSION" >> $LOGFILE
1717 jmc 1.225 ff=`echo $FC | sed 's/ .*//'` ; xx=`echo $ff | sed 's/^./& /' | sed 's/ .*//'`
1718     if test $xx != '/' ; then which $ff >> $LOGFILE ; fi
1719 jmc 1.224 $FC $GET_FC_VERSION > genmake_fc_vers1 2> genmake_fc_vers2
1720     if test -s genmake_fc_vers1 ; then
1721     cat genmake_fc_vers1 >> $LOGFILE
1722     else
1723     cat genmake_fc_vers2 >> $LOGFILE
1724     fi
1725 jmc 1.217 echo "<-- compiler version ----" >> $LOGFILE
1726 jmc 1.224 rm -f genmake_fc_vers1 genmake_fc_vers2
1727 jmc 1.216 fi
1728 jmc 1.212
1729 edhill 1.91 if test "x$CC" = x ; then
1730 jmc 1.212 look_for_C_compilers
1731 edhill 1.91 fi
1732 jmc 1.212
1733 edhill 1.8 if test "x$LINK" = x ; then
1734     LINK=$FC
1735     fi
1736 edhill 1.39 if test "x$MAKE" = x ; then
1737     MAKE="make"
1738     fi
1739 edhill 1.63 if test "x$CPP" = x ; then
1740 jmc 1.212 CPP="cpp -traditional -P"
1741 edhill 1.63 fi
1742     #EH3 === UGLY ===
1743 edhill 1.76 # The following is an ugly little hack to check for $CPP in /lib/ and
1744     # it should eventually be replaced with a more general function that
1745 edhill 1.63 # searches a combo of the user's path and a list of "usual suspects"
1746     # to find the correct location for binaries such as $CPP.
1747     for i in " " "/lib/" ; do
1748     echo "#define A a" | $i$CPP > test_cpp 2>&1 && CPP=$i$CPP
1749     done
1750     #EH3 === UGLY ===
1751 edhill 1.13 echo "#define A a" | $CPP > test_cpp 2>&1
1752 edhill 1.11 RETVAL=$?
1753     if test "x$RETVAL" != x0 ; then
1754 edhill 1.8 cat <<EOF 1>&2
1755    
1756 edhill 1.11 Error: C pre-processor "$CPP" failed the test case: please specify using:
1757    
1758 edhill 1.8 1) within the options file ("CPP=...") as specified by "-of=OPTFILE"
1759 edhill 1.12 2) the "./genmake_local" file
1760 edhill 1.30 3) with the CPP environment variable
1761 edhill 1.11
1762 edhill 1.8 EOF
1763     exit 1
1764 edhill 1.11 else
1765     rm -f test_cpp
1766 edhill 1.8 fi
1767 jmc 1.212
1768 edhill 1.84 look_for_makedepend
1769 jmc 1.212
1770     # Check that soft-link command is set and usable
1771 edhill 1.35 if test "x$LN" = x ; then
1772     LN="ln -s"
1773     fi
1774     echo "test" > genmake_test_ln
1775     $LN genmake_test_ln genmake_tlink
1776     RETVAL=$?
1777     if test "x$RETVAL" != x0 ; then
1778     cat <<EOF 1>&2
1779 edhill 1.29
1780 jmc 1.212 Error: The command "$LN" failed -- please specify a working soft-link
1781 edhill 1.35 command in the optfile.
1782    
1783     EOF
1784     exit 1
1785     fi
1786 edhill 1.131 test -L genmake_tlink > /dev/null 2>&1
1787     RETVAL=$?
1788     if test "x$RETVAL" = x0 ; then
1789     HAVE_TEST_L=t
1790     fi
1791 edhill 1.35 rm -f genmake_test_ln genmake_tlink
1792 edhill 1.77
1793     # Check for broken *.F/*.f handling and fix if possible
1794     check_for_broken_Ff
1795 edhill 1.29
1796 adcroft 1.67 if test ! "x$MPI" = x ; then
1797     echo " Turning on MPI cpp macros"
1798 jmc 1.239 DEFINES="$DEFINES -DALLOW_USE_MPI"
1799 jmc 1.248 #- To compile code older than checkpoint63s (2012/09/05), un-comment the following line:
1800     # DEFINES="$DEFINES -DALWAYS_USE_MPI"
1801 adcroft 1.67 fi
1802 jmc 1.187 if test ! "x$OMP" = x ; then
1803     echo " Add OMPFLAG and turn on OpenMP cpp macros"
1804     FFLAGS="$FFLAGS $OMPFLAG"
1805     F90FLAGS="$F90FLAGS $OMPFLAG"
1806     DEFINES="$DEFINES -DUSE_OMP_THREADING"
1807     fi
1808 edhill 1.39
1809 jmc 1.203 if test ! "x$USE_R4" = x ; then
1810     echo " Turning on LET_RS_BE_REAL4 cpp flag"
1811     DEFINES="$DEFINES -DLET_RS_BE_REAL4"
1812     fi
1813    
1814 ce107 1.126 if test ! "x$TS" = x ; then
1815     echo " Turning on timing per timestep"
1816 ce107 1.139 if test ! "x$FOOLAD" = x ; then
1817 jmc 1.236 DEFINES="$DEFINES -DTIME_PER_TIMESTEP_SFP"
1818 ce107 1.139 else
1819     DEFINES="$DEFINES -DTIME_PER_TIMESTEP"
1820     fi
1821 ce107 1.164 PACKAGES="$PACKAGES showflops"
1822 ce107 1.139 fi
1823     if test ! "x$PAPIS" = x ; then
1824     echo " Turning on PAPI flop summary per timestep"
1825     echo " Please make sure PAPIINC, PAPILIB are defined"
1826     if test ! "x$FOOLAD" = x ; then
1827     DEFINES="$DEFINES -DUSE_PAPI_FLOPS_SFP"
1828     else
1829     DEFINES="$DEFINES -DUSE_PAPI_FLOPS"
1830     fi
1831     INCLUDES="$INCLUDES $PAPIINC"
1832     LIBS="$LIBS $PAPILIB"
1833 ce107 1.164 PACKAGES="$PACKAGES showflops"
1834 ce107 1.139 fi
1835 ce107 1.147 if test ! "x$PCLS" = x ; then
1836     echo " Turning on PCL counter summary per timestep"
1837     echo " Please make sure PCLINC, PCLLIB are defined"
1838     if test ! "x$FOOLAD" = x ; then
1839     DEFINES="$DEFINES -DUSE_PCL_FLOPS_SFP"
1840     else
1841     DEFINES="$DEFINES -DUSE_PCL_FLOPS"
1842     fi
1843     INCLUDES="$INCLUDES $PCLINC"
1844     LIBS="$LIBS $PCLLIB"
1845 ce107 1.164 PACKAGES="$PACKAGES showflops"
1846 ce107 1.147 fi
1847 ce107 1.139 if test ! "x$PAPI" = x ; then
1848     if test ! "x$PAPIS" = x ; then
1849     echo " PAPI performance analysis and flop summary per timestep cannot co-exist!"
1850     echo " Sticking with PAPI flop summary per timestep!"
1851     else
1852     echo " Turning on performance analysis with PAPI"
1853 jmc 1.236 echo " Please make sure PAPIINC, PAPILIB are defined"
1854 ce107 1.139 DEFINES="$DEFINES -DUSE_PAPI"
1855     INCLUDES="$INCLUDES $PAPIINC"
1856     LIBS="$LIBS $PAPILIB"
1857     fi
1858     fi
1859 ce107 1.147 if test ! "x$PCL" = x ; then
1860     if test ! "x$PCLS" = x ; then
1861     echo " PCL performance analysis and flop summary per timestep cannot co-exist!"
1862     echo " Sticking with PCL flop summary per timestep!"
1863     else
1864     echo " Turning on performance analysis with PCL"
1865 jmc 1.236 echo " Please make sure PCLINC, PCLLIB are defined"
1866 ce107 1.147 DEFINES="$DEFINES -DUSE_PCL"
1867     INCLUDES="$INCLUDES $PCLINC"
1868     LIBS="$LIBS $PCLLIB"
1869     fi
1870     fi
1871 ce107 1.139 if test ! "x$HPMT" = x ; then
1872     if test ! "x$PAPI" = x ; then
1873     echo " PAPI and the HPM Toolkit cannot co-exist!"
1874     echo " Sticking with PAPI!"
1875 jmc 1.237 else
1876     if test ! "x$PCL" = x ; then
1877 ce107 1.147 echo " PCL and the HPM Toolkit cannot co-exist!"
1878     echo " Sticking with PCL!"
1879 jmc 1.237 else
1880 ce107 1.139 echo " Turning on performance analysis with the HPM Toolkit"
1881 jmc 1.236 echo " Please make sure HPMTINC, HPMTLIB are defined"
1882 ce107 1.139 DEFINES="$DEFINES -DUSE_LIBHPM"
1883 jmc 1.236 INCLUDES="$INCLUDES $HPMTINC"
1884 ce107 1.139 LIBS="$LIBS $HPMTLIB"
1885 jmc 1.237 fi
1886 ce107 1.148 fi
1887 ce107 1.139 fi
1888     if test ! "x$GSL" = x ; then
1889     echo " Turning on use of GSL to control floating point calculations"
1890     echo " Please make sure GSLINC, GSLLIB are defined"
1891     DEFINES="$DEFINES -DUSE_GSL_IEEE"
1892     INCLUDES="$INCLUDES $GSLINC"
1893     LIBS="$LIBS $GSLLIB"
1894 ce107 1.126 fi
1895 jmc 1.181 #- if USE_EXTENDED_SRC is set, add EXTENDED_SRC_FLAG to FFLAGS :
1896     if test ! "x$USE_EXTENDED_SRC" = x ; then
1897     FFLAGS="$FFLAGS $EXTENDED_SRC_FLAG"
1898     F90FIXEDFORMAT="$F90FIXEDFORMAT $EXTENDED_SRC_FLAG"
1899     fi
1900 ce107 1.126
1901 edhill 1.29 printf "\n=== Checking system libraries ===\n"
1902 edhill 1.71 printf " Do we have the system() command using $FC... "
1903 edhill 1.118 cat > genmake_tcomp.$FS <<EOF
1904 edhill 1.29 program hello
1905     call system('echo hi')
1906     end
1907     EOF
1908 edhill 1.134 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1909 edhill 1.29 RETVAL=$?
1910     if test "x$RETVAL" = x0 ; then
1911     HAVE_SYSTEM=t
1912     DEFINES="$DEFINES -DHAVE_SYSTEM"
1913     echo "yes"
1914     else
1915     HAVE_SYSTEM=
1916     echo "no"
1917     fi
1918     rm -f genmake_tcomp*
1919    
1920 edhill 1.71 printf " Do we have the fdate() command using $FC... "
1921 edhill 1.118 cat > genmake_tcomp.$FS <<EOF
1922 edhill 1.29 program hello
1923 edhill 1.129 CHARACTER*(128) string
1924 edhill 1.29 string = ' '
1925     call fdate( string )
1926     print *, string
1927     end
1928     EOF
1929 edhill 1.134 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1930 edhill 1.29 RETVAL=$?
1931     if test "x$RETVAL" = x0 ; then
1932     HAVE_FDATE=t
1933     DEFINES="$DEFINES -DHAVE_FDATE"
1934     echo "yes"
1935     else
1936     HAVE_FDATE=
1937     echo "no"
1938     fi
1939     rm -f genmake_tcomp*
1940    
1941 cnh 1.81 printf " Do we have the etime() command using $FC... "
1942 edhill 1.118 cat > genmake_tcomp.$FS <<EOF
1943 cnh 1.81 program hello
1944 cnh 1.82 REAL*4 ACTUAL, TARRAY(2)
1945     EXTERNAL ETIME
1946     REAL*4 ETIME
1947     actual = etime( tarray )
1948 cnh 1.81 print *, tarray
1949     end
1950     EOF
1951 edhill 1.134 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1952 cnh 1.81 RETVAL=$?
1953     if test "x$RETVAL" = x0 ; then
1954     HAVE_ETIME=t
1955     DEFINES="$DEFINES -DHAVE_ETIME"
1956     echo "yes"
1957     else
1958     HAVE_ETIME=
1959     echo "no"
1960     fi
1961     rm -f genmake_tcomp*
1962    
1963 edhill 1.71 printf " Can we call simple C routines (here, \"cloc()\") using $FC... "
1964 edhill 1.39 check_HAVE_CLOC
1965     if test "x$HAVE_CLOC" != x ; then
1966 jmc 1.230 DEFINES="$DEFINES -DHAVE_CLOC"
1967 edhill 1.39 echo "yes"
1968     else
1969     echo "no"
1970 edhill 1.141 if test "x$EMBED_SRC" = xt ; then
1971     echo " WARNING: you requested file embedding but it has"
1972     echo " been disabled since C code cannot be called"
1973     EMBED_SRC=
1974     fi
1975 edhill 1.29 fi
1976 edhill 1.39 rm -f genmake_t*
1977 edhill 1.29
1978 edhill 1.130 printf " Can we unlimit the stack size using $FC... "
1979     check_HAVE_SETRLSTK
1980 edhill 1.151 if test "x$HAVE_SETRLSTK" = xt ; then
1981 jmc 1.230 DEFINES="$DEFINES -DHAVE_SETRLSTK"
1982 edhill 1.130 echo "yes"
1983     else
1984     echo "no"
1985     fi
1986     rm -f genmake_t*
1987    
1988 edhill 1.137 printf " Can we register a signal handler using $FC... "
1989     check_HAVE_SIGREG
1990 edhill 1.150 if test "x$HAVE_SIGREG" = xt ; then
1991 jmc 1.230 DEFINES="$DEFINES -DHAVE_SIGREG"
1992 edhill 1.137 echo "yes"
1993     else
1994     echo "no"
1995     fi
1996     rm -f genmake_t*
1997    
1998 edhill 1.108 printf " Can we use stat() through C calls... "
1999     check_HAVE_STAT
2000     if test "x$HAVE_STAT" != x ; then
2001 jmc 1.230 DEFINES="$DEFINES -DHAVE_STAT"
2002 edhill 1.108 echo "yes"
2003     else
2004     echo "no"
2005     fi
2006     rm -f genmake_t*
2007    
2008 edhill 1.71 printf " Can we create NetCDF-enabled binaries... "
2009 edhill 1.60 check_netcdf_libs
2010     if test "x$HAVE_NETCDF" != x ; then
2011 jmc 1.230 DEFINES="$DEFINES -DHAVE_NETCDF"
2012 edhill 1.60 echo "yes"
2013     else
2014     echo "no"
2015     fi
2016 jahn 1.232
2017     printf " Can we create LAPACK-enabled binaries... "
2018     check_lapack_libs
2019     if test "x$HAVE_LAPACK" != x ; then
2020     DEFINES="$DEFINES -DHAVE_LAPACK"
2021     echo "yes"
2022     else
2023     echo "no"
2024     fi
2025 jmc 1.244
2026     printf " Can we call FLUSH intrinsic subroutine... "
2027     check_HAVE_FLUSH
2028     if test "x$HAVE_FLUSH" = xt ; then
2029     DEFINES="$DEFINES -DHAVE_FLUSH"
2030     echo "yes"
2031     else
2032     echo "no"
2033     fi
2034    
2035 edhill 1.124 DEFINES="$DEFINES $IGNORE_TIME"
2036 edhill 1.141 if test "x$EMBED_SRC" = xt ; then
2037     build_embed_encode
2038     fi
2039     if test "x$EMBED_SRC" = xt ; then
2040     ENABLE="$ENABLE embed_files"
2041 jmc 1.230 # DEFINES="$DEFINES -DHAVE_EMBED_SRC"
2042 edhill 1.141 fi
2043    
2044 edhill 1.2 printf "\n=== Setting defaults ===\n"
2045 jmc 1.185 printf " Adding MODS directories: "
2046 edhill 1.1 for d in $MODS ; do
2047     if test ! -d $d ; then
2048 edhill 1.2 echo
2049     echo "Error: MODS directory \"$d\" not found!"
2050 edhill 1.1 exit 1
2051     else
2052 jmc 1.185 printf "$d "
2053 edhill 1.1 SOURCEDIRS="$SOURCEDIRS $d"
2054     INCLUDEDIRS="$INCLUDEDIRS $d"
2055     fi
2056     done
2057     echo
2058    
2059 jmc 1.212 #if test "x${PLATFORM}" = x ; then
2060     # PLATFORM=$p_PLATFORM
2061     #fi
2062 edhill 1.1
2063     if test "x${EXEDIR}" = x ; then
2064 edhill 1.112 tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
2065 edhill 1.87 if test "x$tmp" = "xbin" -a -d ../exe -a $ROOTDIR = .. ; then
2066 edhill 1.1 EXEDIR=../exe
2067     else
2068     EXEDIR=.
2069     fi
2070     fi
2071     if test ! -d ${EXEDIR} ; then
2072     echo "Error: the specified EXEDIR (\"$EXEDIR\") does not exist!"
2073     exit 1
2074     fi
2075    
2076     if test "x${TOOLSDIR}" = x ; then
2077     TOOLSDIR="$ROOTDIR/tools"
2078     fi
2079     if test ! -d ${TOOLSDIR} ; then
2080 cnh 1.65 echo "Error: the specified TOOLSDIR (\"$TOOLSDIR\") does not exist!"
2081 edhill 1.1 exit 1
2082     fi
2083 edhill 1.11 if test "x$S64" = x ; then
2084 edhill 1.104 echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.sh > /dev/null 2>&1
2085     RETVAL=$?
2086     if test "x${RETVAL}" = x0 ; then
2087     S64='$(TOOLSDIR)/set64bitConst.sh'
2088     else
2089     echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.csh > /dev/null 2>&1
2090     RETVAL=$?
2091     if test "x${RETVAL}" = x0 ; then
2092     S64='$(TOOLSDIR)/set64bitConst.csh'
2093     else
2094     cat <<EOF
2095    
2096     ERROR: neither of the two default scripts:
2097    
2098     ${TOOLSDIR}/set64bitConst.sh
2099     ${TOOLSDIR}/set64bitConst.csh
2100    
2101 jmc 1.206 are working so please check paths or specify (with \$S64) a
2102 edhill 1.104 working version of this script.
2103    
2104     EOF
2105     exit 1
2106     fi
2107     fi
2108 edhill 1.11 fi
2109 adcroft 1.44 THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`
2110 edhill 1.1
2111     EXECUTABLE=${EXECUTABLE:-mitgcmuv}
2112    
2113 jmc 1.205 # Set Standard Code Directories:
2114     if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
2115     STANDARDDIRS="eesupp model"
2116     fi
2117     # if model in Standard-Code-Dir, add eesupp (needed to compile model)
2118     echo " $STANDARDDIRS " | grep ' model ' > /dev/null 2>&1
2119     ckM=$?
2120     echo " $STANDARDDIRS " | grep ' eesupp ' > /dev/null 2>&1
2121     ckE=$?
2122 jmc 1.206 if test $ckM = 0 -a $ckE = 1 ; then
2123 jmc 1.205 STANDARDDIRS="$STANDARDDIRS eesupp"
2124     fi
2125    
2126 edhill 1.1 # We have a special set of source files in eesupp/src which are
2127     # generated from some template source files. We'll make them first so
2128     # they appear as regular source code
2129     if test -r $ROOTDIR"/eesupp/src/Makefile" ; then
2130     echo " Making source files in eesupp from templates"
2131 jmc 1.207 ( cd $ROOTDIR"/eesupp/src/" && $MAKE clean_old && $MAKE \
2132     ) > make_eesupp.errors 2>&1
2133 edhill 1.1 RETVAL=$?
2134 edhill 1.2 if test "x${RETVAL}" = x0 ; then
2135 edhill 1.1 rm -f make_eesupp.errors
2136     else
2137     echo "Error: problem encountered while building source files in eesupp:"
2138 edhill 1.62 cat make_eesupp.errors 1>&2
2139 edhill 1.1 exit 1
2140 afe 1.58 fi
2141     fi
2142    
2143 edhill 1.154 #same for pkg/exch2 and pkg/regrid
2144     for pdir in exch2 regrid ; do
2145     if test -r $ROOTDIR"/pkg/${pdir}/Makefile" ; then
2146     echo " Making source files in pkg/${pdir} from templates"
2147 jmc 1.207 ( cd $ROOTDIR"/pkg/"${pdir} && $MAKE clean_old && $MAKE \
2148     ) > make_${pdir}.errors 2>&1
2149 edhill 1.154 RETVAL=$?
2150     if test "x${RETVAL}" = x0 ; then
2151     rm -f make_${pdir}.errors
2152     else
2153     echo "Error: problem encountered while building source files in pkg/${pdir}:"
2154     cat make_${pdir}.errors 1>&2
2155     exit 1
2156     fi
2157 edhill 1.1 fi
2158 edhill 1.154 done
2159 edhill 1.1
2160 edhill 1.2 printf "\n=== Determining package settings ===\n"
2161 jmc 1.208 if test "x${PKG_DEPEND}" = x ; then
2162 edhill 1.1 tmp=$ROOTDIR"/pkg/pkg_depend"
2163 jmc 1.208 if test -r $tmp ; then PKG_DEPEND=$tmp ; fi
2164     fi
2165     if test "x${PKG_DEPEND}" = x ; then
2166 edhill 1.1 echo "Warning: No package dependency information was specified."
2167     echo " Please check that ROOTDIR/pkg/pkg_depend exists."
2168 jmc 1.208 else
2169     if test ! -r ${PKG_DEPEND} ; then
2170     echo "Error: can't read package dependency info from PKG_DEPEND=\"$PKG_DEPEND\""
2171     exit 1
2172 edhill 1.1 fi
2173 jmc 1.208 echo " getting package dependency info from $PKG_DEPEND"
2174     # Strip the comments and then convert the dependency file into arrays: PNAME, DNAME
2175     get_pdepend_list $PKG_DEPEND
2176     fi
2177    
2178     # A default package groups file "$ROOTDIR/pkg/pkg_groups" is provided
2179     # to define the "default_pkg_list" and package groups (for convenience, one
2180     # can specify a group of packages using names like "ocean" and "atmosphere").
2181     if test "x${PKG_GROUPS}" = x ; then
2182     tmp=$ROOTDIR"/pkg/pkg_groups"
2183     if test -r $tmp ; then PKG_GROUPS=$tmp ; fi
2184     fi
2185     if test "x${PKG_GROUPS}" = x ; then
2186     echo "Warning: No package groups information was specified."
2187     echo " Please check that ROOTDIR/pkg/pkg_groups exists."
2188 edhill 1.1 else
2189 jmc 1.208 if test ! -r ${PKG_GROUPS} ; then
2190     echo "Error: can't read package groups info from PKG_GROUPS=\"$PKG_GROUPS\""
2191 edhill 1.1 exit 1
2192     fi
2193 jmc 1.208 echo " getting package groups info from $PKG_GROUPS"
2194 edhill 1.1 fi
2195 jmc 1.208
2196     # Search for packages to compile.
2197     echo " checking list of packages to compile:"
2198     PKG_LIST=
2199     if test "x${PKG_LIST}" = x ; then
2200 edhill 1.12 for i in "." $MODS ; do
2201     if test -r $i"/packages.conf" ; then
2202 jmc 1.208 PKG_LIST=$i"/packages.conf"
2203 edhill 1.12 break
2204     fi
2205     done
2206     fi
2207 jmc 1.208 if test "x${PKG_LIST}" = x ; then
2208     pkg_list='default_pkg_list'
2209     if test "x${PKG_GROUPS}" = x ; then
2210     echo "Error: need package groups info to expand pkg_list=\"$pkg_list\""
2211     exit 1
2212     fi
2213 edhill 1.1 else
2214 jmc 1.208 if test ! -r $PKG_LIST ; then
2215     echo "Error: can't read package list from PKG_LIST=\"$PKG_LIST\""
2216     exit 1
2217 edhill 1.1 else
2218 jmc 1.208 echo " using PKG_LIST=\"$PKG_LIST\""
2219 jmc 1.237 # Strip the comments and add all the names
2220 jmc 1.208 pkg_list=`cat $PKG_LIST | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
2221 edhill 1.1 RETVAL=$?
2222     if test "x${RETVAL}" != x0 ; then
2223 jmc 1.208 printf "Error: can't parse package list "
2224     echo "-- please check PKG_LIST=\"$PKG_LIST\""
2225 edhill 1.1 exit 1
2226     fi
2227     fi
2228     fi
2229 jmc 1.208 for i in $pkg_list ; do
2230     PACKAGES="$PACKAGES $i"
2231     done
2232     echo " before group expansion packages are:$PACKAGES"
2233     if test "x${PKG_GROUPS}" != x ; then
2234     RET=1
2235     while test $RET = 1 ; do expand_pkg_groups; RET=$?; done
2236     echo " after group expansion packages are: $PACKAGES"
2237     fi
2238 edhill 1.1
2239     echo " applying DISABLE settings"
2240 jmc 1.205 echo "" > ./.tmp_pack
2241 adcroft 1.74 for i in $PACKAGES ; do
2242     echo $i >> ./.tmp_pack
2243     done
2244     for i in `grep "-" ./.tmp_pack` ; do
2245     j=`echo $i | sed 's/[-]//'`
2246     DISABLE="$DISABLE $j"
2247     done
2248 edhill 1.1 pack=
2249     for p in $PACKAGES ; do
2250     addit="t"
2251     for d in $DISABLE ; do
2252     if test "x$p" = "x$d" ; then
2253     addit="f"
2254     fi
2255     done
2256     if test "x$addit" = xt ; then
2257     pack="$pack $p"
2258     fi
2259     done
2260     PACKAGES="$pack"
2261     echo " applying ENABLE settings"
2262 edhill 1.12 echo "" > ./.tmp_pack
2263 edhill 1.1 PACKAGES="$PACKAGES $ENABLE"
2264 adcroft 1.74 # Test if each explicitly referenced package exists
2265 edhill 1.1 for i in $PACKAGES ; do
2266 adcroft 1.74 j=`echo $i | sed 's/[-+]//'`
2267     if test ! -d "$ROOTDIR/pkg/$j" ; then
2268 jmc 1.208 echo "Error: dir '$ROOTDIR/pkg/$i' missing for package '$i'"
2269 jmc 1.236 exit 1
2270 edhill 1.1 fi
2271     echo $i >> ./.tmp_pack
2272     done
2273     PACKAGES=
2274 adcroft 1.74 for i in `grep -v "-" ./.tmp_pack | sort | uniq` ; do
2275 edhill 1.1 PACKAGES="$PACKAGES $i"
2276     done
2277 adcroft 1.74 rm -f ./.tmp_pack
2278 jmc 1.205 echo " packages are: $PACKAGES"
2279 edhill 1.1
2280 jmc 1.206 # Check for package MNC: if NetCDF is available, then build the MNC
2281 jmc 1.161 # template files ; otherwise, delete mnc from the list of packages.
2282 jmc 1.205 echo " $PACKAGES " | grep ' mnc ' > /dev/null 2>&1
2283 jmc 1.206 mnc_in=$?
2284     if test "x$HAVE_NETCDF" != xt ; then
2285     if test "x$mnc_in" = x0 ; then
2286 edhill 1.100 cat <<EOF
2287     *********************************************************************
2288     WARNING: the "mnc" package was enabled but tests failed to compile
2289     NetCDF applications. Please check that:
2290    
2291     1) NetCDF is correctly installed for this compiler and
2292 jmc 1.206 2) the LIBS variable (within the "optfile") specifies the correct
2293 edhill 1.100 NetCDF library to link against.
2294    
2295     Due to this failure, the "mnc" package is now DISABLED.
2296     *********************************************************************
2297     EOF
2298     PACKAGES=`echo $PACKAGES | sed -e 's/mnc//g'`
2299     DISABLE="$DISABLE mnc"
2300     else
2301 jmc 1.206 # this prevent to add mnc (due to pdepend rules) if not available
2302     DISABLE="$DISABLE mnc"
2303     fi
2304     else
2305     # we have NetCDF, we try to build MNC template files
2306     ( cd $ROOTDIR"/pkg/mnc" && $MAKE testclean && $MAKE templates ) > make_mnc.errors 2>&1
2307     RETVAL=$?
2308     if test "x${RETVAL}" = x0 ; then
2309     rm -f make_mnc.errors
2310     else
2311     echo "Error: problem encountered while building source files in pkg/mnc:"
2312     cat make_mnc.errors 1>&2
2313     if test "x$mnc_in" = x0 ; then
2314 jmc 1.237 exit 1
2315 edhill 1.100 else
2316 jmc 1.206 DISABLE="$DISABLE mnc"
2317 edhill 1.100 fi
2318     fi
2319     fi
2320    
2321 jmc 1.161 # Check for package PROFILES: if NetCDF is not available,
2322     # then delete profiles from the list of available packages.
2323 jmc 1.206 if test "x$HAVE_NETCDF" != xt ; then
2324     echo " $PACKAGES " | grep ' profiles ' > /dev/null 2>&1
2325     RETVAL=$?
2326     if test "x$RETVAL" = x0 ; then
2327 jmc 1.161 cat <<EOF
2328     *********************************************************************
2329     WARNING: the "profiles" package was enabled but tests failed to
2330     compile NetCDF applications. Please check that:
2331    
2332     1) NetCDF is correctly installed for this compiler and
2333 jmc 1.206 2) the LIBS variable (within the "optfile") specifies the correct
2334 jmc 1.161 NetCDF library to link against.
2335    
2336     Due to this failure, the "profiles" package is now DISABLED.
2337     *********************************************************************
2338     EOF
2339     PACKAGES=`echo $PACKAGES | sed -e 's/profiles//g'`
2340     DISABLE="$DISABLE profiles"
2341 jmc 1.206 else
2342     # this prevent to add profiles (due to pdepend rules) if not available
2343     DISABLE="$DISABLE profiles"
2344 jmc 1.161 fi
2345     fi
2346    
2347 jahn 1.232 # Check for package RADTRANS: if LAPACK is not available,
2348     # then issue a warning that the direct radtrans solver is not available.
2349     if test "x$HAVE_LAPACK" != xt ; then
2350     echo " $PACKAGES " | grep ' radtrans ' > /dev/null 2>&1
2351     RETVAL=$?
2352     if test "x$RETVAL" = x0 ; then
2353     cat <<EOF
2354     *********************************************************************
2355     WARNING: the "radtrans" package was enabled but tests failed to
2356     compile LAPACK applications. This means that the direct radtrans
2357     solver is not available and compilation will fail if it is enabled.
2358     If you want to use the direct solver, please check that:
2359    
2360     1) LAPACK is correctly installed for this compiler and
2361     2) the LIBS variable (within the "optfile") specifies the correct
2362     LAPACK library to link against.
2363     *********************************************************************
2364     EOF
2365     fi
2366     fi
2367    
2368 jmc 1.208 if test "x${PKG_DEPEND}" != x ; then
2369     echo " applying package dependency rules"
2370     ck=
2371     while test "x$ck" != xtt ; do
2372 edhill 1.1 i=0
2373 edhill 1.2 # rtot=${#PNAME[@]}
2374     rtot=$nname
2375 jmc 1.162 while test $i -le $rtot ; do
2376 edhill 1.1
2377     # Is $pname in the current $PACKAGES list?
2378 edhill 1.2 # pname=${PNAME[$i]}
2379     tmp="pname=\"\$PNAME_$i\""
2380     eval $tmp
2381 edhill 1.1 pin="f"
2382     for p in $PACKAGES ; do
2383     if test "x$p" = "x$pname" ; then
2384     pin="t"
2385     fi
2386     done
2387 jmc 1.205 # or in the current $STANDARDDIRS list?
2388     for p in $STANDARDDIRS ; do
2389     if test "x$p" = "x$pname" ; then pin="t" ; fi
2390     done
2391 edhill 1.1
2392     # Is the DNAME entry a (+) or (-) rule ?
2393 edhill 1.2 tmp="dname=\"\$DNAME_$i\""
2394     eval $tmp
2395 edhill 1.1 plus="-"
2396 edhill 1.2 echo $dname | grep '^+' > /dev/null 2>&1
2397 edhill 1.1 RETVAL=$?
2398     if test "x$RETVAL" = x0 ; then
2399     plus="+"
2400     fi
2401    
2402     # Is $dname in the current $PACKAGES list?
2403 edhill 1.2 dname=`echo $dname | sed -e 's/^[+-]//'`
2404 edhill 1.1 din="f"
2405     for p in $PACKAGES ; do
2406     if test "x$p" = "x$dname" ; then
2407     din="t"
2408     fi
2409     done
2410    
2411     # Do we need to add $dname according to the dependency rules?
2412     if test "x$pin" = xt -a "x$plus" = "x+" -a "x$din" = xf ; then
2413 jmc 1.236 #echo " " $pname ": need to add :" $dname
2414 edhill 1.1 in_dis="f"
2415     for dis in $DISABLE ; do
2416     if test "x$dis" = "x$dname" ; then
2417     in_dis="t"
2418     fi
2419     done
2420     if test "x$in_dis" = xt ; then
2421     echo "Error: can't satisfy package dependencies:"
2422     echo " \"$dname\" is required by the dependency rules"
2423     echo " but is disallowed by the DISABLE settings"
2424     exit 1
2425     else
2426     PACKAGES="$PACKAGES $dname"
2427     ck=
2428     fi
2429     fi
2430    
2431     # Do we need to get rid of $dname according to the dependency rules?
2432     if test "x$pin" = xt -a "x$plus" = "x-" -a "x$din" = xt; then
2433     echo "Error: can't satisfy package dependencies:"
2434 jmc 1.206 echo " \"$pname\" was requested but is disallowed by"
2435 edhill 1.1 echo " the dependency rules for \"$dname\""
2436     exit 1
2437     fi
2438 jmc 1.236 i=`echo "$i + 1" | bc -l`
2439 edhill 1.87 #i=$(( $i + 1 ))
2440 edhill 1.1 done
2441     ck=$ck"t"
2442 jmc 1.208 done
2443     echo " packages are: $PACKAGES"
2444     fi
2445 edhill 1.1 for i in $PACKAGES ; do
2446     adr="$ROOTDIR/pkg/$i"
2447     if test -d $adr ; then
2448     SOURCEDIRS="$SOURCEDIRS $adr"
2449     INCLUDEDIRS="$INCLUDEDIRS $adr"
2450 edhill 1.14 if test "x$i" = xautodiff ; then
2451     AUTODIFF_PKG_USED=t
2452     fi
2453 edhill 1.1 else
2454     echo "Error: the directory \"$adr\" for package $i doesn't exist"
2455     exit 1
2456     fi
2457     done
2458    
2459 edhill 1.12 # Create a list of #define and #undef to enable/disable packages
2460     PACKAGES_DOT_H=PACKAGES_CONFIG.h
2461 jmc 1.206 # The following UGLY HACK sets multiple "#undef"s and it needs to go
2462     # away. On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h
2463 edhill 1.1 # file would eventually be split up so that all package-related #define
2464     # statements could be separated and handled only by genmake.
2465     names=`ls -1 "$ROOTDIR/pkg"`
2466     all_pack=
2467 adcroft 1.44 DISABLED_PACKAGES=
2468 edhill 1.1 for n in $names ; do
2469     if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
2470     has_pack="f"
2471     for pack in $PACKAGES ; do
2472     if test "x$pack" = "x$n" ; then
2473     has_pack="t"
2474     break
2475     fi
2476     done
2477     if test "x$has_pack" = xf ; then
2478 edhill 1.116 undef=`echo "ALLOW_$n" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2479 jmc 1.236 DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
2480 edhill 1.1 fi
2481     fi
2482     done
2483 adcroft 1.44 ENABLED_PACKAGES=
2484 edhill 1.1 for i in $PACKAGES ; do
2485 edhill 1.116 def=`echo "ALLOW_$i" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2486 adcroft 1.44 ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
2487 edhill 1.12 #eh3 DEFINES="$DEFINES -D$def"
2488 edhill 1.1
2489     #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
2490 jmc 1.206 case $i in
2491 edhill 1.1 aim_v23)
2492 jmc 1.236 ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
2493 jmc 1.55 echo "Warning: ALLOW_AIM is set to enable aim_v23."
2494 edhill 1.1 ;;
2495     esac
2496     #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
2497    
2498     done
2499    
2500 jmc 1.205 echo " Adding STANDARDDIRS='$STANDARDDIRS'"
2501 edhill 1.1 BUILDDIR=${BUILDDIR:-.}
2502 edhill 1.57 if test "x$STANDARDDIRS" != x ; then
2503     for d in $STANDARDDIRS ; do
2504     adr="$ROOTDIR/$d/src"
2505     if test ! -d $adr ; then
2506     echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2507     echo " is correct and that you correctly specified the STANDARDDIRS option"
2508     exit 1
2509     else
2510     SOURCEDIRS="$SOURCEDIRS $adr"
2511     fi
2512     adr="$ROOTDIR/$d/inc"
2513     if test ! -d $adr ; then
2514     echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2515     echo " is correct and that you correctly specified the STANDARDDIRS option"
2516     exit 1
2517     else
2518     INCLUDEDIRS="$INCLUDEDIRS $adr"
2519     fi
2520     done
2521     fi
2522 edhill 1.1
2523 adcroft 1.52 echo " Searching for *OPTIONS.h files in order to warn about the presence"
2524     echo " of \"#define \"-type statements that are no longer allowed:"
2525 edhill 1.12 CPP_OPTIONS=
2526 adcroft 1.52 CPP_EEOPTIONS=
2527 edhill 1.12 spaths=". $INCLUDEDIRS"
2528 adcroft 1.52 names=`ls -1 "$ROOTDIR/pkg"`
2529 edhill 1.12 for i in $spaths ; do
2530     try="$i/CPP_OPTIONS.h"
2531 edhill 1.54 if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
2532 edhill 1.12 echo " found CPP_OPTIONS=\"$try\""
2533     CPP_OPTIONS="$try"
2534 jmc 1.236 # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
2535     for n in $names ; do
2536     test_for_package_in_cpp_options $CPP_OPTIONS $n
2537     done
2538 adcroft 1.52 fi
2539     try="$i/CPP_EEOPTIONS.h"
2540 edhill 1.54 if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
2541 adcroft 1.52 echo " found CPP_EEOPTIONS=\"$try\""
2542 jmc 1.236 # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
2543 adcroft 1.52 #**** not yet enabled ****
2544     # test_for_mpi_in_cpp_eeoptions $try
2545     #**** not yet enabled ****
2546     CPP_EEOPTIONS="$try"
2547 edhill 1.12 fi
2548     done
2549     if test "x$CPP_OPTIONS" = x ; then
2550     echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
2551     exit 1
2552     fi
2553 edhill 1.1
2554 edhill 1.14 # Here, we build the list of files to be "run through" the adjoint
2555     # compiler.
2556 jmc 1.176 if test -f ./adSrcFiles.tmp ; then
2557     rm -f ./adSrcFiles.tmp
2558 edhill 1.14 fi
2559     echo " Creating the list of files for the adjoint compiler."
2560 jmc 1.207 touch adSrcFiles.tmp
2561 edhill 1.14 for i in $SOURCEDIRS ; do
2562     list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
2563     for j in $list_files ; do
2564 jmc 1.176 cat $i/$j >> adSrcFiles.tmp
2565 edhill 1.14 done
2566     done
2567 edhill 1.121 if test ! "x"$FS = "x.f" ; then
2568 jmc 1.176 cat adSrcFiles.tmp | sed -e "s/\.f/.$FS/g" > adSrcFiles.tmp_f
2569     mv -f adSrcFiles.tmp_f adSrcFiles.tmp
2570 edhill 1.121 fi
2571 edhill 1.14
2572 edhill 1.2 echo
2573     echo "=== Creating the Makefile ==="
2574 edhill 1.1 echo " setting INCLUDES"
2575     for i in $INCLUDEDIRS ; do
2576 edhill 1.87 if test ! -d $i ; then
2577 edhill 1.1 echo "Warning: can't find INCLUDEDIRS=\"$i\""
2578     fi
2579     done
2580    
2581 jmc 1.256 if test ! "x$DIVA" = x -a ! "x$MPI" = x ; then
2582 jmc 1.253 if test ! "x$MPIINCLUDEDIR" = x ; then
2583 jmc 1.251 # Do a local copy of MPI headers files (in local dir ./mpi_headers/) after
2584     # checking for additional included headers (in case of chain of included
2585     # header); also set LOCAL_MPI_HEADERS (if not already set)
2586     mpi_headers_do_local_copy
2587 ce107 1.139 fi
2588     fi
2589    
2590 edhill 1.1 echo " Determining the list of source and include files"
2591     rm -rf .links.tmp
2592     mkdir .links.tmp
2593 edhill 1.142 touch .links.tmp/foo
2594     if test ! -r ".links.tmp/foo" ; then
2595     echo
2596     echo "ERROR : something is wrong with your directory permissions or"
2597     echo " your user file-creation mask (\"umask\") since creating a"
2598     echo " sub-dir, touch-ing a file within it, and then reading it is"
2599     echo " not working. Please try setting your umask to something"
2600     echo " sane such as:"
2601     echo
2602     echo " umask 0002"
2603     echo
2604     echo " and please verify that you have the proper permissions for"
2605     echo " creating sub-directories and then reading files created"
2606     echo " within them."
2607     echo
2608     exit 1
2609     fi
2610     rm -f .links.tmp/foo
2611 jmc 1.176
2612 jmc 1.206 if test "x$OPENAD" != x ; then
2613 jmc 1.176 OAD_DONT_COMPILE="/dev/null"
2614     OAD_DONT_TRANSFORM="/dev/null"
2615     OAD_KEEP_ORIGINAL="/dev/null"
2616     OAD_CB2M_FILES="/dev/null"
2617 heimbach 1.242 OADTOOLS="$TOOLSDIR/OAD_support"
2618 jmc 1.176 echo " looking for dontCompile file: "
2619     for i in "." $MODS ; do
2620     if test -r $i"/dontCompile" ; then
2621     OAD_DONT_COMPILE=$i"/dontCompile"
2622     echo " found $OAD_DONT_COMPILE"
2623     break
2624     fi
2625     done
2626     echo " looking for dontTransform file: "
2627     for i in "." $MODS ; do
2628     if test -r $i"/dontTransform" ; then
2629     OAD_DONT_TRANSFORM=$i"/dontTransform"
2630     echo " found $OAD_DONT_TRANSFORM"
2631     break
2632     fi
2633     done
2634     echo " looking for keepOriginal file: "
2635     for i in "." $MODS ; do
2636     if test -r $i"/keepOriginal" ; then
2637     OAD_KEEP_ORIGINAL=$i"/keepOriginal"
2638     echo " found $OAD_KEEP_ORIGINAL"
2639     break
2640     fi
2641     done
2642     echo " looking for cb2mFiles: "
2643     for i in "." $MODS ; do
2644     if test -r $i"/cb2mFiles" ; then
2645     OAD_CB2M_FILES=$i"/cb2mFiles"
2646     echo " found $OAD_CB2M_FILES"
2647     break
2648     fi
2649     done
2650     echo " OpenAD exceptions: "
2651     fi
2652    
2653 edhill 1.1 echo "# This section creates symbolic links" > srclinks.tmp
2654     echo "" >> srclinks.tmp
2655 jmc 1.176 printf 'F77_SRC_FILES = ' > F77srclist.tmp
2656     printf 'NON_AD_F77_SRC_FILES = ' > nonADF77srclist.tmp
2657     printf 'C_SRC_FILES = ' > csrclist.tmp
2658     printf 'F90_SRC_FILES = ' > F90srclist.tmp
2659     printf 'H_SRC_FILES = ' > hsrclist.tmp
2660     printf 'AD_FLOW_FILES = ' > ad_flow_files.tmp
2661 adcroft 1.9 alldirs="$SOURCEDIRS $INCLUDEDIRS ."
2662 edhill 1.1 for d in $alldirs ; do
2663     deplist=
2664 edhill 1.14 sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
2665 cnh 1.3 sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
2666 jmc 1.206 if test "x$OPENAD" != x ; then
2667 jmc 1.176 sfiles=`( echo $sfiles | grep -v _cb2m\. )`
2668     fi
2669 edhill 1.1 for sf in $sfiles ; do
2670     if test ! -r ".links.tmp/$sf" ; then
2671     if test -f "$d/$sf" ; then
2672 edhill 1.131 ignore_f=f
2673 jmc 1.236 case $d/$sf in
2674     ./$PACKAGES_DOT_H)
2675 edhill 1.141 ignore_f=t
2676 adcroft 1.44 ;;
2677 jmc 1.236 ./AD_CONFIG.h)
2678 edhill 1.141 ignore_f=t
2679 adcroft 1.44 ;;
2680 jmc 1.236 ./FC_NAMEMANGLE.h)
2681 edhill 1.141 ignore_f=t
2682 adcroft 1.44 ;;
2683 jmc 1.236 ./BUILD_INFO.h)
2684 edhill 1.141 ignore_f=t
2685     ;;
2686 jmc 1.236 ./EMBEDDED_FILES.h)
2687 edhill 1.141 ignore_f=t
2688 edhill 1.98 ;;
2689 jmc 1.236 *)
2690 edhill 1.131 # For the local directory *ONLY*,
2691     # ignore all soft-links
2692     if test "x$HAVE_TEST_L" = xt -a "x$d" = x. -a -L $sf ; then
2693     ignore_f=t
2694     else
2695     touch .links.tmp/$sf
2696     deplist="$deplist $sf"
2697     fi
2698 adcroft 1.44 ;;
2699 jmc 1.236 esac
2700 edhill 1.131 if test "x$ignore_f" = xf ; then
2701     extn=`echo $sf | $AWK -F. '{print $NF}'`
2702     case $extn in
2703 jmc 1.176 F)
2704     echo " \\" >> F77srclist.tmp
2705     printf " $sf" >> F77srclist.tmp
2706 jmc 1.256 if test "x$OPENAD" = x ; then
2707     basename=${sf%%.F}
2708     isAD=`egrep ^$basename.f'[ ]*' adSrcFiles.tmp`
2709     if test -z "$isAD" ; then
2710     echo " \\" >> nonADF77srclist.tmp
2711     printf " $sf" >> nonADF77srclist.tmp
2712     fi
2713     else #- OpenAD case:
2714 jmc 1.176 basename=${sf%%.F}
2715     isAD=`egrep ^$basename.f'[ ]*' adSrcFiles.tmp`
2716 jmc 1.206 if test -z "$isAD" ; then
2717 jmc 1.176 toBeIgnored=`egrep ^$basename'[ ]*' ${OAD_DONT_COMPILE}`
2718 jmc 1.206 if test -z "$toBeIgnored" ; then
2719 jmc 1.176 echo " \\" >> nonADF77srclist.tmp
2720     printf " $sf" >> nonADF77srclist.tmp
2721 jmc 1.206 else
2722 jmc 1.176 echo " not to be compiled : $sf"
2723     fi
2724 jmc 1.206 else # file is initially listed as an AD file we want to exclude it
2725 jmc 1.176 # or we want to retain the untransformed version
2726     notToBeTransformed=`egrep ^$basename'[ ]*' ${OAD_DONT_TRANSFORM}`
2727     untransformedVersionToBeKept=`egrep ^$basename'[ ]*' ${OAD_KEEP_ORIGINAL}`
2728 jmc 1.206 if test -n "$notToBeTransformed"; then
2729 jmc 1.176 echo " not to be transformed: $sf"
2730     fi
2731     if test -n "$untransformedVersionToBeKept" ; then
2732     echo " original to be kept : $sf"
2733 jmc 1.206 fi
2734 jmc 1.176 if test -n "$notToBeTransformed" -o -n "$untransformedVersionToBeKept" ; then
2735     echo " \\" >> nonADF77srclist.tmp
2736     printf " $sf" >> nonADF77srclist.tmp
2737     fi
2738     fi
2739     fi
2740     ;;
2741     F90)
2742     echo " \\" >> F90srclist.tmp
2743     printf " $sf" >> F90srclist.tmp
2744     ;;
2745     c)
2746     echo " \\" >> csrclist.tmp
2747     printf " $sf" >> csrclist.tmp
2748     ;;
2749     h)
2750     echo " \\" >> hsrclist.tmp
2751     printf " $sf" >> hsrclist.tmp
2752     ;;
2753 jmc 1.236 flow)
2754 jmc 1.176 echo " \\" >> ad_flow_files.tmp
2755     printf " $sf" >> ad_flow_files.tmp
2756     ;;
2757     esac
2758     fi
2759 edhill 1.1 fi
2760     fi
2761     done
2762     if test "x$deplist" != x ; then
2763 jmc 1.176 if test "$d" != "." ; then
2764 jmc 1.236 echo "" >> srclinks.tmp
2765 edhill 1.2 echo "# These files are linked from $d" >> srclinks.tmp
2766 edhill 1.1 echo "$deplist :" >> srclinks.tmp
2767 jahn 1.170 # We need to make sure that the link isn't already there.
2768     # This may happen when make thinks that a header file has to be "remade"
2769     # because a module it depends on has changed. In this case we do nothing.
2770     printf "\tif [ ! -L \$@ ]; then \$(LN) %s/\$@ \$@; fi\n" $d >> srclinks.tmp
2771 jmc 1.176 fi
2772 edhill 1.1 fi
2773     done
2774     rm -rf .links.tmp
2775 jmc 1.176 echo "" >> F77srclist.tmp
2776     echo "" >> nonADF77srclist.tmp
2777     echo "" >> csrclist.tmp
2778     echo "" >> F90srclist.tmp
2779     echo "" >> hsrclist.tmp
2780     echo "" >> ad_flow_files.tmp
2781 edhill 1.1
2782 jmc 1.192 CMDLINE=$0
2783     for xx in "$@" ; do nw=`echo $xx | wc -w`
2784     if test $nw = '1' ; then CMDLINE="$CMDLINE $xx"
2785 jmc 1.237 else CMDLINE="$CMDLINE '$xx'" ; fi
2786 jmc 1.192 done
2787    
2788 edhill 1.88 if test -f $MAKEFILE ; then
2789 jmc 1.205 mv -f $MAKEFILE "$MAKEFILE.old"
2790 edhill 1.1 fi
2791     echo " Writing makefile: $MAKEFILE"
2792     echo "# Multithreaded + multi-processing makefile for:" > $MAKEFILE
2793     echo "# $MACHINE" >> $MAKEFILE
2794     echo "# This makefile was generated automatically on" >> $MAKEFILE
2795     echo "# $THISDATE" >> $MAKEFILE
2796     echo "# by the command:" >> $MAKEFILE
2797 jmc 1.192 echo "# $CMDLINE" >> $MAKEFILE
2798 edhill 1.1 echo "# executed by:" >> $MAKEFILE
2799 edhill 1.97 echo "# ${THISUSER}@${THISHOST}:${THISCWD}" >> $MAKEFILE
2800 edhill 1.21
2801     EXE_AD=$EXECUTABLE"_ad"
2802     EXE_FTL=$EXECUTABLE"_ftl"
2803     EXE_SVD=$EXECUTABLE"_svd"
2804    
2805 edhill 1.1 cat >>$MAKEFILE <<EOF
2806 edhill 1.53 #
2807     # OPTFILE="$OPTFILE"
2808 jmc 1.205 #
2809 edhill 1.1 # BUILDDIR : Directory where object files are written
2810     # SOURCEDIRS : Directories containing the source (.F) files
2811     # INCLUDEDIRS : Directories containing the header-source (.h) files
2812     # EXEDIR : Directory where executable that is generated is written
2813     # EXECUTABLE : Full path of executable binary
2814     #
2815     # CPP : C-preprocessor command
2816     # INCLUDES : Directories searched for header files
2817     # DEFINES : Macro definitions for CPP
2818     # MAKEDEPEND : Dependency generator
2819     # FC : Fortran compiler command
2820     # FFLAGS : Configuration/debugging options for FC
2821     # FOPTIM : Optimization options for FC
2822     # LINK : Command for link editor program
2823     # LIBS : Library flags /or/ additional optimization/debugging flags
2824    
2825     ROOTDIR = ${ROOTDIR}
2826 jmc 1.205 BUILDDIR = ${BUILDDIR}
2827 edhill 1.1 SOURCEDIRS = ${SOURCEDIRS}
2828     INCLUDEDIRS = ${INCLUDEDIRS}
2829     EXEDIR = ${EXEDIR}
2830     EXECUTABLE = \$(EXEDIR)/${EXECUTABLE}
2831     TOOLSDIR = ${TOOLSDIR}
2832 heimbach 1.242 OADTOOLS = ${OADTOOLS}
2833 edhill 1.1
2834 edhill 1.14 #eh3 new defines for the adjoint work
2835     AUTODIFF = ${ROOTDIR}/pkg/autodiff
2836 edhill 1.21 EXE_AD = ${EXE_AD}
2837     EXE_FTL = ${EXE_FTL}
2838     EXE_SVD = ${EXE_SVD}
2839 edhill 1.14
2840 adcroft 1.44 ENABLED_PACKAGES = ${ENABLED_PACKAGES}
2841     DISABLED_PACKAGES = ${DISABLED_PACKAGES}
2842    
2843 adcroft 1.52 # These files are created by Makefile
2844 edhill 1.97 SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h BUILD_INFO.h
2845 edhill 1.141 EOF
2846 adcroft 1.52
2847 edhill 1.141 if test "x$EMBED_SRC" = xt ; then
2848     echo "EMBEDDED_FILES = EMBEDDED_FILES.h" >>$MAKEFILE
2849     else
2850     echo "EMBEDDED_FILES = " >>$MAKEFILE
2851     fi
2852 edhill 1.1
2853 jahn 1.247 # extract default cpp search path so we can pass it to makedepend
2854     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}'`
2855    
2856 edhill 1.1 cat >>$MAKEFILE <<EOF
2857     # Unix ln (link)
2858     LN = ${LN}
2859     # Dependency generator
2860     MAKEDEPEND = ${MAKEDEPEND}
2861     # Special preprocessor (KAP on DECs, FPP on Crays)
2862     KPP = ${KPP}
2863     # Fortran compiler
2864 edhill 1.94 FC = ${FC}
2865 cnh 1.3 # Fortran compiler
2866     F90C = ${F90C}
2867 edhill 1.92 # C compiler
2868     CC = ${CC}
2869 edhill 1.1 # Link editor
2870 edhill 1.70 LINK = ${LINK} ${LDADD}
2871 edhill 1.1
2872     # Defines for CPP
2873     DEFINES = ${DEFINES}
2874     # Includes for CPP
2875     INCLUDES = ${INCLUDES}
2876 jahn 1.247 # default CPP includes for makedepend
2877     CPPINCLUDES = ${CPPINCLUDES}
2878 edhill 1.1 # Flags for KPP
2879     KFLAGS1 = ${KFLAGS1}
2880     KFLAGS2 = ${KFLAGS2}
2881     # Optim./debug for FC
2882 mlosch 1.165 FFLAGS = ${FFLAGS} ${FEXTRAFLAGS}
2883 edhill 1.1 FOPTIM = ${FOPTIM}
2884 cnh 1.3 # Optim./debug for FC
2885     F90FLAGS = ${F90FLAGS}
2886     F90OPTIM = ${F90OPTIM}
2887 jmc 1.176 F90FIXEDFORMAT = ${F90FIXEDFORMAT}
2888 edhill 1.1 # Flags for CC
2889     CFLAGS = ${CFLAGS}
2890     # Files that should not be optimized
2891     NOOPTFILES = ${NOOPTFILES}
2892     NOOPTFLAGS = ${NOOPTFLAGS}
2893     # Flags and libraries needed for linking
2894 edhill 1.107 LIBS = ${LIBS}
2895 jmc 1.228 # Name of the makefile
2896 jmc 1.238 MAKEFILE = ${MAKEFILE}
2897     # Name of the make program
2898     MAKE = ${MAKE}
2899 edhill 1.1
2900     EOF
2901    
2902 jmc 1.176 cat F77srclist.tmp >> $MAKEFILE
2903     cat nonADF77srclist.tmp >> $MAKEFILE
2904     cat csrclist.tmp >> $MAKEFILE
2905     cat F90srclist.tmp >> $MAKEFILE
2906     cat hsrclist.tmp >> $MAKEFILE
2907     cat ad_flow_files.tmp >> $MAKEFILE
2908    
2909     rm -f F77srclist.tmp nonADF77srclist.tmp csrclist.tmp F90srclist.tmp hsrclist.tmp ad_flow_files.tmp
2910    
2911 edhill 1.75 echo >> $MAKEFILE
2912 jmc 1.176
2913 jmc 1.205 # add definitions for preprocessed sources
2914     # and note that not all systems allow case sensitive extensions
2915     # hence the $FS and $FS90 here.
2916     # for fixed format f90 files we use ff90 or FF90 resp
2917 jmc 1.176 # but these are not expected to be the original source files
2918    
2919     echo 'F77_PP_SRC_FILES = $(F77_SRC_FILES:.F=.'$FS')' >> $MAKEFILE
2920     echo 'F90_PP_SRC_FILES = $(F90_SRC_FILES:.F90=.'$FS90')' >> $MAKEFILE
2921     echo 'OBJFILES= $(F77_SRC_FILES:.F=.o) $(C_SRC_FILES:.c=.o) $(F90_SRC_FILES:.F90=.o)' >> $MAKEFILE
2922 jmc 1.236 echo 'FLOWFILES = $(AD_FLOW_FILES:.flow=.flowdir)' >> $MAKEFILE
2923 edhill 1.75 echo >> $MAKEFILE
2924     echo '.SUFFIXES:' >> $MAKEFILE
2925 jmc 1.176 echo '.SUFFIXES: .o .'$FS' .p .F .c .f'$FS90' .'$FS90' .FF90 .F90 .flowdir .flow' >> $MAKEFILE
2926 edhill 1.1
2927     cat >>$MAKEFILE <<EOF
2928    
2929 jmc 1.238 all: fwd_exe_target
2930     fwd_exe_target:
2931     @echo Update AD_CONFIG.h and make \$(EXECUTABLE)
2932     @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Forward version" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN > ad_config.template
2933     @cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
2934     @-rm -f ad_config.template
2935     \$(MAKE) -f \$(MAKEFILE) \$(EXECUTABLE)
2936    
2937 jmc 1.176 \$(EXECUTABLE): \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(OBJFILES) \$(EMBEDDED_FILES)
2938 adcroft 1.44 @echo Creating \$@ ...
2939 edhill 1.1 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
2940 jmc 1.222
2941 edhill 1.1 depend:
2942 jmc 1.238 @\$(MAKE) -f \$(MAKEFILE) links
2943 jahn 1.247 \$(MAKEDEPEND) -f \$(MAKEFILE) -o .$FS \$(DEFINES) \$(INCLUDES) \$(CPPINCLUDES) \$(F77_SRC_FILES)
2944 adcroft 1.44 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
2945 edhill 1.72 -rm -f makedepend.out
2946 edhill 1.1
2947 cnh 1.132 lib: libmitgcmuv.a
2948    
2949     libmitgcmuv.a: \$(OBJFILES)
2950     ar rcv libmitgcmuv.a \$(OBJFILES)
2951 cnh 1.159 ar d libmitgcmuv.a main.o
2952 cnh 1.132
2953 jmc 1.222 obj: \$(OBJFILES)
2954    
2955 jmc 1.176 links: \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(SPECIAL_FILES)
2956 edhill 1.1
2957 jmc 1.176 small_f: \$(F77_PP_SRC_FILES) \$(F90_PP_SRC_FILES)
2958 edhill 1.1
2959     output.txt: \$(EXECUTABLE)
2960     @printf 'running ... '
2961     @\$(EXECUTABLE) > \$@
2962    
2963 jmc 1.210 # remove most of the files that "make" generates
2964 edhill 1.1 clean:
2965 heimbach 1.157 -rm -rf *.p *.$FS90 *.mod ${RMFILES} work.{pc,pcl} *.template
2966     -rm -rf *.o
2967 dfer 1.172 -rm -rf *.$FS *.flowdir
2968 utke 1.193 -rm -rf *.f$FS90 \$(AD_CLEAN) ad_input*
2969 jmc 1.210
2970     # remove most of the files that "make" and "make depend" generate
2971 edhill 1.1 Clean:
2972 jmc 1.238 @\$(MAKE) -f \$(MAKEFILE) clean
2973     @\$(MAKE) -f \$(MAKEFILE) cleanlinks
2974 jmc 1.215 -rm -f \$(SPECIAL_FILES) f90mkdepend.log $MAKEFILE.old
2975 jmc 1.233 -rm -f taf_command taf_output taf_ad.log taf_ad_flow.log taf_ftl.log
2976 jmc 1.210
2977     # remove also the executable, files that "genmake2" generates (except Makefile)
2978 jmc 1.211 # and output from a run (plus log files from testreport)
2979 edhill 1.1 CLEAN:
2980 jmc 1.238 @\$(MAKE) -f \$(MAKEFILE) Clean
2981 jmc 1.233 -rm -f \$(EXECUTABLE) \$(EXE_AD) \$(EXE_FTL) *.bak
2982 jmc 1.219 -rm -f $LOGFILE genmake_state genmake_*optfile
2983     -rm -f SIZE.h.mpi genmake.tr_log make.tr_log
2984 jmc 1.251 -rm -rf mpi_headers mnc_test_*
2985 edhill 1.1 -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
2986     -find \$(EXEDIR) -name "*.data" -exec rm {} \;
2987     -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
2988 jmc 1.252 -rm -f *.txt STDOUT.* STDERR.* *diagnostics.log *.[0-9][0-9][0-9][0-9].log
2989     -rm -f datetime costfinal divided.ctrl snapshot* output_adm.txt.diva_*
2990     -rm -f *_MIT_CE_000.opt0000 costfunction*0000
2991 jmc 1.253 -rm -f oad_cp.[0-9][0-9][0-9].?????
2992 edhill 1.1
2993     makefile:
2994 edhill 1.73 $THIS_SCRIPT $G2ARGS
2995 edhill 1.1 cleanlinks:
2996     -find . -type l -exec rm {} \;
2997    
2998 jmc 1.176 # Special targets (SPECIAL_FILES) which are created by make
2999 adcroft 1.44 ${PACKAGES_DOT_H}:
3000     @echo Creating \$@ ...
3001 jmc 1.238 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines -bPACKAGES_CONFIG_H "Disabled packages:" \$(DISABLED_PACKAGES) " " "Enabled packages:" \$(ENABLED_PACKAGES) > \$@
3002 adcroft 1.44 AD_CONFIG.h:
3003     @echo Creating \$@ ...
3004 jmc 1.238 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Default version" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN > \$@
3005 adcroft 1.52 FC_NAMEMANGLE.h:
3006     @echo Creating \$@ ...
3007     echo "$FC_NAMEMANGLE" > \$@
3008 adcroft 1.44
3009 edhill 1.97 BUILD_INFO.h:
3010     @echo Creating \$@ ...
3011     EOF
3012    
3013     test ! "x$THISVER" = x && echo " -echo \"#define THISVER '$THISVER'\" > \$@" >> $MAKEFILE
3014     test ! "x$THISUSER" = x && echo " -echo \"#define THISUSER '$THISUSER'\" >> \$@" >> $MAKEFILE
3015     test ! "x$THISDATE" = x && echo " -echo \"#define THISDATE '$THISDATE'\" >> \$@" >> $MAKEFILE
3016     test ! "x$THISHOST" = x && echo " -echo \"#define THISHOST '$THISHOST'\" >> \$@" >> $MAKEFILE
3017    
3018 edhill 1.141 if test "x$EMBED_SRC" = xt ; then
3019     cat >>$MAKEFILE <<EOF
3020    
3021     decode_files.o : EMBEDDED_FILES.h
3022    
3023 jmc 1.205 ## \$(F77_PP_SRC_FILES)
3024 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
3025 edhill 1.141 @echo Creating \$@ ...
3026 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
3027 edhill 1.141 -rm -f all_fF.tar.gz
3028     -gzip all_fF.tar
3029    
3030     EMBEDDED_FILES.h : all_fF.tar.gz
3031     @echo Creating \$@ ...
3032     -\${ROOTDIR}/tools/embed_encode/encode_files EMBEDDED_FILES.h all_fF.tar.gz
3033    
3034     EOF
3035     fi
3036    
3037 edhill 1.97 cat >>$MAKEFILE <<EOF
3038    
3039 edhill 1.76 # The normal chain of rules is ( .F - .$FS - .o )
3040    
3041 edhill 1.101 ## This nullifies any default implicit rules concerning these two file types:
3042 jmc 1.177 ## %.o : %.F
3043 edhill 1.76
3044 jmc 1.244 # C preprocessing and replacing the _d in constants:
3045 utke 1.241 CPPCMD = cat \$< | ${CPP} \$(DEFINES) \$(INCLUDES) | ${S64}
3046    
3047 edhill 1.76 .F.$FS:
3048 utke 1.241 \$(CPPCMD) > \$@
3049 edhill 1.76 .$FS.o:
3050 edhill 1.1 \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
3051 jmc 1.214 .F.o:
3052     \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
3053 jmc 1.176 .F90.$FS90:
3054 utke 1.241 \$(CPPCMD) > \$@
3055 jmc 1.176 .FF90.f$FS90:
3056 utke 1.241 \$(CPPCMD) > \$@
3057 jmc 1.176 .$FS90.o:
3058 cnh 1.3 \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
3059 jmc 1.176 .f$FS90.o:
3060     cp \$< \$(basename \$<).f90
3061     \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$(F90FIXEDFORMAT) \$(basename \$<).f90
3062 edhill 1.1 .c.o:
3063 ce107 1.139 \$(CC) \$(CFLAGS) \$(DEFINES) \$(INCLUDES) -c \$<
3064 dfer 1.172 .flow.flowdir:
3065 utke 1.241 \$(CPPCMD) > \$@
3066 edhill 1.1
3067 edhill 1.76 # Special exceptions that use the ( .F - .p - .$FS - .o ) rule-chain
3068     .F.p:
3069 utke 1.241 \$(CPPCMD) > \$@
3070 edhill 1.76 .p.$FS:
3071 edhill 1.1 \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
3072 edhill 1.14
3073 jmc 1.176 EOF
3074    
3075 edhill 1.14 #=========================================
3076     #=== Automatic Differentiation Rules ===
3077 jmc 1.176 #=== for TAMC/TAF ======================
3078    
3079 jmc 1.206 if test "x$OPENAD" = x ; then
3080 jmc 1.176
3081     cat >>$MAKEFILE <<EOF
3082 edhill 1.14
3083     TAMC = ${TAMC}
3084     TAF = ${TAF}
3085    
3086 edhill 1.17 TAF_EXTRA = ${TAF_EXTRA}
3087     TAMC_EXTRA = ${TAMC_EXTRA}
3088 jmc 1.251 LOCAL_MPI_HEADERS = ${LOCAL_MPI_HEADERS}
3089 edhill 1.17
3090 edhill 1.14 EOF
3091    
3092     ad_vars="AD_TAMC_FLAGS AD_TAF_FLAGS"
3093     ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF_FLAGS"
3094     ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
3095     for i in $ad_vars ; do
3096     name=$i
3097 edhill 1.151 t1="t2=\$"`echo "$i"`
3098 edhill 1.14 eval $t1
3099     printf "%-20s = " $name >> $MAKEFILE
3100 edhill 1.151 echo "$t2" | sed -e 's| \+| |g' >> $MAKEFILE
3101 edhill 1.14 done
3102    
3103     echo " Add the source list for AD code generation"
3104     echo >> $MAKEFILE
3105 edhill 1.71 printf "AD_FILES = " >> $MAKEFILE
3106 jmc 1.176 AD_FILES=`cat adSrcFiles.tmp`
3107 edhill 1.14 for i in $AD_FILES ; do
3108     echo " \\" >> $MAKEFILE
3109 edhill 1.71 printf " $i" >> $MAKEFILE
3110 edhill 1.14 done
3111     echo >> $MAKEFILE
3112 jmc 1.176 rm -f adSrcFiles.tmp
3113 edhill 1.14
3114     cat >>$MAKEFILE <<EOF
3115    
3116 edhill 1.16 # ... AD ...
3117 jmc 1.238 adall: ad_exe_target
3118 edhill 1.121 adtaf: ad_taf_output.$FS
3119     adtamc: ad_tamc_output.$FS
3120 edhill 1.21
3121 jmc 1.238 ad_exe_target:
3122     @echo Update AD_CONFIG.h and make \$(EXE_AD)
3123     @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Adjoint version" -bAD_CONFIG_H -DALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN > ad_config.template
3124     @cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
3125     @-rm -f ad_config.template
3126     \$(MAKE) -f \$(MAKEFILE) \$(EXE_AD)
3127    
3128 jmc 1.256 ad_input_code.$FS: \$(AD_FILES) \$(AD_FLOW_FILES)
3129 jmc 1.238 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Adjoint version" -bAD_CONFIG_H -DALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN > ad_config.template
3130 edhill 1.23 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
3131 jmc 1.238 @-rm -f ad_config.template
3132     @\$(MAKE) -f \$(MAKEFILE) \$(F77_PP_SRC_FILES)
3133     @\$(MAKE) -f \$(MAKEFILE) \$(FLOWFILES)
3134 jmc 1.256 cat \$(FLOWFILES) \$(AD_FILES) | sed -f \$(TOOLSDIR)/remove_comments_sed > ad_input_code.$FS
3135 edhill 1.22
3136 edhill 1.121 ad_taf_output.$FS: ad_input_code.$FS
3137     \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
3138 jmc 1.173 ls -l ad_input_code_ad.$FS
3139 edhill 1.121 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
3140 heimbach 1.37
3141     adtafonly:
3142 edhill 1.121 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
3143 jmc 1.173 ls -l ad_input_code_ad.$FS
3144 edhill 1.121 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
3145 edhill 1.14
3146 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)
3147     \$(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)
3148 edhill 1.14
3149 edhill 1.121 ad_tamc_output.$FS: ad_input_code.$FS
3150     \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.$FS
3151     cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.$FS
3152 edhill 1.14
3153     ad_tamc: ad_tamc_output.o \$(OBJFILES)
3154 jmc 1.206 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
3155 edhill 1.14
3156 heimbach 1.105 adonlyfwd:
3157 edhill 1.106 patch < \$(TOOLSDIR)/ad_taf_output.f.onlyfwd.diff
3158 jmc 1.206
3159 heimbach 1.105 adtrick:
3160 edhill 1.106 patch < \$(TOOLSDIR)/ad_taf_output.f.adtrick.diff
3161 edhill 1.14
3162 jmc 1.226 adobj: ad_taf_output.o \$(OBJFILES)
3163    
3164 edhill 1.19 # ... FTL ...
3165 jmc 1.238 ftlall: ftl_exe_target
3166 edhill 1.121 ftltaf: ftl_taf_output.$FS
3167     ftltamc: ftl_tamc_output.$FS
3168 edhill 1.21
3169 jmc 1.238 ftl_exe_target:
3170     @echo Update AD_CONFIG.h and make \$(EXE_FTL)
3171     @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "TangLin version" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -DALLOW_TANGENTLINEAR_RUN > ad_config.template
3172     @cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
3173     @-rm -f ad_config.template
3174     \$(MAKE) -f \$(MAKEFILE) \$(EXE_FTL)
3175    
3176 jmc 1.256 ftl_input_code.$FS: \$(AD_FILES)
3177 jmc 1.238 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "TangLin version" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -DALLOW_TANGENTLINEAR_RUN > ad_config.template
3178     cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
3179     @-rm -f ad_config.template
3180     @\$(MAKE) -f \$(MAKEFILE) \$(F77_PP_SRC_FILES)
3181     @\$(MAKE) -f \$(MAKEFILE) \$(AD_FLOW_FILES)
3182 jmc 1.256 cat \$(AD_FLOW_FILES) \$(AD_FILES) | sed -f \$(TOOLSDIR)/remove_comments_sed > ftl_input_code.$FS
3183 edhill 1.22
3184 edhill 1.121 ftl_taf_output.$FS: ftl_input_code.$FS
3185     \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
3186 heimbach 1.254 ls -l ftl_input_code_tl.$FS
3187     cat ftl_input_code_tl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
3188 edhill 1.14
3189 heimbach 1.40 ftltafonly:
3190 edhill 1.121 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
3191 heimbach 1.254 ls -l ftl_input_code_tl.$FS
3192     cat ftl_input_code_tl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
3193 heimbach 1.40
3194 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)
3195     \$(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)
3196 edhill 1.14
3197 edhill 1.121 ftl_tamc_output.$FS: ftl_input_code.$FS
3198     \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.$FS
3199     cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.$FS
3200 edhill 1.16
3201 edhill 1.19 ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
3202 jmc 1.206 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
3203 edhill 1.16
3204     # ... SVD ...
3205 edhill 1.121 svdtaf: ad_taf_output.$FS ftl_taf_output.$FS
3206 heimbach 1.109 @echo "--->>> Only ran TAF to generate SVD code! <<<---"
3207     @echo "--->>> Do make svdall afterwards to compile. <<<---"
3208     svdall: svd_touch svd_taf
3209 edhill 1.16
3210 heimbach 1.109 svd_taf: \$(OBJFILES)
3211 heimbach 1.40 \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
3212 edhill 1.14
3213 heimbach 1.109 @echo "--->>> Only COMPILE svd code! <<<---"
3214     @echo "--->>> Assumes you previously <<<---"
3215     @echo "--->>> did make svdtaf <<<---"
3216    
3217     svd_touch:
3218     @echo "--->>> Only COMPILE svd code! <<<---"
3219     @echo "--->>> Assumes you previously <<<---"
3220     @echo "--->>> did make svdtaf <<<---"
3221 edhill 1.121 touch ad_taf_output.$FS ftl_taf_output.$FS
3222     \$(FC) \$(FFLAGS) \$(FOPTIM) -c ad_taf_output.$FS
3223     \$(FC) \$(FFLAGS) \$(FOPTIM) -c ftl_taf_output.$FS
3224 jmc 1.238 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "SVD version" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -DALLOW_TANGENTLINEAR_RUN > ad_config.template
3225     cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
3226     @-rm -f ad_config.template
3227 edhill 1.14
3228 jmc 1.176 EOF
3229    
3230 jmc 1.206 fi
3231 jmc 1.176
3232     #=== for OpenAD ========================
3233    
3234 jmc 1.206 if test "x$OPENAD" != x ; then
3235 jmc 1.176
3236     # ============ begin OpenAD specific section ==============
3237    
3238     cat >>$MAKEFILE <<EOF
3239    
3240 jmc 1.206 # all the source files linked from the various locations:
3241 jmc 1.176 ALL_LINKED_FILES= \
3242     \$(F77_SRC_FILES) \
3243     \$(C_SRC_FILES) \
3244     \$(H_SRC_FILES) \
3245     \$(F90_SRC_FILES) \
3246     \$(SPECIAL_FILES)
3247    
3248     ifndef OPENADROOT
3249     \$(error "Error: environment variable OPENADROOT not defined!")
3250     endif
3251    
3252     ifndef XAIFSCHEMAROOT
3253     \$(error "Error: environment variable XAIFSCHEMAROOT not defined!")
3254     endif
3255    
3256     ifndef XAIFBOOSTERROOT
3257     \$(error "Error: environment variable XAIFBOOSTERROOT not defined!")
3258     endif
3259    
3260     EOF
3261    
3262     echo " Add the source list for common block to module conversion "
3263     echo >> $MAKEFILE
3264     printf "CB2M_F90_SRC_NAMES = " >> $MAKEFILE
3265     for i in `cat ${OAD_CB2M_FILES}` ; do
3266     echo " \\" >> $MAKEFILE
3267     printf " $i" >> $MAKEFILE
3268     done
3269     echo >> $MAKEFILE
3270    
3271     echo " Add the source list for AD code generation"
3272     echo >> $MAKEFILE
3273     printf "AD_FILES = " >> $MAKEFILE
3274     for i in `cat ${OAD_CB2M_FILES}` ; do
3275     echo " \\" >> $MAKEFILE
3276     printf " ${i}_mod.f$FS90" >> $MAKEFILE
3277     done
3278     AD_FILES=`cat adSrcFiles.tmp`
3279     for i in $AD_FILES ; do
3280     basename=${i%%.f}
3281     toBeIgnored=`egrep ^$basename'[ ]*' ${OAD_DONT_COMPILE} ${OAD_DONT_TRANSFORM}`
3282     if test -z "$toBeIgnored" ; then
3283     echo " \\" >> $MAKEFILE
3284     printf " $i" >> $MAKEFILE
3285     fi
3286     done
3287     echo >> $MAKEFILE
3288     rm -f adSrcFiles.tmp
3289    
3290     cat >>$MAKEFILE <<EOF
3291    
3292 jmc 1.206 adAll: \$(EXE_AD)
3293 jmc 1.176 .PHONY: adAll
3294    
3295     CB2M_F90_PP_SRC_FILES=\$(addsuffix _mod.f$FS90, \$(CB2M_F90_SRC_NAMES))
3296    
3297     .PRECIOUS: \$(CB2M_F90_PP_SRC_FILES) \$(NON_AD_F77_SRC_FILES:.F=_cb2m.f$FS90)
3298    
3299     .PHONY: adDepend
3300     adDepend: \$(ALL_LINKED_FILES) \$(addsuffix _mod.h, \$(CB2M_F90_SRC_NAMES)) \$(addsuffix _mod.FF90, \$(CB2M_F90_SRC_NAMES)) \$(F77_SRC_FILES:.F=_cb2m.FF90)
3301 jmc 1.229 \$(MAKEDEPEND) -f \$(MAKEFILE) -o .$FS \$(DEFINES) \$(INCLUDES) \$(F77_SRC_FILES)
3302 jmc 1.176 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
3303     -rm -f makedepend.out
3304    
3305     OPENAD_SUPPORT_F90_SRC_FILES = \
3306     w2f__types.F90 \
3307     OAD_active.F90 \
3308     OAD_cp.F90 \
3309     OAD_rev.F90 \
3310 utke 1.249 OAD_tape.F90 \
3311     revolve.F90
3312 jmc 1.176
3313     OPENAD_SUPPORT_C_SRC_FILES = \
3314     iaddr.c \
3315     timeRatio.c
3316    
3317     f95_test_mods.f90: \$(OPENAD_SUPPORT_F90_SRC_FILES:F90=$FS90)
3318     cat \$^ > \$@
3319    
3320 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
3321 jmc 1.176 cat \$^ > \$@
3322    
3323     f95_test.out: f95_test_mods.f90 f95_test.f90
3324     f95 -fixed -w=unused -maxcontin=132 -c f95_test_mods.f90 > \$@ 2>&1
3325     f95 -fixed -w=unused -maxcontin=132 -c -fixed f95_test.f90 >> \$@ 2>&1
3326    
3327 utke 1.235 CB2M_AD_FILES=\$(AD_FILES:.f=_cb2m.f$FS90)
3328 utke 1.193
3329 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)
3330 utke 1.193
3331     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)
3332    
3333 utke 1.235 \$(EXE_AD): \$(ALL_LINKED_FILES) \$(addsuffix _mod.h, \$(CB2M_F90_SRC_NAMES)) postProcess.tag \$(AD_OBJ_FILES_S2)
3334 utke 1.193 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(AD_OBJ_FILES_S2) \$(LIBS)
3335 jmc 1.176
3336 utke 1.235 # create sources files modules from header files containing common blocks
3337 heimbach 1.242 %_mod.FF90 : %.h \${OADTOOLS}/cb2mGetModules.csh \${OADTOOLS}/cb2mGetModules.awk
3338     \${OADTOOLS}/cb2mGetModules.csh $< \${OADTOOLS}/cb2mGetModules.awk
3339 jmc 1.176
3340 jmc 1.236 # create new header files with USE statements for the new modules made above
3341 heimbach 1.242 %_mod.h : %.h \${OADTOOLS}/cb2mGetHeaders.csh \${OADTOOLS}/cb2mGetHeaders.awk
3342     \${OADTOOLS}/cb2mGetHeaders.csh $< \${OADTOOLS}/cb2mGetHeaders.awk \$(CB2M_F90_SRC_NAMES)
3343 jmc 1.176
3344 utke 1.235 # change the include directives of everybody to refer to the new header files with the USE statements
3345 heimbach 1.242 %_cb2m.FF90 : %.F \${OADTOOLS}/cb2mUseModules.bash
3346     \${OADTOOLS}/cb2mUseModules.bash $< ${MPI}
3347 jmc 1.176
3348     # makefile debug rule
3349     small_f: \$(CB2M_F90_PP_SRC_FILES)
3350     .PHONY: small_f
3351    
3352     ad_output.txt: \$(EXE_AD)
3353     @printf 'linking data files ... '
3354     \$(LN) -f ../input_ad/data* ../input_ad/eedata .
3355     \$(LN) -f ../../global_ocean.90x40x15/input/*.bin .
3356     @printf 'running ... '
3357     @./\$(EXE_AD) > \$@
3358    
3359 utke 1.194 ad_input_code.f$FS90: \$(CB2M_AD_FILES)
3360 jmc 1.176 cat \$^ > \$@
3361    
3362 utke 1.235 # canonicalizer
3363 jmc 1.236 ad_input_code_sf.pre.f90 : \$(CB2M_AD_FILES)
3364 utke 1.235 \${OPENADFORTTK_BASE}/tools/SourceProcessing/preProcess.py --timing --r8 -H -S -o \$@ \$^
3365 jmc 1.176
3366 utke 1.235 # replace stop statements (to avoid the implied unstructured control flow) with print statements
3367     ad_input_code_sf.pre.s2p.f90 : ad_input_code_sf.pre.f90
3368 heimbach 1.242 cat \$< | sed -f \${OADTOOLS}/stop2print.sed > ad_input_code_sf.pre.s2p.f90
3369 jmc 1.176
3370     # F -> WHIRL
3371 utke 1.235 ad_input_code_sf.pre.s2p.B: ad_input_code_sf.pre.s2p.f90
3372     \${OPEN64ROOT}/crayf90/sgi/mfef90 -r8 -z -F ad_input_code_sf.pre.s2p.f90
3373 jmc 1.176
3374     # WHIRL -> XAIF
3375 jmc 1.236 ad_input_code_sf.pre.s2p.xaif : ad_input_code_sf.pre.s2p.B
3376 utke 1.235 \${OPENADFORTTK}/bin/whirl2xaif -s -n --debug 1 -o \$@ \$<
3377 jmc 1.176
3378     # XAIF -> XAIF'
3379 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
3380 utke 1.235 \${XAIFBOOSTERROOT}/xaifBooster/algorithms/BasicBlockPreaccumulationReverse/driver/oadDriver -f -t forward_step -i \$< -c \${XAIFSCHEMAROOT}/schema/examples/inlinable_intrinsics.xaif -o \$@ -I -r
3381 jmc 1.176
3382     # XAIF' -> WHIRL'
3383 jmc 1.236 ad_input_code_sf.pre.s2p.xb.x2w.B : ad_input_code_sf.pre.s2p.xb.xaif
3384 utke 1.235 \${OPENADFORTTK}/bin/xaif2whirl --debug 1 ad_input_code_sf.pre.s2p.B \$<
3385 jmc 1.176
3386     # WHIRL' -> F'
3387 jmc 1.236 ad_input_code_sf.pre.s2p.xb.x2w.w2f.f$FS90: ad_input_code_sf.pre.s2p.xb.x2w.B
3388 utke 1.235 \${OPEN64ROOT}/whirl2f/whirl2f -FLIST:ftn_file=\$@ -openad \$<
3389 jmc 1.176
3390     # insert template directives
3391 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
3392     \${OADTOOLS}/insertTemplateDir.bash \$< \$@
3393 jmc 1.176
3394 heimbach 1.242 PPEXTRAS=\$(wildcard \${OADTOOLS}/ad_template.*.F) \${OADTOOLS}/ad_inline.F
3395 jmc 1.176 # postprocess F'
3396 utke 1.235 postProcess.tag: ad_input_code_sf.pre.s2p.xb.x2w.w2f.td.f$FS90 \$(PPEXTRAS:.F=.f) | w2f__types.f90
3397 heimbach 1.242 \${OPENADFORTTK_BASE}/tools/SourceProcessing/postProcess.py --progress --timing --infoUnitFile w2f__types.f90 --outputFormat=fixed --separateOutput --pathSuffix "" --filenameSuffix "_oad" -m r -i \${OADTOOLS}/ad_inline.f \$<
3398 utke 1.235 # the target is a placeholder to trigger a single execution of the rule
3399 utke 1.193 touch \$@
3400 jmc 1.236 # put this so make knows about the postprocessing output
3401 utke 1.235 OAD_intrinsics_oad.f \$(CB2M_AD_FILES:.f$FS90=_oad.f): postProcess.tag
3402 jmc 1.176
3403 utke 1.235 # link the XAIF schema files
3404 jmc 1.176 %.xsd:
3405     \$(LN) \${XAIFSCHEMAROOT}/schema/\$@ .
3406    
3407     # link the support files:
3408 jmc 1.206 \$(OPENAD_SUPPORT_F90_SRC_FILES) \$(OPENAD_SUPPORT_C_SRC_FILES):
3409 heimbach 1.242 \$(LN) \${OADTOOLS}/\$@ .
3410 jmc 1.176
3411 utke 1.243 AD_CLEAN += *_mod.h *_mod.F90 *.FF90 *.mod-whirl temp.sed oad_cp.* postProcess.tag \$(PPEXTRAS:.F=.f)
3412 utke 1.193
3413 jmc 1.176 # ============ end OpenAD specific section ==============
3414 edhill 1.1
3415     EOF
3416 edhill 1.7
3417 jmc 1.176 fi
3418    
3419     #=========================================
3420    
3421 edhill 1.7 if test "x$EXEHOOK" != x ; then
3422     printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE
3423     fi
3424 edhill 1.1
3425     echo " Making list of \"exceptions\" that need \".p\" files"
3426     for i in $KPPFILES ; do
3427     base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
3428     RETVAL=$?
3429     if test "x$RETVAL" != x0 ; then
3430     echo "Error: unable to add file \"$i\" to the exceptions list"
3431     fi
3432 edhill 1.76 echo "$base.$FS: $base.p" >> $MAKEFILE
3433 edhill 1.1 done
3434    
3435     echo " Making list of NOOPTFILES"
3436     for i in $NOOPTFILES ; do
3437     base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
3438     RETVAL=$?
3439     if test "x$RETVAL" != x0 ; then
3440     echo "Error: unable to add file \"$i\" to the exceptions list"
3441     fi
3442 edhill 1.76 echo "$base.o: $base.$FS" >> $MAKEFILE
3443 edhill 1.2 printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE
3444 edhill 1.1 done
3445    
3446     echo " Add rules for links"
3447     cat srclinks.tmp >> $MAKEFILE
3448     rm -f srclinks.tmp
3449    
3450     echo " Adding makedepend marker"
3451 edhill 1.2 printf "\n\n# DO NOT DELETE\n" >> $MAKEFILE
3452 edhill 1.1
3453 edhill 1.2 printf "\n=== Done ===\n"
3454 adcroft 1.47
3455     # Create special header files
3456 jmc 1.238 $BASH $TOOLSDIR/convert_cpp_cmd2defines -bPACKAGES_CONFIG_H "Disabled packages:" $DISABLED_PACKAGES " " "Enabled packages:" $ENABLED_PACKAGES > $PACKAGES_DOT_H".tmp"
3457 adcroft 1.47 if test ! -f $PACKAGES_DOT_H ; then
3458     mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
3459     else
3460 edhill 1.61 cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H > /dev/null 2>&1
3461 adcroft 1.47 RETVAL=$?
3462     if test "x$RETVAL" = x0 ; then
3463     rm -f $PACKAGES_DOT_H".tmp"
3464     else
3465     mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"
3466     mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
3467     fi
3468     fi
3469     if test ! -f AD_CONFIG.h ; then
3470 jmc 1.238 $BASH $TOOLSDIR/convert_cpp_cmd2defines "Default version" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN > AD_CONFIG.h
3471 adcroft 1.47 fi
3472 edhill 1.5
3473     # Write the "state" for future records
3474 jmc 1.211 if test "x$DUMPSTATE" = xt ; then
3475 edhill 1.71 printf "" > genmake_state
3476 edhill 1.5 for i in $gm_state ; do
3477     t1="t2=\$$i"
3478     eval $t1
3479 jmc 1.222 echo "$i='$t2'" | sed -e 's/ */ /g' >> genmake_state
3480 edhill 1.5 done
3481     fi

  ViewVC Help
Powered by ViewVC 1.1.22