/[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.136 - (hide annotations) (download)
Thu Nov 24 17:52:15 2005 UTC (18 years, 3 months ago) by edhill
Branch: MAIN
Changes since 1.135: +13 -5 lines
 o small cleanup of the default-compiler-selection code

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

  ViewVC Help
Powered by ViewVC 1.1.22