/[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.108 - (hide annotations) (download)
Thu Oct 21 13:38:46 2004 UTC (19 years, 5 months ago) by edhill
Branch: MAIN
Changes since 1.107: +53 -1 lines
 o give MNC the ability to create additional files rather than
   exceeding a specified file size limit
   - run-time configurable (in data.mnc) as "MNC_MAX_FSIZE"
   - the default is just less than 2GB which is a practical limit
     on many systems (eg. Baylor's and Helen's recent problems)
   - tested and works on Linux/g77 -- needs testing elsewhere

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

  ViewVC Help
Powered by ViewVC 1.1.22