/[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.138 - (hide annotations) (download)
Sun Dec 4 13:57:08 2005 UTC (13 years, 9 months ago) by edhill
Branch: MAIN
CVS Tags: checkpoint57y_post, checkpoint57y_pre, checkpoint57x_post
Changes since 1.137: +2 -2 lines
 o fix bad syntax -- as reported by Martin Losch

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

  ViewVC Help
Powered by ViewVC 1.1.22