/[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.77 - (hide annotations) (download)
Thu Apr 8 23:48:43 2004 UTC (19 years, 11 months ago) by edhill
Branch: MAIN
CVS Tags: checkpoint52m_post
Changes since 1.76: +26 -10 lines
 o MITgcm now builds and runs on cygwin
   - Note that there is still a problem due to directories in
     verification named "aux".  Apparently, windows is such
     broken crap that that you cannot use "aux" as a file or
     dir name.  In the mean time, check out the code using:
       cvs co MITgcm_verif_basic
     and you can avoid those directories.

1 edhill 1.49 #! /usr/bin/env bash
2 edhill 1.1 #
3 edhill 1.77 # $Header: /u/gcmpack/MITgcm/tools/genmake2,v 1.76 2004/04/08 21:32:11 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.75 test -e Makefile && mv -f Makefile Makefile.bak
126     cat <<EOF >> Makefile
127 edhill 1.77 %.$tfs : %.F
128 edhill 1.75 .SUFFIXES:
129 edhill 1.76 genmake_hello.$tfs: genmake_hello.F
130     $LN genmake_hello.F genmake_hello.$tfs
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.76 if test "x$RETVAL" != x0 -o ! -e "genmake_hello."$tfs ; then
135     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.76 rm -f genmake_hello.* Makefile
152 edhill 1.75 test -e Makefile && mv -f Makefile.bak Makefile
153    
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.1 # Guess possible config options for this host
162     find_possible_configs() {
163    
164 edhill 1.11 tmp1=`uname`"_"`uname -m`
165     tmp2=`echo $tmp1 | sed -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
166 edhill 1.25 tmp3=`echo $tmp2 | sed -e 's/power macintosh/ppc/'`
167 edhill 1.56 tmp1=`echo $tmp3 | sed -e 's|x86_64|amd64|'`
168     tmp2=`echo $tmp1 | sed -e 's/i[3-6]86/ia32/' | sed -e 's/athlon/ia32/'`
169 edhill 1.72 tmp3=`echo $tmp2 | sed -e 's/cray sv1/craysv1/'`
170     PLATFORM=$tmp3
171 edhill 1.77 echo $PLATFORM | grep cygwin > /dev/null 2>&1 && PLATFORM=cygwin_ia32
172 edhill 1.11 OFLIST=`(cd $ROOTDIR/tools/build_options; ls | grep "^$PLATFORM")`
173     echo " The platform appears to be: $PLATFORM"
174    
175 edhill 1.1 echo "test" > test
176     ln -s ./test link
177     RETVAL=$?
178     if test "x${RETVAL}" = x0 ; then
179 edhill 1.11 LN="ln -s"
180     else
181     echo "Error: \"ln -s\" does not appear to work on this system!"
182     echo " For help, please contact <MITgcm-support@mitgcm.org>."
183     exit 1
184 edhill 1.1 fi
185     rm -f test link
186    
187 edhill 1.11 if test "x$CPP" = x ; then
188     CPP="cpp -traditional -P"
189 adcroft 1.33 fi
190    
191 edhill 1.69 # The "original" makedepend is part of the Imake system that is
192     # most often distributed with XFree86 or with an XFree86 source
193     # package. As a result, many machines (eg. generic Linux) do not
194     # have a system-default "makedepend" available. For those
195     # systems, we have two fall-back options:
196     #
197     # 1) a makedepend implementation shipped with the cyrus-imapd
198     # package: ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/
199     #
200     # 2) a known-buggy xmakedpend shell script
201     #
202     # So the choices are, in order:
203     #
204     # 1) use the user-specified program
205     # 2) use a system-wide default
206     # 3) locally build and use the cyrus implementation
207     # 4) fall back to the buggy local xmakedpend script
208     #
209 adcroft 1.33 if test "x${MAKEDEPEND}" = x ; then
210 edhill 1.72 which makedepend > /dev/null 2>&1
211 edhill 1.77 RV0=$?
212     cat <<EOF >> genmake_tc.f
213     program test
214     write(*,*) 'test'
215     stop
216     end
217     EOF
218     makedepend genmake_tc.f > /dev/null 2>&1
219     RV1=$?
220     if test ! "x${RV0}${RV1}" = x00 ; then
221 edhill 1.69 echo " a system-default makedepend was not found."
222    
223     # Try to build the cyrus impl
224     rm -f ./genmake_cy_md
225     (
226     cd $ROOTDIR/tools/cyrus-imapd-makedepend \
227     && ./configure > /dev/null 2>&1 \
228 edhill 1.77 && make > /dev/null 2>&1
229     if test -x ./makedepend.exe ; then
230     $LN ./makedepend.exe ./makedepend
231     fi
232     ./makedepend ifparser.c > /dev/null 2>&1 \
233 edhill 1.69 && echo "true"
234     ) > ./genmake_cy_md
235     grep true ./genmake_cy_md > /dev/null 2>&1
236     RETVAL=$?
237     if test "x$RETVAL" = x0 ; then
238     MAKEDEPEND='$(TOOLSDIR)/cyrus-imapd-makedepend/makedepend'
239     else
240     MAKEDEPEND='$(TOOLSDIR)/xmakedepend'
241     fi
242     rm -f ./genmake_cy_md
243 adcroft 1.33 fi
244 edhill 1.1 fi
245    
246     # look for possible fortran compilers
247 cnh 1.24 tmp="$MITGCM_FC $FC efc g77 f77 pgf77 pgf95 ifc f90 f95 mpif77 mpf77 mpxlf95"
248 edhill 1.1 p_FC=
249 edhill 1.11 for c in $tmp ; do
250     rm -f ./hello.f ./hello
251     cat >> hello.f <<EOF
252     program hello
253     do i=1,3
254     print *, 'hello world : ', i
255     enddo
256     end
257     EOF
258     $c -o hello hello.f > /dev/null 2>&1
259 edhill 1.1 RETVAL=$?
260     if test "x${RETVAL}" = x0 ; then
261     p_FC="$p_FC $c"
262     fi
263     done
264 edhill 1.21 rm -f ./hello.f ./hello
265 edhill 1.1 if test "x${p_FC}" = x ; then
266 edhill 1.11 cat 1>&2 <<EOF
267    
268     Error: No Fortran compilers were found in your path. Please specify one using:
269    
270     1) an "optfile" on (eg. "-optfile=path/to/OPTFILE"),
271     2) a command-line option (eg. "-fc NAME"), or
272     3) the MITGCM_FC environment variable.
273    
274     EOF
275     exit 1
276 edhill 1.1 else
277 edhill 1.11 echo " The possible FORTRAN compilers found in your path are:"
278     echo " "$p_FC
279     if test "x$FC" = x ; then
280 edhill 1.15 FC=`echo $p_FC | $AWK '{print $1}'`
281 adcroft 1.67 echo " Setting FORTRAN compiler to: "$FC
282 edhill 1.11 fi
283 edhill 1.1 fi
284    
285 adcroft 1.67 if test "x$OPTFILE" = x ; then
286     OPTFILE=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$FC
287     if test ! -r $OPTFILE ; then
288     echo " I looked for the file "$OPTFILE" but did not find it"
289     fi
290     fi
291     # echo " The options file: $p_OF"
292     # echo " appears to match so we'll use it."
293     # for i in $p_FC ; do
294     #p_OF=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$i
295     #if test -r $p_OF ; then
296     # OPTFILE=$p_OF
297     # echo " The options file: $p_OF"
298     # echo " appears to match so we'll use it."
299     # break
300     #fi
301     # done
302 edhill 1.11 if test "x$OPTFILE" = x ; then
303     cat 1>&2 <<EOF
304    
305     Error: No options file was found in: $ROOTDIR/tools/build_options/
306     that matches this platform ("$PLATFORM") and the compilers found in
307     your path. Please specify an "optfile" using:
308    
309     1) the command line (eg. "-optfile=path/to/OPTFILE"), or
310     2) the MITGCM_OF environment variable.
311    
312     If you need help, please contact the developers at <MITgcm-support@mitgcm.org>.
313    
314 edhill 1.1 EOF
315 edhill 1.11 exit 1
316 edhill 1.1 fi
317 edhill 1.11
318     # # look for possible MPI libraries
319     # mpi_libs=
320     # mpi_fort=`which mpif77 2>/dev/null`
321     # RETVAL=$?
322     # if test "x${RETVAL}" = x0 ; then
323     # cat >>test.f <<EOF
324     # PROGRAM HELLO
325     # DO 10, I=1,10
326     # PRINT *,'Hello World'
327     # 10 CONTINUE
328     # STOP
329     # END
330     # EOF
331     # eval "$mpi_fort -showme test.f > out"
332     # RETVAL=$?
333     # if test "x${RETVAL}" = x0 ; then
334     # a=`cat out`
335     # for i in $a ; do
336     # case $i in
337     # -*)
338     # mpi_libs="$mpi_libs $i" ;;
339     # esac
340     # done
341     # echo "The MPI libs appear to be:"
342     # echo " "$mpi_libs
343     # fi
344     # rm -f test.f out
345     # fi
346 edhill 1.1
347     }
348    
349     # Parse the package dependency information
350     get_pdepend_list() {
351    
352     # strip the comments and then convert the dependency file into
353     # two arrays: PNAME, DNAME
354     cat $1 | sed -e 's/#.*$//g' \
355 edhill 1.15 | $AWK 'BEGIN{nn=0;} (NF>0){ for(i=2;i<=NF;i++){nn++; print "PNAME["nn"]="$1"\nDNAME["nn"]="$i} }' \
356 edhill 1.1 > ./.pd_tmp
357 edhill 1.34 . ./.pd_tmp
358 edhill 1.1 rm -f ./.pd_tmp
359    
360 edhill 1.71 printf "PNAME = "${}
361 edhill 1.1 }
362    
363    
364     # Explain usage
365     usage() {
366 edhill 1.41 cat <<EOF
367    
368     Usage: "$0" [OPTIONS]
369     where [OPTIONS] can be:
370    
371     -help | --help | -h | --h
372     Print this help message and exit.
373    
374     -nooptfile | --nooptfile
375     -optfile NAME | --optfile NAME | -of NAME | --of NAME
376     -optfile=NAME | --optfile=NAME | -of=NAME | --of=NAME
377     Use "NAME" as the optfile. By default, an attempt will be
378     made to find an appropriate "standard" optfile in the
379     tools/build_options/ directory.
380    
381     -pdepend NAME | --pdepend NAME
382     -pdepend=NAME | --pdepend=NAME
383     Get package dependency information from "NAME".
384    
385     -pdefault NAME | --pdefault NAME
386     -pdefault=NAME | --pdefault=NAME
387     Get the default package list from "NAME".
388    
389     -make NAME | -m NAME
390     --make=NAME | -m=NAME
391     Use "NAME" for the MAKE program. The default is "make" but
392     many platforms, "gmake" is the preferred choice.
393    
394     -makefile NAME | -mf NAME
395     --makefile=NAME | -mf=NAME
396     Call the makefile "NAME". The default is "Makefile".
397    
398 edhill 1.69 -makedepend NAME | -md NAME
399     --makedepend=NAME | -md=NAME
400     Use "NAME" for the MAKEDEPEND program.
401    
402 edhill 1.41 -rootdir NAME | --rootdir NAME | -rd NAME | --rd NAME
403     -rootdir=NAME | --rootdir=NAME | -rd=NAME | --rd=NAME
404     Specify the location of the MITgcm ROOTDIR as "NAME".
405     By default, genamke will try to find the location by
406     looking in parent directories (up to the 5th parent).
407    
408     -mods NAME | --mods NAME | -mo NAME | --mo NAME
409     -mods=NAME | --mods=NAME | -mo=NAME | --mo=NAME
410     Here, "NAME" specifies a list of directories that are
411     used for additional source code. Files found in the
412     "mods list" are given preference over files of the same
413     name found elsewhere.
414    
415     -disable NAME | --disable NAME
416     -disable=NAME | --disable=NAME
417     Here "NAME" specifies a list of packages that we don't
418     want to use. If this violates package dependencies,
419     genamke will exit with an error message.
420    
421     -enable NAME | --enable NAME
422     -enable=NAME | --enable=NAME
423     Here "NAME" specifies a list of packages that we wish
424     to specifically enable. If this violates package
425     dependencies, genamke will exit with an error message.
426    
427     -standarddirs NAME | --standarddirs NAME
428     -standarddirs=NAME | --standarddirs=NAME
429     Here, "NAME" specifies a list of directories to be
430     used as the "standard" code.
431    
432     -fortran NAME | --fortran NAME | -fc NAME | --fc NAME
433     -fc=NAME | --fc=NAME
434     Use "NAME" as the fortran compiler. By default, genmake
435     will search for a working compiler by trying a list of
436     "usual suspects" such as g77, f77, etc.
437    
438     -[no]ieee | --[no]ieee
439     Do or don't use IEEE numerics. Note that this option
440     *only* works if it is supported by the OPTFILE that
441     is being used.
442    
443 adcroft 1.67 -mpi | --mpi
444     Include MPI header files and link to MPI libraries
445     -mpi=PATH | --mpi=PATH
446     Include MPI header files and link to MPI libraries using MPI_ROOT
447     set to PATH. i.e. Include files from $PATH/include, link to libraries
448     from $PATH/lib and use binaries from $PATH/bin.
449    
450 edhill 1.71 -bash NAME
451     Explicitly specify the Bourne or BASH shell to use
452    
453 edhill 1.41 While it is most often a single word, the "NAME" variables specified
454     above can in many cases be a space-delimited string such as:
455    
456     --enable pkg1 --enable 'pkg1 pkg2' --enable 'pkg1 pkg2 pkg3'
457     -mods=dir1 -mods='dir1' -mods='dir1 dir2 dir3'
458     -foptim='-Mvect=cachesize:512000,transform -xtypemap=real:64,double:64,integer:32'
459    
460     which, depending upon your shell, may need to be single-quoted.
461    
462     For more detailed genmake documentation, please see:
463    
464     http://mitgcm.org/devel_HOWTO/
465    
466     EOF
467    
468 edhill 1.1 exit 1
469     }
470    
471 edhill 1.31 # Build a CPP macro to automate calling C routines from FORTRAN
472     get_fortran_c_namemangling() {
473     default_nm="#define FC_NAMEMANGLE(X) X ## _"
474    
475     cat > genmake_test.c <<EOF
476     void tcall( char * string ) { tsub( string ); }
477     EOF
478 edhill 1.39 $MAKE genmake_test.o >> genmake_warnings 2>&1
479 edhill 1.31 RETVAL=$?
480     if test "x$RETVAL" != x0 ; then
481     FC_NAMEMANGLE=$default_nm
482 edhill 1.39 cat <<EOF>> genmake_errors
483    
484     WARNING: C test compile fails
485     WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
486     WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here
487     EOF
488 edhill 1.31 return 1
489     fi
490 edhill 1.43 c_tcall=`nm genmake_test.o | grep 'T ' | grep tcall | cut -d ' ' -f 3`
491 edhill 1.31 RETVAL=$?
492     if test "x$RETVAL" != x0 ; then
493     FC_NAMEMANGLE=$default_nm
494 edhill 1.39 cat <<EOF>> genmake_warnings
495    
496     WARNING: The "nm" command failed.
497     WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
498     WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here
499     EOF
500 edhill 1.31 return 1
501     fi
502     cat > genmake_tcomp.f <<EOF
503     subroutine tcall( string )
504     character*(*) string
505     call tsub( string )
506     end
507     EOF
508 edhill 1.39 $FC $FFLAGS $DEFINES -c genmake_tcomp.f >> genmake_warnings 2>&1
509 edhill 1.31 RETVAL=$?
510     if test "x$RETVAL" != x0 ; then
511     FC_NAMEMANGLE=$default_nm
512 edhill 1.39 cat <<EOF>> genmake_warnings
513    
514     WARNING: FORTRAN test compile fails -- please see "genmake_errors"
515     WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
516     WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here.
517     EOF
518 edhill 1.31 return 1
519     fi
520 edhill 1.43 f_tcall=`nm genmake_tcomp.o | grep 'T ' | grep tcall | cut -d ' ' -f 3`
521 edhill 1.31 RETVAL=$?
522     if test "x$RETVAL" != x0 ; then
523     FC_NAMEMANGLE=$default_nm
524 edhill 1.39 cat <<EOF>> genmake_warnings
525    
526     WARNING: The "nm" command failed.
527     WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
528     WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here.
529     EOF
530 edhill 1.31 return 1
531     fi
532    
533     c_a=`echo $c_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 1 | sed -e 's|Y||'`
534     f_a=`echo $f_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 1 | sed -e 's|Y||'`
535     c_b=`echo $c_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 2 | sed -e 's|Y||'`
536     f_b=`echo $f_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 2 | sed -e 's|Y||'`
537    
538     nmangle="X"
539     if test "x$c_a" != "x$f_a" ; then
540     comm="echo x$f_a | sed -e 's|x$c_a||'"
541     a=`eval $comm`
542     nmangle="$a ## $nmangle"
543     fi
544     if test "x$c_b" != "x$f_b" ; then
545     comm="echo x$f_b | sed -e 's|x$c_b||'"
546     b=`eval $comm`
547     nmangle="$nmangle ## $b"
548     fi
549    
550     FC_NAMEMANGLE="#define FC_NAMEMANGLE(X) $nmangle"
551 edhill 1.32
552     # cleanup the testing files
553     rm -f genmake_tcomp.* genmake_test.*
554 edhill 1.31 }
555 edhill 1.1
556 edhill 1.39
557     check_HAVE_CLOC() {
558     get_fortran_c_namemangling
559     cat <<EOF > genmake_tc_1.c
560     $FC_NAMEMANGLE
561     #include <stdio.h>
562     #include <stdlib.h>
563     #include <unistd.h>
564     #include <assert.h>
565     #include <sys/time.h>
566     void FC_NAMEMANGLE(cloc) ( double *curtim )
567     {
568     struct timeval tv1;
569     gettimeofday(&tv1 , (void *)NULL );
570     *curtim = (double)((tv1.tv_usec)+(tv1.tv_sec)*1.E6);
571     *curtim = *curtim/1.E6;
572     }
573     EOF
574     make genmake_tc_1.o >> genmake_tc.log 2>&1
575     RET_C=$?
576     cat <<EOF > genmake_tc_2.f
577     program hello
578     Real*8 wtime
579     external cloc
580     call cloc(wtime)
581     print *," HELLO WORLD", wtime
582     end program hello
583     EOF
584     $FC $FFLAGS -o genmake_tc genmake_tc_2.f genmake_tc_1.o >> genmake_tc.log 2>&1
585     RET_F=$?
586     test -x ./genmake_tc && ./genmake_tc >> genmake_tc.log 2>&1
587     RETVAL=$?
588     if test "x$RETVAL" = x0 ; then
589     HAVE_CLOC=t
590     DEFINES="$DEFINES -DHAVE_CLOC"
591     fi
592     rm -f genmake_tc*
593     }
594    
595    
596 edhill 1.60 check_netcdf_libs() {
597 edhill 1.75 cat <<EOF > genmake_tnc.for
598 edhill 1.60 program fgennc
599     #include "netcdf.inc"
600     integer iret, ncid, xid
601     iret = nf_create('genmake_tnc.nc', NF_CLOBBER, ncid)
602     IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
603     iret = nf_def_dim(ncid, 'X', 11, xid)
604     IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
605     iret = nf_close(ncid)
606     IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
607     end
608     EOF
609 edhill 1.75 $CPP genmake_tnc.for > genmake_tnc.f \
610 edhill 1.60 && $FC $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.f $LIBS >> genmake_tnc.log 2>&1
611     RET_COMPILE=$?
612     test -x ./genmake_tnc && ./genmake_tnc >> genmake_tnc.log 2>&1
613     RETVAL=$?
614     if test "x$RET_COMPILE" = x0 -a "x$RETVAL" = x0 ; then
615     HAVE_NETCDF=t
616     else
617 edhill 1.66 # try again with "-lnetcdf" added to the libs
618 edhill 1.75 $CPP genmake_tnc.for > genmake_tnc.f \
619 edhill 1.66 && $FC $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.f \
620     $LIBS -lnetcdf >> genmake_tnc_2.log 2>&1
621     RET_COMPILE=$?
622     test -x ./genmake_tnc && ./genmake_tnc >> genmake_tnc.log 2>&1
623     RETVAL=$?
624     if test "x$RET_COMPILE" = x0 -a "x$RETVAL" = x0 ; then
625     LIBS="$LIBS -lnetcdf"
626     HAVE_NETCDF=t
627     else
628     cat genmake_tnc.log >> genmake_warnings
629     fi
630 edhill 1.60 fi
631     rm -f genmake_tnc*
632     }
633    
634    
635 adcroft 1.67
636     ###############################################################################
637     # Sequential part of script starts here
638     ###############################################################################
639    
640 edhill 1.1 # Set defaults here
641 edhill 1.5 COMMANDL="$0 $@"
642    
643 edhill 1.1 PLATFORM=
644     LN=
645     S64=
646     KPP=
647     FC=
648 edhill 1.60 CPP=
649 edhill 1.1 LINK=
650 edhill 1.31 DEFINES=
651 edhill 1.1 PACKAGES=
652     ENABLE=
653     DISABLE=
654     MAKEFILE=
655     MAKEDEPEND=
656     PDEPEND=
657 edhill 1.11 DUMPSTATE=t
658 edhill 1.1 PDEFAULT=
659     OPTFILE=
660 edhill 1.2 INCLUDES="-I."
661 edhill 1.1 FFLAGS=
662     FOPTIM=
663     CFLAGS=
664     KFLAGS1=
665     KFLAGS2=
666 edhill 1.70 #LDADD=
667 edhill 1.1 LIBS=
668     KPPFILES=
669     NOOPTFILES=
670     NOOPTFLAGS=
671 adcroft 1.67 MPI=
672     MPIPATH=
673 edhill 1.1
674 edhill 1.29 # DEFINES checked by test compilation
675     HAVE_SYSTEM=
676     HAVE_FDATE=
677     FC_NAMEMANGLE=
678 edhill 1.39 HAVE_CLOC=
679 edhill 1.60 HAVE_NETCDF=
680 edhill 1.29
681 edhill 1.1 MODS=
682     TOOLSDIR=
683     SOURCEDIRS=
684     INCLUDEDIRS=
685 edhill 1.57 STANDARDDIRS="USE_THE_DEFAULT"
686 edhill 1.1
687 edhill 1.73 G2ARGS=
688 edhill 1.71 BASH=
689 edhill 1.1 PWD=`pwd`
690     MAKE=make
691 edhill 1.15 AWK=awk
692 edhill 1.1 THISHOSTNAME=`hostname`
693     THISCWD=`pwd`
694     THISDATE=`date`
695     MACHINE=`uname -a`
696 edhill 1.7 EXECUTABLE=
697     EXEHOOK=
698     EXEDIR=
699 edhill 1.12 PACKAGES_CONF=
700     IEEE=
701     if test "x$MITGCM_IEEE" != x ; then
702     IEEE=$MITGCM_IEEE
703     fi
704 edhill 1.76 FS=
705     FS90=
706 edhill 1.1
707 edhill 1.14 AUTODIFF_PKG_USED=f
708     AD_OPTFILE=
709 edhill 1.17 TAF=
710     AD_TAF_FLAGS=
711     FTL_TAF_FLAGS=
712     SVD_TAF_FLAGS=
713     TAF_EXTRA=
714     TAMC=
715     AD_TAMC_FLAGS=
716     FTL_TAF_FLAGS=
717     SVD_TAMC_FLAGS=
718     TAMC_EXTRA=
719    
720 edhill 1.14
721 edhill 1.5 # The following state can be set directly by command-line switches
722 edhill 1.41 gm_s1="OPTFILE PDEPEND PDEFAULT MAKEFILE PLATFORM ROOTDIR MODS DISABLE ENABLE"
723 edhill 1.60 gm_s2="FC CPP IEEE MPI JAM DUMPSTATE STANDARDDIRS"
724 edhill 1.5
725     # The following state is not directly set by command-line switches
726     gm_s3="LN S64 KPP LINK PACKAGES MAKEDEPEND PDEPEND PDEFAULT INCLUDES FFLAGS FOPTIM "
727     gm_s4="CFLAGS KFLAGS1 KFLAGS2 LIBS KPPFILES NOOPTFILES NOOPTFLAGS"
728     gm_s5="TOOLSDIR SOURCEDIRS INCLUDEDIRS PWD MAKE THISHOSTNAME THISDATE MACHINE"
729 edhill 1.12 gm_s6="EXECUTABLE EXEHOOK EXEDIR PACKAGES_CONF"
730 edhill 1.29 gm_s7="HAVE_SYSTEM HAVE_FDATE FC_NAMEMANGLE"
731 edhill 1.5
732 edhill 1.14 # The following are all related to adjoint/tangent-linear stuff
733 edhill 1.29 gm_s10="AUTODIFF_PKG_USED AD_OPTFILE TAMC TAF AD_TAMC_FLAGS AD_TAF_FLAGS"
734     gm_s11="FTL_TAMC_FLAGS FTL_TAF_FLAGS SVD_TAMC_FLAGS SVD_TAF_FLAGS"
735     gm_s12="TAF_EXTRA TAMC_EXTRA"
736 edhill 1.14
737 edhill 1.29 gm_state="COMMANDL $gm_s1 $gm_s2 $gm_s3 $gm_s4 $gm_s5 $gm_s6 $gm_s7"
738     gm_state="$gm_state $gm_s10 $gm_s11 $gm_s12"
739 edhill 1.5
740 edhill 1.41 cat <<EOF
741    
742     GENMAKE :
743    
744     A program for GENerating MAKEfiles for the MITgcm project. For a
745     quick list of options, use "genmake -h" or for more detail see:
746    
747     http://mitgcm.org/devel_HOWTO/
748    
749     EOF
750 edhill 1.5
751 edhill 1.2 echo "=== Processing options files and arguments ==="
752 edhill 1.12 gm_local="genmake_local"
753     for i in . $MODS ; do
754     if test -r $i/$gm_local ; then
755 edhill 1.34 . $i/$gm_local
756 edhill 1.12 break
757     fi
758     done
759 edhill 1.71 printf " getting local config information: "
760 edhill 1.1 if test -e $gm_local ; then
761     echo "using $gm_local"
762 edhill 1.34 . $gm_local
763 edhill 1.2 # echo "DISABLE=$DISABLE"
764     # echo "ENABLE=$ENABLE"
765 edhill 1.1 else
766     echo "none found"
767     fi
768    
769     # echo "$0::$1:$2:$3:$4:$5:$6:$7:"
770 edhill 1.2 #OPTIONS=
771     #n=0
772     #for i ; do
773     # echo "$i $n"
774     # setvar="OPTIONS[$n]='$i'"
775     # # echo " $setvar"
776     # eval "$setvar"
777     # n=$(( $n + 1 ))
778     #done
779     #parse_options
780     ac_prev=
781     for ac_option ; do
782    
783 edhill 1.73 G2ARGS="$G2ARGS \"$ac_option\""
784    
785 edhill 1.2 # If the previous option needs an argument, assign it.
786     if test -n "$ac_prev"; then
787     eval "$ac_prev=\$ac_option"
788     ac_prev=
789     continue
790     fi
791    
792     ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
793    
794     case $ac_option in
795    
796     -help | --help | -h | --h)
797     usage ;;
798    
799     -nooptfile | --nooptfile)
800     OPTFILE="NONE" ;;
801     -optfile | --optfile | -of | --of)
802 edhill 1.4 ac_prev=OPTFILE ;;
803 edhill 1.2 -optfile=* | --optfile=* | -of=* | --of=*)
804     OPTFILE=$ac_optarg ;;
805    
806 edhill 1.50 -adoptfile | --adoptfile | -adof | --adof)
807 edhill 1.14 ac_prev=AD_OPTFILE ;;
808     -adoptfile=* | --adoptfile=* | -adof=* | --adof=*)
809     AD_OPTFILE=$ac_optarg ;;
810    
811 edhill 1.2 -pdepend | --pdepend)
812 edhill 1.4 ac_prev=PDEPEND ;;
813 edhill 1.2 -pdepend=* | --pdepend=*)
814     PDEPEND=$ac_optarg ;;
815    
816     -pdefault | --pdefault)
817 edhill 1.4 ac_prev=PDEFAULT ;;
818 edhill 1.2 -pdefault=* | --pdefault=*)
819     PDEFAULT=$ac_optarg ;;
820    
821 edhill 1.6 -make | --make | -m | --m)
822     ac_prev=MAKE ;;
823     -make=* | --make=* | -m=* | --m=*)
824     MAKE=$ac_optarg ;;
825 edhill 1.69
826 edhill 1.71 -bash | --bash)
827     ac_prev=BASH ;;
828     -bash=* | --bash=*)
829     BASH=$ac_optarg ;;
830    
831 edhill 1.69 -makedepend | --makedepend | -md | --md)
832     ac_prev=MAKEDEPEND ;;
833     -makedepend=* | --makedepend=* | -md=* | --md=*)
834     MAKEDEPEND=$ac_optarg ;;
835 edhill 1.6
836     -makefile | --makefile | -ma | --ma)
837 edhill 1.4 ac_prev=MAKEFILE ;;
838 edhill 1.6 -makefile=* | --makefile=* | -ma=* | --ma=*)
839 edhill 1.2 MAKEFILE=$ac_optarg ;;
840    
841 edhill 1.41 -platform | --platform | -pl | --pl | -platform=* | --platform=* | -pl=* | --pl=*)
842     echo "ERROR: The platform option has been removed. Please specify"
843     echo " the build options using the \"optfile\" mechanism."
844     echo
845     usage
846     ;;
847 edhill 1.2
848     -rootdir | --rootdir | -rd | --rd)
849 edhill 1.4 ac_prev=ROOTDIR ;;
850 edhill 1.2 -rootdir=* | --rootdir=* | -rd=* | --rd=*)
851     ROOTDIR=$ac_optarg ;;
852    
853     -mods | --mods | -mo | --mo)
854 edhill 1.4 ac_prev=MODS ;;
855 edhill 1.2 -mods=* | --mods=* | -mo=* | --mo=*)
856     MODS=$ac_optarg ;;
857    
858     -disable | --disable)
859 edhill 1.4 ac_prev=DISABLE ;;
860 edhill 1.2 -disable=* | --disable=*)
861     DISABLE=$ac_optarg ;;
862    
863     -enable | --enable)
864 edhill 1.4 ac_prev=ENABLE ;;
865 edhill 1.2 -enable=* | --enable=*)
866     ENABLE=$ac_optarg ;;
867    
868 edhill 1.12 -standarddirs | --standarddirs)
869     ac_prev=STANDARDDIRS ;;
870     -standarddirs=* | --standarddirs=*)
871     STANDARDDIRS=$ac_optarg ;;
872    
873 edhill 1.2 # -cpp | --cpp)
874     # ac_prev=cpp ;;
875     # -cpp=* | --cpp=*)
876     # CPP=$ac_optarg ;;
877    
878     -fortran | --fortran | -fc | --fc)
879 edhill 1.4 ac_prev=FC ;;
880 edhill 1.2 -fc=* | --fc=*)
881     FC=$ac_optarg ;;
882    
883 edhill 1.76 -fs | --fs)
884     ac_prev=FS ;;
885     -fs=* | --fs=*)
886     FS=$ac_optarg ;;
887    
888     -fs90 | --fs90)
889     ac_prev=FS90 ;;
890     -fs90=* | --fs90=*)
891     FS90=$ac_optarg ;;
892    
893 edhill 1.2 -ieee | --ieee)
894 edhill 1.12 IEEE=true ;;
895 edhill 1.2 -noieee | --noieee)
896 edhill 1.12 IEEE= ;;
897 adcroft 1.67
898     -mpi | --mpi)
899     MPI=true ;;
900     -mpi=* | --mpi=*)
901     MPIPATH=$ac_optarg
902     MPI=true ;;
903 edhill 1.2
904 edhill 1.41 # -jam | --jam)
905     # JAM=1 ;;
906     # -nojam | --nojam)
907     # JAM=0 ;;
908 edhill 1.2
909 edhill 1.5 -ds | --ds)
910     DUMPSTATE=t ;;
911    
912 edhill 1.17 -taf_extra | --taf_extra)
913     ac_prev=TAF_EXTRA ;;
914     -taf_extra=* | --taf_extra=*)
915     TAF_EXTRA=$ac_optarg ;;
916    
917     -tamc_extra | --tamc_extra)
918     ac_prev=TAMC_EXTRA ;;
919     -tamc_extra=* | --tamc_extra=*)
920     TAMC_EXTRA=$ac_optarg ;;
921    
922 edhill 1.2 -*)
923     echo "Error: unrecognized option: "$ac_option
924     usage
925     ;;
926    
927     *)
928     echo "Error: unrecognized argument: "$ac_option
929     usage
930     ;;
931    
932     esac
933    
934 edhill 1.1 done
935    
936 edhill 1.12 if test -f ./.genmakerc ; then
937     echo
938     echo "WARNING: genmake2 has detected a copy of the old-style \"./.genmakerc\""
939     echo " file. This file format is no longer supported. Please see:"
940     echo
941     echo " http://mitgcm.org/devel_HOWTO/"
942     echo
943     echo " for directions on how to setup and use the new \"genmake2\" input"
944     echo " files and send an email to MITgcm-support@mitgcm.org if you want help."
945     echo
946     fi
947    
948 edhill 1.11 if test "x${ROOTDIR}" = x ; then
949     if test "${PWD##/*/}" = "bin" -a -d ../model -a -d ../eesup -a -d ../pkg ; then
950     ROOTDIR=".."
951     else
952     for d in . .. ../.. ../../.. ../../../.. ../../../../.. ; do
953     if [ -d "$d/model" -a -d "$d/eesupp" -a -d "$d/pkg" ]; then
954     ROOTDIR=$d
955 edhill 1.71 printf "Warning: ROOTDIR was not specified but there appears to be"
956 edhill 1.11 echo " a copy of MITgcm at \"$ROOTDIR\" so we'll try it."
957     break
958     fi
959     done
960     fi
961     fi
962     if test "x${ROOTDIR}" = x ; then
963     echo "Error: Cannot determine ROOTDIR for MITgcm code."
964     echo " Please specify a ROOTDIR using either an options "
965     echo " file or a command-line option."
966     exit 1
967     fi
968     if test ! -d ${ROOTDIR} ; then
969     echo "Error: the specified ROOTDIR (\"$ROOTDIR\") does not exist!"
970     exit 1
971     fi
972    
973 edhill 1.1 echo " getting OPTFILE information: "
974     if test "x${OPTFILE}" = x ; then
975 edhill 1.11 if test "x$MITGCM_OF" = x ; then
976     echo "Warning: no OPTFILE specified so we'll look for possible settings"
977     printf "\n=== Searching for possible settings for OPTFILE ===\n"
978     find_possible_configs
979 edhill 1.1 else
980 edhill 1.11 OPTFILE=$MITGCM_OF
981     fi
982     fi
983     if test "x$OPTFILE" != xNONE ; then
984     if test -f "$OPTFILE" -a -r "$OPTFILE" ; then
985     echo " using OPTFILE=\"$OPTFILE\""
986 edhill 1.34 . "$OPTFILE"
987 edhill 1.11 RETVAL=$?
988     if test "x$RETVAL" != x0 ; then
989 edhill 1.71 printf "Error: failed to source OPTFILE \"$OPTFILE\""
990 edhill 1.11 echo "--please check that variable syntax is bash-compatible"
991 edhill 1.1 exit 1
992     fi
993 edhill 1.11 if test "x$DUMPSTATE" != xf ; then
994 edhill 1.12 cp -f $OPTFILE "genmake_optfile"
995 edhill 1.11 fi
996     else
997     echo "Error: can't read OPTFILE=\"$OPTFILE\""
998     exit 1
999 edhill 1.1 fi
1000     fi
1001 edhill 1.8
1002 edhill 1.75 # Check for broken systems that cannot correctly distinguish *.F and *.f files
1003 edhill 1.77 # check_for_broken_Ff
1004 edhill 1.75
1005 edhill 1.14 echo " getting AD_OPTFILE information: "
1006     if test "x${AD_OPTFILE}" = x ; then
1007     if test "x$MITGCM_AD_OF" = x ; then
1008     AD_OPTFILE=$ROOTDIR/tools/adjoint_options/adjoint_default
1009     else
1010     AD_OPTFILE=$MITGCM_AD_OF
1011     fi
1012     fi
1013     if test "x${AD_OPTFILE}" != xNONE ; then
1014     if test -f "$AD_OPTFILE" -a -r "$AD_OPTFILE" ; then
1015     echo " using AD_OPTFILE=\"$AD_OPTFILE\""
1016 edhill 1.34 . "$AD_OPTFILE"
1017 edhill 1.14 RETVAL=$?
1018     if test "x$RETVAL" != x0 ; then
1019 edhill 1.71 printf "Error: failed to source AD_OPTFILE \"$AD_OPTFILE\""
1020 edhill 1.14 echo "--please check that variable syntax is bash-compatible"
1021     exit 1
1022     fi
1023     if test "x$DUMPSTATE" != xf ; then
1024     cp -f $AD_OPTFILE "genmake_ad_optfile"
1025     fi
1026     else
1027     echo "Error: can't read AD_OPTFILE=\"$AD_OPTFILE\""
1028     exit 1
1029     fi
1030     fi
1031    
1032 edhill 1.39 # Check that FC, LINK, CPP, S64, LN, and MAKE are defined. If not,
1033     # either set defaults or complain and abort!
1034 edhill 1.71 if test ! "x$BASH" = x ; then
1035     # add a trailing space so that it works within the Makefile syntax (see below)
1036     BASH="$BASH "
1037     fi
1038 edhill 1.8 if test "x$FC" = x ; then
1039     cat <<EOF 1>&2
1040    
1041     Error: no Fortran compiler: please specify using one of the following:
1042     1) within the options file ("FC=...") as specified by "-of=OPTFILE"
1043     2) the "-fc=XXX" command-line option
1044 edhill 1.12 3) the "./genmake_local" file
1045 edhill 1.8 EOF
1046     exit 1
1047     fi
1048     if test "x$LINK" = x ; then
1049     LINK=$FC
1050     fi
1051 edhill 1.39 if test "x$MAKE" = x ; then
1052     MAKE="make"
1053     fi
1054 edhill 1.63 if test "x$CPP" = x ; then
1055     CPP=cpp
1056     fi
1057     #EH3 === UGLY ===
1058 edhill 1.76 # The following is an ugly little hack to check for $CPP in /lib/ and
1059     # it should eventually be replaced with a more general function that
1060 edhill 1.63 # searches a combo of the user's path and a list of "usual suspects"
1061     # to find the correct location for binaries such as $CPP.
1062     for i in " " "/lib/" ; do
1063     echo "#define A a" | $i$CPP > test_cpp 2>&1 && CPP=$i$CPP
1064     done
1065     #EH3 === UGLY ===
1066 edhill 1.13 echo "#define A a" | $CPP > test_cpp 2>&1
1067 edhill 1.11 RETVAL=$?
1068     if test "x$RETVAL" != x0 ; then
1069 edhill 1.8 cat <<EOF 1>&2
1070    
1071 edhill 1.11 Error: C pre-processor "$CPP" failed the test case: please specify using:
1072    
1073 edhill 1.8 1) within the options file ("CPP=...") as specified by "-of=OPTFILE"
1074 edhill 1.12 2) the "./genmake_local" file
1075 edhill 1.30 3) with the CPP environment variable
1076 edhill 1.11
1077 edhill 1.8 EOF
1078     exit 1
1079 edhill 1.11 else
1080     rm -f test_cpp
1081 edhill 1.8 fi
1082 edhill 1.11 if test "x$MAKEDEPEND" = x ; then
1083     MAKEDEPEND=makedepend
1084 edhill 1.8 fi
1085 edhill 1.35 if test "x$LN" = x ; then
1086     LN="ln -s"
1087     fi
1088     echo "test" > genmake_test_ln
1089     $LN genmake_test_ln genmake_tlink
1090     RETVAL=$?
1091     if test "x$RETVAL" != x0 ; then
1092     cat <<EOF 1>&2
1093 edhill 1.29
1094 edhill 1.35 Error: The command "ln -s" failed -- please specify a working soft-link
1095     command in the optfile.
1096    
1097     EOF
1098     exit 1
1099     fi
1100     rm -f genmake_test_ln genmake_tlink
1101 edhill 1.77
1102     # Check for broken *.F/*.f handling and fix if possible
1103     check_for_broken_Ff
1104 edhill 1.29
1105 adcroft 1.67 if test ! "x$MPI" = x ; then
1106     echo " Turning on MPI cpp macros"
1107 adcroft 1.68 DEFINES="$DEFINES -DALLOW_USE_MPI -DALWAYS_USE_MPI"
1108 adcroft 1.67 fi
1109 edhill 1.39
1110 edhill 1.29 printf "\n=== Checking system libraries ===\n"
1111 edhill 1.71 printf " Do we have the system() command using $FC... "
1112 edhill 1.29 cat > genmake_tcomp.f <<EOF
1113     program hello
1114     call system('echo hi')
1115     end
1116     EOF
1117     $FC $FFLAGS $DEFINES -o genmake_tcomp genmake_tcomp.f > genmake_tcomp.log 2>&1
1118     RETVAL=$?
1119     if test "x$RETVAL" = x0 ; then
1120     HAVE_SYSTEM=t
1121     DEFINES="$DEFINES -DHAVE_SYSTEM"
1122     echo "yes"
1123     else
1124     HAVE_SYSTEM=
1125     echo "no"
1126     fi
1127     rm -f genmake_tcomp*
1128    
1129 edhill 1.71 printf " Do we have the fdate() command using $FC... "
1130 edhill 1.29 cat > genmake_tcomp.f <<EOF
1131     program hello
1132     CHARACTER(128) string
1133     string = ' '
1134     call fdate( string )
1135     print *, string
1136     end
1137     EOF
1138     $FC $FFLAGS $DEFINES -o genmake_tcomp genmake_tcomp.f > genmake_tcomp.log 2>&1
1139     RETVAL=$?
1140     if test "x$RETVAL" = x0 ; then
1141     HAVE_FDATE=t
1142     DEFINES="$DEFINES -DHAVE_FDATE"
1143     echo "yes"
1144     else
1145     HAVE_FDATE=
1146     echo "no"
1147     fi
1148     rm -f genmake_tcomp*
1149    
1150 edhill 1.71 printf " Can we call simple C routines (here, \"cloc()\") using $FC... "
1151 edhill 1.39 check_HAVE_CLOC
1152     if test "x$HAVE_CLOC" != x ; then
1153     echo "yes"
1154     else
1155     echo "no"
1156 edhill 1.29 fi
1157 edhill 1.39 rm -f genmake_t*
1158 edhill 1.29
1159 edhill 1.71 printf " Can we create NetCDF-enabled binaries... "
1160 edhill 1.60 check_netcdf_libs
1161     if test "x$HAVE_NETCDF" != x ; then
1162     echo "yes"
1163     else
1164     echo "no"
1165     fi
1166    
1167 edhill 1.8
1168 edhill 1.2 printf "\n=== Setting defaults ===\n"
1169 edhill 1.71 printf " Adding MODS directories: "
1170 edhill 1.1 for d in $MODS ; do
1171     if test ! -d $d ; then
1172 edhill 1.2 echo
1173     echo "Error: MODS directory \"$d\" not found!"
1174 edhill 1.1 exit 1
1175     else
1176 edhill 1.71 printf " $d"
1177 edhill 1.1 SOURCEDIRS="$SOURCEDIRS $d"
1178     INCLUDEDIRS="$INCLUDEDIRS $d"
1179     fi
1180     done
1181     echo
1182    
1183     if test "x$MAKEFILE" = x ; then
1184     MAKEFILE="Makefile"
1185     fi
1186     if test "x${PLATFORM}" = x ; then
1187     PLATFORM=$p_PLATFORM
1188     fi
1189    
1190     if test "x${EXEDIR}" = x ; then
1191     if test "${PWD##/*/}" = "bin" -a -d ../exe -a $ROOTDIR = .. ; then
1192     EXEDIR=../exe
1193     else
1194     EXEDIR=.
1195     fi
1196     fi
1197     if test ! -d ${EXEDIR} ; then
1198     echo "Error: the specified EXEDIR (\"$EXEDIR\") does not exist!"
1199     exit 1
1200     fi
1201    
1202     if test "x${TOOLSDIR}" = x ; then
1203     TOOLSDIR="$ROOTDIR/tools"
1204     fi
1205     if test ! -d ${TOOLSDIR} ; then
1206 cnh 1.65 echo "Error: the specified TOOLSDIR (\"$TOOLSDIR\") does not exist!"
1207 edhill 1.1 exit 1
1208     fi
1209 edhill 1.11 if test "x$S64" = x ; then
1210     S64='$(TOOLSDIR)/set64bitConst.sh'
1211     fi
1212 adcroft 1.44 THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`
1213 edhill 1.1
1214     EXECUTABLE=${EXECUTABLE:-mitgcmuv}
1215    
1216     # We have a special set of source files in eesupp/src which are
1217     # generated from some template source files. We'll make them first so
1218     # they appear as regular source code
1219     if test -r $ROOTDIR"/eesupp/src/Makefile" ; then
1220     echo " Making source files in eesupp from templates"
1221 edhill 1.36 ( cd $ROOTDIR"/eesupp/src/" && $MAKE ) > make_eesupp.errors 2>&1
1222 edhill 1.1 RETVAL=$?
1223 edhill 1.2 if test "x${RETVAL}" = x0 ; then
1224 edhill 1.1 rm -f make_eesupp.errors
1225     else
1226     echo "Error: problem encountered while building source files in eesupp:"
1227 edhill 1.62 cat make_eesupp.errors 1>&2
1228 edhill 1.1 exit 1
1229 afe 1.58 fi
1230     fi
1231    
1232     #same for exch2
1233     if test -r $ROOTDIR"/pkg/exch2/Makefile" ; then
1234     echo " Making source files in exch2 from templates"
1235     ( cd $ROOTDIR"/pkg/exch2/" && $MAKE ) > make_exch2.errors 2>&1
1236     RETVAL=$?
1237     if test "x${RETVAL}" = x0 ; then
1238     rm -f make_exch2.errors
1239     else
1240 edhill 1.59 echo "Error: problem encountered while building source files in exch2:"
1241 edhill 1.62 cat make_exch2.errors 1>&2
1242 afe 1.58 exit 1
1243 edhill 1.1 fi
1244     fi
1245    
1246 edhill 1.2 printf "\n=== Determining package settings ===\n"
1247 edhill 1.1 if test "x${PDEPEND}" = x ; then
1248     tmp=$ROOTDIR"/pkg/pkg_depend"
1249     if test -r $tmp ; then
1250     PDEPEND=$tmp
1251     else
1252     echo "Warning: No package dependency information was specified."
1253     echo " Please check that ROOTDIR/pkg/pkg_depend exists."
1254     fi
1255     else
1256     if test ! -r ${PDEPEND} ; then
1257     echo "Error: can't read package dependency info from PDEPEND=\"$PDEPEND\""
1258     exit 1
1259     fi
1260     fi
1261     echo " getting package dependency info from $PDEPEND"
1262     # Strip the comments and then convert the dependency file into
1263     # two arrays: PNAME, DNAME
1264     cat $PDEPEND | sed -e 's/#.*$//g' \
1265 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}' \
1266 edhill 1.1 > ./.pd_tmp
1267     RETVAL=$?
1268     if test ! "x${RETVAL}" = x0 ; then
1269     echo "Error: unable to parse package dependencies -- please check PDEPEND=\"$PDEPEND\""
1270     exit 1
1271     fi
1272 edhill 1.34 . ./.pd_tmp
1273 edhill 1.1 rm -f ./.pd_tmp
1274    
1275 edhill 1.12 # Search for default packages. Note that a "$ROOTDIR/pkg/pkg_groups"
1276     # file should eventually be added so that, for convenience, one can
1277     # specify groups of packages using names like "ocean" and "atmosphere".
1278 edhill 1.41 echo " checking default package list: "
1279 edhill 1.1 if test "x${PDEFAULT}" = x ; then
1280 edhill 1.12 for i in "." $MODS ; do
1281     if test -r $i"/packages.conf" ; then
1282     PDEFAULT=$i"/packages.conf"
1283     break
1284     fi
1285     done
1286     fi
1287     if test "x${PDEFAULT}" = x ; then
1288 edhill 1.1 PDEFAULT="$ROOTDIR/pkg/pkg_default"
1289     fi
1290     if test "x${PDEFAULT}" = xNONE ; then
1291 edhill 1.41 echo " default packages file disabled"
1292 edhill 1.1 else
1293     if test ! -r $PDEFAULT ; then
1294     echo "Warning: can't read default packages from PDEFAULT=\"$PDEFAULT\""
1295     else
1296 edhill 1.41 echo " using PDEFAULT=\"$PDEFAULT\""
1297 edhill 1.1 # Strip the comments and add all the names
1298 edhill 1.15 def=`cat $PDEFAULT | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
1299 edhill 1.1 RETVAL=$?
1300     if test "x${RETVAL}" != x0 ; then
1301 edhill 1.71 printf "Error: can't parse default package list "
1302 edhill 1.1 echo "-- please check PDEFAULT=\"$PDEFAULT\""
1303     exit 1
1304     fi
1305     for i in $def ; do
1306     PACKAGES="$PACKAGES $i"
1307     done
1308 edhill 1.12 echo " before group expansion packages are: $PACKAGES"
1309 adcroft 1.74 while ! expand_pkg_groups; do echo > /dev/null; done
1310 edhill 1.12 echo " after group expansion packages are: $PACKAGES"
1311 edhill 1.1 fi
1312     fi
1313    
1314     echo " applying DISABLE settings"
1315 adcroft 1.74 for i in $PACKAGES ; do
1316     echo $i >> ./.tmp_pack
1317     done
1318     for i in `grep "-" ./.tmp_pack` ; do
1319     j=`echo $i | sed 's/[-]//'`
1320     DISABLE="$DISABLE $j"
1321     done
1322 edhill 1.1 pack=
1323     for p in $PACKAGES ; do
1324     addit="t"
1325     for d in $DISABLE ; do
1326     if test "x$p" = "x$d" ; then
1327     addit="f"
1328     fi
1329     done
1330     if test "x$addit" = xt ; then
1331     pack="$pack $p"
1332     fi
1333     done
1334     PACKAGES="$pack"
1335     echo " applying ENABLE settings"
1336 edhill 1.12 echo "" > ./.tmp_pack
1337 edhill 1.1 PACKAGES="$PACKAGES $ENABLE"
1338 adcroft 1.74 # Test if each explicitly referenced package exists
1339 edhill 1.1 for i in $PACKAGES ; do
1340 adcroft 1.74 j=`echo $i | sed 's/[-+]//'`
1341     if test ! -d "$ROOTDIR/pkg/$j" ; then
1342 edhill 1.1 echo "Error: can't find package $i at \"$ROOTDIR/pkg/$i\""
1343 adcroft 1.74 exit 1
1344 edhill 1.1 fi
1345     echo $i >> ./.tmp_pack
1346     done
1347     PACKAGES=
1348 adcroft 1.74 for i in `grep -v "-" ./.tmp_pack | sort | uniq` ; do
1349 edhill 1.1 PACKAGES="$PACKAGES $i"
1350     done
1351 adcroft 1.74 rm -f ./.tmp_pack
1352 edhill 1.1 echo " packages are: $PACKAGES"
1353    
1354     echo " applying package dependency rules"
1355     ck=
1356     while test "x$ck" != xtt ; do
1357     i=0
1358 edhill 1.2 # rtot=${#PNAME[@]}
1359     rtot=$nname
1360 edhill 1.1 while test $i -lt $rtot ; do
1361    
1362     # Is $pname in the current $PACKAGES list?
1363 edhill 1.2 # pname=${PNAME[$i]}
1364     tmp="pname=\"\$PNAME_$i\""
1365     eval $tmp
1366 edhill 1.1 pin="f"
1367     for p in $PACKAGES ; do
1368     if test "x$p" = "x$pname" ; then
1369     pin="t"
1370     fi
1371     done
1372    
1373     # Is the DNAME entry a (+) or (-) rule ?
1374 edhill 1.2 tmp="dname=\"\$DNAME_$i\""
1375     eval $tmp
1376 edhill 1.1 plus="-"
1377 edhill 1.2 echo $dname | grep '^+' > /dev/null 2>&1
1378 edhill 1.1 RETVAL=$?
1379     if test "x$RETVAL" = x0 ; then
1380     plus="+"
1381     fi
1382    
1383     # Is $dname in the current $PACKAGES list?
1384 edhill 1.2 dname=`echo $dname | sed -e 's/^[+-]//'`
1385 edhill 1.1 din="f"
1386     for p in $PACKAGES ; do
1387     if test "x$p" = "x$dname" ; then
1388     din="t"
1389     fi
1390     done
1391    
1392     # Do we need to add $dname according to the dependency rules?
1393     if test "x$pin" = xt -a "x$plus" = "x+" -a "x$din" = xf ; then
1394     in_dis="f"
1395     for dis in $DISABLE ; do
1396     if test "x$dis" = "x$dname" ; then
1397     in_dis="t"
1398     fi
1399     done
1400     if test "x$in_dis" = xt ; then
1401     echo "Error: can't satisfy package dependencies:"
1402     echo " \"$dname\" is required by the dependency rules"
1403     echo " but is disallowed by the DISABLE settings"
1404     exit 1
1405     else
1406     PACKAGES="$PACKAGES $dname"
1407     ck=
1408     fi
1409     fi
1410    
1411     # Do we need to get rid of $dname according to the dependency rules?
1412     if test "x$pin" = xt -a "x$plus" = "x-" -a "x$din" = xt; then
1413     echo "Error: can't satisfy package dependencies:"
1414     echo " \"$pname\" was requested but is disallowed by"
1415     echo " the dependency rules for \"$dname\""
1416     exit 1
1417     fi
1418     i=$(( $i + 1 ))
1419     done
1420     ck=$ck"t"
1421     done
1422     echo " packages are: $PACKAGES"
1423     for i in $PACKAGES ; do
1424     adr="$ROOTDIR/pkg/$i"
1425     if test -d $adr ; then
1426     SOURCEDIRS="$SOURCEDIRS $adr"
1427     INCLUDEDIRS="$INCLUDEDIRS $adr"
1428 edhill 1.14 if test "x$i" = xautodiff ; then
1429     AUTODIFF_PKG_USED=t
1430     fi
1431 edhill 1.1 else
1432     echo "Error: the directory \"$adr\" for package $i doesn't exist"
1433     exit 1
1434     fi
1435     done
1436    
1437 edhill 1.62 # Build MNC templates and check for ability to build and use NetCDF
1438 edhill 1.60 echo $PACKAGES | grep ' mnc ' > /dev/null 2>&1
1439     RETVAL=$?
1440 edhill 1.62 if test "x$RETVAL" = x0 ; then
1441     ( cd $ROOTDIR"/pkg/mnc" && $MAKE templates ) > make_mnc.errors 2>&1
1442     RETVAL=$?
1443     if test "x${RETVAL}" = x0 ; then
1444     rm -f make_mnc.errors
1445     else
1446     echo "Error: problem encountered while building source files in pkg/mnc:"
1447     cat make_mnc.errors 1>&2
1448     exit 1
1449     fi
1450 edhill 1.64 if test "x$HAVE_NETCDF" != xt ; then
1451 edhill 1.62 cat <<EOF
1452 edhill 1.60
1453     WARNING: the "mnc" package has been enabled but tests failed to
1454     compile and/or execute NetCDF applications. Please check that:
1455    
1456     1) NetCDF is installed for your compiler and
1457     2) the LIBS variable (within the 'optfile") specifies the correct
1458     NetCDF library to link against.
1459    
1460     EOF
1461 edhill 1.62 fi
1462 edhill 1.60 fi
1463 edhill 1.1
1464 edhill 1.12 # Create a list of #define and #undef to enable/disable packages
1465     PACKAGES_DOT_H=PACKAGES_CONFIG.h
1466 edhill 1.1 # The following UGLY HACK sets multiple "#undef"s and it needs to go
1467     # away. On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h
1468     # file would eventually be split up so that all package-related #define
1469     # statements could be separated and handled only by genmake.
1470     names=`ls -1 "$ROOTDIR/pkg"`
1471     all_pack=
1472 adcroft 1.44 DISABLED_PACKAGES=
1473 edhill 1.1 for n in $names ; do
1474     if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
1475     has_pack="f"
1476     for pack in $PACKAGES ; do
1477     if test "x$pack" = "x$n" ; then
1478     has_pack="t"
1479     break
1480     fi
1481     done
1482     if test "x$has_pack" = xf ; then
1483 edhill 1.15 undef=`echo "ALLOW_$n" | $AWK '{print toupper($0)}'`
1484 adcroft 1.44 DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
1485 edhill 1.1 fi
1486     fi
1487     done
1488 adcroft 1.44 ENABLED_PACKAGES=
1489 edhill 1.1 for i in $PACKAGES ; do
1490 edhill 1.15 def=`echo "ALLOW_$i" | $AWK '{print toupper($0)}'`
1491 adcroft 1.44 ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
1492 edhill 1.12 #eh3 DEFINES="$DEFINES -D$def"
1493 edhill 1.1
1494     #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
1495     case $i in
1496     aim_v23)
1497 adcroft 1.46 ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
1498 jmc 1.55 echo "Warning: ALLOW_AIM is set to enable aim_v23."
1499 edhill 1.1 ;;
1500     esac
1501     #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
1502    
1503     done
1504    
1505     echo " Adding STANDARDDIRS"
1506     BUILDDIR=${BUILDDIR:-.}
1507 edhill 1.57 if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
1508 edhill 1.12 STANDARDDIRS="eesupp model"
1509     fi
1510 edhill 1.57 if test "x$STANDARDDIRS" != x ; then
1511     for d in $STANDARDDIRS ; do
1512     adr="$ROOTDIR/$d/src"
1513     if test ! -d $adr ; then
1514     echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1515     echo " is correct and that you correctly specified the STANDARDDIRS option"
1516     exit 1
1517     else
1518     SOURCEDIRS="$SOURCEDIRS $adr"
1519     fi
1520     adr="$ROOTDIR/$d/inc"
1521     if test ! -d $adr ; then
1522     echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1523     echo " is correct and that you correctly specified the STANDARDDIRS option"
1524     exit 1
1525     else
1526     INCLUDEDIRS="$INCLUDEDIRS $adr"
1527     fi
1528     done
1529     fi
1530 edhill 1.1
1531 adcroft 1.52 echo " Searching for *OPTIONS.h files in order to warn about the presence"
1532     echo " of \"#define \"-type statements that are no longer allowed:"
1533 edhill 1.12 CPP_OPTIONS=
1534 adcroft 1.52 CPP_EEOPTIONS=
1535 edhill 1.12 spaths=". $INCLUDEDIRS"
1536 adcroft 1.52 names=`ls -1 "$ROOTDIR/pkg"`
1537 edhill 1.12 for i in $spaths ; do
1538     try="$i/CPP_OPTIONS.h"
1539 edhill 1.54 if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
1540 edhill 1.12 echo " found CPP_OPTIONS=\"$try\""
1541     CPP_OPTIONS="$try"
1542 adcroft 1.52 # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
1543     for n in $names ; do
1544     test_for_package_in_cpp_options $CPP_OPTIONS $n
1545     done
1546     fi
1547     try="$i/CPP_EEOPTIONS.h"
1548 edhill 1.54 if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
1549 adcroft 1.52 echo " found CPP_EEOPTIONS=\"$try\""
1550     # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
1551     #**** not yet enabled ****
1552     # test_for_mpi_in_cpp_eeoptions $try
1553     #**** not yet enabled ****
1554     CPP_EEOPTIONS="$try"
1555 edhill 1.12 fi
1556     done
1557     if test "x$CPP_OPTIONS" = x ; then
1558     echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
1559     exit 1
1560     fi
1561 edhill 1.1
1562 edhill 1.14 # Here, we build the list of files to be "run through" the adjoint
1563     # compiler.
1564     if test -f ./ad_files ; then
1565     rm -f ./ad_files
1566     fi
1567     echo " Creating the list of files for the adjoint compiler."
1568     for i in $SOURCEDIRS ; do
1569     list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
1570     for j in $list_files ; do
1571     cat $i/$j >> ad_files
1572     done
1573     done
1574 edhill 1.60
1575 edhill 1.14
1576 edhill 1.2 echo
1577     echo "=== Creating the Makefile ==="
1578 edhill 1.1 echo " setting INCLUDES"
1579     for i in $INCLUDEDIRS ; do
1580 edhill 1.12 if ! test -d $i ; then
1581     # INCLUDES="$INCLUDES -I$i"
1582     # else
1583 edhill 1.1 echo "Warning: can't find INCLUDEDIRS=\"$i\""
1584     fi
1585     done
1586    
1587     echo " Determining the list of source and include files"
1588     rm -rf .links.tmp
1589     mkdir .links.tmp
1590     echo "# This section creates symbolic links" > srclinks.tmp
1591     echo "" >> srclinks.tmp
1592 edhill 1.71 printf 'SRCFILES = ' > srclist.inc
1593     printf 'CSRCFILES = ' > csrclist.inc
1594     printf 'F90SRCFILES = ' > f90srclist.inc
1595     printf 'HEADERFILES = ' > hlist.inc
1596     printf 'AD_FLOW_FILES = ' > ad_flow_files.inc
1597 adcroft 1.9 alldirs="$SOURCEDIRS $INCLUDEDIRS ."
1598 edhill 1.1 for d in $alldirs ; do
1599     deplist=
1600 edhill 1.14 sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
1601 cnh 1.3 sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
1602 edhill 1.1 for sf in $sfiles ; do
1603     if test ! -r ".links.tmp/$sf" ; then
1604     if test -f "$d/$sf" ; then
1605 adcroft 1.44 case $d/$sf in
1606     ./$PACKAGES_DOT_H)
1607     ;;
1608     ./AD_CONFIG.h)
1609     ;;
1610     ./FC_NAMEMANGLE.h)
1611     ;;
1612     *)
1613     touch .links.tmp/$sf
1614     deplist="$deplist $sf"
1615     ;;
1616     esac
1617 edhill 1.15 extn=`echo $sf | $AWK -F '.' '{print $NF}'`
1618 edhill 1.1 case $extn in
1619     F)
1620     echo " \\" >> srclist.inc
1621 edhill 1.71 printf " $sf" >> srclist.inc
1622 edhill 1.1 ;;
1623 cnh 1.3 F90)
1624     echo " \\" >> f90srclist.inc
1625 edhill 1.71 printf " $sf" >> f90srclist.inc
1626 cnh 1.3 ;;
1627 edhill 1.1 c)
1628     echo " \\" >> csrclist.inc
1629 edhill 1.71 printf " $sf" >> csrclist.inc
1630 edhill 1.1 ;;
1631     h)
1632     echo " \\" >> hlist.inc
1633 edhill 1.71 printf " $sf" >> hlist.inc
1634 edhill 1.1 ;;
1635 edhill 1.14 flow)
1636     echo " \\" >> ad_flow_files.inc
1637 edhill 1.71 printf " $sf" >> ad_flow_files.inc
1638 edhill 1.14 ;;
1639 edhill 1.1 esac
1640     fi
1641     fi
1642     done
1643     if test "x$deplist" != x ; then
1644 edhill 1.2 echo "" >> srclinks.tmp
1645     echo "# These files are linked from $d" >> srclinks.tmp
1646 edhill 1.1 echo "$deplist :" >> srclinks.tmp
1647 edhill 1.2 printf "\t\$(LN) %s/\$@ \$@\n" $d >> srclinks.tmp
1648 edhill 1.1 fi
1649     done
1650     rm -rf .links.tmp
1651     echo "" >> srclist.inc
1652     echo "" >> csrclist.inc
1653 cnh 1.3 echo "" >> f90srclist.inc
1654 edhill 1.1 echo "" >> hlist.inc
1655 edhill 1.14 echo "" >> ad_flow_files.inc
1656 edhill 1.1
1657     if test -e $MAKEFILE ; then
1658     mv -f $MAKEFILE "$MAKEFILE.bak"
1659     fi
1660     echo " Writing makefile: $MAKEFILE"
1661     echo "# Multithreaded + multi-processing makefile for:" > $MAKEFILE
1662     echo "# $MACHINE" >> $MAKEFILE
1663     echo "# This makefile was generated automatically on" >> $MAKEFILE
1664     echo "# $THISDATE" >> $MAKEFILE
1665     echo "# by the command:" >> $MAKEFILE
1666 edhill 1.73 echo "# $0 $G2ARGS" >> $MAKEFILE
1667 edhill 1.1 echo "# executed by:" >> $MAKEFILE
1668     echo "# $USER@${THISHOSTNAME}:${THISCWD}" >> $MAKEFILE
1669 edhill 1.21
1670     EXE_AD=$EXECUTABLE"_ad"
1671     EXE_FTL=$EXECUTABLE"_ftl"
1672     EXE_SVD=$EXECUTABLE"_svd"
1673    
1674 edhill 1.1 cat >>$MAKEFILE <<EOF
1675 edhill 1.53 #
1676     # OPTFILE="$OPTFILE"
1677 edhill 1.1 #
1678     # BUILDDIR : Directory where object files are written
1679     # SOURCEDIRS : Directories containing the source (.F) files
1680     # INCLUDEDIRS : Directories containing the header-source (.h) files
1681     # EXEDIR : Directory where executable that is generated is written
1682     # EXECUTABLE : Full path of executable binary
1683     #
1684     # CPP : C-preprocessor command
1685     # INCLUDES : Directories searched for header files
1686     # DEFINES : Macro definitions for CPP
1687     # MAKEDEPEND : Dependency generator
1688     # KPP : Special preprocessor command (specific to platform)
1689     # KFLAGS : Flags for KPP
1690     # FC : Fortran compiler command
1691     # FFLAGS : Configuration/debugging options for FC
1692     # FOPTIM : Optimization options for FC
1693     # LINK : Command for link editor program
1694     # LIBS : Library flags /or/ additional optimization/debugging flags
1695    
1696     ROOTDIR = ${ROOTDIR}
1697     BUILDDIR = ${BUILDDIR}
1698     SOURCEDIRS = ${SOURCEDIRS}
1699     INCLUDEDIRS = ${INCLUDEDIRS}
1700     EXEDIR = ${EXEDIR}
1701     EXECUTABLE = \$(EXEDIR)/${EXECUTABLE}
1702     TOOLSDIR = ${TOOLSDIR}
1703    
1704 edhill 1.14 #eh3 new defines for the adjoint work
1705     AUTODIFF = ${ROOTDIR}/pkg/autodiff
1706 edhill 1.21 EXE_AD = ${EXE_AD}
1707     EXE_FTL = ${EXE_FTL}
1708     EXE_SVD = ${EXE_SVD}
1709 edhill 1.14
1710 adcroft 1.44 ENABLED_PACKAGES = ${ENABLED_PACKAGES}
1711     DISABLED_PACKAGES = ${DISABLED_PACKAGES}
1712    
1713 adcroft 1.52 # These files are created by Makefile
1714     SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h
1715    
1716 edhill 1.1 EOF
1717    
1718     # Note: figure out some way to add Hyades JAM libraries here
1719    
1720     cat >>$MAKEFILE <<EOF
1721     # Unix ln (link)
1722     LN = ${LN}
1723     # C preprocessor
1724     CPP = cat \$< | ${S64} | ${CPP}
1725     # Dependency generator
1726     MAKEDEPEND = ${MAKEDEPEND}
1727     # Special preprocessor (KAP on DECs, FPP on Crays)
1728     KPP = ${KPP}
1729     # Fortran compiler
1730     FC = ${FC}
1731 cnh 1.3 # Fortran compiler
1732     F90C = ${F90C}
1733 edhill 1.1 # Link editor
1734 edhill 1.70 LINK = ${LINK} ${LDADD}
1735 edhill 1.1
1736     # Defines for CPP
1737     DEFINES = ${DEFINES}
1738     # Includes for CPP
1739     INCLUDES = ${INCLUDES}
1740     # Flags for KPP
1741     KFLAGS1 = ${KFLAGS1}
1742     KFLAGS2 = ${KFLAGS2}
1743     # Optim./debug for FC
1744     FFLAGS = ${FFLAGS}
1745     FOPTIM = ${FOPTIM}
1746 cnh 1.3 # Optim./debug for FC
1747     F90FLAGS = ${F90FLAGS}
1748     F90OPTIM = ${F90OPTIM}
1749 edhill 1.1 # Flags for CC
1750     CFLAGS = ${CFLAGS}
1751     # Files that should not be optimized
1752     NOOPTFILES = ${NOOPTFILES}
1753     NOOPTFLAGS = ${NOOPTFLAGS}
1754     # Flags and libraries needed for linking
1755     LIBS = ${LIBS} \$(XLIBS)
1756 cnh 1.3 # Name of the Mekfile
1757     MAKEFILE=${MAKEFILE}
1758 edhill 1.1
1759     EOF
1760    
1761 edhill 1.14 cat srclist.inc >> $MAKEFILE
1762     cat csrclist.inc >> $MAKEFILE
1763     cat f90srclist.inc >> $MAKEFILE
1764     cat hlist.inc >> $MAKEFILE
1765     cat ad_flow_files.inc >> $MAKEFILE
1766 edhill 1.75 echo >> $MAKEFILE
1767 edhill 1.76 echo 'F77FILES = $(SRCFILES:.F=.'$FS')' >> $MAKEFILE
1768     echo 'F90FILES = $(F90SRCFILES:.F=.'$FS90')' >> $MAKEFILE
1769     echo 'OBJFILES = $(SRCFILES:.F=.o) $(CSRCFILES:.c=.o) $(F90SRCFILES:.F90=.o)' >> $MAKEFILE
1770 edhill 1.75 echo >> $MAKEFILE
1771     echo '.SUFFIXES:' >> $MAKEFILE
1772 edhill 1.76 echo '.SUFFIXES: .o .F .p .'$FS' .c .F90 .'$FS90 >> $MAKEFILE
1773 cnh 1.3 rm -f srclist.inc csrclist.inc hlist.inc flist.tmp clist.tmp f90srclist.inc
1774 edhill 1.14 rm -f ad_flow_files.inc
1775 edhill 1.1
1776     cat >>$MAKEFILE <<EOF
1777    
1778     all: \$(EXECUTABLE)
1779 adcroft 1.52 \$(EXECUTABLE): \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(OBJFILES)
1780 adcroft 1.44 @echo Creating \$@ ...
1781 edhill 1.1 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
1782     depend:
1783     @make links
1784 edhill 1.76 \$(MAKEDEPEND) -o .$FS \$(DEFINES) \$(INCLUDES) \$(SRCFILES)
1785 adcroft 1.44 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
1786 edhill 1.72 -rm -f makedepend.out
1787 edhill 1.1
1788 adcroft 1.52 links: \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(SPECIAL_FILES)
1789 edhill 1.1
1790 cnh 1.3 small_f: \$(F77FILES) \$(F90FILES)
1791 edhill 1.1
1792     output.txt: \$(EXECUTABLE)
1793     @printf 'running ... '
1794     @\$(EXECUTABLE) > \$@
1795    
1796     clean:
1797 edhill 1.76 -rm -rf *.o *.$FS *.p *.$FS90 *.mod ${RMFILES} work.{pc,pcl} *.template
1798 edhill 1.1 Clean:
1799     @make clean
1800     @make cleanlinks
1801 adcroft 1.52 -rm -f \$(SPECIAL_FILES)
1802 adcroft 1.51 -rm -f genmake_state genmake_*optfile genmake_warnings make.log run.log *.bak
1803 edhill 1.1 CLEAN:
1804     @make Clean
1805     -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
1806     -find \$(EXEDIR) -name "*.data" -exec rm {} \;
1807     -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
1808 edhill 1.12 -rm -f \$(EXECUTABLE) output.txt
1809 edhill 1.1
1810 edhill 1.18 #eh3 Makefile: makefile
1811 edhill 1.1 makefile:
1812 edhill 1.73 $THIS_SCRIPT $G2ARGS
1813 edhill 1.1 cleanlinks:
1814     -find . -type l -exec rm {} \;
1815    
1816 adcroft 1.52 # Special targets ($SPECIAL_FILES) which are create by make
1817 adcroft 1.44 ${PACKAGES_DOT_H}:
1818     @echo Creating \$@ ...
1819 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) > \$@
1820 adcroft 1.44 AD_CONFIG.h:
1821     @echo Creating \$@ ...
1822 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 > \$@
1823 adcroft 1.52 FC_NAMEMANGLE.h:
1824     @echo Creating \$@ ...
1825     echo "$FC_NAMEMANGLE" > \$@
1826 adcroft 1.44
1827 edhill 1.76 # The normal chain of rules is ( .F - .$FS - .o )
1828    
1829     %.o : %.F
1830    
1831     .F.$FS:
1832 edhill 1.1 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1833 edhill 1.76 .$FS.o:
1834 edhill 1.1 \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
1835 edhill 1.76 .F90.$FS90:
1836 cnh 1.3 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1837 edhill 1.76 .$FS90.o:
1838 cnh 1.3 \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
1839 edhill 1.1 .c.o:
1840     \$(CC) \$(CFLAGS) -c \$<
1841    
1842 edhill 1.76 # Special exceptions that use the ( .F - .p - .$FS - .o ) rule-chain
1843     .F.p:
1844 edhill 1.1 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1845 edhill 1.76 .p.$FS:
1846 edhill 1.1 \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
1847 edhill 1.14
1848     #=========================================
1849     #=== Automatic Differentiation Rules ===
1850    
1851     TAMC = ${TAMC}
1852     TAF = ${TAF}
1853    
1854 edhill 1.17 TAF_EXTRA = ${TAF_EXTRA}
1855     TAMC_EXTRA = ${TAMC_EXTRA}
1856    
1857 edhill 1.14 EOF
1858    
1859     ad_vars="AD_TAMC_FLAGS AD_TAF_FLAGS"
1860     ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF_FLAGS"
1861     ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
1862     for i in $ad_vars ; do
1863     name=$i
1864     t1="t2=\$"`echo $i`
1865     eval $t1
1866     printf "%-20s = " $name >> $MAKEFILE
1867     echo $t2 >> $MAKEFILE
1868     done
1869    
1870     echo " Add the source list for AD code generation"
1871     echo >> $MAKEFILE
1872 edhill 1.71 printf "AD_FILES = " >> $MAKEFILE
1873 edhill 1.14 AD_FILES=`cat ad_files`
1874     for i in $AD_FILES ; do
1875     echo " \\" >> $MAKEFILE
1876 edhill 1.71 printf " $i" >> $MAKEFILE
1877 edhill 1.14 done
1878     echo >> $MAKEFILE
1879 edhill 1.21 rm -f ad_files
1880 edhill 1.14
1881     cat >>$MAKEFILE <<EOF
1882    
1883 edhill 1.16 # ... AD ...
1884 edhill 1.23 adall: ad_taf
1885     adtaf: ad_taf_output.f
1886     adtamc: ad_tamc_output.f
1887 edhill 1.21
1888 heimbach 1.48 ad_input_code.f: \$(AD_FILES) \$(HEADERFILES)
1889 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
1890 edhill 1.23 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
1891 adcroft 1.44 -rm -f ad_config.template
1892 edhill 1.22 @make \$(F77FILES)
1893     @make \$(AD_FLOW_FILES)
1894     cat \$(AD_FLOW_FILES) \$(AD_FILES) > ad_input_code.f
1895    
1896 edhill 1.14 ad_taf_output.f: ad_input_code.f
1897 heimbach 1.37 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f
1898 adcroft 1.44 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f
1899 heimbach 1.37
1900     adtafonly:
1901 edhill 1.17 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f
1902 adcroft 1.44 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f
1903 edhill 1.14
1904     ad_taf: ad_taf_output.o \$(OBJFILES)
1905 edhill 1.21 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
1906 edhill 1.14
1907     ad_tamc_output.f: ad_input_code.f
1908 edhill 1.17 \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.f
1909 adcroft 1.44 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.f
1910 edhill 1.14
1911     ad_tamc: ad_tamc_output.o \$(OBJFILES)
1912 edhill 1.21 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
1913 edhill 1.14
1914    
1915 edhill 1.19 # ... FTL ...
1916 edhill 1.23 ftlall: ftl_taf
1917     ftltaf: ftl_taf_output.f
1918     ftltamc: ftl_tamc_output.f
1919 edhill 1.21
1920 heimbach 1.48 ftl_input_code.f: \$(AD_FILES) \$(HEADERFILES)
1921 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
1922 edhill 1.23 cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
1923 adcroft 1.44 -rm -f ftl_config.template
1924 edhill 1.23 @make \$(F77FILES)
1925 edhill 1.22 @make \$(AD_FLOW_FILES)
1926     cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.f
1927    
1928     ftl_taf_output.f: ftl_input_code.f
1929     \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f
1930 adcroft 1.44 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f
1931 edhill 1.14
1932 heimbach 1.40 ftltafonly:
1933     \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f
1934 adcroft 1.44 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f
1935 heimbach 1.40
1936 edhill 1.19 ftl_taf: ftl_taf_output.o \$(OBJFILES)
1937 edhill 1.21 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
1938 edhill 1.14
1939 edhill 1.22 ftl_tamc_output.f: ftl_input_code.f
1940     \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.f
1941 adcroft 1.44 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.f
1942 edhill 1.16
1943 edhill 1.19 ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
1944 edhill 1.21 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
1945 edhill 1.16
1946    
1947     # ... SVD ...
1948 heimbach 1.40 svdtaf: ad_taf_output.f ftl_taf_output.f
1949     svdall: svd_taf
1950 edhill 1.16
1951 heimbach 1.40 svd_taf: ad_taf_output.o ftl_taf_output.o \$(OBJFILES)
1952     \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
1953 edhill 1.14
1954    
1955     #=========================================
1956 edhill 1.1
1957     EOF
1958 edhill 1.7
1959     if test "x$EXEHOOK" != x ; then
1960     printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE
1961     fi
1962 edhill 1.1
1963     echo " Making list of \"exceptions\" that need \".p\" files"
1964     for i in $KPPFILES ; do
1965     base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
1966     RETVAL=$?
1967     if test "x$RETVAL" != x0 ; then
1968     echo "Error: unable to add file \"$i\" to the exceptions list"
1969     fi
1970 edhill 1.76 echo "$base.$FS: $base.p" >> $MAKEFILE
1971 edhill 1.1 done
1972    
1973     echo " Making list of NOOPTFILES"
1974     for i in $NOOPTFILES ; do
1975     base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
1976     RETVAL=$?
1977     if test "x$RETVAL" != x0 ; then
1978     echo "Error: unable to add file \"$i\" to the exceptions list"
1979     fi
1980 edhill 1.76 echo "$base.o: $base.$FS" >> $MAKEFILE
1981 edhill 1.2 printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE
1982 edhill 1.1 done
1983    
1984     echo " Add rules for links"
1985     cat srclinks.tmp >> $MAKEFILE
1986     rm -f srclinks.tmp
1987    
1988     echo " Adding makedepend marker"
1989 edhill 1.2 printf "\n\n# DO NOT DELETE\n" >> $MAKEFILE
1990 edhill 1.1
1991 edhill 1.2 printf "\n=== Done ===\n"
1992 adcroft 1.47
1993     # Create special header files
1994 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"
1995 adcroft 1.47 if test ! -f $PACKAGES_DOT_H ; then
1996     mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
1997     else
1998 edhill 1.61 cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H > /dev/null 2>&1
1999 adcroft 1.47 RETVAL=$?
2000     if test "x$RETVAL" = x0 ; then
2001     rm -f $PACKAGES_DOT_H".tmp"
2002     else
2003     mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"
2004     mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
2005     fi
2006     fi
2007     if test ! -f AD_CONFIG.h ; then
2008 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
2009 adcroft 1.47 fi
2010 edhill 1.5
2011    
2012     # Write the "state" for future records
2013     if test "x$DUMPSTATE" != xf ; then
2014 edhill 1.71 printf "" > genmake_state
2015 edhill 1.5 for i in $gm_state ; do
2016     t1="t2=\$$i"
2017     eval $t1
2018 edhill 1.12 echo "$i='$t2'" >> genmake_state
2019 edhill 1.5 done
2020     fi

  ViewVC Help
Powered by ViewVC 1.1.22