/[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.98 - (hide annotations) (download)
Tue Sep 7 21:28:47 2004 UTC (15 years ago) by edhill
Branch: MAIN
CVS Tags: checkpoint55c_post, checkpoint55b_post, checkpoint55, checkpoint54f_post, checkpoint55a_post
Changes since 1.97: +3 -1 lines
 o fix minor BUILD_INFO.h problem

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

  ViewVC Help
Powered by ViewVC 1.1.22