/[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.115 - (hide annotations) (download)
Thu Jan 6 15:09:54 2005 UTC (14 years, 4 months ago) by edhill
Branch: MAIN
Changes since 1.114: +2 -2 lines
 o "-F." for annoying old Sun awk

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

  ViewVC Help
Powered by ViewVC 1.1.22