hwloc: null check for cpuset
[mpich-dev.git] / autogen.sh
1 #! /bin/sh
2
3 # (C) 2006 by Argonne National Laboratory.
4 #     See COPYRIGHT in top-level directory.
5 #
6 # Update all of the derived files
7 # For best performance, execute this in the top-level directory.
8 # There are some experimental features to allow it to be executed in
9 # subdirectories
10 #
11 # Eventually, we want to allow this script to be executed anywhere in the
12 # mpich tree.  This is not yet implemented.
13
14
15 ########################################################################
16 ## Utility functions
17 ########################################################################
18
19 recreate_tmp() {
20     rm -rf .tmp
21     mkdir .tmp 2>&1 >/dev/null
22 }
23
24 warn() {
25     echo "===> WARNING: $@"
26 }
27
28 error() {
29     echo "===> ERROR:   $@"
30 }
31
32 echo_n() {
33     # "echo -n" isn't portable, must portably implement with printf
34     printf "%s" "$*"
35 }
36
37 # Assume Program's install-dir is <install-dir>/bin/<prog>.
38 # Given program name as the 1st argument,
39 # the install-dir is returned is returned in 2nd argument.
40 # e.g., ProgHomeDir libtoolize libtooldir.
41 ProgHomeDir() {
42     prog=$1
43     progpath="`which $prog`"
44     progbindir="`dirname $progpath`"
45     proghome=`(cd $progbindir/.. && pwd)`
46     eval $2=$proghome
47 }
48
49 # checking and patching submodules
50 check_submodule_presence() {
51     if test ! -f "$SRCROOTDIR/$1/configure.ac"; then
52         error "Submodule $1 is not checked out"
53         exit 1
54     fi
55 }
56
57 sync_external () {
58     srcdir=$1
59     destdir=$2
60
61     echo "syncing '$srcdir' --> '$destdir'"
62
63     # deletion prevents creating 'confdb/confdb' situation, also cleans
64     # stray files that may have crept in somehow
65     rm -rf "$destdir"
66     cp -pPR "$srcdir" "$destdir"
67 }
68
69 ########################################################################
70 echo
71 echo "####################################"
72 echo "## Checking user environment"
73 echo "####################################"
74 echo
75
76 ########################################################################
77 ## Checks to make sure we are running from the correct location
78 ########################################################################
79
80 echo_n "Verifying the location of autogen.sh... "
81 if [ ! -d maint -o ! -s maint/version.m4 ] ; then
82     echo "must execute at top level directory for now"
83     exit 1
84 fi
85 # Set the SRCROOTDIR to be used later and avoid "cd ../../"-like usage.
86 SRCROOTDIR=$PWD
87 echo "done"
88
89 ########################################################################
90 ## Initialize variables to default values (possibly from the environment)
91 ########################################################################
92
93 # Default choices
94 do_bindings=yes
95 do_geterrmsgs=yes
96 do_getcvars=yes
97 do_f77=yes
98 do_f77tof90=yes
99 do_build_configure=yes
100 do_genstates=yes
101 do_atdir_check=no
102 do_atver_check=yes
103 do_subcfg_m4=yes
104 do_izem=yes
105 do_ofi=yes
106 do_ucx=yes
107
108 export do_build_configure
109
110 # Allow MAKE to be set from the environment
111 MAKE=${MAKE-make}
112
113 # amdirs are the directories that make use of autoreconf
114 amdirs=". src/mpl src/util/logging/rlog"
115
116 autoreconf_args="-if"
117 export autoreconf_args
118
119 ########################################################################
120 ## Read the command-line arguments
121 ########################################################################
122
123 # List of steps that we will consider (We do not include depend
124 # because the values for depend are not just yes/no)
125 AllSteps="geterrmsgs bindings f77 f77tof90 build_configure genstates getparms"
126 stepsCleared=no
127
128 for arg in "$@" ; do
129     case $arg in 
130         -echo)
131             set -x
132             ;;
133         
134         -atdircheck=*)
135             val=`echo X$arg | sed -e 's/^X-atdircheck=//'`
136             case $val in
137                 yes|YES|true|TRUE|1) do_atdir_check=yes ;;
138                 no|NO|false|FALSE|0) do_atdir_check=no ;;
139                 *) warn "unknown option: $arg."
140             esac
141             ;;
142
143         -atvercheck=*)
144             val=`echo X$arg | sed -e 's/^X-atvercheck=//'`
145             case $val in
146                 yes|YES|true|TRUE|1) do_atver_check=yes ;;
147                 no|NO|false|FALSE|0) do_atver_check=no ;;
148                 *) warn "unknown option: $arg."
149             esac
150             ;;
151
152         -do=*|--do=*)
153             opt=`echo A$arg | sed -e 's/^A--*do=//'`
154             case $opt in 
155                 build-configure|configure) opt=build_configure ;;
156             esac
157             var=do_$opt
158
159             # Check that this opt is known
160             eval oldval=\$"$var"
161             if [ -z "$oldval" ] ; then
162                 echo "-do=$opt is unrecognized"
163                 exit 1
164             else
165                 if [ $stepsCleared = no ] ; then
166                     for step in $AllSteps ; do
167                         var=do_$step
168                         eval $var=no
169                     done
170                     stepsCleared=yes
171                 fi
172                 var=do_$opt
173                 eval $var=yes
174             fi
175             ;;
176
177         -verbose-autoreconf|--verbose-autoreconf)
178             autoreconf_args="-vif"
179             export autoreconf_args
180             ;;
181
182         -with-genstates|--with-genstates)
183             do_genstates=yes
184             ;;
185
186         -without-genstates|--without-genstates)
187             do_genstates=no
188             ;;
189  
190         -with-errmsgs|--with-errmsgs)
191             do_geterrmsgs=yes
192             ;;
193
194         -without-errmsgs|--without-errmsgs)
195             do_geterrmsgs=no
196             ;;
197
198         -with-bindings|--with-bindings)
199             do_bindings=yes
200             ;;
201
202         -without-bindings|--without-bindings)
203             do_bindings=no
204             ;;
205
206         -with-f77|--with-f77)
207             do_f77=yes
208             ;;
209
210         -without-f77|--without-f77)
211             do_f77=no
212             ;;
213
214         -with-autotools=*|--with-autotools=*)
215             autotoolsdir=`echo "A$arg" | sed -e 's/.*=//'`
216             ;;
217
218     -without-izem|--without-izem)
219         do_izem=no
220         ;;
221
222     -without-ofi|--without-ofi|-without-libfabric|--without-libfabric)
223         do_ofi=no
224         ;;
225
226     -without-ucx|--without-ucx)
227         do_ucx=no
228         ;;
229
230         -help|--help|-usage|--usage)
231             cat <<EOF
232    ./autogen.sh [ --with-autotools=dir ] \\
233                 [ -atdircheck=[yes|no] ] \\
234                 [ -atvercheck=[yes|no] ] \\
235                 [ --verbose-autoreconf ] \\
236                 [ --do=stepname ] [ -distrib ]
237     Update the files in the MPICH build tree.  This file builds the 
238     configure files, creates the Makefile.in files, extracts the error
239     messages.
240
241     You can use --with-autotools=dir to specify a directory that
242     contains alternate autotools.
243
244     -atdircheck=[yes|no] specifies the enforcement of all autotools
245     should be installed in the same directory.
246
247     -atvercheck=[yes|no] specifies if the check for the version of 
248     autotools should be carried out.
249
250     -distrib creates a distribution version of the Makefile.in files (no
251     targets for updating the Makefile.in from Makefile.sm or rebuilding the
252     autotools targets).  This does not create the configure files because
253     some of those depend on rules in the Makefile.in in that directory.  
254     Thus, to build all of the files for a distribution, run autogen.sh
255     twice, as in 
256          autogen.sh && autogen.sh -distrib
257
258     Use --do=stepname to update only a single step.  For example, 
259     --do=build_configure only updates the configure scripts.  The available
260     steps are:
261 EOF
262             for step in $AllSteps ; do
263                 echo "        $step"
264             done
265             exit 1
266             ;;
267
268         *)
269             echo "unknown argument $arg"
270             exit 1
271             ;;
272
273     esac
274 done
275
276 ########################################################################
277 ## Set up external packages
278 ########################################################################
279
280 # external packages that require autogen.sh to be run for each of them
281 externals="src/pm/hydra src/mpi/romio src/openpa src/hwloc"
282
283 if [ "yes" = "$do_izem" ] ; then
284     externals="${externals} src/izem"
285 fi
286
287 if [ "yes" = "$do_ucx" ] ; then
288     externals="${externals} src/mpid/ch4/netmod/ucx/ucx"
289 fi
290
291 if [ "yes" = "$do_ofi" ] ; then
292     externals="${externals} src/mpid/ch4/netmod/ofi/libfabric"
293 fi
294
295 ########################################################################
296 ## Check for the location of autotools
297 ########################################################################
298
299 if [ -n "$autotoolsdir" ] ; then
300     if [ -x $autotoolsdir/autoconf -a -x $autotoolsdir/autoheader ] ; then
301         autoconf=$autotoolsdir/autoconf
302         autoheader=$autotoolsdir/autoheader
303         autoreconf=$autotoolsdir/autoreconf
304         automake=$autotoolsdir/automake
305         autom4te=$autotoolsdir/autom4te
306         aclocal=$autotoolsdir/aclocal
307         if [ -x "$autotoolsdir/glibtoolize" ] ; then
308             libtoolize=$autotoolsdir/glibtoolize
309         else
310             libtoolize=$autotoolsdir/libtoolize
311         fi
312
313         AUTOCONF=$autoconf
314         AUTOHEADER=$autoheader
315         AUTORECONF=$autoreconf
316         AUTOMAKE=$automake
317         AUTOM4TE=$autom4te
318         ACLOCAL=$aclocal
319         LIBTOOLIZE=$libtoolize
320
321         export AUTOCONF
322         export AUTOHEADER
323         export AUTORECONF
324         export AUTOM4TE
325         export AUTOMAKE
326         export ACLOCAL
327         export LIBTOOLIZE
328     else
329         echo "could not find executable autoconf and autoheader in $autotoolsdir"
330         exit 1
331     fi
332 else
333     autoconf=${AUTOCONF:-autoconf}
334     autoheader=${AUTOHEADER:-autoheader}
335     autoreconf=${AUTORECONF:-autoreconf}
336     autom4te=${AUTOM4TE:-autom4te}
337     automake=${AUTOMAKE:-automake}
338     aclocal=${ACLOCAL:-aclocal}
339     if test -z "${LIBTOOLIZE+set}" && ( glibtoolize --version ) >/dev/null 2>&1 ; then
340         libtoolize=glibtoolize
341     else
342         libtoolize=${LIBTOOLIZE:-libtoolize}
343     fi
344 fi
345
346 ProgHomeDir $autoconf   autoconfdir
347 ProgHomeDir $automake   automakedir
348 ProgHomeDir $libtoolize libtooldir
349
350 echo_n "Checking if autotools are in the same location... "
351 if [ "$autoconfdir" = "$automakedir" -a "$autoconfdir" = "$libtooldir" ] ; then
352     same_atdir=yes
353     echo "yes, all in $autoconfdir"
354 else
355     same_atdir=no
356     echo "no"
357     echo "      autoconf is in $autoconfdir"
358     echo "      automake is in $automakedir"
359     echo "      libtool  is in $libtooldir"
360     # Emit a big warning message if $same_atdir = no.
361     warn "Autotools are in different locations. In rare occasion,"
362     warn "resulting configure or makefile may fail in some unexpected ways."
363 fi
364
365 ########################################################################
366 ## Check if autoreconf can be patched to work
367 ## when autotools are not in the same location.
368 ## This test needs to be done before individual tests of autotools
369 ########################################################################
370
371 # If autotools are not in the same location, override autoreconf appropriately.
372 if [ "$same_atdir" != "yes" ] ; then
373     if [ -z "$libtooldir" ] ; then
374         ProgHomeDir $libtoolize libtooldir
375     fi
376     libtoolm4dir="$libtooldir/share/aclocal"
377     echo_n "Checking if $autoreconf accepts -I $libtoolm4dir... "
378     new_autoreconf_works=no
379     if [ -d "$libtoolm4dir" -a -f "$libtoolm4dir/libtool.m4" ] ; then
380         recreate_tmp
381         cat >.tmp/configure.ac <<_EOF
382 AC_INIT(foo,1.0)
383 AC_PROG_LIBTOOL
384 AC_OUTPUT
385 _EOF
386         AUTORECONF="$autoreconf -I $libtoolm4dir"
387         if (cd .tmp && $AUTORECONF -ivf >/dev/null 2>&1) ; then
388             new_autoreconf_works=yes
389         fi
390         rm -rf .tmp
391     fi
392     echo "$new_autoreconf_works"
393     # If autoreconf accepts -I <libtool's m4 dir> correctly, use -I.
394     # If not, run libtoolize before autoreconf (i.e. for autoconf <= 2.63)
395     # This test is more general than checking the autoconf version.
396     if [ "$new_autoreconf_works" != "yes" ] ; then
397         echo_n "Checking if $autoreconf works after an additional $libtoolize step... "
398         new_autoreconf_works=no
399         recreate_tmp
400         # Need AC_CONFIG_
401         cat >.tmp/configure.ac <<_EOF
402 AC_INIT(foo,1.0)
403 AC_CONFIG_AUX_DIR([m4])
404 AC_CONFIG_MACRO_DIR([m4])
405 AC_PROG_LIBTOOL
406 AC_OUTPUT
407 _EOF
408         cat >.tmp/Makefile.am <<_EOF
409 ACLOCAL_AMFLAGS = -I m4
410 _EOF
411         AUTORECONF="eval $libtoolize && $autoreconf"
412         if (cd .tmp && $AUTORECONF -ivf >u.txt 2>&1) ; then
413             new_autoreconf_works=yes
414         fi
415         rm -rf .tmp
416         echo "$new_autoreconf_works"
417     fi
418     if [ "$new_autoreconf_works" = "yes" ] ; then
419         export AUTORECONF
420         autoreconf="$AUTORECONF"
421     else
422         # Since all autoreconf workarounds do not work, we need
423         # to require all autotools to be in the same directory.
424         do_atdir_check=yes
425         error "Since none of the autoreconf workaround works"
426         error "and autotools are not in the same directory, aborting..."
427         error "Updating autotools or putting all autotools in the same location"
428         error "may resolve the issue."
429         exit 1
430     fi
431 fi
432
433 ########################################################################
434 ## Verify autoconf version
435 ########################################################################
436
437 echo_n "Checking for autoconf version... "
438 recreate_tmp
439 ver=2.67
440 # petsc.mcs.anl.gov's /usr/bin/autoreconf is version 2.65 which returns OK
441 # if configure.ac has AC_PREREQ() withOUT AC_INIT.
442 #
443 # ~/> hostname
444 # petsc
445 # ~> /usr/bin/autoconf --version
446 # autoconf (GNU Autoconf) 2.65
447 # ....
448 # ~/> cat configure.ac
449 # AC_PREREQ(2.68)
450 # ~/> /usr/bin/autoconf ; echo "rc=$?"
451 # configure.ac:1: error: Autoconf version 2.68 or higher is required
452 # configure.ac:1: the top level
453 # autom4te: /usr/bin/m4 failed with exit status: 63
454 # rc=63
455 # ~/> /usr/bin/autoreconf ; echo "rc=$?"
456 # rc=0
457 cat > .tmp/configure.ac<<EOF
458 AC_INIT
459 AC_PREREQ($ver)
460 AC_OUTPUT
461 EOF
462 if (cd .tmp && $autoreconf $autoreconf_args >/dev/null 2>&1 ) ; then
463     echo ">= $ver"
464 else
465     echo "bad autoconf installation"
466     cat <<EOF
467 You either do not have autoconf in your path or it is too old (version
468 $ver or higher required). You may be able to use
469
470      autoconf --version
471
472 Unfortunately, there is no standard format for the version output and
473 it changes between autotools versions.  In addition, some versions of
474 autoconf choose among many versions and provide incorrect output).
475 EOF
476     exit 1
477 fi
478
479
480 ########################################################################
481 ## Verify automake version
482 ########################################################################
483
484 echo_n "Checking for automake version... "
485 recreate_tmp
486 ver=1.15
487 cat > .tmp/configure.ac<<EOF
488 AC_INIT(testver,1.0)
489 AC_CONFIG_AUX_DIR([m4])
490 AC_CONFIG_MACRO_DIR([m4])
491 m4_ifdef([AM_INIT_AUTOMAKE],,[m4_fatal([AM_INIT_AUTOMAKE not defined])])
492 AM_INIT_AUTOMAKE([$ver foreign])
493 AC_MSG_RESULT([A message])
494 AC_OUTPUT([Makefile])
495 EOF
496 cat <<EOF >.tmp/Makefile.am
497 ACLOCAL_AMFLAGS = -I m4
498 EOF
499 if [ ! -d .tmp/m4 ] ; then mkdir .tmp/m4 >/dev/null 2>&1 ; fi
500 if (cd .tmp && $autoreconf $autoreconf_args >/dev/null 2>&1 ) ; then
501     echo ">= $ver"
502 else
503     echo "bad automake installation"
504     cat <<EOF
505 You either do not have automake in your path or it is too old (version
506 $ver or higher required). You may be able to use
507
508      automake --version
509
510 Unfortunately, there is no standard format for the version output and
511 it changes between autotools versions.  In addition, some versions of
512 autoconf choose among many versions and provide incorrect output).
513 EOF
514     exit 1
515 fi
516
517
518 ########################################################################
519 ## Verify libtool version
520 ########################################################################
521
522 echo_n "Checking for libtool version... "
523 recreate_tmp
524 ver=2.4.4
525 cat <<EOF >.tmp/configure.ac
526 AC_INIT(testver,1.0)
527 AC_CONFIG_AUX_DIR([m4])
528 AC_CONFIG_MACRO_DIR([m4])
529 m4_ifdef([LT_PREREQ],,[m4_fatal([LT_PREREQ not defined])])
530 LT_PREREQ($ver)
531 LT_INIT()
532 AC_MSG_RESULT([A message])
533 EOF
534 cat <<EOF >.tmp/Makefile.am
535 ACLOCAL_AMFLAGS = -I m4
536 EOF
537 if [ ! -d .tmp/m4 ] ; then mkdir .tmp/m4 >/dev/null 2>&1 ; fi
538 if (cd .tmp && $autoreconf $autoreconf_args >/dev/null 2>&1 ) ; then
539     echo ">= $ver"
540 else
541     echo "bad libtool installation"
542     cat <<EOF
543 You either do not have libtool in your path or it is too old
544 (version $ver or higher required). You may be able to use
545
546      libtool --version
547
548 Unfortunately, there is no standard format for the version output and
549 it changes between autotools versions.  In addition, some versions of
550 autoconf choose among many versions and provide incorrect output).
551 EOF
552     exit 1
553 fi
554
555
556 ########################################################################
557 ## Checking for UNIX find
558 ########################################################################
559
560 echo_n "Checking for UNIX find... "
561 find ./maint -name 'configure.ac' > /dev/null 2>&1
562 if [ $? = 0 ] ; then
563     echo "done"
564 else
565     echo "not found (error)"
566     exit 1
567 fi
568
569
570 ########################################################################
571 ## Checking if xargs rm -rf works
572 ########################################################################
573
574 echo_n "Checking if xargs rm -rf works... "
575 if [ -d "`find ./maint -name __random_dir__`" ] ; then
576     error "found a directory named __random_dir__"
577     exit 1
578 else
579     mkdir ./maint/__random_dir__
580     find ./maint -name __random_dir__ | xargs rm -rf > /dev/null 2>&1
581     if [ $? = 0 ] ; then
582         echo "yes"
583     else
584         echo "no (error)"
585         rm -rf ./maint/__random_dir__
586         exit 1
587     fi
588 fi
589
590 ########################################################################
591 ## Set up submodules
592 ########################################################################
593
594 echo
595 echo "###########################################################"
596 echo "## Checking submodules"
597 echo "###########################################################"
598 echo
599
600 # hwloc is always required
601 check_submodule_presence src/hwloc
602
603 # external packages that require autogen.sh to be run for each of them
604 externals="src/pm/hydra src/mpi/romio src/openpa src/hwloc"
605
606 if [ "yes" = "$do_izem" ] ; then
607     check_submodule_presence src/izem
608     externals="${externals} src/izem"
609 fi
610
611 if [ "yes" = "$do_ucx" ] ; then
612     check_submodule_presence src/mpid/ch4/netmod/ucx/ucx
613     externals="${externals} src/mpid/ch4/netmod/ucx/ucx"
614 fi
615
616 if [ "yes" = "$do_ofi" ] ; then
617     check_submodule_presence src/mpid/ch4/netmod/ofi/libfabric
618     externals="${externals} src/mpid/ch4/netmod/ofi/libfabric"
619 fi
620
621 ########################################################################
622 # This used to be an optionally installed hook to help with git-svn
623 # versions of the old SVN repo.  Now that we are using git, this is our
624 # mechanism that replaces relative svn:externals paths, such as for
625 # "confdb" and "mpl". The basic plan is to delete the destdir and then
626 # copy all of the files, warts and all, from the source directory to the
627 # destination directory.
628 echo
629 echo "####################################"
630 echo "## Replicating confdb (and similar)"
631 echo "####################################"
632 echo
633
634 confdb_dirs=
635 confdb_dirs="${confdb_dirs} src/mpi/romio/confdb"
636 confdb_dirs="${confdb_dirs} src/mpi/romio/mpl/confdb"
637 confdb_dirs="${confdb_dirs} src/mpl/confdb"
638 confdb_dirs="${confdb_dirs} src/pm/hydra/confdb"
639 confdb_dirs="${confdb_dirs} src/pm/hydra/mpl/confdb"
640 confdb_dirs="${confdb_dirs} test/mpi/confdb"
641
642 # hydra's copies of mpl and hwloc
643 sync_external src/mpl src/pm/hydra/mpl
644
645 # ROMIO's copy of mpl
646 sync_external src/mpl src/mpi/romio/mpl
647
648 # all the confdb directories, by various names
649 for destdir in $confdb_dirs ; do
650     sync_external confdb "$destdir"
651 done
652
653 # Copying hwloc to hydra
654 sync_external src/hwloc src/pm/hydra/tools/topo/hwloc/hwloc
655
656 # a couple of other random files
657 if [ -f maint/version.m4 ] ; then
658     cp -pPR maint/version.m4 src/pm/hydra/version.m4
659     cp -pPR maint/version.m4 src/mpi/romio/version.m4
660     cp -pPR maint/version.m4 test/mpi/version.m4
661 fi
662
663 # Now sanity check that some of the above sync was successful
664 f="aclocal_cc.m4"
665 for d in $confdb_dirs ; do
666     if [ -f "$d/$f" ] ; then :
667     else
668         error "expected to find '$f' in '$d'"
669         exit 1
670     fi
671 done
672
673 echo
674 echo
675 echo "###########################################################"
676 echo "## Autogenerating required files"
677 echo "###########################################################"
678 echo
679
680 ########################################################################
681 ## Building maint/Version
682 ########################################################################
683
684 # build a substitute maint/Version script now that we store the single copy of
685 # this information in an m4 file for autoconf's benefit
686 echo_n "Generating a helper maint/Version... "
687 if $autom4te -l M4sugar maint/Version.base.m4 > maint/Version ; then
688     echo "done"
689 else
690     echo "error"
691     error "unable to correctly generate maint/Version shell helper"
692 fi
693
694 ########################################################################
695 ## Building the README
696 ########################################################################
697
698 echo_n "Updating the README... "
699 . ./maint/Version
700 if [ -f README.vin ] ; then
701     sed -e "s/%VERSION%/${MPICH_VERSION}/g" README.vin > README
702     echo "done"
703 else
704     echo "error"
705     error "README.vin file not present, unable to update README version number (perhaps we are running in a release tarball source tree?)"
706 fi
707
708
709 ########################################################################
710 ## Building subsys_include.m4
711 ########################################################################
712 if [ "X$do_subcfg_m4" = Xyes ] ; then
713     echo_n "Creating subsys_include.m4... "
714     ./maint/gen_subcfg_m4
715     echo "done"
716 fi
717
718
719 ########################################################################
720 ## Building ROMIO glue code
721 ########################################################################
722 echo_n "Building ROMIO glue code... "
723 ( cd src/glue/romio && chmod a+x ./all_romio_symbols && ./all_romio_symbols ../../mpi/romio/include/mpio.h.in )
724 echo "done"
725
726
727 ########################################################################
728 ## Building non-C interfaces
729 ########################################################################
730
731 # Create the bindings if necessary 
732 if [ $do_bindings = "yes" ] ; then
733     build_f77=no
734     build_f90=no
735     build_cxx=no
736     if [ $do_f77 = "yes" ] ; then
737         if [ ! -s src/binding/fortran/mpif_h/abortf.c ] ; then
738             build_f77=yes
739         elif find src/binding/fortran/mpif_h -name 'buildiface' -newer 'src/binding/fortran/mpif_h/abortf.c' >/dev/null 2>&1 ; then
740             build_f77=yes
741         fi
742         if [ ! -s src/binding/fortran/use_mpi/mpi_base.f90 ] ; then
743             build_f90=yes
744         elif find src/binding/fortran/use_mpi -name 'buildiface' -newer 'src/binding/fortran/use_mpi/mpi_base.f90' >/dev/null 2>&1 ; then
745             build_f90=yes
746         fi
747         if [ ! -s src/binding/fortran/use_mpi_f08/wrappers_c/cdesc.c ] ; then
748             build_f08=yes
749         elif find src/binding/fortran/use_mpi_f08 -name 'buildiface' -newer 'src/binding/fortran/use_mpi_f08/wrappers_c/cdesc.c' >/dev/null 2>&1 ; then
750             build_f08=yes
751         fi
752     fi
753
754     if [ $build_f77 = "yes" ] ; then
755         echo_n "Building Fortran 77 interface... "
756         ( cd src/binding/fortran/mpif_h && chmod a+x ./buildiface && ./buildiface )
757         echo "done"
758     fi
759     if [ $build_f90 = "yes" ] ; then
760         echo_n "Building Fortran 90 interface... "
761         # Remove any copy of mpi_base.f90 (this is used to handle the
762         # Double precision vs. Real*8 option
763         rm -f src/binding/fortran/use_mpi/mpi_base.f90.orig
764         ( cd src/binding/fortran/use_mpi && chmod a+x ./buildiface && ./buildiface )
765         ( cd src/binding/fortran/use_mpi && ../mpif_h/buildiface -infile=cf90t.h -deffile=./cf90tdefs)
766         echo "done"
767     fi
768     if [ $build_f08 = "yes" ] ; then
769         echo_n "Building Fortran 08 interface... "
770         # Top-level files
771         ( cd src/binding/fortran/use_mpi_f08 && chmod a+x ./buildiface && ./buildiface )
772         # Delete the old Makefile.mk
773         ( rm -f src/binding/fortran/use_mpi_f08/wrappers_c/Makefile.mk )
774         # Execute once for mpi.h.in ...
775         ( cd src/binding/fortran/use_mpi_f08/wrappers_c && chmod a+x ./buildiface && ./buildiface ../../../../include/mpi.h.in )
776         # ... and once for mpio.h.in
777         ( cd src/binding/fortran/use_mpi_f08/wrappers_c && chmod a+x ./buildiface && ./buildiface ../../../../mpi/romio/include/mpio.h.in )
778         echo "done"
779     fi
780
781     if [ ! -s src/binding/cxx/mpicxx.h ] ; then 
782         build_cxx=yes
783     elif find src/binding/cxx -name 'buildiface' -newer 'src/binding/cxx/mpicxx.h' >/dev/null 2>&1 ; then
784         build_cxx=yes
785     fi
786     if [ $build_cxx = "yes" ] ; then
787         echo_n "Building C++ interface... "
788         ( cd src/binding/cxx && chmod a+x ./buildiface &&
789           ./buildiface -nosep -initfile=./cxx.vlist )
790         echo "done"
791     fi
792 fi
793
794
795 ########################################################################
796 ## Extract error messages
797 ########################################################################
798
799 # Capture the error messages
800 if [ $do_geterrmsgs = "yes" ] ; then
801     if [ -x maint/extracterrmsgs ] ; then
802         echo_n "Extracting error messages... "
803         rm -rf .tmp
804         rm -f .err
805         rm -f unusederr.txt
806         maint/extracterrmsgs -careful=unusederr.txt \
807             -skip=src/util/multichannel/mpi.c `cat maint/errmsgdirs` > \
808             .tmp 2>.err
809         # (error here is ok)
810         echo "done"
811
812         update_errdefs=yes
813         if [ -s .err ] ; then 
814             cat .err
815             rm -f .err2
816             grep -v "Warning:" .err > .err2
817             if [ -s .err2 ] ; then
818                 warn "Because of errors in extracting error messages, the file"
819                 warn "src/mpi/errhan/defmsg.h was not updated."
820                 error "Error message files in src/mpi/errhan were not updated."
821                 rm -f .tmp .err .err2
822                 exit 1
823             fi
824             rm -f .err .err2
825         else
826             # Incase it exists but has zero size
827             rm -f .err
828         fi
829         if [ -s unusederr.txt ] ; then
830             warn "There are unused error message texts in src/mpi/errhan/errnames.txt"
831             warn "See the file unusederr.txt for the complete list"
832         fi
833         if [ -s .tmp -a "$update_errdefs" = "yes" ] ; then
834             mv .tmp src/mpi/errhan/defmsg.h
835         fi
836         if [ ! -s src/mpi/errhan/defmsg.h ] ; then
837             echo_n "Creating a dummy defmsg.h file... "
838             cat > src/mpi/errhan/defmsg.h <<EOF
839 typedef struct { const unsigned int sentinal1; const char *short_name, *long_name; const unsigned int sentinal2; } msgpair;
840 static const int generic_msgs_len = 0;
841 static msgpair generic_err_msgs[] = { {0xacebad03, 0, "no error catalog", 0xcb0bfa11}, };
842 static const int specific_msgs_len = 0;
843 static msgpair specific_err_msgs[] = {  {0xacebad03,0,0,0xcb0bfa11}, };
844 #if MPICH_ERROR_MSG_LEVEL > MPICH_ERROR_MSG__NONE
845 #define MPIR_MAX_ERROR_CLASS_INDEX 54
846 static int class_to_index[] = {
847 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
848 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
849 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
850 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
851 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
852 0, 0, 0, 0 };
853 #endif
854 EOF
855             echo "done"
856         fi
857     fi
858 fi  # do_geterrmsgs
859
860
861 ########################################################################
862 ## Build required scripts
863 ########################################################################
864
865 echo
866 echo "------------------------------------"
867 echo "Initiating building required scripts"
868 # Build scripts such as genstates if necessary
869 ran_maint_configure=no
870 run_configure=no
871 # The information that autoconf uses is saved in the autom4te*.cache
872 # file; since this cache is not accurate, we delete it.
873 if [ ! -x maint/configure ] ; then
874     (cd maint && $autoconf && rm -rf autom4te*.cache )
875 elif find maint -name 'configure.ac' -newer 'maint/configure' >/dev/null 2>&1 ; then
876     # The above relies on the Unix find command
877     (cd maint && $autoconf && rm -rf autom4te*.cache)
878 fi
879 if [ ! -x maint/genstates ] ; then
880     run_configure=yes
881 fi
882
883 # The following relies on the Unix find command
884 if [ -s maint/genstates ] ; then 
885     if find maint -name 'genstates.in' -newer 'maint/genstates' >/dev/null 2>&1 ; then
886         run_configure=yes
887     fi
888 else
889     run_configure=yes
890 fi
891
892 if [ "$run_configure" = "yes" ] ; then
893     (cd maint && ./configure)
894     ran_maint_configure=yes
895 fi
896 echo "Done building required scripts"
897 echo "------------------------------------"
898 echo
899
900 # Run some of the simple codes
901 echo_n "Creating the enumeration of logging states into src/include/mpiallstates.h... "
902 if [ -x maint/extractstates -a $do_genstates = "yes" ] ; then
903     ./maint/extractstates
904 fi
905 echo "done"
906
907 # new parameter code
908 echo_n "Extracting control variables (cvar) ... "
909 if test -x maint/extractcvars -a "$do_getcvars" = "yes" ; then
910     if ./maint/extractcvars --dirs="`cat maint/cvardirs`"; then
911         echo "done"
912     else
913         echo "failed"
914         error "unable to extract control variables"
915         exit 1
916     fi
917 else
918     echo "skipped"
919 fi
920
921 # Create and/or update the f90 tests
922 if [ -x ./maint/f77tof90 -a $do_f77tof90 = "yes" ] ; then
923     echo_n "Create or update the Fortran 90 tests derived from the Fortran 77 tests... "
924     for dir in test/mpi/f77/* ; do
925         if [ ! -d $dir ] ; then continue ; fi
926         leafDir=`basename $dir`
927         if [ ! -d test/mpi/f90/$leafDir ] ; then
928             mkdir test/mpi/f90/$leafDir
929         fi
930         if maint/f77tof90 $dir test/mpi/f90/$leafDir Makefile.am Makefile.ap ; then
931             echo "timestamp" > test/mpi/f90/$leafDir/Makefile.am-stamp
932         else
933             echo "failed"
934             error "maint/f77tof90 $dir failed!"
935             exit 1
936         fi
937     done
938     for dir in test/mpi/errors/f77/* ; do
939         if [ ! -d $dir ] ; then continue ; fi
940         leafDir=`basename $dir`
941         if [ ! -d test/mpi/errors/f90/$leafDir ] ; then
942             mkdir test/mpi/errors/f90/$leafDir
943         fi
944         if maint/f77tof90 $dir test/mpi/errors/f90/$leafDir Makefile.am Makefile.ap ; then
945             echo "timestamp" > test/mpi/errors/f90/$leafDir/Makefile.am-stamp
946         else
947             echo "failed"
948             error "maint/f77tof90 $dir failed!"
949             exit 1
950         fi
951     done
952     echo "done"
953 fi
954
955 echo
956 echo
957 echo "###########################################################"
958 echo "## Generating configure files"
959 echo "###########################################################"
960 echo
961
962 ########################################################################
963 ## Running autotools on non-simplemake directories
964 ########################################################################
965
966 if [ "$do_build_configure" = "yes" ] ; then
967     for external in $externals ; do
968        if [ -d "$external" -o -L "$external" ] ; then
969            echo "------------------------------------------------------------------------"
970            echo "running third-party initialization in $external"
971            (cd $external && ./autogen.sh) || exit 1
972        fi
973     done
974
975     for amdir in $amdirs ; do
976         if [ -d "$amdir" -o -L "$amdir" ] ; then
977             echo "------------------------------------------------------------------------"
978             echo "running $autoreconf in $amdir"
979             (cd $amdir && $autoreconf $autoreconf_args) || exit 1
980             # Patching libtool.m4
981             # This works with libtool versions 2.4 - 2.4.2.
982             # Older versions are not supported to build mpich.
983             # Newer versions should have this patch already included.
984             if [ -f $amdir/confdb/libtool.m4 ] ; then
985                 # There is no need to patch if we're not going to use Fortran.
986                 ifort_patch_requires_rebuild=no
987                 if [ $do_bindings = "yes" ] ; then
988                     echo_n "Patching libtool.m4 for compatibility with ifort on OSX... "
989                     patch -N -s -l $amdir/confdb/libtool.m4 maint/patches/optional/confdb/darwin-ifort.patch
990                     if [ $? -eq 0 ] ; then
991                         ifort_patch_requires_rebuild=yes
992                         # Remove possible leftovers, which don't imply a failure
993                         rm -f $amdir/confdb/libtool.m4.orig
994                         echo "done"
995                     else
996                         echo "failed"
997                     fi
998                 fi
999
1000                 if [ $ifort_patch_requires_rebuild = "yes" ] ; then
1001                     # Rebuild configure
1002                     (cd $amdir && $autoconf -f) || exit 1
1003                     # Reset libtool.m4 timestamps to avoid confusing make
1004                     touch -r $amdir/confdb/ltversion.m4 $amdir/confdb/libtool.m4
1005                 fi
1006             fi
1007         fi
1008     done
1009 fi