/[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.213 - (hide annotations) (download)
Fri Nov 5 16:28:59 2010 UTC (8 years, 8 months ago) by jmc
Branch: MAIN
Changes since 1.212: +14 -9 lines
use CFLAGS to test C compiler (+ report in genmake.log file)

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