/[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.69 - (hide annotations) (download)
Wed Feb 25 19:12:10 2004 UTC (20 years ago) by edhill
Branch: MAIN
Changes since 1.68: +48 -5 lines
 o increase static sizes within the Cyrus makedepend
 o add new makedepend code to genmake2

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

  ViewVC Help
Powered by ViewVC 1.1.22