/[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.59 - (hide annotations) (download)
Sun Jan 11 17:02:47 2004 UTC (20 years, 2 months ago) by edhill
Branch: MAIN
Changes since 1.58: +3 -2 lines
 o fix afe syntax error

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

  ViewVC Help
Powered by ViewVC 1.1.22