/[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.122 - (hide annotations) (download)
Tue Mar 22 20:10:32 2005 UTC (19 years ago) by edhill
Branch: MAIN
CVS Tags: checkpoint57g_post, checkpoint57g_pre, checkpoint57f_pre, checkpoint57f_post
Changes since 1.121: +2 -2 lines
 o forgot the dot !!!

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

  ViewVC Help
Powered by ViewVC 1.1.22