/[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.132 - (hide annotations) (download)
Fri Sep 16 00:50:49 2005 UTC (14 years ago) by cnh
Branch: MAIN
CVS Tags: checkpoint57t_post, checkpoint57s_post, checkpoint57v_post, checkpint57u_post
Changes since 1.131: +6 -1 lines
Added extra experimental target to create .a library when I need to.
note - this is not written poratably yet, its only for experimental Linux use.

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

  ViewVC Help
Powered by ViewVC 1.1.22