/[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.58 - (hide annotations) (download)
Fri Jan 9 22:08:39 2004 UTC (20 years, 2 months ago) by afe
Branch: MAIN
CVS Tags: hrcube_1
Changes since 1.57: +14 -1 lines
forgotten changes to genmake2 and hs94.cs-32x32x5/code

1 edhill 1.49 #! /usr/bin/env bash
2 edhill 1.1 #
3 afe 1.58 # $Header: /u/u3/gcmpack/MITgcm/tools/genmake2,v 1.57 2003/12/09 18:58:24 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 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     echo "Error: problem encountered while building source files in exch2:" cat make_exch2.errors
974     exit 1
975 edhill 1.1 fi
976     fi
977    
978 edhill 1.2 printf "\n=== Determining package settings ===\n"
979 edhill 1.1 if test "x${PDEPEND}" = x ; then
980     tmp=$ROOTDIR"/pkg/pkg_depend"
981     if test -r $tmp ; then
982     PDEPEND=$tmp
983     else
984     echo "Warning: No package dependency information was specified."
985     echo " Please check that ROOTDIR/pkg/pkg_depend exists."
986     fi
987     else
988     if test ! -r ${PDEPEND} ; then
989     echo "Error: can't read package dependency info from PDEPEND=\"$PDEPEND\""
990     exit 1
991     fi
992     fi
993     echo " getting package dependency info from $PDEPEND"
994     # Strip the comments and then convert the dependency file into
995     # two arrays: PNAME, DNAME
996     cat $PDEPEND | sed -e 's/#.*$//g' \
997 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}' \
998 edhill 1.1 > ./.pd_tmp
999     RETVAL=$?
1000     if test ! "x${RETVAL}" = x0 ; then
1001     echo "Error: unable to parse package dependencies -- please check PDEPEND=\"$PDEPEND\""
1002     exit 1
1003     fi
1004 edhill 1.34 . ./.pd_tmp
1005 edhill 1.1 rm -f ./.pd_tmp
1006    
1007 edhill 1.12 # Search for default packages. Note that a "$ROOTDIR/pkg/pkg_groups"
1008     # file should eventually be added so that, for convenience, one can
1009     # specify groups of packages using names like "ocean" and "atmosphere".
1010 edhill 1.41 echo " checking default package list: "
1011 edhill 1.1 if test "x${PDEFAULT}" = x ; then
1012 edhill 1.12 for i in "." $MODS ; do
1013     if test -r $i"/packages.conf" ; then
1014     PDEFAULT=$i"/packages.conf"
1015     break
1016     fi
1017     done
1018     fi
1019     if test "x${PDEFAULT}" = x ; then
1020 edhill 1.1 PDEFAULT="$ROOTDIR/pkg/pkg_default"
1021     fi
1022     if test "x${PDEFAULT}" = xNONE ; then
1023 edhill 1.41 echo " default packages file disabled"
1024 edhill 1.1 else
1025     if test ! -r $PDEFAULT ; then
1026     echo "Warning: can't read default packages from PDEFAULT=\"$PDEFAULT\""
1027     else
1028 edhill 1.41 echo " using PDEFAULT=\"$PDEFAULT\""
1029 edhill 1.1 # Strip the comments and add all the names
1030 edhill 1.15 def=`cat $PDEFAULT | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
1031 edhill 1.1 RETVAL=$?
1032     if test "x${RETVAL}" != x0 ; then
1033     echo -n "Error: can't parse default package list "
1034     echo "-- please check PDEFAULT=\"$PDEFAULT\""
1035     exit 1
1036     fi
1037     for i in $def ; do
1038     PACKAGES="$PACKAGES $i"
1039     done
1040 edhill 1.12 echo " before group expansion packages are: $PACKAGES"
1041     expand_pkg_groups
1042     echo " after group expansion packages are: $PACKAGES"
1043 edhill 1.1 fi
1044     fi
1045    
1046     echo " applying DISABLE settings"
1047     pack=
1048     for p in $PACKAGES ; do
1049     addit="t"
1050     for d in $DISABLE ; do
1051     if test "x$p" = "x$d" ; then
1052     addit="f"
1053     fi
1054     done
1055     if test "x$addit" = xt ; then
1056     pack="$pack $p"
1057     fi
1058     done
1059     PACKAGES="$pack"
1060     echo " applying ENABLE settings"
1061 edhill 1.12 echo "" > ./.tmp_pack
1062 edhill 1.1 PACKAGES="$PACKAGES $ENABLE"
1063     for i in $PACKAGES ; do
1064     if test ! -d "$ROOTDIR/pkg/$i" ; then
1065     echo "Error: can't find package $i at \"$ROOTDIR/pkg/$i\""
1066     exit 1
1067     fi
1068     echo $i >> ./.tmp_pack
1069     done
1070     pack=`cat ./.tmp_pack | sort | uniq`
1071     rm -f ./.tmp_pack
1072     PACKAGES=
1073     for i in $pack ; do
1074     PACKAGES="$PACKAGES $i"
1075     done
1076     echo " packages are: $PACKAGES"
1077    
1078     echo " applying package dependency rules"
1079     ck=
1080     while test "x$ck" != xtt ; do
1081     i=0
1082 edhill 1.2 # rtot=${#PNAME[@]}
1083     rtot=$nname
1084 edhill 1.1 while test $i -lt $rtot ; do
1085    
1086     # Is $pname in the current $PACKAGES list?
1087 edhill 1.2 # pname=${PNAME[$i]}
1088     tmp="pname=\"\$PNAME_$i\""
1089     eval $tmp
1090 edhill 1.1 pin="f"
1091     for p in $PACKAGES ; do
1092     if test "x$p" = "x$pname" ; then
1093     pin="t"
1094     fi
1095     done
1096    
1097     # Is the DNAME entry a (+) or (-) rule ?
1098 edhill 1.2 tmp="dname=\"\$DNAME_$i\""
1099     eval $tmp
1100 edhill 1.1 plus="-"
1101 edhill 1.2 echo $dname | grep '^+' > /dev/null 2>&1
1102 edhill 1.1 RETVAL=$?
1103     if test "x$RETVAL" = x0 ; then
1104     plus="+"
1105     fi
1106    
1107     # Is $dname in the current $PACKAGES list?
1108 edhill 1.2 dname=`echo $dname | sed -e 's/^[+-]//'`
1109 edhill 1.1 din="f"
1110     for p in $PACKAGES ; do
1111     if test "x$p" = "x$dname" ; then
1112     din="t"
1113     fi
1114     done
1115    
1116     # Do we need to add $dname according to the dependency rules?
1117     if test "x$pin" = xt -a "x$plus" = "x+" -a "x$din" = xf ; then
1118     in_dis="f"
1119     for dis in $DISABLE ; do
1120     if test "x$dis" = "x$dname" ; then
1121     in_dis="t"
1122     fi
1123     done
1124     if test "x$in_dis" = xt ; then
1125     echo "Error: can't satisfy package dependencies:"
1126     echo " \"$dname\" is required by the dependency rules"
1127     echo " but is disallowed by the DISABLE settings"
1128     exit 1
1129     else
1130     PACKAGES="$PACKAGES $dname"
1131     ck=
1132     fi
1133     fi
1134    
1135     # Do we need to get rid of $dname according to the dependency rules?
1136     if test "x$pin" = xt -a "x$plus" = "x-" -a "x$din" = xt; then
1137     echo "Error: can't satisfy package dependencies:"
1138     echo " \"$pname\" was requested but is disallowed by"
1139     echo " the dependency rules for \"$dname\""
1140     exit 1
1141     fi
1142     i=$(( $i + 1 ))
1143     done
1144     ck=$ck"t"
1145     done
1146     echo " packages are: $PACKAGES"
1147     for i in $PACKAGES ; do
1148     adr="$ROOTDIR/pkg/$i"
1149     if test -d $adr ; then
1150     SOURCEDIRS="$SOURCEDIRS $adr"
1151     INCLUDEDIRS="$INCLUDEDIRS $adr"
1152 edhill 1.14 if test "x$i" = xautodiff ; then
1153     AUTODIFF_PKG_USED=t
1154     fi
1155 edhill 1.1 else
1156     echo "Error: the directory \"$adr\" for package $i doesn't exist"
1157     exit 1
1158     fi
1159     done
1160    
1161    
1162 edhill 1.12 # Create a list of #define and #undef to enable/disable packages
1163     PACKAGES_DOT_H=PACKAGES_CONFIG.h
1164 edhill 1.1 # The following UGLY HACK sets multiple "#undef"s and it needs to go
1165     # away. On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h
1166     # file would eventually be split up so that all package-related #define
1167     # statements could be separated and handled only by genmake.
1168     names=`ls -1 "$ROOTDIR/pkg"`
1169     all_pack=
1170 adcroft 1.44 DISABLED_PACKAGES=
1171 edhill 1.1 for n in $names ; do
1172     if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
1173     has_pack="f"
1174     for pack in $PACKAGES ; do
1175     if test "x$pack" = "x$n" ; then
1176     has_pack="t"
1177     break
1178     fi
1179     done
1180     if test "x$has_pack" = xf ; then
1181 edhill 1.15 undef=`echo "ALLOW_$n" | $AWK '{print toupper($0)}'`
1182 adcroft 1.44 DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
1183 edhill 1.1 fi
1184     fi
1185     done
1186 adcroft 1.44 ENABLED_PACKAGES=
1187 edhill 1.1 for i in $PACKAGES ; do
1188 edhill 1.15 def=`echo "ALLOW_$i" | $AWK '{print toupper($0)}'`
1189 adcroft 1.44 ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
1190 edhill 1.12 #eh3 DEFINES="$DEFINES -D$def"
1191 edhill 1.1
1192     #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
1193     case $i in
1194     aim_v23)
1195 adcroft 1.46 ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
1196 jmc 1.55 echo "Warning: ALLOW_AIM is set to enable aim_v23."
1197 edhill 1.1 ;;
1198     esac
1199     #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
1200    
1201     done
1202    
1203     echo " Adding STANDARDDIRS"
1204     BUILDDIR=${BUILDDIR:-.}
1205 edhill 1.57 if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
1206 edhill 1.12 STANDARDDIRS="eesupp model"
1207     fi
1208 edhill 1.57 if test "x$STANDARDDIRS" != x ; then
1209     for d in $STANDARDDIRS ; do
1210     adr="$ROOTDIR/$d/src"
1211     if test ! -d $adr ; then
1212     echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1213     echo " is correct and that you correctly specified the STANDARDDIRS option"
1214     exit 1
1215     else
1216     SOURCEDIRS="$SOURCEDIRS $adr"
1217     fi
1218     adr="$ROOTDIR/$d/inc"
1219     if test ! -d $adr ; then
1220     echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
1221     echo " is correct and that you correctly specified the STANDARDDIRS option"
1222     exit 1
1223     else
1224     INCLUDEDIRS="$INCLUDEDIRS $adr"
1225     fi
1226     done
1227     fi
1228 edhill 1.1
1229 adcroft 1.52 echo " Searching for *OPTIONS.h files in order to warn about the presence"
1230     echo " of \"#define \"-type statements that are no longer allowed:"
1231 edhill 1.12 CPP_OPTIONS=
1232 adcroft 1.52 CPP_EEOPTIONS=
1233 edhill 1.12 spaths=". $INCLUDEDIRS"
1234 adcroft 1.52 names=`ls -1 "$ROOTDIR/pkg"`
1235 edhill 1.12 for i in $spaths ; do
1236     try="$i/CPP_OPTIONS.h"
1237 edhill 1.54 if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
1238 edhill 1.12 echo " found CPP_OPTIONS=\"$try\""
1239     CPP_OPTIONS="$try"
1240 adcroft 1.52 # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
1241     for n in $names ; do
1242     test_for_package_in_cpp_options $CPP_OPTIONS $n
1243     done
1244     fi
1245     try="$i/CPP_EEOPTIONS.h"
1246 edhill 1.54 if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
1247 adcroft 1.52 echo " found CPP_EEOPTIONS=\"$try\""
1248     # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
1249     #**** not yet enabled ****
1250     # test_for_mpi_in_cpp_eeoptions $try
1251     #**** not yet enabled ****
1252     CPP_EEOPTIONS="$try"
1253 edhill 1.12 fi
1254     done
1255     if test "x$CPP_OPTIONS" = x ; then
1256     echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
1257     exit 1
1258     fi
1259 edhill 1.1
1260 edhill 1.14 # Here, we build the list of files to be "run through" the adjoint
1261     # compiler.
1262     if test -f ./ad_files ; then
1263     rm -f ./ad_files
1264     fi
1265     echo " Creating the list of files for the adjoint compiler."
1266     for i in $SOURCEDIRS ; do
1267     list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
1268     for j in $list_files ; do
1269     cat $i/$j >> ad_files
1270     done
1271     done
1272    
1273 edhill 1.2 echo
1274     echo "=== Creating the Makefile ==="
1275 edhill 1.1 echo " setting INCLUDES"
1276     for i in $INCLUDEDIRS ; do
1277 edhill 1.12 if ! test -d $i ; then
1278     # INCLUDES="$INCLUDES -I$i"
1279     # else
1280 edhill 1.1 echo "Warning: can't find INCLUDEDIRS=\"$i\""
1281     fi
1282     done
1283    
1284     echo " Determining the list of source and include files"
1285     rm -rf .links.tmp
1286     mkdir .links.tmp
1287     echo "# This section creates symbolic links" > srclinks.tmp
1288     echo "" >> srclinks.tmp
1289 cnh 1.3 echo -n 'SRCFILES = ' > srclist.inc
1290     echo -n 'CSRCFILES = ' > csrclist.inc
1291     echo -n 'F90SRCFILES = ' > f90srclist.inc
1292 edhill 1.1 echo -n 'HEADERFILES = ' > hlist.inc
1293 edhill 1.14 echo -n 'AD_FLOW_FILES = ' > ad_flow_files.inc
1294 adcroft 1.9 alldirs="$SOURCEDIRS $INCLUDEDIRS ."
1295 edhill 1.1 for d in $alldirs ; do
1296     deplist=
1297 edhill 1.14 sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
1298 cnh 1.3 sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
1299 edhill 1.1 for sf in $sfiles ; do
1300     if test ! -r ".links.tmp/$sf" ; then
1301     if test -f "$d/$sf" ; then
1302 adcroft 1.44 case $d/$sf in
1303     ./$PACKAGES_DOT_H)
1304     ;;
1305     ./AD_CONFIG.h)
1306     ;;
1307     ./FC_NAMEMANGLE.h)
1308     ;;
1309     *)
1310     touch .links.tmp/$sf
1311     deplist="$deplist $sf"
1312     ;;
1313     esac
1314 edhill 1.15 extn=`echo $sf | $AWK -F '.' '{print $NF}'`
1315 edhill 1.1 case $extn in
1316     F)
1317     echo " \\" >> srclist.inc
1318     echo -n " $sf" >> srclist.inc
1319     ;;
1320 cnh 1.3 F90)
1321     echo " \\" >> f90srclist.inc
1322     echo -n " $sf" >> f90srclist.inc
1323     ;;
1324 edhill 1.1 c)
1325     echo " \\" >> csrclist.inc
1326     echo -n " $sf" >> csrclist.inc
1327     ;;
1328     h)
1329     echo " \\" >> hlist.inc
1330     echo -n " $sf" >> hlist.inc
1331     ;;
1332 edhill 1.14 flow)
1333     echo " \\" >> ad_flow_files.inc
1334     echo -n " $sf" >> ad_flow_files.inc
1335     ;;
1336 edhill 1.1 esac
1337     fi
1338     fi
1339     done
1340     if test "x$deplist" != x ; then
1341 edhill 1.2 echo "" >> srclinks.tmp
1342     echo "# These files are linked from $d" >> srclinks.tmp
1343 edhill 1.1 echo "$deplist :" >> srclinks.tmp
1344 edhill 1.2 printf "\t\$(LN) %s/\$@ \$@\n" $d >> srclinks.tmp
1345 edhill 1.1 fi
1346     done
1347     rm -rf .links.tmp
1348     echo "" >> srclist.inc
1349     echo "" >> csrclist.inc
1350 cnh 1.3 echo "" >> f90srclist.inc
1351 edhill 1.1 echo "" >> hlist.inc
1352 edhill 1.14 echo "" >> ad_flow_files.inc
1353 edhill 1.1
1354     if test -e $MAKEFILE ; then
1355     mv -f $MAKEFILE "$MAKEFILE.bak"
1356     fi
1357     echo " Writing makefile: $MAKEFILE"
1358     echo "# Multithreaded + multi-processing makefile for:" > $MAKEFILE
1359     echo "# $MACHINE" >> $MAKEFILE
1360     echo "# This makefile was generated automatically on" >> $MAKEFILE
1361     echo "# $THISDATE" >> $MAKEFILE
1362     echo "# by the command:" >> $MAKEFILE
1363     echo "# $0 $@" >> $MAKEFILE
1364     echo "# executed by:" >> $MAKEFILE
1365     echo "# $USER@${THISHOSTNAME}:${THISCWD}" >> $MAKEFILE
1366 edhill 1.21
1367     EXE_AD=$EXECUTABLE"_ad"
1368     EXE_FTL=$EXECUTABLE"_ftl"
1369     EXE_SVD=$EXECUTABLE"_svd"
1370    
1371 edhill 1.1 cat >>$MAKEFILE <<EOF
1372 edhill 1.53 #
1373     # OPTFILE="$OPTFILE"
1374 edhill 1.1 #
1375     # BUILDDIR : Directory where object files are written
1376     # SOURCEDIRS : Directories containing the source (.F) files
1377     # INCLUDEDIRS : Directories containing the header-source (.h) files
1378     # EXEDIR : Directory where executable that is generated is written
1379     # EXECUTABLE : Full path of executable binary
1380     #
1381     # CPP : C-preprocessor command
1382     # INCLUDES : Directories searched for header files
1383     # DEFINES : Macro definitions for CPP
1384     # MAKEDEPEND : Dependency generator
1385     # KPP : Special preprocessor command (specific to platform)
1386     # KFLAGS : Flags for KPP
1387     # FC : Fortran compiler command
1388     # FFLAGS : Configuration/debugging options for FC
1389     # FOPTIM : Optimization options for FC
1390     # LINK : Command for link editor program
1391     # LIBS : Library flags /or/ additional optimization/debugging flags
1392    
1393     ROOTDIR = ${ROOTDIR}
1394     BUILDDIR = ${BUILDDIR}
1395     SOURCEDIRS = ${SOURCEDIRS}
1396     INCLUDEDIRS = ${INCLUDEDIRS}
1397     EXEDIR = ${EXEDIR}
1398     EXECUTABLE = \$(EXEDIR)/${EXECUTABLE}
1399     TOOLSDIR = ${TOOLSDIR}
1400    
1401 edhill 1.14 #eh3 new defines for the adjoint work
1402     AUTODIFF = ${ROOTDIR}/pkg/autodiff
1403 edhill 1.21 EXE_AD = ${EXE_AD}
1404     EXE_FTL = ${EXE_FTL}
1405     EXE_SVD = ${EXE_SVD}
1406 edhill 1.14
1407 adcroft 1.44 ENABLED_PACKAGES = ${ENABLED_PACKAGES}
1408     DISABLED_PACKAGES = ${DISABLED_PACKAGES}
1409    
1410 adcroft 1.52 # These files are created by Makefile
1411     SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h
1412    
1413 edhill 1.1 EOF
1414    
1415     # Note: figure out some way to add Hyades JAM libraries here
1416    
1417     cat >>$MAKEFILE <<EOF
1418     # Unix ln (link)
1419     LN = ${LN}
1420     # C preprocessor
1421     CPP = cat \$< | ${S64} | ${CPP}
1422     # Dependency generator
1423     MAKEDEPEND = ${MAKEDEPEND}
1424     # Special preprocessor (KAP on DECs, FPP on Crays)
1425     KPP = ${KPP}
1426     # Fortran compiler
1427     FC = ${FC}
1428 cnh 1.3 # Fortran compiler
1429     F90C = ${F90C}
1430 edhill 1.1 # Link editor
1431     LINK = ${LINK}
1432    
1433     # Defines for CPP
1434     DEFINES = ${DEFINES}
1435     # Includes for CPP
1436     INCLUDES = ${INCLUDES}
1437     # Flags for KPP
1438     KFLAGS1 = ${KFLAGS1}
1439     KFLAGS2 = ${KFLAGS2}
1440     # Optim./debug for FC
1441     FFLAGS = ${FFLAGS}
1442     FOPTIM = ${FOPTIM}
1443 cnh 1.3 # Optim./debug for FC
1444     F90FLAGS = ${F90FLAGS}
1445     F90OPTIM = ${F90OPTIM}
1446 edhill 1.1 # Flags for CC
1447     CFLAGS = ${CFLAGS}
1448     # Files that should not be optimized
1449     NOOPTFILES = ${NOOPTFILES}
1450     NOOPTFLAGS = ${NOOPTFLAGS}
1451     # Flags and libraries needed for linking
1452     LIBS = ${LIBS} \$(XLIBS)
1453 cnh 1.3 # Name of the Mekfile
1454     MAKEFILE=${MAKEFILE}
1455 edhill 1.1
1456     EOF
1457    
1458 edhill 1.14 cat srclist.inc >> $MAKEFILE
1459     cat csrclist.inc >> $MAKEFILE
1460     cat f90srclist.inc >> $MAKEFILE
1461     cat hlist.inc >> $MAKEFILE
1462     cat ad_flow_files.inc >> $MAKEFILE
1463     echo >> $MAKEFILE
1464 cnh 1.3 echo 'F77FILES = $(SRCFILES:.F=.f)' >> $MAKEFILE
1465     echo 'F90FILES = $(F90SRCFILES:.F90=.f90)' >> $MAKEFILE
1466     echo 'OBJFILES = $(SRCFILES:.F=.o) $(CSRCFILES:.c=.o) $(F90SRCFILES:.F90=.o)' >> $MAKEFILE
1467 edhill 1.1
1468 cnh 1.3 rm -f srclist.inc csrclist.inc hlist.inc flist.tmp clist.tmp f90srclist.inc
1469 edhill 1.14 rm -f ad_flow_files.inc
1470 edhill 1.1
1471     cat >>$MAKEFILE <<EOF
1472    
1473     .SUFFIXES:
1474 cnh 1.3 .SUFFIXES: .o .f .p .F .c .F90 .f90
1475 edhill 1.1
1476     all: \$(EXECUTABLE)
1477 adcroft 1.52 \$(EXECUTABLE): \$(SPECIAL_FILES) \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(OBJFILES)
1478 adcroft 1.44 @echo Creating \$@ ...
1479 edhill 1.1 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
1480     depend:
1481     @make links
1482     \$(MAKEDEPEND) -o .f \$(DEFINES) \$(INCLUDES) \$(SRCFILES)
1483 adcroft 1.44 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
1484 edhill 1.1
1485 adcroft 1.52 links: \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(SPECIAL_FILES)
1486 edhill 1.1
1487 cnh 1.3 small_f: \$(F77FILES) \$(F90FILES)
1488 edhill 1.1
1489     output.txt: \$(EXECUTABLE)
1490     @printf 'running ... '
1491     @\$(EXECUTABLE) > \$@
1492    
1493     clean:
1494 adcroft 1.44 -rm -rf *.o *.f *.p *.f90 *.mod ${RMFILES} work.{pc,pcl} *.template
1495 edhill 1.1 Clean:
1496     @make clean
1497     @make cleanlinks
1498 adcroft 1.52 -rm -f \$(SPECIAL_FILES)
1499 adcroft 1.51 -rm -f genmake_state genmake_*optfile genmake_warnings make.log run.log *.bak
1500 edhill 1.1 CLEAN:
1501     @make Clean
1502     -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
1503     -find \$(EXEDIR) -name "*.data" -exec rm {} \;
1504     -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
1505 edhill 1.12 -rm -f \$(EXECUTABLE) output.txt
1506 edhill 1.1
1507 edhill 1.18 #eh3 Makefile: makefile
1508 edhill 1.1 makefile:
1509 adcroft 1.44 $THIS_SCRIPT $@
1510 edhill 1.1 cleanlinks:
1511     -find . -type l -exec rm {} \;
1512    
1513 adcroft 1.52 # Special targets ($SPECIAL_FILES) which are create by make
1514 adcroft 1.44 ${PACKAGES_DOT_H}:
1515     @echo Creating \$@ ...
1516 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) > \$@
1517 adcroft 1.44 AD_CONFIG.h:
1518     @echo Creating \$@ ...
1519 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 > \$@
1520 adcroft 1.52 FC_NAMEMANGLE.h:
1521     @echo Creating \$@ ...
1522     echo "$FC_NAMEMANGLE" > \$@
1523 adcroft 1.44
1524 edhill 1.1 # The normal chain of rules is ( .F - .f - .o )
1525     .F.f:
1526     \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1527     .f.o:
1528     \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
1529 cnh 1.3 .F90.f90:
1530     \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1531     .f90.o:
1532     \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
1533 edhill 1.1 .c.o:
1534     \$(CC) \$(CFLAGS) -c \$<
1535    
1536     # Special exceptions that use the ( .F - .p - .f - .o ) rule-chain
1537     .F.p:
1538     \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
1539     .p.f:
1540     \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
1541 edhill 1.14
1542     #=========================================
1543     #=== Automatic Differentiation Rules ===
1544    
1545     TAMC = ${TAMC}
1546     TAF = ${TAF}
1547    
1548 edhill 1.17 TAF_EXTRA = ${TAF_EXTRA}
1549     TAMC_EXTRA = ${TAMC_EXTRA}
1550    
1551 edhill 1.14 EOF
1552    
1553     ad_vars="AD_TAMC_FLAGS AD_TAF_FLAGS"
1554     ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF_FLAGS"
1555     ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
1556     for i in $ad_vars ; do
1557     name=$i
1558     t1="t2=\$"`echo $i`
1559     eval $t1
1560     printf "%-20s = " $name >> $MAKEFILE
1561     echo $t2 >> $MAKEFILE
1562     done
1563    
1564     echo " Add the source list for AD code generation"
1565     echo >> $MAKEFILE
1566     echo -n "AD_FILES = " >> $MAKEFILE
1567     AD_FILES=`cat ad_files`
1568     for i in $AD_FILES ; do
1569     echo " \\" >> $MAKEFILE
1570     echo -n " $i" >> $MAKEFILE
1571     done
1572     echo >> $MAKEFILE
1573 edhill 1.21 rm -f ad_files
1574 edhill 1.14
1575     cat >>$MAKEFILE <<EOF
1576    
1577 edhill 1.16 # ... AD ...
1578 edhill 1.23 adall: ad_taf
1579     adtaf: ad_taf_output.f
1580     adtamc: ad_tamc_output.f
1581 edhill 1.21
1582 heimbach 1.48 ad_input_code.f: \$(AD_FILES) \$(HEADERFILES)
1583 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
1584 edhill 1.23 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
1585 adcroft 1.44 -rm -f ad_config.template
1586 edhill 1.22 @make \$(F77FILES)
1587     @make \$(AD_FLOW_FILES)
1588     cat \$(AD_FLOW_FILES) \$(AD_FILES) > ad_input_code.f
1589    
1590 edhill 1.14 ad_taf_output.f: ad_input_code.f
1591 heimbach 1.37 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f
1592 adcroft 1.44 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f
1593 heimbach 1.37
1594     adtafonly:
1595 edhill 1.17 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f
1596 adcroft 1.44 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f
1597 edhill 1.14
1598     ad_taf: ad_taf_output.o \$(OBJFILES)
1599 edhill 1.21 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
1600 edhill 1.14
1601     ad_tamc_output.f: ad_input_code.f
1602 edhill 1.17 \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.f
1603 adcroft 1.44 cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.f
1604 edhill 1.14
1605     ad_tamc: ad_tamc_output.o \$(OBJFILES)
1606 edhill 1.21 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
1607 edhill 1.14
1608    
1609 edhill 1.19 # ... FTL ...
1610 edhill 1.23 ftlall: ftl_taf
1611     ftltaf: ftl_taf_output.f
1612     ftltamc: ftl_tamc_output.f
1613 edhill 1.21
1614 heimbach 1.48 ftl_input_code.f: \$(AD_FILES) \$(HEADERFILES)
1615 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
1616 edhill 1.23 cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
1617 adcroft 1.44 -rm -f ftl_config.template
1618 edhill 1.23 @make \$(F77FILES)
1619 edhill 1.22 @make \$(AD_FLOW_FILES)
1620     cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.f
1621    
1622     ftl_taf_output.f: ftl_input_code.f
1623     \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f
1624 adcroft 1.44 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f
1625 edhill 1.14
1626 heimbach 1.40 ftltafonly:
1627     \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f
1628 adcroft 1.44 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f
1629 heimbach 1.40
1630 edhill 1.19 ftl_taf: ftl_taf_output.o \$(OBJFILES)
1631 edhill 1.21 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
1632 edhill 1.14
1633 edhill 1.22 ftl_tamc_output.f: ftl_input_code.f
1634     \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.f
1635 adcroft 1.44 cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.f
1636 edhill 1.16
1637 edhill 1.19 ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
1638 edhill 1.21 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
1639 edhill 1.16
1640    
1641     # ... SVD ...
1642 heimbach 1.40 svdtaf: ad_taf_output.f ftl_taf_output.f
1643     svdall: svd_taf
1644 edhill 1.16
1645 heimbach 1.40 svd_taf: ad_taf_output.o ftl_taf_output.o \$(OBJFILES)
1646     \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
1647 edhill 1.14
1648    
1649     #=========================================
1650 edhill 1.1
1651     EOF
1652 edhill 1.7
1653     if test "x$EXEHOOK" != x ; then
1654     printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE
1655     fi
1656 edhill 1.1
1657     echo " Making list of \"exceptions\" that need \".p\" files"
1658     for i in $KPPFILES ; do
1659     base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
1660     RETVAL=$?
1661     if test "x$RETVAL" != x0 ; then
1662     echo "Error: unable to add file \"$i\" to the exceptions list"
1663     fi
1664     echo "$base.f: $base.p" >> $MAKEFILE
1665     done
1666    
1667     echo " Making list of NOOPTFILES"
1668     for i in $NOOPTFILES ; do
1669     base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
1670     RETVAL=$?
1671     if test "x$RETVAL" != x0 ; then
1672     echo "Error: unable to add file \"$i\" to the exceptions list"
1673     fi
1674     echo "$base.o: $base.f" >> $MAKEFILE
1675 edhill 1.2 printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE
1676 edhill 1.1 done
1677    
1678     echo " Add rules for links"
1679     cat srclinks.tmp >> $MAKEFILE
1680     rm -f srclinks.tmp
1681    
1682     echo " Adding makedepend marker"
1683 edhill 1.2 printf "\n\n# DO NOT DELETE\n" >> $MAKEFILE
1684 edhill 1.1
1685 edhill 1.2 printf "\n=== Done ===\n"
1686 adcroft 1.47
1687     # Create special header files
1688     $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"
1689     if test ! -f $PACKAGES_DOT_H ; then
1690     mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
1691     else
1692     cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
1693     RETVAL=$?
1694     if test "x$RETVAL" = x0 ; then
1695     rm -f $PACKAGES_DOT_H".tmp"
1696     else
1697     mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"
1698     mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
1699     fi
1700     fi
1701     if test ! -f AD_CONFIG.h ; then
1702     $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
1703     fi
1704 edhill 1.5
1705    
1706     # Write the "state" for future records
1707     if test "x$DUMPSTATE" != xf ; then
1708 edhill 1.12 echo -n "" > genmake_state
1709 edhill 1.5 for i in $gm_state ; do
1710     t1="t2=\$$i"
1711     eval $t1
1712 edhill 1.12 echo "$i='$t2'" >> genmake_state
1713 edhill 1.5 done
1714     fi

  ViewVC Help
Powered by ViewVC 1.1.22