/[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.85 - (hide annotations) (download)
Wed Jul 14 21:26:53 2004 UTC (19 years, 8 months ago) by edhill
Branch: MAIN
Changes since 1.84: +32 -30 lines
 o fix the "find a working makedepend" bug found by JMC

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

  ViewVC Help
Powered by ViewVC 1.1.22