/[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.210 - (hide annotations) (download)
Tue Nov 2 00:51:11 2010 UTC (13 years, 4 months ago) by jmc
Branch: MAIN
Changes since 1.209: +30 -15 lines
- change Makefile to remove testreport output files only with "CLEAN" target
  (instead of "Clean");
- add description (comments in Makefile) of the 3 cleaning target.
- try to make "genmake_warnings" easier to read

1 edhill 1.86 #! /usr/bin/env bash
2 edhill 1.1 #
3 jmc 1.210 # $Header: /u/gcmpack/MITgcm/tools/genmake2,v 1.209 2010/11/01 00:20:28 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.210 echo "running: get_fortran_c_namemangling()" >> genmake_warnings
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 edhill 1.39 $MAKE genmake_test.o >> genmake_warnings 2>&1
667 edhill 1.31 RETVAL=$?
668     if test "x$RETVAL" != x0 ; then
669     FC_NAMEMANGLE=$default_nm
670 edhill 1.39 cat <<EOF>> genmake_errors
671    
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 edhill 1.39 cat <<EOF>> genmake_warnings
683    
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 edhill 1.134 $FC $FFLAGS -c genmake_tcomp.$FS >> genmake_warnings 2>&1
697 edhill 1.31 RETVAL=$?
698     if test "x$RETVAL" != x0 ; then
699     FC_NAMEMANGLE=$default_nm
700 edhill 1.39 cat <<EOF>> genmake_warnings
701    
702     WARNING: FORTRAN test compile fails -- please see "genmake_errors"
703     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 edhill 1.39 cat <<EOF>> genmake_warnings
713    
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.210 echo >> genmake_warnings
747     echo "running: check_HAVE_CLOC()" >> genmake_warnings
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     echo $COMM >> genmake_warnings
766     $COMM >> genmake_warnings 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     echo $COMM >> genmake_warnings
778     $COMM >> genmake_warnings 2>&1
779 edhill 1.39 RET_F=$?
780 edhill 1.118 test -x ./genmake_tc && ./genmake_tc >> genmake_warnings 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.210 echo >> genmake_warnings
795     echo "running: check_HAVE_SIGREG()" >> genmake_warnings
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     echo $COMM >> genmake_warnings
829     $COMM >> genmake_warnings 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     cat genmake_tc_2.$FS >> genmake_warnings
840     COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
841     echo $COMM >> genmake_warnings
842     $COMM >> genmake_warnings 2>&1
843     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.210 echo >> genmake_warnings
861     echo "running: check_HAVE_SETRLSTK()" >> genmake_warnings
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     echo $COMM >> genmake_warnings
879     $COMM >> genmake_warnings 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 edhill 1.135 cat genmake_tc_2.$FS >> genmake_warnings
888     COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
889     echo $COMM >> genmake_warnings
890     $COMM >> genmake_warnings 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.210 echo >> genmake_warnings
902     echo "running: check_HAVE_STAT()" >> genmake_warnings
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     echo $COMM >> genmake_warnings
925     $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 edhill 1.135 cat genmake_tc_2.$FS >> genmake_warnings
935     COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o"
936     echo $COMM >> genmake_warnings
937     $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 edhill 1.135 echo >> genmake_warnings
952     echo "running: check_netcdf_libs()" >> genmake_warnings
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 edhill 1.135 cat genmake_tnc.log >> genmake_warnings
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.210 echo "check_netcdf: successful" >> genmake_warnings
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.210 echo >> genmake_warnings
1011 edhill 1.135 cat genmake_tnc.log >> genmake_warnings
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.210 echo "check_netcdf: successful" >> genmake_warnings
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.210 echo >> genmake_warnings
1027 ce107 1.160 cat genmake_tnc.log >> genmake_warnings
1028     if test "x$RET_COMPILE" = x0 ; then
1029     LIBS="$LIBS -lnetcdff -lnetcdf"
1030     HAVE_NETCDF=t
1031 jmc 1.210 echo "check_netcdf: successful" >> genmake_warnings
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 edhill 1.11 DUMPSTATE=t
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     A program for GENerating MAKEfiles for the MITgcm project. For a
1172     quick list of options, use "genmake -h" or for more detail see:
1173    
1174     http://mitgcm.org/devel_HOWTO/
1175    
1176     EOF
1177 edhill 1.5
1178 jmc 1.210 #- clean-up previous genmake logfiles:
1179 jmc 1.209 rm -f genmake_state genmake_*optfile genmake_warnings genmake_errors
1180    
1181 edhill 1.2 echo "=== Processing options files and arguments ==="
1182 edhill 1.12 gm_local="genmake_local"
1183 edhill 1.71 printf " getting local config information: "
1184 edhill 1.88 if test -f $gm_local ; then
1185 edhill 1.1 echo "using $gm_local"
1186 edhill 1.34 . $gm_local
1187 edhill 1.2 # echo "DISABLE=$DISABLE"
1188     # echo "ENABLE=$ENABLE"
1189 edhill 1.1 else
1190     echo "none found"
1191     fi
1192    
1193 edhill 1.103 #echo "$0::$1:$2:$3:$4:$5:$6:$7:"
1194 edhill 1.2 #parse_options
1195     ac_prev=
1196 edhill 1.102 for ac_option in "$@" ; do
1197 edhill 1.2
1198 edhill 1.73 G2ARGS="$G2ARGS \"$ac_option\""
1199    
1200 edhill 1.2 # If the previous option needs an argument, assign it.
1201     if test -n "$ac_prev"; then
1202     eval "$ac_prev=\$ac_option"
1203     ac_prev=
1204     continue
1205     fi
1206 jmc 1.206
1207 edhill 1.2 ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
1208 jmc 1.206
1209 edhill 1.2 case $ac_option in
1210    
1211     -help | --help | -h | --h)
1212     usage ;;
1213    
1214     -nooptfile | --nooptfile)
1215     OPTFILE="NONE" ;;
1216     -optfile | --optfile | -of | --of)
1217 edhill 1.4 ac_prev=OPTFILE ;;
1218 edhill 1.2 -optfile=* | --optfile=* | -of=* | --of=*)
1219     OPTFILE=$ac_optarg ;;
1220    
1221 edhill 1.50 -adoptfile | --adoptfile | -adof | --adof)
1222 edhill 1.14 ac_prev=AD_OPTFILE ;;
1223     -adoptfile=* | --adoptfile=* | -adof=* | --adof=*)
1224     AD_OPTFILE=$ac_optarg ;;
1225    
1226 edhill 1.2 -pdepend | --pdepend)
1227 jmc 1.208 ac_prev=PKG_DEPEND ;;
1228 edhill 1.2 -pdepend=* | --pdepend=*)
1229 jmc 1.208 PKG_DEPEND=$ac_optarg ;;
1230 edhill 1.2
1231 jmc 1.208 -pgroups | --pgroups)
1232     ac_prev=PKG_GROUPS ;;
1233     -pgroups=* | --pgroups=*)
1234     PKG_GROUPS=$ac_optarg ;;
1235 edhill 1.2
1236 edhill 1.6 -make | --make | -m | --m)
1237     ac_prev=MAKE ;;
1238     -make=* | --make=* | -m=* | --m=*)
1239     MAKE=$ac_optarg ;;
1240 edhill 1.69
1241 edhill 1.71 -bash | --bash)
1242     ac_prev=BASH ;;
1243     -bash=* | --bash=*)
1244     BASH=$ac_optarg ;;
1245    
1246 edhill 1.69 -makedepend | --makedepend | -md | --md)
1247     ac_prev=MAKEDEPEND ;;
1248     -makedepend=* | --makedepend=* | -md=* | --md=*)
1249     MAKEDEPEND=$ac_optarg ;;
1250 edhill 1.6
1251     -makefile | --makefile | -ma | --ma)
1252 edhill 1.4 ac_prev=MAKEFILE ;;
1253 edhill 1.6 -makefile=* | --makefile=* | -ma=* | --ma=*)
1254 edhill 1.2 MAKEFILE=$ac_optarg ;;
1255    
1256 edhill 1.41 -platform | --platform | -pl | --pl | -platform=* | --platform=* | -pl=* | --pl=*)
1257     echo "ERROR: The platform option has been removed. Please specify"
1258     echo " the build options using the \"optfile\" mechanism."
1259     echo
1260     usage
1261     ;;
1262 edhill 1.2
1263     -rootdir | --rootdir | -rd | --rd)
1264 edhill 1.4 ac_prev=ROOTDIR ;;
1265 edhill 1.2 -rootdir=* | --rootdir=* | -rd=* | --rd=*)
1266     ROOTDIR=$ac_optarg ;;
1267    
1268     -mods | --mods | -mo | --mo)
1269 edhill 1.4 ac_prev=MODS ;;
1270 edhill 1.2 -mods=* | --mods=* | -mo=* | --mo=*)
1271     MODS=$ac_optarg ;;
1272    
1273     -disable | --disable)
1274 edhill 1.4 ac_prev=DISABLE ;;
1275 edhill 1.2 -disable=* | --disable=*)
1276     DISABLE=$ac_optarg ;;
1277    
1278     -enable | --enable)
1279 edhill 1.4 ac_prev=ENABLE ;;
1280 edhill 1.2 -enable=* | --enable=*)
1281     ENABLE=$ac_optarg ;;
1282    
1283 edhill 1.12 -standarddirs | --standarddirs)
1284     ac_prev=STANDARDDIRS ;;
1285     -standarddirs=* | --standarddirs=*)
1286     STANDARDDIRS=$ac_optarg ;;
1287    
1288 edhill 1.2 # -cpp | --cpp)
1289     # ac_prev=cpp ;;
1290     # -cpp=* | --cpp=*)
1291     # CPP=$ac_optarg ;;
1292 edhill 1.91
1293     -cc | --cc)
1294     ac_prev=CC ;;
1295     -cc=* | --cc=*)
1296     CC=$ac_optarg ;;
1297    
1298 edhill 1.2 -fortran | --fortran | -fc | --fc)
1299 edhill 1.4 ac_prev=FC ;;
1300 edhill 1.2 -fc=* | --fc=*)
1301     FC=$ac_optarg ;;
1302    
1303 edhill 1.76 -fs | --fs)
1304     ac_prev=FS ;;
1305     -fs=* | --fs=*)
1306     FS=$ac_optarg ;;
1307    
1308     -fs90 | --fs90)
1309     ac_prev=FS90 ;;
1310     -fs90=* | --fs90=*)
1311     FS90=$ac_optarg ;;
1312    
1313 edhill 1.2 -ieee | --ieee)
1314 edhill 1.12 IEEE=true ;;
1315 edhill 1.2 -noieee | --noieee)
1316 edhill 1.12 IEEE= ;;
1317 adcroft 1.67
1318 jmc 1.203 -use_real4 | -use_r4 | -ur4 | --use_real4 | --use_r4 | --ur4 )
1319     USE_R4=true ;;
1320    
1321 ce107 1.126 -ts | --ts)
1322     TS=true ;;
1323 ce107 1.139 -papis | --papis)
1324     PAPIS=true ;;
1325 ce107 1.147 -pcls | --pcls)
1326     PCLS=true ;;
1327 ce107 1.139 -foolad | --foolad)
1328     FOOLAD=true ;;
1329     -papi | --papi)
1330     PAPI=true ;;
1331 ce107 1.147 -pcl | --pcl)
1332     PCL=true ;;
1333 ce107 1.139 -hpmt | --hpmt)
1334     HPMT=true ;;
1335    
1336     -gsl | --gsl)
1337     GSL=true ;;
1338 ce107 1.126
1339 ce107 1.160 -devel | --devel)
1340     DEVEL=true ;;
1341    
1342 adcroft 1.67 -mpi | --mpi)
1343     MPI=true ;;
1344     -mpi=* | --mpi=*)
1345     MPIPATH=$ac_optarg
1346     MPI=true ;;
1347 edhill 1.2
1348 jmc 1.187 -omp | --omp)
1349     OMP=true ;;
1350     -omp=* | --omp=*)
1351     OMPFLAG=$ac_optarg
1352     OMP=true ;;
1353 edhill 1.2
1354 edhill 1.5 -ds | --ds)
1355     DUMPSTATE=t ;;
1356    
1357 edhill 1.17 -taf_extra | --taf_extra)
1358     ac_prev=TAF_EXTRA ;;
1359     -taf_extra=* | --taf_extra=*)
1360     TAF_EXTRA=$ac_optarg ;;
1361    
1362     -tamc_extra | --tamc_extra)
1363     ac_prev=TAMC_EXTRA ;;
1364     -tamc_extra=* | --tamc_extra=*)
1365     TAMC_EXTRA=$ac_optarg ;;
1366 edhill 1.124
1367     -ignoretime | -ignore_time | --ignoretime | --ignore_time)
1368     IGNORE_TIME="-DIGNORE_TIME" ;;
1369 edhill 1.17
1370 edhill 1.141 -es | --es | -embed-source | --embed-source)
1371     EMBED_SRC=t ;;
1372    
1373 edhill 1.2 -*)
1374     echo "Error: unrecognized option: "$ac_option
1375     usage
1376     ;;
1377    
1378     *)
1379     echo "Error: unrecognized argument: "$ac_option
1380     usage
1381     ;;
1382    
1383     esac
1384 jmc 1.206
1385 edhill 1.1 done
1386    
1387 edhill 1.119
1388 edhill 1.12 if test -f ./.genmakerc ; then
1389     echo
1390     echo "WARNING: genmake2 has detected a copy of the old-style \"./.genmakerc\""
1391 jmc 1.161 echo " file. This file format is no longer supported. For directions on"
1392     echo " how to setup and use the new \"genmake2\" script, please see:"
1393 edhill 1.12 echo " http://mitgcm.org/devel_HOWTO/"
1394 jmc 1.161 echo " and send an email to MITgcm-support@mitgcm.org if you need help."
1395     echo "WARNING: ignore \"./.genmakerc\" and continue."
1396 jmc 1.206 echo
1397 edhill 1.12 fi
1398    
1399 edhill 1.97 # Find the MITgcm ${ROOTDIR}
1400 edhill 1.11 if test "x${ROOTDIR}" = x ; then
1401 edhill 1.112 tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1402 edhill 1.154 if test "x$tmp" = "xbin" -a -d ../model -a -d ../eesupp -a -d ../pkg ; then
1403 edhill 1.11 ROOTDIR=".."
1404     else
1405     for d in . .. ../.. ../../.. ../../../.. ../../../../.. ; do
1406     if [ -d "$d/model" -a -d "$d/eesupp" -a -d "$d/pkg" ]; then
1407     ROOTDIR=$d
1408 edhill 1.71 printf "Warning: ROOTDIR was not specified but there appears to be"
1409 edhill 1.11 echo " a copy of MITgcm at \"$ROOTDIR\" so we'll try it."
1410     break
1411     fi
1412     done
1413     fi
1414     fi
1415     if test "x${ROOTDIR}" = x ; then
1416     echo "Error: Cannot determine ROOTDIR for MITgcm code."
1417     echo " Please specify a ROOTDIR using either an options "
1418     echo " file or a command-line option."
1419     exit 1
1420     fi
1421     if test ! -d ${ROOTDIR} ; then
1422     echo "Error: the specified ROOTDIR (\"$ROOTDIR\") does not exist!"
1423     exit 1
1424     fi
1425    
1426 edhill 1.97 # Find the MITgcm ${THISVER}
1427 jmc 1.179 version_file="${ROOTDIR}/doc/tag-index"
1428     if test -f $version_file ; then
1429 jmc 1.200 THISVER=`$AWK '/^checkpoint/{print $1; exit}' $version_file`
1430 jmc 1.179 #- remove ./BUILD_INFO.h file if older than version_file
1431     if test -f ./BUILD_INFO.h -a ./BUILD_INFO.h -ot $version_file ; then
1432     echo " remove ./BUILD_INFO.h (older than ${version_file})"
1433     rm -f ./BUILD_INFO.h
1434     fi
1435 edhill 1.97 fi
1436    
1437 edhill 1.119 if test "x$MAKEFILE" = x ; then
1438     MAKEFILE="Makefile"
1439     fi
1440    
1441 edhill 1.1 echo " getting OPTFILE information: "
1442     if test "x${OPTFILE}" = x ; then
1443 edhill 1.11 if test "x$MITGCM_OF" = x ; then
1444     echo "Warning: no OPTFILE specified so we'll look for possible settings"
1445     printf "\n=== Searching for possible settings for OPTFILE ===\n"
1446     find_possible_configs
1447 edhill 1.1 else
1448 edhill 1.11 OPTFILE=$MITGCM_OF
1449     fi
1450     fi
1451     if test "x$OPTFILE" != xNONE ; then
1452     if test -f "$OPTFILE" -a -r "$OPTFILE" ; then
1453     echo " using OPTFILE=\"$OPTFILE\""
1454 edhill 1.34 . "$OPTFILE"
1455 edhill 1.11 RETVAL=$?
1456     if test "x$RETVAL" != x0 ; then
1457 edhill 1.71 printf "Error: failed to source OPTFILE \"$OPTFILE\""
1458 edhill 1.11 echo "--please check that variable syntax is bash-compatible"
1459 edhill 1.1 exit 1
1460     fi
1461 edhill 1.11 if test "x$DUMPSTATE" != xf ; then
1462 edhill 1.12 cp -f $OPTFILE "genmake_optfile"
1463 edhill 1.11 fi
1464     else
1465     echo "Error: can't read OPTFILE=\"$OPTFILE\""
1466     exit 1
1467 edhill 1.1 fi
1468     fi
1469 edhill 1.8
1470 edhill 1.14 echo " getting AD_OPTFILE information: "
1471     if test "x${AD_OPTFILE}" = x ; then
1472     if test "x$MITGCM_AD_OF" = x ; then
1473     AD_OPTFILE=$ROOTDIR/tools/adjoint_options/adjoint_default
1474     else
1475     AD_OPTFILE=$MITGCM_AD_OF
1476     fi
1477     fi
1478     if test "x${AD_OPTFILE}" != xNONE ; then
1479     if test -f "$AD_OPTFILE" -a -r "$AD_OPTFILE" ; then
1480     echo " using AD_OPTFILE=\"$AD_OPTFILE\""
1481 edhill 1.34 . "$AD_OPTFILE"
1482 edhill 1.14 RETVAL=$?
1483     if test "x$RETVAL" != x0 ; then
1484 edhill 1.71 printf "Error: failed to source AD_OPTFILE \"$AD_OPTFILE\""
1485 edhill 1.14 echo "--please check that variable syntax is bash-compatible"
1486     exit 1
1487     fi
1488     if test "x$DUMPSTATE" != xf ; then
1489     cp -f $AD_OPTFILE "genmake_ad_optfile"
1490     fi
1491     else
1492     echo "Error: can't read AD_OPTFILE=\"$AD_OPTFILE\""
1493     exit 1
1494     fi
1495     fi
1496    
1497 edhill 1.119 #====================================================================
1498     # Set default values if not set by the optfile
1499     #
1500 edhill 1.91 # Check that FC, CC, LINK, CPP, S64, LN, and MAKE are defined. If not,
1501 edhill 1.39 # either set defaults or complain and abort!
1502 edhill 1.71 if test ! "x$BASH" = x ; then
1503     # add a trailing space so that it works within the Makefile syntax (see below)
1504     BASH="$BASH "
1505     fi
1506 edhill 1.8 if test "x$FC" = x ; then
1507     cat <<EOF 1>&2
1508    
1509     Error: no Fortran compiler: please specify using one of the following:
1510     1) within the options file ("FC=...") as specified by "-of=OPTFILE"
1511     2) the "-fc=XXX" command-line option
1512 edhill 1.12 3) the "./genmake_local" file
1513 edhill 1.8 EOF
1514     exit 1
1515     fi
1516 edhill 1.91 if test "x$CC" = x ; then
1517 edhill 1.93 CC=cc
1518     # cat <<EOF 1>&2
1519     # Error: no C compiler: please specify using one of the following:
1520     # 1) within the options file ("CC=...") as specified by "-of=OPTFILE"
1521     # 2) the "-cc=XXX" command-line option
1522     # 3) the "./genmake_local" file
1523     # EOF
1524     # exit 1
1525 edhill 1.91 fi
1526 edhill 1.8 if test "x$LINK" = x ; then
1527     LINK=$FC
1528     fi
1529 edhill 1.39 if test "x$MAKE" = x ; then
1530     MAKE="make"
1531     fi
1532 edhill 1.63 if test "x$CPP" = x ; then
1533     CPP=cpp
1534     fi
1535     #EH3 === UGLY ===
1536 edhill 1.76 # The following is an ugly little hack to check for $CPP in /lib/ and
1537     # it should eventually be replaced with a more general function that
1538 edhill 1.63 # searches a combo of the user's path and a list of "usual suspects"
1539     # to find the correct location for binaries such as $CPP.
1540     for i in " " "/lib/" ; do
1541     echo "#define A a" | $i$CPP > test_cpp 2>&1 && CPP=$i$CPP
1542     done
1543     #EH3 === UGLY ===
1544 edhill 1.13 echo "#define A a" | $CPP > test_cpp 2>&1
1545 edhill 1.11 RETVAL=$?
1546     if test "x$RETVAL" != x0 ; then
1547 edhill 1.8 cat <<EOF 1>&2
1548    
1549 edhill 1.11 Error: C pre-processor "$CPP" failed the test case: please specify using:
1550    
1551 edhill 1.8 1) within the options file ("CPP=...") as specified by "-of=OPTFILE"
1552 edhill 1.12 2) the "./genmake_local" file
1553 edhill 1.30 3) with the CPP environment variable
1554 edhill 1.11
1555 edhill 1.8 EOF
1556     exit 1
1557 edhill 1.11 else
1558     rm -f test_cpp
1559 edhill 1.8 fi
1560 edhill 1.84 look_for_makedepend
1561 edhill 1.35 if test "x$LN" = x ; then
1562     LN="ln -s"
1563     fi
1564     echo "test" > genmake_test_ln
1565     $LN genmake_test_ln genmake_tlink
1566     RETVAL=$?
1567     if test "x$RETVAL" != x0 ; then
1568     cat <<EOF 1>&2
1569 edhill 1.29
1570 edhill 1.35 Error: The command "ln -s" failed -- please specify a working soft-link
1571     command in the optfile.
1572    
1573     EOF
1574     exit 1
1575     fi
1576 edhill 1.131 test -L genmake_tlink > /dev/null 2>&1
1577     RETVAL=$?
1578     if test "x$RETVAL" = x0 ; then
1579     HAVE_TEST_L=t
1580     fi
1581 edhill 1.35 rm -f genmake_test_ln genmake_tlink
1582 edhill 1.77
1583     # Check for broken *.F/*.f handling and fix if possible
1584     check_for_broken_Ff
1585 edhill 1.29
1586 adcroft 1.67 if test ! "x$MPI" = x ; then
1587     echo " Turning on MPI cpp macros"
1588 adcroft 1.68 DEFINES="$DEFINES -DALLOW_USE_MPI -DALWAYS_USE_MPI"
1589 adcroft 1.67 fi
1590 jmc 1.187 if test ! "x$OMP" = x ; then
1591     echo " Add OMPFLAG and turn on OpenMP cpp macros"
1592     FFLAGS="$FFLAGS $OMPFLAG"
1593     F90FLAGS="$F90FLAGS $OMPFLAG"
1594     DEFINES="$DEFINES -DUSE_OMP_THREADING"
1595     fi
1596 edhill 1.39
1597 jmc 1.203 if test ! "x$USE_R4" = x ; then
1598     echo " Turning on LET_RS_BE_REAL4 cpp flag"
1599     DEFINES="$DEFINES -DLET_RS_BE_REAL4"
1600     fi
1601    
1602 ce107 1.126 if test ! "x$TS" = x ; then
1603     echo " Turning on timing per timestep"
1604 ce107 1.139 if test ! "x$FOOLAD" = x ; then
1605     DEFINES="$DEFINES -DTIME_PER_TIMESTEP_SFP"
1606     else
1607     DEFINES="$DEFINES -DTIME_PER_TIMESTEP"
1608     fi
1609 ce107 1.164 PACKAGES="$PACKAGES showflops"
1610 ce107 1.139 fi
1611     if test ! "x$PAPIS" = x ; then
1612     echo " Turning on PAPI flop summary per timestep"
1613     echo " Please make sure PAPIINC, PAPILIB are defined"
1614     if test ! "x$FOOLAD" = x ; then
1615     DEFINES="$DEFINES -DUSE_PAPI_FLOPS_SFP"
1616     else
1617     DEFINES="$DEFINES -DUSE_PAPI_FLOPS"
1618     fi
1619     INCLUDES="$INCLUDES $PAPIINC"
1620     LIBS="$LIBS $PAPILIB"
1621 ce107 1.164 PACKAGES="$PACKAGES showflops"
1622 ce107 1.139 fi
1623 ce107 1.147 if test ! "x$PCLS" = x ; then
1624     echo " Turning on PCL counter summary per timestep"
1625     echo " Please make sure PCLINC, PCLLIB are defined"
1626     if test ! "x$FOOLAD" = x ; then
1627     DEFINES="$DEFINES -DUSE_PCL_FLOPS_SFP"
1628     else
1629     DEFINES="$DEFINES -DUSE_PCL_FLOPS"
1630     fi
1631     INCLUDES="$INCLUDES $PCLINC"
1632     LIBS="$LIBS $PCLLIB"
1633 ce107 1.164 PACKAGES="$PACKAGES showflops"
1634 ce107 1.147 fi
1635 ce107 1.139 if test ! "x$PAPI" = x ; then
1636     if test ! "x$PAPIS" = x ; then
1637     echo " PAPI performance analysis and flop summary per timestep cannot co-exist!"
1638     echo " Sticking with PAPI flop summary per timestep!"
1639     else
1640     echo " Turning on performance analysis with PAPI"
1641     echo " Please make sure PAPIINC, PAPILIB are defined"
1642     DEFINES="$DEFINES -DUSE_PAPI"
1643     INCLUDES="$INCLUDES $PAPIINC"
1644     LIBS="$LIBS $PAPILIB"
1645     fi
1646     fi
1647 ce107 1.147 if test ! "x$PCL" = x ; then
1648     if test ! "x$PCLS" = x ; then
1649     echo " PCL performance analysis and flop summary per timestep cannot co-exist!"
1650     echo " Sticking with PCL flop summary per timestep!"
1651     else
1652     echo " Turning on performance analysis with PCL"
1653     echo " Please make sure PCLINC, PCLLIB are defined"
1654     DEFINES="$DEFINES -DUSE_PCL"
1655     INCLUDES="$INCLUDES $PCLINC"
1656     LIBS="$LIBS $PCLLIB"
1657     fi
1658     fi
1659 ce107 1.139 if test ! "x$HPMT" = x ; then
1660     if test ! "x$PAPI" = x ; then
1661     echo " PAPI and the HPM Toolkit cannot co-exist!"
1662     echo " Sticking with PAPI!"
1663 ce107 1.147 else if test ! "x$PCL" = x ; then
1664     echo " PCL and the HPM Toolkit cannot co-exist!"
1665     echo " Sticking with PCL!"
1666 ce107 1.139 else
1667     echo " Turning on performance analysis with the HPM Toolkit"
1668     echo " Please make sure HPMTINC, HPMTLIB are defined"
1669     DEFINES="$DEFINES -DUSE_LIBHPM"
1670     INCLUDES="$INCLUDES $HPMTINC"
1671     LIBS="$LIBS $HPMTLIB"
1672     fi
1673 ce107 1.148 fi
1674 ce107 1.139 fi
1675     if test ! "x$GSL" = x ; then
1676     echo " Turning on use of GSL to control floating point calculations"
1677     echo " Please make sure GSLINC, GSLLIB are defined"
1678     DEFINES="$DEFINES -DUSE_GSL_IEEE"
1679     INCLUDES="$INCLUDES $GSLINC"
1680     LIBS="$LIBS $GSLLIB"
1681 ce107 1.126 fi
1682 jmc 1.181 #- if USE_EXTENDED_SRC is set, add EXTENDED_SRC_FLAG to FFLAGS :
1683     if test ! "x$USE_EXTENDED_SRC" = x ; then
1684     FFLAGS="$FFLAGS $EXTENDED_SRC_FLAG"
1685     F90FIXEDFORMAT="$F90FIXEDFORMAT $EXTENDED_SRC_FLAG"
1686     fi
1687 ce107 1.126
1688 edhill 1.29 printf "\n=== Checking system libraries ===\n"
1689 edhill 1.71 printf " Do we have the system() command using $FC... "
1690 edhill 1.118 cat > genmake_tcomp.$FS <<EOF
1691 edhill 1.29 program hello
1692     call system('echo hi')
1693     end
1694     EOF
1695 edhill 1.134 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1696 edhill 1.29 RETVAL=$?
1697     if test "x$RETVAL" = x0 ; then
1698     HAVE_SYSTEM=t
1699     DEFINES="$DEFINES -DHAVE_SYSTEM"
1700     echo "yes"
1701     else
1702     HAVE_SYSTEM=
1703     echo "no"
1704     fi
1705     rm -f genmake_tcomp*
1706    
1707 edhill 1.71 printf " Do we have the fdate() command using $FC... "
1708 edhill 1.118 cat > genmake_tcomp.$FS <<EOF
1709 edhill 1.29 program hello
1710 edhill 1.129 CHARACTER*(128) string
1711 edhill 1.29 string = ' '
1712     call fdate( string )
1713     print *, string
1714     end
1715     EOF
1716 edhill 1.134 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1717 edhill 1.29 RETVAL=$?
1718     if test "x$RETVAL" = x0 ; then
1719     HAVE_FDATE=t
1720     DEFINES="$DEFINES -DHAVE_FDATE"
1721     echo "yes"
1722     else
1723     HAVE_FDATE=
1724     echo "no"
1725     fi
1726     rm -f genmake_tcomp*
1727    
1728 cnh 1.81 printf " Do we have the etime() command using $FC... "
1729 edhill 1.118 cat > genmake_tcomp.$FS <<EOF
1730 cnh 1.81 program hello
1731 cnh 1.82 REAL*4 ACTUAL, TARRAY(2)
1732     EXTERNAL ETIME
1733     REAL*4 ETIME
1734     actual = etime( tarray )
1735 cnh 1.81 print *, tarray
1736     end
1737     EOF
1738 edhill 1.134 $FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1
1739 cnh 1.81 RETVAL=$?
1740     if test "x$RETVAL" = x0 ; then
1741     HAVE_ETIME=t
1742     DEFINES="$DEFINES -DHAVE_ETIME"
1743     echo "yes"
1744     else
1745     HAVE_ETIME=
1746     echo "no"
1747     fi
1748     rm -f genmake_tcomp*
1749    
1750 edhill 1.71 printf " Can we call simple C routines (here, \"cloc()\") using $FC... "
1751 edhill 1.39 check_HAVE_CLOC
1752     if test "x$HAVE_CLOC" != x ; then
1753     echo "yes"
1754     else
1755     echo "no"
1756 edhill 1.141 if test "x$EMBED_SRC" = xt ; then
1757     echo " WARNING: you requested file embedding but it has"
1758     echo " been disabled since C code cannot be called"
1759     EMBED_SRC=
1760     fi
1761 edhill 1.29 fi
1762 edhill 1.39 rm -f genmake_t*
1763 edhill 1.29
1764 edhill 1.130 printf " Can we unlimit the stack size using $FC... "
1765     check_HAVE_SETRLSTK
1766 edhill 1.151 if test "x$HAVE_SETRLSTK" = xt ; then
1767 edhill 1.130 echo "yes"
1768     else
1769     echo "no"
1770     fi
1771     rm -f genmake_t*
1772    
1773 edhill 1.137 printf " Can we register a signal handler using $FC... "
1774     check_HAVE_SIGREG
1775 edhill 1.150 if test "x$HAVE_SIGREG" = xt ; then
1776 edhill 1.137 echo "yes"
1777     else
1778     echo "no"
1779     fi
1780     rm -f genmake_t*
1781    
1782 edhill 1.108 printf " Can we use stat() through C calls... "
1783     check_HAVE_STAT
1784     if test "x$HAVE_STAT" != x ; then
1785     echo "yes"
1786     else
1787     echo "no"
1788     fi
1789     rm -f genmake_t*
1790    
1791 edhill 1.71 printf " Can we create NetCDF-enabled binaries... "
1792 edhill 1.60 check_netcdf_libs
1793     if test "x$HAVE_NETCDF" != x ; then
1794     echo "yes"
1795     else
1796     echo "no"
1797     fi
1798 edhill 1.124 DEFINES="$DEFINES $IGNORE_TIME"
1799 edhill 1.8
1800 edhill 1.141 if test "x$EMBED_SRC" = xt ; then
1801     build_embed_encode
1802     fi
1803     if test "x$EMBED_SRC" = xt ; then
1804     ENABLE="$ENABLE embed_files"
1805     fi
1806    
1807    
1808 edhill 1.2 printf "\n=== Setting defaults ===\n"
1809 jmc 1.185 printf " Adding MODS directories: "
1810 edhill 1.1 for d in $MODS ; do
1811     if test ! -d $d ; then
1812 edhill 1.2 echo
1813     echo "Error: MODS directory \"$d\" not found!"
1814 edhill 1.1 exit 1
1815     else
1816 jmc 1.185 printf "$d "
1817 edhill 1.1 SOURCEDIRS="$SOURCEDIRS $d"
1818     INCLUDEDIRS="$INCLUDEDIRS $d"
1819     fi
1820     done
1821     echo
1822    
1823     if test "x${PLATFORM}" = x ; then
1824     PLATFORM=$p_PLATFORM
1825     fi
1826    
1827     if test "x${EXEDIR}" = x ; then
1828 edhill 1.112 tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'`
1829 edhill 1.87 if test "x$tmp" = "xbin" -a -d ../exe -a $ROOTDIR = .. ; then
1830 edhill 1.1 EXEDIR=../exe
1831     else
1832     EXEDIR=.
1833     fi
1834     fi
1835     if test ! -d ${EXEDIR} ; then
1836     echo "Error: the specified EXEDIR (\"$EXEDIR\") does not exist!"
1837     exit 1
1838     fi
1839    
1840     if test "x${TOOLSDIR}" = x ; then
1841     TOOLSDIR="$ROOTDIR/tools"
1842     fi
1843     if test ! -d ${TOOLSDIR} ; then
1844 cnh 1.65 echo "Error: the specified TOOLSDIR (\"$TOOLSDIR\") does not exist!"
1845 edhill 1.1 exit 1
1846     fi
1847 edhill 1.11 if test "x$S64" = x ; then
1848 edhill 1.104 echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.sh > /dev/null 2>&1
1849     RETVAL=$?
1850     if test "x${RETVAL}" = x0 ; then
1851     S64='$(TOOLSDIR)/set64bitConst.sh'
1852     else
1853     echo "3.0 _d 3" | ${TOOLSDIR}/set64bitConst.csh > /dev/null 2>&1
1854     RETVAL=$?
1855     if test "x${RETVAL}" = x0 ; then
1856     S64='$(TOOLSDIR)/set64bitConst.csh'
1857     else
1858     cat <<EOF
1859    
1860     ERROR: neither of the two default scripts:
1861    
1862     ${TOOLSDIR}/set64bitConst.sh
1863     ${TOOLSDIR}/set64bitConst.csh
1864    
1865 jmc 1.206 are working so please check paths or specify (with \$S64) a
1866 edhill 1.104 working version of this script.
1867    
1868     EOF
1869     exit 1
1870     fi
1871     fi
1872 edhill 1.11 fi
1873 adcroft 1.44 THIS_SCRIPT=`echo ${0} | sed 's:'$TOOLSDIR':\$(TOOLSDIR):'`
1874 edhill 1.1
1875     EXECUTABLE=${EXECUTABLE:-mitgcmuv}
1876    
1877 jmc 1.205 # Set Standard Code Directories:
1878     if test "x$STANDARDDIRS" = xUSE_THE_DEFAULT ; then
1879     STANDARDDIRS="eesupp model"
1880     fi
1881     # if model in Standard-Code-Dir, add eesupp (needed to compile model)
1882     echo " $STANDARDDIRS " | grep ' model ' > /dev/null 2>&1
1883     ckM=$?
1884     echo " $STANDARDDIRS " | grep ' eesupp ' > /dev/null 2>&1
1885     ckE=$?
1886 jmc 1.206 if test $ckM = 0 -a $ckE = 1 ; then
1887 jmc 1.205 STANDARDDIRS="$STANDARDDIRS eesupp"
1888     fi
1889    
1890 edhill 1.1 # We have a special set of source files in eesupp/src which are
1891     # generated from some template source files. We'll make them first so
1892     # they appear as regular source code
1893     if test -r $ROOTDIR"/eesupp/src/Makefile" ; then
1894     echo " Making source files in eesupp from templates"
1895 jmc 1.207 ( cd $ROOTDIR"/eesupp/src/" && $MAKE clean_old && $MAKE \
1896     ) > make_eesupp.errors 2>&1
1897 edhill 1.1 RETVAL=$?
1898 edhill 1.2 if test "x${RETVAL}" = x0 ; then
1899 edhill 1.1 rm -f make_eesupp.errors
1900     else
1901     echo "Error: problem encountered while building source files in eesupp:"
1902 edhill 1.62 cat make_eesupp.errors 1>&2
1903 edhill 1.1 exit 1
1904 afe 1.58 fi
1905     fi
1906    
1907 edhill 1.154 #same for pkg/exch2 and pkg/regrid
1908     for pdir in exch2 regrid ; do
1909     if test -r $ROOTDIR"/pkg/${pdir}/Makefile" ; then
1910     echo " Making source files in pkg/${pdir} from templates"
1911 jmc 1.207 ( cd $ROOTDIR"/pkg/"${pdir} && $MAKE clean_old && $MAKE \
1912     ) > make_${pdir}.errors 2>&1
1913 edhill 1.154 RETVAL=$?
1914     if test "x${RETVAL}" = x0 ; then
1915     rm -f make_${pdir}.errors
1916     else
1917     echo "Error: problem encountered while building source files in pkg/${pdir}:"
1918     cat make_${pdir}.errors 1>&2
1919     exit 1
1920     fi
1921 edhill 1.1 fi
1922 edhill 1.154 done
1923 edhill 1.1
1924 edhill 1.2 printf "\n=== Determining package settings ===\n"
1925 jmc 1.208 if test "x${PKG_DEPEND}" = x ; then
1926 edhill 1.1 tmp=$ROOTDIR"/pkg/pkg_depend"
1927 jmc 1.208 if test -r $tmp ; then PKG_DEPEND=$tmp ; fi
1928     fi
1929     if test "x${PKG_DEPEND}" = x ; then
1930 edhill 1.1 echo "Warning: No package dependency information was specified."
1931     echo " Please check that ROOTDIR/pkg/pkg_depend exists."
1932 jmc 1.208 else
1933     if test ! -r ${PKG_DEPEND} ; then
1934     echo "Error: can't read package dependency info from PKG_DEPEND=\"$PKG_DEPEND\""
1935     exit 1
1936 edhill 1.1 fi
1937 jmc 1.208 echo " getting package dependency info from $PKG_DEPEND"
1938     # Strip the comments and then convert the dependency file into arrays: PNAME, DNAME
1939     get_pdepend_list $PKG_DEPEND
1940     fi
1941    
1942     # A default package groups file "$ROOTDIR/pkg/pkg_groups" is provided
1943     # to define the "default_pkg_list" and package groups (for convenience, one
1944     # can specify a group of packages using names like "ocean" and "atmosphere").
1945     if test "x${PKG_GROUPS}" = x ; then
1946     tmp=$ROOTDIR"/pkg/pkg_groups"
1947     if test -r $tmp ; then PKG_GROUPS=$tmp ; fi
1948     fi
1949     if test "x${PKG_GROUPS}" = x ; then
1950     echo "Warning: No package groups information was specified."
1951     echo " Please check that ROOTDIR/pkg/pkg_groups exists."
1952 edhill 1.1 else
1953 jmc 1.208 if test ! -r ${PKG_GROUPS} ; then
1954     echo "Error: can't read package groups info from PKG_GROUPS=\"$PKG_GROUPS\""
1955 edhill 1.1 exit 1
1956     fi
1957 jmc 1.208 echo " getting package groups info from $PKG_GROUPS"
1958 edhill 1.1 fi
1959 jmc 1.208
1960     # Search for packages to compile.
1961     echo " checking list of packages to compile:"
1962     PKG_LIST=
1963     if test "x${PKG_LIST}" = x ; then
1964 edhill 1.12 for i in "." $MODS ; do
1965     if test -r $i"/packages.conf" ; then
1966 jmc 1.208 PKG_LIST=$i"/packages.conf"
1967 edhill 1.12 break
1968     fi
1969     done
1970     fi
1971 jmc 1.208 if test "x${PKG_LIST}" = x ; then
1972     pkg_list='default_pkg_list'
1973     if test "x${PKG_GROUPS}" = x ; then
1974     echo "Error: need package groups info to expand pkg_list=\"$pkg_list\""
1975     exit 1
1976     fi
1977 edhill 1.1 else
1978 jmc 1.208 if test ! -r $PKG_LIST ; then
1979     echo "Error: can't read package list from PKG_LIST=\"$PKG_LIST\""
1980     exit 1
1981 edhill 1.1 else
1982 jmc 1.208 echo " using PKG_LIST=\"$PKG_LIST\""
1983 edhill 1.1 # Strip the comments and add all the names
1984 jmc 1.208 pkg_list=`cat $PKG_LIST | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'`
1985 edhill 1.1 RETVAL=$?
1986     if test "x${RETVAL}" != x0 ; then
1987 jmc 1.208 printf "Error: can't parse package list "
1988     echo "-- please check PKG_LIST=\"$PKG_LIST\""
1989 edhill 1.1 exit 1
1990     fi
1991     fi
1992     fi
1993 jmc 1.208 for i in $pkg_list ; do
1994     PACKAGES="$PACKAGES $i"
1995     done
1996     echo " before group expansion packages are:$PACKAGES"
1997     if test "x${PKG_GROUPS}" != x ; then
1998     RET=1
1999     while test $RET = 1 ; do expand_pkg_groups; RET=$?; done
2000     echo " after group expansion packages are: $PACKAGES"
2001     fi
2002 edhill 1.1
2003     echo " applying DISABLE settings"
2004 jmc 1.205 echo "" > ./.tmp_pack
2005 adcroft 1.74 for i in $PACKAGES ; do
2006     echo $i >> ./.tmp_pack
2007     done
2008     for i in `grep "-" ./.tmp_pack` ; do
2009     j=`echo $i | sed 's/[-]//'`
2010     DISABLE="$DISABLE $j"
2011     done
2012 edhill 1.1 pack=
2013     for p in $PACKAGES ; do
2014     addit="t"
2015     for d in $DISABLE ; do
2016     if test "x$p" = "x$d" ; then
2017     addit="f"
2018     fi
2019     done
2020     if test "x$addit" = xt ; then
2021     pack="$pack $p"
2022     fi
2023     done
2024     PACKAGES="$pack"
2025     echo " applying ENABLE settings"
2026 edhill 1.12 echo "" > ./.tmp_pack
2027 edhill 1.1 PACKAGES="$PACKAGES $ENABLE"
2028 adcroft 1.74 # Test if each explicitly referenced package exists
2029 edhill 1.1 for i in $PACKAGES ; do
2030 adcroft 1.74 j=`echo $i | sed 's/[-+]//'`
2031     if test ! -d "$ROOTDIR/pkg/$j" ; then
2032 jmc 1.208 echo "Error: dir '$ROOTDIR/pkg/$i' missing for package '$i'"
2033 adcroft 1.74 exit 1
2034 edhill 1.1 fi
2035     echo $i >> ./.tmp_pack
2036     done
2037     PACKAGES=
2038 adcroft 1.74 for i in `grep -v "-" ./.tmp_pack | sort | uniq` ; do
2039 edhill 1.1 PACKAGES="$PACKAGES $i"
2040     done
2041 adcroft 1.74 rm -f ./.tmp_pack
2042 jmc 1.205 echo " packages are: $PACKAGES"
2043 edhill 1.1
2044 jmc 1.206 # Check for package MNC: if NetCDF is available, then build the MNC
2045 jmc 1.161 # template files ; otherwise, delete mnc from the list of packages.
2046 jmc 1.205 echo " $PACKAGES " | grep ' mnc ' > /dev/null 2>&1
2047 jmc 1.206 mnc_in=$?
2048     if test "x$HAVE_NETCDF" != xt ; then
2049     if test "x$mnc_in" = x0 ; then
2050 edhill 1.100 cat <<EOF
2051     *********************************************************************
2052     WARNING: the "mnc" package was enabled but tests failed to compile
2053     NetCDF applications. Please check that:
2054    
2055     1) NetCDF is correctly installed for this compiler and
2056 jmc 1.206 2) the LIBS variable (within the "optfile") specifies the correct
2057 edhill 1.100 NetCDF library to link against.
2058    
2059     Due to this failure, the "mnc" package is now DISABLED.
2060     *********************************************************************
2061     EOF
2062     PACKAGES=`echo $PACKAGES | sed -e 's/mnc//g'`
2063     DISABLE="$DISABLE mnc"
2064     else
2065 jmc 1.206 # this prevent to add mnc (due to pdepend rules) if not available
2066     DISABLE="$DISABLE mnc"
2067     fi
2068     else
2069     # we have NetCDF, we try to build MNC template files
2070     ( cd $ROOTDIR"/pkg/mnc" && $MAKE testclean && $MAKE templates ) > make_mnc.errors 2>&1
2071     RETVAL=$?
2072     if test "x${RETVAL}" = x0 ; then
2073     rm -f make_mnc.errors
2074     else
2075     echo "Error: problem encountered while building source files in pkg/mnc:"
2076     cat make_mnc.errors 1>&2
2077     if test "x$mnc_in" = x0 ; then
2078     exit 1
2079 edhill 1.100 else
2080 jmc 1.206 DISABLE="$DISABLE mnc"
2081 edhill 1.100 fi
2082     fi
2083     fi
2084    
2085 jmc 1.161 # Check for package PROFILES: if NetCDF is not available,
2086     # then delete profiles from the list of available packages.
2087 jmc 1.206 if test "x$HAVE_NETCDF" != xt ; then
2088     echo " $PACKAGES " | grep ' profiles ' > /dev/null 2>&1
2089     RETVAL=$?
2090     if test "x$RETVAL" = x0 ; then
2091 jmc 1.161 cat <<EOF
2092     *********************************************************************
2093     WARNING: the "profiles" package was enabled but tests failed to
2094     compile NetCDF applications. Please check that:
2095    
2096     1) NetCDF is correctly installed for this compiler and
2097 jmc 1.206 2) the LIBS variable (within the "optfile") specifies the correct
2098 jmc 1.161 NetCDF library to link against.
2099    
2100     Due to this failure, the "profiles" package is now DISABLED.
2101     *********************************************************************
2102     EOF
2103     PACKAGES=`echo $PACKAGES | sed -e 's/profiles//g'`
2104     DISABLE="$DISABLE profiles"
2105 jmc 1.206 else
2106     # this prevent to add profiles (due to pdepend rules) if not available
2107     DISABLE="$DISABLE profiles"
2108 jmc 1.161 fi
2109     fi
2110    
2111 jmc 1.208 if test "x${PKG_DEPEND}" != x ; then
2112     echo " applying package dependency rules"
2113     ck=
2114     while test "x$ck" != xtt ; do
2115 edhill 1.1 i=0
2116 edhill 1.2 # rtot=${#PNAME[@]}
2117     rtot=$nname
2118 jmc 1.162 while test $i -le $rtot ; do
2119 edhill 1.1
2120     # Is $pname in the current $PACKAGES list?
2121 edhill 1.2 # pname=${PNAME[$i]}
2122     tmp="pname=\"\$PNAME_$i\""
2123     eval $tmp
2124 edhill 1.1 pin="f"
2125     for p in $PACKAGES ; do
2126     if test "x$p" = "x$pname" ; then
2127     pin="t"
2128     fi
2129     done
2130 jmc 1.205 # or in the current $STANDARDDIRS list?
2131     for p in $STANDARDDIRS ; do
2132     if test "x$p" = "x$pname" ; then pin="t" ; fi
2133     done
2134 edhill 1.1
2135     # Is the DNAME entry a (+) or (-) rule ?
2136 edhill 1.2 tmp="dname=\"\$DNAME_$i\""
2137     eval $tmp
2138 edhill 1.1 plus="-"
2139 edhill 1.2 echo $dname | grep '^+' > /dev/null 2>&1
2140 edhill 1.1 RETVAL=$?
2141     if test "x$RETVAL" = x0 ; then
2142     plus="+"
2143     fi
2144    
2145     # Is $dname in the current $PACKAGES list?
2146 edhill 1.2 dname=`echo $dname | sed -e 's/^[+-]//'`
2147 edhill 1.1 din="f"
2148     for p in $PACKAGES ; do
2149     if test "x$p" = "x$dname" ; then
2150     din="t"
2151     fi
2152     done
2153    
2154     # Do we need to add $dname according to the dependency rules?
2155     if test "x$pin" = xt -a "x$plus" = "x+" -a "x$din" = xf ; then
2156 jmc 1.162 #echo " " $pname ": need to add :" $dname
2157 edhill 1.1 in_dis="f"
2158     for dis in $DISABLE ; do
2159     if test "x$dis" = "x$dname" ; then
2160     in_dis="t"
2161     fi
2162     done
2163     if test "x$in_dis" = xt ; then
2164     echo "Error: can't satisfy package dependencies:"
2165     echo " \"$dname\" is required by the dependency rules"
2166     echo " but is disallowed by the DISABLE settings"
2167     exit 1
2168     else
2169     PACKAGES="$PACKAGES $dname"
2170     ck=
2171     fi
2172     fi
2173    
2174     # Do we need to get rid of $dname according to the dependency rules?
2175     if test "x$pin" = xt -a "x$plus" = "x-" -a "x$din" = xt; then
2176     echo "Error: can't satisfy package dependencies:"
2177 jmc 1.206 echo " \"$pname\" was requested but is disallowed by"
2178 edhill 1.1 echo " the dependency rules for \"$dname\""
2179     exit 1
2180     fi
2181 edhill 1.87 i=`echo "$i + 1" | bc -l`
2182     #i=$(( $i + 1 ))
2183 edhill 1.1 done
2184     ck=$ck"t"
2185 jmc 1.208 done
2186     echo " packages are: $PACKAGES"
2187     fi
2188 edhill 1.1 for i in $PACKAGES ; do
2189     adr="$ROOTDIR/pkg/$i"
2190     if test -d $adr ; then
2191     SOURCEDIRS="$SOURCEDIRS $adr"
2192     INCLUDEDIRS="$INCLUDEDIRS $adr"
2193 edhill 1.14 if test "x$i" = xautodiff ; then
2194     AUTODIFF_PKG_USED=t
2195     fi
2196 edhill 1.1 else
2197     echo "Error: the directory \"$adr\" for package $i doesn't exist"
2198     exit 1
2199     fi
2200     done
2201    
2202 edhill 1.12 # Create a list of #define and #undef to enable/disable packages
2203     PACKAGES_DOT_H=PACKAGES_CONFIG.h
2204 jmc 1.206 # The following UGLY HACK sets multiple "#undef"s and it needs to go
2205     # away. On 2003-08-12, CNH, JMC, and EH3 agreed that the CPP_OPTIONS.h
2206 edhill 1.1 # file would eventually be split up so that all package-related #define
2207     # statements could be separated and handled only by genmake.
2208     names=`ls -1 "$ROOTDIR/pkg"`
2209     all_pack=
2210 adcroft 1.44 DISABLED_PACKAGES=
2211 edhill 1.1 for n in $names ; do
2212     if test -d "$ROOTDIR/pkg/$n" -a "x$n" != xCVS ; then
2213     has_pack="f"
2214     for pack in $PACKAGES ; do
2215     if test "x$pack" = "x$n" ; then
2216     has_pack="t"
2217     break
2218     fi
2219     done
2220     if test "x$has_pack" = xf ; then
2221 edhill 1.116 undef=`echo "ALLOW_$n" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2222 adcroft 1.44 DISABLED_PACKAGES="$DISABLED_PACKAGES -U$undef"
2223 edhill 1.1 fi
2224     fi
2225     done
2226 adcroft 1.44 ENABLED_PACKAGES=
2227 edhill 1.1 for i in $PACKAGES ; do
2228 edhill 1.116 def=`echo "ALLOW_$i" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
2229 adcroft 1.44 ENABLED_PACKAGES="$ENABLED_PACKAGES -D$def"
2230 edhill 1.12 #eh3 DEFINES="$DEFINES -D$def"
2231 edhill 1.1
2232     #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
2233 jmc 1.206 case $i in
2234 edhill 1.1 aim_v23)
2235 adcroft 1.46 ENABLED_PACKAGES="$ENABLED_PACKAGES -DALLOW_AIM"
2236 jmc 1.55 echo "Warning: ALLOW_AIM is set to enable aim_v23."
2237 edhill 1.1 ;;
2238     esac
2239     #EH3 WARNING : This is an UGLY HACK that needs to be removed!!!
2240    
2241     done
2242    
2243 jmc 1.205 echo " Adding STANDARDDIRS='$STANDARDDIRS'"
2244 edhill 1.1 BUILDDIR=${BUILDDIR:-.}
2245 edhill 1.57 if test "x$STANDARDDIRS" != x ; then
2246     for d in $STANDARDDIRS ; do
2247     adr="$ROOTDIR/$d/src"
2248     if test ! -d $adr ; then
2249     echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2250     echo " is correct and that you correctly specified the STANDARDDIRS option"
2251     exit 1
2252     else
2253     SOURCEDIRS="$SOURCEDIRS $adr"
2254     fi
2255     adr="$ROOTDIR/$d/inc"
2256     if test ! -d $adr ; then
2257     echo "Error: directory $adr not found -- please check that ROOTDIR=\"$ROOTDIR\""
2258     echo " is correct and that you correctly specified the STANDARDDIRS option"
2259     exit 1
2260     else
2261     INCLUDEDIRS="$INCLUDEDIRS $adr"
2262     fi
2263     done
2264     fi
2265 edhill 1.1
2266 adcroft 1.52 echo " Searching for *OPTIONS.h files in order to warn about the presence"
2267     echo " of \"#define \"-type statements that are no longer allowed:"
2268 edhill 1.12 CPP_OPTIONS=
2269 adcroft 1.52 CPP_EEOPTIONS=
2270 edhill 1.12 spaths=". $INCLUDEDIRS"
2271 adcroft 1.52 names=`ls -1 "$ROOTDIR/pkg"`
2272 edhill 1.12 for i in $spaths ; do
2273     try="$i/CPP_OPTIONS.h"
2274 edhill 1.54 if test -f $try -a -r $try -a "x$CPP_OPTIONS" = x ; then
2275 edhill 1.12 echo " found CPP_OPTIONS=\"$try\""
2276     CPP_OPTIONS="$try"
2277 adcroft 1.52 # New safety test: make sure packages are not mentioned in CPP_OPTIONS.h
2278     for n in $names ; do
2279     test_for_package_in_cpp_options $CPP_OPTIONS $n
2280     done
2281     fi
2282     try="$i/CPP_EEOPTIONS.h"
2283 edhill 1.54 if test -f $try -a -r $try -a "x$CPP_EEOPTIONS" = x ; then
2284 adcroft 1.52 echo " found CPP_EEOPTIONS=\"$try\""
2285     # New safety test: make sure MPI is not determined by CPP_EEOPTIONS.h
2286     #**** not yet enabled ****
2287     # test_for_mpi_in_cpp_eeoptions $try
2288     #**** not yet enabled ****
2289     CPP_EEOPTIONS="$try"
2290 edhill 1.12 fi
2291     done
2292     if test "x$CPP_OPTIONS" = x ; then
2293     echo "Error: can't find \"CPP_OPTIONS.h\" in the path list: $spaths"
2294     exit 1
2295     fi
2296 edhill 1.1
2297 edhill 1.14 # Here, we build the list of files to be "run through" the adjoint
2298     # compiler.
2299 jmc 1.176 if test -f ./adSrcFiles.tmp ; then
2300     rm -f ./adSrcFiles.tmp
2301 edhill 1.14 fi
2302     echo " Creating the list of files for the adjoint compiler."
2303 jmc 1.207 touch adSrcFiles.tmp
2304 edhill 1.14 for i in $SOURCEDIRS ; do
2305     list_files=`( cd $i && ls -1 *.list 2>/dev/null )`
2306     for j in $list_files ; do
2307 jmc 1.176 cat $i/$j >> adSrcFiles.tmp
2308 edhill 1.14 done
2309     done
2310 edhill 1.121 if test ! "x"$FS = "x.f" ; then
2311 jmc 1.176 cat adSrcFiles.tmp | sed -e "s/\.f/.$FS/g" > adSrcFiles.tmp_f
2312     mv -f adSrcFiles.tmp_f adSrcFiles.tmp
2313 edhill 1.121 fi
2314 edhill 1.14
2315 edhill 1.2 echo
2316     echo "=== Creating the Makefile ==="
2317 edhill 1.1 echo " setting INCLUDES"
2318     for i in $INCLUDEDIRS ; do
2319 edhill 1.87 if test ! -d $i ; then
2320 edhill 1.1 echo "Warning: can't find INCLUDEDIRS=\"$i\""
2321     fi
2322     done
2323    
2324 ce107 1.139 if test ! "x$DIVA" = x ; then
2325 ce107 1.140 echo " Creating the pseudo-MPI include directory"
2326 ce107 1.139 INCLUDES="-I./mpi_headers $INCLUDES"
2327     rm -rf ./mpi_headers
2328     mkdir -p ./mpi_headers
2329    
2330     if test "x$MPIINCLUDEDIR" = x ; then
2331     if test "x$MPIHOME" = x ; then
2332     MPIHOME='/usr'
2333     fi
2334     MPIINCLUDEDIR='$MPIHOME/include'
2335     fi
2336 jmc 1.206
2337 ce107 1.139 if test -r $MPIINCLUDEDIR/mpif.h ; then
2338     for i in $MPI_HEADER_FILES; do
2339     cp -p $MPIINCLUDEDIR/$i ./mpi_headers
2340     done
2341    
2342     perl -i -pe 's/MPI_DISPLACEMENT_CURRENT=-1_8/MPI_DISPLACEMENT_CURRENT=-1/g' mpi_headers/mpif.h
2343     else
2344     echo " We cannot create a copy of mpif.h!"
2345 heimbach 1.156 # exit -1
2346 ce107 1.139 fi
2347     fi
2348    
2349 edhill 1.1 echo " Determining the list of source and include files"
2350     rm -rf .links.tmp
2351     mkdir .links.tmp
2352 edhill 1.142 touch .links.tmp/foo
2353     if test ! -r ".links.tmp/foo" ; then
2354     echo
2355     echo "ERROR : something is wrong with your directory permissions or"
2356     echo " your user file-creation mask (\"umask\") since creating a"
2357     echo " sub-dir, touch-ing a file within it, and then reading it is"
2358     echo " not working. Please try setting your umask to something"
2359     echo " sane such as:"
2360     echo
2361     echo " umask 0002"
2362     echo
2363     echo " and please verify that you have the proper permissions for"
2364     echo " creating sub-directories and then reading files created"
2365     echo " within them."
2366     echo
2367     exit 1
2368     fi
2369     rm -f .links.tmp/foo
2370 jmc 1.176
2371 jmc 1.206 if test "x$OPENAD" != x ; then
2372 jmc 1.176 OAD_DONT_COMPILE="/dev/null"
2373     OAD_DONT_TRANSFORM="/dev/null"
2374     OAD_KEEP_ORIGINAL="/dev/null"
2375     OAD_CB2M_FILES="/dev/null"
2376     echo " looking for dontCompile file: "
2377     for i in "." $MODS ; do
2378     if test -r $i"/dontCompile" ; then
2379     OAD_DONT_COMPILE=$i"/dontCompile"
2380     echo " found $OAD_DONT_COMPILE"
2381     break
2382     fi
2383     done
2384     echo " looking for dontTransform file: "
2385     for i in "." $MODS ; do
2386     if test -r $i"/dontTransform" ; then
2387     OAD_DONT_TRANSFORM=$i"/dontTransform"
2388     echo " found $OAD_DONT_TRANSFORM"
2389     break
2390     fi
2391     done
2392     echo " looking for keepOriginal file: "
2393     for i in "." $MODS ; do
2394     if test -r $i"/keepOriginal" ; then
2395     OAD_KEEP_ORIGINAL=$i"/keepOriginal"
2396     echo " found $OAD_KEEP_ORIGINAL"
2397     break
2398     fi
2399     done
2400     echo " looking for cb2mFiles: "
2401     for i in "." $MODS ; do
2402     if test -r $i"/cb2mFiles" ; then
2403     OAD_CB2M_FILES=$i"/cb2mFiles"
2404     echo " found $OAD_CB2M_FILES"
2405     break
2406     fi
2407     done
2408     echo " OpenAD exceptions: "
2409     fi
2410    
2411 edhill 1.1 echo "# This section creates symbolic links" > srclinks.tmp
2412     echo "" >> srclinks.tmp
2413 jmc 1.176 printf 'F77_SRC_FILES = ' > F77srclist.tmp
2414     printf 'NON_AD_F77_SRC_FILES = ' > nonADF77srclist.tmp
2415     printf 'C_SRC_FILES = ' > csrclist.tmp
2416     printf 'F90_SRC_FILES = ' > F90srclist.tmp
2417     printf 'H_SRC_FILES = ' > hsrclist.tmp
2418     printf 'AD_FLOW_FILES = ' > ad_flow_files.tmp
2419 adcroft 1.9 alldirs="$SOURCEDIRS $INCLUDEDIRS ."
2420 edhill 1.1 for d in $alldirs ; do
2421     deplist=
2422 edhill 1.14 sfiles=`( cd $d; echo *.[h,c,F] *.flow )`
2423 cnh 1.3 sfiles=`( echo $sfiles; cd $d; echo *.F90 )`
2424 jmc 1.206 if test "x$OPENAD" != x ; then
2425 jmc 1.176 sfiles=`( echo $sfiles | grep -v _cb2m\. )`
2426     fi
2427 edhill 1.1 for sf in $sfiles ; do
2428     if test ! -r ".links.tmp/$sf" ; then
2429     if test -f "$d/$sf" ; then
2430 edhill 1.131 ignore_f=f
2431 adcroft 1.44 case $d/$sf in
2432     ./$PACKAGES_DOT_H)
2433 edhill 1.141 ignore_f=t
2434 adcroft 1.44 ;;
2435     ./AD_CONFIG.h)
2436 edhill 1.141 ignore_f=t
2437 adcroft 1.44 ;;
2438     ./FC_NAMEMANGLE.h)
2439 edhill 1.141 ignore_f=t
2440 adcroft 1.44 ;;
2441 edhill 1.98 ./BUILD_INFO.h)
2442 edhill 1.141 ignore_f=t
2443     ;;
2444     ./EMBEDDED_FILES.h)
2445     ignore_f=t
2446 edhill 1.98 ;;
2447 adcroft 1.44 *)
2448 edhill 1.131 # For the local directory *ONLY*,
2449     # ignore all soft-links
2450     if test "x$HAVE_TEST_L" = xt -a "x$d" = x. -a -L $sf ; then
2451     ignore_f=t
2452     else
2453     touch .links.tmp/$sf
2454     deplist="$deplist $sf"
2455     fi
2456 adcroft 1.44 ;;
2457     esac
2458 edhill 1.131 if test "x$ignore_f" = xf ; then
2459     extn=`echo $sf | $AWK -F. '{print $NF}'`
2460     case $extn in
2461 jmc 1.176 F)
2462     echo " \\" >> F77srclist.tmp
2463     printf " $sf" >> F77srclist.tmp
2464 jmc 1.206 if test "x$OPENAD" != x ; then
2465 jmc 1.176 basename=${sf%%.F}
2466     isAD=`egrep ^$basename.f'[ ]*' adSrcFiles.tmp`
2467 jmc 1.206 if test -z "$isAD" ; then
2468 jmc 1.176 toBeIgnored=`egrep ^$basename'[ ]*' ${OAD_DONT_COMPILE}`
2469 jmc 1.206 if test -z "$toBeIgnored" ; then
2470 jmc 1.176 echo " \\" >> nonADF77srclist.tmp
2471     printf " $sf" >> nonADF77srclist.tmp
2472 jmc 1.206 else
2473 jmc 1.176 echo " not to be compiled : $sf"
2474     fi
2475 jmc 1.206 else # file is initially listed as an AD file we want to exclude it
2476 jmc 1.176 # or we want to retain the untransformed version
2477     notToBeTransformed=`egrep ^$basename'[ ]*' ${OAD_DONT_TRANSFORM}`
2478     untransformedVersionToBeKept=`egrep ^$basename'[ ]*' ${OAD_KEEP_ORIGINAL}`
2479 jmc 1.206 if test -n "$notToBeTransformed"; then
2480 jmc 1.176 echo " not to be transformed: $sf"
2481     fi
2482     if test -n "$untransformedVersionToBeKept" ; then
2483     echo " original to be kept : $sf"
2484 jmc 1.206 fi
2485 jmc 1.176 if test -n "$notToBeTransformed" -o -n "$untransformedVersionToBeKept" ; then
2486     echo " \\" >> nonADF77srclist.tmp
2487     printf " $sf" >> nonADF77srclist.tmp
2488     fi
2489     fi
2490     fi
2491     ;;
2492     F90)
2493     echo " \\" >> F90srclist.tmp
2494     printf " $sf" >> F90srclist.tmp
2495     ;;
2496     c)
2497     echo " \\" >> csrclist.tmp
2498     printf " $sf" >> csrclist.tmp
2499     ;;
2500     h)
2501     echo " \\" >> hsrclist.tmp
2502     printf " $sf" >> hsrclist.tmp
2503     ;;
2504     flow)
2505     echo " \\" >> ad_flow_files.tmp
2506     printf " $sf" >> ad_flow_files.tmp
2507     ;;
2508     esac
2509     fi
2510 edhill 1.1 fi
2511     fi
2512     done
2513     if test "x$deplist" != x ; then
2514 jmc 1.176 if test "$d" != "." ; then
2515     echo "" >> srclinks.tmp
2516 edhill 1.2 echo "# These files are linked from $d" >> srclinks.tmp
2517 edhill 1.1 echo "$deplist :" >> srclinks.tmp
2518 jahn 1.170 # We need to make sure that the link isn't already there.
2519     # This may happen when make thinks that a header file has to be "remade"
2520     # because a module it depends on has changed. In this case we do nothing.
2521     printf "\tif [ ! -L \$@ ]; then \$(LN) %s/\$@ \$@; fi\n" $d >> srclinks.tmp
2522 jmc 1.176 fi
2523 edhill 1.1 fi
2524     done
2525     rm -rf .links.tmp
2526 jmc 1.176 echo "" >> F77srclist.tmp
2527     echo "" >> nonADF77srclist.tmp
2528     echo "" >> csrclist.tmp
2529     echo "" >> F90srclist.tmp
2530     echo "" >> hsrclist.tmp
2531     echo "" >> ad_flow_files.tmp
2532 edhill 1.1
2533 jmc 1.192 CMDLINE=$0
2534     for xx in "$@" ; do nw=`echo $xx | wc -w`
2535     if test $nw = '1' ; then CMDLINE="$CMDLINE $xx"
2536     else CMDLINE="$CMDLINE '$xx'" ; fi
2537     done
2538    
2539 edhill 1.88 if test -f $MAKEFILE ; then
2540 jmc 1.205 mv -f $MAKEFILE "$MAKEFILE.old"
2541 edhill 1.1 fi
2542     echo " Writing makefile: $MAKEFILE"
2543     echo "# Multithreaded + multi-processing makefile for:" > $MAKEFILE
2544     echo "# $MACHINE" >> $MAKEFILE
2545     echo "# This makefile was generated automatically on" >> $MAKEFILE
2546     echo "# $THISDATE" >> $MAKEFILE
2547     echo "# by the command:" >> $MAKEFILE
2548 jmc 1.192 echo "# $CMDLINE" >> $MAKEFILE
2549 edhill 1.1 echo "# executed by:" >> $MAKEFILE
2550 edhill 1.97 echo "# ${THISUSER}@${THISHOST}:${THISCWD}" >> $MAKEFILE
2551 edhill 1.21
2552     EXE_AD=$EXECUTABLE"_ad"
2553     EXE_FTL=$EXECUTABLE"_ftl"
2554     EXE_SVD=$EXECUTABLE"_svd"
2555    
2556 edhill 1.1 cat >>$MAKEFILE <<EOF
2557 edhill 1.53 #
2558     # OPTFILE="$OPTFILE"
2559 jmc 1.205 #
2560 edhill 1.1 # BUILDDIR : Directory where object files are written
2561     # SOURCEDIRS : Directories containing the source (.F) files
2562     # INCLUDEDIRS : Directories containing the header-source (.h) files
2563     # EXEDIR : Directory where executable that is generated is written
2564     # EXECUTABLE : Full path of executable binary
2565     #
2566     # CPP : C-preprocessor command
2567     # INCLUDES : Directories searched for header files
2568     # DEFINES : Macro definitions for CPP
2569     # MAKEDEPEND : Dependency generator
2570     # KPP : Special preprocessor command (specific to platform)
2571     # KFLAGS : Flags for KPP
2572     # FC : Fortran compiler command
2573     # FFLAGS : Configuration/debugging options for FC
2574     # FOPTIM : Optimization options for FC
2575     # LINK : Command for link editor program
2576     # LIBS : Library flags /or/ additional optimization/debugging flags
2577    
2578     ROOTDIR = ${ROOTDIR}
2579 jmc 1.205 BUILDDIR = ${BUILDDIR}
2580 edhill 1.1 SOURCEDIRS = ${SOURCEDIRS}
2581     INCLUDEDIRS = ${INCLUDEDIRS}
2582     EXEDIR = ${EXEDIR}
2583     EXECUTABLE = \$(EXEDIR)/${EXECUTABLE}
2584     TOOLSDIR = ${TOOLSDIR}
2585    
2586 edhill 1.14 #eh3 new defines for the adjoint work
2587     AUTODIFF = ${ROOTDIR}/pkg/autodiff
2588 edhill 1.21 EXE_AD = ${EXE_AD}
2589     EXE_FTL = ${EXE_FTL}
2590     EXE_SVD = ${EXE_SVD}
2591 edhill 1.14
2592 adcroft 1.44 ENABLED_PACKAGES = ${ENABLED_PACKAGES}
2593     DISABLED_PACKAGES = ${DISABLED_PACKAGES}
2594    
2595 adcroft 1.52 # These files are created by Makefile
2596 edhill 1.97 SPECIAL_FILES = ${PACKAGES_DOT_H} AD_CONFIG.h FC_NAMEMANGLE.h BUILD_INFO.h
2597 edhill 1.141 EOF
2598 adcroft 1.52
2599 edhill 1.141 if test "x$EMBED_SRC" = xt ; then
2600     echo "EMBEDDED_FILES = EMBEDDED_FILES.h" >>$MAKEFILE
2601     else
2602     echo "EMBEDDED_FILES = " >>$MAKEFILE
2603     fi
2604 edhill 1.1
2605     cat >>$MAKEFILE <<EOF
2606     # Unix ln (link)
2607     LN = ${LN}
2608     # C preprocessor
2609     CPP = cat \$< | ${S64} | ${CPP}
2610     # Dependency generator
2611     MAKEDEPEND = ${MAKEDEPEND}
2612     # Special preprocessor (KAP on DECs, FPP on Crays)
2613     KPP = ${KPP}
2614     # Fortran compiler
2615 edhill 1.94 FC = ${FC}
2616 cnh 1.3 # Fortran compiler
2617     F90C = ${F90C}
2618 edhill 1.92 # C compiler
2619     CC = ${CC}
2620 edhill 1.1 # Link editor
2621 edhill 1.70 LINK = ${LINK} ${LDADD}
2622 edhill 1.1
2623     # Defines for CPP
2624     DEFINES = ${DEFINES}
2625     # Includes for CPP
2626     INCLUDES = ${INCLUDES}
2627     # Flags for KPP
2628     KFLAGS1 = ${KFLAGS1}
2629     KFLAGS2 = ${KFLAGS2}
2630     # Optim./debug for FC
2631 mlosch 1.165 FFLAGS = ${FFLAGS} ${FEXTRAFLAGS}
2632 edhill 1.1 FOPTIM = ${FOPTIM}
2633 cnh 1.3 # Optim./debug for FC
2634     F90FLAGS = ${F90FLAGS}
2635     F90OPTIM = ${F90OPTIM}
2636 jmc 1.176 F90FIXEDFORMAT = ${F90FIXEDFORMAT}
2637 edhill 1.1 # Flags for CC
2638     CFLAGS = ${CFLAGS}
2639     # Files that should not be optimized
2640     NOOPTFILES = ${NOOPTFILES}
2641     NOOPTFLAGS = ${NOOPTFLAGS}
2642     # Flags and libraries needed for linking
2643 edhill 1.107 LIBS = ${LIBS}
2644 cnh 1.3 # Name of the Mekfile
2645     MAKEFILE=${MAKEFILE}
2646 edhill 1.1
2647     EOF
2648    
2649 jmc 1.176 cat F77srclist.tmp >> $MAKEFILE
2650     cat nonADF77srclist.tmp >> $MAKEFILE
2651     cat csrclist.tmp >> $MAKEFILE
2652     cat F90srclist.tmp >> $MAKEFILE
2653     cat hsrclist.tmp >> $MAKEFILE
2654     cat ad_flow_files.tmp >> $MAKEFILE
2655    
2656     rm -f F77srclist.tmp nonADF77srclist.tmp csrclist.tmp F90srclist.tmp hsrclist.tmp ad_flow_files.tmp
2657    
2658 edhill 1.75 echo >> $MAKEFILE
2659 jmc 1.176
2660 jmc 1.205 # add definitions for preprocessed sources
2661     # and note that not all systems allow case sensitive extensions
2662     # hence the $FS and $FS90 here.
2663     # for fixed format f90 files we use ff90 or FF90 resp
2664 jmc 1.176 # but these are not expected to be the original source files
2665    
2666     echo 'F77_PP_SRC_FILES = $(F77_SRC_FILES:.F=.'$FS')' >> $MAKEFILE
2667     echo 'F90_PP_SRC_FILES = $(F90_SRC_FILES:.F90=.'$FS90')' >> $MAKEFILE
2668     echo 'OBJFILES= $(F77_SRC_FILES:.F=.o) $(C_SRC_FILES:.c=.o) $(F90_SRC_FILES:.F90=.o)' >> $MAKEFILE
2669 dfer 1.172 echo 'FLOFILES = $(AD_FLOW_FILES:.flow=.flowdir)' >> $MAKEFILE
2670 edhill 1.75 echo >> $MAKEFILE
2671     echo '.SUFFIXES:' >> $MAKEFILE
2672 jmc 1.176 echo '.SUFFIXES: .o .'$FS' .p .F .c .f'$FS90' .'$FS90' .FF90 .F90 .flowdir .flow' >> $MAKEFILE
2673 edhill 1.1
2674     cat >>$MAKEFILE <<EOF
2675    
2676     all: \$(EXECUTABLE)
2677 jmc 1.176 \$(EXECUTABLE): \$(SPECIAL_FILES) \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(OBJFILES) \$(EMBEDDED_FILES)
2678 adcroft 1.44 @echo Creating \$@ ...
2679 edhill 1.1 \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) \$(LIBS)
2680     depend:
2681     @make links
2682 jmc 1.176 \$(MAKEDEPEND) -o .$FS \$(DEFINES) \$(INCLUDES) \$(F77_SRC_FILES)
2683 adcroft 1.44 \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE)
2684 edhill 1.72 -rm -f makedepend.out
2685 edhill 1.1
2686 cnh 1.132 lib: libmitgcmuv.a
2687    
2688     libmitgcmuv.a: \$(OBJFILES)
2689     ar rcv libmitgcmuv.a \$(OBJFILES)
2690 cnh 1.159 ar d libmitgcmuv.a main.o
2691 cnh 1.132
2692 jmc 1.176 links: \$(F77_SRC_FILES) \$(C_SRC_FILES) \$(H_SRC_FILES) \$(F90_SRC_FILES) \$(SPECIAL_FILES)
2693 edhill 1.1
2694 jmc 1.176 small_f: \$(F77_PP_SRC_FILES) \$(F90_PP_SRC_FILES)
2695 edhill 1.1
2696     output.txt: \$(EXECUTABLE)
2697     @printf 'running ... '
2698     @\$(EXECUTABLE) > \$@
2699    
2700 jmc 1.210 # remove most of the files that "make" generates
2701 edhill 1.1 clean:
2702 heimbach 1.157 -rm -rf *.p *.$FS90 *.mod ${RMFILES} work.{pc,pcl} *.template
2703     -rm -rf *.o
2704 dfer 1.172 -rm -rf *.$FS *.flowdir
2705 utke 1.193 -rm -rf *.f$FS90 \$(AD_CLEAN) ad_input*
2706 jmc 1.210
2707     # remove most of the files that "make" and "make depend" generate
2708 edhill 1.1 Clean:
2709     @make clean
2710     @make cleanlinks
2711 jmc 1.210 -rm -f \$(SPECIAL_FILES) f90mkdepend.log
2712 jmc 1.166 -rm -f taf_command taf_output taf_ad.log taf_ad_flow.log
2713 jmc 1.210
2714     # remove also the executable, files that "genmake2" generates (except Makefile)
2715     # and output from a run (plus output and log files from testreport)
2716 edhill 1.1 CLEAN:
2717     @make Clean
2718 jmc 1.210 -rm -f \$(EXECUTABLE) \$(EXE_AD) *.bak "$MAKEFILE.old"
2719 jmc 1.209 -rm -f genmake_state genmake_*optfile genmake_warnings genmake_errors
2720 jmc 1.210 -rm -f genmake.log make.log run.log
2721 edhill 1.1 -find \$(EXEDIR) -name "*.meta" -exec rm {} \;
2722     -find \$(EXEDIR) -name "*.data" -exec rm {} \;
2723     -find \$(EXEDIR) -name "fort.*" -exec rm {} \;
2724 jmc 1.210 -rm -f *.txt STD* *diagnostics.log datetime
2725 jmc 1.166 -rm -f *_MIT_CE_000.opt0000 costfunction*0000
2726 edhill 1.144 -rm -rf mnc_test_*
2727 edhill 1.1
2728 edhill 1.18 #eh3 Makefile: makefile
2729 edhill 1.1 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     if test "x$DUMPSTATE" != xf ; 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