/[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.211 - (hide annotations) (download)
Tue Nov 2 22:45:07 2010 UTC (13 years, 4 months ago) by jmc
Branch: MAIN
Changes since 1.210: +59 -59 lines
-only 1 log file "genmake.log" (previously genmake_warnings & genmake_errors)
-change DUMPSTATE default to false (can use "-ds" option to switch it to T)
-update link to devel_HOWTO document

1 edhill 1.86 #! /usr/bin/env bash
2 edhill 1.1 #
3 jmc 1.211 # $Header: /u/gcmpack/MITgcm/tools/genmake2,v 1.210 2010/11/02 00:51:11 jmc 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 edhill 1.146 test_for_string_in_file $cpp_options "^[ ]*#define.*ALLOW_$pkg[ ]"
17     test_for_string_in_file $cpp_options "^[ ]*#undef.*ALLOW_$pkg[ ]"
18     test_for_string_in_file $cpp_options "^[ ]*#define.*DISABLE_$pkg[ ]"
19     test_for_string_in_file $cpp_options "^[ ]*#undef.*DISABLE_$pkg[ ]"
20     test_for_string_in_file $cpp_options "^[ ]*#define.*ALLOW_$pkg$"
21     test_for_string_in_file $cpp_options "^[ ]*#undef.*ALLOW_$pkg$"
22     test_for_string_in_file $cpp_options "^[ ]*#define.*DISABLE_$pkg$"
23     test_for_string_in_file $cpp_options "^[ ]*#undef.*DISABLE_$pkg$"
24 adcroft 1.52 }
25    
26     # Search for particular CPP #cmds associated with MPI
27     # usage: test_for_mpi_in_cpp_eeoptions CPP_file
28     test_for_mpi_in_cpp_eeoptions() {
29     cpp_options=$1
30 edhill 1.146 test_for_string_in_file $cpp_options "^[ ]*#define.*ALLOW_USE_MPI[ ]"
31     test_for_string_in_file $cpp_options "^[ ]*#undef.*ALLOW_USE_MPI[ ]"
32     test_for_string_in_file $cpp_options "^[ ]*#define.*ALWAYS_USE_MPI[ ]"
33     test_for_string_in_file $cpp_options "^[ ]*#undef.*ALWAYS_USE_MPI[ ]"
34     test_for_string_in_file $cpp_options "^[ ]*#define.*ALLOW_USE_MPI$"
35     test_for_string_in_file $cpp_options "^[ ]*#undef.*ALLOW_USE_MPI$"
36     test_for_string_in_file $cpp_options "^[ ]*#define.*ALWAYS_USE_MPI$"
37     test_for_string_in_file $cpp_options "^[ ]*#undef.*ALWAYS_USE_MPI$"
38 adcroft 1.52 }
39    
40     # Search for particular string in a file. Return 1 if detected, 0 if not
41     # usage: test_for_string_in_file file string
42     test_for_string_in_file() {
43     file=$1
44     strng=$2
45     grep -i "$strng" $file > /dev/null 2>&1
46 edhill 1.12 RETVAL=$?
47     if test "x${RETVAL}" = x0 ; then
48 edhill 1.71 printf "Error: In $file there is an illegal line: "
49 adcroft 1.52 grep -i "$strng" $file
50 edhill 1.146 exit 99
51 edhill 1.12 fi
52 adcroft 1.52 return 0
53 edhill 1.12 }
54    
55     # Read the $ROOTDIR/pkg/pkg_groups file and expand any references to
56     # the package list.
57     expand_pkg_groups() {
58     new_packages=
59     if test -r $PKG_GROUPS ; then
60     cat $PKG_GROUPS | sed -e 's/#.*$//g' | sed -e 's/:/ : /g' > ./p1.tmp
61 edhill 1.15 cat ./p1.tmp | $AWK '(NF>2 && $2==":"){ print $0 }' > ./p2.tmp
62 edhill 1.12 matched=0
63     for i in $PACKAGES ; do
64     line=`grep "^ *$i" ./p2.tmp`
65     RETVAL=$?
66     if test "x$RETVAL" = x0 ; then
67     matched=1
68 edhill 1.15 replace=`echo $line | $AWK '{ $1=""; $2=""; print $0 }'`
69 jmc 1.208 echo " replacing \"$i\" with:$replace"
70 edhill 1.12 new_packages="$new_packages $replace"
71     else
72     new_packages="$new_packages $i"
73     fi
74     done
75     PACKAGES=$new_packages
76     rm -f ./p[1,2].tmp
77 adcroft 1.74 return $matched
78 edhill 1.12 else
79     echo "Warning: can't read package groups definition file: $PKG_GROUPS"
80     fi
81     }
82 edhill 1.1
83 edhill 1.75 # Check for broken environments (eg. cygwin, MacOSX w/HFS+) that
84     # cannot distinguish [*.F/*.F90] from [*.f/*.f90] files.
85     check_for_broken_Ff() {
86 edhill 1.76 # Do we have defaults for $FS and/or $FS90 ?
87     tfs=f
88     tfs9=f90
89     if test "x$FS" != x ; then
90     tfs="$FS"
91     fi
92     if test "x$FS90" != x ; then
93     tfs9="$FS90"
94     fi
95    
96 edhill 1.75 # First check the ability to create a *.F/.f pair.
97 edhill 1.76 cat <<EOF >> genmake_hello.F
98 edhill 1.75 program hello
99     write(*,*) 'hi'
100     stop
101     end
102     EOF
103 edhill 1.76 cp genmake_hello.F "genmake_hello."$tfs > /dev/null 2>&1
104 edhill 1.75 RETVAL=$?
105     if test "x$RETVAL" != x0 ; then
106 edhill 1.76 if test "x$FS" = x ; then
107 edhill 1.77 FS='for'
108     FS90='fr9'
109 edhill 1.76 check_for_broken_Ff
110     else
111     cat <<EOF 2>&1
112 jmc 1.206 ERROR: Your file system cannot distinguish between *.F and *.f files
113     (fails the "cp" test) and this program cannot find a suitable
114     replacement extension. Please try a different build environment or
115 edhill 1.76 contact the <MITgcm-support@mitgcm.org> list for help.
116    
117     EOF
118     exit -1
119     fi
120 edhill 1.75 return
121     fi
122 edhill 1.76 rm -f genmake_hello.*
123 edhill 1.75
124 edhill 1.76 # Check the ability of ${MAKE} and ${LN} to use the current set
125     # of extensions.
126     cat <<EOF >> genmake_hello.F
127     program hello
128     write(*,*) 'hi'
129     stop
130     end
131     EOF
132 edhill 1.119 test -f $MAKEFILE && mv -f $MAKEFILE $MAKEFILE".tst"
133     cat <<EOF >> $MAKEFILE
134 edhill 1.75 .SUFFIXES:
135 edhill 1.101 .SUFFIXES: .$tfs .F
136     .F.$tfs:
137     $LN \$< \$@
138 edhill 1.75 EOF
139 edhill 1.76 $MAKE "genmake_hello."$tfs > /dev/null 2>&1
140 edhill 1.75 RETVAL=$?
141 edhill 1.88 if test "x$RETVAL" != x0 -o ! -f "genmake_hello."$tfs ; then
142 edhill 1.76 if test "x$FS" = x ; then
143 edhill 1.77 FS='for'
144     FS90='fr9'
145 edhill 1.76 check_for_broken_Ff
146     else
147     cat <<EOF 2>&1
148 jmc 1.206 ERROR: Your file system cannot distinguish between *.F and *.f files
149     (fails the "make/ln" test) and this program cannot find a suitable
150     replacement extension. Please try a different build environment or
151 edhill 1.76 contact the <MITgcm-support@mitgcm.org> list for help.
152    
153     EOF
154     exit -1
155     return
156     fi
157 edhill 1.75 fi
158 edhill 1.119 rm -f genmake_hello.* $MAKEFILE
159     test -f $MAKEFILE".tst" && mv -f $MAKEFILE".tst" $MAKEFILE
160 edhill 1.75
161 edhill 1.76 # If we make it here, use the extensions
162     FS=$tfs
163     FS90=$tfs9
164     return
165 edhill 1.75 }
166    
167    
168 edhill 1.84 look_for_makedepend() {
169 adcroft 1.33
170 edhill 1.69 # The "original" makedepend is part of the Imake system that is
171     # most often distributed with XFree86 or with an XFree86 source
172     # package. As a result, many machines (eg. generic Linux) do not
173     # have a system-default "makedepend" available. For those
174     # systems, we have two fall-back options:
175     #
176     # 1) a makedepend implementation shipped with the cyrus-imapd
177     # package: ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/
178     #
179     # 2) a known-buggy xmakedpend shell script
180     #
181     # So the choices are, in order:
182     #
183     # 1) use the user-specified program
184     # 2) use a system-wide default
185     # 3) locally build and use the cyrus implementation
186     # 4) fall back to the buggy local xmakedpend script
187     #
188 adcroft 1.33 if test "x${MAKEDEPEND}" = x ; then
189 edhill 1.85 which makedepend > /dev/null 2>&1
190     RV0=$?
191 edhill 1.119 test -f $MAKEFILE && mv -f $MAKEFILE $MAKEFILE".tst"
192     # echo 'MAKEFILE="'$MAKEFILE'"'
193     cat <<EOF >> $MAKEFILE
194     # THIS IS A TEST MAKEFILE GENERATED BY "genmake2"
195     #
196 jmc 1.206 # Some "makedepend" implementations will die if they cannot
197     # find a Makefile -- so this file is here to gives them an
198 edhill 1.119 # empty one to find and parse.
199     EOF
200 edhill 1.85 cat <<EOF >> genmake_tc.f
201 edhill 1.77 program test
202     write(*,*) 'test'
203     stop
204     end
205     EOF
206 edhill 1.85 makedepend genmake_tc.f > /dev/null 2>&1
207 mlosch 1.120 RV1=$?
208 edhill 1.119 test -f $MAKEFILE && rm -f $MAKEFILE
209     test -f $MAKEFILE".tst" && mv -f $MAKEFILE".tst" $MAKEFILE
210 edhill 1.85 if test "x${RV0}${RV1}" = x00 ; then
211     MAKEDEPEND=makedepend
212     else
213     echo " a system-default makedepend was not found."
214 jmc 1.206
215 edhill 1.85 # Try to build the cyrus implementation
216 edhill 1.90 build_cyrus_makedepend
217 edhill 1.85 RETVAL=$?
218 edhill 1.90 if test "x$RETVAL" != x0 ; then
219 edhill 1.85 MAKEDEPEND='$(TOOLSDIR)/xmakedepend'
220     fi
221     rm -f ./genmake_cy_md
222     fi
223 edhill 1.90 else
224     # echo "MAKEDEPEND=${MAKEDEPEND}"
225     echo "${MAKEDEPEND}" | grep -i cyrus > /dev/null 2>&1
226     RETVAL=$?
227     if test x"$RETVAL" = x0 ; then
228     build_cyrus_makedepend
229     fi
230 edhill 1.1 fi
231 edhill 1.84 }
232    
233    
234 edhill 1.90 build_cyrus_makedepend() {
235     rm -f ./genmake_cy_md
236     (
237     cd $ROOTDIR/tools/cyrus-imapd-makedepend \
238     && ./configure > /dev/null 2>&1 \
239     && make > /dev/null 2>&1
240     if test -x ./makedepend.exe ; then
241     $LN ./makedepend.exe ./makedepend
242     fi
243     ./makedepend ifparser.c > /dev/null 2>&1 \
244     && echo "true"
245     ) > ./genmake_cy_md
246     grep true ./genmake_cy_md > /dev/null 2>&1
247     RETVAL=$?
248     rm -f ./genmake_cy_md
249     if test "x$RETVAL" = x0 ; then
250     MAKEDEPEND='$(TOOLSDIR)/cyrus-imapd-makedepend/makedepend'
251     return 0
252     else
253     echo "WARNING: unable to build cyrus-imapd-makedepend"
254     return 1
255     fi
256     }
257    
258 edhill 1.141
259     build_embed_encode()
260     {
261     printf " building the embed-encode utility... "
262     if test ! -e "$ROOTDIR/tools/embed_encode/encode_files" ; then
263     if test ! -d "$ROOTDIR/tools/embed_encode" ; then
264     echo
265     echo " Error: can't locate \"$ROOTDIR/tools/embed_encode\""
266     echo
267     EMBED_SRC=f
268     return 1
269     fi
270     clist="cc gcc c89 $CC"
271 jmc 1.206 for ic in $clist ; do
272 edhill 1.141 comm="$ic -o encode_files encode_files.c"
273     ( cd $ROOTDIR/tools/embed_encode && $comm ) > /dev/null 2>&1
274     RETVAL=$?
275     if test "x$RETVAL" = x0 ; then
276     echo "OK"
277     DEFINES="$DEFINES -DHAVE_EMBED_SRC"
278     return 0
279     fi
280     done
281     echo
282     echo " Error: unable to build $ROOTDIR/embed_encode/encode_files"
283     echo " so it has been disabled"
284     echo
285     EMBED_SRC=f
286     return 1
287     fi
288     echo "OK"
289     DEFINES="$DEFINES -DHAVE_EMBED_SRC"
290     }
291    
292    
293 edhill 1.84 # Guess possible config options for this host
294     find_possible_configs() {
295    
296     tmp1=`uname`"_"`uname -m`
297     tmp2=`echo $tmp1 | sed -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
298     tmp3=`echo $tmp2 | sed -e 's/power macintosh/ppc/'`
299     tmp1=`echo $tmp3 | sed -e 's|x86_64|amd64|'`
300     tmp2=`echo $tmp1 | sed -e 's/i[3-6]86/ia32/' | sed -e 's/athlon/ia32/'`
301     tmp3=`echo $tmp2 | sed -e 's/cray sv1/craysv1/'`
302     PLATFORM=$tmp3
303     echo $PLATFORM | grep cygwin > /dev/null 2>&1 && PLATFORM=cygwin_ia32
304     OFLIST=`(cd $ROOTDIR/tools/build_options; ls | grep "^$PLATFORM")`
305     echo " The platform appears to be: $PLATFORM"
306 jmc 1.206
307 edhill 1.84 echo "test" > test
308     ln -s ./test link
309     RETVAL=$?
310     if test "x${RETVAL}" = x0 ; then
311     LN="ln -s"
312     else
313     echo "Error: \"ln -s\" does not appear to work on this system!"
314     echo " For help, please contact <MITgcm-support@mitgcm.org>."
315     exit 1
316     fi
317     rm -f test link
318    
319     if test "x$CPP" = x ; then
320     CPP="cpp -traditional -P"
321     fi
322    
323     look_for_makedepend
324 edhill 1.1
325 edhill 1.91 #================================================================
326     # look for possible C compilers
327 heimbach 1.158 tmp="$MITGCM_CC $CC gcc c89 cc c99 mpicc icc"
328 edhill 1.91 p_CC=
329     for c in $tmp ; do
330     rm -f ./genmake_hello.c ./genmake_hello
331     cat >> genmake_hello.c << EOF
332     #include <stdio.h>
333     int main(int argc, char **argv) {
334     printf("Hello!\n");
335     return 0;
336     }
337     EOF
338     $c -o genmake_hello genmake_hello.c > /dev/null 2>&1
339     RETVAL=$?
340     if test "x${RETVAL}" = x0 ; then
341     p_CC="$p_CC $c"
342     fi
343     done
344     rm -f ./genmake_hello.c ./genmake_hello
345     if test "x${p_CC}" = x ; then
346     cat 1>&2 <<EOF
347    
348     Error: No C compilers were found in your path. Please specify one using:
349    
350     1) an "optfile" on (eg. "-optfile=path/to/OPTFILE"),
351     2) the CC or MITGCM_CC environment variables.
352    
353     EOF
354     exit 1
355     else
356     echo " The possible C compilers found in your path are:"
357     echo " "$p_CC
358     if test "x$CC" = x ; then
359     CC=`echo $p_CC | $AWK '{print $1}'`
360     echo " Setting C compiler to: "$CC
361     fi
362     fi
363    
364     #================================================================
365     # look for possible FORTRAN compilers
366 heimbach 1.158 tmp="$MITGCM_FC $FC efc g77 f77 pgf77 pgf95 ifc ifort f90 f95 mpif77 mpf77 mpxlf95 gfortran g95"
367 edhill 1.1 p_FC=
368 edhill 1.11 for c in $tmp ; do
369     rm -f ./hello.f ./hello
370     cat >> hello.f <<EOF
371     program hello
372     do i=1,3
373     print *, 'hello world : ', i
374     enddo
375     end
376     EOF
377     $c -o hello hello.f > /dev/null 2>&1
378 edhill 1.1 RETVAL=$?
379     if test "x${RETVAL}" = x0 ; then
380     p_FC="$p_FC $c"
381     fi
382     done
383 edhill 1.21 rm -f ./hello.f ./hello
384 edhill 1.1 if test "x${p_FC}" = x ; then
385 edhill 1.11 cat 1>&2 <<EOF
386    
387     Error: No Fortran compilers were found in your path. Please specify one using:
388    
389     1) an "optfile" on (eg. "-optfile=path/to/OPTFILE"),
390     2) a command-line option (eg. "-fc NAME"), or
391 edhill 1.91 3) the FC or MITGCM_FC environment variables.
392 edhill 1.11
393     EOF
394     exit 1
395 edhill 1.1 else
396 edhill 1.11 echo " The possible FORTRAN compilers found in your path are:"
397     echo " "$p_FC
398 edhill 1.136 fi
399    
400     # Use the first of the compilers found in the current PATH
401     # that has a correctly-named optfile
402     if test "x$OPTFILE" = x -a "x$FC" = x ; then
403     for i in $p_FC ; do
404     OPTFILE=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$i
405     if test -r $OPTFILE ; then
406     echo " Setting OPTFILE to: "$OPTFILE
407     break
408     fi
409     done
410 edhill 1.1 fi
411    
412 adcroft 1.67 if test "x$OPTFILE" = x ; then
413     OPTFILE=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$FC
414     if test ! -r $OPTFILE ; then
415     echo " I looked for the file "$OPTFILE" but did not find it"
416     fi
417     fi
418     # echo " The options file: $p_OF"
419     # echo " appears to match so we'll use it."
420     # for i in $p_FC ; do
421     #p_OF=$ROOTDIR"/tools/build_options/"$PLATFORM"_"$i
422     #if test -r $p_OF ; then
423     # OPTFILE=$p_OF
424     # echo " The options file: $p_OF"
425     # echo " appears to match so we'll use it."
426     # break
427     #fi
428     # done
429 edhill 1.11 if test "x$OPTFILE" = x ; then
430     cat 1>&2 <<EOF
431    
432     Error: No options file was found in: $ROOTDIR/tools/build_options/
433     that matches this platform ("$PLATFORM") and the compilers found in
434     your path. Please specify an "optfile" using:
435    
436     1) the command line (eg. "-optfile=path/to/OPTFILE"), or
437     2) the MITGCM_OF environment variable.
438    
439     If you need help, please contact the developers at <MITgcm-support@mitgcm.org>.
440    
441 edhill 1.1 EOF
442 edhill 1.11 exit 1
443 edhill 1.1 fi
444 jmc 1.206
445 edhill 1.11 # # look for possible MPI libraries
446     # mpi_libs=
447     # mpi_fort=`which mpif77 2>/dev/null`
448     # RETVAL=$?
449     # if test "x${RETVAL}" = x0 ; then
450     # cat >>test.f <<EOF
451     # PROGRAM HELLO
452     # DO 10, I=1,10
453     # PRINT *,'Hello World'
454     # 10 CONTINUE
455     # STOP
456     # END
457     # EOF
458     # eval "$mpi_fort -showme test.f > out"
459     # RETVAL=$?
460     # if test "x${RETVAL}" = x0 ; then
461     # a=`cat out`
462     # for i in $a ; do
463 jmc 1.206 # case $i in
464 edhill 1.11 # -*)
465     # mpi_libs="$mpi_libs $i" ;;
466     # esac
467     # done
468     # echo "The MPI libs appear to be:"
469     # echo " "$mpi_libs
470     # fi
471     # rm -f test.f out
472     # fi
473 edhill 1.1
474     }
475    
476     # Parse the package dependency information
477     get_pdepend_list() {
478    
479     # strip the comments and then convert the dependency file into
480     # two arrays: PNAME, DNAME
481     cat $1 | sed -e 's/#.*$//g' \
482 jmc 1.205 | $AWK 'BEGIN{nn=-1;} (NF>0){ for(i=2;i<=NF;i++){nn++; print "PNAME_"nn"="$1"\nDNAME_"nn"="$i}} END{print "nname="nn}' \
483 edhill 1.1 > ./.pd_tmp
484 jmc 1.205 RETVAL=$?
485     if test ! "x${RETVAL}" = x0 ; then
486 jmc 1.208 echo "Error: unable to parse package dependencies -- please check PKG_DEPEND=\"$1\""
487 jmc 1.205 exit 1
488     fi
489 edhill 1.34 . ./.pd_tmp
490 edhill 1.1 rm -f ./.pd_tmp
491    
492     }
493    
494    
495     # Explain usage
496     usage() {
497 edhill 1.41 cat <<EOF
498    
499     Usage: "$0" [OPTIONS]
500     where [OPTIONS] can be:
501    
502     -help | --help | -h | --h
503     Print this help message and exit.
504 edhill 1.79
505     -adoptfile NAME | --adoptfile NAME | -adof NAME | --adof NAME
506     -adoptfile=NAME | --adoptfile=NAME | -adof=NAME | --adof=NAME
507     Use "NAME" as the adoptfile. By default, the file at
508     "tools/adjoint_options/adjoint_default" will be used.
509 edhill 1.41
510     -nooptfile | --nooptfile
511     -optfile NAME | --optfile NAME | -of NAME | --of NAME
512     -optfile=NAME | --optfile=NAME | -of=NAME | --of=NAME
513     Use "NAME" as the optfile. By default, an attempt will be
514 jmc 1.206 made to find an appropriate "standard" optfile in the
515 edhill 1.41 tools/build_options/ directory.
516    
517     -pdepend NAME | --pdepend NAME
518     -pdepend=NAME | --pdepend=NAME
519     Get package dependency information from "NAME".
520    
521 jmc 1.208 -pgroups NAME | --pgroups NAME
522     -pgroups=NAME | --pgroups=NAME
523     Get the package groups information from "NAME".
524 edhill 1.41
525 jmc 1.203 -bash NAME
526     Explicitly specify the Bourne or BASH shell to use
527    
528 edhill 1.41 -make NAME | -m NAME
529     --make=NAME | -m=NAME
530 jmc 1.206 Use "NAME" for the MAKE program. The default is "make" but
531 edhill 1.41 many platforms, "gmake" is the preferred choice.
532    
533     -makefile NAME | -mf NAME
534     --makefile=NAME | -mf=NAME
535     Call the makefile "NAME". The default is "Makefile".
536    
537 edhill 1.69 -makedepend NAME | -md NAME
538     --makedepend=NAME | -md=NAME
539     Use "NAME" for the MAKEDEPEND program.
540    
541 edhill 1.41 -rootdir NAME | --rootdir NAME | -rd NAME | --rd NAME
542     -rootdir=NAME | --rootdir=NAME | -rd=NAME | --rd=NAME
543     Specify the location of the MITgcm ROOTDIR as "NAME".
544 jmc 1.206 By default, genamke will try to find the location by
545 edhill 1.41 looking in parent directories (up to the 5th parent).
546    
547     -mods NAME | --mods NAME | -mo NAME | --mo NAME
548     -mods=NAME | --mods=NAME | -mo=NAME | --mo=NAME
549 jmc 1.206 Here, "NAME" specifies a list of directories that are
550     used for additional source code. Files found in the
551     "mods list" are given preference over files of the same
552 edhill 1.41 name found elsewhere.
553    
554     -disable NAME | --disable NAME
555     -disable=NAME | --disable=NAME
556 jmc 1.206 Here "NAME" specifies a list of packages that we don't
557     want to use. If this violates package dependencies,
558 edhill 1.41 genamke will exit with an error message.
559    
560     -enable NAME | --enable NAME
561     -enable=NAME | --enable=NAME
562 jmc 1.206 Here "NAME" specifies a list of packages that we wish
563     to specifically enable. If this violates package
564 edhill 1.41 dependencies, genamke will exit with an error message.
565    
566     -standarddirs NAME | --standarddirs NAME
567     -standarddirs=NAME | --standarddirs=NAME
568 jmc 1.206 Here, "NAME" specifies a list of directories to be
569 edhill 1.41 used as the "standard" code.
570    
571     -fortran NAME | --fortran NAME | -fc NAME | --fc NAME
572     -fc=NAME | --fc=NAME
573 jmc 1.206 Use "NAME" as the fortran compiler. By default, genmake
574 edhill 1.41 will search for a working compiler by trying a list of
575     "usual suspects" such as g77, f77, etc.
576    
577 edhill 1.91 -cc NAME | --cc NAME | -cc=NAME | --cc=NAME
578 jmc 1.206 Use "NAME" as the C compiler. By default, genmake
579 edhill 1.91 will search for a working compiler by trying a list of
580     "usual suspects" such as gcc, c89, cc, etc.
581    
582 edhill 1.41 -[no]ieee | --[no]ieee
583 jmc 1.206 Do or don't use IEEE numerics. Note that this option
584     *only* works if it is supported by the OPTFILE that
585 edhill 1.41 is being used.
586    
587 jmc 1.203 -use_real4 | -use_r4 | -ur4 | --use_real4 | --use_r4 | --ur4
588     Use "real*4" type for _RS variable (#undef REAL4_IS_SLOW)
589     *only* works if CPP_EEOPTIONS.h allows this.
590    
591 edhill 1.143 -ignoretime | -ignore_time | --ignoretime | --ignore_time
592     Ignore all the "wall clock" routines entirely. This will
593 jmc 1.206 not in any way hurt the model results -- it simply means
594     that the code that checks how long the model spends in
595 edhill 1.143 various routines will give junk values.
596    
597 ce107 1.126 -ts | --ts
598     Produce timing information per timestep
599 ce107 1.139 -papis | --papis
600 ce107 1.147 Produce summary MFlop/s (and IPC) with PAPI per timestep
601     -pcls | --pcls
602     Produce summary MFlop/s etc. with PCL per timestep
603 ce107 1.139 -foolad | --foolad
604     Fool the AD code generator
605     -papi | --papi
606     Performance analysis with PAPI
607 ce107 1.147 -pcl | --pcl
608     Performance analysis with PCL
609 ce107 1.139 -hpmt | --hpmt
610     Performance analysis with the HPM Toolkit
611    
612     -gsl | --gsl
613     Use GSL to control floating point rounding and precision
614 ce107 1.160 -devel | --devel
615     Add additional warning and debugging flags for development
616 ce107 1.126
617 adcroft 1.67 -mpi | --mpi
618     Include MPI header files and link to MPI libraries
619     -mpi=PATH | --mpi=PATH
620     Include MPI header files and link to MPI libraries using MPI_ROOT
621 edhill 1.95 set to PATH. i.e. Include files from \$PATH/include, link to libraries
622     from \$PATH/lib and use binaries from \$PATH/bin.
623 adcroft 1.67
624 jmc 1.187 -omp | --omp
625     Activate OpenMP code + use Compiler option OMPFLAG
626     -omp=OMPFLAG | --omp=OMPFLAG
627     Activate OpenMP code + use Compiler option OMPFLAG
628    
629 edhill 1.141 -es | --es | -embed-source | --embed-source
630 jmc 1.206 Embed a tarball containing the full source code
631     (including the Makefile, etc.) used to build the
632 edhill 1.141 executable [off by default]
633    
634 jmc 1.206 While it is most often a single word, the "NAME" variables specified
635 edhill 1.41 above can in many cases be a space-delimited string such as:
636    
637     --enable pkg1 --enable 'pkg1 pkg2' --enable 'pkg1 pkg2 pkg3'
638     -mods=dir1 -mods='dir1' -mods='dir1 dir2 dir3'
639     -foptim='-Mvect=cachesize:512000,transform -xtypemap=real:64,double:64,integer:32'
640    
641     which, depending upon your shell, may need to be single-quoted.
642    
643     For more detailed genmake documentation, please see:
644    
645 jmc 1.202 http://mitgcm.org/public/devel_HOWTO/
646 edhill 1.41
647     EOF
648    
649 edhill 1.1 exit 1
650     }
651    
652 edhill 1.31 # Build a CPP macro to automate calling C routines from FORTRAN
653     get_fortran_c_namemangling() {
654 edhill 1.89
655     #echo "FC_NAMEMANGLE = \"$FC_NAMEMANGLE\""
656     if test ! "x$FC_NAMEMANGLE" = x ; then
657     return 0
658     fi
659 jmc 1.211 echo "running: get_fortran_c_namemangling()" >> $LOGFILE
660 edhill 1.89
661 edhill 1.31 default_nm="#define FC_NAMEMANGLE(X) X ## _"
662 jmc 1.206
663 edhill 1.31 cat > genmake_test.c <<EOF
664     void tcall( char * string ) { tsub( string ); }
665     EOF
666 jmc 1.211 $MAKE genmake_test.o >> $LOGFILE 2>&1
667 edhill 1.31 RETVAL=$?
668     if test "x$RETVAL" != x0 ; then
669     FC_NAMEMANGLE=$default_nm
670 jmc 1.211 cat <<EOF>> $LOGFILE
671 edhill 1.39
672     WARNING: C test compile fails
673     WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
674     WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here
675     EOF
676 edhill 1.31 return 1
677     fi
678 edhill 1.91 c_tcall=`nm genmake_test.o 2>/dev/null | grep 'T ' | grep tcall | cut -d ' ' -f 3`
679 edhill 1.31 RETVAL=$?
680     if test "x$RETVAL" != x0 ; then
681     FC_NAMEMANGLE=$default_nm
682 jmc 1.211 cat <<EOF>> $LOGFILE
683 edhill 1.39
684     WARNING: The "nm" command failed.
685     WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
686     WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here
687     EOF
688 edhill 1.31 return 1
689     fi
690 edhill 1.118 cat > genmake_tcomp.$FS <<EOF
691 edhill 1.31 subroutine tcall( string )
692     character*(*) string
693     call tsub( string )
694     end
695     EOF
696 jmc 1.211 $FC $FFLAGS -c genmake_tcomp.$FS >> $LOGFILE 2>&1
697 edhill 1.31 RETVAL=$?
698     if test "x$RETVAL" != x0 ; then
699     FC_NAMEMANGLE=$default_nm
700 jmc 1.211 cat <<EOF>> $LOGFILE
701 edhill 1.39
702 jmc 1.211 WARNING: FORTRAN test compile fails -- please see '$LOGFILE'
703 edhill 1.39 WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
704     WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here.
705     EOF
706 edhill 1.31 return 1
707     fi
708 edhill 1.91 f_tcall=`nm genmake_tcomp.o 2>/dev/null | grep 'T ' | grep tcall | cut -d ' ' -f 3`
709 edhill 1.31 RETVAL=$?
710     if test "x$RETVAL" != x0 ; then
711     FC_NAMEMANGLE=$default_nm
712 jmc 1.211 cat <<EOF>> $LOGFILE
713 edhill 1.39
714     WARNING: The "nm" command failed.
715     WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE'
716     WARNING: Please contact <MITgcm-support@mitgcm.org> if you need help here.
717     EOF
718 edhill 1.31 return 1
719     fi
720    
721     c_a=`echo $c_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 1 | sed -e 's|Y||'`
722     f_a=`echo $f_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 1 | sed -e 's|Y||'`
723     c_b=`echo $c_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 2 | sed -e 's|Y||'`
724     f_b=`echo $f_tcall | sed -e 's|tcall|Y Y|' | cut -d ' ' -f 2 | sed -e 's|Y||'`
725    
726     nmangle="X"
727     if test "x$c_a" != "x$f_a" ; then
728     comm="echo x$f_a | sed -e 's|x$c_a||'"
729     a=`eval $comm`
730     nmangle="$a ## $nmangle"
731     fi
732     if test "x$c_b" != "x$f_b" ; then
733     comm="echo x$f_b | sed -e 's|x$c_b||'"
734     b=`eval $comm`
735     nmangle="$nmangle ## $b"
736     fi
737    
738     FC_NAMEMANGLE="#define FC_NAMEMANGLE(X) $nmangle"
739 edhill 1.32
740     # cleanup the testing files
741     rm -f genmake_tcomp.* genmake_test.*
742 edhill 1.31 }
743 edhill 1.1
744 edhill 1.39
745     check_HAVE_CLOC() {
746 jmc 1.211 echo >> $LOGFILE
747     echo "running: check_HAVE_CLOC()" >> $LOGFILE
748 edhill 1.39 get_fortran_c_namemangling
749     cat <<EOF > genmake_tc_1.c
750     $FC_NAMEMANGLE
751     #include <stdio.h>
752     #include <stdlib.h>
753     #include <unistd.h>
754     #include <assert.h>
755     #include <sys/time.h>
756     void FC_NAMEMANGLE(cloc) ( double *curtim )
757     {
758     struct timeval tv1;
759     gettimeofday(&tv1 , (void *)NULL );
760     *curtim = (double)((tv1.tv_usec)+(tv1.tv_sec)*1.E6);
761     *curtim = *curtim/1.E6;
762     }
763     EOF
764 mlosch 1.168 COMM="$CC $CFLAGS -c genmake_tc_1.c"
765 jmc 1.211 echo $COMM >> $LOGFILE
766     $COMM >> $LOGFILE 2>&1
767 edhill 1.39 RET_C=$?
768 edhill 1.118 cat <<EOF > genmake_tc_2.$FS
769 edhill 1.39 program hello
770 edhill 1.129 REAL*8 wtime
771 edhill 1.39 external cloc
772     call cloc(wtime)
773     print *," HELLO WORLD", wtime
774 edhill 1.128 end
775 edhill 1.39 EOF
776 mlosch 1.163 COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
777 jmc 1.211 echo $COMM >> $LOGFILE
778     $COMM >> $LOGFILE 2>&1
779 edhill 1.39 RET_F=$?
780 jmc 1.211 test -x ./genmake_tc && ./genmake_tc >> $LOGFILE 2>&1
781 edhill 1.39 RETVAL=$?
782     if test "x$RETVAL" = x0 ; then
783     HAVE_CLOC=t
784     DEFINES="$DEFINES -DHAVE_CLOC"
785     fi
786     rm -f genmake_tc*
787     }
788    
789    
790 edhill 1.137 check_HAVE_SIGREG() {
791 edhill 1.150 if test ! "x$HAVE_SIGREG" = x ; then
792     return
793     fi
794 jmc 1.211 echo >> $LOGFILE
795     echo "running: check_HAVE_SIGREG()" >> $LOGFILE
796 edhill 1.137 get_fortran_c_namemangling
797     cat <<EOF > genmake_tc_1.c
798     $FC_NAMEMANGLE
799     #include <stdlib.h>
800     #include <stdio.h>
801     #include <signal.h>
802     #include <errno.h>
803     #include <ucontext.h>
804    
805     int * ip;
806    
807     static void killhandler(
808     unsigned int sn, siginfo_t si, struct ucontext *sc )
809     {
810     *ip = *ip + 1;
811     return;
812     }
813    
814     void FC_NAMEMANGLE(sigreg) (int * aip)
815     {
816 edhill 1.138 struct sigaction s;
817 edhill 1.137 ip = aip;
818     s.sa_flags = SA_SIGINFO;
819     s.sa_sigaction = (void *)killhandler;
820     if(sigaction (SIGTERM,&s,(struct sigaction *)NULL)) {
821     printf("Sigaction returned error = %d\n", errno);
822     exit(0);
823     }
824     return;
825     }
826     EOF
827 mlosch 1.168 COMM="$CC $CFLAGS -c genmake_tc_1.c"
828 jmc 1.211 echo $COMM >> $LOGFILE
829     $COMM >> $LOGFILE 2>&1
830 edhill 1.137 RET_C=$?
831     cat <<EOF > genmake_tc_2.$FS
832     program hello
833     integer anint
834     common /iv/ anint
835     external sigreg
836     call sigreg(anint)
837     end
838     EOF
839 jmc 1.211 cat genmake_tc_2.$FS >> $LOGFILE
840 edhill 1.137 COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
841 jmc 1.211 echo $COMM >> $LOGFILE
842     $COMM >> $LOGFILE 2>&1
843 edhill 1.137 RETVAL=$?
844     if test "x$RETVAL" = x0 ; then
845     HAVE_SIGREG=t
846     DEFINES="$DEFINES -DHAVE_SIGREG"
847     fi
848     rm -f genmake_tc*
849     }
850    
851    
852 edhill 1.130 check_HAVE_SETRLSTK() {
853 edhill 1.151 if test "x$HAVE_SETRLSTK" = xt ; then
854     DEFINES="$DEFINES -DHAVE_SETRLSTK"
855     return
856     fi
857     if test ! "x$HAVE_SETRLSTK" = x ; then
858     return
859     fi
860 jmc 1.211 echo >> $LOGFILE
861     echo "running: check_HAVE_SETRLSTK()" >> $LOGFILE
862 edhill 1.130 get_fortran_c_namemangling
863     cat <<EOF > genmake_tc_1.c
864     $FC_NAMEMANGLE
865     #include <sys/time.h>
866     #include <sys/resource.h>
867     #include <unistd.h>
868     void FC_NAMEMANGLE(setrlstk) ()
869     {
870     struct rlimit rls;
871     rls.rlim_cur = RLIM_INFINITY;
872     rls.rlim_max = RLIM_INFINITY;
873     setrlimit(RLIMIT_STACK, &rls);
874     return;
875     }
876     EOF
877 mlosch 1.168 COMM="$CC $CFLAGS -c genmake_tc_1.c"
878 jmc 1.211 echo $COMM >> $LOGFILE
879     $COMM >> $LOGFILE 2>&1
880 edhill 1.130 RET_C=$?
881     cat <<EOF > genmake_tc_2.$FS
882     program hello
883     external setrlstk
884     call setrlstk()
885     end
886     EOF
887 jmc 1.211 cat genmake_tc_2.$FS >> $LOGFILE
888 edhill 1.135 COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
889 jmc 1.211 echo $COMM >> $LOGFILE
890     $COMM >> $LOGFILE 2>&1
891 edhill 1.130 RETVAL=$?
892     if test "x$RETVAL" = x0 ; then
893     HAVE_SETRLSTK=t
894     DEFINES="$DEFINES -DHAVE_SETRLSTK"
895     fi
896     rm -f genmake_tc*
897     }
898    
899    
900 edhill 1.108 check_HAVE_STAT() {
901 jmc 1.211 echo >> $LOGFILE
902     echo "running: check_HAVE_STAT()" >> $LOGFILE
903 edhill 1.108 get_fortran_c_namemangling
904     cat <<EOF > genmake_tc_1.c
905     $FC_NAMEMANGLE
906     #include <stdio.h>
907     #include <stdlib.h>
908     #include <unistd.h>
909     #include <sys/stat.h>
910     #include <sys/types.h>
911     void FC_NAMEMANGLE(tfsize) ( int *nbyte )
912     {
913     char name[512];
914     struct stat astat;
915    
916     name[0] = 'a'; name[1] = '\0';
917     if (! stat(name, &astat))
918     *nbyte = (int)(astat.st_size);
919     else
920     *nbyte = -1;
921     }
922     EOF
923 mlosch 1.168 COMM="$CC $CFLAGS -c genmake_tc_1.c"
924 jmc 1.211 echo $COMM >> $LOGFILE
925 mlosch 1.168 $COMM >> genmake_tc.log 2>&1
926 edhill 1.108 RET_C=$?
927 edhill 1.118 cat <<EOF > genmake_tc_2.$FS
928 edhill 1.108 program hello
929     integer nbyte
930     call tfsize(nbyte)
931     print *," HELLO WORLD", nbyte
932 edhill 1.128 end
933 edhill 1.108 EOF
934 jmc 1.211 cat genmake_tc_2.$FS >> $LOGFILE
935 edhill 1.135 COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
936 jmc 1.211 echo $COMM >> $LOGFILE
937 edhill 1.135 $COMM >> genmake_tc.log 2>&1
938 edhill 1.108 RETVAL=$?
939     if test "x$RETVAL" = x0 ; then
940     HAVE_STAT=t
941     DEFINES="$DEFINES -DHAVE_STAT"
942     fi
943     rm -f genmake_tc*
944     }
945    
946    
947 edhill 1.60 check_netcdf_libs() {
948 edhill 1.113 if test ! "x$SKIP_NETCDF_CHECK" = x ; then
949     return
950     fi
951 jmc 1.211 echo >> $LOGFILE
952     echo "running: check_netcdf_libs()" >> $LOGFILE
953 edhill 1.117 cat <<EOF > genmake_tnc.F
954 edhill 1.60 program fgennc
955     #include "netcdf.inc"
956 edhill 1.113 EOF
957     if test ! "x$MPI" = x ; then
958 edhill 1.117 echo '#include "mpif.h"' >> genmake_tnc.F
959 edhill 1.113 fi
960 edhill 1.117 cat <<EOF >> genmake_tnc.F
961 edhill 1.60 integer iret, ncid, xid
962     iret = nf_create('genmake_tnc.nc', NF_CLOBBER, ncid)
963     IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
964     iret = nf_def_dim(ncid, 'X', 11, xid)
965     IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
966     iret = nf_close(ncid)
967     IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret)
968     end
969     EOF
970 jmc 1.210 echo "=== genmake_tnc.F >>>" > genmake_tnc.log
971 edhill 1.135 cat genmake_tnc.F >> genmake_tnc.log
972 jmc 1.210 echo "<<< genmake_tnc.F ===" >> genmake_tnc.log
973 edhill 1.111 RET_CPP=f
974 edhill 1.149 COMM="cat genmake_tnc.F | $CPP $DEFINES $INCLUDES"
975 edhill 1.135 echo "$COMM" >> genmake_tnc.log
976 dfer 1.155 eval $COMM > genmake_tnc.$FS 2>/dev/null && RET_CPP=t
977 edhill 1.111 if test "x$RET_CPP" = xf ; then
978     echo " WARNING: CPP failed to pre-process the netcdf test." \
979 edhill 1.133 >> genmake_tnc.log
980 edhill 1.111 echo " Please check that \$INCLUDES is properly set." \
981 edhill 1.133 >> genmake_tnc.log
982 edhill 1.111 fi
983 edhill 1.135 echo "$FC $FFLAGS $FOPTIM -c genmake_tnc.$FS \ " >> genmake_tnc.log
984 edhill 1.153 echo " && $LINK $FFLAGS $FOPTIM -o genmake_tnc.o $LIBS" >> genmake_tnc.log
985 edhill 1.117 $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1 \
986 edhill 1.153 && $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS >> genmake_tnc.log 2>&1
987 edhill 1.60 RET_COMPILE=$?
988 jmc 1.211 cat genmake_tnc.log >> $LOGFILE
989 edhill 1.99
990     #EH3 Remove test program execution for machines that either disallow
991     #EH3 execution or cannot support it (eg. cross-compilers)
992     #EH3
993     #EH3 test -x ./genmake_tnc && ./genmake_tnc >> genmake_tnc.log 2>&1
994     #EH3 RETVAL=$?
995     #EH3 if test "x$RET_COMPILE" = x0 -a "x$RETVAL" = x0 ; then
996    
997     if test "x$RET_COMPILE" = x0 ; then
998 edhill 1.60 HAVE_NETCDF=t
999 jmc 1.211 echo "check_netcdf: successful" >> $LOGFILE
1000 edhill 1.60 else
1001 edhill 1.66 # try again with "-lnetcdf" added to the libs
1002 jmc 1.210 echo "==> try again with added '-lnetcdf'" > genmake_tnc.log
1003 edhill 1.149 echo "cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS \ " >> genmake_tnc.log
1004 edhill 1.133 echo " && $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS \ " >> genmake_tnc.log
1005 edhill 1.153 echo " && $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf" >> genmake_tnc.log
1006 edhill 1.149 cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS 2>/dev/null \
1007 edhill 1.117 && $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1 \
1008 edhill 1.153 && $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf >> genmake_tnc.log 2>&1
1009 edhill 1.66 RET_COMPILE=$?
1010 jmc 1.211 echo >> $LOGFILE
1011     cat genmake_tnc.log >> $LOGFILE
1012 edhill 1.99 if test "x$RET_COMPILE" = x0 ; then
1013 edhill 1.66 LIBS="$LIBS -lnetcdf"
1014     HAVE_NETCDF=t
1015 jmc 1.211 echo "check_netcdf: successful" >> $LOGFILE
1016 ce107 1.160 else
1017     # try again with "-lnetcdff" added to the libs
1018 jmc 1.210 echo "==> try again with added '-lnetcdff -lnetcdf'" > genmake_tnc.log
1019 ce107 1.160 echo "cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS \ " >> genmake_tnc.log
1020     echo " && $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS \ " >> genmake_tnc.log
1021     echo " && $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf" >> genmake_tnc.log
1022     cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS 2>/dev/null \
1023     && $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1 \
1024     && $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdff -lnetcdf >> genmake_tnc.log 2>&1
1025     RET_COMPILE=$?
1026 jmc 1.211 echo >> $LOGFILE
1027     cat genmake_tnc.log >> $LOGFILE
1028 ce107 1.160 if test "x$RET_COMPILE" = x0 ; then
1029     LIBS="$LIBS -lnetcdff -lnetcdf"
1030     HAVE_NETCDF=t
1031 jmc 1.211 echo "check_netcdf: successful" >> $LOGFILE
1032 ce107 1.160 fi
1033 edhill 1.66 fi
1034 edhill 1.60 fi
1035     rm -f genmake_tnc*
1036     }
1037    
1038    
1039 adcroft 1.67
1040     ###############################################################################
1041     # Sequential part of script starts here
1042     ###############################################################################
1043    
1044 edhill 1.1 # Set defaults here
1045 edhill 1.5 COMMANDL="$0 $@"
1046    
1047 edhill 1.1 PLATFORM=
1048     LN=
1049     S64=
1050     KPP=
1051 edhill 1.114 #FC=
1052 edhill 1.93 #CC=gcc
1053 edhill 1.114 #CPP=
1054 edhill 1.1 LINK=
1055 edhill 1.31 DEFINES=
1056 edhill 1.1 PACKAGES=
1057     ENABLE=
1058     DISABLE=
1059 edhill 1.119 # MAKEFILE=
1060     # MAKEDEPEND=
1061 jmc 1.208 PKG_DEPEND=
1062     PKG_GROUPS=
1063 jmc 1.211 DUMPSTATE=f
1064 edhill 1.1 OPTFILE=
1065 edhill 1.111 INCLUDES="-I. $INCLUDES"
1066 edhill 1.1 FFLAGS=
1067     FOPTIM=
1068 mlosch 1.165 FEXTRAFLAGS=
1069 jmc 1.181 USE_EXTENDED_SRC=
1070     EXTENDED_SRC_FLAG=
1071 edhill 1.1 CFLAGS=
1072     KFLAGS1=
1073     KFLAGS2=
1074 edhill 1.70 #LDADD=
1075 edhill 1.1 LIBS=
1076     KPPFILES=
1077     NOOPTFILES=
1078     NOOPTFLAGS=
1079 adcroft 1.67 MPI=
1080     MPIPATH=
1081 jmc 1.187 OMP=
1082     OMPFLAG=
1083 jmc 1.203 USE_R4=
1084 ce107 1.126 TS=
1085 ce107 1.139 PAPIS=
1086 ce107 1.147 PCLS=
1087 ce107 1.139 FOOLAD=
1088     PAPI=
1089 ce107 1.147 PCL=
1090 ce107 1.139 HPMT=
1091     GSL=
1092 ce107 1.160 DEVEL=
1093 edhill 1.131 HAVE_TEST_L=
1094 edhill 1.1
1095 edhill 1.124 # DEFINES checked by test compilation or command-line
1096 edhill 1.29 HAVE_SYSTEM=
1097     HAVE_FDATE=
1098     FC_NAMEMANGLE=
1099 edhill 1.39 HAVE_CLOC=
1100 edhill 1.151 # HAVE_SETRLSTK=
1101 edhill 1.108 HAVE_STAT=
1102 edhill 1.60 HAVE_NETCDF=
1103 cnh 1.81 HAVE_ETIME=
1104 edhill 1.124 IGNORE_TIME=
1105 edhill 1.29
1106 edhill 1.1 MODS=
1107     TOOLSDIR=
1108     SOURCEDIRS=
1109     INCLUDEDIRS=
1110 edhill 1.57 STANDARDDIRS="USE_THE_DEFAULT"
1111 edhill 1.1
1112 edhill 1.73 G2ARGS=
1113 edhill 1.71 BASH=
1114 edhill 1.1 PWD=`pwd`
1115 edhill 1.114 test "x$MAKE" = x && MAKE=make
1116     test "x$AWK" = x && AWK=awk
1117 edhill 1.141 EMBED_SRC=
1118 edhill 1.97 THISHOST=`hostname`
1119 edhill 1.1 THISCWD=`pwd`
1120     THISDATE=`date`
1121 edhill 1.97 THISUSER=`echo $USER`
1122     THISVER=
1123 edhill 1.1 MACHINE=`uname -a`
1124 edhill 1.7 EXECUTABLE=
1125     EXEHOOK=
1126     EXEDIR=
1127 edhill 1.12 PACKAGES_CONF=
1128     IEEE=
1129     if test "x$MITGCM_IEEE" != x ; then
1130     IEEE=$MITGCM_IEEE
1131     fi
1132 edhill 1.76 FS=
1133     FS90=
1134 edhill 1.1
1135 edhill 1.14 AUTODIFF_PKG_USED=f
1136     AD_OPTFILE=
1137 edhill 1.17 TAF=
1138     AD_TAF_FLAGS=
1139     FTL_TAF_FLAGS=
1140     SVD_TAF_FLAGS=
1141     TAF_EXTRA=
1142     TAMC=
1143     AD_TAMC_FLAGS=
1144     FTL_TAF_FLAGS=
1145     SVD_TAMC_FLAGS=
1146     TAMC_EXTRA=
1147    
1148 edhill 1.5 # The following state can be set directly by command-line switches
1149 jmc 1.208 gm_s1="OPTFILE PKG_DEPEND PKG_GROUPS MAKEFILE MAKEDEPEND PLATFORM ROOTDIR MODS DISABLE ENABLE"
1150 jmc 1.203 gm_s2="FC IEEE USE_R4 TS PAPIS PCLS PAPI PCL HPMT GSL DEVEL MPI OMP DUMPSTATE STANDARDDIRS"
1151 edhill 1.5
1152     # The following state is not directly set by command-line switches
1153 jmc 1.208 gm_s3="LN S64 LINK MAKE PACKAGES INCLUDES FFLAGS FOPTIM FEXTRAFLAGS"
1154     gm_s4="CFLAGS LIBS KPP KFLAGS1 KFLAGS2 KPPFILES NOOPTFILES NOOPTFLAGS"
1155     gm_s5="TOOLSDIR SOURCEDIRS INCLUDEDIRS PWD THISHOST THISUSER THISDATE THISVER MACHINE"
1156 edhill 1.12 gm_s6="EXECUTABLE EXEHOOK EXEDIR PACKAGES_CONF"
1157 jmc 1.208 gm_s7="FC_NAMEMANGLE HAVE_NETCDF HAVE_SYSTEM HAVE_FDATE HAVE_ETIME"
1158 edhill 1.5
1159 edhill 1.14 # The following are all related to adjoint/tangent-linear stuff
1160 edhill 1.29 gm_s10="AUTODIFF_PKG_USED AD_OPTFILE TAMC TAF AD_TAMC_FLAGS AD_TAF_FLAGS"
1161     gm_s11="FTL_TAMC_FLAGS FTL_TAF_FLAGS SVD_TAMC_FLAGS SVD_TAF_FLAGS"
1162     gm_s12="TAF_EXTRA TAMC_EXTRA"
1163 edhill 1.14
1164 edhill 1.29 gm_state="COMMANDL $gm_s1 $gm_s2 $gm_s3 $gm_s4 $gm_s5 $gm_s6 $gm_s7"
1165     gm_state="$gm_state $gm_s10 $gm_s11 $gm_s12"
1166 edhill 1.5
1167 edhill 1.41 cat <<EOF
1168    
1169     GENMAKE :
1170    
1171 jmc 1.211 A program for GENerating MAKEfiles for the MITgcm project.
1172     For a quick list of options, use "genmake2 -h"
1173     or for more detail see the Developer's HOWTO manual at:
1174     http://mitgcm.org/public/docs.html
1175 edhill 1.41
1176     EOF
1177 edhill 1.5
1178 jmc 1.211 LOGFILE="genmake.log"
1179 jmc 1.210 #- clean-up previous genmake logfiles:
1180 jmc 1.211 rm -f genmake_state genmake_*optfile $LOGFILE
1181 jmc 1.209
1182 edhill 1.2 echo "=== Processing options files and arguments ==="
1183 edhill 1.12 gm_local="genmake_local"
1184 edhill 1.71 printf " getting local config information: "
1185 edhill 1.88 if test -f $gm_local ; then
1186 edhill 1.1 echo "using $gm_local"
1187 edhill 1.34 . $gm_local
1188 edhill 1.2 # echo "DISABLE=$DISABLE"
1189     # echo "ENABLE=$ENABLE"
1190 edhill 1.1 else
1191     echo "none found"
1192     fi
1193    
1194 edhill 1.103 #echo "$0::$1:$2:$3:$4:$5:$6:$7:"
1195 edhill 1.2 #parse_options
1196     ac_prev=
1197 edhill 1.102 for ac_option in "$@" ; do
1198 edhill 1.2
1199 edhill 1.73 G2ARGS="$G2ARGS \"$ac_option\""
1200    
1201 edhill 1.2 # If the previous option needs an argument, assign it.
1202     if test -n "$ac_prev"; then
1203     eval "$ac_prev=\$ac_option"
1204     ac_prev=
1205     continue
1206     fi
1207 jmc 1.206
1208 edhill 1.2 ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
1209 jmc 1.206
1210 edhill 1.2 case $ac_option in
1211    
1212     -help | --help | -h | --h)
1213     usage ;;
1214    
1215     -nooptfile | --nooptfile)
1216     OPTFILE="NONE" ;;
1217     -optfile | --optfile | -of | --of)
1218 edhill 1.4 ac_prev=OPTFILE ;;
1219 edhill 1.2 -optfile=* | --optfile=* | -of=* | --of=*)
1220     OPTFILE=$ac_optarg ;;
1221    
1222 edhill 1.50 -adoptfile | --adoptfile | -adof | --adof)
1223 edhill 1.14 ac_prev=AD_OPTFILE ;;
1224     -adoptfile=* | --adoptfile=* | -adof=* | --adof=*)
1225     AD_OPTFILE=$ac_optarg ;;
1226    
1227 edhill 1.2 -pdepend | --pdepend)
1228 jmc 1.208 ac_prev=PKG_DEPEND ;;
1229 edhill 1.2 -pdepend=* | --pdepend=*)
1230 jmc 1.208 PKG_DEPEND=$ac_optarg ;;
1231 edhill 1.2
1232 jmc 1.208 -pgroups | --pgroups)
1233     ac_prev=PKG_GROUPS ;;
1234     -pgroups=* | --pgroups=*)
1235     PKG_GROUPS=$ac_optarg ;;
1236 edhill 1.2
1237 edhill 1.6 -make | --make | -m | --m)
1238     ac_prev=MAKE ;;
1239     -make=* | --make=* | -m=* | --m=*)
1240     MAKE=$ac_optarg ;;
1241 edhill 1.69
1242 edhill 1.71 -bash | --bash)
1243     ac_prev=BASH ;;
1244     -bash=* | --bash=*)
1245     BASH=$ac_optarg ;;
1246    
1247 edhill 1.69 -makedepend | --makedepend | -md | --md)
1248     ac_prev=MAKEDEPEND ;;
1249     -makedepend=* | --makedepend=* | -md=* | --md=*)
1250     MAKEDEPEND=$ac_optarg ;;
1251 edhill 1.6
1252     -makefile | --makefile | -ma | --ma)
1253 edhill 1.4 ac_prev=MAKEFILE ;;
1254 edhill 1.6 -makefile=* | --makefile=* | -ma=* | --ma=*)
1255 edhill 1.2 MAKEFILE=$ac_optarg ;;
1256    
1257 edhill 1.41 -platform | --platform | -pl | --pl | -platform=* | --platform=* | -pl=* | --pl=*)
1258     echo "ERROR: The platform option has been removed. Please specify"
1259     echo " the build options using the \"optfile\" mechanism."
1260     echo
1261     usage
1262     ;;
1263 edhill 1.2
1264     -rootdir | --rootdir | -rd | --rd)
1265 edhill 1.4 ac_prev=ROOTDIR ;;
1266 edhill 1.2 -rootdir=* | --rootdir=* | -rd=* | --rd=*)
1267     ROOTDIR=$ac_optarg ;;
1268    
1269     -mods | --mods | -mo | --mo)
1270 edhill 1.4 ac_prev=MODS ;;
1271 edhill 1.2 -mods=* | --mods=* | -mo=* | --mo=*)
1272     MODS=$ac_optarg ;;
1273    
1274     -disable | --disable)
1275 edhill 1.4 ac_prev=DISABLE ;;
1276 edhill 1.2 -disable=* | --disable=*)
1277     DISABLE=$ac_optarg ;;
1278    
1279     -enable | --enable)
1280 edhill 1.4 ac_prev=ENABLE ;;
1281 edhill 1.2 -enable=* | --enable=*)
1282     ENABLE=$ac_optarg ;;
1283    
1284 edhill 1.12 -standarddirs | --standarddirs)
1285     ac_prev=STANDARDDIRS ;;
1286     -standarddirs=* | --standarddirs=*)
1287     STANDARDDIRS=$ac_optarg ;;
1288    
1289 edhill 1.2 # -cpp | --cpp)
1290     # ac_prev=cpp ;;
1291     # -cpp=* | --cpp=*)
1292     # CPP=$ac_optarg ;;
1293 edhill 1.91
1294     -cc | --cc)
1295     ac_prev=CC ;;
1296     -cc=* | --cc=*)
1297     CC=$ac_optarg ;;
1298    
1299 edhill 1.2 -fortran | --fortran | -fc | --fc)
1300 edhill 1.4 ac_prev=FC ;;
1301 edhill 1.2 -fc=* | --fc=*)
1302     FC=$ac_optarg ;;
1303    
1304 edhill 1.76 -fs | --fs)
1305     ac_prev=FS ;;
1306     -fs=* | --fs=*)
1307     FS=$ac_optarg ;;
1308    
1309     -fs90 | --fs90)
1310     ac_prev=FS90 ;;
1311     -fs90=* | --fs90=*)
1312     FS90=$ac_optarg ;;
1313    
1314 edhill 1.2 -ieee | --ieee)
1315 edhill 1.12 IEEE=true ;;
1316 edhill 1.2 -noieee | --noieee)
1317 edhill 1.12 IEEE= ;;
1318 adcroft 1.67
1319 jmc 1.203 -use_real4 | -use_r4 | -ur4 | --use_real4 | --use_r4 | --ur4 )
1320     USE_R4=true ;;
1321    
1322 ce107 1.126 -ts | --ts)
1323     TS=true ;;
1324 ce107 1.139 -papis | --papis)
1325     PAPIS=true ;;
1326 ce107 1.147 -pcls | --pcls)
1327     PCLS=true ;;
1328 ce107 1.139 -foolad | --foolad)
1329     FOOLAD=true ;;
1330     -papi | --papi)
1331     PAPI=true ;;
1332 ce107 1.147 -pcl | --pcl)
1333     PCL=true ;;
1334 ce107 1.139 -hpmt | --hpmt)
1335     HPMT=true ;;
1336    
1337     -gsl | --gsl)
1338     GSL=true ;;
1339 ce107 1.126
1340 ce107 1.160 -devel | --devel)
1341     DEVEL=true ;;
1342    
1343 adcroft 1.67 -mpi | --mpi)
1344     MPI=true ;;
1345     -mpi=* | --mpi=*)
1346     MPIPATH=$ac_optarg
1347     MPI=true ;;
1348 edhill 1.2
1349 jmc 1.187 -omp | --omp)
1350     OMP=true ;;
1351     -omp=* | --omp=*)
1352     OMPFLAG=$ac_optarg
1353     OMP=true ;;
1354 edhill 1.2
1355 edhill 1.5 -ds | --ds)
1356     DUMPSTATE=t ;;
1357    
1358 edhill 1.17 -taf_extra | --taf_extra)
1359     ac_prev=TAF_EXTRA ;;
1360     -taf_extra=* | --taf_extra=*)
1361     TAF_EXTRA=$ac_optarg ;;
1362    
1363     -tamc_extra | --tamc_extra)
1364     ac_prev=TAMC_EXTRA ;;
1365     -tamc_extra=* | --tamc_extra=*)
1366     TAMC_EXTRA=$ac_optarg ;;
1367 edhill 1.124
1368     -ignoretime | -ignore_time | --ignoretime | --ignore_time)
1369     IGNORE_TIME="-DIGNORE_TIME" ;;
1370 edhill 1.17
1371 edhill 1.141 -es | --es | -embed-source | --embed-source)
1372     EMBED_SRC=t ;;
1373    
1374 edhill 1.2 -*)
1375     echo "Error: unrecognized option: "$ac_option
1376     usage
1377     ;;
1378    
1379     *)
1380     echo "Error: unrecognized argument: "$ac_option
1381     usage
1382     ;;
1383    
1384     esac
1385 jmc 1.206
1386 edhill 1.1 done
1387    
1388 edhill 1.119
1389 edhill 1.12 if test -f ./.genmakerc ; then
1390     echo
1391     echo "WARNING: genmake2 has detected a copy of the old-style \"./.genmakerc\""
1392 jmc 1.161 echo " file. This file format is no longer supported. For directions on"
1393     echo " how to setup and use the new \"genmake2\" script, please see:"
1394 edhill 1.12 echo " http://mitgcm.org/devel_HOWTO/"
1395 jmc 1.161 echo " and send an email to MITgcm-support@mitgcm.org if you need help."
1396     echo "WARNING: ignore \"./.genmakerc\" and continue."
1397 jmc 1.206 echo
1398 edhill 1.12 fi
1399    
1400 edhill 1.97 # Find the MITgcm ${ROOTDIR}
1401 edhill 1.11 if test "x${ROOTDIR}" = x ; then
1402 edhill 1.112 tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1403 edhill 1.154 if test "x$tmp" = "xbin" -a -d ../model -a -d ../eesupp -a -d ../pkg ; then
1404 edhill 1.11 ROOTDIR=".."
1405     else
1406     for d in . .. ../.. ../../.. ../../../.. ../../../../.. ; do
1407     if [ -d "$d/model" -a -d "$d/eesupp" -a -d "$d/pkg" ]; then
1408     ROOTDIR=$d
1409 edhill 1.71 printf "Warning: ROOTDIR was not specified but there appears to be"
1410 edhill 1.11 echo " a copy of MITgcm at \"$ROOTDIR\" so we'll try it."
1411     break
1412     fi
1413     done
1414     fi
1415     fi
1416     if test "x${ROOTDIR}" = x ; then
1417     echo "Error: Cannot determine ROOTDIR for MITgcm code."
1418     echo " Please specify a ROOTDIR using either an options "
1419     echo " file or a command-line option."
1420     exit 1
1421     fi
1422     if test ! -d ${ROOTDIR} ; then
1423     echo "Error: the specified ROOTDIR (\"$ROOTDIR\") does not exist!"
1424     exit 1
1425     fi
1426    
1427 edhill 1.97 # Find the MITgcm ${THISVER}
1428 jmc 1.179 version_file="${ROOTDIR}/doc/tag-index"
1429     if test -f $version_file ; then
1430 jmc 1.200 THISVER=`$AWK '/^checkpoint/{print $1; exit}' $version_file`
1431 jmc 1.179 #- remove ./BUILD_INFO.h file if older than version_file
1432     if test -f ./BUILD_INFO.h -a ./BUILD_INFO.h -ot $version_file ; then
1433     echo " remove ./BUILD_INFO.h (older than ${version_file})"
1434     rm -f ./BUILD_INFO.h
1435     fi
1436 edhill 1.97 fi
1437    
1438 edhill 1.119 if test "x$MAKEFILE" = x ; then
1439     MAKEFILE="Makefile"
1440     fi
1441    
1442 edhill 1.1 echo " getting OPTFILE information: "
1443     if test "x${OPTFILE}" = x ; then
1444 edhill 1.11 if test "x$MITGCM_OF" = x ; then
1445     echo "Warning: no OPTFILE specified so we'll look for possible settings"
1446     printf "\n=== Searching for possible settings for OPTFILE ===\n"
1447     find_possible_configs
1448 edhill 1.1 else
1449 edhill 1.11 OPTFILE=$MITGCM_OF
1450     fi
1451     fi
1452     if test "x$OPTFILE" != xNONE ; then
1453     if test -f "$OPTFILE" -a -r "$OPTFILE" ; then
1454     echo " using OPTFILE=\"$OPTFILE\""
1455 edhill 1.34 . "$OPTFILE"
1456 edhill 1.11 RETVAL=$?
1457     if test "x$RETVAL" != x0 ; then
1458 edhill 1.71 printf "Error: failed to source OPTFILE \"$OPTFILE\""
1459 edhill 1.11 echo "--please check that variable syntax is bash-compatible"
1460 edhill 1.1 exit 1
1461     fi
1462 jmc 1.211 if test "x$DUMPSTATE" = xt ; then
1463 edhill 1.12 cp -f $OPTFILE "genmake_optfile"
1464 edhill 1.11 fi
1465     else
1466     echo "Error: can't read OPTFILE=\"$OPTFILE\""
1467     exit 1
1468 edhill 1.1 fi
1469     fi
1470 edhill 1.8
1471 edhill 1.14 echo " getting AD_OPTFILE information: "
1472     if test "x${AD_OPTFILE}" = x ; then
1473     if test "x$MITGCM_AD_OF" = x ; then
1474     AD_OPTFILE=$ROOTDIR/tools/adjoint_options/adjoint_default
1475     else
1476     AD_OPTFILE=$MITGCM_AD_OF
1477     fi
1478     fi
1479     if test "x${AD_OPTFILE}" != xNONE ; then
1480     if test -f "$AD_OPTFILE" -a -r "$AD_OPTFILE" ; then
1481     echo " using AD_OPTFILE=\"$AD_OPTFILE\""
1482 edhill 1.34 . "$AD_OPTFILE"
1483 edhill 1.14 RETVAL=$?
1484     if test "x$RETVAL" != x0 ; then
1485 edhill 1.71 printf "Error: failed to source AD_OPTFILE \"$AD_OPTFILE\""
1486 edhill 1.14 echo "--please check that variable syntax is bash-compatible"
1487     exit 1
1488     fi
1489 jmc 1.211 if test "x$DUMPSTATE" = xt ; then
1490 edhill 1.14 cp -f $AD_OPTFILE "genmake_ad_optfile"
1491     fi
1492     else
1493     echo "Error: can't read AD_OPTFILE=\"$AD_OPTFILE\""
1494     exit 1
1495     fi
1496     fi
1497    
1498 edhill 1.119 #====================================================================
1499     # Set default values if not set by the optfile
1500     #
1501 edhill 1.91 # Check that FC, CC, LINK, CPP, S64, LN, and MAKE are defined. If not,
1502 edhill 1.39 # either set defaults or complain and abort!
1503 edhill 1.71 if test ! "x$BASH" = x ; then
1504     # add a trailing space so that it works within the Makefile syntax (see below)
1505     BASH="$BASH "
1506     fi
1507 edhill 1.8 if test "x$FC" = x ; then
1508     cat <<EOF 1>&2
1509    
1510     Error: no Fortran compiler: please specify using one of the following:
1511     1) within the options file ("FC=...") as specified by "-of=OPTFILE"
1512     2) the "-fc=XXX" command-line option
1513 edhill 1.12 3) the "./genmake_local" file
1514 edhill 1.8 EOF
1515     exit 1
1516     fi
1517 edhill 1.91 if test "x$CC" = x ; then
1518 edhill 1.93 CC=cc
1519     # cat <<EOF 1>&2
1520     # Error: no C compiler: please specify using one of the following:
1521     # 1) within the options file ("CC=...") as specified by "-of=OPTFILE"
1522     # 2) the "-cc=XXX" command-line option
1523     # 3) the "./genmake_local" file
1524     # EOF
1525     # exit 1
1526 edhill 1.91 fi
1527 edhill 1.8 if test "x$LINK" = x ; then
1528     LINK=$FC
1529     fi
1530 edhill 1.39 if test "x$MAKE" = x ; then
1531     MAKE="make"
1532     fi
1533 edhill 1.63 if test "x$CPP" = x ; then
1534     CPP=cpp
1535     fi
1536     #EH3 === UGLY ===
1537 edhill 1.76 # The following is an ugly little hack to check for $CPP in /lib/ and
1538     # it should eventually be replaced with a more general function that
1539 edhill 1.63 # searches a combo of the user's path and a list of "usual suspects"
1540     # to find the correct location for binaries such as $CPP.
1541     for i in " " "/lib/" ; do
1542     echo "#define A a" | $i$CPP > test_cpp 2>&1 && CPP=$i$CPP
1543     done
1544     #EH3 === UGLY ===
1545 edhill 1.13 echo "#define A a" | $CPP > test_cpp 2>&1
1546 edhill 1.11 RETVAL=$?
1547     if test "x$RETVAL" != x0 ; then
1548 edhill 1.8 cat <<EOF 1>&2
1549    
1550 edhill 1.11 Error: C pre-processor "$CPP" failed the test case: please specify using:
1551    
1552 edhill 1.8 1) within the options file ("CPP=...") as specified by "-of=OPTFILE"
1553 edhill 1.12 2) the "./genmake_local" file
1554 edhill 1.30 3) with the CPP environment variable
1555 edhill 1.11
1556 edhill 1.8 EOF
1557     exit 1
1558 edhill 1.11 else
1559     rm -f test_cpp
1560 edhill 1.8 fi
1561 edhill 1.84 look_for_makedepend
1562 edhill 1.35 if test "x$LN" = x ; then
1563     LN="ln -s"
1564     fi
1565     echo "test" > genmake_test_ln
1566     $LN genmake_test_ln genmake_tlink
1567     RETVAL=$?
1568     if test "x$RETVAL" != x0 ; then
1569     cat <<EOF 1>&2
1570 edhill 1.29
1571 edhill 1.35 Error: The command "ln -s" failed -- please specify a working soft-link
1572     command in the optfile.
1573    
1574     EOF
1575     exit 1
1576     fi
1577 edhill 1.131 test -L genmake_tlink > /dev/null 2>&1
1578     RETVAL=$?
1579     if test "x$RETVAL" = x0 ; then
1580     HAVE_TEST_L=t
1581     fi
1582 edhill 1.35 rm -f genmake_test_ln genmake_tlink
1583 edhill 1.77
1584     # Check for broken *.F/*.f handling and fix if possible
1585     check_for_broken_Ff
1586 edhill 1.29
1587 adcroft 1.67 if test ! "x$MPI" = x ; then
1588     echo " Turning on MPI cpp macros"
1589 adcroft 1.68 DEFINES="$DEFINES -DALLOW_USE_MPI -DALWAYS_USE_MPI"
1590 adcroft 1.67 fi
1591 jmc 1.187 if test ! "x$OMP" = x ; then
1592     echo " Add OMPFLAG and turn on OpenMP cpp macros"
1593     FFLAGS="$FFLAGS $OMPFLAG"
1594     F90FLAGS="$F90FLAGS $OMPFLAG"
1595     DEFINES="$DEFINES -DUSE_OMP_THREADING"
1596     fi
1597 edhill 1.39
1598 jmc 1.203 if test ! "x$USE_R4" = x ; then
1599     echo " Turning on LET_RS_BE_REAL4 cpp flag"
1600     DEFINES="$DEFINES -DLET_RS_BE_REAL4"
1601     fi
1602    
1603 ce107 1.126 if test ! "x$TS" = x ; then
1604     echo " Turning on timing per timestep"
1605 ce107 1.139 if test ! "x$FOOLAD" = x ; then
1606     DEFINES="$DEFINES -DTIME_PER_TIMESTEP_SFP"
1607     else
1608     DEFINES="$DEFINES -DTIME_PER_TIMESTEP"
1609     fi
1610 ce107 1.164 PACKAGES="$PACKAGES showflops"
1611 ce107 1.139 fi
1612     if test ! "x$PAPIS" = x ; then
1613     echo " Turning on PAPI flop summary per timestep"
1614     echo " Please make sure PAPIINC, PAPILIB are defined"
1615     if test ! "x$FOOLAD" = x ; then
1616     DEFINES="$DEFINES -DUSE_PAPI_FLOPS_SFP"
1617     else
1618     DEFINES="$DEFINES -DUSE_PAPI_FLOPS"
1619     fi
1620     INCLUDES="$INCLUDES $PAPIINC"
1621     LIBS="$LIBS $PAPILIB"
1622 ce107 1.164 PACKAGES="$PACKAGES showflops"
1623 ce107 1.139 fi
1624 ce107 1.147 if test ! "x$PCLS" = x ; then
1625     echo " Turning on PCL counter summary per timestep"
1626     echo " Please make sure PCLINC, PCLLIB are defined"
1627     if test ! "x$FOOLAD" = x ; then
1628     DEFINES="$DEFINES -DUSE_PCL_FLOPS_SFP"
1629     else
1630     DEFINES="$DEFINES -DUSE_PCL_FLOPS"
1631     fi
1632     INCLUDES="$INCLUDES $PCLINC"
1633     LIBS="$LIBS $PCLLIB"
1634 ce107 1.164 PACKAGES="$PACKAGES showflops"
1635 ce107 1.147 fi
1636 ce107 1.139 if test ! "x$PAPI" = x ; then
1637     if test ! "x$PAPIS" = x ; then
1638     echo " PAPI performance analysis and flop summary per timestep cannot co-exist!"
1639     echo " Sticking with PAPI flop summary per timestep!"
1640     else
1641     echo " Turning on performance analysis with PAPI"
1642     echo " Please make sure PAPIINC, PAPILIB are defined"
1643     DEFINES="$DEFINES -DUSE_PAPI"
1644     INCLUDES="$INCLUDES $PAPIINC"
1645     LIBS="$LIBS $PAPILIB"
1646     fi
1647     fi
1648 ce107 1.147 if test ! "x$PCL" = x ; then
1649     if test ! "x$PCLS" = x ; then
1650     echo " PCL performance analysis and flop summary per timestep cannot co-exist!"
1651     echo " Sticking with PCL flop summary per timestep!"
1652     else
1653     echo " Turning on performance analysis with PCL"
1654     echo " Please make sure PCLINC, PCLLIB are defined"
1655     DEFINES="$DEFINES -DUSE_PCL"
1656     INCLUDES="$INCLUDES $PCLINC"
1657     LIBS="$LIBS $PCLLIB"
1658     fi
1659     fi
1660 ce107 1.139 if test ! "x$HPMT" = x ; then
1661     if test ! "x$PAPI" = x ; then
1662     echo " PAPI and the HPM Toolkit cannot co-exist!"
1663     echo " Sticking with PAPI!"
1664 ce107 1.147 else if test ! "x$PCL" = x ; then
1665     echo " PCL and the HPM Toolkit cannot co-exist!"
1666     echo " Sticking with PCL!"
1667 ce107 1.139 else
1668     echo " Turning on performance analysis with the HPM Toolkit"
1669     echo " Please make sure HPMTINC, HPMTLIB are defined"
1670     DEFINES="$DEFINES -DUSE_LIBHPM"
1671     INCLUDES="$INCLUDES $HPMTINC"
1672     LIBS="$LIBS $HPMTLIB"
1673     fi
1674 ce107 1.148 fi
1675 ce107 1.139 fi
1676     if test ! "x$GSL" = x ; then
1677     echo " Turning on use of GSL to control floating point calculations"
1678     echo " Please make sure GSLINC, GSLLIB are defined"
1679     DEFINES="$DEFINES -DUSE_GSL_IEEE"
1680     INCLUDES="$INCLUDES $GSLINC"
1681     LIBS="$LIBS $GSLLIB"
1682 ce107 1.126 fi
1683 jmc 1.181 #- if USE_EXTENDED_SRC is set, add EXTENDED_SRC_FLAG to FFLAGS :
1684     if test ! "x$USE_EXTENDED_SRC" = x ; then
1685     FFLAGS="$FFLAGS $EXTENDED_SRC_FLAG"
1686     F90FIXEDFORMAT="$F90FIXEDFORMAT $EXTENDED_SRC_FLAG"
1687     fi
1688 ce107 1.126
1689 edhill 1.29 printf "\n=== Checking system libraries ===\n"
1690 edhill 1.71 printf " Do we have the system() command using $FC... "
1691 edhill 1.118 cat > genmake_tcomp.$FS <<EOF
1692 edhill 1.29 program hello
1693     call system('echo hi')
1694     end
1695     EOF
1696 edhill 1.134 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1697 edhill 1.29 RETVAL=$?
1698     if test "x$RETVAL" = x0 ; then
1699     HAVE_SYSTEM=t
1700     DEFINES="$DEFINES -DHAVE_SYSTEM"
1701     echo "yes"
1702     else
1703     HAVE_SYSTEM=
1704     echo "no"
1705     fi
1706     rm -f genmake_tcomp*
1707    
1708 edhill 1.71 printf " Do we have the fdate() command using $FC... "
1709 edhill 1.118 cat > genmake_tcomp.$FS <<EOF
1710 edhill 1.29 program hello
1711 edhill 1.129 CHARACTER*(128) string
1712 edhill 1.29 string = ' '
1713     call fdate( string )
1714     print *, string
1715     end
1716     EOF
1717 edhill 1.134 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1718 edhill 1.29 RETVAL=$?
1719     if test "x$RETVAL" = x0 ; then
1720     HAVE_FDATE=t
1721     DEFINES="$DEFINES -DHAVE_FDATE"
1722     echo "yes"
1723     else
1724     HAVE_FDATE=
1725     echo "no"
1726     fi
1727     rm -f genmake_tcomp*
1728    
1729 cnh 1.81 printf " Do we have the etime() command using $FC... "
1730 edhill 1.118 cat > genmake_tcomp.$FS <<EOF
1731 cnh 1.81 program hello
1732 cnh 1.82 REAL*4 ACTUAL, TARRAY(2)
1733     EXTERNAL ETIME
1734     REAL*4 ETIME
1735     actual = etime( tarray )
1736 cnh 1.81 print *, tarray
1737     end
1738     EOF
1739 edhill 1.134 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1740 cnh 1.81 RETVAL=$?
1741     if test "x$RETVAL" = x0 ; then
1742     HAVE_ETIME=t
1743     DEFINES="$DEFINES -DHAVE_ETIME"
1744     echo "yes"
1745     else
1746     HAVE_ETIME=
1747     echo "no"
1748     fi
1749     rm -f genmake_tcomp*
1750    
1751 edhill 1.71 printf " Can we call simple C routines (here, \"cloc()\") using $FC... "
1752 edhill 1.39 check_HAVE_CLOC
1753     if test "x$HAVE_CLOC" != x ; then
1754     echo "yes"
1755     else
1756     echo "no"
1757 edhill 1.141 if test "x$EMBED_SRC" = xt ; then
1758     echo " WARNING: you requested file embedding but it has"
1759     echo " been disabled since C code cannot be called"
1760     EMBED_SRC=
1761     fi
1762 edhill 1.29 fi
1763 edhill 1.39 rm -f genmake_t*
1764 edhill 1.29
1765 edhill 1.130 printf " Can we unlimit the stack size using $FC... "
1766     check_HAVE_SETRLSTK
1767 edhill 1.151 if test "x$HAVE_SETRLSTK" = xt ; then
1768 edhill 1.130 echo "yes"
1769     else
1770     echo "no"
1771     fi
1772     rm -f genmake_t*
1773    
1774 edhill 1.137 printf " Can we register a signal handler using $FC... "
1775     check_HAVE_SIGREG
1776 edhill 1.150 if test "x$HAVE_SIGREG" = xt ; then
1777 edhill 1.137 echo "yes"
1778     else
1779     echo "no"
1780     fi
1781     rm -f genmake_t*
1782    
1783 edhill 1.108 printf " Can we use stat() through C calls... "
1784     check_HAVE_STAT
1785     if test "x$HAVE_STAT" != x ; then
1786     echo "yes"
1787     else
1788     echo "no"
1789     fi
1790     rm -f genmake_t*
1791    
1792 edhill 1.71 printf " Can we create NetCDF-enabled binaries... "
1793 edhill 1.60 check_netcdf_libs
1794     if test "x$HAVE_NETCDF" != x ; then
1795     echo "yes"
1796     else
1797     echo "no"
1798     fi
1799 edhill 1.124 DEFINES="$DEFINES $IGNORE_TIME"
1800 edhill 1.8
1801 edhill 1.141 if test "x$EMBED_SRC" = xt ; then
1802     build_embed_encode
1803     fi
1804     if test "x$EMBED_SRC" = xt ; then
1805     ENABLE="$ENABLE embed_files"
1806     fi
1807    
1808    
1809 edhill 1.2 printf "\n=== Setting defaults ===\n"
1810 jmc 1.185 printf " Adding MODS directories: "
1811 edhill 1.1 for d in $MODS ; do
1812     if test ! -d $d ; then
1813 edhill 1.2 echo
1814     echo "Error: MODS directory \"$d\" not found!"
1815 edhill 1.1 exit 1
1816     else
1817 jmc 1.185 printf "$d "
1818 edhill 1.1 SOURCEDIRS="$SOURCEDIRS $d"
1819     INCLUDEDIRS="$INCLUDEDIRS $d"
1820     fi
1821     done
1822     echo
1823    
1824     if test "x${PLATFORM}" = x ; then
1825     PLATFORM=$p_PLATFORM
1826     fi
1827    
1828     if test "x${EXEDIR}" = x ; then
1829 edhill 1.112 tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1830 edhill 1.87 if test "x$tmp" = "xbin" -a -d ../exe -a $ROOTDIR = .. ; then
1831 edhill 1.1 EXEDIR=../exe
1832     else
1833     EXEDIR=.
1834     fi
1835     fi
1836     if test ! -d ${EXEDIR} ; then
1837     echo "Error: the specified EXEDIR (\"$EXEDIR\") does not exist!"
1838     exit 1
1839     fi
1840    
1841     if test "x${TOOLSDIR}" = x ; then
1842     TOOLSDIR="$ROOTDIR/tools"
1843     fi
1844     if test ! -d ${TOOLSDIR} ; then
1845 cnh 1.65 echo "Error: the specified TOOLSDIR (\"$TOOLSDIR\") does not exist!"
1846 edhill 1.1 exit 1
1847     fi
1848 edhill 1.11 if test "x$S64" = x ; then
1849 edhill 1.104 echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.sh > /dev/null 2>&1
1850     RETVAL=$?
1851     if test "x${RETVAL}" = x0 ; then
1852     S64='$(TOOLSDIR)/set64bitConst.sh'
1853     else
1854     echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.csh > /dev/null 2>&1
1855     RETVAL=$?
1856     if test "x${RETVAL}" = x0 ; then
1857     S64='$(TOOLSDIR)/set64bitConst.csh'
1858     else
1859     cat <<EOF
1860    
1861     ERROR: neither of the two default scripts:
1862    
1863     ${TOOLSDIR}/set64bitConst.sh
1864     ${TOOLSDIR}/set64bitConst.csh
1865    
1866 jmc 1.206 are working so please check paths or specify (with \$S64) a
1867 edhill 1.104 working version of this script.
1868    
1869     EOF
1870     exit 1
1871     fi
1872     fi
1873 edhill 1.11 fi
1874 adcroft 1.44 THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`
1875 edhill 1.1
1876     EXECUTABLE=${EXECUTABLE:-mitgcmuv}
1877    
1878 jmc 1.205 # Set Standard Code Directories:
1879     if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
1880     STANDARDDIRS="eesupp model"
1881     fi
1882     # if model in Standard-Code-Dir, add eesupp (needed to compile model)
1883     echo " $STANDARDDIRS " | grep ' model ' > /dev/null 2>&1
1884     ckM=$?
1885     echo " $STANDARDDIRS " | grep ' eesupp ' > /dev/null 2>&1
1886     ckE=$?
1887 jmc 1.206 if test $ckM = 0 -a $ckE = 1 ; then
1888 jmc 1.205 STANDARDDIRS="$STANDARDDIRS eesupp"
1889     fi
1890    
1891 edhill 1.1 # We have a special set of source files in eesupp/src which are
1892     # generated from some template source files. We'll make them first so
1893     # they appear as regular source code
1894     if test -r $ROOTDIR"/eesupp/src/Makefile" ; then
1895     echo " Making source files in eesupp from templates"
1896 jmc 1.207 ( cd $ROOTDIR"/eesupp/src/" && $MAKE clean_old && $MAKE \
1897     ) > make_eesupp.errors 2>&1
1898 edhill 1.1 RETVAL=$?
1899 edhill 1.2 if test "x${RETVAL}" = x0 ; then
1900 edhill 1.1 rm -f make_eesupp.errors
1901     else
1902     echo "Error: problem encountered while building source files in eesupp:"
1903 edhill 1.62 cat make_eesupp.errors 1>&2
1904 edhill 1.1 exit 1
1905 afe 1.58 fi
1906     fi
1907    
1908 edhill 1.154 #same for pkg/exch2 and pkg/regrid
1909     for pdir in exch2 regrid ; do
1910     if test -r $ROOTDIR"/pkg/${pdir}/Makefile" ; then
1911     echo " Making source files in pkg/${pdir} from templates"
1912 jmc 1.207 ( cd $ROOTDIR"/pkg/"${pdir} && $MAKE clean_old && $MAKE \
1913     ) > make_${pdir}.errors 2>&1
1914 edhill 1.154 RETVAL=$?
1915     if test "x${RETVAL}" = x0 ; then
1916     rm -f make_${pdir}.errors
1917     else
1918     echo "Error: problem encountered while building source files in pkg/${pdir}:"
1919     cat make_${pdir}.errors 1>&2
1920     exit 1
1921     fi
1922 edhill 1.1 fi
1923 edhill 1.154 done
1924 edhill 1.1
1925 edhill 1.2 printf "\n=== Determining package settings ===\n"
1926 jmc 1.208 if test "x${PKG_DEPEND}" = x ; then
1927 edhill 1.1 tmp=$ROOTDIR"/pkg/pkg_depend"
1928 jmc 1.208 if test -r $tmp ; then PKG_DEPEND=$tmp ; fi
1929     fi
1930     if test "x${PKG_DEPEND}" = x ; then
1931 edhill 1.1 echo "Warning: No package dependency information was specified."
1932     echo " Please check that ROOTDIR/pkg/pkg_depend exists."
1933 jmc 1.208 else
1934     if test ! -r ${PKG_DEPEND} ; then
1935     echo "Error: can't read package dependency info from PKG_DEPEND=\"$PKG_DEPEND\""
1936     exit 1
1937 edhill 1.1 fi
1938 jmc 1.208 echo " getting package dependency info from $PKG_DEPEND"
1939     # Strip the comments and then convert the dependency file into arrays: PNAME, DNAME
1940     get_pdepend_list $PKG_DEPEND
1941     fi
1942    
1943     # A default package groups file "$ROOTDIR/pkg/pkg_groups" is provided
1944     # to define the "default_pkg_list" and package groups (for convenience, one
1945     # can specify a group of packages using names like "ocean" and "atmosphere").
1946     if test "x${PKG_GROUPS}" = x ; then
1947     tmp=$ROOTDIR"/pkg/pkg_groups"
1948     if test -r $tmp ; then PKG_GROUPS=$tmp ; fi
1949     fi
1950     if test "x${PKG_GROUPS}" = x ; then
1951     echo "Warning: No package groups information was specified."
1952     echo " Please check that ROOTDIR/pkg/pkg_groups exists."
1953 edhill 1.1 else
1954 jmc 1.208 if test ! -r ${PKG_GROUPS} ; then
1955     echo "Error: can't read package groups info from PKG_GROUPS=\"$PKG_GROUPS\""
1956 edhill 1.1 exit 1
1957     fi
1958 jmc 1.208 echo " getting package groups info from $PKG_GROUPS"
1959 edhill 1.1 fi
1960 jmc 1.208
1961     # Search for packages to compile.
1962     echo " checking list of packages to compile:"
1963     PKG_LIST=
1964     if test "x${PKG_LIST}" = x ; then
1965 edhill 1.12 for i in "." $MODS ; do
1966     if test -r $i"/packages.conf" ; then
1967 jmc 1.208 PKG_LIST=$i"/packages.conf"
1968 edhill 1.12 break
1969     fi
1970     done
1971     fi
1972 jmc 1.208 if test "x${PKG_LIST}" = x ; then
1973     pkg_list='default_pkg_list'
1974     if test "x${PKG_GROUPS}" = x ; then
1975     echo "Error: need package groups info to expand pkg_list=\"$pkg_list\""
1976     exit 1
1977     fi
1978 edhill 1.1 else
1979 jmc 1.208 if test ! -r $PKG_LIST ; then
1980     echo "Error: can't read package list from PKG_LIST=\"$PKG_LIST\""
1981     exit 1
1982 edhill 1.1 else
1983 jmc 1.208 echo " using PKG_LIST=\"$PKG_LIST\""
1984 edhill 1.1 # Strip the comments and add all the names
1985 jmc 1.208 pkg_list=`cat $PKG_LIST | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
1986 edhill 1.1 RETVAL=$?
1987     if test "x${RETVAL}" != x0 ; then
1988 jmc 1.208 printf "Error: can't parse package list "
1989     echo "-- please check PKG_LIST=\"$PKG_LIST\""
1990 edhill 1.1 exit 1
1991     fi
1992     fi
1993     fi
1994 jmc 1.208 for i in $pkg_list ; do
1995     PACKAGES="$PACKAGES $i"
1996     done
1997     echo " before group expansion packages are:$PACKAGES"
1998     if test "x${PKG_GROUPS}" != x ; then
1999     RET=1
2000     while test $RET = 1 ; do expand_pkg_groups; RET=$?; done
2001     echo " after group expansion packages are: $PACKAGES"
2002     fi
2003 edhill 1.1
2004     echo " applying DISABLE settings"
2005 jmc 1.205 echo "" > ./.tmp_pack
2006 adcroft 1.74 for i in $PACKAGES ; do
2007     echo $i >> ./.tmp_pack
2008     done
2009     for i in `grep "-" ./.tmp_pack` ; do
2010     j=`echo $i | sed 's/[-]//'`
2011     DISABLE="$DISABLE $j"
2012     done
2013 edhill 1.1 pack=
2014     for p in $PACKAGES ; do
2015     addit="t"
2016     for d in $DISABLE ; do
2017     if test "x$p" = "x$d" ; then
2018     addit="f"
2019     fi
2020     done
2021     if test "x$addit" = xt ; then
2022     pack="$pack $p"
2023     fi
2024     done
2025     PACKAGES="$pack"
2026     echo " applying ENABLE settings"
2027 edhill 1.12 echo "" > ./.tmp_pack
2028 edhill 1.1 PACKAGES="$PACKAGES $ENABLE"
2029 adcroft 1.74 # Test if each explicitly referenced package exists
2030 edhill 1.1 for i in $PACKAGES ; do
2031 adcroft 1.74 j=`echo $i | sed 's/[-+]//'`
2032     if test ! -d "$ROOTDIR/pkg/$j" ; then
2033 jmc 1.208 echo "Error: dir '$ROOTDIR/pkg/$i' missing for package '$i'"
2034 adcroft 1.74 exit 1
2035 edhill 1.1 fi
2036     echo $i >> ./.tmp_pack
2037     done
2038     PACKAGES=
2039 adcroft 1.74 for i in `grep -v "-" ./.tmp_pack | sort | uniq` ; do
2040 edhill 1.1 PACKAGES="$PACKAGES $i"
2041     done
2042 adcroft 1.74 rm -f ./.tmp_pack
2043 jmc 1.205 echo " packages are: $PACKAGES"
2044 edhill 1.1
2045 jmc 1.206 # Check for package MNC: if NetCDF is available, then build the MNC
2046 jmc 1.161 # template files ; otherwise, delete mnc from the list of packages.
2047 jmc 1.205 echo " $PACKAGES " | grep ' mnc ' > /dev/null 2>&1
2048 jmc 1.206 mnc_in=$?
2049     if test "x$HAVE_NETCDF" != xt ; then
2050     if test "x$mnc_in" = x0 ; then
2051 edhill 1.100 cat <<EOF
2052     *********************************************************************
2053     WARNING: the "mnc" package was enabled but tests failed to compile
2054     NetCDF applications. Please check that:
2055    
2056     1) NetCDF is correctly installed for this compiler and
2057 jmc 1.206 2) the LIBS variable (within the "optfile") specifies the correct
2058 edhill 1.100 NetCDF library to link against.
2059    
2060     Due to this failure, the "mnc" package is now DISABLED.
2061     *********************************************************************
2062     EOF
2063     PACKAGES=`echo $PACKAGES | sed -e 's/mnc//g'`
2064     DISABLE="$DISABLE mnc"
2065     else
2066 jmc 1.206 # this prevent to add mnc (due to pdepend rules) if not available
2067     DISABLE="$DISABLE mnc"
2068     fi
2069     else
2070     # we have NetCDF, we try to build MNC template files
2071     ( cd $ROOTDIR"/pkg/mnc" && $MAKE testclean && $MAKE templates ) > make_mnc.errors 2>&1
2072     RETVAL=$?
2073     if test "x${RETVAL}" = x0 ; then
2074     rm -f make_mnc.errors
2075     else
2076     echo "Error: problem encountered while building source files in pkg/mnc:"
2077     cat make_mnc.errors 1>&2
2078     if test "x$mnc_in" = x0 ; then
2079     exit 1
2080 edhill 1.100 else
2081 jmc 1.206 DISABLE="$DISABLE mnc"
2082 edhill 1.100 fi
2083     fi
2084     fi
2085    
2086 jmc 1.161 # Check for package PROFILES: if NetCDF is not available,
2087     # then delete profiles from the list of available packages.
2088 jmc 1.206 if test "x$HAVE_NETCDF" != xt ; then
2089     echo " $PACKAGES " | grep ' profiles ' > /dev/null 2>&1
2090     RETVAL=$?
2091     if test "x$RETVAL" = x0 ; then
2092 jmc 1.161 cat <<EOF
2093     *********************************************************************
2094     WARNING: the "profiles" package was enabled but tests failed to
2095     compile NetCDF applications. Please check that:
2096    
2097     1) NetCDF is correctly installed for this compiler and
2098 jmc 1.206 2) the LIBS variable (within the "optfile") specifies the correct
2099 jmc 1.161 NetCDF library to link against.
2100    
2101     Due to this failure, the "profiles" package is now DISABLED.
2102     *********************************************************************
2103     EOF
2104     PACKAGES=`echo $PACKAGES | sed -e 's/profiles//g'`
2105     DISABLE="$DISABLE profiles"
2106 jmc 1.206 else
2107     # this prevent to add profiles (due to pdepend rules) if not available
2108     DISABLE="$DISABLE profiles"
2109 jmc 1.161 fi
2110     fi
2111    
2112 jmc 1.208 if test "x${PKG_DEPEND}" != x ; then
2113     echo " applying package dependency rules"
2114     ck=
2115     while test "x$ck" != xtt ; do
2116 edhill 1.1 i=0
2117 edhill 1.2 # rtot=${#PNAME[@]}
2118     rtot=$nname
2119 jmc 1.162 while test $i -le $rtot ; do
2120 edhill 1.1
2121     # Is $pname in the current $PACKAGES list?
2122 edhill 1.2 # pname=${PNAME[$i]}
2123     tmp="pname=\"\$PNAME_$i\""
2124     eval $tmp
2125 edhill 1.1 pin="f"
2126     for p in $PACKAGES ; do
2127     if test "x$p" = "x$pname" ; then
2128     pin="t"
2129     fi
2130     done
2131 jmc 1.205 # or in the current $STANDARDDIRS list?
2132     for p in $STANDARDDIRS ; do
2133     if test "x$p" = "x$pname" ; then pin="t" ; fi
2134     done
2135 edhill 1.1
2136     # Is the DNAME entry a (+) or (-) rule ?
2137 edhill 1.2 tmp="dname=\"\$DNAME_$i\""
2138     eval $tmp
2139 edhill 1.1 plus="-"
2140 edhill 1.2 echo $dname | grep '^+' > /dev/null 2>&1
2141 edhill 1.1 RETVAL=$?
2142     if test "x$RETVAL" = x0 ; then
2143     plus="+"
2144     fi
2145    
2146     # Is $dname in the current $PACKAGES list?
2147 edhill 1.2 dname=`echo $dname | sed -e 's/^[+-]//'`
2148 edhill 1.1 din="f"
2149     for p in $PACKAGES ; do
2150     if test "x$p" = "x$dname" ; then
2151     din="t"
2152     fi
2153     done
2154    
2155     # Do we need to add $dname according to the dependency rules?
2156     if test "x$pin" = xt -a "x$plus" = "x+" -a "x$din" = xf ; then
2157 jmc 1.162 #echo " " $pname ": need to add :" $dname
2158 edhill 1.1 in_dis="f"
2159     for dis in $DISABLE ; do
2160     if test "x$dis" = "x$dname" ; then
2161     in_dis="t"
2162     fi
2163     done
2164     if test "x$in_dis" = xt ; then
2165     echo "Error: can't satisfy package dependencies:"
2166     echo " \"$dname\" is required by the dependency rules"
2167     echo " but is disallowed by the DISABLE settings"
2168     exit 1
2169     else
2170     PACKAGES="$PACKAGES $dname"
2171     ck=
2172     fi
2173     fi
2174    
2175     # Do we need to get rid of $dname according to the dependency rules?
2176     if test "x$pin" = xt -a "x$plus" = "x-" -a "x$din" = xt; then
2177     echo "Error: can't satisfy package dependencies:"
2178 jmc 1.206 echo " \"$pname\" was requested but is disallowed by"
2179 edhill 1.1 echo " the dependency rules for \"$dname\""
2180     exit 1
2181     fi
2182 edhill 1.87 i=`echo "$i + 1" | bc -l`
2183     #i=$(( $i + 1 ))
2184 edhill 1.1 done
2185     ck=$ck"t"
2186 jmc 1.208 done
2187     echo " packages are: $PACKAGES"
2188     fi
2189 edhill 1.1 for i in $PACKAGES ; do
2190     adr="$ROOTDIR/pkg/$i"
2191     if test -d $adr ; then
2192     SOURCEDIRS="$SOURCEDIRS $adr"
2193     INCLUDEDIRS="$INCLUDEDIRS $adr"
2194 edhill 1.14 if test "x$i" = xautodiff ; then
2195     AUTODIFF_PKG_USED=t
2196     fi
2197 edhill 1.1 else
2198     echo "Error: the directory \"$adr\" for package $i doesn't exist"
2199     exit 1
2200     fi
2201     done
2202    
2203 edhill 1.12 # Create a list of #define and #undef to enable/disable packages
2204     PACKAGES_DOT_H=PACKAGES_CONFIG.h
2205 jmc 1.206 # The following UGLY HACK sets multiple "#undef"s and it needs to go
2206     # away. On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h
2207 edhill 1.1 # file would eventually be split up so that all package-related #define
2208     # statements could be separated and handled only by genmake.
2209     names=`ls -1 "$ROOTDIR/pkg"`
2210     all_pack=
2211 adcroft 1.44 DISABLED_PACKAGES=
2212 edhill 1.1 for n in $names ; do
2213     if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
2214     has_pack="f"
2215     for pack in $PACKAGES ; do
2216     if test "x$pack" = "x$n" ; then
2217     has_pack="t"
2218     break
2219     fi
2220     done
2221     if test "x$has_pack" = xf ; then
2222 edhill 1.116 undef=`echo "ALLOW_$n" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2223 adcroft 1.44 DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
2224 edhill 1.1 fi
2225     fi
2226     done
2227 adcroft 1.44 ENABLED_PACKAGES=
2228 edhill 1.1 for i in $PACKAGES ; do
2229 edhill 1.116 def=`echo "ALLOW_$i" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2230 adcroft 1.44 ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
2231 edhill 1.12 #eh3 DEFINES="$DEFINES -D$def"
2232 edhill 1.1
2233     #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
2234 jmc 1.206 case $i in
2235 edhill 1.1 aim_v23)
2236 adcroft 1.46 ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
2237 jmc 1.55 echo "Warning: ALLOW_AIM is set to enable aim_v23."
2238 edhill 1.1 ;;
2239     esac
2240     #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
2241    
2242     done
2243    
2244 jmc 1.205 echo " Adding STANDARDDIRS='$STANDARDDIRS'"
2245 edhill 1.1 BUILDDIR=${BUILDDIR:-.}
2246 edhill 1.57 if test "x$STANDARDDIRS" != x ; then
2247     for d in $STANDARDDIRS ; do
2248     adr="$ROOTDIR/$d/src"
2249     if test ! -d $adr ; then
2250     echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2251     echo " is correct and that you correctly specified the STANDARDDIRS option"
2252     exit 1
2253     else
2254     SOURCEDIRS="$SOURCEDIRS $adr"
2255     fi
2256     adr="$ROOTDIR/$d/inc"
2257     if test ! -d $adr ; then
2258     echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2259     echo " is correct and that you correctly specified the STANDARDDIRS option"
2260     exit 1
2261     else
2262     INCLUDEDIRS="$INCLUDEDIRS $adr"
2263     fi
2264     done
2265     fi
2266 edhill 1.1
2267 adcroft 1.52 echo " Searching for *OPTIONS.h files in order to warn about the presence"
2268     echo " of \"#define \"-type statements that are no longer allowed:"
2269 edhill 1.12 CPP_OPTIONS=
2270 adcroft 1.52 CPP_EEOPTIONS=
2271 edhill 1.12 spaths=". $INCLUDEDIRS"
2272 adcroft 1.52 names=`ls -1 "$ROOTDIR/pkg"`
2273 edhill 1.12 for i in $spaths ; do
2274     try="$i/CPP_OPTIONS.h"
2275 edhill 1.54 if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
2276 edhill 1.12 echo " found CPP_OPTIONS=\"$try\""
2277     CPP_OPTIONS="$try"
2278 adcroft 1.52 # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
2279     for n in $names ; do
2280     test_for_package_in_cpp_options $CPP_OPTIONS $n
2281     done
2282     fi
2283     try="$i/CPP_EEOPTIONS.h"
2284 edhill 1.54 if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
2285 adcroft 1.52 echo " found CPP_EEOPTIONS=\"$try\""
2286     # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
2287     #**** not yet enabled ****
2288     # test_for_mpi_in_cpp_eeoptions $try
2289     #**** not yet enabled ****
2290     CPP_EEOPTIONS="$try"
2291 edhill 1.12 fi
2292     done
2293     if test "x$CPP_OPTIONS" = x ; then
2294     echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
2295     exit 1
2296     fi
2297 edhill 1.1
2298 edhill 1.14 # Here, we build the list of files to be "run through" the adjoint
2299     # compiler.
2300 jmc 1.176 if test -f ./adSrcFiles.tmp ; then
2301     rm -f ./adSrcFiles.tmp
2302 edhill 1.14 fi
2303     echo " Creating the list of files for the adjoint compiler."
2304 jmc 1.207 touch adSrcFiles.tmp
2305 edhill 1.14 for i in $SOURCEDIRS ; do
2306     list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
2307     for j in $list_files ; do
2308 jmc 1.176 cat $i/$j >> adSrcFiles.tmp
2309 edhill 1.14 done
2310     done
2311 edhill 1.121 if test ! "x"$FS = "x.f" ; then
2312 jmc 1.176 cat adSrcFiles.tmp | sed -e "s/\.f/.$FS/g" > adSrcFiles.tmp_f
2313     mv -f adSrcFiles.tmp_f adSrcFiles.tmp
2314 edhill 1.121 fi
2315 edhill 1.14
2316 edhill 1.2 echo
2317     echo "=== Creating the Makefile ==="
2318 edhill 1.1 echo " setting INCLUDES"
2319     for i in $INCLUDEDIRS ; do
2320 edhill 1.87 if test ! -d $i ; then
2321 edhill 1.1 echo "Warning: can't find INCLUDEDIRS=\"$i\""
2322     fi
2323     done
2324    
2325 ce107 1.139 if test ! "x$DIVA" = x ; then
2326 ce107 1.140 echo " Creating the pseudo-MPI include directory"
2327 ce107 1.139 INCLUDES="-I./mpi_headers $INCLUDES"
2328     rm -rf ./mpi_headers
2329     mkdir -p ./mpi_headers
2330    
2331     if test "x$MPIINCLUDEDIR" = x ; then
2332     if test "x$MPIHOME" = x ; then
2333     MPIHOME='/usr'
2334     fi
2335     MPIINCLUDEDIR='$MPIHOME/include'
2336     fi
2337 jmc 1.206
2338 ce107 1.139 if test -r $MPIINCLUDEDIR/mpif.h ; then
2339     for i in $MPI_HEADER_FILES; do
2340     cp -p $MPIINCLUDEDIR/$i ./mpi_headers
2341     done
2342    
2343     perl -i -pe 's/MPI_DISPLACEMENT_CURRENT=-1_8/MPI_DISPLACEMENT_CURRENT=-1/g' mpi_headers/mpif.h
2344     else
2345     echo " We cannot create a copy of mpif.h!"
2346 heimbach 1.156 # exit -1
2347 ce107 1.139 fi
2348     fi
2349    
2350 edhill 1.1 echo " Determining the list of source and include files"
2351     rm -rf .links.tmp
2352     mkdir .links.tmp
2353 edhill 1.142 touch .links.tmp/foo
2354     if test ! -r ".links.tmp/foo" ; then
2355     echo
2356     echo "ERROR : something is wrong with your directory permissions or"
2357     echo " your user file-creation mask (\"umask\") since creating a"
2358     echo " sub-dir, touch-ing a file within it, and then reading it is"
2359     echo " not working. Please try setting your umask to something"
2360     echo " sane such as:"
2361     echo
2362     echo " umask 0002"
2363     echo
2364     echo " and please verify that you have the proper permissions for"
2365     echo " creating sub-directories and then reading files created"
2366     echo " within them."
2367     echo
2368     exit 1
2369     fi
2370     rm -f .links.tmp/foo
2371 jmc 1.176
2372 jmc 1.206 if test "x$OPENAD" != x ; then
2373 jmc 1.176 OAD_DONT_COMPILE="/dev/null"
2374     OAD_DONT_TRANSFORM="/dev/null"
2375     OAD_KEEP_ORIGINAL="/dev/null"
2376     OAD_CB2M_FILES="/dev/null"
2377     echo " looking for dontCompile file: "
2378     for i in "." $MODS ; do
2379     if test -r $i"/dontCompile" ; then
2380     OAD_DONT_COMPILE=$i"/dontCompile"
2381     echo " found $OAD_DONT_COMPILE"
2382     break
2383     fi
2384     done
2385     echo " looking for dontTransform file: "
2386     for i in "." $MODS ; do
2387     if test -r $i"/dontTransform" ; then
2388     OAD_DONT_TRANSFORM=$i"/dontTransform"
2389     echo " found $OAD_DONT_TRANSFORM"
2390     break
2391     fi
2392     done
2393     echo " looking for keepOriginal file: "
2394     for i in "." $MODS ; do
2395     if test -r $i"/keepOriginal" ; then
2396     OAD_KEEP_ORIGINAL=$i"/keepOriginal"
2397     echo " found $OAD_KEEP_ORIGINAL"
2398     break
2399     fi
2400     done
2401     echo " looking for cb2mFiles: "
2402     for i in "." $MODS ; do
2403     if test -r $i"/cb2mFiles" ; then
2404     OAD_CB2M_FILES=$i"/cb2mFiles"
2405     echo " found $OAD_CB2M_FILES"
2406     break
2407     fi
2408     done
2409     echo " OpenAD exceptions: "
2410     fi
2411    
2412 edhill 1.1 echo "# This section creates symbolic links" > srclinks.tmp
2413     echo "" >> srclinks.tmp
2414 jmc 1.176 printf 'F77_SRC_FILES = ' > F77srclist.tmp
2415     printf 'NON_AD_F77_SRC_FILES = ' > nonADF77srclist.tmp
2416     printf 'C_SRC_FILES = ' > csrclist.tmp
2417     printf 'F90_SRC_FILES = ' > F90srclist.tmp
2418     printf 'H_SRC_FILES = ' > hsrclist.tmp
2419     printf 'AD_FLOW_FILES = ' > ad_flow_files.tmp
2420 adcroft 1.9 alldirs="$SOURCEDIRS $INCLUDEDIRS ."
2421 edhill 1.1 for d in $alldirs ; do
2422     deplist=
2423 edhill 1.14 sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
2424 cnh 1.3 sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
2425 jmc 1.206 if test "x$OPENAD" != x ; then
2426 jmc 1.176 sfiles=`( echo $sfiles | grep -v _cb2m\. )`
2427     fi
2428 edhill 1.1 for sf in $sfiles ; do
2429     if test ! -r ".links.tmp/$sf" ; then
2430     if test -f "$d/$sf" ; then
2431 edhill 1.131 ignore_f=f
2432 adcroft 1.44 case $d/$sf in
2433     ./$PACKAGES_DOT_H)
2434 edhill 1.141 ignore_f=t
2435 adcroft 1.44 ;;
2436     ./AD_CONFIG.h)
2437 edhill 1.141 ignore_f=t
2438 adcroft 1.44 ;;
2439     ./FC_NAMEMANGLE.h)
2440 edhill 1.141 ignore_f=t
2441 adcroft 1.44 ;;
2442 edhill 1.98 ./BUILD_INFO.h)
2443 edhill 1.141 ignore_f=t
2444     ;;
2445     ./EMBEDDED_FILES.h)
2446     ignore_f=t
2447 edhill 1.98 ;;
2448 adcroft 1.44 *)
2449 edhill 1.131 # For the local directory *ONLY*,
2450     # ignore all soft-links
2451     if test "x$HAVE_TEST_L" = xt -a "x$d" = x. -a -L $sf ; then
2452     ignore_f=t
2453     else
2454     touch .links.tmp/$sf
2455     deplist="$deplist $sf"
2456     fi
2457 adcroft 1.44 ;;
2458     esac
2459 edhill 1.131 if test "x$ignore_f" = xf ; then
2460     extn=`echo $sf | $AWK -F. '{print $NF}'`
2461     case $extn in
2462 jmc 1.176 F)
2463     echo " \\" >> F77srclist.tmp
2464     printf " $sf" >> F77srclist.tmp
2465 jmc 1.206 if test "x$OPENAD" != x ; then
2466 jmc 1.176 basename=${sf%%.F}
2467     isAD=`egrep ^$basename.f'[ ]*' adSrcFiles.tmp`
2468 jmc 1.206 if test -z "$isAD" ; then
2469 jmc 1.176 toBeIgnored=`egrep ^$basename'[ ]*' ${OAD_DONT_COMPILE}`
2470 jmc 1.206 if test -z "$toBeIgnored" ; then
2471 jmc 1.176 echo " \\" >> nonADF77srclist.tmp
2472     printf " $sf" >> nonADF77srclist.tmp
2473 jmc 1.206 else
2474 jmc 1.176 echo " not to be compiled : $sf"
2475     fi
2476 jmc 1.206 else # file is initially listed as an AD file we want to exclude it
2477 jmc 1.176 # or we want to retain the untransformed version
2478     notToBeTransformed=`egrep ^$basename'[ ]*' ${OAD_DONT_TRANSFORM}`
2479     untransformedVersionToBeKept=`egrep ^$basename'[ ]*' ${OAD_KEEP_ORIGINAL}`
2480 jmc 1.206 if test -n "$notToBeTransformed"; then
2481 jmc 1.176 echo " not to be transformed: $sf"
2482     fi
2483     if test -n "$untransformedVersionToBeKept" ; then
2484     echo " original to be kept : $sf"
2485 jmc 1.206 fi
2486 jmc 1.176 if test -n "$notToBeTransformed" -o -n "$untransformedVersionToBeKept" ; then
2487     echo " \\" >> nonADF77srclist.tmp
2488     printf " $sf" >> nonADF77srclist.tmp
2489     fi
2490     fi
2491     fi
2492     ;;
2493     F90)
2494     echo " \\" >> F90srclist.tmp
2495     printf " $sf" >> F90srclist.tmp
2496     ;;
2497     c)
2498     echo " \\" >> csrclist.tmp
2499     printf " $sf" >> csrclist.tmp
2500     ;;
2501     h)
2502     echo " \\" >> hsrclist.tmp
2503     printf " $sf" >> hsrclist.tmp
2504     ;;
2505     flow)
2506     echo " \\" >> ad_flow_files.tmp
2507     printf " $sf" >> ad_flow_files.tmp
2508     ;;
2509     esac
2510     fi
2511 edhill 1.1 fi
2512     fi
2513     done
2514     if test "x$deplist" != x ; then
2515 jmc 1.176 if test "$d" != "." ; then
2516     echo "" >> srclinks.tmp
2517 edhill 1.2 echo "# These files are linked from $d" >> srclinks.tmp
2518 edhill 1.1 echo "$deplist :" >> srclinks.tmp
2519 jahn 1.170 # We need to make sure that the link isn't already there.
2520     # This may happen when make thinks that a header file has to be "remade"
2521     # because a module it depends on has changed. In this case we do nothing.
2522     printf "\tif [ ! -L \$@ ]; then \$(LN) %s/\$@ \$@; fi\n" $d >> srclinks.tmp
2523 jmc 1.176 fi
2524 edhill 1.1 fi
2525     done
2526     rm -rf .links.tmp
2527 jmc 1.176 echo "" >> F77srclist.tmp
2528     echo "" >> nonADF77srclist.tmp
2529     echo "" >> csrclist.tmp
2530     echo "" >> F90srclist.tmp
2531     echo "" >> hsrclist.tmp
2532     echo "" >> ad_flow_files.tmp
2533 edhill 1.1
2534 jmc 1.192 CMDLINE=$0
2535     for xx in "$@" ; do nw=`echo $xx | wc -w`
2536     if test $nw = '1' ; then CMDLINE="$CMDLINE $xx"
2537     else CMDLINE="$CMDLINE '$xx'" ; fi
2538     done
2539    
2540 edhill 1.88 if test -f $MAKEFILE ; then
2541 jmc 1.205 mv -f $MAKEFILE "$MAKEFILE.old"
2542 edhill 1.1 fi
2543     echo " Writing makefile: $MAKEFILE"
2544     echo "# Multithreaded + multi-processing makefile for:" > $MAKEFILE
2545     echo "# $MACHINE" >> $MAKEFILE
2546     echo "# This makefile was generated automatically on" >> $MAKEFILE
2547     echo "# $THISDATE" >> $MAKEFILE
2548     echo "# by the command:" >> $MAKEFILE
2549 jmc 1.192 echo "# $CMDLINE" >> $MAKEFILE
2550 edhill 1.1 echo "# executed by:" >> $MAKEFILE
2551 edhill 1.97 echo "# ${THISUSER}@${THISHOST}:${THISCWD}" >> $MAKEFILE
2552 edhill 1.21
2553     EXE_AD=$EXECUTABLE"_ad"
2554     EXE_FTL=$EXECUTABLE"_ftl"
2555     EXE_SVD=$EXECUTABLE"_svd"
2556    
2557 edhill 1.1 cat >>$MAKEFILE <<EOF
2558 edhill 1.53 #
2559     # OPTFILE="$OPTFILE"
2560 jmc 1.205 #
2561 edhill 1.1 # BUILDDIR : Directory where object files are written
2562     # SOURCEDIRS : Directories containing the source (.F) files
2563     # INCLUDEDIRS : Directories containing the header-source (.h) files
2564     # EXEDIR : Directory where executable that is generated is written
2565     # EXECUTABLE : Full path of executable binary
2566     #
2567     # CPP : C-preprocessor command
2568     # INCLUDES : Directories searched for header files
2569     # DEFINES : Macro definitions for CPP
2570     # MAKEDEPEND : Dependency generator
2571     # KPP : Special preprocessor command (specific to platform)
2572     # KFLAGS : Flags for KPP
2573     # FC : Fortran compiler command
2574     # FFLAGS : Configuration/debugging options for FC
2575     # FOPTIM : Optimization options for FC
2576     # LINK : Command for link editor program
2577     # LIBS : Library flags /or/ additional optimization/debugging flags
2578    
2579     ROOTDIR = ${ROOTDIR}
2580 jmc 1.205 BUILDDIR = ${BUILDDIR}
2581 edhill 1.1 SOURCEDIRS = ${SOURCEDIRS}
2582     INCLUDEDIRS = ${INCLUDEDIRS}
2583     EXEDIR = ${EXEDIR}
2584     EXECUTABLE = \$(EXEDIR)/${EXECUTABLE}
2585     TOOLSDIR = ${TOOLSDIR}
2586    
2587 edhill 1.14 #eh3 new defines for the adjoint work
2588     AUTODIFF = ${ROOTDIR}/pkg/autodiff
2589 edhill 1.21 EXE_AD = ${EXE_AD}
2590     EXE_FTL = ${EXE_FTL}
2591     EXE_SVD = ${EXE_SVD}
2592 edhill 1.14
2593 adcroft 1.44 ENABLED_PACKAGES = ${ENABLED_PACKAGES}
2594     DISABLED_PACKAGES = ${DISABLED_PACKAGES}
2595    
2596 adcroft 1.52 # These files are created by Makefile
2597 edhill 1.97 SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h BUILD_INFO.h
2598 edhill 1.141 EOF
2599 adcroft 1.52
2600 edhill 1.141 if test "x$EMBED_SRC" = xt ; then
2601     echo "EMBEDDED_FILES = EMBEDDED_FILES.h" >>$MAKEFILE
2602     else
2603     echo "EMBEDDED_FILES = " >>$MAKEFILE
2604     fi
2605 edhill 1.1
2606     cat >>$MAKEFILE <<EOF
2607     # Unix ln (link)
2608     LN = ${LN}
2609     # C preprocessor
2610     CPP = cat \$< | ${S64} | ${CPP}
2611     # Dependency generator
2612     MAKEDEPEND = ${MAKEDEPEND}
2613     # Special preprocessor (KAP on DECs, FPP on Crays)
2614     KPP = ${KPP}
2615     # Fortran compiler
2616 edhill 1.94 FC = ${FC}
2617 cnh 1.3 # Fortran compiler
2618     F90C = ${F90C}
2619 edhill 1.92 # C compiler
2620     CC = ${CC}
2621 edhill 1.1 # Link editor
2622 edhill 1.70 LINK = ${LINK} ${LDADD}
2623 edhill 1.1
2624     # Defines for CPP
2625     DEFINES = ${DEFINES}
2626     # Includes for CPP
2627     INCLUDES = ${INCLUDES}
2628     # Flags for KPP
2629     KFLAGS1 = ${KFLAGS1}
2630     KFLAGS2 = ${KFLAGS2}
2631     # Optim./debug for FC
2632 mlosch 1.165 FFLAGS = ${FFLAGS} ${FEXTRAFLAGS}
2633 edhill 1.1 FOPTIM = ${FOPTIM}
2634 cnh 1.3 # Optim./debug for FC
2635     F90FLAGS = ${F90FLAGS}
2636     F90OPTIM = ${F90OPTIM}
2637 jmc 1.176 F90FIXEDFORMAT = ${F90FIXEDFORMAT}
2638 edhill 1.1 # Flags for CC
2639     CFLAGS = ${CFLAGS}
2640     # Files that should not be optimized
2641     NOOPTFILES = ${NOOPTFILES}
2642     NOOPTFLAGS = ${NOOPTFLAGS}
2643     # Flags and libraries needed for linking
2644 edhill 1.107 LIBS = ${LIBS}
2645 cnh 1.3 # Name of the Mekfile
2646     MAKEFILE=${MAKEFILE}
2647 edhill 1.1
2648     EOF
2649    
2650 jmc 1.176 cat F77srclist.tmp >> $MAKEFILE
2651     cat nonADF77srclist.tmp >> $MAKEFILE
2652     cat csrclist.tmp >> $MAKEFILE
2653     cat F90srclist.tmp >> $MAKEFILE
2654     cat hsrclist.tmp >> $MAKEFILE
2655     cat ad_flow_files.tmp >> $MAKEFILE
2656    
2657     rm -f F77srclist.tmp nonADF77srclist.tmp csrclist.tmp F90srclist.tmp hsrclist.tmp ad_flow_files.tmp
2658    
2659 edhill 1.75 echo >> $MAKEFILE
2660 jmc 1.176
2661 jmc 1.205 # add definitions for preprocessed sources
2662     # and note that not all systems allow case sensitive extensions
2663     # hence the $FS and $FS90 here.
2664     # for fixed format f90 files we use ff90 or FF90 resp
2665 jmc 1.176 # but these are not expected to be the original source files
2666    
2667     echo 'F77_PP_SRC_FILES = $(F77_SRC_FILES:.F=.'$FS')' >> $MAKEFILE
2668     echo 'F90_PP_SRC_FILES = $(F90_SRC_FILES:.F90=.'$FS90')' >> $MAKEFILE
2669     echo 'OBJFILES= $(F77_SRC_FILES:.F=.o) $(C_SRC_FILES:.c=.o) $(F90_SRC_FILES:.F90=.o)' >> $MAKEFILE
2670 dfer 1.172 echo 'FLOFILES = $(AD_FLOW_FILES:.flow=.flowdir)' >> $MAKEFILE
2671 edhill 1.75 echo >> $MAKEFILE
2672     echo '.SUFFIXES:' >> $MAKEFILE
2673 jmc 1.176 echo '.SUFFIXES: .o .'$FS' .p .F .c .f'$FS90' .'$FS90' .FF90 .F90 .flowdir .flow' >> $MAKEFILE
2674 edhill 1.1
2675     cat >>$MAKEFILE <<EOF
2676    
2677     all: \$(EXECUTABLE)
2678 jmc 1.176 \$(EXECUTABLE): \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(OBJFILES) \$(EMBEDDED_FILES)
2679 adcroft 1.44 @echo Creating \$@ ...
2680 edhill 1.1 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
2681     depend:
2682     @make links
2683 jmc 1.176 \$(MAKEDEPEND) -o .$FS \$(DEFINES) \$(INCLUDES) \$(F77_SRC_FILES)
2684 adcroft 1.44 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
2685 edhill 1.72 -rm -f makedepend.out
2686 edhill 1.1
2687 cnh 1.132 lib: libmitgcmuv.a
2688    
2689     libmitgcmuv.a: \$(OBJFILES)
2690     ar rcv libmitgcmuv.a \$(OBJFILES)
2691 cnh 1.159 ar d libmitgcmuv.a main.o
2692 cnh 1.132
2693 jmc 1.176 links: \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(SPECIAL_FILES)
2694 edhill 1.1
2695 jmc 1.176 small_f: \$(F77_PP_SRC_FILES) \$(F90_PP_SRC_FILES)
2696 edhill 1.1
2697     output.txt: \$(EXECUTABLE)
2698     @printf 'running ... '
2699     @\$(EXECUTABLE) > \$@
2700    
2701 jmc 1.210 # remove most of the files that "make" generates
2702 edhill 1.1 clean:
2703 heimbach 1.157 -rm -rf *.p *.$FS90 *.mod ${RMFILES} work.{pc,pcl} *.template
2704     -rm -rf *.o
2705 dfer 1.172 -rm -rf *.$FS *.flowdir
2706 utke 1.193 -rm -rf *.f$FS90 \$(AD_CLEAN) ad_input*
2707 jmc 1.210
2708     # remove most of the files that "make" and "make depend" generate
2709 edhill 1.1 Clean:
2710     @make clean
2711     @make cleanlinks
2712 jmc 1.210 -rm -f \$(SPECIAL_FILES) f90mkdepend.log
2713 jmc 1.166 -rm -f taf_command taf_output taf_ad.log taf_ad_flow.log
2714 jmc 1.211 -rm -f genmake_warnings genmake_errors make.log
2715 jmc 1.210
2716     # remove also the executable, files that "genmake2" generates (except Makefile)
2717 jmc 1.211 # and output from a run (plus log files from testreport)
2718 edhill 1.1 CLEAN:
2719     @make Clean
2720 jmc 1.211 -rm -f \$(EXECUTABLE) \$(EXE_AD) *.bak $MAKEFILE.old
2721     -rm -f $LOGFILE genmake_state genmake_*optfile genmake.tr_log make.tr_log
2722 edhill 1.1 -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
2723     -find \$(EXEDIR) -name "*.data" -exec rm {} \;
2724     -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
2725 jmc 1.210 -rm -f *.txt STD* *diagnostics.log datetime
2726 jmc 1.166 -rm -f *_MIT_CE_000.opt0000 costfunction*0000
2727 edhill 1.144 -rm -rf mnc_test_*
2728 edhill 1.1
2729     makefile:
2730 edhill 1.73 $THIS_SCRIPT $G2ARGS
2731 edhill 1.1 cleanlinks:
2732     -find . -type l -exec rm {} \;
2733    
2734 jmc 1.176 # Special targets (SPECIAL_FILES) which are created by make
2735 adcroft 1.44 ${PACKAGES_DOT_H}:
2736     @echo Creating \$@ ...
2737 edhill 1.71 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -bPACKAGES_CONFIG_H "Disabled packages:" \$(DISABLED_PACKAGES) " " "Enabled packages:" \$(ENABLED_PACKAGES) > \$@
2738 adcroft 1.44 AD_CONFIG.h:
2739     @echo Creating \$@ ...
2740 edhill 1.71 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -bAD_CONFIG_H -UALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN -UALLOW_ECCO_OPTIMIZATION > \$@
2741 adcroft 1.52 FC_NAMEMANGLE.h:
2742     @echo Creating \$@ ...
2743     echo "$FC_NAMEMANGLE" > \$@
2744 adcroft 1.44
2745 edhill 1.97 BUILD_INFO.h:
2746     @echo Creating \$@ ...
2747     EOF
2748    
2749     test ! "x$THISVER" = x && echo " -echo \"#define THISVER '$THISVER'\" > \$@" >> $MAKEFILE
2750     test ! "x$THISUSER" = x && echo " -echo \"#define THISUSER '$THISUSER'\" >> \$@" >> $MAKEFILE
2751     test ! "x$THISDATE" = x && echo " -echo \"#define THISDATE '$THISDATE'\" >> \$@" >> $MAKEFILE
2752     test ! "x$THISHOST" = x && echo " -echo \"#define THISHOST '$THISHOST'\" >> \$@" >> $MAKEFILE
2753    
2754 edhill 1.141 if test "x$EMBED_SRC" = xt ; then
2755     cat >>$MAKEFILE <<EOF
2756    
2757     decode_files.o : EMBEDDED_FILES.h
2758    
2759 jmc 1.205 ## \$(F77_PP_SRC_FILES)
2760 jmc 1.176 all_fF.tar.gz : \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(F77_PP_SRC_FILES) Makefile
2761 edhill 1.141 @echo Creating \$@ ...
2762 jmc 1.176 -tar -hcf all_fF.tar \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(F77_PP_SRC_FILES) Makefile
2763 edhill 1.141 -rm -f all_fF.tar.gz
2764     -gzip all_fF.tar
2765    
2766     EMBEDDED_FILES.h : all_fF.tar.gz
2767     @echo Creating \$@ ...
2768     -\${ROOTDIR}/tools/embed_encode/encode_files EMBEDDED_FILES.h all_fF.tar.gz
2769    
2770     EOF
2771     fi
2772    
2773 edhill 1.97 cat >>$MAKEFILE <<EOF
2774    
2775 edhill 1.76 # The normal chain of rules is ( .F - .$FS - .o )
2776    
2777 edhill 1.101 ## This nullifies any default implicit rules concerning these two file types:
2778 jmc 1.177 ## %.o : %.F
2779 edhill 1.76
2780     .F.$FS:
2781 edhill 1.1 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2782 edhill 1.76 .$FS.o:
2783 edhill 1.1 \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$<
2784 jmc 1.176 .F90.$FS90:
2785     \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2786     .FF90.f$FS90:
2787     \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2788     .$FS90.o:
2789 cnh 1.3 \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$<
2790 jmc 1.176 .f$FS90.o:
2791     cp \$< \$(basename \$<).f90
2792     \$(F90C) \$(F90FLAGS) \$(F90OPTIM) -c \$(F90FIXEDFORMAT) \$(basename \$<).f90
2793 edhill 1.1 .c.o:
2794 ce107 1.139 \$(CC) \$(CFLAGS) \$(DEFINES) \$(INCLUDES) -c \$<
2795 dfer 1.172 .flow.flowdir:
2796 heimbach 1.171 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2797 edhill 1.1
2798 edhill 1.76 # Special exceptions that use the ( .F - .p - .$FS - .o ) rule-chain
2799     .F.p:
2800 edhill 1.1 \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@
2801 edhill 1.76 .p.$FS:
2802 edhill 1.1 \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$<
2803 edhill 1.14
2804 jmc 1.176 EOF
2805    
2806 edhill 1.14 #=========================================
2807     #=== Automatic Differentiation Rules ===
2808 jmc 1.176 #=== for TAMC/TAF ======================
2809    
2810 jmc 1.206 if test "x$OPENAD" = x ; then
2811 jmc 1.176
2812     cat >>$MAKEFILE <<EOF
2813 edhill 1.14
2814     TAMC = ${TAMC}
2815     TAF = ${TAF}
2816    
2817 edhill 1.17 TAF_EXTRA = ${TAF_EXTRA}
2818     TAMC_EXTRA = ${TAMC_EXTRA}
2819    
2820 edhill 1.14 EOF
2821    
2822     ad_vars="AD_TAMC_FLAGS AD_TAF_FLAGS"
2823     ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF_FLAGS"
2824     ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS"
2825     for i in $ad_vars ; do
2826     name=$i
2827 edhill 1.151 t1="t2=\$"`echo "$i"`
2828 edhill 1.14 eval $t1
2829     printf "%-20s = " $name >> $MAKEFILE
2830 edhill 1.151 echo "$t2" | sed -e 's| \+| |g' >> $MAKEFILE
2831 edhill 1.14 done
2832    
2833     echo " Add the source list for AD code generation"
2834     echo >> $MAKEFILE
2835 edhill 1.71 printf "AD_FILES = " >> $MAKEFILE
2836 jmc 1.176 AD_FILES=`cat adSrcFiles.tmp`
2837 edhill 1.14 for i in $AD_FILES ; do
2838     echo " \\" >> $MAKEFILE
2839 edhill 1.71 printf " $i" >> $MAKEFILE
2840 edhill 1.14 done
2841     echo >> $MAKEFILE
2842 jmc 1.176 rm -f adSrcFiles.tmp
2843 edhill 1.14
2844     cat >>$MAKEFILE <<EOF
2845    
2846 edhill 1.16 # ... AD ...
2847 jmc 1.152 adall: \$(EXE_AD)
2848 edhill 1.121 adtaf: ad_taf_output.$FS
2849     adtamc: ad_tamc_output.$FS
2850 edhill 1.21
2851 jmc 1.189 ad_input_code.$FS: \$(AD_FILES) \$(H_SRC_FILES) \$(AD_FLOW_FILES)
2852 edhill 1.71 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -DALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN -UALLOW_ECCO_OPTIMIZATION > ad_config.template
2853 edhill 1.23 cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h
2854 adcroft 1.44 -rm -f ad_config.template
2855 jmc 1.176 @make \$(F77_PP_SRC_FILES)
2856 heimbach 1.171 @make \$(FLOFILES)
2857 mlosch 1.198 cat \$(FLOFILES) \$(AD_FILES) | sed -f \$(TOOLSDIR)/remove_comments_sed > ad_input_code.$FS
2858 edhill 1.22
2859 edhill 1.121 ad_taf_output.$FS: ad_input_code.$FS
2860     \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2861 jmc 1.173 ls -l ad_input_code_ad.$FS
2862 edhill 1.121 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2863 heimbach 1.37
2864     adtafonly:
2865 edhill 1.121 \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS
2866 jmc 1.173 ls -l ad_input_code_ad.$FS
2867 edhill 1.121 cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS
2868 edhill 1.14
2869 jmc 1.152 \${EXE_AD}: ad_taf_output.o \$(OBJFILES)
2870 jmc 1.206 \$(LINK) -o \${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS)
2871 edhill 1.14
2872 edhill 1.121 ad_tamc_output.$FS: ad_input_code.$FS
2873     \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.$FS
2874     cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.$FS
2875 edhill 1.14
2876     ad_tamc: ad_tamc_output.o \$(OBJFILES)
2877 jmc 1.206 \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS)
2878 edhill 1.14
2879 heimbach 1.105 adonlyfwd:
2880 edhill 1.106 patch < \$(TOOLSDIR)/ad_taf_output.f.onlyfwd.diff
2881 jmc 1.206
2882 heimbach 1.105 adtrick:
2883 edhill 1.106 patch < \$(TOOLSDIR)/ad_taf_output.f.adtrick.diff
2884 edhill 1.14
2885 edhill 1.19 # ... FTL ...
2886 edhill 1.23 ftlall: ftl_taf
2887 edhill 1.121 ftltaf: ftl_taf_output.$FS
2888     ftltamc: ftl_tamc_output.$FS
2889 edhill 1.21
2890 jmc 1.176 ftl_input_code.$FS: \$(AD_FILES) \$(H_SRC_FILES)
2891 edhill 1.71 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -UALLOW_ADJOINT_RUN -DALLOW_TANGENTLINEAR_RUN -UALLOW_ECCO_OPTIMIZATION > ftl_config.template
2892 edhill 1.23 cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
2893 adcroft 1.44 -rm -f ftl_config.template
2894 jmc 1.176 @make \$(F77_PP_SRC_FILES)
2895 edhill 1.22 @make \$(AD_FLOW_FILES)
2896 edhill 1.121 cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.$FS
2897 edhill 1.22
2898 edhill 1.121 ftl_taf_output.$FS: ftl_input_code.$FS
2899     \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
2900 jmc 1.173 ls -l ftl_input_code_ftl.$FS
2901 edhill 1.121 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
2902 edhill 1.14
2903 heimbach 1.40 ftltafonly:
2904 edhill 1.121 \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS
2905 jmc 1.173 ls -l ftl_input_code_ftl.$FS
2906 edhill 1.121 cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS
2907 heimbach 1.40
2908 edhill 1.19 ftl_taf: ftl_taf_output.o \$(OBJFILES)
2909 jmc 1.206 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS)
2910 edhill 1.14
2911 edhill 1.121 ftl_tamc_output.$FS: ftl_input_code.$FS
2912     \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.$FS
2913     cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.$FS
2914 edhill 1.16
2915 edhill 1.19 ftl_tamc: ftl_tamc_output.o \$(OBJFILES)
2916 jmc 1.206 \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS)
2917 edhill 1.16
2918    
2919     # ... SVD ...
2920 edhill 1.121 svdtaf: ad_taf_output.$FS ftl_taf_output.$FS
2921 heimbach 1.109 @echo "--->>> Only ran TAF to generate SVD code! <<<---"
2922     @echo "--->>> Do make svdall afterwards to compile. <<<---"
2923     svdall: svd_touch svd_taf
2924 edhill 1.16
2925 heimbach 1.109 svd_taf: \$(OBJFILES)
2926 heimbach 1.40 \$(LINK) -o mitgcmuv_svd \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o ftl_taf_output.o \$(LIBS)
2927 edhill 1.14
2928 heimbach 1.109 @echo "--->>> Only COMPILE svd code! <<<---"
2929     @echo "--->>> Assumes you previously <<<---"
2930     @echo "--->>> did make svdtaf <<<---"
2931    
2932     svd_touch:
2933     @echo "--->>> Only COMPILE svd code! <<<---"
2934     @echo "--->>> Assumes you previously <<<---"
2935     @echo "--->>> did make svdtaf <<<---"
2936 edhill 1.121 touch ad_taf_output.$FS ftl_taf_output.$FS
2937     \$(FC) \$(FFLAGS) \$(FOPTIM) -c ad_taf_output.$FS
2938     \$(FC) \$(FFLAGS) \$(FOPTIM) -c ftl_taf_output.$FS
2939 heimbach 1.109 @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -UALLOW_ADJOINT_RUN -DALLOW_TANGENTLINEAR_RUN -UALLOW_ECCO_OPTIMIZATION > ftl_config.template
2940     cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h
2941     -rm -f ftl_config.template
2942 edhill 1.14
2943 jmc 1.176 EOF
2944    
2945 jmc 1.206 fi
2946 jmc 1.176
2947     #=== for OpenAD ========================
2948    
2949 jmc 1.206 if test "x$OPENAD" != x ; then
2950 jmc 1.176
2951     # ============ begin OpenAD specific section ==============
2952    
2953     cat >>$MAKEFILE <<EOF
2954    
2955 jmc 1.206 # all the source files linked from the various locations:
2956 jmc 1.176 ALL_LINKED_FILES= \
2957     \$(F77_SRC_FILES) \
2958     \$(C_SRC_FILES) \
2959     \$(H_SRC_FILES) \
2960     \$(F90_SRC_FILES) \
2961     \$(SPECIAL_FILES)
2962    
2963     ifndef OPENADROOT
2964     \$(error "Error: environment variable OPENADROOT not defined!")
2965     endif
2966    
2967     ifndef XAIFSCHEMAROOT
2968     \$(error "Error: environment variable XAIFSCHEMAROOT not defined!")
2969     endif
2970    
2971     ifndef XAIFBOOSTERROOT
2972     \$(error "Error: environment variable XAIFBOOSTERROOT not defined!")
2973     endif
2974    
2975     EOF
2976    
2977     echo " Add the source list for common block to module conversion "
2978     echo >> $MAKEFILE
2979     printf "CB2M_F90_SRC_NAMES = " >> $MAKEFILE
2980     for i in `cat ${OAD_CB2M_FILES}` ; do
2981     echo " \\" >> $MAKEFILE
2982     printf " $i" >> $MAKEFILE
2983     done
2984     echo >> $MAKEFILE
2985    
2986     echo " Add the source list for AD code generation"
2987     echo >> $MAKEFILE
2988     printf "AD_FILES = " >> $MAKEFILE
2989     for i in `cat ${OAD_CB2M_FILES}` ; do
2990     echo " \\" >> $MAKEFILE
2991     printf " ${i}_mod.f$FS90" >> $MAKEFILE
2992     done
2993     AD_FILES=`cat adSrcFiles.tmp`
2994     for i in $AD_FILES ; do
2995     basename=${i%%.f}
2996     toBeIgnored=`egrep ^$basename'[ ]*' ${OAD_DONT_COMPILE} ${OAD_DONT_TRANSFORM}`
2997     if test -z "$toBeIgnored" ; then
2998     echo " \\" >> $MAKEFILE
2999     printf " $i" >> $MAKEFILE
3000     fi
3001     done
3002     echo >> $MAKEFILE
3003     rm -f adSrcFiles.tmp
3004    
3005     cat >>$MAKEFILE <<EOF
3006    
3007 jmc 1.206 adAll: \$(EXE_AD)
3008 jmc 1.176 .PHONY: adAll
3009    
3010     CB2M_F90_PP_SRC_FILES=\$(addsuffix _mod.f$FS90, \$(CB2M_F90_SRC_NAMES))
3011    
3012     .PRECIOUS: \$(CB2M_F90_PP_SRC_FILES) \$(NON_AD_F77_SRC_FILES:.F=_cb2m.f$FS90)
3013    
3014     .PHONY: adDepend
3015     adDepend: \$(ALL_LINKED_FILES) \$(addsuffix _mod.h, \$(CB2M_F90_SRC_NAMES)) \$(addsuffix _mod.FF90, \$(CB2M_F90_SRC_NAMES)) \$(F77_SRC_FILES:.F=_cb2m.FF90)
3016     \$(MAKEDEPEND) -o .$FS \$(DEFINES) \$(INCLUDES) \$(F77_SRC_FILES)
3017     \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
3018     -rm -f makedepend.out
3019    
3020     OPENAD_SUPPORT_F90_SRC_FILES = \
3021     w2f__types.F90 \
3022     OAD_active.F90 \
3023     OAD_cp.F90 \
3024     OAD_rev.F90 \
3025 jmc 1.206 OAD_tape.F90
3026 jmc 1.176
3027     OPENAD_SUPPORT_C_SRC_FILES = \
3028     iaddr.c \
3029     timeRatio.c
3030    
3031     f95_test_mods.f90: \$(OPENAD_SUPPORT_F90_SRC_FILES:F90=$FS90)
3032     cat \$^ > \$@
3033    
3034 jmc 1.206 f95_test.f90: all_mods.xb.x2w.w2f.pp.f$FS90 \$(NON_AD_F77_SRC_FILES:.F=_cb2m.f$FS90) ad_input_code.w2f.pre.xb.x2w.w2f.td.pp.f$FS90
3035 jmc 1.176 cat \$^ > \$@
3036    
3037     f95_test.out: f95_test_mods.f90 f95_test.f90
3038     f95 -fixed -w=unused -maxcontin=132 -c f95_test_mods.f90 > \$@ 2>&1
3039     f95 -fixed -w=unused -maxcontin=132 -c -fixed f95_test.f90 >> \$@ 2>&1
3040    
3041 jmc 1.206 # the file included below is created by the
3042     # postProcessor and its inclusion sets the
3043 utke 1.193 # variable POSTPROCESSEDFILES
3044 jmc 1.206 # used below. Because the file is made during
3045     # make it won't be read until the second (recursive)
3046 utke 1.193 # invocation in the rule below
3047     -include postProcess.make
3048    
3049     AD_OBJ_FILES_S1=\$(OPENAD_SUPPORT_F90_SRC_FILES:.F90=.o) \$(OPENAD_SUPPORT_C_SRC_FILES:.c=.o) \$(POSTPROCESSEDFILES:.f$FS90=.o)
3050    
3051     AD_OBJ_FILES_S2=\$(AD_OBJ_FILES_S1) \$(NON_AD_F77_SRC_FILES:.F=_cb2m.o) \$(C_SRC_FILES:.c=.o) \$(F90_SRC_FILES:.F90=.o)
3052    
3053     postProcess.comp: \$(ALL_LINKED_FILES) \$(addsuffix _mod.h, \$(CB2M_F90_SRC_NAMES)) postProcess.tag \$(AD_OBJ_FILES_S1)
3054     ifeq (\$(MAKELEVEL),0)
3055     \$(MAKE) adAll
3056     else
3057     touch \$@
3058     endif
3059 jmc 1.176
3060 utke 1.193 \$(EXE_AD): \$(ALL_LINKED_FILES) \$(addsuffix _mod.h, \$(CB2M_F90_SRC_NAMES)) postProcess.comp \$(AD_OBJ_FILES_S2)
3061     ifeq (\$(MAKELEVEL),1)
3062     \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(AD_OBJ_FILES_S2) \$(LIBS)
3063     else
3064     touch \$@
3065     endif
3066 jmc 1.176
3067     # makefile debug rule
3068 utke 1.178 openad: ad_input_code.w2f.pre.xb.x2w.w2f.td.pp.f$FS90
3069 jmc 1.176 .PHONY: openad
3070    
3071 jmc 1.206 # create the module files
3072     %_mod.FF90 : %.h ../OAD_support/cb2mGetModules.csh ../OAD_support/cb2mGetModules.awk
3073 jmc 1.176 ../OAD_support/cb2mGetModules.csh $< ../OAD_support/cb2mGetModules.awk
3074    
3075 jmc 1.206 # create the header files
3076     %_mod.h : %.h ../OAD_support/cb2mGetHeaders.csh ../OAD_support/cb2mGetHeaders.awk
3077 jmc 1.176 ../OAD_support/cb2mGetHeaders.csh $< ../OAD_support/cb2mGetHeaders.awk \$(CB2M_F90_SRC_NAMES)
3078    
3079     # change everybody else to use the new module files:
3080     %_cb2m.FF90 : %.F ../OAD_support/cb2mUseModules.bash
3081     ../OAD_support/cb2mUseModules.bash $< ${MPI}
3082    
3083     # makefile debug rule
3084     small_f: \$(CB2M_F90_PP_SRC_FILES)
3085     .PHONY: small_f
3086    
3087     ad_output.txt: \$(EXE_AD)
3088     @printf 'linking data files ... '
3089     \$(LN) -f ../input_ad/data* ../input_ad/eedata .
3090     \$(LN) -f ../../global_ocean.90x40x15/input/*.bin .
3091     @printf 'running ... '
3092     @./\$(EXE_AD) > \$@
3093    
3094     CB2M_AD_FILES=\$(AD_FILES:.f=_cb2m.f$FS90)
3095 utke 1.194 ad_input_code.f$FS90: \$(CB2M_AD_FILES)
3096 jmc 1.176 cat \$^ > \$@
3097    
3098 jmc 1.206 # strip all comments and blanks to reduce
3099     # the file size in order to reduce perl's memory requirements
3100     ad_input_code_sf.f$FS90 : ad_input_code.f$FS90
3101 jmc 1.176 cat \$^ | sed -f ../OAD_support/strip.sed | sed -f ../OAD_support/stop2print.sed > \$@
3102    
3103     # mfef90 preprocessing
3104 jmc 1.206 # expand statement functions
3105     # expose mfef90 specific substring handling
3106 jmc 1.176 # add the w2f__types module
3107     ad_input_code_sf.w2f.f$FS90: ad_input_code_sf.f$FS90 mfef90 whirl2f whirl2f_be w2f__types.f90
3108 jmc 1.206 ./mfef90 -r8 -z -F -N132 \$<
3109     mv \$<.B \$(basename \$<).B
3110 jmc 1.176 ./whirl2f -openad \$(basename \$<).B
3111     cat w2f__types.f90 \$(basename \$<).w2f.f > \$@
3112    
3113     # canonicalizer
3114 utke 1.178 ad_input_code_sf.w2f.pre.f$FS90: ad_input_code_sf.w2f.f$FS90 preProcess.py
3115 utke 1.201 ./preProcess.py --timing --r8 -H -S \$< -o \$@
3116 jmc 1.176
3117     # F -> WHIRL
3118 jmc 1.206 # note that the canonicalized version cuts off at col 72
3119     # doing this also for string constants which is ok as long
3120     # as we are in fixed mode and cut of exactly there.
3121     # Otherwise mfef90 patches in spaces to fill up to 72 (or 132)
3122 jmc 1.176 # characters respectively.
3123 utke 1.178 ad_input_code_sf.w2f.pre.B: ad_input_code_sf.w2f.pre.f$FS90 mfef90
3124 jmc 1.176 ./mfef90 -r8 -z -F \$<
3125     mv \$<.B \$@
3126    
3127     # WHIRL -> XAIF
3128 utke 1.178 ad_input_code_sf.w2f.pre.xaif : ad_input_code_sf.w2f.pre.B whirl2xaif
3129 jmc 1.176 ./whirl2xaif -s -n --debug 1 -o \$@ \$<
3130    
3131     # XAIF -> XAIF'
3132 utke 1.183 ad_input_code_sf.w2f.pre.xb.xaif : ad_input_code_sf.w2f.pre.xaif xaif.xsd xaif_base.xsd xaif_inlinable_intrinsics.xsd xaif_derivative_propagator.xsd xaif_output.xsd oadDriver
3133     ./oadDriver -f -t forward_step -i \$< -c \${XAIFSCHEMAROOT}/schema/examples/inlinable_intrinsics.xaif -o \$@ -I -r
3134 jmc 1.176
3135     # XAIF' -> WHIRL'
3136 utke 1.178 ad_input_code_sf.w2f.pre.xb.x2w.B : ad_input_code_sf.w2f.pre.xb.xaif xaif2whirl
3137 utke 1.196 ./xaif2whirl --debug 1 ad_input_code_sf.w2f.pre.B \$<
3138 jmc 1.176
3139     # WHIRL' -> F'
3140 utke 1.178 ad_input_code_sf.w2f.pre.xb.x2w.w2f.f$FS90: ad_input_code_sf.w2f.pre.xb.x2w.B whirl2f whirl2f_be
3141 jmc 1.206 ./whirl2f -FLIST:ftn_file=\$@ -openad \$<
3142 jmc 1.176
3143     # insert template directives
3144 utke 1.178 ad_input_code_sf.w2f.pre.xb.x2w.w2f.td.f$FS90: ad_input_code_sf.w2f.pre.xb.x2w.w2f.f$FS90 ../OAD_support/insertTemplateDir.bash
3145     ../OAD_support/insertTemplateDir.bash \$< \$@
3146 jmc 1.176
3147 utke 1.184 PPEXTRAS=\$(wildcard ../OAD_support/ad_template.*.F) ../OAD_support/ad_inline.F
3148 jmc 1.176 # postprocess F'
3149 utke 1.193 postProcess.tag: ad_input_code_sf.w2f.pre.xb.x2w.w2f.td.f$FS90 postProcess.py \$(PPEXTRAS:.F=.f)
3150 jmc 1.206 # the target is a placeholder to signal execution of the rule
3151 utke 1.193 touch \$@
3152 jmc 1.206 # this step also creates the file postProcess.make but we cannot
3153     # name it as the target or else make will try to remake it for
3154 utke 1.193 # the include directive above for any rule, e.g. make clean
3155 utke 1.199 ./postProcess.py --progress --timing --outputFormat=fixed -m r -i ../OAD_support/ad_inline.f --width 4 \$<
3156 jmc 1.176
3157     # setup some links
3158     %.xsd:
3159     \$(LN) \${XAIFSCHEMAROOT}/schema/\$@ .
3160    
3161 jmc 1.206 mfef90:
3162 jmc 1.176 \$(LN) \${OPEN64ROOT}/crayf90/sgi/mfef90 .
3163    
3164     # link the support files:
3165 jmc 1.206 \$(OPENAD_SUPPORT_F90_SRC_FILES) \$(OPENAD_SUPPORT_C_SRC_FILES):
3166 jmc 1.176 \$(LN) ../OAD_support/\$@ .
3167    
3168 jmc 1.206 whirl2xaif xaif2whirl:
3169 jmc 1.176 \$(LN) \${OPENADFORTTK}/bin/\$@ .
3170    
3171 jmc 1.206 preProcess.py postProcess.py:
3172 utke 1.178 \$(LN) \${OPENADFORTTK_BASE}/tools/SourceProcessing/\$@ .
3173 jmc 1.176
3174     whirl2f whirl2f_be:
3175     \$(LN) \${OPEN64ROOT}/whirl2f/\$@ .
3176    
3177 utke 1.183 oadDriver:
3178     \$(LN) \${XAIFBOOSTERROOT}/xaifBooster/algorithms/BasicBlockPreaccumulationReverse/driver/oadDriver \$@
3179 jmc 1.176
3180 utke 1.197 AD_CLEAN += *_mod.h *_mod.F90 *.FF90 *.mod-whirl temp.sed oad_cp.* postProcess.make postProcess.tag postProcess.comp \$(PPEXTRAS:.F=.f)
3181 utke 1.193
3182 jmc 1.176 # ============ end OpenAD specific section ==============
3183 edhill 1.1
3184     EOF
3185 edhill 1.7
3186 jmc 1.176 fi
3187    
3188     #=========================================
3189    
3190 edhill 1.7 if test "x$EXEHOOK" != x ; then
3191     printf "\nexehook:\n\t%s\n" $EXEHOOK >> $MAKEFILE
3192     fi
3193 edhill 1.1
3194     echo " Making list of \"exceptions\" that need \".p\" files"
3195     for i in $KPPFILES ; do
3196     base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
3197     RETVAL=$?
3198     if test "x$RETVAL" != x0 ; then
3199     echo "Error: unable to add file \"$i\" to the exceptions list"
3200     fi
3201 edhill 1.76 echo "$base.$FS: $base.p" >> $MAKEFILE
3202 edhill 1.1 done
3203    
3204     echo " Making list of NOOPTFILES"
3205     for i in $NOOPTFILES ; do
3206     base=`echo $i | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`
3207     RETVAL=$?
3208     if test "x$RETVAL" != x0 ; then
3209     echo "Error: unable to add file \"$i\" to the exceptions list"
3210     fi
3211 edhill 1.76 echo "$base.o: $base.$FS" >> $MAKEFILE
3212 edhill 1.2 printf "\t\$(FC) \$(FFLAGS) \$(NOOPTFLAGS) -c \$<\n" >> $MAKEFILE
3213 edhill 1.1 done
3214    
3215     echo " Add rules for links"
3216     cat srclinks.tmp >> $MAKEFILE
3217     rm -f srclinks.tmp
3218    
3219     echo " Adding makedepend marker"
3220 edhill 1.2 printf "\n\n# DO NOT DELETE\n" >> $MAKEFILE
3221 edhill 1.1
3222 edhill 1.2 printf "\n=== Done ===\n"
3223 adcroft 1.47
3224     # Create special header files
3225 jmc 1.206 $BASH $TOOLSDIR/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -bPACKAGES_CONFIG_H "Disabled packages:" $DISABLED_PACKAGES " " "Enabled packages:" $ENABLED_PACKAGES > $PACKAGES_DOT_H".tmp"
3226 adcroft 1.47 if test ! -f $PACKAGES_DOT_H ; then
3227     mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
3228     else
3229 edhill 1.61 cmp $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H > /dev/null 2>&1
3230 adcroft 1.47 RETVAL=$?
3231     if test "x$RETVAL" = x0 ; then
3232     rm -f $PACKAGES_DOT_H".tmp"
3233     else
3234     mv -f $PACKAGES_DOT_H $PACKAGES_DOT_H".bak"
3235     mv -f $PACKAGES_DOT_H".tmp" $PACKAGES_DOT_H
3236     fi
3237     fi
3238     if test ! -f AD_CONFIG.h ; then
3239 edhill 1.71 $BASH $TOOLSDIR/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -UALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN -UALLOW_ECCO_OPTIMIZATION > AD_CONFIG.h
3240 adcroft 1.47 fi
3241 edhill 1.5
3242    
3243     # Write the "state" for future records
3244 jmc 1.211 if test "x$DUMPSTATE" = xt ; then
3245 edhill 1.71 printf "" > genmake_state
3246 edhill 1.5 for i in $gm_state ; do
3247     t1="t2=\$$i"
3248     eval $t1
3249 edhill 1.12 echo "$i='$t2'" >> genmake_state
3250 edhill 1.5 done
3251     fi

  ViewVC Help
Powered by ViewVC 1.1.22