/[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.112 - (hide annotations) (download)
Fri Dec 10 13:07:47 2004 UTC (14 years, 9 months ago) by edhill
Branch: MAIN
CVS Tags: checkpoint57b_post
Changes since 1.111: +3 -3 lines
 o use $AWK everywhere (not "awk")

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

  ViewVC Help
Powered by ViewVC 1.1.22