/[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.265 - (hide annotations) (download)
Fri Apr 4 21:34:01 2014 UTC (9 years, 11 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint64w, checkpoint64v
Changes since 1.264: +19 -11 lines
- OpenAD: change Makefile to generate the appropriate AD_CONFIG.h when
  building mitgcmuv_ad (make adAll).
- comment out target "output.txt" and "ad_output.txt"

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

  ViewVC Help
Powered by ViewVC 1.1.22