/[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.104 - (hide annotations) (download)
Tue Oct 5 16:10:31 2004 UTC (19 years, 5 months ago) by edhill
Branch: MAIN
CVS Tags: checkpoint55d_pre, checkpoint55e_post, checkpoint55d_post
Changes since 1.103: +25 -2 lines
 o make our builds easier in the Cygwin environment

1 edhill 1.86 #! /usr/bin/env bash
2 edhill 1.1 #
3 edhill 1.104 # $Header: /u/gcmpack/MITgcm/tools/genmake2,v 1.103 2004/10/04 19:00:42 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.60 check_netcdf_libs() {
679 edhill 1.91 echo "" > genmake_tnc.log
680 edhill 1.75 cat <<EOF > genmake_tnc.for
681 edhill 1.60 program fgennc
682     #include "netcdf.inc"
683     integer iret, ncid, xid
684     iret = nf_create('genmake_tnc.nc', NF_CLOBBER, ncid)
685     IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
686     iret = nf_def_dim(ncid, 'X', 11, xid)
687     IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
688     iret = nf_close(ncid)
689     IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
690     end
691     EOF
692 edhill 1.96 #echo "$CPP $DEFINES $INCLUDES genmake_tnc.for > genmake_tnc.f"
693     #echo "$FC $FFLAGS $FOPTIM -c genmake_tnc.f"
694     #echo "$LINK -o genmake_tnc.o $LIBS"
695 edhill 1.91 $CPP $DEFINES $INCLUDES genmake_tnc.for > genmake_tnc.f 2>/dev/null \
696 edhill 1.99 && $FC $FFLAGS $FOPTIM -c genmake_tnc.f >> genmake_tnc.log 2>&1 \
697 edhill 1.96 && $LINK -o genmake_tnc genmake_tnc.o $LIBS >> genmake_tnc.log 2>&1
698 edhill 1.60 RET_COMPILE=$?
699 edhill 1.99
700     #EH3 Remove test program execution for machines that either disallow
701     #EH3 execution or cannot support it (eg. cross-compilers)
702     #EH3
703     #EH3 test -x ./genmake_tnc && ./genmake_tnc >> genmake_tnc.log 2>&1
704     #EH3 RETVAL=$?
705     #EH3 if test "x$RET_COMPILE" = x0 -a "x$RETVAL" = x0 ; then
706    
707     if test "x$RET_COMPILE" = x0 ; then
708 edhill 1.60 HAVE_NETCDF=t
709     else
710 edhill 1.66 # try again with "-lnetcdf" added to the libs
711 edhill 1.91 $CPP $DEFINES $INCLUDES genmake_tnc.for > genmake_tnc.f 2>/dev/null \
712 edhill 1.99 && $FC $FFLAGS $FOPTIM -c genmake_tnc.f >> genmake_tnc.log 2>&1 \
713     && $LINK -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf >> genmake_tnc.log 2>&1
714 edhill 1.66 RET_COMPILE=$?
715 edhill 1.99 if test "x$RET_COMPILE" = x0 ; then
716 edhill 1.66 LIBS="$LIBS -lnetcdf"
717     HAVE_NETCDF=t
718     else
719     cat genmake_tnc.log >> genmake_warnings
720     fi
721 edhill 1.60 fi
722     rm -f genmake_tnc*
723     }
724    
725    
726 adcroft 1.67
727     ###############################################################################
728     # Sequential part of script starts here
729     ###############################################################################
730    
731 edhill 1.1 # Set defaults here
732 edhill 1.5 COMMANDL="$0 $@"
733    
734 edhill 1.1 PLATFORM=
735     LN=
736     S64=
737     KPP=
738     FC=
739 edhill 1.93 #CC=gcc
740 edhill 1.60 CPP=
741 edhill 1.1 LINK=
742 edhill 1.31 DEFINES=
743 edhill 1.1 PACKAGES=
744     ENABLE=
745     DISABLE=
746     MAKEFILE=
747 edhill 1.90 #MAKEDEPEND=
748 edhill 1.1 PDEPEND=
749 edhill 1.11 DUMPSTATE=t
750 edhill 1.1 PDEFAULT=
751     OPTFILE=
752 edhill 1.2 INCLUDES="-I."
753 edhill 1.1 FFLAGS=
754     FOPTIM=
755     CFLAGS=
756     KFLAGS1=
757     KFLAGS2=
758 edhill 1.70 #LDADD=
759 edhill 1.1 LIBS=
760     KPPFILES=
761     NOOPTFILES=
762     NOOPTFLAGS=
763 adcroft 1.67 MPI=
764     MPIPATH=
765 edhill 1.1
766 edhill 1.29 # DEFINES checked by test compilation
767     HAVE_SYSTEM=
768     HAVE_FDATE=
769     FC_NAMEMANGLE=
770 edhill 1.39 HAVE_CLOC=
771 edhill 1.60 HAVE_NETCDF=
772 cnh 1.81 HAVE_ETIME=
773 edhill 1.29
774 edhill 1.1 MODS=
775     TOOLSDIR=
776     SOURCEDIRS=
777     INCLUDEDIRS=
778 edhill 1.57 STANDARDDIRS="USE_THE_DEFAULT"
779 edhill 1.1
780 edhill 1.73 G2ARGS=
781 edhill 1.71 BASH=
782 edhill 1.1 PWD=`pwd`
783     MAKE=make
784 edhill 1.15 AWK=awk
785 edhill 1.97 THISHOST=`hostname`
786 edhill 1.1 THISCWD=`pwd`
787     THISDATE=`date`
788 edhill 1.97 THISUSER=`echo $USER`
789     THISVER=
790 edhill 1.1 MACHINE=`uname -a`
791 edhill 1.7 EXECUTABLE=
792     EXEHOOK=
793     EXEDIR=
794 edhill 1.12 PACKAGES_CONF=
795     IEEE=
796     if test "x$MITGCM_IEEE" != x ; then
797     IEEE=$MITGCM_IEEE
798     fi
799 edhill 1.76 FS=
800     FS90=
801 edhill 1.1
802 edhill 1.14 AUTODIFF_PKG_USED=f
803     AD_OPTFILE=
804 edhill 1.17 TAF=
805     AD_TAF_FLAGS=
806     FTL_TAF_FLAGS=
807     SVD_TAF_FLAGS=
808     TAF_EXTRA=
809     TAMC=
810     AD_TAMC_FLAGS=
811     FTL_TAF_FLAGS=
812     SVD_TAMC_FLAGS=
813     TAMC_EXTRA=
814    
815 edhill 1.14
816 edhill 1.5 # The following state can be set directly by command-line switches
817 edhill 1.41 gm_s1="OPTFILE PDEPEND PDEFAULT MAKEFILE PLATFORM ROOTDIR MODS DISABLE ENABLE"
818 edhill 1.60 gm_s2="FC CPP IEEE MPI JAM DUMPSTATE STANDARDDIRS"
819 edhill 1.5
820     # The following state is not directly set by command-line switches
821     gm_s3="LN S64 KPP LINK PACKAGES MAKEDEPEND PDEPEND PDEFAULT INCLUDES FFLAGS FOPTIM "
822     gm_s4="CFLAGS KFLAGS1 KFLAGS2 LIBS KPPFILES NOOPTFILES NOOPTFLAGS"
823 edhill 1.97 gm_s5="TOOLSDIR SOURCEDIRS INCLUDEDIRS PWD MAKE THISHOST THISUSER THISDATE THISVER MACHINE"
824 edhill 1.12 gm_s6="EXECUTABLE EXEHOOK EXEDIR PACKAGES_CONF"
825 cnh 1.81 gm_s7="HAVE_SYSTEM HAVE_FDATE FC_NAMEMANGLE HAVE_ETIME"
826 edhill 1.5
827 edhill 1.14 # The following are all related to adjoint/tangent-linear stuff
828 edhill 1.29 gm_s10="AUTODIFF_PKG_USED AD_OPTFILE TAMC TAF AD_TAMC_FLAGS AD_TAF_FLAGS"
829     gm_s11="FTL_TAMC_FLAGS FTL_TAF_FLAGS SVD_TAMC_FLAGS SVD_TAF_FLAGS"
830     gm_s12="TAF_EXTRA TAMC_EXTRA"
831 edhill 1.14
832 edhill 1.29 gm_state="COMMANDL $gm_s1 $gm_s2 $gm_s3 $gm_s4 $gm_s5 $gm_s6 $gm_s7"
833     gm_state="$gm_state $gm_s10 $gm_s11 $gm_s12"
834 edhill 1.5
835 edhill 1.41 cat <<EOF
836    
837     GENMAKE :
838    
839     A program for GENerating MAKEfiles for the MITgcm project. For a
840     quick list of options, use "genmake -h" or for more detail see:
841    
842     http://mitgcm.org/devel_HOWTO/
843    
844     EOF
845 edhill 1.5
846 edhill 1.2 echo "=== Processing options files and arguments ==="
847 edhill 1.12 gm_local="genmake_local"
848     for i in . $MODS ; do
849     if test -r $i/$gm_local ; then
850 edhill 1.34 . $i/$gm_local
851 edhill 1.12 break
852     fi
853     done
854 edhill 1.71 printf " getting local config information: "
855 edhill 1.88 if test -f $gm_local ; then
856 edhill 1.1 echo "using $gm_local"
857 edhill 1.34 . $gm_local
858 edhill 1.2 # echo "DISABLE=$DISABLE"
859     # echo "ENABLE=$ENABLE"
860 edhill 1.1 else
861     echo "none found"
862     fi
863    
864 edhill 1.103 #echo "$0::$1:$2:$3:$4:$5:$6:$7:"
865 edhill 1.2 #OPTIONS=
866     #n=0
867     #for i ; do
868     # echo "$i $n"
869     # setvar="OPTIONS[$n]='$i'"
870     # # echo " $setvar"
871     # eval "$setvar"
872     # n=$(( $n + 1 ))
873     #done
874     #parse_options
875     ac_prev=
876 edhill 1.102 for ac_option in "$@" ; do
877 edhill 1.2
878 edhill 1.73 G2ARGS="$G2ARGS \"$ac_option\""
879    
880 edhill 1.2 # If the previous option needs an argument, assign it.
881     if test -n "$ac_prev"; then
882     eval "$ac_prev=\$ac_option"
883     ac_prev=
884     continue
885     fi
886    
887     ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
888    
889     case $ac_option in
890    
891     -help | --help | -h | --h)
892     usage ;;
893    
894     -nooptfile | --nooptfile)
895     OPTFILE="NONE" ;;
896     -optfile | --optfile | -of | --of)
897 edhill 1.4 ac_prev=OPTFILE ;;
898 edhill 1.2 -optfile=* | --optfile=* | -of=* | --of=*)
899     OPTFILE=$ac_optarg ;;
900    
901 edhill 1.50 -adoptfile | --adoptfile | -adof | --adof)
902 edhill 1.14 ac_prev=AD_OPTFILE ;;
903     -adoptfile=* | --adoptfile=* | -adof=* | --adof=*)
904     AD_OPTFILE=$ac_optarg ;;
905    
906 edhill 1.2 -pdepend | --pdepend)
907 edhill 1.4 ac_prev=PDEPEND ;;
908 edhill 1.2 -pdepend=* | --pdepend=*)
909     PDEPEND=$ac_optarg ;;
910    
911     -pdefault | --pdefault)
912 edhill 1.4 ac_prev=PDEFAULT ;;
913 edhill 1.2 -pdefault=* | --pdefault=*)
914     PDEFAULT=$ac_optarg ;;
915    
916 edhill 1.6 -make | --make | -m | --m)
917     ac_prev=MAKE ;;
918     -make=* | --make=* | -m=* | --m=*)
919     MAKE=$ac_optarg ;;
920 edhill 1.69
921 edhill 1.71 -bash | --bash)
922     ac_prev=BASH ;;
923     -bash=* | --bash=*)
924     BASH=$ac_optarg ;;
925    
926 edhill 1.69 -makedepend | --makedepend | -md | --md)
927     ac_prev=MAKEDEPEND ;;
928     -makedepend=* | --makedepend=* | -md=* | --md=*)
929     MAKEDEPEND=$ac_optarg ;;
930 edhill 1.6
931     -makefile | --makefile | -ma | --ma)
932 edhill 1.4 ac_prev=MAKEFILE ;;
933 edhill 1.6 -makefile=* | --makefile=* | -ma=* | --ma=*)
934 edhill 1.2 MAKEFILE=$ac_optarg ;;
935    
936 edhill 1.41 -platform | --platform | -pl | --pl | -platform=* | --platform=* | -pl=* | --pl=*)
937     echo "ERROR: The platform option has been removed. Please specify"
938     echo " the build options using the \"optfile\" mechanism."
939     echo
940     usage
941     ;;
942 edhill 1.2
943     -rootdir | --rootdir | -rd | --rd)
944 edhill 1.4 ac_prev=ROOTDIR ;;
945 edhill 1.2 -rootdir=* | --rootdir=* | -rd=* | --rd=*)
946     ROOTDIR=$ac_optarg ;;
947    
948     -mods | --mods | -mo | --mo)
949 edhill 1.4 ac_prev=MODS ;;
950 edhill 1.2 -mods=* | --mods=* | -mo=* | --mo=*)
951     MODS=$ac_optarg ;;
952    
953     -disable | --disable)
954 edhill 1.4 ac_prev=DISABLE ;;
955 edhill 1.2 -disable=* | --disable=*)
956     DISABLE=$ac_optarg ;;
957    
958     -enable | --enable)
959 edhill 1.4 ac_prev=ENABLE ;;
960 edhill 1.2 -enable=* | --enable=*)
961     ENABLE=$ac_optarg ;;
962    
963 edhill 1.12 -standarddirs | --standarddirs)
964     ac_prev=STANDARDDIRS ;;
965     -standarddirs=* | --standarddirs=*)
966     STANDARDDIRS=$ac_optarg ;;
967    
968 edhill 1.2 # -cpp | --cpp)
969     # ac_prev=cpp ;;
970     # -cpp=* | --cpp=*)
971     # CPP=$ac_optarg ;;
972 edhill 1.91
973     -cc | --cc)
974     ac_prev=CC ;;
975     -cc=* | --cc=*)
976     CC=$ac_optarg ;;
977    
978 edhill 1.2 -fortran | --fortran | -fc | --fc)
979 edhill 1.4 ac_prev=FC ;;
980 edhill 1.2 -fc=* | --fc=*)
981     FC=$ac_optarg ;;
982    
983 edhill 1.76 -fs | --fs)
984     ac_prev=FS ;;
985     -fs=* | --fs=*)
986     FS=$ac_optarg ;;
987    
988     -fs90 | --fs90)
989     ac_prev=FS90 ;;
990     -fs90=* | --fs90=*)
991     FS90=$ac_optarg ;;
992    
993 edhill 1.2 -ieee | --ieee)
994 edhill 1.12 IEEE=true ;;
995 edhill 1.2 -noieee | --noieee)
996 edhill 1.12 IEEE= ;;
997 adcroft 1.67
998     -mpi | --mpi)
999     MPI=true ;;
1000     -mpi=* | --mpi=*)
1001     MPIPATH=$ac_optarg
1002     MPI=true ;;
1003 edhill 1.2
1004 edhill 1.41 # -jam | --jam)
1005     # JAM=1 ;;
1006     # -nojam | --nojam)
1007     # JAM=0 ;;
1008 edhill 1.2
1009 edhill 1.5 -ds | --ds)
1010     DUMPSTATE=t ;;
1011    
1012 edhill 1.17 -taf_extra | --taf_extra)
1013     ac_prev=TAF_EXTRA ;;
1014     -taf_extra=* | --taf_extra=*)
1015     TAF_EXTRA=$ac_optarg ;;
1016    
1017     -tamc_extra | --tamc_extra)
1018     ac_prev=TAMC_EXTRA ;;
1019     -tamc_extra=* | --tamc_extra=*)
1020     TAMC_EXTRA=$ac_optarg ;;
1021    
1022 edhill 1.2 -*)
1023     echo "Error: unrecognized option: "$ac_option
1024     usage
1025     ;;
1026    
1027     *)
1028     echo "Error: unrecognized argument: "$ac_option
1029     usage
1030     ;;
1031    
1032     esac
1033    
1034 edhill 1.1 done
1035    
1036 edhill 1.12 if test -f ./.genmakerc ; then
1037     echo
1038     echo "WARNING: genmake2 has detected a copy of the old-style \"./.genmakerc\""
1039     echo " file. This file format is no longer supported. Please see:"
1040     echo
1041     echo " http://mitgcm.org/devel_HOWTO/"
1042     echo
1043     echo " for directions on how to setup and use the new \"genmake2\" input"
1044     echo " files and send an email to MITgcm-support@mitgcm.org if you want help."
1045     echo
1046     fi
1047    
1048 edhill 1.97 # Find the MITgcm ${ROOTDIR}
1049 edhill 1.11 if test "x${ROOTDIR}" = x ; then
1050 edhill 1.87 tmp=`echo $PWD | sed -e 's/\// /g' | awk '{print $NR}'`
1051     if test "x$tmp" = "xbin" -a -d ../model -a -d ../eesup -a -d ../pkg ; then
1052 edhill 1.11 ROOTDIR=".."
1053     else
1054     for d in . .. ../.. ../../.. ../../../.. ../../../../.. ; do
1055     if [ -d "$d/model" -a -d "$d/eesupp" -a -d "$d/pkg" ]; then
1056     ROOTDIR=$d
1057 edhill 1.71 printf "Warning: ROOTDIR was not specified but there appears to be"
1058 edhill 1.11 echo " a copy of MITgcm at \"$ROOTDIR\" so we'll try it."
1059     break
1060     fi
1061     done
1062     fi
1063     fi
1064     if test "x${ROOTDIR}" = x ; then
1065     echo "Error: Cannot determine ROOTDIR for MITgcm code."
1066     echo " Please specify a ROOTDIR using either an options "
1067     echo " file or a command-line option."
1068     exit 1
1069     fi
1070     if test ! -d ${ROOTDIR} ; then
1071     echo "Error: the specified ROOTDIR (\"$ROOTDIR\") does not exist!"
1072     exit 1
1073     fi
1074    
1075 edhill 1.97 # Find the MITgcm ${THISVER}
1076     if test -f "${ROOTDIR}/doc/tag-index" ; then
1077     THISVER=`grep checkpoint ${ROOTDIR}/doc/tag-index | head -1`
1078     fi
1079    
1080 edhill 1.1 echo " getting OPTFILE information: "
1081     if test "x${OPTFILE}" = x ; then
1082 edhill 1.11 if test "x$MITGCM_OF" = x ; then
1083     echo "Warning: no OPTFILE specified so we'll look for possible settings"
1084     printf "\n=== Searching for possible settings for OPTFILE ===\n"
1085     find_possible_configs
1086 edhill 1.1 else
1087 edhill 1.11 OPTFILE=$MITGCM_OF
1088     fi
1089     fi
1090     if test "x$OPTFILE" != xNONE ; then
1091     if test -f "$OPTFILE" -a -r "$OPTFILE" ; then
1092     echo " using OPTFILE=\"$OPTFILE\""
1093 edhill 1.34 . "$OPTFILE"
1094 edhill 1.11 RETVAL=$?
1095     if test "x$RETVAL" != x0 ; then
1096 edhill 1.71 printf "Error: failed to source OPTFILE \"$OPTFILE\""
1097 edhill 1.11 echo "--please check that variable syntax is bash-compatible"
1098 edhill 1.1 exit 1
1099     fi
1100 edhill 1.11 if test "x$DUMPSTATE" != xf ; then
1101 edhill 1.12 cp -f $OPTFILE "genmake_optfile"
1102 edhill 1.11 fi
1103     else
1104     echo "Error: can't read OPTFILE=\"$OPTFILE\""
1105     exit 1
1106 edhill 1.1 fi
1107     fi
1108 edhill 1.8
1109 edhill 1.75 # Check for broken systems that cannot correctly distinguish *.F and *.f files
1110 edhill 1.77 # check_for_broken_Ff
1111 edhill 1.75
1112 edhill 1.14 echo " getting AD_OPTFILE information: "
1113     if test "x${AD_OPTFILE}" = x ; then
1114     if test "x$MITGCM_AD_OF" = x ; then
1115     AD_OPTFILE=$ROOTDIR/tools/adjoint_options/adjoint_default
1116     else
1117     AD_OPTFILE=$MITGCM_AD_OF
1118     fi
1119     fi
1120     if test "x${AD_OPTFILE}" != xNONE ; then
1121     if test -f "$AD_OPTFILE" -a -r "$AD_OPTFILE" ; then
1122     echo " using AD_OPTFILE=\"$AD_OPTFILE\""
1123 edhill 1.34 . "$AD_OPTFILE"
1124 edhill 1.14 RETVAL=$?
1125     if test "x$RETVAL" != x0 ; then
1126 edhill 1.71 printf "Error: failed to source AD_OPTFILE \"$AD_OPTFILE\""
1127 edhill 1.14 echo "--please check that variable syntax is bash-compatible"
1128     exit 1
1129     fi
1130     if test "x$DUMPSTATE" != xf ; then
1131     cp -f $AD_OPTFILE "genmake_ad_optfile"
1132     fi
1133     else
1134     echo "Error: can't read AD_OPTFILE=\"$AD_OPTFILE\""
1135     exit 1
1136     fi
1137     fi
1138    
1139 edhill 1.91 # Check that FC, CC, LINK, CPP, S64, LN, and MAKE are defined. If not,
1140 edhill 1.39 # either set defaults or complain and abort!
1141 edhill 1.71 if test ! "x$BASH" = x ; then
1142     # add a trailing space so that it works within the Makefile syntax (see below)
1143     BASH="$BASH "
1144     fi
1145 edhill 1.8 if test "x$FC" = x ; then
1146     cat <<EOF 1>&2
1147    
1148     Error: no Fortran compiler: please specify using one of the following:
1149     1) within the options file ("FC=...") as specified by "-of=OPTFILE"
1150     2) the "-fc=XXX" command-line option
1151 edhill 1.12 3) the "./genmake_local" file
1152 edhill 1.8 EOF
1153     exit 1
1154     fi
1155 edhill 1.91 if test "x$CC" = x ; then
1156 edhill 1.93 CC=cc
1157     # cat <<EOF 1>&2
1158     # Error: no C compiler: please specify using one of the following:
1159     # 1) within the options file ("CC=...") as specified by "-of=OPTFILE"
1160     # 2) the "-cc=XXX" command-line option
1161     # 3) the "./genmake_local" file
1162     # EOF
1163     # exit 1
1164 edhill 1.91 fi
1165 edhill 1.8 if test "x$LINK" = x ; then
1166     LINK=$FC
1167     fi
1168 edhill 1.39 if test "x$MAKE" = x ; then
1169     MAKE="make"
1170     fi
1171 edhill 1.63 if test "x$CPP" = x ; then
1172     CPP=cpp
1173     fi
1174     #EH3 === UGLY ===
1175 edhill 1.76 # The following is an ugly little hack to check for $CPP in /lib/ and
1176     # it should eventually be replaced with a more general function that
1177 edhill 1.63 # searches a combo of the user's path and a list of "usual suspects"
1178     # to find the correct location for binaries such as $CPP.
1179     for i in " " "/lib/" ; do
1180     echo "#define A a" | $i$CPP > test_cpp 2>&1 && CPP=$i$CPP
1181     done
1182     #EH3 === UGLY ===
1183 edhill 1.13 echo "#define A a" | $CPP > test_cpp 2>&1
1184 edhill 1.11 RETVAL=$?
1185     if test "x$RETVAL" != x0 ; then
1186 edhill 1.8 cat <<EOF 1>&2
1187    
1188 edhill 1.11 Error: C pre-processor "$CPP" failed the test case: please specify using:
1189    
1190 edhill 1.8 1) within the options file ("CPP=...") as specified by "-of=OPTFILE"
1191 edhill 1.12 2) the "./genmake_local" file
1192 edhill 1.30 3) with the CPP environment variable
1193 edhill 1.11
1194 edhill 1.8 EOF
1195     exit 1
1196 edhill 1.11 else
1197     rm -f test_cpp
1198 edhill 1.8 fi
1199 edhill 1.84 look_for_makedepend
1200 edhill 1.35 if test "x$LN" = x ; then
1201     LN="ln -s"
1202     fi
1203     echo "test" > genmake_test_ln
1204     $LN genmake_test_ln genmake_tlink
1205     RETVAL=$?
1206     if test "x$RETVAL" != x0 ; then
1207     cat <<EOF 1>&2
1208 edhill 1.29
1209 edhill 1.35 Error: The command "ln -s" failed -- please specify a working soft-link
1210     command in the optfile.
1211    
1212     EOF
1213     exit 1
1214     fi
1215     rm -f genmake_test_ln genmake_tlink
1216 edhill 1.77
1217     # Check for broken *.F/*.f handling and fix if possible
1218     check_for_broken_Ff
1219 edhill 1.29
1220 adcroft 1.67 if test ! "x$MPI" = x ; then
1221     echo " Turning on MPI cpp macros"
1222 adcroft 1.68 DEFINES="$DEFINES -DALLOW_USE_MPI -DALWAYS_USE_MPI"
1223 adcroft 1.67 fi
1224 edhill 1.39
1225 edhill 1.29 printf "\n=== Checking system libraries ===\n"
1226 edhill 1.71 printf " Do we have the system() command using $FC... "
1227 edhill 1.29 cat > genmake_tcomp.f <<EOF
1228     program hello
1229     call system('echo hi')
1230     end
1231     EOF
1232     $FC $FFLAGS $DEFINES -o genmake_tcomp genmake_tcomp.f > genmake_tcomp.log 2>&1
1233     RETVAL=$?
1234     if test "x$RETVAL" = x0 ; then
1235     HAVE_SYSTEM=t
1236     DEFINES="$DEFINES -DHAVE_SYSTEM"
1237     echo "yes"
1238     else
1239     HAVE_SYSTEM=
1240     echo "no"
1241     fi
1242     rm -f genmake_tcomp*
1243    
1244 edhill 1.71 printf " Do we have the fdate() command using $FC... "
1245 edhill 1.29 cat > genmake_tcomp.f <<EOF
1246     program hello
1247     CHARACTER(128) string
1248     string = ' '
1249     call fdate( string )
1250     print *, string
1251     end
1252     EOF
1253     $FC $FFLAGS $DEFINES -o genmake_tcomp genmake_tcomp.f > genmake_tcomp.log 2>&1
1254     RETVAL=$?
1255     if test "x$RETVAL" = x0 ; then
1256     HAVE_FDATE=t
1257     DEFINES="$DEFINES -DHAVE_FDATE"
1258     echo "yes"
1259     else
1260     HAVE_FDATE=
1261     echo "no"
1262     fi
1263     rm -f genmake_tcomp*
1264    
1265 cnh 1.81 printf " Do we have the etime() command using $FC... "
1266     cat > genmake_tcomp.f <<EOF
1267     program hello
1268 cnh 1.82 REAL*4 ACTUAL, TARRAY(2)
1269     EXTERNAL ETIME
1270     REAL*4 ETIME
1271     actual = etime( tarray )
1272 cnh 1.81 print *, tarray
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_ETIME=t
1279     DEFINES="$DEFINES -DHAVE_ETIME"
1280     echo "yes"
1281     else
1282     HAVE_ETIME=
1283     echo "no"
1284     fi
1285     rm -f genmake_tcomp*
1286    
1287 edhill 1.71 printf " Can we call simple C routines (here, \"cloc()\") using $FC... "
1288 edhill 1.39 check_HAVE_CLOC
1289     if test "x$HAVE_CLOC" != x ; then
1290     echo "yes"
1291     else
1292     echo "no"
1293 edhill 1.29 fi
1294 edhill 1.39 rm -f genmake_t*
1295 edhill 1.29
1296 edhill 1.71 printf " Can we create NetCDF-enabled binaries... "
1297 edhill 1.60 check_netcdf_libs
1298     if test "x$HAVE_NETCDF" != x ; then
1299     echo "yes"
1300     else
1301     echo "no"
1302     fi
1303    
1304 edhill 1.8
1305 edhill 1.2 printf "\n=== Setting defaults ===\n"
1306 edhill 1.71 printf " Adding MODS directories: "
1307 edhill 1.1 for d in $MODS ; do
1308     if test ! -d $d ; then
1309 edhill 1.2 echo
1310     echo "Error: MODS directory \"$d\" not found!"
1311 edhill 1.1 exit 1
1312     else
1313 edhill 1.71 printf " $d"
1314 edhill 1.1 SOURCEDIRS="$SOURCEDIRS $d"
1315     INCLUDEDIRS="$INCLUDEDIRS $d"
1316     fi
1317     done
1318     echo
1319    
1320     if test "x$MAKEFILE" = x ; then
1321     MAKEFILE="Makefile"
1322     fi
1323     if test "x${PLATFORM}" = x ; then
1324     PLATFORM=$p_PLATFORM
1325     fi
1326    
1327     if test "x${EXEDIR}" = x ; then
1328 edhill 1.87 tmp=`echo $PWD | sed -e 's/\// /g' | awk '{print $NR}'`
1329     if test "x$tmp" = "xbin" -a -d ../exe -a $ROOTDIR = .. ; then
1330 edhill 1.1 EXEDIR=../exe
1331     else
1332     EXEDIR=.
1333     fi
1334     fi
1335     if test ! -d ${EXEDIR} ; then
1336     echo "Error: the specified EXEDIR (\"$EXEDIR\") does not exist!"
1337     exit 1
1338     fi
1339    
1340     if test "x${TOOLSDIR}" = x ; then
1341     TOOLSDIR="$ROOTDIR/tools"
1342     fi
1343     if test ! -d ${TOOLSDIR} ; then
1344 cnh 1.65 echo "Error: the specified TOOLSDIR (\"$TOOLSDIR\") does not exist!"
1345 edhill 1.1 exit 1
1346     fi
1347 edhill 1.11 if test "x$S64" = x ; then
1348 edhill 1.104 echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.sh > /dev/null 2>&1
1349     RETVAL=$?
1350     if test "x${RETVAL}" = x0 ; then
1351     S64='$(TOOLSDIR)/set64bitConst.sh'
1352     else
1353     echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.csh > /dev/null 2>&1
1354     RETVAL=$?
1355     if test "x${RETVAL}" = x0 ; then
1356     S64='$(TOOLSDIR)/set64bitConst.csh'
1357     else
1358     cat <<EOF
1359    
1360     ERROR: neither of the two default scripts:
1361    
1362     ${TOOLSDIR}/set64bitConst.sh
1363     ${TOOLSDIR}/set64bitConst.csh
1364    
1365     are working so please check paths or specify (with \$S64) a
1366     working version of this script.
1367    
1368     EOF
1369     exit 1
1370     fi
1371     fi
1372 edhill 1.11 fi
1373 adcroft 1.44 THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`
1374 edhill 1.1
1375     EXECUTABLE=${EXECUTABLE:-mitgcmuv}
1376    
1377     # We have a special set of source files in eesupp/src which are
1378     # generated from some template source files. We'll make them first so
1379     # they appear as regular source code
1380     if test -r $ROOTDIR"/eesupp/src/Makefile" ; then
1381     echo " Making source files in eesupp from templates"
1382 edhill 1.36 ( cd $ROOTDIR"/eesupp/src/" && $MAKE ) > make_eesupp.errors 2>&1
1383 edhill 1.1 RETVAL=$?
1384 edhill 1.2 if test "x${RETVAL}" = x0 ; then
1385 edhill 1.1 rm -f make_eesupp.errors
1386     else
1387     echo "Error: problem encountered while building source files in eesupp:"
1388 edhill 1.62 cat make_eesupp.errors 1>&2
1389 edhill 1.1 exit 1
1390 afe 1.58 fi
1391     fi
1392    
1393     #same for exch2
1394     if test -r $ROOTDIR"/pkg/exch2/Makefile" ; then
1395     echo " Making source files in exch2 from templates"
1396     ( cd $ROOTDIR"/pkg/exch2/" && $MAKE ) > make_exch2.errors 2>&1
1397     RETVAL=$?
1398     if test "x${RETVAL}" = x0 ; then
1399     rm -f make_exch2.errors
1400     else
1401 edhill 1.59 echo "Error: problem encountered while building source files in exch2:"
1402 edhill 1.62 cat make_exch2.errors 1>&2
1403 afe 1.58 exit 1
1404 edhill 1.1 fi
1405     fi
1406    
1407 edhill 1.2 printf "\n=== Determining package settings ===\n"
1408 edhill 1.1 if test "x${PDEPEND}" = x ; then
1409     tmp=$ROOTDIR"/pkg/pkg_depend"
1410     if test -r $tmp ; then
1411     PDEPEND=$tmp
1412     else
1413     echo "Warning: No package dependency information was specified."
1414     echo " Please check that ROOTDIR/pkg/pkg_depend exists."
1415     fi
1416     else
1417     if test ! -r ${PDEPEND} ; then
1418     echo "Error: can't read package dependency info from PDEPEND=\"$PDEPEND\""
1419     exit 1
1420     fi
1421     fi
1422     echo " getting package dependency info from $PDEPEND"
1423     # Strip the comments and then convert the dependency file into
1424     # two arrays: PNAME, DNAME
1425     cat $PDEPEND | sed -e 's/#.*$//g' \
1426 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}' \
1427 edhill 1.1 > ./.pd_tmp
1428     RETVAL=$?
1429     if test ! "x${RETVAL}" = x0 ; then
1430     echo "Error: unable to parse package dependencies -- please check PDEPEND=\"$PDEPEND\""
1431     exit 1
1432     fi
1433 edhill 1.34 . ./.pd_tmp
1434 edhill 1.1 rm -f ./.pd_tmp
1435    
1436 edhill 1.12 # Search for default packages. Note that a "$ROOTDIR/pkg/pkg_groups"
1437     # file should eventually be added so that, for convenience, one can
1438     # specify groups of packages using names like "ocean" and "atmosphere".
1439 edhill 1.41 echo " checking default package list: "
1440 edhill 1.1 if test "x${PDEFAULT}" = x ; then
1441 edhill 1.12 for i in "." $MODS ; do
1442     if test -r $i"/packages.conf" ; then
1443     PDEFAULT=$i"/packages.conf"
1444     break
1445     fi
1446     done
1447     fi
1448     if test "x${PDEFAULT}" = x ; then
1449 edhill 1.1 PDEFAULT="$ROOTDIR/pkg/pkg_default"
1450     fi
1451     if test "x${PDEFAULT}" = xNONE ; then
1452 edhill 1.41 echo " default packages file disabled"
1453 edhill 1.1 else
1454     if test ! -r $PDEFAULT ; then
1455     echo "Warning: can't read default packages from PDEFAULT=\"$PDEFAULT\""
1456     else
1457 edhill 1.41 echo " using PDEFAULT=\"$PDEFAULT\""
1458 edhill 1.1 # Strip the comments and add all the names
1459 edhill 1.15 def=`cat $PDEFAULT | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
1460 edhill 1.1 RETVAL=$?
1461     if test "x${RETVAL}" != x0 ; then
1462 edhill 1.71 printf "Error: can't parse default package list "
1463 edhill 1.1 echo "-- please check PDEFAULT=\"$PDEFAULT\""
1464     exit 1
1465     fi
1466     for i in $def ; do
1467     PACKAGES="$PACKAGES $i"
1468     done
1469 edhill 1.12 echo " before group expansion packages are: $PACKAGES"
1470 edhill 1.87 RET=1
1471     while test $RET = 1 ; do expand_pkg_groups; RET=$?; done
1472 edhill 1.12 echo " after group expansion packages are: $PACKAGES"
1473 edhill 1.1 fi
1474     fi
1475    
1476     echo " applying DISABLE settings"
1477 adcroft 1.74 for i in $PACKAGES ; do
1478     echo $i >> ./.tmp_pack
1479     done
1480     for i in `grep "-" ./.tmp_pack` ; do
1481     j=`echo $i | sed 's/[-]//'`
1482     DISABLE="$DISABLE $j"
1483     done
1484 edhill 1.1 pack=
1485     for p in $PACKAGES ; do
1486     addit="t"
1487     for d in $DISABLE ; do
1488     if test "x$p" = "x$d" ; then
1489     addit="f"
1490     fi
1491     done
1492     if test "x$addit" = xt ; then
1493     pack="$pack $p"
1494     fi
1495     done
1496     PACKAGES="$pack"
1497     echo " applying ENABLE settings"
1498 edhill 1.12 echo "" > ./.tmp_pack
1499 edhill 1.1 PACKAGES="$PACKAGES $ENABLE"
1500 adcroft 1.74 # Test if each explicitly referenced package exists
1501 edhill 1.1 for i in $PACKAGES ; do
1502 adcroft 1.74 j=`echo $i | sed 's/[-+]//'`
1503     if test ! -d "$ROOTDIR/pkg/$j" ; then
1504 edhill 1.1 echo "Error: can't find package $i at \"$ROOTDIR/pkg/$i\""
1505 adcroft 1.74 exit 1
1506 edhill 1.1 fi
1507     echo $i >> ./.tmp_pack
1508     done
1509     PACKAGES=
1510 adcroft 1.74 for i in `grep -v "-" ./.tmp_pack | sort | uniq` ; do
1511 edhill 1.1 PACKAGES="$PACKAGES $i"
1512     done
1513 adcroft 1.74 rm -f ./.tmp_pack
1514 edhill 1.1 echo " packages are: $PACKAGES"
1515    
1516 edhill 1.100 # Check availability of NetCDF and then either build the MNC template
1517     # files or delete mnc from the list of available packages.
1518     echo $PACKAGES | grep ' mnc ' > /dev/null 2>&1
1519     RETVAL=$?
1520     if test "x$RETVAL" = x0 ; then
1521     if test "x$HAVE_NETCDF" != xt ; then
1522     cat <<EOF
1523    
1524     *********************************************************************
1525     WARNING: the "mnc" package was enabled but tests failed to compile
1526     NetCDF applications. Please check that:
1527    
1528     1) NetCDF is correctly installed for this compiler and
1529     2) the LIBS variable (within the "optfile") specifies the correct
1530     NetCDF library to link against.
1531    
1532     Due to this failure, the "mnc" package is now DISABLED.
1533     *********************************************************************
1534    
1535     EOF
1536     PACKAGES=`echo $PACKAGES | sed -e 's/mnc//g'`
1537     DISABLE="$DISABLE mnc"
1538     else
1539     ( cd $ROOTDIR"/pkg/mnc" && $MAKE templates ) > make_mnc.errors 2>&1
1540     RETVAL=$?
1541     if test "x${RETVAL}" = x0 ; then
1542     rm -f make_mnc.errors
1543     else
1544     echo "Error: problem encountered while building source files in pkg/mnc:"
1545     cat make_mnc.errors 1>&2
1546     exit 1
1547     fi
1548     fi
1549     fi
1550    
1551 edhill 1.1 echo " applying package dependency rules"
1552     ck=
1553     while test "x$ck" != xtt ; do
1554     i=0
1555 edhill 1.2 # rtot=${#PNAME[@]}
1556     rtot=$nname
1557 edhill 1.1 while test $i -lt $rtot ; do
1558    
1559     # Is $pname in the current $PACKAGES list?
1560 edhill 1.2 # pname=${PNAME[$i]}
1561     tmp="pname=\"\$PNAME_$i\""
1562     eval $tmp
1563 edhill 1.1 pin="f"
1564     for p in $PACKAGES ; do
1565     if test "x$p" = "x$pname" ; then
1566     pin="t"
1567     fi
1568     done
1569    
1570     # Is the DNAME entry a (+) or (-) rule ?
1571 edhill 1.2 tmp="dname=\"\$DNAME_$i\""
1572     eval $tmp
1573 edhill 1.1 plus="-"
1574 edhill 1.2 echo $dname | grep '^+' > /dev/null 2>&1
1575 edhill 1.1 RETVAL=$?
1576     if test "x$RETVAL" = x0 ; then
1577     plus="+"
1578     fi
1579    
1580     # Is $dname in the current $PACKAGES list?
1581 edhill 1.2 dname=`echo $dname | sed -e 's/^[+-]//'`
1582 edhill 1.1 din="f"
1583     for p in $PACKAGES ; do
1584     if test "x$p" = "x$dname" ; then
1585     din="t"
1586     fi
1587     done
1588    
1589     # Do we need to add $dname according to the dependency rules?
1590     if test "x$pin" = xt -a "x$plus" = "x+" -a "x$din" = xf ; then
1591     in_dis="f"
1592     for dis in $DISABLE ; do
1593     if test "x$dis" = "x$dname" ; then
1594     in_dis="t"
1595     fi
1596     done
1597     if test "x$in_dis" = xt ; then
1598     echo "Error: can't satisfy package dependencies:"
1599     echo " \"$dname\" is required by the dependency rules"
1600     echo " but is disallowed by the DISABLE settings"
1601     exit 1
1602     else
1603     PACKAGES="$PACKAGES $dname"
1604     ck=
1605     fi
1606     fi
1607    
1608     # Do we need to get rid of $dname according to the dependency rules?
1609     if test "x$pin" = xt -a "x$plus" = "x-" -a "x$din" = xt; then
1610     echo "Error: can't satisfy package dependencies:"
1611     echo " \"$pname\" was requested but is disallowed by"
1612     echo " the dependency rules for \"$dname\""
1613     exit 1
1614     fi
1615 edhill 1.87 i=`echo "$i + 1" | bc -l`
1616     #i=$(( $i + 1 ))
1617 edhill 1.1 done
1618     ck=$ck"t"
1619     done
1620     echo " packages are: $PACKAGES"
1621     for i in $PACKAGES ; do
1622     adr="$ROOTDIR/pkg/$i"
1623     if test -d $adr ; then
1624     SOURCEDIRS="$SOURCEDIRS $adr"
1625     INCLUDEDIRS="$INCLUDEDIRS $adr"
1626 edhill 1.14 if test "x$i" = xautodiff ; then
1627     AUTODIFF_PKG_USED=t
1628     fi
1629 edhill 1.1 else
1630     echo "Error: the directory \"$adr\" for package $i doesn't exist"
1631     exit 1
1632     fi
1633     done
1634    
1635 edhill 1.12 # Create a list of #define and #undef to enable/disable packages
1636     PACKAGES_DOT_H=PACKAGES_CONFIG.h
1637 edhill 1.1 # The following UGLY HACK sets multiple "#undef"s and it needs to go
1638     # away. On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h
1639     # file would eventually be split up so that all package-related #define
1640     # statements could be separated and handled only by genmake.
1641     names=`ls -1 "$ROOTDIR/pkg"`
1642     all_pack=
1643 adcroft 1.44 DISABLED_PACKAGES=
1644 edhill 1.1 for n in $names ; do
1645     if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
1646     has_pack="f"
1647     for pack in $PACKAGES ; do
1648     if test "x$pack" = "x$n" ; then
1649     has_pack="t"
1650     break
1651     fi
1652     done
1653     if test "x$has_pack" = xf ; then
1654 edhill 1.15 undef=`echo "ALLOW_$n" | $AWK '{print toupper($0)}'`
1655 adcroft 1.44 DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
1656 edhill 1.1 fi
1657     fi
1658     done
1659 adcroft 1.44 ENABLED_PACKAGES=
1660 edhill 1.1 for i in $PACKAGES ; do
1661 edhill 1.15 def=`echo "ALLOW_$i" | $AWK '{print toupper($0)}'`
1662 adcroft 1.44 ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
1663 edhill 1.12 #eh3 DEFINES="$DEFINES -D$def"
1664 edhill 1.1
1665     #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
1666     case $i in
1667     aim_v23)
1668 adcroft 1.46 ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
1669 jmc 1.55 echo "Warning: ALLOW_AIM is set to enable aim_v23."
1670 edhill 1.1 ;;
1671     esac
1672     #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
1673    
1674     done
1675    
1676     echo " Adding STANDARDDIRS"
1677     BUILDDIR=${BUILDDIR:-.}
1678 edhill 1.57 if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
1679 edhill 1.12 STANDARDDIRS="eesupp model"
1680     fi
1681 edhill 1.57 if test "x$STANDARDDIRS" != x ; then
1682     for d in $STANDARDDIRS ; do
1683     adr="$ROOTDIR/$d/src"
1684     if test ! -d $adr ; then
1685     echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1686     echo " is correct and that you correctly specified the STANDARDDIRS option"
1687     exit 1
1688     else
1689     SOURCEDIRS="$SOURCEDIRS $adr"
1690     fi
1691     adr="$ROOTDIR/$d/inc"
1692     if test ! -d $adr ; then
1693     echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1694     echo " is correct and that you correctly specified the STANDARDDIRS option"
1695     exit 1
1696     else
1697     INCLUDEDIRS="$INCLUDEDIRS $adr"
1698     fi
1699     done
1700     fi
1701 edhill 1.1
1702 adcroft 1.52 echo " Searching for *OPTIONS.h files in order to warn about the presence"
1703     echo " of \"#define \"-type statements that are no longer allowed:"
1704 edhill 1.12 CPP_OPTIONS=
1705 adcroft 1.52 CPP_EEOPTIONS=
1706 edhill 1.12 spaths=". $INCLUDEDIRS"
1707 adcroft 1.52 names=`ls -1 "$ROOTDIR/pkg"`
1708 edhill 1.12 for i in $spaths ; do
1709     try="$i/CPP_OPTIONS.h"
1710 edhill 1.54 if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
1711 edhill 1.12 echo " found CPP_OPTIONS=\"$try\""
1712     CPP_OPTIONS="$try"
1713 adcroft 1.52 # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
1714     for n in $names ; do
1715     test_for_package_in_cpp_options $CPP_OPTIONS $n
1716     done
1717     fi
1718     try="$i/CPP_EEOPTIONS.h"
1719 edhill 1.54 if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
1720 adcroft 1.52 echo " found CPP_EEOPTIONS=\"$try\""
1721     # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
1722     #**** not yet enabled ****
1723     # test_for_mpi_in_cpp_eeoptions $try
1724     #**** not yet enabled ****
1725     CPP_EEOPTIONS="$try"
1726 edhill 1.12 fi
1727     done
1728     if test "x$CPP_OPTIONS" = x ; then
1729     echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
1730     exit 1
1731     fi
1732 edhill 1.1
1733 edhill 1.14 # Here, we build the list of files to be "run through" the adjoint
1734     # compiler.
1735     if test -f ./ad_files ; then
1736     rm -f ./ad_files
1737     fi
1738     echo " Creating the list of files for the adjoint compiler."
1739     for i in $SOURCEDIRS ; do
1740     list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
1741     for j in $list_files ; do
1742     cat $i/$j >> ad_files
1743     done
1744     done
1745 edhill 1.60
1746 edhill 1.14
1747 edhill 1.2 echo
1748     echo "=== Creating the Makefile ==="
1749 edhill 1.1 echo " setting INCLUDES"
1750     for i in $INCLUDEDIRS ; do
1751 edhill 1.87 if test ! -d $i ; then
1752 edhill 1.1 echo "Warning: can't find INCLUDEDIRS=\"$i\""
1753     fi
1754     done
1755    
1756     echo " Determining the list of source and include files"
1757     rm -rf .links.tmp
1758     mkdir .links.tmp
1759     echo "# This section creates symbolic links" > srclinks.tmp
1760     echo "" >> srclinks.tmp
1761 edhill 1.71 printf 'SRCFILES = ' > srclist.inc
1762     printf 'CSRCFILES = ' > csrclist.inc
1763     printf 'F90SRCFILES = ' > f90srclist.inc
1764     printf 'HEADERFILES = ' > hlist.inc
1765     printf 'AD_FLOW_FILES = ' > ad_flow_files.inc
1766 adcroft 1.9 alldirs="$SOURCEDIRS $INCLUDEDIRS ."
1767 edhill 1.1 for d in $alldirs ; do
1768     deplist=
1769 edhill 1.14 sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
1770 cnh 1.3 sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
1771 edhill 1.1 for sf in $sfiles ; do
1772     if test ! -r ".links.tmp/$sf" ; then
1773     if test -f "$d/$sf" ; then
1774 adcroft 1.44 case $d/$sf in
1775     ./$PACKAGES_DOT_H)
1776     ;;
1777     ./AD_CONFIG.h)
1778     ;;
1779     ./FC_NAMEMANGLE.h)
1780     ;;
1781 edhill 1.98 ./BUILD_INFO.h)
1782     ;;
1783 adcroft 1.44 *)
1784     touch .links.tmp/$sf
1785     deplist="$deplist $sf"
1786     ;;
1787     esac
1788 edhill 1.15 extn=`echo $sf | $AWK -F '.' '{print $NF}'`
1789 edhill 1.1 case $extn in
1790     F)
1791     echo " \\" >> srclist.inc
1792 edhill 1.71 printf " $sf" >> srclist.inc
1793 edhill 1.1 ;;
1794 cnh 1.3 F90)
1795     echo " \\" >> f90srclist.inc
1796 edhill 1.71 printf " $sf" >> f90srclist.inc
1797 cnh 1.3 ;;
1798 edhill 1.1 c)
1799     echo " \\" >> csrclist.inc
1800 edhill 1.71 printf " $sf" >> csrclist.inc
1801 edhill 1.1 ;;
1802     h)
1803     echo " \\" >> hlist.inc
1804 edhill 1.71 printf " $sf" >> hlist.inc
1805 edhill 1.1 ;;
1806 edhill 1.14 flow)
1807     echo " \\" >> ad_flow_files.inc
1808 edhill 1.71 printf " $sf" >> ad_flow_files.inc
1809 edhill 1.14 ;;
1810 edhill 1.1 esac
1811     fi
1812     fi
1813     done
1814     if test "x$deplist" != x ; then
1815 edhill 1.2 echo "" >> srclinks.tmp
1816     echo "# These files are linked from $d" >> srclinks.tmp
1817 edhill 1.1 echo "$deplist :" >> srclinks.tmp
1818 edhill 1.2 printf "\t\$(LN) %s/\$@ \$@\n" $d >> srclinks.tmp
1819 edhill 1.1 fi
1820     done
1821     rm -rf .links.tmp
1822     echo "" >> srclist.inc
1823     echo "" >> csrclist.inc
1824 cnh 1.3 echo "" >> f90srclist.inc
1825 edhill 1.1 echo "" >> hlist.inc
1826 edhill 1.14 echo "" >> ad_flow_files.inc
1827 edhill 1.1
1828 edhill 1.88 if test -f $MAKEFILE ; then
1829 edhill 1.1 mv -f $MAKEFILE "$MAKEFILE.bak"
1830     fi
1831     echo " Writing makefile: $MAKEFILE"
1832     echo "# Multithreaded + multi-processing makefile for:" > $MAKEFILE
1833     echo "# $MACHINE" >> $MAKEFILE
1834     echo "# This makefile was generated automatically on" >> $MAKEFILE
1835     echo "# $THISDATE" >> $MAKEFILE
1836     echo "# by the command:" >> $MAKEFILE
1837 edhill 1.73 echo "# $0 $G2ARGS" >> $MAKEFILE
1838 edhill 1.1 echo "# executed by:" >> $MAKEFILE
1839 edhill 1.97 echo "# ${THISUSER}@${THISHOST}:${THISCWD}" >> $MAKEFILE
1840 edhill 1.21
1841     EXE_AD=$EXECUTABLE"_ad"
1842     EXE_FTL=$EXECUTABLE"_ftl"
1843     EXE_SVD=$EXECUTABLE"_svd"
1844    
1845 edhill 1.1 cat >>$MAKEFILE <<EOF
1846 edhill 1.53 #
1847     # OPTFILE="$OPTFILE"
1848 edhill 1.1 #
1849     # BUILDDIR : Directory where object files are written
1850     # SOURCEDIRS : Directories containing the source (.F) files
1851     # INCLUDEDIRS : Directories containing the header-source (.h) files
1852     # EXEDIR : Directory where executable that is generated is written
1853     # EXECUTABLE : Full path of executable binary
1854     #
1855     # CPP : C-preprocessor command
1856     # INCLUDES : Directories searched for header files
1857     # DEFINES : Macro definitions for CPP
1858     # MAKEDEPEND : Dependency generator
1859     # KPP : Special preprocessor command (specific to platform)
1860     # KFLAGS : Flags for KPP
1861     # FC : Fortran compiler command
1862     # FFLAGS : Configuration/debugging options for FC
1863     # FOPTIM : Optimization options for FC
1864     # LINK : Command for link editor program
1865     # LIBS : Library flags /or/ additional optimization/debugging flags
1866    
1867     ROOTDIR = ${ROOTDIR}
1868     BUILDDIR = ${BUILDDIR}
1869     SOURCEDIRS = ${SOURCEDIRS}
1870     INCLUDEDIRS = ${INCLUDEDIRS}
1871     EXEDIR = ${EXEDIR}
1872     EXECUTABLE = \$(EXEDIR)/${EXECUTABLE}
1873     TOOLSDIR = ${TOOLSDIR}
1874    
1875 edhill 1.14 #eh3 new defines for the adjoint work
1876     AUTODIFF = ${ROOTDIR}/pkg/autodiff
1877 edhill 1.21 EXE_AD = ${EXE_AD}
1878     EXE_FTL = ${EXE_FTL}
1879     EXE_SVD = ${EXE_SVD}
1880 edhill 1.14
1881 adcroft 1.44 ENABLED_PACKAGES = ${ENABLED_PACKAGES}
1882     DISABLED_PACKAGES = ${DISABLED_PACKAGES}
1883    
1884 adcroft 1.52 # These files are created by Makefile
1885 edhill 1.97 SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h BUILD_INFO.h
1886 adcroft 1.52
1887 edhill 1.1 EOF
1888    
1889     # Note: figure out some way to add Hyades JAM libraries here
1890    
1891     cat >>$MAKEFILE <<EOF
1892     # Unix ln (link)
1893     LN = ${LN}
1894     # C preprocessor
1895     CPP = cat \$< | ${S64} | ${CPP}
1896     # Dependency generator
1897     MAKEDEPEND = ${MAKEDEPEND}
1898     # Special preprocessor (KAP on DECs, FPP on Crays)
1899     KPP = ${KPP}
1900     # Fortran compiler
1901 edhill 1.94 FC = ${FC}
1902 cnh 1.3 # Fortran compiler
1903     F90C = ${F90C}
1904 edhill 1.92 # C compiler
1905     CC = ${CC}
1906 edhill 1.1 # Link editor
1907 edhill 1.70 LINK = ${LINK} ${LDADD}
1908 edhill 1.1
1909     # Defines for CPP
1910     DEFINES = ${DEFINES}
1911     # Includes for CPP
1912     INCLUDES = ${INCLUDES}
1913     # Flags for KPP
1914     KFLAGS1 = ${KFLAGS1}
1915     KFLAGS2 = ${KFLAGS2}
1916     # Optim./debug for FC
1917     FFLAGS = ${FFLAGS}
1918     FOPTIM = ${FOPTIM}
1919 cnh 1.3 # Optim./debug for FC
1920     F90FLAGS = ${F90FLAGS}
1921     F90OPTIM = ${F90OPTIM}
1922 edhill 1.1 # Flags for CC
1923     CFLAGS = ${CFLAGS}
1924     # Files that should not be optimized
1925     NOOPTFILES = ${NOOPTFILES}
1926     NOOPTFLAGS = ${NOOPTFLAGS}
1927     # Flags and libraries needed for linking
1928     LIBS = ${LIBS} \$(XLIBS)
1929 cnh 1.3 # Name of the Mekfile
1930     MAKEFILE=${MAKEFILE}
1931 edhill 1.1
1932     EOF
1933    
1934 edhill 1.14 cat srclist.inc >> $MAKEFILE
1935     cat csrclist.inc >> $MAKEFILE
1936     cat f90srclist.inc >> $MAKEFILE
1937     cat hlist.inc >> $MAKEFILE
1938     cat ad_flow_files.inc >> $MAKEFILE
1939 edhill 1.75 echo >> $MAKEFILE
1940 edhill 1.76 echo 'F77FILES = $(SRCFILES:.F=.'$FS')' >> $MAKEFILE
1941     echo 'F90FILES = $(F90SRCFILES:.F=.'$FS90')' >> $MAKEFILE
1942     echo 'OBJFILES = $(SRCFILES:.F=.o) $(CSRCFILES:.c=.o) $(F90SRCFILES:.F90=.o)' >> $MAKEFILE
1943 edhill 1.75 echo >> $MAKEFILE
1944     echo '.SUFFIXES:' >> $MAKEFILE
1945 adcroft 1.83 echo '.SUFFIXES: .o .'$FS' .p .F .c .'$FS90' .F90' >> $MAKEFILE
1946 cnh 1.3 rm -f srclist.inc csrclist.inc hlist.inc flist.tmp clist.tmp f90srclist.inc
1947 edhill 1.14 rm -f ad_flow_files.inc
1948 edhill 1.1
1949     cat >>$MAKEFILE <<EOF
1950    
1951     all: \$(EXECUTABLE)
1952 adcroft 1.52 \$(EXECUTABLE): \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(OBJFILES)
1953 adcroft 1.44 @echo Creating \$@ ...
1954 edhill 1.1 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
1955     depend:
1956     @make links
1957 edhill 1.76 \$(MAKEDEPEND) -o .$FS \$(DEFINES) \$(INCLUDES) \$(SRCFILES)
1958 adcroft 1.44 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
1959 edhill 1.72 -rm -f makedepend.out
1960 edhill 1.1
1961 adcroft 1.52 links: \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(SPECIAL_FILES)
1962 edhill 1.1
1963 cnh 1.3 small_f: \$(F77FILES) \$(F90FILES)
1964 edhill 1.1
1965     output.txt: \$(EXECUTABLE)
1966     @printf 'running ... '
1967     @\$(EXECUTABLE) > \$@
1968    
1969     clean:
1970 edhill 1.76 -rm -rf *.o *.$FS *.p *.$FS90 *.mod ${RMFILES} work.{pc,pcl} *.template
1971 edhill 1.1 Clean:
1972     @make clean
1973     @make cleanlinks
1974 adcroft 1.52 -rm -f \$(SPECIAL_FILES)
1975 adcroft 1.51 -rm -f genmake_state genmake_*optfile genmake_warnings make.log run.log *.bak
1976 edhill 1.1 CLEAN:
1977     @make Clean
1978     -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
1979     -find \$(EXEDIR) -name "*.data" -exec rm {} \;
1980     -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
1981 adcroft 1.78 -rm -f \$(EXECUTABLE) output.txt STD*
1982 edhill 1.1
1983 edhill 1.18 #eh3 Makefile: makefile
1984 edhill 1.1 makefile:
1985 edhill 1.73 $THIS_SCRIPT $G2ARGS
1986 edhill 1.1 cleanlinks:
1987     -find . -type l -exec rm {} \;
1988    
1989 edhill 1.97 # Special targets (SPECIAL_FILES) which are create by make
1990 adcroft 1.44 ${PACKAGES_DOT_H}:
1991     @echo Creating \$@ ...
1992 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) > \$@
1993 adcroft 1.44 AD_CONFIG.h:
1994     @echo Creating \$@ ...
1995 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 > \$@
1996 adcroft 1.52 FC_NAMEMANGLE.h:
1997     @echo Creating \$@ ...
1998     echo "$FC_NAMEMANGLE" > \$@
1999 adcroft 1.44
2000 edhill 1.97 BUILD_INFO.h:
2001     @echo Creating \$@ ...
2002     EOF
2003    
2004     test ! "x$THISVER" = x && echo " -echo \"#define THISVER '$THISVER'\" > \$@" >> $MAKEFILE
2005     test ! "x$THISUSER" = x && echo " -echo \"#define THISUSER '$THISUSER'\" >> \$@" >> $MAKEFILE
2006     test ! "x$THISDATE" = x && echo " -echo \"#define THISDATE '$THISDATE'\" >> \$@" >> $MAKEFILE
2007     test ! "x$THISHOST" = x && echo " -echo \"#define THISHOST '$THISHOST'\" >> \$@" >> $MAKEFILE
2008    
2009     cat >>$MAKEFILE <<EOF
2010    
2011 edhill 1.76 # The normal chain of rules is ( .F - .$FS - .o )
2012    
2013 edhill 1.101 ## This nullifies any default implicit rules concerning these two file types:
2014     ## %.o : %.F
2015 edhill 1.76
2016     .F.$FS:
2017 edhill 1.1 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2018 edhill 1.76 .$FS.o:
2019 edhill 1.1 \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
2020 edhill 1.76 .F90.$FS90:
2021 cnh 1.3 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2022 edhill 1.76 .$FS90.o:
2023 cnh 1.3 \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
2024 edhill 1.1 .c.o:
2025     \$(CC) \$(CFLAGS) -c \$<
2026    
2027 edhill 1.76 # Special exceptions that use the ( .F - .p - .$FS - .o ) rule-chain
2028     .F.p:
2029 edhill 1.1 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2030 edhill 1.76 .p.$FS:
2031 edhill 1.1 \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
2032 edhill 1.14
2033     #=========================================
2034     #=== Automatic Differentiation Rules ===
2035    
2036     TAMC = ${TAMC}
2037     TAF = ${TAF}
2038    
2039 edhill 1.17 TAF_EXTRA = ${TAF_EXTRA}
2040     TAMC_EXTRA = ${TAMC_EXTRA}
2041    
2042 edhill 1.14 EOF
2043    
2044     ad_vars="AD_TAMC_FLAGS AD_TAF_FLAGS"
2045     ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF_FLAGS"
2046     ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
2047     for i in $ad_vars ; do
2048     name=$i
2049     t1="t2=\$"`echo $i`
2050     eval $t1
2051     printf "%-20s = " $name >> $MAKEFILE
2052     echo $t2 >> $MAKEFILE
2053     done
2054    
2055     echo " Add the source list for AD code generation"
2056     echo >> $MAKEFILE
2057 edhill 1.71 printf "AD_FILES = " >> $MAKEFILE
2058 edhill 1.14 AD_FILES=`cat ad_files`
2059     for i in $AD_FILES ; do
2060     echo " \\" >> $MAKEFILE
2061 edhill 1.71 printf " $i" >> $MAKEFILE
2062 edhill 1.14 done
2063     echo >> $MAKEFILE
2064 edhill 1.21 rm -f ad_files
2065 edhill 1.14
2066     cat >>$MAKEFILE <<EOF
2067    
2068 edhill 1.16 # ... AD ...
2069 edhill 1.23 adall: ad_taf
2070     adtaf: ad_taf_output.f
2071     adtamc: ad_tamc_output.f
2072 edhill 1.21
2073 heimbach 1.48 ad_input_code.f: \$(AD_FILES) \$(HEADERFILES)
2074 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
2075 edhill 1.23 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
2076 adcroft 1.44 -rm -f ad_config.template
2077 edhill 1.22 @make \$(F77FILES)
2078     @make \$(AD_FLOW_FILES)
2079     cat \$(AD_FLOW_FILES) \$(AD_FILES) > ad_input_code.f
2080    
2081 edhill 1.14 ad_taf_output.f: ad_input_code.f
2082 heimbach 1.37 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f
2083 adcroft 1.44 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f
2084 heimbach 1.37
2085     adtafonly:
2086 edhill 1.17 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f
2087 adcroft 1.44 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f
2088 edhill 1.14
2089     ad_taf: ad_taf_output.o \$(OBJFILES)
2090 edhill 1.21 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
2091 edhill 1.14
2092     ad_tamc_output.f: ad_input_code.f
2093 edhill 1.17 \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.f
2094 adcroft 1.44 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.f
2095 edhill 1.14
2096     ad_tamc: ad_tamc_output.o \$(OBJFILES)
2097 edhill 1.21 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
2098 edhill 1.14
2099    
2100 edhill 1.19 # ... FTL ...
2101 edhill 1.23 ftlall: ftl_taf
2102     ftltaf: ftl_taf_output.f
2103     ftltamc: ftl_tamc_output.f
2104 edhill 1.21
2105 heimbach 1.48 ftl_input_code.f: \$(AD_FILES) \$(HEADERFILES)
2106 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
2107 edhill 1.23 cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
2108 adcroft 1.44 -rm -f ftl_config.template
2109 edhill 1.23 @make \$(F77FILES)
2110 edhill 1.22 @make \$(AD_FLOW_FILES)
2111     cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.f
2112    
2113     ftl_taf_output.f: ftl_input_code.f
2114     \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f
2115 adcroft 1.44 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f
2116 edhill 1.14
2117 heimbach 1.40 ftltafonly:
2118     \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f
2119 adcroft 1.44 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f
2120 heimbach 1.40
2121 edhill 1.19 ftl_taf: ftl_taf_output.o \$(OBJFILES)
2122 edhill 1.21 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
2123 edhill 1.14
2124 edhill 1.22 ftl_tamc_output.f: ftl_input_code.f
2125     \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.f
2126 adcroft 1.44 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.f
2127 edhill 1.16
2128 edhill 1.19 ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
2129 edhill 1.21 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
2130 edhill 1.16
2131    
2132     # ... SVD ...
2133 heimbach 1.40 svdtaf: ad_taf_output.f ftl_taf_output.f
2134     svdall: svd_taf
2135 edhill 1.16
2136 heimbach 1.40 svd_taf: ad_taf_output.o ftl_taf_output.o \$(OBJFILES)
2137     \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
2138 edhill 1.14
2139    
2140     #=========================================
2141 edhill 1.1
2142     EOF
2143 edhill 1.7
2144     if test "x$EXEHOOK" != x ; then
2145     printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE
2146     fi
2147 edhill 1.1
2148     echo " Making list of \"exceptions\" that need \".p\" files"
2149     for i in $KPPFILES ; do
2150     base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
2151     RETVAL=$?
2152     if test "x$RETVAL" != x0 ; then
2153     echo "Error: unable to add file \"$i\" to the exceptions list"
2154     fi
2155 edhill 1.76 echo "$base.$FS: $base.p" >> $MAKEFILE
2156 edhill 1.1 done
2157    
2158     echo " Making list of NOOPTFILES"
2159     for i in $NOOPTFILES ; do
2160     base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
2161     RETVAL=$?
2162     if test "x$RETVAL" != x0 ; then
2163     echo "Error: unable to add file \"$i\" to the exceptions list"
2164     fi
2165 edhill 1.76 echo "$base.o: $base.$FS" >> $MAKEFILE
2166 edhill 1.2 printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE
2167 edhill 1.1 done
2168    
2169     echo " Add rules for links"
2170     cat srclinks.tmp >> $MAKEFILE
2171     rm -f srclinks.tmp
2172    
2173     echo " Adding makedepend marker"
2174 edhill 1.2 printf "\n\n# DO NOT DELETE\n" >> $MAKEFILE
2175 edhill 1.1
2176 edhill 1.2 printf "\n=== Done ===\n"
2177 adcroft 1.47
2178     # Create special header files
2179 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"
2180 adcroft 1.47 if test ! -f $PACKAGES_DOT_H ; then
2181     mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
2182     else
2183 edhill 1.61 cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H > /dev/null 2>&1
2184 adcroft 1.47 RETVAL=$?
2185     if test "x$RETVAL" = x0 ; then
2186     rm -f $PACKAGES_DOT_H".tmp"
2187     else
2188     mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"
2189     mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
2190     fi
2191     fi
2192     if test ! -f AD_CONFIG.h ; then
2193 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
2194 adcroft 1.47 fi
2195 edhill 1.5
2196    
2197     # Write the "state" for future records
2198     if test "x$DUMPSTATE" != xf ; then
2199 edhill 1.71 printf "" > genmake_state
2200 edhill 1.5 for i in $gm_state ; do
2201     t1="t2=\$$i"
2202     eval $t1
2203 edhill 1.12 echo "$i='$t2'" >> genmake_state
2204 edhill 1.5 done
2205     fi

  ViewVC Help
Powered by ViewVC 1.1.22