/[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.209 - (hide annotations) (download)
Mon Nov 1 00:20:28 2010 UTC (8 years, 11 months ago) by jmc
Branch: MAIN
Changes since 1.208: +5 -2 lines
- clean previous genmake log files before anything else.
- change Makefile to clean genmake log files only with "CLEAN" target
  (instead of "Clean")

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