/[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.89 - (hide annotations) (download)
Wed Jul 21 16:34:46 2004 UTC (19 years, 8 months ago) by edhill
Branch: MAIN
CVS Tags: checkpoint54d_post
Changes since 1.88: +10 -3 lines
 o netcdf (mnc) now compiles and runs on halem

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

  ViewVC Help
Powered by ViewVC 1.1.22