/[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.99 - (hide annotations) (download)
Mon Sep 27 15:49:48 2004 UTC (19 years, 5 months ago) by edhill
Branch: MAIN
Changes since 1.98: +25 -15 lines
 o disable the mnc package if the test compile fails
   - also remove the Nnetcdf test execution since some machines (eg.
     the Itanium-hosted SX-6 that PH uses) are cross-compilers that
     will _always_ fail to execute the non-native code

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

  ViewVC Help
Powered by ViewVC 1.1.22