/[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.208 - (hide annotations) (download)
Thu May 27 02:09:13 2010 UTC (9 years, 4 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint62k, checkpoint62j, checkpoint62i, checkpoint62h, checkpoint62m, checkpoint62l
Changes since 1.207: +81 -66 lines
- remove "-pdefault" option: redundant with the use of "packages.conf".
- remove file pkg/pkg_default : set the default as a pkg group
  ("default_pkg_list") defined in pkg/pkg_groups.
- fix for case pkg/pkg_depend is missing (was hanging before).
- add option "-pgroups" to specify a different pkg_groups than the default.

1 edhill 1.86 #! /usr/bin/env bash
2 edhill 1.1 #
3 jmc 1.208 # $Header: /u/gcmpack/MITgcm/tools/genmake2,v 1.207 2010/05/26 00:08:18 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 edhill 1.2 echo "=== Processing options files and arguments ==="
1171 edhill 1.12 gm_local="genmake_local"
1172 edhill 1.71 printf " getting local config information: "
1173 edhill 1.88 if test -f $gm_local ; then
1174 edhill 1.1 echo "using $gm_local"
1175 edhill 1.34 . $gm_local
1176 edhill 1.2 # echo "DISABLE=$DISABLE"
1177     # echo "ENABLE=$ENABLE"
1178 edhill 1.1 else
1179     echo "none found"
1180     fi
1181    
1182 edhill 1.103 #echo "$0::$1:$2:$3:$4:$5:$6:$7:"
1183 edhill 1.2 #parse_options
1184     ac_prev=
1185 edhill 1.102 for ac_option in "$@" ; do
1186 edhill 1.2
1187 edhill 1.73 G2ARGS="$G2ARGS \"$ac_option\""
1188    
1189 edhill 1.2 # If the previous option needs an argument, assign it.
1190     if test -n "$ac_prev"; then
1191     eval "$ac_prev=\$ac_option"
1192     ac_prev=
1193     continue
1194     fi
1195 jmc 1.206
1196 edhill 1.2 ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
1197 jmc 1.206
1198 edhill 1.2 case $ac_option in
1199    
1200     -help | --help | -h | --h)
1201     usage ;;
1202    
1203     -nooptfile | --nooptfile)
1204     OPTFILE="NONE" ;;
1205     -optfile | --optfile | -of | --of)
1206 edhill 1.4 ac_prev=OPTFILE ;;
1207 edhill 1.2 -optfile=* | --optfile=* | -of=* | --of=*)
1208     OPTFILE=$ac_optarg ;;
1209    
1210 edhill 1.50 -adoptfile | --adoptfile | -adof | --adof)
1211 edhill 1.14 ac_prev=AD_OPTFILE ;;
1212     -adoptfile=* | --adoptfile=* | -adof=* | --adof=*)
1213     AD_OPTFILE=$ac_optarg ;;
1214    
1215 edhill 1.2 -pdepend | --pdepend)
1216 jmc 1.208 ac_prev=PKG_DEPEND ;;
1217 edhill 1.2 -pdepend=* | --pdepend=*)
1218 jmc 1.208 PKG_DEPEND=$ac_optarg ;;
1219 edhill 1.2
1220 jmc 1.208 -pgroups | --pgroups)
1221     ac_prev=PKG_GROUPS ;;
1222     -pgroups=* | --pgroups=*)
1223     PKG_GROUPS=$ac_optarg ;;
1224 edhill 1.2
1225 edhill 1.6 -make | --make | -m | --m)
1226     ac_prev=MAKE ;;
1227     -make=* | --make=* | -m=* | --m=*)
1228     MAKE=$ac_optarg ;;
1229 edhill 1.69
1230 edhill 1.71 -bash | --bash)
1231     ac_prev=BASH ;;
1232     -bash=* | --bash=*)
1233     BASH=$ac_optarg ;;
1234    
1235 edhill 1.69 -makedepend | --makedepend | -md | --md)
1236     ac_prev=MAKEDEPEND ;;
1237     -makedepend=* | --makedepend=* | -md=* | --md=*)
1238     MAKEDEPEND=$ac_optarg ;;
1239 edhill 1.6
1240     -makefile | --makefile | -ma | --ma)
1241 edhill 1.4 ac_prev=MAKEFILE ;;
1242 edhill 1.6 -makefile=* | --makefile=* | -ma=* | --ma=*)
1243 edhill 1.2 MAKEFILE=$ac_optarg ;;
1244    
1245 edhill 1.41 -platform | --platform | -pl | --pl | -platform=* | --platform=* | -pl=* | --pl=*)
1246     echo "ERROR: The platform option has been removed. Please specify"
1247     echo " the build options using the \"optfile\" mechanism."
1248     echo
1249     usage
1250     ;;
1251 edhill 1.2
1252     -rootdir | --rootdir | -rd | --rd)
1253 edhill 1.4 ac_prev=ROOTDIR ;;
1254 edhill 1.2 -rootdir=* | --rootdir=* | -rd=* | --rd=*)
1255     ROOTDIR=$ac_optarg ;;
1256    
1257     -mods | --mods | -mo | --mo)
1258 edhill 1.4 ac_prev=MODS ;;
1259 edhill 1.2 -mods=* | --mods=* | -mo=* | --mo=*)
1260     MODS=$ac_optarg ;;
1261    
1262     -disable | --disable)
1263 edhill 1.4 ac_prev=DISABLE ;;
1264 edhill 1.2 -disable=* | --disable=*)
1265     DISABLE=$ac_optarg ;;
1266    
1267     -enable | --enable)
1268 edhill 1.4 ac_prev=ENABLE ;;
1269 edhill 1.2 -enable=* | --enable=*)
1270     ENABLE=$ac_optarg ;;
1271    
1272 edhill 1.12 -standarddirs | --standarddirs)
1273     ac_prev=STANDARDDIRS ;;
1274     -standarddirs=* | --standarddirs=*)
1275     STANDARDDIRS=$ac_optarg ;;
1276    
1277 edhill 1.2 # -cpp | --cpp)
1278     # ac_prev=cpp ;;
1279     # -cpp=* | --cpp=*)
1280     # CPP=$ac_optarg ;;
1281 edhill 1.91
1282     -cc | --cc)
1283     ac_prev=CC ;;
1284     -cc=* | --cc=*)
1285     CC=$ac_optarg ;;
1286    
1287 edhill 1.2 -fortran | --fortran | -fc | --fc)
1288 edhill 1.4 ac_prev=FC ;;
1289 edhill 1.2 -fc=* | --fc=*)
1290     FC=$ac_optarg ;;
1291    
1292 edhill 1.76 -fs | --fs)
1293     ac_prev=FS ;;
1294     -fs=* | --fs=*)
1295     FS=$ac_optarg ;;
1296    
1297     -fs90 | --fs90)
1298     ac_prev=FS90 ;;
1299     -fs90=* | --fs90=*)
1300     FS90=$ac_optarg ;;
1301    
1302 edhill 1.2 -ieee | --ieee)
1303 edhill 1.12 IEEE=true ;;
1304 edhill 1.2 -noieee | --noieee)
1305 edhill 1.12 IEEE= ;;
1306 adcroft 1.67
1307 jmc 1.203 -use_real4 | -use_r4 | -ur4 | --use_real4 | --use_r4 | --ur4 )
1308     USE_R4=true ;;
1309    
1310 ce107 1.126 -ts | --ts)
1311     TS=true ;;
1312 ce107 1.139 -papis | --papis)
1313     PAPIS=true ;;
1314 ce107 1.147 -pcls | --pcls)
1315     PCLS=true ;;
1316 ce107 1.139 -foolad | --foolad)
1317     FOOLAD=true ;;
1318     -papi | --papi)
1319     PAPI=true ;;
1320 ce107 1.147 -pcl | --pcl)
1321     PCL=true ;;
1322 ce107 1.139 -hpmt | --hpmt)
1323     HPMT=true ;;
1324    
1325     -gsl | --gsl)
1326     GSL=true ;;
1327 ce107 1.126
1328 ce107 1.160 -devel | --devel)
1329     DEVEL=true ;;
1330    
1331 adcroft 1.67 -mpi | --mpi)
1332     MPI=true ;;
1333     -mpi=* | --mpi=*)
1334     MPIPATH=$ac_optarg
1335     MPI=true ;;
1336 edhill 1.2
1337 jmc 1.187 -omp | --omp)
1338     OMP=true ;;
1339     -omp=* | --omp=*)
1340     OMPFLAG=$ac_optarg
1341     OMP=true ;;
1342 edhill 1.2
1343 edhill 1.5 -ds | --ds)
1344     DUMPSTATE=t ;;
1345    
1346 edhill 1.17 -taf_extra | --taf_extra)
1347     ac_prev=TAF_EXTRA ;;
1348     -taf_extra=* | --taf_extra=*)
1349     TAF_EXTRA=$ac_optarg ;;
1350    
1351     -tamc_extra | --tamc_extra)
1352     ac_prev=TAMC_EXTRA ;;
1353     -tamc_extra=* | --tamc_extra=*)
1354     TAMC_EXTRA=$ac_optarg ;;
1355 edhill 1.124
1356     -ignoretime | -ignore_time | --ignoretime | --ignore_time)
1357     IGNORE_TIME="-DIGNORE_TIME" ;;
1358 edhill 1.17
1359 edhill 1.141 -es | --es | -embed-source | --embed-source)
1360     EMBED_SRC=t ;;
1361    
1362 edhill 1.2 -*)
1363     echo "Error: unrecognized option: "$ac_option
1364     usage
1365     ;;
1366    
1367     *)
1368     echo "Error: unrecognized argument: "$ac_option
1369     usage
1370     ;;
1371    
1372     esac
1373 jmc 1.206
1374 edhill 1.1 done
1375    
1376 edhill 1.119
1377 edhill 1.12 if test -f ./.genmakerc ; then
1378     echo
1379     echo "WARNING: genmake2 has detected a copy of the old-style \"./.genmakerc\""
1380 jmc 1.161 echo " file. This file format is no longer supported. For directions on"
1381     echo " how to setup and use the new \"genmake2\" script, please see:"
1382 edhill 1.12 echo " http://mitgcm.org/devel_HOWTO/"
1383 jmc 1.161 echo " and send an email to MITgcm-support@mitgcm.org if you need help."
1384     echo "WARNING: ignore \"./.genmakerc\" and continue."
1385 jmc 1.206 echo
1386 edhill 1.12 fi
1387    
1388 edhill 1.97 # Find the MITgcm ${ROOTDIR}
1389 edhill 1.11 if test "x${ROOTDIR}" = x ; then
1390 edhill 1.112 tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1391 edhill 1.154 if test "x$tmp" = "xbin" -a -d ../model -a -d ../eesupp -a -d ../pkg ; then
1392 edhill 1.11 ROOTDIR=".."
1393     else
1394     for d in . .. ../.. ../../.. ../../../.. ../../../../.. ; do
1395     if [ -d "$d/model" -a -d "$d/eesupp" -a -d "$d/pkg" ]; then
1396     ROOTDIR=$d
1397 edhill 1.71 printf "Warning: ROOTDIR was not specified but there appears to be"
1398 edhill 1.11 echo " a copy of MITgcm at \"$ROOTDIR\" so we'll try it."
1399     break
1400     fi
1401     done
1402     fi
1403     fi
1404     if test "x${ROOTDIR}" = x ; then
1405     echo "Error: Cannot determine ROOTDIR for MITgcm code."
1406     echo " Please specify a ROOTDIR using either an options "
1407     echo " file or a command-line option."
1408     exit 1
1409     fi
1410     if test ! -d ${ROOTDIR} ; then
1411     echo "Error: the specified ROOTDIR (\"$ROOTDIR\") does not exist!"
1412     exit 1
1413     fi
1414    
1415 edhill 1.97 # Find the MITgcm ${THISVER}
1416 jmc 1.179 version_file="${ROOTDIR}/doc/tag-index"
1417     if test -f $version_file ; then
1418 jmc 1.200 THISVER=`$AWK '/^checkpoint/{print $1; exit}' $version_file`
1419 jmc 1.179 #- remove ./BUILD_INFO.h file if older than version_file
1420     if test -f ./BUILD_INFO.h -a ./BUILD_INFO.h -ot $version_file ; then
1421     echo " remove ./BUILD_INFO.h (older than ${version_file})"
1422     rm -f ./BUILD_INFO.h
1423     fi
1424 edhill 1.97 fi
1425    
1426 edhill 1.119 if test "x$MAKEFILE" = x ; then
1427     MAKEFILE="Makefile"
1428     fi
1429    
1430 edhill 1.1 echo " getting OPTFILE information: "
1431     if test "x${OPTFILE}" = x ; then
1432 edhill 1.11 if test "x$MITGCM_OF" = x ; then
1433     echo "Warning: no OPTFILE specified so we'll look for possible settings"
1434     printf "\n=== Searching for possible settings for OPTFILE ===\n"
1435     find_possible_configs
1436 edhill 1.1 else
1437 edhill 1.11 OPTFILE=$MITGCM_OF
1438     fi
1439     fi
1440     if test "x$OPTFILE" != xNONE ; then
1441     if test -f "$OPTFILE" -a -r "$OPTFILE" ; then
1442     echo " using OPTFILE=\"$OPTFILE\""
1443 edhill 1.34 . "$OPTFILE"
1444 edhill 1.11 RETVAL=$?
1445     if test "x$RETVAL" != x0 ; then
1446 edhill 1.71 printf "Error: failed to source OPTFILE \"$OPTFILE\""
1447 edhill 1.11 echo "--please check that variable syntax is bash-compatible"
1448 edhill 1.1 exit 1
1449     fi
1450 edhill 1.11 if test "x$DUMPSTATE" != xf ; then
1451 edhill 1.12 cp -f $OPTFILE "genmake_optfile"
1452 edhill 1.11 fi
1453     else
1454     echo "Error: can't read OPTFILE=\"$OPTFILE\""
1455     exit 1
1456 edhill 1.1 fi
1457     fi
1458 edhill 1.8
1459 edhill 1.14 echo " getting AD_OPTFILE information: "
1460     if test "x${AD_OPTFILE}" = x ; then
1461     if test "x$MITGCM_AD_OF" = x ; then
1462     AD_OPTFILE=$ROOTDIR/tools/adjoint_options/adjoint_default
1463     else
1464     AD_OPTFILE=$MITGCM_AD_OF
1465     fi
1466     fi
1467     if test "x${AD_OPTFILE}" != xNONE ; then
1468     if test -f "$AD_OPTFILE" -a -r "$AD_OPTFILE" ; then
1469     echo " using AD_OPTFILE=\"$AD_OPTFILE\""
1470 edhill 1.34 . "$AD_OPTFILE"
1471 edhill 1.14 RETVAL=$?
1472     if test "x$RETVAL" != x0 ; then
1473 edhill 1.71 printf "Error: failed to source AD_OPTFILE \"$AD_OPTFILE\""
1474 edhill 1.14 echo "--please check that variable syntax is bash-compatible"
1475     exit 1
1476     fi
1477     if test "x$DUMPSTATE" != xf ; then
1478     cp -f $AD_OPTFILE "genmake_ad_optfile"
1479     fi
1480     else
1481     echo "Error: can't read AD_OPTFILE=\"$AD_OPTFILE\""
1482     exit 1
1483     fi
1484     fi
1485    
1486 edhill 1.119 #====================================================================
1487     # Set default values if not set by the optfile
1488     #
1489 edhill 1.91 # Check that FC, CC, LINK, CPP, S64, LN, and MAKE are defined. If not,
1490 edhill 1.39 # either set defaults or complain and abort!
1491 edhill 1.71 if test ! "x$BASH" = x ; then
1492     # add a trailing space so that it works within the Makefile syntax (see below)
1493     BASH="$BASH "
1494     fi
1495 edhill 1.8 if test "x$FC" = x ; then
1496     cat <<EOF 1>&2
1497    
1498     Error: no Fortran compiler: please specify using one of the following:
1499     1) within the options file ("FC=...") as specified by "-of=OPTFILE"
1500     2) the "-fc=XXX" command-line option
1501 edhill 1.12 3) the "./genmake_local" file
1502 edhill 1.8 EOF
1503     exit 1
1504     fi
1505 edhill 1.91 if test "x$CC" = x ; then
1506 edhill 1.93 CC=cc
1507     # cat <<EOF 1>&2
1508     # Error: no C compiler: please specify using one of the following:
1509     # 1) within the options file ("CC=...") as specified by "-of=OPTFILE"
1510     # 2) the "-cc=XXX" command-line option
1511     # 3) the "./genmake_local" file
1512     # EOF
1513     # exit 1
1514 edhill 1.91 fi
1515 edhill 1.8 if test "x$LINK" = x ; then
1516     LINK=$FC
1517     fi
1518 edhill 1.39 if test "x$MAKE" = x ; then
1519     MAKE="make"
1520     fi
1521 edhill 1.63 if test "x$CPP" = x ; then
1522     CPP=cpp
1523     fi
1524     #EH3 === UGLY ===
1525 edhill 1.76 # The following is an ugly little hack to check for $CPP in /lib/ and
1526     # it should eventually be replaced with a more general function that
1527 edhill 1.63 # searches a combo of the user's path and a list of "usual suspects"
1528     # to find the correct location for binaries such as $CPP.
1529     for i in " " "/lib/" ; do
1530     echo "#define A a" | $i$CPP > test_cpp 2>&1 && CPP=$i$CPP
1531     done
1532     #EH3 === UGLY ===
1533 edhill 1.13 echo "#define A a" | $CPP > test_cpp 2>&1
1534 edhill 1.11 RETVAL=$?
1535     if test "x$RETVAL" != x0 ; then
1536 edhill 1.8 cat <<EOF 1>&2
1537    
1538 edhill 1.11 Error: C pre-processor "$CPP" failed the test case: please specify using:
1539    
1540 edhill 1.8 1) within the options file ("CPP=...") as specified by "-of=OPTFILE"
1541 edhill 1.12 2) the "./genmake_local" file
1542 edhill 1.30 3) with the CPP environment variable
1543 edhill 1.11
1544 edhill 1.8 EOF
1545     exit 1
1546 edhill 1.11 else
1547     rm -f test_cpp
1548 edhill 1.8 fi
1549 edhill 1.84 look_for_makedepend
1550 edhill 1.35 if test "x$LN" = x ; then
1551     LN="ln -s"
1552     fi
1553     echo "test" > genmake_test_ln
1554     $LN genmake_test_ln genmake_tlink
1555     RETVAL=$?
1556     if test "x$RETVAL" != x0 ; then
1557     cat <<EOF 1>&2
1558 edhill 1.29
1559 edhill 1.35 Error: The command "ln -s" failed -- please specify a working soft-link
1560     command in the optfile.
1561    
1562     EOF
1563     exit 1
1564     fi
1565 edhill 1.131 test -L genmake_tlink > /dev/null 2>&1
1566     RETVAL=$?
1567     if test "x$RETVAL" = x0 ; then
1568     HAVE_TEST_L=t
1569     fi
1570 edhill 1.35 rm -f genmake_test_ln genmake_tlink
1571 edhill 1.77
1572     # Check for broken *.F/*.f handling and fix if possible
1573     check_for_broken_Ff
1574 edhill 1.29
1575 adcroft 1.67 if test ! "x$MPI" = x ; then
1576     echo " Turning on MPI cpp macros"
1577 adcroft 1.68 DEFINES="$DEFINES -DALLOW_USE_MPI -DALWAYS_USE_MPI"
1578 adcroft 1.67 fi
1579 jmc 1.187 if test ! "x$OMP" = x ; then
1580     echo " Add OMPFLAG and turn on OpenMP cpp macros"
1581     FFLAGS="$FFLAGS $OMPFLAG"
1582     F90FLAGS="$F90FLAGS $OMPFLAG"
1583     DEFINES="$DEFINES -DUSE_OMP_THREADING"
1584     fi
1585 edhill 1.39
1586 jmc 1.203 if test ! "x$USE_R4" = x ; then
1587     echo " Turning on LET_RS_BE_REAL4 cpp flag"
1588     DEFINES="$DEFINES -DLET_RS_BE_REAL4"
1589     fi
1590    
1591 ce107 1.126 if test ! "x$TS" = x ; then
1592     echo " Turning on timing per timestep"
1593 ce107 1.139 if test ! "x$FOOLAD" = x ; then
1594     DEFINES="$DEFINES -DTIME_PER_TIMESTEP_SFP"
1595     else
1596     DEFINES="$DEFINES -DTIME_PER_TIMESTEP"
1597     fi
1598 ce107 1.164 PACKAGES="$PACKAGES showflops"
1599 ce107 1.139 fi
1600     if test ! "x$PAPIS" = x ; then
1601     echo " Turning on PAPI flop summary per timestep"
1602     echo " Please make sure PAPIINC, PAPILIB are defined"
1603     if test ! "x$FOOLAD" = x ; then
1604     DEFINES="$DEFINES -DUSE_PAPI_FLOPS_SFP"
1605     else
1606     DEFINES="$DEFINES -DUSE_PAPI_FLOPS"
1607     fi
1608     INCLUDES="$INCLUDES $PAPIINC"
1609     LIBS="$LIBS $PAPILIB"
1610 ce107 1.164 PACKAGES="$PACKAGES showflops"
1611 ce107 1.139 fi
1612 ce107 1.147 if test ! "x$PCLS" = x ; then
1613     echo " Turning on PCL counter summary per timestep"
1614     echo " Please make sure PCLINC, PCLLIB are defined"
1615     if test ! "x$FOOLAD" = x ; then
1616     DEFINES="$DEFINES -DUSE_PCL_FLOPS_SFP"
1617     else
1618     DEFINES="$DEFINES -DUSE_PCL_FLOPS"
1619     fi
1620     INCLUDES="$INCLUDES $PCLINC"
1621     LIBS="$LIBS $PCLLIB"
1622 ce107 1.164 PACKAGES="$PACKAGES showflops"
1623 ce107 1.147 fi
1624 ce107 1.139 if test ! "x$PAPI" = x ; then
1625     if test ! "x$PAPIS" = x ; then
1626     echo " PAPI performance analysis and flop summary per timestep cannot co-exist!"
1627     echo " Sticking with PAPI flop summary per timestep!"
1628     else
1629     echo " Turning on performance analysis with PAPI"
1630     echo " Please make sure PAPIINC, PAPILIB are defined"
1631     DEFINES="$DEFINES -DUSE_PAPI"
1632     INCLUDES="$INCLUDES $PAPIINC"
1633     LIBS="$LIBS $PAPILIB"
1634     fi
1635     fi
1636 ce107 1.147 if test ! "x$PCL" = x ; then
1637     if test ! "x$PCLS" = x ; then
1638     echo " PCL performance analysis and flop summary per timestep cannot co-exist!"
1639     echo " Sticking with PCL flop summary per timestep!"
1640     else
1641     echo " Turning on performance analysis with PCL"
1642     echo " Please make sure PCLINC, PCLLIB are defined"
1643     DEFINES="$DEFINES -DUSE_PCL"
1644     INCLUDES="$INCLUDES $PCLINC"
1645     LIBS="$LIBS $PCLLIB"
1646     fi
1647     fi
1648 ce107 1.139 if test ! "x$HPMT" = x ; then
1649     if test ! "x$PAPI" = x ; then
1650     echo " PAPI and the HPM Toolkit cannot co-exist!"
1651     echo " Sticking with PAPI!"
1652 ce107 1.147 else if test ! "x$PCL" = x ; then
1653     echo " PCL and the HPM Toolkit cannot co-exist!"
1654     echo " Sticking with PCL!"
1655 ce107 1.139 else
1656     echo " Turning on performance analysis with the HPM Toolkit"
1657     echo " Please make sure HPMTINC, HPMTLIB are defined"
1658     DEFINES="$DEFINES -DUSE_LIBHPM"
1659     INCLUDES="$INCLUDES $HPMTINC"
1660     LIBS="$LIBS $HPMTLIB"
1661     fi
1662 ce107 1.148 fi
1663 ce107 1.139 fi
1664     if test ! "x$GSL" = x ; then
1665     echo " Turning on use of GSL to control floating point calculations"
1666     echo " Please make sure GSLINC, GSLLIB are defined"
1667     DEFINES="$DEFINES -DUSE_GSL_IEEE"
1668     INCLUDES="$INCLUDES $GSLINC"
1669     LIBS="$LIBS $GSLLIB"
1670 ce107 1.126 fi
1671 jmc 1.181 #- if USE_EXTENDED_SRC is set, add EXTENDED_SRC_FLAG to FFLAGS :
1672     if test ! "x$USE_EXTENDED_SRC" = x ; then
1673     FFLAGS="$FFLAGS $EXTENDED_SRC_FLAG"
1674     F90FIXEDFORMAT="$F90FIXEDFORMAT $EXTENDED_SRC_FLAG"
1675     fi
1676 ce107 1.126
1677 edhill 1.29 printf "\n=== Checking system libraries ===\n"
1678 edhill 1.71 printf " Do we have the system() command using $FC... "
1679 edhill 1.118 cat > genmake_tcomp.$FS <<EOF
1680 edhill 1.29 program hello
1681     call system('echo hi')
1682     end
1683     EOF
1684 edhill 1.134 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1685 edhill 1.29 RETVAL=$?
1686     if test "x$RETVAL" = x0 ; then
1687     HAVE_SYSTEM=t
1688     DEFINES="$DEFINES -DHAVE_SYSTEM"
1689     echo "yes"
1690     else
1691     HAVE_SYSTEM=
1692     echo "no"
1693     fi
1694     rm -f genmake_tcomp*
1695    
1696 edhill 1.71 printf " Do we have the fdate() command using $FC... "
1697 edhill 1.118 cat > genmake_tcomp.$FS <<EOF
1698 edhill 1.29 program hello
1699 edhill 1.129 CHARACTER*(128) string
1700 edhill 1.29 string = ' '
1701     call fdate( string )
1702     print *, string
1703     end
1704     EOF
1705 edhill 1.134 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1706 edhill 1.29 RETVAL=$?
1707     if test "x$RETVAL" = x0 ; then
1708     HAVE_FDATE=t
1709     DEFINES="$DEFINES -DHAVE_FDATE"
1710     echo "yes"
1711     else
1712     HAVE_FDATE=
1713     echo "no"
1714     fi
1715     rm -f genmake_tcomp*
1716    
1717 cnh 1.81 printf " Do we have the etime() command using $FC... "
1718 edhill 1.118 cat > genmake_tcomp.$FS <<EOF
1719 cnh 1.81 program hello
1720 cnh 1.82 REAL*4 ACTUAL, TARRAY(2)
1721     EXTERNAL ETIME
1722     REAL*4 ETIME
1723     actual = etime( tarray )
1724 cnh 1.81 print *, tarray
1725     end
1726     EOF
1727 edhill 1.134 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1728 cnh 1.81 RETVAL=$?
1729     if test "x$RETVAL" = x0 ; then
1730     HAVE_ETIME=t
1731     DEFINES="$DEFINES -DHAVE_ETIME"
1732     echo "yes"
1733     else
1734     HAVE_ETIME=
1735     echo "no"
1736     fi
1737     rm -f genmake_tcomp*
1738    
1739 edhill 1.71 printf " Can we call simple C routines (here, \"cloc()\") using $FC... "
1740 edhill 1.39 check_HAVE_CLOC
1741     if test "x$HAVE_CLOC" != x ; then
1742     echo "yes"
1743     else
1744     echo "no"
1745 edhill 1.141 if test "x$EMBED_SRC" = xt ; then
1746     echo " WARNING: you requested file embedding but it has"
1747     echo " been disabled since C code cannot be called"
1748     EMBED_SRC=
1749     fi
1750 edhill 1.29 fi
1751 edhill 1.39 rm -f genmake_t*
1752 edhill 1.29
1753 edhill 1.130 printf " Can we unlimit the stack size using $FC... "
1754     check_HAVE_SETRLSTK
1755 edhill 1.151 if test "x$HAVE_SETRLSTK" = xt ; then
1756 edhill 1.130 echo "yes"
1757     else
1758     echo "no"
1759     fi
1760     rm -f genmake_t*
1761    
1762 edhill 1.137 printf " Can we register a signal handler using $FC... "
1763     check_HAVE_SIGREG
1764 edhill 1.150 if test "x$HAVE_SIGREG" = xt ; then
1765 edhill 1.137 echo "yes"
1766     else
1767     echo "no"
1768     fi
1769     rm -f genmake_t*
1770    
1771 edhill 1.108 printf " Can we use stat() through C calls... "
1772     check_HAVE_STAT
1773     if test "x$HAVE_STAT" != x ; then
1774     echo "yes"
1775     else
1776     echo "no"
1777     fi
1778     rm -f genmake_t*
1779    
1780 edhill 1.71 printf " Can we create NetCDF-enabled binaries... "
1781 edhill 1.60 check_netcdf_libs
1782     if test "x$HAVE_NETCDF" != x ; then
1783     echo "yes"
1784     else
1785     echo "no"
1786     fi
1787 edhill 1.124 DEFINES="$DEFINES $IGNORE_TIME"
1788 edhill 1.8
1789 edhill 1.141 if test "x$EMBED_SRC" = xt ; then
1790     build_embed_encode
1791     fi
1792     if test "x$EMBED_SRC" = xt ; then
1793     ENABLE="$ENABLE embed_files"
1794     fi
1795    
1796    
1797 edhill 1.2 printf "\n=== Setting defaults ===\n"
1798 jmc 1.185 printf " Adding MODS directories: "
1799 edhill 1.1 for d in $MODS ; do
1800     if test ! -d $d ; then
1801 edhill 1.2 echo
1802     echo "Error: MODS directory \"$d\" not found!"
1803 edhill 1.1 exit 1
1804     else
1805 jmc 1.185 printf "$d "
1806 edhill 1.1 SOURCEDIRS="$SOURCEDIRS $d"
1807     INCLUDEDIRS="$INCLUDEDIRS $d"
1808     fi
1809     done
1810     echo
1811    
1812     if test "x${PLATFORM}" = x ; then
1813     PLATFORM=$p_PLATFORM
1814     fi
1815    
1816     if test "x${EXEDIR}" = x ; then
1817 edhill 1.112 tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1818 edhill 1.87 if test "x$tmp" = "xbin" -a -d ../exe -a $ROOTDIR = .. ; then
1819 edhill 1.1 EXEDIR=../exe
1820     else
1821     EXEDIR=.
1822     fi
1823     fi
1824     if test ! -d ${EXEDIR} ; then
1825     echo "Error: the specified EXEDIR (\"$EXEDIR\") does not exist!"
1826     exit 1
1827     fi
1828    
1829     if test "x${TOOLSDIR}" = x ; then
1830     TOOLSDIR="$ROOTDIR/tools"
1831     fi
1832     if test ! -d ${TOOLSDIR} ; then
1833 cnh 1.65 echo "Error: the specified TOOLSDIR (\"$TOOLSDIR\") does not exist!"
1834 edhill 1.1 exit 1
1835     fi
1836 edhill 1.11 if test "x$S64" = x ; then
1837 edhill 1.104 echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.sh > /dev/null 2>&1
1838     RETVAL=$?
1839     if test "x${RETVAL}" = x0 ; then
1840     S64='$(TOOLSDIR)/set64bitConst.sh'
1841     else
1842     echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.csh > /dev/null 2>&1
1843     RETVAL=$?
1844     if test "x${RETVAL}" = x0 ; then
1845     S64='$(TOOLSDIR)/set64bitConst.csh'
1846     else
1847     cat <<EOF
1848    
1849     ERROR: neither of the two default scripts:
1850    
1851     ${TOOLSDIR}/set64bitConst.sh
1852     ${TOOLSDIR}/set64bitConst.csh
1853    
1854 jmc 1.206 are working so please check paths or specify (with \$S64) a
1855 edhill 1.104 working version of this script.
1856    
1857     EOF
1858     exit 1
1859     fi
1860     fi
1861 edhill 1.11 fi
1862 adcroft 1.44 THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`
1863 edhill 1.1
1864     EXECUTABLE=${EXECUTABLE:-mitgcmuv}
1865    
1866 jmc 1.205 # Set Standard Code Directories:
1867     if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
1868     STANDARDDIRS="eesupp model"
1869     fi
1870     # if model in Standard-Code-Dir, add eesupp (needed to compile model)
1871     echo " $STANDARDDIRS " | grep ' model ' > /dev/null 2>&1
1872     ckM=$?
1873     echo " $STANDARDDIRS " | grep ' eesupp ' > /dev/null 2>&1
1874     ckE=$?
1875 jmc 1.206 if test $ckM = 0 -a $ckE = 1 ; then
1876 jmc 1.205 STANDARDDIRS="$STANDARDDIRS eesupp"
1877     fi
1878    
1879 edhill 1.1 # We have a special set of source files in eesupp/src which are
1880     # generated from some template source files. We'll make them first so
1881     # they appear as regular source code
1882     if test -r $ROOTDIR"/eesupp/src/Makefile" ; then
1883     echo " Making source files in eesupp from templates"
1884 jmc 1.207 ( cd $ROOTDIR"/eesupp/src/" && $MAKE clean_old && $MAKE \
1885     ) > make_eesupp.errors 2>&1
1886 edhill 1.1 RETVAL=$?
1887 edhill 1.2 if test "x${RETVAL}" = x0 ; then
1888 edhill 1.1 rm -f make_eesupp.errors
1889     else
1890     echo "Error: problem encountered while building source files in eesupp:"
1891 edhill 1.62 cat make_eesupp.errors 1>&2
1892 edhill 1.1 exit 1
1893 afe 1.58 fi
1894     fi
1895    
1896 edhill 1.154 #same for pkg/exch2 and pkg/regrid
1897     for pdir in exch2 regrid ; do
1898     if test -r $ROOTDIR"/pkg/${pdir}/Makefile" ; then
1899     echo " Making source files in pkg/${pdir} from templates"
1900 jmc 1.207 ( cd $ROOTDIR"/pkg/"${pdir} && $MAKE clean_old && $MAKE \
1901     ) > make_${pdir}.errors 2>&1
1902 edhill 1.154 RETVAL=$?
1903     if test "x${RETVAL}" = x0 ; then
1904     rm -f make_${pdir}.errors
1905     else
1906     echo "Error: problem encountered while building source files in pkg/${pdir}:"
1907     cat make_${pdir}.errors 1>&2
1908     exit 1
1909     fi
1910 edhill 1.1 fi
1911 edhill 1.154 done
1912 edhill 1.1
1913 edhill 1.2 printf "\n=== Determining package settings ===\n"
1914 jmc 1.208 if test "x${PKG_DEPEND}" = x ; then
1915 edhill 1.1 tmp=$ROOTDIR"/pkg/pkg_depend"
1916 jmc 1.208 if test -r $tmp ; then PKG_DEPEND=$tmp ; fi
1917     fi
1918     if test "x${PKG_DEPEND}" = x ; then
1919 edhill 1.1 echo "Warning: No package dependency information was specified."
1920     echo " Please check that ROOTDIR/pkg/pkg_depend exists."
1921 jmc 1.208 else
1922     if test ! -r ${PKG_DEPEND} ; then
1923     echo "Error: can't read package dependency info from PKG_DEPEND=\"$PKG_DEPEND\""
1924     exit 1
1925 edhill 1.1 fi
1926 jmc 1.208 echo " getting package dependency info from $PKG_DEPEND"
1927     # Strip the comments and then convert the dependency file into arrays: PNAME, DNAME
1928     get_pdepend_list $PKG_DEPEND
1929     fi
1930    
1931     # A default package groups file "$ROOTDIR/pkg/pkg_groups" is provided
1932     # to define the "default_pkg_list" and package groups (for convenience, one
1933     # can specify a group of packages using names like "ocean" and "atmosphere").
1934     if test "x${PKG_GROUPS}" = x ; then
1935     tmp=$ROOTDIR"/pkg/pkg_groups"
1936     if test -r $tmp ; then PKG_GROUPS=$tmp ; fi
1937     fi
1938     if test "x${PKG_GROUPS}" = x ; then
1939     echo "Warning: No package groups information was specified."
1940     echo " Please check that ROOTDIR/pkg/pkg_groups exists."
1941 edhill 1.1 else
1942 jmc 1.208 if test ! -r ${PKG_GROUPS} ; then
1943     echo "Error: can't read package groups info from PKG_GROUPS=\"$PKG_GROUPS\""
1944 edhill 1.1 exit 1
1945     fi
1946 jmc 1.208 echo " getting package groups info from $PKG_GROUPS"
1947 edhill 1.1 fi
1948 jmc 1.208
1949     # Search for packages to compile.
1950     echo " checking list of packages to compile:"
1951     PKG_LIST=
1952     if test "x${PKG_LIST}" = x ; then
1953 edhill 1.12 for i in "." $MODS ; do
1954     if test -r $i"/packages.conf" ; then
1955 jmc 1.208 PKG_LIST=$i"/packages.conf"
1956 edhill 1.12 break
1957     fi
1958     done
1959     fi
1960 jmc 1.208 if test "x${PKG_LIST}" = x ; then
1961     pkg_list='default_pkg_list'
1962     if test "x${PKG_GROUPS}" = x ; then
1963     echo "Error: need package groups info to expand pkg_list=\"$pkg_list\""
1964     exit 1
1965     fi
1966 edhill 1.1 else
1967 jmc 1.208 if test ! -r $PKG_LIST ; then
1968     echo "Error: can't read package list from PKG_LIST=\"$PKG_LIST\""
1969     exit 1
1970 edhill 1.1 else
1971 jmc 1.208 echo " using PKG_LIST=\"$PKG_LIST\""
1972 edhill 1.1 # Strip the comments and add all the names
1973 jmc 1.208 pkg_list=`cat $PKG_LIST | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
1974 edhill 1.1 RETVAL=$?
1975     if test "x${RETVAL}" != x0 ; then
1976 jmc 1.208 printf "Error: can't parse package list "
1977     echo "-- please check PKG_LIST=\"$PKG_LIST\""
1978 edhill 1.1 exit 1
1979     fi
1980     fi
1981     fi
1982 jmc 1.208 for i in $pkg_list ; do
1983     PACKAGES="$PACKAGES $i"
1984     done
1985     echo " before group expansion packages are:$PACKAGES"
1986     if test "x${PKG_GROUPS}" != x ; then
1987     RET=1
1988     while test $RET = 1 ; do expand_pkg_groups; RET=$?; done
1989     echo " after group expansion packages are: $PACKAGES"
1990     fi
1991 edhill 1.1
1992     echo " applying DISABLE settings"
1993 jmc 1.205 echo "" > ./.tmp_pack
1994 adcroft 1.74 for i in $PACKAGES ; do
1995     echo $i >> ./.tmp_pack
1996     done
1997     for i in `grep "-" ./.tmp_pack` ; do
1998     j=`echo $i | sed 's/[-]//'`
1999     DISABLE="$DISABLE $j"
2000     done
2001 edhill 1.1 pack=
2002     for p in $PACKAGES ; do
2003     addit="t"
2004     for d in $DISABLE ; do
2005     if test "x$p" = "x$d" ; then
2006     addit="f"
2007     fi
2008     done
2009     if test "x$addit" = xt ; then
2010     pack="$pack $p"
2011     fi
2012     done
2013     PACKAGES="$pack"
2014     echo " applying ENABLE settings"
2015 edhill 1.12 echo "" > ./.tmp_pack
2016 edhill 1.1 PACKAGES="$PACKAGES $ENABLE"
2017 adcroft 1.74 # Test if each explicitly referenced package exists
2018 edhill 1.1 for i in $PACKAGES ; do
2019 adcroft 1.74 j=`echo $i | sed 's/[-+]//'`
2020     if test ! -d "$ROOTDIR/pkg/$j" ; then
2021 jmc 1.208 echo "Error: dir '$ROOTDIR/pkg/$i' missing for package '$i'"
2022 adcroft 1.74 exit 1
2023 edhill 1.1 fi
2024     echo $i >> ./.tmp_pack
2025     done
2026     PACKAGES=
2027 adcroft 1.74 for i in `grep -v "-" ./.tmp_pack | sort | uniq` ; do
2028 edhill 1.1 PACKAGES="$PACKAGES $i"
2029     done
2030 adcroft 1.74 rm -f ./.tmp_pack
2031 jmc 1.205 echo " packages are: $PACKAGES"
2032 edhill 1.1
2033 jmc 1.206 # Check for package MNC: if NetCDF is available, then build the MNC
2034 jmc 1.161 # template files ; otherwise, delete mnc from the list of packages.
2035 jmc 1.205 echo " $PACKAGES " | grep ' mnc ' > /dev/null 2>&1
2036 jmc 1.206 mnc_in=$?
2037     if test "x$HAVE_NETCDF" != xt ; then
2038     if test "x$mnc_in" = x0 ; then
2039 edhill 1.100 cat <<EOF
2040     *********************************************************************
2041     WARNING: the "mnc" package was enabled but tests failed to compile
2042     NetCDF applications. Please check that:
2043    
2044     1) NetCDF is correctly installed for this compiler and
2045 jmc 1.206 2) the LIBS variable (within the "optfile") specifies the correct
2046 edhill 1.100 NetCDF library to link against.
2047    
2048     Due to this failure, the "mnc" package is now DISABLED.
2049     *********************************************************************
2050     EOF
2051     PACKAGES=`echo $PACKAGES | sed -e 's/mnc//g'`
2052     DISABLE="$DISABLE mnc"
2053     else
2054 jmc 1.206 # this prevent to add mnc (due to pdepend rules) if not available
2055     DISABLE="$DISABLE mnc"
2056     fi
2057     else
2058     # we have NetCDF, we try to build MNC template files
2059     ( cd $ROOTDIR"/pkg/mnc" && $MAKE testclean && $MAKE templates ) > make_mnc.errors 2>&1
2060     RETVAL=$?
2061     if test "x${RETVAL}" = x0 ; then
2062     rm -f make_mnc.errors
2063     else
2064     echo "Error: problem encountered while building source files in pkg/mnc:"
2065     cat make_mnc.errors 1>&2
2066     if test "x$mnc_in" = x0 ; then
2067     exit 1
2068 edhill 1.100 else
2069 jmc 1.206 DISABLE="$DISABLE mnc"
2070 edhill 1.100 fi
2071     fi
2072     fi
2073    
2074 jmc 1.161 # Check for package PROFILES: if NetCDF is not available,
2075     # then delete profiles from the list of available packages.
2076 jmc 1.206 if test "x$HAVE_NETCDF" != xt ; then
2077     echo " $PACKAGES " | grep ' profiles ' > /dev/null 2>&1
2078     RETVAL=$?
2079     if test "x$RETVAL" = x0 ; then
2080 jmc 1.161 cat <<EOF
2081     *********************************************************************
2082     WARNING: the "profiles" package was enabled but tests failed to
2083     compile NetCDF applications. Please check that:
2084    
2085     1) NetCDF is correctly installed for this compiler and
2086 jmc 1.206 2) the LIBS variable (within the "optfile") specifies the correct
2087 jmc 1.161 NetCDF library to link against.
2088    
2089     Due to this failure, the "profiles" package is now DISABLED.
2090     *********************************************************************
2091     EOF
2092     PACKAGES=`echo $PACKAGES | sed -e 's/profiles//g'`
2093     DISABLE="$DISABLE profiles"
2094 jmc 1.206 else
2095     # this prevent to add profiles (due to pdepend rules) if not available
2096     DISABLE="$DISABLE profiles"
2097 jmc 1.161 fi
2098     fi
2099    
2100 jmc 1.208 if test "x${PKG_DEPEND}" != x ; then
2101     echo " applying package dependency rules"
2102     ck=
2103     while test "x$ck" != xtt ; do
2104 edhill 1.1 i=0
2105 edhill 1.2 # rtot=${#PNAME[@]}
2106     rtot=$nname
2107 jmc 1.162 while test $i -le $rtot ; do
2108 edhill 1.1
2109     # Is $pname in the current $PACKAGES list?
2110 edhill 1.2 # pname=${PNAME[$i]}
2111     tmp="pname=\"\$PNAME_$i\""
2112     eval $tmp
2113 edhill 1.1 pin="f"
2114     for p in $PACKAGES ; do
2115     if test "x$p" = "x$pname" ; then
2116     pin="t"
2117     fi
2118     done
2119 jmc 1.205 # or in the current $STANDARDDIRS list?
2120     for p in $STANDARDDIRS ; do
2121     if test "x$p" = "x$pname" ; then pin="t" ; fi
2122     done
2123 edhill 1.1
2124     # Is the DNAME entry a (+) or (-) rule ?
2125 edhill 1.2 tmp="dname=\"\$DNAME_$i\""
2126     eval $tmp
2127 edhill 1.1 plus="-"
2128 edhill 1.2 echo $dname | grep '^+' > /dev/null 2>&1
2129 edhill 1.1 RETVAL=$?
2130     if test "x$RETVAL" = x0 ; then
2131     plus="+"
2132     fi
2133    
2134     # Is $dname in the current $PACKAGES list?
2135 edhill 1.2 dname=`echo $dname | sed -e 's/^[+-]//'`
2136 edhill 1.1 din="f"
2137     for p in $PACKAGES ; do
2138     if test "x$p" = "x$dname" ; then
2139     din="t"
2140     fi
2141     done
2142    
2143     # Do we need to add $dname according to the dependency rules?
2144     if test "x$pin" = xt -a "x$plus" = "x+" -a "x$din" = xf ; then
2145 jmc 1.162 #echo " " $pname ": need to add :" $dname
2146 edhill 1.1 in_dis="f"
2147     for dis in $DISABLE ; do
2148     if test "x$dis" = "x$dname" ; then
2149     in_dis="t"
2150     fi
2151     done
2152     if test "x$in_dis" = xt ; then
2153     echo "Error: can't satisfy package dependencies:"
2154     echo " \"$dname\" is required by the dependency rules"
2155     echo " but is disallowed by the DISABLE settings"
2156     exit 1
2157     else
2158     PACKAGES="$PACKAGES $dname"
2159     ck=
2160     fi
2161     fi
2162    
2163     # Do we need to get rid of $dname according to the dependency rules?
2164     if test "x$pin" = xt -a "x$plus" = "x-" -a "x$din" = xt; then
2165     echo "Error: can't satisfy package dependencies:"
2166 jmc 1.206 echo " \"$pname\" was requested but is disallowed by"
2167 edhill 1.1 echo " the dependency rules for \"$dname\""
2168     exit 1
2169     fi
2170 edhill 1.87 i=`echo "$i + 1" | bc -l`
2171     #i=$(( $i + 1 ))
2172 edhill 1.1 done
2173     ck=$ck"t"
2174 jmc 1.208 done
2175     echo " packages are: $PACKAGES"
2176     fi
2177 edhill 1.1 for i in $PACKAGES ; do
2178     adr="$ROOTDIR/pkg/$i"
2179     if test -d $adr ; then
2180     SOURCEDIRS="$SOURCEDIRS $adr"
2181     INCLUDEDIRS="$INCLUDEDIRS $adr"
2182 edhill 1.14 if test "x$i" = xautodiff ; then
2183     AUTODIFF_PKG_USED=t
2184     fi
2185 edhill 1.1 else
2186     echo "Error: the directory \"$adr\" for package $i doesn't exist"
2187     exit 1
2188     fi
2189     done
2190    
2191 edhill 1.12 # Create a list of #define and #undef to enable/disable packages
2192     PACKAGES_DOT_H=PACKAGES_CONFIG.h
2193 jmc 1.206 # The following UGLY HACK sets multiple "#undef"s and it needs to go
2194     # away. On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h
2195 edhill 1.1 # file would eventually be split up so that all package-related #define
2196     # statements could be separated and handled only by genmake.
2197     names=`ls -1 "$ROOTDIR/pkg"`
2198     all_pack=
2199 adcroft 1.44 DISABLED_PACKAGES=
2200 edhill 1.1 for n in $names ; do
2201     if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
2202     has_pack="f"
2203     for pack in $PACKAGES ; do
2204     if test "x$pack" = "x$n" ; then
2205     has_pack="t"
2206     break
2207     fi
2208     done
2209     if test "x$has_pack" = xf ; then
2210 edhill 1.116 undef=`echo "ALLOW_$n" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2211 adcroft 1.44 DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
2212 edhill 1.1 fi
2213     fi
2214     done
2215 adcroft 1.44 ENABLED_PACKAGES=
2216 edhill 1.1 for i in $PACKAGES ; do
2217 edhill 1.116 def=`echo "ALLOW_$i" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2218 adcroft 1.44 ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
2219 edhill 1.12 #eh3 DEFINES="$DEFINES -D$def"
2220 edhill 1.1
2221     #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
2222 jmc 1.206 case $i in
2223 edhill 1.1 aim_v23)
2224 adcroft 1.46 ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
2225 jmc 1.55 echo "Warning: ALLOW_AIM is set to enable aim_v23."
2226 edhill 1.1 ;;
2227     esac
2228     #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
2229    
2230     done
2231    
2232 jmc 1.205 echo " Adding STANDARDDIRS='$STANDARDDIRS'"
2233 edhill 1.1 BUILDDIR=${BUILDDIR:-.}
2234 edhill 1.57 if test "x$STANDARDDIRS" != x ; then
2235     for d in $STANDARDDIRS ; do
2236     adr="$ROOTDIR/$d/src"
2237     if test ! -d $adr ; then
2238     echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2239     echo " is correct and that you correctly specified the STANDARDDIRS option"
2240     exit 1
2241     else
2242     SOURCEDIRS="$SOURCEDIRS $adr"
2243     fi
2244     adr="$ROOTDIR/$d/inc"
2245     if test ! -d $adr ; then
2246     echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2247     echo " is correct and that you correctly specified the STANDARDDIRS option"
2248     exit 1
2249     else
2250     INCLUDEDIRS="$INCLUDEDIRS $adr"
2251     fi
2252     done
2253     fi
2254 edhill 1.1
2255 adcroft 1.52 echo " Searching for *OPTIONS.h files in order to warn about the presence"
2256     echo " of \"#define \"-type statements that are no longer allowed:"
2257 edhill 1.12 CPP_OPTIONS=
2258 adcroft 1.52 CPP_EEOPTIONS=
2259 edhill 1.12 spaths=". $INCLUDEDIRS"
2260 adcroft 1.52 names=`ls -1 "$ROOTDIR/pkg"`
2261 edhill 1.12 for i in $spaths ; do
2262     try="$i/CPP_OPTIONS.h"
2263 edhill 1.54 if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
2264 edhill 1.12 echo " found CPP_OPTIONS=\"$try\""
2265     CPP_OPTIONS="$try"
2266 adcroft 1.52 # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
2267     for n in $names ; do
2268     test_for_package_in_cpp_options $CPP_OPTIONS $n
2269     done
2270     fi
2271     try="$i/CPP_EEOPTIONS.h"
2272 edhill 1.54 if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
2273 adcroft 1.52 echo " found CPP_EEOPTIONS=\"$try\""
2274     # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
2275     #**** not yet enabled ****
2276     # test_for_mpi_in_cpp_eeoptions $try
2277     #**** not yet enabled ****
2278     CPP_EEOPTIONS="$try"
2279 edhill 1.12 fi
2280     done
2281     if test "x$CPP_OPTIONS" = x ; then
2282     echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
2283     exit 1
2284     fi
2285 edhill 1.1
2286 edhill 1.14 # Here, we build the list of files to be "run through" the adjoint
2287     # compiler.
2288 jmc 1.176 if test -f ./adSrcFiles.tmp ; then
2289     rm -f ./adSrcFiles.tmp
2290 edhill 1.14 fi
2291     echo " Creating the list of files for the adjoint compiler."
2292 jmc 1.207 touch adSrcFiles.tmp
2293 edhill 1.14 for i in $SOURCEDIRS ; do
2294     list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
2295     for j in $list_files ; do
2296 jmc 1.176 cat $i/$j >> adSrcFiles.tmp
2297 edhill 1.14 done
2298     done
2299 edhill 1.121 if test ! "x"$FS = "x.f" ; then
2300 jmc 1.176 cat adSrcFiles.tmp | sed -e "s/\.f/.$FS/g" > adSrcFiles.tmp_f
2301     mv -f adSrcFiles.tmp_f adSrcFiles.tmp
2302 edhill 1.121 fi
2303 edhill 1.14
2304 edhill 1.2 echo
2305     echo "=== Creating the Makefile ==="
2306 edhill 1.1 echo " setting INCLUDES"
2307     for i in $INCLUDEDIRS ; do
2308 edhill 1.87 if test ! -d $i ; then
2309 edhill 1.1 echo "Warning: can't find INCLUDEDIRS=\"$i\""
2310     fi
2311     done
2312    
2313 ce107 1.139 if test ! "x$DIVA" = x ; then
2314 ce107 1.140 echo " Creating the pseudo-MPI include directory"
2315 ce107 1.139 INCLUDES="-I./mpi_headers $INCLUDES"
2316     rm -rf ./mpi_headers
2317     mkdir -p ./mpi_headers
2318    
2319     if test "x$MPIINCLUDEDIR" = x ; then
2320     if test "x$MPIHOME" = x ; then
2321     MPIHOME='/usr'
2322     fi
2323     MPIINCLUDEDIR='$MPIHOME/include'
2324     fi
2325 jmc 1.206
2326 ce107 1.139 if test -r $MPIINCLUDEDIR/mpif.h ; then
2327     for i in $MPI_HEADER_FILES; do
2328     cp -p $MPIINCLUDEDIR/$i ./mpi_headers
2329     done
2330    
2331     perl -i -pe 's/MPI_DISPLACEMENT_CURRENT=-1_8/MPI_DISPLACEMENT_CURRENT=-1/g' mpi_headers/mpif.h
2332     else
2333     echo " We cannot create a copy of mpif.h!"
2334 heimbach 1.156 # exit -1
2335 ce107 1.139 fi
2336     fi
2337    
2338 edhill 1.1 echo " Determining the list of source and include files"
2339     rm -rf .links.tmp
2340     mkdir .links.tmp
2341 edhill 1.142 touch .links.tmp/foo
2342     if test ! -r ".links.tmp/foo" ; then
2343     echo
2344     echo "ERROR : something is wrong with your directory permissions or"
2345     echo " your user file-creation mask (\"umask\") since creating a"
2346     echo " sub-dir, touch-ing a file within it, and then reading it is"
2347     echo " not working. Please try setting your umask to something"
2348     echo " sane such as:"
2349     echo
2350     echo " umask 0002"
2351     echo
2352     echo " and please verify that you have the proper permissions for"
2353     echo " creating sub-directories and then reading files created"
2354     echo " within them."
2355     echo
2356     exit 1
2357     fi
2358     rm -f .links.tmp/foo
2359 jmc 1.176
2360 jmc 1.206 if test "x$OPENAD" != x ; then
2361 jmc 1.176 OAD_DONT_COMPILE="/dev/null"
2362     OAD_DONT_TRANSFORM="/dev/null"
2363     OAD_KEEP_ORIGINAL="/dev/null"
2364     OAD_CB2M_FILES="/dev/null"
2365     echo " looking for dontCompile file: "
2366     for i in "." $MODS ; do
2367     if test -r $i"/dontCompile" ; then
2368     OAD_DONT_COMPILE=$i"/dontCompile"
2369     echo " found $OAD_DONT_COMPILE"
2370     break
2371     fi
2372     done
2373     echo " looking for dontTransform file: "
2374     for i in "." $MODS ; do
2375     if test -r $i"/dontTransform" ; then
2376     OAD_DONT_TRANSFORM=$i"/dontTransform"
2377     echo " found $OAD_DONT_TRANSFORM"
2378     break
2379     fi
2380     done
2381     echo " looking for keepOriginal file: "
2382     for i in "." $MODS ; do
2383     if test -r $i"/keepOriginal" ; then
2384     OAD_KEEP_ORIGINAL=$i"/keepOriginal"
2385     echo " found $OAD_KEEP_ORIGINAL"
2386     break
2387     fi
2388     done
2389     echo " looking for cb2mFiles: "
2390     for i in "." $MODS ; do
2391     if test -r $i"/cb2mFiles" ; then
2392     OAD_CB2M_FILES=$i"/cb2mFiles"
2393     echo " found $OAD_CB2M_FILES"
2394     break
2395     fi
2396     done
2397     echo " OpenAD exceptions: "
2398     fi
2399    
2400 edhill 1.1 echo "# This section creates symbolic links" > srclinks.tmp
2401     echo "" >> srclinks.tmp
2402 jmc 1.176 printf 'F77_SRC_FILES = ' > F77srclist.tmp
2403     printf 'NON_AD_F77_SRC_FILES = ' > nonADF77srclist.tmp
2404     printf 'C_SRC_FILES = ' > csrclist.tmp
2405     printf 'F90_SRC_FILES = ' > F90srclist.tmp
2406     printf 'H_SRC_FILES = ' > hsrclist.tmp
2407     printf 'AD_FLOW_FILES = ' > ad_flow_files.tmp
2408 adcroft 1.9 alldirs="$SOURCEDIRS $INCLUDEDIRS ."
2409 edhill 1.1 for d in $alldirs ; do
2410     deplist=
2411 edhill 1.14 sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
2412 cnh 1.3 sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
2413 jmc 1.206 if test "x$OPENAD" != x ; then
2414 jmc 1.176 sfiles=`( echo $sfiles | grep -v _cb2m\. )`
2415     fi
2416 edhill 1.1 for sf in $sfiles ; do
2417     if test ! -r ".links.tmp/$sf" ; then
2418     if test -f "$d/$sf" ; then
2419 edhill 1.131 ignore_f=f
2420 adcroft 1.44 case $d/$sf in
2421     ./$PACKAGES_DOT_H)
2422 edhill 1.141 ignore_f=t
2423 adcroft 1.44 ;;
2424     ./AD_CONFIG.h)
2425 edhill 1.141 ignore_f=t
2426 adcroft 1.44 ;;
2427     ./FC_NAMEMANGLE.h)
2428 edhill 1.141 ignore_f=t
2429 adcroft 1.44 ;;
2430 edhill 1.98 ./BUILD_INFO.h)
2431 edhill 1.141 ignore_f=t
2432     ;;
2433     ./EMBEDDED_FILES.h)
2434     ignore_f=t
2435 edhill 1.98 ;;
2436 adcroft 1.44 *)
2437 edhill 1.131 # For the local directory *ONLY*,
2438     # ignore all soft-links
2439     if test "x$HAVE_TEST_L" = xt -a "x$d" = x. -a -L $sf ; then
2440     ignore_f=t
2441     else
2442     touch .links.tmp/$sf
2443     deplist="$deplist $sf"
2444     fi
2445 adcroft 1.44 ;;
2446     esac
2447 edhill 1.131 if test "x$ignore_f" = xf ; then
2448     extn=`echo $sf | $AWK -F. '{print $NF}'`
2449     case $extn in
2450 jmc 1.176 F)
2451     echo " \\" >> F77srclist.tmp
2452     printf " $sf" >> F77srclist.tmp
2453 jmc 1.206 if test "x$OPENAD" != x ; then
2454 jmc 1.176 basename=${sf%%.F}
2455     isAD=`egrep ^$basename.f'[ ]*' adSrcFiles.tmp`
2456 jmc 1.206 if test -z "$isAD" ; then
2457 jmc 1.176 toBeIgnored=`egrep ^$basename'[ ]*' ${OAD_DONT_COMPILE}`
2458 jmc 1.206 if test -z "$toBeIgnored" ; then
2459 jmc 1.176 echo " \\" >> nonADF77srclist.tmp
2460     printf " $sf" >> nonADF77srclist.tmp
2461 jmc 1.206 else
2462 jmc 1.176 echo " not to be compiled : $sf"
2463     fi
2464 jmc 1.206 else # file is initially listed as an AD file we want to exclude it
2465 jmc 1.176 # or we want to retain the untransformed version
2466     notToBeTransformed=`egrep ^$basename'[ ]*' ${OAD_DONT_TRANSFORM}`
2467     untransformedVersionToBeKept=`egrep ^$basename'[ ]*' ${OAD_KEEP_ORIGINAL}`
2468 jmc 1.206 if test -n "$notToBeTransformed"; then
2469 jmc 1.176 echo " not to be transformed: $sf"
2470     fi
2471     if test -n "$untransformedVersionToBeKept" ; then
2472     echo " original to be kept : $sf"
2473 jmc 1.206 fi
2474 jmc 1.176 if test -n "$notToBeTransformed" -o -n "$untransformedVersionToBeKept" ; then
2475     echo " \\" >> nonADF77srclist.tmp
2476     printf " $sf" >> nonADF77srclist.tmp
2477     fi
2478     fi
2479     fi
2480     ;;
2481     F90)
2482     echo " \\" >> F90srclist.tmp
2483     printf " $sf" >> F90srclist.tmp
2484     ;;
2485     c)
2486     echo " \\" >> csrclist.tmp
2487     printf " $sf" >> csrclist.tmp
2488     ;;
2489     h)
2490     echo " \\" >> hsrclist.tmp
2491     printf " $sf" >> hsrclist.tmp
2492     ;;
2493     flow)
2494     echo " \\" >> ad_flow_files.tmp
2495     printf " $sf" >> ad_flow_files.tmp
2496     ;;
2497     esac
2498     fi
2499 edhill 1.1 fi
2500     fi
2501     done
2502     if test "x$deplist" != x ; then
2503 jmc 1.176 if test "$d" != "." ; then
2504     echo "" >> srclinks.tmp
2505 edhill 1.2 echo "# These files are linked from $d" >> srclinks.tmp
2506 edhill 1.1 echo "$deplist :" >> srclinks.tmp
2507 jahn 1.170 # We need to make sure that the link isn't already there.
2508     # This may happen when make thinks that a header file has to be "remade"
2509     # because a module it depends on has changed. In this case we do nothing.
2510     printf "\tif [ ! -L \$@ ]; then \$(LN) %s/\$@ \$@; fi\n" $d >> srclinks.tmp
2511 jmc 1.176 fi
2512 edhill 1.1 fi
2513     done
2514     rm -rf .links.tmp
2515 jmc 1.176 echo "" >> F77srclist.tmp
2516     echo "" >> nonADF77srclist.tmp
2517     echo "" >> csrclist.tmp
2518     echo "" >> F90srclist.tmp
2519     echo "" >> hsrclist.tmp
2520     echo "" >> ad_flow_files.tmp
2521 edhill 1.1
2522 jmc 1.192 CMDLINE=$0
2523     for xx in "$@" ; do nw=`echo $xx | wc -w`
2524     if test $nw = '1' ; then CMDLINE="$CMDLINE $xx"
2525     else CMDLINE="$CMDLINE '$xx'" ; fi
2526     done
2527    
2528 edhill 1.88 if test -f $MAKEFILE ; then
2529 jmc 1.205 mv -f $MAKEFILE "$MAKEFILE.old"
2530 edhill 1.1 fi
2531     echo " Writing makefile: $MAKEFILE"
2532     echo "# Multithreaded + multi-processing makefile for:" > $MAKEFILE
2533     echo "# $MACHINE" >> $MAKEFILE
2534     echo "# This makefile was generated automatically on" >> $MAKEFILE
2535     echo "# $THISDATE" >> $MAKEFILE
2536     echo "# by the command:" >> $MAKEFILE
2537 jmc 1.192 echo "# $CMDLINE" >> $MAKEFILE
2538 edhill 1.1 echo "# executed by:" >> $MAKEFILE
2539 edhill 1.97 echo "# ${THISUSER}@${THISHOST}:${THISCWD}" >> $MAKEFILE
2540 edhill 1.21
2541     EXE_AD=$EXECUTABLE"_ad"
2542     EXE_FTL=$EXECUTABLE"_ftl"
2543     EXE_SVD=$EXECUTABLE"_svd"
2544    
2545 edhill 1.1 cat >>$MAKEFILE <<EOF
2546 edhill 1.53 #
2547     # OPTFILE="$OPTFILE"
2548 jmc 1.205 #
2549 edhill 1.1 # BUILDDIR : Directory where object files are written
2550     # SOURCEDIRS : Directories containing the source (.F) files
2551     # INCLUDEDIRS : Directories containing the header-source (.h) files
2552     # EXEDIR : Directory where executable that is generated is written
2553     # EXECUTABLE : Full path of executable binary
2554     #
2555     # CPP : C-preprocessor command
2556     # INCLUDES : Directories searched for header files
2557     # DEFINES : Macro definitions for CPP
2558     # MAKEDEPEND : Dependency generator
2559     # KPP : Special preprocessor command (specific to platform)
2560     # KFLAGS : Flags for KPP
2561     # FC : Fortran compiler command
2562     # FFLAGS : Configuration/debugging options for FC
2563     # FOPTIM : Optimization options for FC
2564     # LINK : Command for link editor program
2565     # LIBS : Library flags /or/ additional optimization/debugging flags
2566    
2567     ROOTDIR = ${ROOTDIR}
2568 jmc 1.205 BUILDDIR = ${BUILDDIR}
2569 edhill 1.1 SOURCEDIRS = ${SOURCEDIRS}
2570     INCLUDEDIRS = ${INCLUDEDIRS}
2571     EXEDIR = ${EXEDIR}
2572     EXECUTABLE = \$(EXEDIR)/${EXECUTABLE}
2573     TOOLSDIR = ${TOOLSDIR}
2574    
2575 edhill 1.14 #eh3 new defines for the adjoint work
2576     AUTODIFF = ${ROOTDIR}/pkg/autodiff
2577 edhill 1.21 EXE_AD = ${EXE_AD}
2578     EXE_FTL = ${EXE_FTL}
2579     EXE_SVD = ${EXE_SVD}
2580 edhill 1.14
2581 adcroft 1.44 ENABLED_PACKAGES = ${ENABLED_PACKAGES}
2582     DISABLED_PACKAGES = ${DISABLED_PACKAGES}
2583    
2584 adcroft 1.52 # These files are created by Makefile
2585 edhill 1.97 SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h BUILD_INFO.h
2586 edhill 1.141 EOF
2587 adcroft 1.52
2588 edhill 1.141 if test "x$EMBED_SRC" = xt ; then
2589     echo "EMBEDDED_FILES = EMBEDDED_FILES.h" >>$MAKEFILE
2590     else
2591     echo "EMBEDDED_FILES = " >>$MAKEFILE
2592     fi
2593 edhill 1.1
2594     cat >>$MAKEFILE <<EOF
2595     # Unix ln (link)
2596     LN = ${LN}
2597     # C preprocessor
2598     CPP = cat \$< | ${S64} | ${CPP}
2599     # Dependency generator
2600     MAKEDEPEND = ${MAKEDEPEND}
2601     # Special preprocessor (KAP on DECs, FPP on Crays)
2602     KPP = ${KPP}
2603     # Fortran compiler
2604 edhill 1.94 FC = ${FC}
2605 cnh 1.3 # Fortran compiler
2606     F90C = ${F90C}
2607 edhill 1.92 # C compiler
2608     CC = ${CC}
2609 edhill 1.1 # Link editor
2610 edhill 1.70 LINK = ${LINK} ${LDADD}
2611 edhill 1.1
2612     # Defines for CPP
2613     DEFINES = ${DEFINES}
2614     # Includes for CPP
2615     INCLUDES = ${INCLUDES}
2616     # Flags for KPP
2617     KFLAGS1 = ${KFLAGS1}
2618     KFLAGS2 = ${KFLAGS2}
2619     # Optim./debug for FC
2620 mlosch 1.165 FFLAGS = ${FFLAGS} ${FEXTRAFLAGS}
2621 edhill 1.1 FOPTIM = ${FOPTIM}
2622 cnh 1.3 # Optim./debug for FC
2623     F90FLAGS = ${F90FLAGS}
2624     F90OPTIM = ${F90OPTIM}
2625 jmc 1.176 F90FIXEDFORMAT = ${F90FIXEDFORMAT}
2626 edhill 1.1 # Flags for CC
2627     CFLAGS = ${CFLAGS}
2628     # Files that should not be optimized
2629     NOOPTFILES = ${NOOPTFILES}
2630     NOOPTFLAGS = ${NOOPTFLAGS}
2631     # Flags and libraries needed for linking
2632 edhill 1.107 LIBS = ${LIBS}
2633 cnh 1.3 # Name of the Mekfile
2634     MAKEFILE=${MAKEFILE}
2635 edhill 1.1
2636     EOF
2637    
2638 jmc 1.176 cat F77srclist.tmp >> $MAKEFILE
2639     cat nonADF77srclist.tmp >> $MAKEFILE
2640     cat csrclist.tmp >> $MAKEFILE
2641     cat F90srclist.tmp >> $MAKEFILE
2642     cat hsrclist.tmp >> $MAKEFILE
2643     cat ad_flow_files.tmp >> $MAKEFILE
2644    
2645     rm -f F77srclist.tmp nonADF77srclist.tmp csrclist.tmp F90srclist.tmp hsrclist.tmp ad_flow_files.tmp
2646    
2647 edhill 1.75 echo >> $MAKEFILE
2648 jmc 1.176
2649 jmc 1.205 # add definitions for preprocessed sources
2650     # and note that not all systems allow case sensitive extensions
2651     # hence the $FS and $FS90 here.
2652     # for fixed format f90 files we use ff90 or FF90 resp
2653 jmc 1.176 # but these are not expected to be the original source files
2654    
2655     echo 'F77_PP_SRC_FILES = $(F77_SRC_FILES:.F=.'$FS')' >> $MAKEFILE
2656     echo 'F90_PP_SRC_FILES = $(F90_SRC_FILES:.F90=.'$FS90')' >> $MAKEFILE
2657     echo 'OBJFILES= $(F77_SRC_FILES:.F=.o) $(C_SRC_FILES:.c=.o) $(F90_SRC_FILES:.F90=.o)' >> $MAKEFILE
2658 dfer 1.172 echo 'FLOFILES = $(AD_FLOW_FILES:.flow=.flowdir)' >> $MAKEFILE
2659 edhill 1.75 echo >> $MAKEFILE
2660     echo '.SUFFIXES:' >> $MAKEFILE
2661 jmc 1.176 echo '.SUFFIXES: .o .'$FS' .p .F .c .f'$FS90' .'$FS90' .FF90 .F90 .flowdir .flow' >> $MAKEFILE
2662 edhill 1.1
2663     cat >>$MAKEFILE <<EOF
2664    
2665     all: \$(EXECUTABLE)
2666 jmc 1.176 \$(EXECUTABLE): \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(OBJFILES) \$(EMBEDDED_FILES)
2667 adcroft 1.44 @echo Creating \$@ ...
2668 edhill 1.1 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
2669     depend:
2670     @make links
2671 jmc 1.176 \$(MAKEDEPEND) -o .$FS \$(DEFINES) \$(INCLUDES) \$(F77_SRC_FILES)
2672 adcroft 1.44 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
2673 edhill 1.72 -rm -f makedepend.out
2674 edhill 1.1
2675 cnh 1.132 lib: libmitgcmuv.a
2676    
2677     libmitgcmuv.a: \$(OBJFILES)
2678     ar rcv libmitgcmuv.a \$(OBJFILES)
2679 cnh 1.159 ar d libmitgcmuv.a main.o
2680 cnh 1.132
2681 jmc 1.176 links: \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(SPECIAL_FILES)
2682 edhill 1.1
2683 jmc 1.176 small_f: \$(F77_PP_SRC_FILES) \$(F90_PP_SRC_FILES)
2684 edhill 1.1
2685     output.txt: \$(EXECUTABLE)
2686     @printf 'running ... '
2687     @\$(EXECUTABLE) > \$@
2688    
2689     clean:
2690 heimbach 1.157 -rm -rf *.p *.$FS90 *.mod ${RMFILES} work.{pc,pcl} *.template
2691     -rm -rf *.o
2692 dfer 1.172 -rm -rf *.$FS *.flowdir
2693 utke 1.193 -rm -rf *.f$FS90 \$(AD_CLEAN) ad_input*
2694 edhill 1.1 Clean:
2695     @make clean
2696     @make cleanlinks
2697 adcroft 1.52 -rm -f \$(SPECIAL_FILES)
2698 jmc 1.204 -rm -f genmake_state genmake_*optfile genmake_warnings genmake_errors
2699 jmc 1.205 -rm -f make.log run.log f90mkdepend.log *.bak "$MAKEFILE.old"
2700 jmc 1.166 -rm -f taf_command taf_output taf_ad.log taf_ad_flow.log
2701 edhill 1.1 CLEAN:
2702     @make Clean
2703     -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
2704     -find \$(EXEDIR) -name "*.data" -exec rm {} \;
2705     -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
2706 jmc 1.152 -rm -f \$(EXECUTABLE) \$(EXE_AD) *.txt STD* *diagnostics.log datetime
2707 jmc 1.166 -rm -f *_MIT_CE_000.opt0000 costfunction*0000
2708 edhill 1.144 -rm -rf mnc_test_*
2709 edhill 1.1
2710 edhill 1.18 #eh3 Makefile: makefile
2711 edhill 1.1 makefile:
2712 edhill 1.73 $THIS_SCRIPT $G2ARGS
2713 edhill 1.1 cleanlinks:
2714     -find . -type l -exec rm {} \;
2715    
2716 jmc 1.176 # Special targets (SPECIAL_FILES) which are created by make
2717 adcroft 1.44 ${PACKAGES_DOT_H}:
2718     @echo Creating \$@ ...
2719 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) > \$@
2720 adcroft 1.44 AD_CONFIG.h:
2721     @echo Creating \$@ ...
2722 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 > \$@
2723 adcroft 1.52 FC_NAMEMANGLE.h:
2724     @echo Creating \$@ ...
2725     echo "$FC_NAMEMANGLE" > \$@
2726 adcroft 1.44
2727 edhill 1.97 BUILD_INFO.h:
2728     @echo Creating \$@ ...
2729     EOF
2730    
2731     test ! "x$THISVER" = x && echo " -echo \"#define THISVER '$THISVER'\" > \$@" >> $MAKEFILE
2732     test ! "x$THISUSER" = x && echo " -echo \"#define THISUSER '$THISUSER'\" >> \$@" >> $MAKEFILE
2733     test ! "x$THISDATE" = x && echo " -echo \"#define THISDATE '$THISDATE'\" >> \$@" >> $MAKEFILE
2734     test ! "x$THISHOST" = x && echo " -echo \"#define THISHOST '$THISHOST'\" >> \$@" >> $MAKEFILE
2735    
2736 edhill 1.141 if test "x$EMBED_SRC" = xt ; then
2737     cat >>$MAKEFILE <<EOF
2738    
2739     decode_files.o : EMBEDDED_FILES.h
2740    
2741 jmc 1.205 ## \$(F77_PP_SRC_FILES)
2742 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
2743 edhill 1.141 @echo Creating \$@ ...
2744 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
2745 edhill 1.141 -rm -f all_fF.tar.gz
2746     -gzip all_fF.tar
2747    
2748     EMBEDDED_FILES.h : all_fF.tar.gz
2749     @echo Creating \$@ ...
2750     -\${ROOTDIR}/tools/embed_encode/encode_files EMBEDDED_FILES.h all_fF.tar.gz
2751    
2752     EOF
2753     fi
2754    
2755 edhill 1.97 cat >>$MAKEFILE <<EOF
2756    
2757 edhill 1.76 # The normal chain of rules is ( .F - .$FS - .o )
2758    
2759 edhill 1.101 ## This nullifies any default implicit rules concerning these two file types:
2760 jmc 1.177 ## %.o : %.F
2761 edhill 1.76
2762     .F.$FS:
2763 edhill 1.1 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2764 edhill 1.76 .$FS.o:
2765 edhill 1.1 \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
2766 jmc 1.176 .F90.$FS90:
2767     \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2768     .FF90.f$FS90:
2769     \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2770     .$FS90.o:
2771 cnh 1.3 \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
2772 jmc 1.176 .f$FS90.o:
2773     cp \$< \$(basename \$<).f90
2774     \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$(F90FIXEDFORMAT) \$(basename \$<).f90
2775 edhill 1.1 .c.o:
2776 ce107 1.139 \$(CC) \$(CFLAGS) \$(DEFINES) \$(INCLUDES) -c \$<
2777 dfer 1.172 .flow.flowdir:
2778 heimbach 1.171 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2779 edhill 1.1
2780 edhill 1.76 # Special exceptions that use the ( .F - .p - .$FS - .o ) rule-chain
2781     .F.p:
2782 edhill 1.1 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2783 edhill 1.76 .p.$FS:
2784 edhill 1.1 \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
2785 edhill 1.14
2786 jmc 1.176 EOF
2787    
2788 edhill 1.14 #=========================================
2789     #=== Automatic Differentiation Rules ===
2790 jmc 1.176 #=== for TAMC/TAF ======================
2791    
2792 jmc 1.206 if test "x$OPENAD" = x ; then
2793 jmc 1.176
2794     cat >>$MAKEFILE <<EOF
2795 edhill 1.14
2796     TAMC = ${TAMC}
2797     TAF = ${TAF}
2798    
2799 edhill 1.17 TAF_EXTRA = ${TAF_EXTRA}
2800     TAMC_EXTRA = ${TAMC_EXTRA}
2801    
2802 edhill 1.14 EOF
2803    
2804     ad_vars="AD_TAMC_FLAGS AD_TAF_FLAGS"
2805     ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF_FLAGS"
2806     ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
2807     for i in $ad_vars ; do
2808     name=$i
2809 edhill 1.151 t1="t2=\$"`echo "$i"`
2810 edhill 1.14 eval $t1
2811     printf "%-20s = " $name >> $MAKEFILE
2812 edhill 1.151 echo "$t2" | sed -e 's| \+| |g' >> $MAKEFILE
2813 edhill 1.14 done
2814    
2815     echo " Add the source list for AD code generation"
2816     echo >> $MAKEFILE
2817 edhill 1.71 printf "AD_FILES = " >> $MAKEFILE
2818 jmc 1.176 AD_FILES=`cat adSrcFiles.tmp`
2819 edhill 1.14 for i in $AD_FILES ; do
2820     echo " \\" >> $MAKEFILE
2821 edhill 1.71 printf " $i" >> $MAKEFILE
2822 edhill 1.14 done
2823     echo >> $MAKEFILE
2824 jmc 1.176 rm -f adSrcFiles.tmp
2825 edhill 1.14
2826     cat >>$MAKEFILE <<EOF
2827    
2828 edhill 1.16 # ... AD ...
2829 jmc 1.152 adall: \$(EXE_AD)
2830 edhill 1.121 adtaf: ad_taf_output.$FS
2831     adtamc: ad_tamc_output.$FS
2832 edhill 1.21
2833 jmc 1.189 ad_input_code.$FS: \$(AD_FILES) \$(H_SRC_FILES) \$(AD_FLOW_FILES)
2834 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
2835 edhill 1.23 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
2836 adcroft 1.44 -rm -f ad_config.template
2837 jmc 1.176 @make \$(F77_PP_SRC_FILES)
2838 heimbach 1.171 @make \$(FLOFILES)
2839 mlosch 1.198 cat \$(FLOFILES) \$(AD_FILES) | sed -f \$(TOOLSDIR)/remove_comments_sed > ad_input_code.$FS
2840 edhill 1.22
2841 edhill 1.121 ad_taf_output.$FS: ad_input_code.$FS
2842     \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2843 jmc 1.173 ls -l ad_input_code_ad.$FS
2844 edhill 1.121 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2845 heimbach 1.37
2846     adtafonly:
2847 edhill 1.121 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2848 jmc 1.173 ls -l ad_input_code_ad.$FS
2849 edhill 1.121 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2850 edhill 1.14
2851 jmc 1.152 \${EXE_AD}: ad_taf_output.o \$(OBJFILES)
2852 jmc 1.206 \$(LINK) -o \${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
2853 edhill 1.14
2854 edhill 1.121 ad_tamc_output.$FS: ad_input_code.$FS
2855     \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.$FS
2856     cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.$FS
2857 edhill 1.14
2858     ad_tamc: ad_tamc_output.o \$(OBJFILES)
2859 jmc 1.206 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
2860 edhill 1.14
2861 heimbach 1.105 adonlyfwd:
2862 edhill 1.106 patch < \$(TOOLSDIR)/ad_taf_output.f.onlyfwd.diff
2863 jmc 1.206
2864 heimbach 1.105 adtrick:
2865 edhill 1.106 patch < \$(TOOLSDIR)/ad_taf_output.f.adtrick.diff
2866 edhill 1.14
2867 edhill 1.19 # ... FTL ...
2868 edhill 1.23 ftlall: ftl_taf
2869 edhill 1.121 ftltaf: ftl_taf_output.$FS
2870     ftltamc: ftl_tamc_output.$FS
2871 edhill 1.21
2872 jmc 1.176 ftl_input_code.$FS: \$(AD_FILES) \$(H_SRC_FILES)
2873 edhill 1.71 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -UALLOW_ADJOINT_RUN -DALLOW_TANGENTLINEAR_RUN -UALLOW_ECCO_OPTIMIZATION > ftl_config.template
2874 edhill 1.23 cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
2875 adcroft 1.44 -rm -f ftl_config.template
2876 jmc 1.176 @make \$(F77_PP_SRC_FILES)
2877 edhill 1.22 @make \$(AD_FLOW_FILES)
2878 edhill 1.121 cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.$FS
2879 edhill 1.22
2880 edhill 1.121 ftl_taf_output.$FS: ftl_input_code.$FS
2881     \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
2882 jmc 1.173 ls -l ftl_input_code_ftl.$FS
2883 edhill 1.121 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
2884 edhill 1.14
2885 heimbach 1.40 ftltafonly:
2886 edhill 1.121 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
2887 jmc 1.173 ls -l ftl_input_code_ftl.$FS
2888 edhill 1.121 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
2889 heimbach 1.40
2890 edhill 1.19 ftl_taf: ftl_taf_output.o \$(OBJFILES)
2891 jmc 1.206 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
2892 edhill 1.14
2893 edhill 1.121 ftl_tamc_output.$FS: ftl_input_code.$FS
2894     \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.$FS
2895     cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.$FS
2896 edhill 1.16
2897 edhill 1.19 ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
2898 jmc 1.206 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
2899 edhill 1.16
2900    
2901     # ... SVD ...
2902 edhill 1.121 svdtaf: ad_taf_output.$FS ftl_taf_output.$FS
2903 heimbach 1.109 @echo "--->>> Only ran TAF to generate SVD code! <<<---"
2904     @echo "--->>> Do make svdall afterwards to compile. <<<---"
2905     svdall: svd_touch svd_taf
2906 edhill 1.16
2907 heimbach 1.109 svd_taf: \$(OBJFILES)
2908 heimbach 1.40 \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
2909 edhill 1.14
2910 heimbach 1.109 @echo "--->>> Only COMPILE svd code! <<<---"
2911     @echo "--->>> Assumes you previously <<<---"
2912     @echo "--->>> did make svdtaf <<<---"
2913    
2914     svd_touch:
2915     @echo "--->>> Only COMPILE svd code! <<<---"
2916     @echo "--->>> Assumes you previously <<<---"
2917     @echo "--->>> did make svdtaf <<<---"
2918 edhill 1.121 touch ad_taf_output.$FS ftl_taf_output.$FS
2919     \$(FC) \$(FFLAGS) \$(FOPTIM) -c ad_taf_output.$FS
2920