/[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.268 - (hide annotations) (download)
Sun Aug 10 16:46:04 2014 UTC (9 years, 7 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint65h, checkpoint65i, checkpoint65b, checkpoint65c, checkpoint65f, checkpoint65g, checkpoint65d, checkpoint65e
Changes since 1.267: +2 -2 lines
if permitted by the opt-file, switch to F90 compiler for OpenAD built

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

  ViewVC Help
Powered by ViewVC 1.1.22