/[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.103 - (hide annotations) (download)
Mon Oct 4 19:00:42 2004 UTC (14 years, 9 months ago) by edhill
Branch: MAIN
Changes since 1.102: +2 -2 lines
 o remove debugging output

1 edhill 1.86 #! /usr/bin/env bash
2 edhill 1.1 #
3 edhill 1.103 # $Header: /u/gcmpack/MITgcm/tools/genmake2,v 1.102 2004/10/04 18:59:36 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     S64='$(TOOLSDIR)/set64bitConst.sh'
1349     fi
1350 adcroft 1.44 THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`
1351 edhill 1.1
1352     EXECUTABLE=${EXECUTABLE:-mitgcmuv}
1353    
1354     # We have a special set of source files in eesupp/src which are
1355     # generated from some template source files. We'll make them first so
1356     # they appear as regular source code
1357     if test -r $ROOTDIR"/eesupp/src/Makefile" ; then
1358     echo " Making source files in eesupp from templates"
1359 edhill 1.36 ( cd $ROOTDIR"/eesupp/src/" && $MAKE ) > make_eesupp.errors 2>&1
1360 edhill 1.1 RETVAL=$?
1361 edhill 1.2 if test "x${RETVAL}" = x0 ; then
1362 edhill 1.1 rm -f make_eesupp.errors
1363     else
1364     echo "Error: problem encountered while building source files in eesupp:"
1365 edhill 1.62 cat make_eesupp.errors 1>&2
1366 edhill 1.1 exit 1
1367 afe 1.58 fi
1368     fi
1369    
1370     #same for exch2
1371     if test -r $ROOTDIR"/pkg/exch2/Makefile" ; then
1372     echo " Making source files in exch2 from templates"
1373     ( cd $ROOTDIR"/pkg/exch2/" && $MAKE ) > make_exch2.errors 2>&1
1374     RETVAL=$?
1375     if test "x${RETVAL}" = x0 ; then
1376     rm -f make_exch2.errors
1377     else
1378 edhill 1.59 echo "Error: problem encountered while building source files in exch2:"
1379 edhill 1.62 cat make_exch2.errors 1>&2
1380 afe 1.58 exit 1
1381 edhill 1.1 fi
1382     fi
1383    
1384 edhill 1.2 printf "\n=== Determining package settings ===\n"
1385 edhill 1.1 if test "x${PDEPEND}" = x ; then
1386     tmp=$ROOTDIR"/pkg/pkg_depend"
1387     if test -r $tmp ; then
1388     PDEPEND=$tmp
1389     else
1390     echo "Warning: No package dependency information was specified."
1391     echo " Please check that ROOTDIR/pkg/pkg_depend exists."
1392     fi
1393     else
1394     if test ! -r ${PDEPEND} ; then
1395     echo "Error: can't read package dependency info from PDEPEND=\"$PDEPEND\""
1396     exit 1
1397     fi
1398     fi
1399     echo " getting package dependency info from $PDEPEND"
1400     # Strip the comments and then convert the dependency file into
1401     # two arrays: PNAME, DNAME
1402     cat $PDEPEND | sed -e 's/#.*$//g' \
1403 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}' \
1404 edhill 1.1 > ./.pd_tmp
1405     RETVAL=$?
1406     if test ! "x${RETVAL}" = x0 ; then
1407     echo "Error: unable to parse package dependencies -- please check PDEPEND=\"$PDEPEND\""
1408     exit 1
1409     fi
1410 edhill 1.34 . ./.pd_tmp
1411 edhill 1.1 rm -f ./.pd_tmp
1412    
1413 edhill 1.12 # Search for default packages. Note that a "$ROOTDIR/pkg/pkg_groups"
1414     # file should eventually be added so that, for convenience, one can
1415     # specify groups of packages using names like "ocean" and "atmosphere".
1416 edhill 1.41 echo " checking default package list: "
1417 edhill 1.1 if test "x${PDEFAULT}" = x ; then
1418 edhill 1.12 for i in "." $MODS ; do
1419     if test -r $i"/packages.conf" ; then
1420     PDEFAULT=$i"/packages.conf"
1421     break
1422     fi
1423     done
1424     fi
1425     if test "x${PDEFAULT}" = x ; then
1426 edhill 1.1 PDEFAULT="$ROOTDIR/pkg/pkg_default"
1427     fi
1428     if test "x${PDEFAULT}" = xNONE ; then
1429 edhill 1.41 echo " default packages file disabled"
1430 edhill 1.1 else
1431     if test ! -r $PDEFAULT ; then
1432     echo "Warning: can't read default packages from PDEFAULT=\"$PDEFAULT\""
1433     else
1434 edhill 1.41 echo " using PDEFAULT=\"$PDEFAULT\""
1435 edhill 1.1 # Strip the comments and add all the names
1436 edhill 1.15 def=`cat $PDEFAULT | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
1437 edhill 1.1 RETVAL=$?
1438     if test "x${RETVAL}" != x0 ; then
1439 edhill 1.71 printf "Error: can't parse default package list "
1440 edhill 1.1 echo "-- please check PDEFAULT=\"$PDEFAULT\""
1441     exit 1
1442     fi
1443     for i in $def ; do
1444     PACKAGES="$PACKAGES $i"
1445     done
1446 edhill 1.12 echo " before group expansion packages are: $PACKAGES"
1447 edhill 1.87 RET=1
1448     while test $RET = 1 ; do expand_pkg_groups; RET=$?; done
1449 edhill 1.12 echo " after group expansion packages are: $PACKAGES"
1450 edhill 1.1 fi
1451     fi
1452    
1453     echo " applying DISABLE settings"
1454 adcroft 1.74 for i in $PACKAGES ; do
1455     echo $i >> ./.tmp_pack
1456     done
1457     for i in `grep "-" ./.tmp_pack` ; do
1458     j=`echo $i | sed 's/[-]//'`
1459     DISABLE="$DISABLE $j"
1460     done
1461 edhill 1.1 pack=
1462     for p in $PACKAGES ; do
1463     addit="t"
1464     for d in $DISABLE ; do
1465     if test "x$p" = "x$d" ; then
1466     addit="f"
1467     fi
1468     done
1469     if test "x$addit" = xt ; then
1470     pack="$pack $p"
1471     fi
1472     done
1473     PACKAGES="$pack"
1474     echo " applying ENABLE settings"
1475 edhill 1.12 echo "" > ./.tmp_pack
1476 edhill 1.1 PACKAGES="$PACKAGES $ENABLE"
1477 adcroft 1.74 # Test if each explicitly referenced package exists
1478 edhill 1.1 for i in $PACKAGES ; do
1479 adcroft 1.74 j=`echo $i | sed 's/[-+]//'`
1480     if test ! -d "$ROOTDIR/pkg/$j" ; then
1481 edhill 1.1 echo "Error: can't find package $i at \"$ROOTDIR/pkg/$i\""
1482 adcroft 1.74 exit 1
1483 edhill 1.1 fi
1484     echo $i >> ./.tmp_pack
1485     done
1486     PACKAGES=
1487 adcroft 1.74 for i in `grep -v "-" ./.tmp_pack | sort | uniq` ; do
1488 edhill 1.1 PACKAGES="$PACKAGES $i"
1489     done
1490 adcroft 1.74 rm -f ./.tmp_pack
1491 edhill 1.1 echo " packages are: $PACKAGES"
1492    
1493 edhill 1.100 # Check availability of NetCDF and then either build the MNC template
1494     # files or delete mnc from the list of available packages.
1495     echo $PACKAGES | grep ' mnc ' > /dev/null 2>&1
1496     RETVAL=$?
1497     if test "x$RETVAL" = x0 ; then
1498     if test "x$HAVE_NETCDF" != xt ; then
1499     cat <<EOF
1500    
1501     *********************************************************************
1502     WARNING: the "mnc" package was enabled but tests failed to compile
1503     NetCDF applications. Please check that:
1504    
1505     1) NetCDF is correctly installed for this compiler and
1506     2) the LIBS variable (within the "optfile") specifies the correct
1507     NetCDF library to link against.
1508    
1509     Due to this failure, the "mnc" package is now DISABLED.
1510     *********************************************************************
1511    
1512     EOF
1513     PACKAGES=`echo $PACKAGES | sed -e 's/mnc//g'`
1514     DISABLE="$DISABLE mnc"
1515     else
1516     ( cd $ROOTDIR"/pkg/mnc" && $MAKE templates ) > make_mnc.errors 2>&1
1517     RETVAL=$?
1518     if test "x${RETVAL}" = x0 ; then
1519     rm -f make_mnc.errors
1520     else
1521     echo "Error: problem encountered while building source files in pkg/mnc:"
1522     cat make_mnc.errors 1>&2
1523     exit 1
1524     fi
1525     fi
1526     fi
1527    
1528 edhill 1.1 echo " applying package dependency rules"
1529     ck=
1530     while test "x$ck" != xtt ; do
1531     i=0
1532 edhill 1.2 # rtot=${#PNAME[@]}
1533     rtot=$nname
1534 edhill 1.1 while test $i -lt $rtot ; do
1535    
1536     # Is $pname in the current $PACKAGES list?
1537 edhill 1.2 # pname=${PNAME[$i]}
1538     tmp="pname=\"\$PNAME_$i\""
1539     eval $tmp
1540 edhill 1.1 pin="f"
1541     for p in $PACKAGES ; do
1542     if test "x$p" = "x$pname" ; then
1543     pin="t"
1544     fi
1545     done
1546    
1547     # Is the DNAME entry a (+) or (-) rule ?
1548 edhill 1.2 tmp="dname=\"\$DNAME_$i\""
1549     eval $tmp
1550 edhill 1.1 plus="-"
1551 edhill 1.2 echo $dname | grep '^+' > /dev/null 2>&1
1552 edhill 1.1 RETVAL=$?
1553     if test "x$RETVAL" = x0 ; then
1554     plus="+"
1555     fi
1556    
1557     # Is $dname in the current $PACKAGES list?
1558 edhill 1.2 dname=`echo $dname | sed -e 's/^[+-]//'`
1559 edhill 1.1 din="f"
1560     for p in $PACKAGES ; do
1561     if test "x$p" = "x$dname" ; then
1562     din="t"
1563     fi
1564     done
1565    
1566     # Do we need to add $dname according to the dependency rules?
1567     if test "x$pin" = xt -a "x$plus" = "x+" -a "x$din" = xf ; then
1568     in_dis="f"
1569     for dis in $DISABLE ; do
1570     if test "x$dis" = "x$dname" ; then
1571     in_dis="t"
1572     fi
1573     done
1574     if test "x$in_dis" = xt ; then
1575     echo "Error: can't satisfy package dependencies:"
1576     echo " \"$dname\" is required by the dependency rules"
1577     echo " but is disallowed by the DISABLE settings"
1578     exit 1
1579     else
1580     PACKAGES="$PACKAGES $dname"
1581     ck=
1582     fi
1583     fi
1584    
1585     # Do we need to get rid of $dname according to the dependency rules?
1586     if test "x$pin" = xt -a "x$plus" = "x-" -a "x$din" = xt; then
1587     echo "Error: can't satisfy package dependencies:"
1588     echo " \"$pname\" was requested but is disallowed by"
1589     echo " the dependency rules for \"$dname\""
1590     exit 1
1591     fi
1592 edhill 1.87 i=`echo "$i + 1" | bc -l`
1593     #i=$(( $i + 1 ))
1594 edhill 1.1 done
1595     ck=$ck"t"
1596     done
1597     echo " packages are: $PACKAGES"
1598     for i in $PACKAGES ; do
1599     adr="$ROOTDIR/pkg/$i"
1600     if test -d $adr ; then
1601     SOURCEDIRS="$SOURCEDIRS $adr"
1602     INCLUDEDIRS="$INCLUDEDIRS $adr"
1603 edhill 1.14 if test "x$i" = xautodiff ; then
1604     AUTODIFF_PKG_USED=t
1605     fi
1606 edhill 1.1 else
1607     echo "Error: the directory \"$adr\" for package $i doesn't exist"
1608     exit 1
1609     fi
1610     done
1611    
1612 edhill 1.12 # Create a list of #define and #undef to enable/disable packages
1613     PACKAGES_DOT_H=PACKAGES_CONFIG.h
1614 edhill 1.1 # The following UGLY HACK sets multiple "#undef"s and it needs to go
1615     # away. On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h
1616     # file would eventually be split up so that all package-related #define
1617     # statements could be separated and handled only by genmake.
1618     names=`ls -1 "$ROOTDIR/pkg"`
1619     all_pack=
1620 adcroft 1.44 DISABLED_PACKAGES=
1621 edhill 1.1 for n in $names ; do
1622     if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
1623     has_pack="f"
1624     for pack in $PACKAGES ; do
1625     if test "x$pack" = "x$n" ; then
1626     has_pack="t"
1627     break
1628     fi
1629     done
1630     if test "x$has_pack" = xf ; then
1631 edhill 1.15 undef=`echo "ALLOW_$n" | $AWK '{print toupper($0)}'`
1632 adcroft 1.44 DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
1633 edhill 1.1 fi
1634     fi
1635     done
1636 adcroft 1.44 ENABLED_PACKAGES=
1637 edhill 1.1 for i in $PACKAGES ; do
1638 edhill 1.15 def=`echo "ALLOW_$i" | $AWK '{print toupper($0)}'`
1639 adcroft 1.44 ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
1640 edhill 1.12 #eh3 DEFINES="$DEFINES -D$def"
1641 edhill 1.1
1642     #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
1643     case $i in
1644     aim_v23)
1645 adcroft 1.46 ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
1646 jmc 1.55 echo "Warning: ALLOW_AIM is set to enable aim_v23."
1647 edhill 1.1 ;;
1648     esac
1649     #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
1650    
1651     done
1652    
1653     echo " Adding STANDARDDIRS"
1654     BUILDDIR=${BUILDDIR:-.}
1655 edhill 1.57 if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
1656 edhill 1.12 STANDARDDIRS="eesupp model"
1657     fi
1658 edhill 1.57 if test "x$STANDARDDIRS" != x ; then
1659     for d in $STANDARDDIRS ; do
1660     adr="$ROOTDIR/$d/src"
1661     if test ! -d $adr ; then
1662     echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1663     echo " is correct and that you correctly specified the STANDARDDIRS option"
1664     exit 1
1665     else
1666     SOURCEDIRS="$SOURCEDIRS $adr"
1667     fi
1668     adr="$ROOTDIR/$d/inc"
1669     if test ! -d $adr ; then
1670     echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1671     echo " is correct and that you correctly specified the STANDARDDIRS option"
1672     exit 1
1673     else
1674     INCLUDEDIRS="$INCLUDEDIRS $adr"
1675     fi
1676     done
1677     fi
1678 edhill 1.1
1679 adcroft 1.52 echo " Searching for *OPTIONS.h files in order to warn about the presence"
1680     echo " of \"#define \"-type statements that are no longer allowed:"
1681 edhill 1.12 CPP_OPTIONS=
1682 adcroft 1.52 CPP_EEOPTIONS=
1683 edhill 1.12 spaths=". $INCLUDEDIRS"
1684 adcroft 1.52 names=`ls -1 "$ROOTDIR/pkg"`
1685 edhill 1.12 for i in $spaths ; do
1686     try="$i/CPP_OPTIONS.h"
1687 edhill 1.54 if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
1688 edhill 1.12 echo " found CPP_OPTIONS=\"$try\""
1689     CPP_OPTIONS="$try"
1690 adcroft 1.52 # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
1691     for n in $names ; do
1692     test_for_package_in_cpp_options $CPP_OPTIONS $n
1693     done
1694     fi
1695     try="$i/CPP_EEOPTIONS.h"
1696 edhill 1.54 if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
1697 adcroft 1.52 echo " found CPP_EEOPTIONS=\"$try\""
1698     # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
1699     #**** not yet enabled ****
1700     # test_for_mpi_in_cpp_eeoptions $try
1701     #**** not yet enabled ****
1702     CPP_EEOPTIONS="$try"
1703 edhill 1.12 fi
1704     done
1705     if test "x$CPP_OPTIONS" = x ; then
1706     echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
1707     exit 1
1708     fi
1709 edhill 1.1
1710 edhill 1.14 # Here, we build the list of files to be "run through" the adjoint
1711     # compiler.
1712     if test -f ./ad_files ; then
1713     rm -f ./ad_files
1714     fi
1715     echo " Creating the list of files for the adjoint compiler."
1716     for i in $SOURCEDIRS ; do
1717     list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
1718     for j in $list_files ; do
1719     cat $i/$j >> ad_files
1720     done
1721     done
1722 edhill 1.60
1723 edhill 1.14
1724 edhill 1.2 echo
1725     echo "=== Creating the Makefile ==="
1726 edhill 1.1 echo " setting INCLUDES"
1727     for i in $INCLUDEDIRS ; do
1728 edhill 1.87 if test ! -d $i ; then
1729 edhill 1.1 echo "Warning: can't find INCLUDEDIRS=\"$i\""
1730     fi
1731     done
1732    
1733     echo " Determining the list of source and include files"
1734     rm -rf .links.tmp
1735     mkdir .links.tmp
1736     echo "# This section creates symbolic links" > srclinks.tmp
1737     echo "" >> srclinks.tmp
1738 edhill 1.71 printf 'SRCFILES = ' > srclist.inc
1739     printf 'CSRCFILES = ' > csrclist.inc
1740     printf 'F90SRCFILES = ' > f90srclist.inc
1741     printf 'HEADERFILES = ' > hlist.inc
1742     printf 'AD_FLOW_FILES = ' > ad_flow_files.inc
1743 adcroft 1.9 alldirs="$SOURCEDIRS $INCLUDEDIRS ."
1744 edhill 1.1 for d in $alldirs ; do
1745     deplist=
1746 edhill 1.14 sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
1747 cnh 1.3 sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
1748 edhill 1.1 for sf in $sfiles ; do
1749     if test ! -r ".links.tmp/$sf" ; then
1750     if test -f "$d/$sf" ; then
1751 adcroft 1.44 case $d/$sf in
1752     ./$PACKAGES_DOT_H)
1753     ;;
1754     ./AD_CONFIG.h)
1755     ;;
1756     ./FC_NAMEMANGLE.h)
1757     ;;
1758 edhill 1.98 ./BUILD_INFO.h)
1759     ;;
1760 adcroft 1.44 *)
1761     touch .links.tmp/$sf
1762     deplist="$deplist $sf"
1763     ;;
1764     esac
1765 edhill 1.15 extn=`echo $sf | $AWK -F '.' '{print $NF}'`
1766 edhill 1.1 case $extn in
1767     F)
1768     echo " \\" >> srclist.inc
1769 edhill 1.71 printf " $sf" >> srclist.inc
1770 edhill 1.1 ;;
1771 cnh 1.3 F90)
1772     echo " \\" >> f90srclist.inc
1773 edhill 1.71 printf " $sf" >> f90srclist.inc
1774 cnh 1.3 ;;
1775 edhill 1.1 c)
1776     echo " \\" >> csrclist.inc
1777 edhill 1.71 printf " $sf" >> csrclist.inc
1778 edhill 1.1 ;;
1779     h)
1780     echo " \\" >> hlist.inc
1781 edhill 1.71 printf " $sf" >> hlist.inc
1782 edhill 1.1 ;;
1783 edhill 1.14 flow)
1784     echo " \\" >> ad_flow_files.inc
1785 edhill 1.71 printf " $sf" >> ad_flow_files.inc
1786 edhill 1.14 ;;
1787 edhill 1.1 esac
1788     fi
1789     fi
1790     done
1791     if test "x$deplist" != x ; then
1792 edhill 1.2 echo "" >> srclinks.tmp
1793     echo "# These files are linked from $d" >> srclinks.tmp
1794 edhill 1.1 echo "$deplist :" >> srclinks.tmp
1795 edhill 1.2 printf "\t\$(LN) %s/\$@ \$@\n" $d >> srclinks.tmp
1796 edhill 1.1 fi
1797     done
1798     rm -rf .links.tmp
1799     echo "" >> srclist.inc
1800     echo "" >> csrclist.inc
1801 cnh 1.3 echo "" >> f90srclist.inc
1802 edhill 1.1 echo "" >> hlist.inc
1803 edhill 1.14 echo "" >> ad_flow_files.inc
1804 edhill 1.1
1805 edhill 1.88 if test -f $MAKEFILE ; then
1806 edhill 1.1 mv -f $MAKEFILE "$MAKEFILE.bak"
1807     fi
1808     echo " Writing makefile: $MAKEFILE"
1809     echo "# Multithreaded + multi-processing makefile for:" > $MAKEFILE
1810     echo "# $MACHINE" >> $MAKEFILE
1811     echo "# This makefile was generated automatically on" >> $MAKEFILE
1812     echo "# $THISDATE" >> $MAKEFILE
1813     echo "# by the command:" >> $MAKEFILE
1814 edhill 1.73 echo "# $0 $G2ARGS" >> $MAKEFILE
1815 edhill 1.1 echo "# executed by:" >> $MAKEFILE
1816 edhill 1.97 echo "# ${THISUSER}@${THISHOST}:${THISCWD}" >> $MAKEFILE
1817 edhill 1.21
1818     EXE_AD=$EXECUTABLE"_ad"
1819     EXE_FTL=$EXECUTABLE"_ftl"
1820     EXE_SVD=$EXECUTABLE"_svd"
1821    
1822 edhill 1.1 cat >>$MAKEFILE <<EOF
1823 edhill 1.53 #
1824     # OPTFILE="$OPTFILE"
1825 edhill 1.1 #
1826     # BUILDDIR : Directory where object files are written
1827     # SOURCEDIRS : Directories containing the source (.F) files
1828     # INCLUDEDIRS : Directories containing the header-source (.h) files
1829     # EXEDIR : Directory where executable that is generated is written
1830     # EXECUTABLE : Full path of executable binary
1831     #
1832     # CPP : C-preprocessor command
1833     # INCLUDES : Directories searched for header files
1834     # DEFINES : Macro definitions for CPP
1835     # MAKEDEPEND : Dependency generator
1836     # KPP : Special preprocessor command (specific to platform)
1837     # KFLAGS : Flags for KPP
1838     # FC : Fortran compiler command
1839     # FFLAGS : Configuration/debugging options for FC
1840     # FOPTIM : Optimization options for FC
1841     # LINK : Command for link editor program
1842     # LIBS : Library flags /or/ additional optimization/debugging flags
1843    
1844     ROOTDIR = ${ROOTDIR}
1845     BUILDDIR = ${BUILDDIR}
1846     SOURCEDIRS = ${SOURCEDIRS}
1847     INCLUDEDIRS = ${INCLUDEDIRS}
1848     EXEDIR = ${EXEDIR}
1849     EXECUTABLE = \$(EXEDIR)/${EXECUTABLE}
1850     TOOLSDIR = ${TOOLSDIR}
1851    
1852 edhill 1.14 #eh3 new defines for the adjoint work
1853     AUTODIFF = ${ROOTDIR}/pkg/autodiff
1854 edhill 1.21 EXE_AD = ${EXE_AD}
1855     EXE_FTL = ${EXE_FTL}
1856     EXE_SVD = ${EXE_SVD}
1857 edhill 1.14
1858 adcroft 1.44 ENABLED_PACKAGES = ${ENABLED_PACKAGES}
1859     DISABLED_PACKAGES = ${DISABLED_PACKAGES}
1860    
1861 adcroft 1.52 # These files are created by Makefile
1862 edhill 1.97 SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h BUILD_INFO.h
1863 adcroft 1.52
1864 edhill 1.1 EOF
1865    
1866     # Note: figure out some way to add Hyades JAM libraries here
1867    
1868     cat >>$MAKEFILE <<EOF
1869     # Unix ln (link)
1870     LN = ${LN}
1871     # C preprocessor
1872     CPP = cat \$< | ${S64} | ${CPP}
1873     # Dependency generator
1874     MAKEDEPEND = ${MAKEDEPEND}
1875     # Special preprocessor (KAP on DECs, FPP on Crays)
1876     KPP = ${KPP}
1877     # Fortran compiler
1878 edhill 1.94 FC = ${FC}
1879 cnh 1.3 # Fortran compiler
1880     F90C = ${F90C}
1881 edhill 1.92 # C compiler
1882     CC = ${CC}
1883 edhill 1.1 # Link editor
1884 edhill 1.70 LINK = ${LINK} ${LDADD}
1885 edhill 1.1
1886     # Defines for CPP
1887     DEFINES = ${DEFINES}
1888     # Includes for CPP
1889     INCLUDES = ${INCLUDES}
1890     # Flags for KPP
1891     KFLAGS1 = ${KFLAGS1}
1892     KFLAGS2 = ${KFLAGS2}
1893     # Optim./debug for FC
1894     FFLAGS = ${FFLAGS}
1895     FOPTIM = ${FOPTIM}
1896 cnh 1.3 # Optim./debug for FC
1897     F90FLAGS = ${F90FLAGS}
1898     F90OPTIM = ${F90OPTIM}
1899 edhill 1.1 # Flags for CC
1900     CFLAGS = ${CFLAGS}
1901     # Files that should not be optimized
1902     NOOPTFILES = ${NOOPTFILES}
1903     NOOPTFLAGS = ${NOOPTFLAGS}
1904     # Flags and libraries needed for linking
1905     LIBS = ${LIBS} \$(XLIBS)
1906 cnh 1.3 # Name of the Mekfile
1907     MAKEFILE=${MAKEFILE}
1908 edhill 1.1
1909     EOF
1910    
1911 edhill 1.14 cat srclist.inc >> $MAKEFILE
1912     cat csrclist.inc >> $MAKEFILE
1913     cat f90srclist.inc >> $MAKEFILE
1914     cat hlist.inc >> $MAKEFILE
1915     cat ad_flow_files.inc >> $MAKEFILE
1916 edhill 1.75 echo >> $MAKEFILE
1917 edhill 1.76 echo 'F77FILES = $(SRCFILES:.F=.'$FS')' >> $MAKEFILE
1918     echo 'F90FILES = $(F90SRCFILES:.F=.'$FS90')' >> $MAKEFILE
1919     echo 'OBJFILES = $(SRCFILES:.F=.o) $(CSRCFILES:.c=.o) $(F90SRCFILES:.F90=.o)' >> $MAKEFILE
1920 edhill 1.75 echo >> $MAKEFILE
1921     echo '.SUFFIXES:' >> $MAKEFILE
1922 adcroft 1.83 echo '.SUFFIXES: .o .'$FS' .p .F .c .'$FS90' .F90' >> $MAKEFILE
1923 cnh 1.3 rm -f srclist.inc csrclist.inc hlist.inc flist.tmp clist.tmp f90srclist.inc
1924 edhill 1.14 rm -f ad_flow_files.inc
1925 edhill 1.1
1926     cat >>$MAKEFILE <<EOF
1927    
1928     all: \$(EXECUTABLE)
1929 adcroft 1.52 \$(EXECUTABLE): \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(OBJFILES)
1930 adcroft 1.44 @echo Creating \$@ ...
1931 edhill 1.1 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
1932     depend:
1933     @make links
1934 edhill 1.76 \$(MAKEDEPEND) -o .$FS \$(DEFINES) \$(INCLUDES) \$(SRCFILES)
1935 adcroft 1.44 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
1936 edhill 1.72 -rm -f makedepend.out
1937 edhill 1.1
1938 adcroft 1.52 links: \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(SPECIAL_FILES)
1939 edhill 1.1
1940 cnh 1.3 small_f: \$(F77FILES) \$(F90FILES)
1941 edhill 1.1
1942     output.txt: \$(EXECUTABLE)
1943     @printf 'running ... '
1944     @\$(EXECUTABLE) > \$@
1945    
1946     clean:
1947 edhill 1.76 -rm -rf *.o *.$FS *.p *.$FS90 *.mod ${RMFILES} work.{pc,pcl} *.template
1948 edhill 1.1 Clean:
1949     @make clean
1950     @make cleanlinks
1951 adcroft 1.52 -rm -f \$(SPECIAL_FILES)
1952 adcroft 1.51 -rm -f genmake_state genmake_*optfile genmake_warnings make.log run.log *.bak
1953 edhill 1.1 CLEAN:
1954     @make Clean
1955     -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
1956     -find \$(EXEDIR) -name "*.data" -exec rm {} \;
1957     -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
1958 adcroft 1.78 -rm -f \$(EXECUTABLE) output.txt STD*
1959 edhill 1.1
1960 edhill 1.18 #eh3 Makefile: makefile
1961 edhill 1.1 makefile:
1962 edhill 1.73 $THIS_SCRIPT $G2ARGS
1963 edhill 1.1 cleanlinks:
1964     -find . -type l -exec rm {} \;
1965    
1966 edhill 1.97 # Special targets (SPECIAL_FILES) which are create by make
1967 adcroft 1.44 ${PACKAGES_DOT_H}:
1968     @echo Creating \$@ ...
1969 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) > \$@
1970 adcroft 1.44 AD_CONFIG.h:
1971     @echo Creating \$@ ...
1972 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 > \$@
1973 adcroft 1.52 FC_NAMEMANGLE.h:
1974     @echo Creating \$@ ...
1975     echo "$FC_NAMEMANGLE" > \$@
1976 adcroft 1.44
1977 edhill 1.97 BUILD_INFO.h:
1978     @echo Creating \$@ ...
1979     EOF
1980    
1981     test ! "x$THISVER" = x && echo " -echo \"#define THISVER '$THISVER'\" > \$@" >> $MAKEFILE
1982     test ! "x$THISUSER" = x && echo " -echo \"#define THISUSER '$THISUSER'\" >> \$@" >> $MAKEFILE
1983     test ! "x$THISDATE" = x && echo " -echo \"#define THISDATE '$THISDATE'\" >> \$@" >> $MAKEFILE
1984     test ! "x$THISHOST" = x && echo " -echo \"#define THISHOST '$THISHOST'\" >> \$@" >> $MAKEFILE
1985    
1986     cat >>$MAKEFILE <<EOF
1987    
1988 edhill 1.76 # The normal chain of rules is ( .F - .$FS - .o )
1989    
1990 edhill 1.101 ## This nullifies any default implicit rules concerning these two file types:
1991     ## %.o : %.F
1992 edhill 1.76
1993     .F.$FS:
1994 edhill 1.1 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1995 edhill 1.76 .$FS.o:
1996 edhill 1.1 \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
1997 edhill 1.76 .F90.$FS90:
1998 cnh 1.3 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1999 edhill 1.76 .$FS90.o:
2000 cnh 1.3 \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
2001 edhill 1.1 .c.o:
2002     \$(CC) \$(CFLAGS) -c \$<
2003    
2004 edhill 1.76 # Special exceptions that use the ( .F - .p - .$FS - .o ) rule-chain
2005     .F.p:
2006 edhill 1.1 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2007 edhill 1.76 .p.$FS:
2008 edhill 1.1 \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
2009 edhill 1.14
2010     #=========================================
2011     #=== Automatic Differentiation Rules ===
2012    
2013     TAMC = ${TAMC}
2014     TAF = ${TAF}
2015    
2016 edhill 1.17 TAF_EXTRA = ${TAF_EXTRA}
2017     TAMC_EXTRA = ${TAMC_EXTRA}
2018    
2019 edhill 1.14 EOF
2020    
2021     ad_vars="AD_TAMC_FLAGS AD_TAF_FLAGS"
2022     ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF_FLAGS"
2023     ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
2024     for i in $ad_vars ; do
2025     name=$i
2026     t1="t2=\$"`echo $i`
2027     eval $t1
2028     printf "%-20s = " $name >> $MAKEFILE
2029     echo $t2 >> $MAKEFILE
2030     done
2031    
2032     echo " Add the source list for AD code generation"
2033     echo >> $MAKEFILE
2034 edhill 1.71 printf "AD_FILES = " >> $MAKEFILE
2035 edhill 1.14 AD_FILES=`cat ad_files`
2036     for i in $AD_FILES ; do
2037     echo " \\" >> $MAKEFILE
2038 edhill 1.71 printf " $i" >> $MAKEFILE
2039 edhill 1.14 done
2040     echo >> $MAKEFILE
2041 edhill 1.21 rm -f ad_files
2042 edhill 1.14
2043     cat >>$MAKEFILE <<EOF
2044    
2045 edhill 1.16 # ... AD ...
2046 edhill 1.23 adall: ad_taf
2047     adtaf: ad_taf_output.f
2048     adtamc: ad_tamc_output.f
2049 edhill 1.21
2050 heimbach 1.48 ad_input_code.f: \$(AD_FILES) \$(HEADERFILES)
2051 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
2052 edhill 1.23 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
2053 adcroft 1.44 -rm -f ad_config.template
2054 edhill 1.22 @make \$(F77FILES)
2055     @make \$(AD_FLOW_FILES)
2056     cat \$(AD_FLOW_FILES) \$(AD_FILES) > ad_input_code.f
2057    
2058 edhill 1.14 ad_taf_output.f: ad_input_code.f
2059 heimbach 1.37 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f
2060 adcroft 1.44 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f
2061 heimbach 1.37
2062     adtafonly:
2063 edhill 1.17 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f
2064 adcroft 1.44 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f
2065 edhill 1.14
2066     ad_taf: ad_taf_output.o \$(OBJFILES)
2067 edhill 1.21 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
2068 edhill 1.14
2069     ad_tamc_output.f: ad_input_code.f
2070 edhill 1.17 \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.f
2071 adcroft 1.44 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.f
2072 edhill 1.14
2073     ad_tamc: ad_tamc_output.o \$(OBJFILES)
2074 edhill 1.21 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
2075 edhill 1.14
2076    
2077 edhill 1.19 # ... FTL ...
2078 edhill 1.23 ftlall: ftl_taf
2079     ftltaf: ftl_taf_output.f
2080     ftltamc: ftl_tamc_output.f
2081 edhill 1.21
2082 heimbach 1.48 ftl_input_code.f: \$(AD_FILES) \$(HEADERFILES)
2083 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
2084 edhill 1.23 cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
2085 adcroft 1.44 -rm -f ftl_config.template
2086 edhill 1.23 @make \$(F77FILES)
2087 edhill 1.22 @make \$(AD_FLOW_FILES)
2088     cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.f
2089    
2090     ftl_taf_output.f: ftl_input_code.f
2091     \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f
2092 adcroft 1.44 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f
2093 edhill 1.14
2094 heimbach 1.40 ftltafonly:
2095     \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f
2096 adcroft 1.44 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f
2097 heimbach 1.40
2098 edhill 1.19 ftl_taf: ftl_taf_output.o \$(OBJFILES)
2099 edhill 1.21 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
2100 edhill 1.14
2101 edhill 1.22 ftl_tamc_output.f: ftl_input_code.f
2102     \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.f
2103 adcroft 1.44 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.f
2104 edhill 1.16
2105 edhill 1.19 ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
2106 edhill 1.21 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
2107 edhill 1.16
2108    
2109     # ... SVD ...
2110 heimbach 1.40 svdtaf: ad_taf_output.f ftl_taf_output.f
2111     svdall: svd_taf
2112 edhill 1.16
2113 heimbach 1.40 svd_taf: ad_taf_output.o ftl_taf_output.o \$(OBJFILES)
2114     \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
2115 edhill 1.14
2116    
2117     #=========================================
2118 edhill 1.1
2119     EOF
2120 edhill 1.7
2121     if test "x$EXEHOOK" != x ; then
2122     printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE
2123     fi
2124 edhill 1.1
2125     echo " Making list of \"exceptions\" that need \".p\" files"
2126     for i in $KPPFILES ; do
2127     base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
2128     RETVAL=$?
2129     if test "x$RETVAL" != x0 ; then
2130     echo "Error: unable to add file \"$i\" to the exceptions list"
2131     fi
2132 edhill 1.76 echo "$base.$FS: $base.p" >> $MAKEFILE
2133 edhill 1.1 done
2134    
2135     echo " Making list of NOOPTFILES"
2136     for i in $NOOPTFILES ; do
2137     base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
2138     RETVAL=$?
2139     if test "x$RETVAL" != x0 ; then
2140     echo "Error: unable to add file \"$i\" to the exceptions list"
2141     fi
2142 edhill 1.76 echo "$base.o: $base.$FS" >> $MAKEFILE
2143 edhill 1.2 printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE
2144 edhill 1.1 done
2145    
2146     echo " Add rules for links"
2147     cat srclinks.tmp >> $MAKEFILE
2148     rm -f srclinks.tmp
2149    
2150     echo " Adding makedepend marker"
2151 edhill 1.2 printf "\n\n# DO NOT DELETE\n" >> $MAKEFILE
2152 edhill 1.1
2153 edhill 1.2 printf "\n=== Done ===\n"
2154 adcroft 1.47
2155     # Create special header files
2156 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"
2157 adcroft 1.47 if test ! -f $PACKAGES_DOT_H ; then
2158     mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
2159     else
2160 edhill 1.61 cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H > /dev/null 2>&1
2161 adcroft 1.47 RETVAL=$?
2162     if test "x$RETVAL" = x0 ; then
2163     rm -f $PACKAGES_DOT_H".tmp"
2164     else
2165     mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"
2166     mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
2167     fi
2168     fi
2169     if test ! -f AD_CONFIG.h ; then
2170 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
2171 adcroft 1.47 fi
2172 edhill 1.5
2173    
2174     # Write the "state" for future records
2175     if test "x$DUMPSTATE" != xf ; then
2176 edhill 1.71 printf "" > genmake_state
2177 edhill 1.5 for i in $gm_state ; do
2178     t1="t2=\$$i"
2179     eval $t1
2180 edhill 1.12 echo "$i='$t2'" >> genmake_state
2181 edhill 1.5 done
2182     fi

  ViewVC Help
Powered by ViewVC 1.1.22