/[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.135 - (hide annotations) (download)
Thu Nov 17 20:06:08 2005 UTC (18 years, 4 months ago) by edhill
Branch: MAIN
Changes since 1.134: +26 -21 lines
 o fix the compile tests per Martin's bug report:
     http://mitgcm.org/pipermail/mitgcm-devel/2005-November/001760.html
   and add more output to the genmake_warnings file so that its easier
   to diagnose what goes wrong with tests such as netcdf, etc.

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

  ViewVC Help
Powered by ViewVC 1.1.22