dnl -*- shell-script -*-
dnl
dnl Copyright (c) 2004-2005 The Trustees of Indiana University.
dnl                         All rights reserved.
dnl Copyright (c) 2004-2005 The Trustees of the University of Tennessee.
dnl                         All rights reserved.
dnl Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, 
dnl                         University of Stuttgart.  All rights reserved.
dnl Copyright (c) 2004-2005 The Regents of the University of California.
dnl                         All rights reserved.
dnl $COPYRIGHT$
dnl 
dnl Additional copyrights may follow
dnl 
dnl $HEADER$
dnl

AC_DEFUN([OMPI_MCA],[

# Find which components should be built as run-time loadable components
# Acceptable combinations:
#
# [default -- no option given]
# --enable-mca-dso
# --enable-mca-dso=[.+,]*COMPONENT_TYPE[.+,]*
# --enable-mca-dso=[.+,]*COMPONENT_TYPE-COMPONENT_NAME[.+,]*
# --disable-mca-dso
#

AC_ARG_ENABLE(mca-dso,
    AC_HELP_STRING([--enable-mca-dso=LIST],
                   [comma-separated list of types and/or
                     type-component pairs that will be built as
                     run-time loadable components (as opposed to
                     statically linked in), if supported on this
                     platform.  The default is to build all components
                    as DSOs; the --disable-mca-dso[=LIST] form can be
                    used to disable building all or some
                    types/components as DSOs]))
AC_ARG_ENABLE(mca-static,
    AC_HELP_STRING([--enable-mca-static=LIST],
                   [comma-separated list of types and/or
                    type-component pairs that will be built statically
                    linked into the library.  The default (if DSOs are
                    supported) is to build all components as DSOs.
                    Enabling a component as static disables it
                    building as a DSO.]))
AC_ARG_ENABLE(mca-direct,
    AC_HELP_STRING([--enable-mca-direct=LIST],
                   [comma-separated list of type-component pairs that
                    will be hard coded as the one component to use for
                    a given component type, saving the (small)
                    overhead of the component architecture.  LIST must
                    not be empty and implies given component pairs are
                    build as static components.]))

#
# First, add all the mca-direct components / types into the mca-static
# lists and create a list of component types that are direct compile,
# in the form DIRECT_[type]=[component]
#
AC_MSG_CHECKING([which components should be direct-linked into the library])
if test "$enable_mca_direct" = "yes" ; then
    AC_MSG_RESULT([yes])
    AC_MSG_ERROR([*** The enable-mca-direct flag requires an explicit list of
*** type-component pairs.  For example, --enable-mca-direct=pml-teg,coll-basic])
elif test ! -z "$enable_mca_direct" -a "$enable_mca_direct" != "" ; then
    #
    # we need to add this into the static list, unless the static list
    # is everything
    #
    if test "$enable_mca_static" = "no" ; then
        AC_MSG_WARN([*** Re-enabling static component support for direct call])
        enable_mca_static="$enable_mca_direct"
    elif test -z "$enable_mca_static" ; then
        enable_mca_static="$enable_mca_direct"
    elif test "$enable_mca_static" != "yes" ; then
        enable_mca_static="$enable_mca_direct,$enable_mca_static"
    fi

    ifs_save="$IFS"
    IFS="${IFS}$PATH_SEPARATOR,"
    msg=
    for item in $enable_mca_direct; do
        type="`echo $item | cut -f1 -d-`"
        comp="`echo $item | cut -f2- -d-`"
        if test -z $type -o -z $comp ; then
            AC_MSG_ERROR([*** The enable-mca-direct flag requires a
*** list of type-component pairs.  Invalid input detected.])
        else
            str="`echo DIRECT_$type=$comp | sed s/-/_/g`"
            eval $str
            msg="$item $msg"
        fi
    done
    IFS="$ifs_save"
fi
AC_MSG_RESULT([$msg])
unset msg

#
# Second, set the DSO_all and STATIC_all variables.  conflict
# resolution (prefer static) is done in the big loop below
#
AC_MSG_CHECKING([which components should be run-time loadable])
if test "$enable_shared" = "no"; then
    DSO_all=0
    msg=none
elif test -z "$enable_mca_dso" -o "$enable_mca_dso" = "yes"; then
    DSO_all=1
    msg=all
elif test "$enable_mca_dso" = "no"; then
    DSO_all=0
    msg=none
else
    DSO_all=0
    ifs_save="$IFS"
    IFS="${IFS}$PATH_SEPARATOR,"
    msg=
    for item in $enable_mca_dso; do
        str="`echo DSO_$item=1 | sed s/-/_/g`"
        eval $str
        msg="$item $msg"
    done
    IFS="$ifs_save"
fi
AC_MSG_RESULT([$msg])
unset msg
if test "$enable_shared" = "no"; then
    AC_MSG_WARN([*** Shared libraries have been disabled (--disable-shared])
    AC_MSG_WARN([*** Building MCA components as DSOs automatically disabled])
fi

AC_MSG_CHECKING([which components should be static])
if test "$enable_mca_static" = "yes"; then
    STATIC_all=1
    msg=all
elif test -z "$enable_mca_static" -o "$enable_mca_static" = "no"; then
    STATIC_all=0
    msg=none
else
    STATIC_all=0
    ifs_save="$IFS"
    IFS="${IFS}$PATH_SEPARATOR,"
    msg=
    for item in $enable_mca_static; do
        str="`echo STATIC_$item=1 | sed s/-/_/g`"
        eval $str
        msg="$item $msg"
    done
    IFS="$ifs_save"
fi
AC_MSG_RESULT([$msg])
unset msg


# The list of MCA types (it's fixed)

AC_MSG_CHECKING([for MCA types])
found_types="common allocator coll errmgr gpr io iof mpool ns oob pls pml ptl ras rds rmaps rmgr rml schema soh topo"
AC_MSG_RESULT([$found_types])

# Get the list of all the non-configure MCA components that were found by
# autogen.sh.

# config/mca_no_configure_components.m4
MCA_FIND_NO_CONFIGURE_COMPONENTS

# Now determine the configurable components in each of the types.  This
# is a little redundant and could be combined into
# MCA_FIND_NO_CONFIGURE_COMPONENTS, but we separate it out for clarity.
# The extern statements and array of pointers to the component global
# structs are written to a file for each type that is #include'd in
# the file for each type.

for type in $found_types; do
    all_components=
    static_components=
    dso_components=
    static_ltlibs=

    # Ensure that the directory where the #include file is to live
    # exists.  Need to do this for VPATH builds, because the directory
    # may not exist yet.  For the "common" type, it's not really a
    # component, so it doesn't have a base.

    if test "$type" = "common"; then
        outdir=src/mca/common
    else
        outdir=src/mca/$type/base
    fi
    total_dir="."
    for dir_part in `IFS='/\\'; set X $outdir; shift; echo "$[@]"`; do
        total_dir=$total_dir/$dir_part
        test -d "$total_dir" ||
        mkdir "$total_dir" ||
        AC_MSG_ERROR([cannot create $total_dir])
    done

    # Also ensure that the dynamic-mca base directory exists

    total_dir="."
    dyndir=src/dynamic-mca/$type
    for dir_part in `IFS='/\\'; set X $dyndir; shift; echo "$[@]"`; do
        total_dir=$total_dir/$dir_part
        test -d "$total_dir" ||
        mkdir "$total_dir" ||
        AC_MSG_ERROR([cannot create $total_dir])
    done

    # Remove any previous generated #include files.

    outfile_real=$outdir/static-components.h
    outfile=$outfile_real.new
    rm -f $outfile $outfile.struct $outfile.extern \
       $outfile.all $outfile.static $outfile.dyanmic
    touch $outfile.struct $outfile.extern \
       $outfile.all $outfile.static $outfile.dso

    # Manual conversion of $type to its generic name (e.g., crmpi->cr,
    # crompi->cr).
    # JMS Fix this

    case "$type" in
    crmpi)
        generic_type="cr"
        ;;
    crompi)
        generic_type="cr"
        ;;
    *)
        generic_type="$type"
        ;;
    esac

    # set the direct / no direct flag
    str="DIRECT_COMPONENT=\$DIRECT_${type}"
    eval $str
    if test ! -z "$DIRECT_COMPONENT" ; then
        str="MCA_${type}_DIRECT_CALL_COMPONENT=$DIRECT_COMPONENT"
        eval $str
        str="MCA_${type}_DIRECT_CALL=1"
        eval $str
    else
        str="MCA_${type}_DIRECT_CALL_COMPONENT="
        eval $str
        str="MCA_${type}_DIRECT_CALL=0"
        eval $str
    fi

    # Iterate through the list of no-configure components

    foo="found_components=\$MCA_${type}_NO_CONFIGURE_SUBDIRS"
    eval $foo

    for component in $found_components; do
        m=`basename "$component"`

        # build if:
        # - the component type is direct and we are that component
        # - there is no ompi_ignore file
        # - there is an ompi_ignore, but there is an empty ompi_unignore
        # - there is an ompi_ignore, but username is in ompi_unignore
        if test -d $srcdir/$component ; then
            # decide if we want the component to be built or not.  This
            # is spread out because some of the logic is a little complex
            # and test's syntax isn't exactly the greatest.  We want to
            # build the component by default.
            want_component=1
            if test -f $srcdir/$component/.ompi_ignore ; then
                # If there is an ompi_ignore file, don't build
                # the component.  Note that this decision can be
                # overriden by the unignore logic below.
                want_component=0
            fi
            if test -f $srcdir/$component/.ompi_unignore ; then
                # if there is an empty ompi_unignore, that is
                # equivalent to having your userid in the unignore file.
                # If userid is in the file, unignore the ignore file.
                if test ! -s $srcdir/$component/.ompi_unignore ; then
                    want_component=1
                elif test ! -z "`grep $USER $srcdir/$component/.ompi_unignore`" ; then
                    want_component=1
                fi
            fi
            # if this component type is direct and we are not it, we don't want
            # to be built.  Otherwise, we do want to be built.
            if test ! -z "$DIRECT_COMPONENT" ; then
                if test "$DIRECT_COMPONENT" = "$m" ; then
                    want_component=1
                else
                    want_component=0
                fi
            fi
            if test "$want_component" = "1" ; then
                ompi_show_subtitle "MCA component $type:$m (no configure script)"

                # Remove any possible sym link in the mca-dynamic tree
            
                rm -f src/dynamic-mca/$type/$m

                # Now process the component

                MCA_PROCESS_COMPONENT(1, 1, $type, $m)

                # Note that the AM_CONDITIONAL for this component is set in
                # config/mca_no_configure_components.m4 -- which is generated by
                # autogen.sh because we cannot have a variable
                # AM_CONDITIONAL name (which we need here).  Since
                # autogen.sh knows the name that is necessary, it just
                # generated the AM_CONDITIONAL directly.  Here, we fill in
                # the variable that is used in that AM_CONDITIONAL.

                if test "$compile_mode" = "dso"; then
                    value=1
                else
                    value=0
                fi
                foo="BUILD_${type}_${m}_DSO=$value"
                eval $foo
                
                # double check that we can build direct if that was requested
                # DIRECT_CALL_HEADER *must* be defined by the component 
                # (in its post configure) if it
                # can be direct built, so we use that as a keyword to tell us
                # whether the component was successfully setup or not
                if test "$DIRECT_COMPONENT" = "$m" -a \
                        -z "$MCA_${type}_DIRECT_CALL_HEADER" ; then
AC_MSG_ERROR([${type} component ${m} was requested to be directly linked
into libmpi, but does not support such a configuration.  Please choose
another ${type} component for direct compilation or allow all components
of type ${type} to be loaded at runtime.])
                fi
            fi
        fi
    done

    # Find all configureable components, run their configure scripts,
    # etc.

    for component in $srcdir/src/mca/$type/*; do
        FOUND=0
        HAPPY=0
        m="`basename $component`"
        # build if:
        # - the component type is direct and we are that component
        # - there is no ompi_ignore file
        # - there is an ompi_ignore, but there is an empty ompi_unignore
        # - there is an ompi_ignore, but username is in ompi_unignore
        if test -d $component -a -x $component/configure ; then
            want_component=1
            if test -f $srcdir/$component/.ompi_ignore ; then
                want_component=0
            fi
            if test -f $srcdir/$component/.ompi_unignore ; then
                if test ! -s $srcdir/$component/.ompi_unignore ; then
                    want_component=1
                elif test ! -z "`grep $USER $srcdir/$component/.ompi_unignore`" ; then
                    want_component=1
                fi
            fi
            # if this component type is direct and we are not it, we don't want
            # to be built.  Otherwise, we do want to be built.
            if test ! -z "$DIRECT_COMPONENT" ; then
                if test "$DIRECT_COMPONENT" = "$m" ; then
                    # BWB - need some check in here to make sure component
                    # can be built direct!
                    want_component=1
                else
                    want_component=0
                fi
            fi
            if test "$want_component" = "1" ; then
                ompi_show_subtitle "MCA component $type:$m (need to configure)"

                # We found one!

                FOUND=1

                # Remove any possible sym link in the mca-dynamic tree

                rm -f src/dyanmic-mca/$type/$m

                # Configure the component subdirectory

                OMPI_CONFIG_SUBDIR([src/mca/$type/$m],
                                    [$ompi_subdir_args], 
                                    [HAPPY=1], [HAPPY=0])
            fi
        fi

        # Process this component

        MCA_PROCESS_COMPONENT($FOUND, $HAPPY, $type, $m)
        # double check that we can build direct if that was requested
        if test "$DIRECT_COMPONENT" = "$m" -a \
               -z "$MCA_${type}_DIRECT_CALL_HEADER" ; then
AC_MSG_ERROR([${type} component ${m} was requested to be directly linked
into libmpi, but does not support such a configuration.  Please choose
another ${type} component for direct compilation or allow all components
of type ${type} to be loaded at runtime.])
        fi

    done

    # m4 weirdness: must also do the echo after the sort, or we get a
    # string with newlines in it

    all_components="`sort $outfile.all`"
    all_components="`echo $all_components`"
    static_components="`sort $outfile.static`"
    static_components="`echo $static_components`"
    dso_components="`sort $outfile.dso`"
    dso_components="`echo $dso_components`"
    rm -f $outfile $outfile.all $outfile.static $outfile.dso

    # Create the final .h file that will be included in the type's
    # top-level glue.  This lists all the static components.  We don't
    # need to do this for "common".

    if test "$type" != "common"; then
        cat > $outfile <<EOF
/*
 * \$HEADER\$
 */

`cat $outfile.extern`

const mca_base_component_t *mca_${type}_base_static_components[[]] = {
`cat $outfile.struct`
  NULL
};
EOF
        # Only replace the header file if a) it doesn't previously
        # exist, or b) the contents are different.  Do this to not
        # trigger recompilation of certain .c files just because the
        # timestamp changed on $outfile_real (similar to the way AC
        # handles AC_CONFIG_HEADER files).

        diff $outfile $outfile_real > /dev/null 2>&1
        if test "$?" != "0"; then
            mv $outfile $outfile_real
        else
            rm -f $outfile
        fi
    fi
    rm -f $outfile.struct $outfile.extern 

    # Save the results for the Makefile.am's.  Note the whacky shell
    # script escaping that is necessary because $components may be
    # multiple words, but we also need to substitute on ${type}...

    foo="MCA_${type}_ALL_SUBDIRS"'="$all_components"'
    eval "$foo"
    foo="MCA_${type}_STATIC_SUBDIRS"'="$static_components"'
    eval "$foo"
    foo="MCA_${type}_DSO_SUBDIRS"'="$dso_components"'
    eval "$foo"
    foo="MCA_${type}_STATIC_LTLIBS"'="$static_ltlibs"'
    eval "$foo"
done
unset foo type m components structs outfile outdir total_dir file \
    all_components static_components dso_components static_ltlibs

# Grumble.  It seems that AC_SUBST and AC_DEFINE don't let you
# substitue on a variable name that contains a variable (e.g.,
# OMPI_MCA_$type_SUBDIRS).  So we have to do this manually.  :-(

# Common types

AC_SUBST(MCA_common_ALL_SUBDIRS)
AC_SUBST(MCA_common_STATIC_SUBDIRS)
AC_SUBST(MCA_common_DSO_SUBDIRS)
AC_SUBST(MCA_common_STATIC_LTLIBS)

# ORTE types

AC_SUBST(MCA_oob_ALL_SUBDIRS)
AC_SUBST(MCA_oob_STATIC_SUBDIRS)
AC_SUBST(MCA_oob_DSO_SUBDIRS)
AC_SUBST(MCA_oob_STATIC_LTLIBS)

AC_SUBST(MCA_dps_ALL_SUBDIRS)
AC_SUBST(MCA_dps_STATIC_SUBDIRS)
AC_SUBST(MCA_dps_DSO_SUBDIRS)
AC_SUBST(MCA_dps_STATIC_LTLIBS)

AC_SUBST(MCA_errmgr_ALL_SUBDIRS)
AC_SUBST(MCA_errmgr_STATIC_SUBDIRS)
AC_SUBST(MCA_errmgr_DSO_SUBDIRS)
AC_SUBST(MCA_errmgr_STATIC_LTLIBS)

AC_SUBST(MCA_gpr_ALL_SUBDIRS)
AC_SUBST(MCA_gpr_STATIC_SUBDIRS)
AC_SUBST(MCA_gpr_DSO_SUBDIRS)
AC_SUBST(MCA_gpr_STATIC_LTLIBS)

AC_SUBST(MCA_ns_ALL_SUBDIRS)
AC_SUBST(MCA_ns_STATIC_SUBDIRS)
AC_SUBST(MCA_ns_DSO_SUBDIRS)
AC_SUBST(MCA_ns_STATIC_LTLIBS)

AC_SUBST(MCA_ras_ALL_SUBDIRS)
AC_SUBST(MCA_ras_STATIC_SUBDIRS)
AC_SUBST(MCA_ras_DSO_SUBDIRS)
AC_SUBST(MCA_ras_STATIC_LTLIBS)

AC_SUBST(MCA_rds_ALL_SUBDIRS)
AC_SUBST(MCA_rds_STATIC_SUBDIRS)
AC_SUBST(MCA_rds_DSO_SUBDIRS)
AC_SUBST(MCA_rds_STATIC_LTLIBS)

AC_SUBST(MCA_rmaps_ALL_SUBDIRS)
AC_SUBST(MCA_rmaps_STATIC_SUBDIRS)
AC_SUBST(MCA_rmaps_DSO_SUBDIRS)
AC_SUBST(MCA_rmaps_STATIC_LTLIBS)

AC_SUBST(MCA_rmgr_ALL_SUBDIRS)
AC_SUBST(MCA_rmgr_STATIC_SUBDIRS)
AC_SUBST(MCA_rmgr_DSO_SUBDIRS)
AC_SUBST(MCA_rmgr_STATIC_LTLIBS)

AC_SUBST(MCA_pls_ALL_SUBDIRS)
AC_SUBST(MCA_pls_STATIC_SUBDIRS)
AC_SUBST(MCA_pls_DSO_SUBDIRS)
AC_SUBST(MCA_pls_STATIC_LTLIBS)

AC_SUBST(MCA_rml_ALL_SUBDIRS)
AC_SUBST(MCA_rml_STATIC_SUBDIRS)
AC_SUBST(MCA_rml_DSO_SUBDIRS)
AC_SUBST(MCA_rml_STATIC_LTLIBS)

AC_SUBST(MCA_schema_ALL_SUBDIRS)
AC_SUBST(MCA_schema_STATIC_SUBDIRS)
AC_SUBST(MCA_schema_DSO_SUBDIRS)
AC_SUBST(MCA_schema_STATIC_LTLIBS)

AC_SUBST(MCA_soh_ALL_SUBDIRS)
AC_SUBST(MCA_soh_STATIC_SUBDIRS)
AC_SUBST(MCA_soh_DSO_SUBDIRS)
AC_SUBST(MCA_soh_STATIC_LTLIBS)

AC_SUBST(MCA_svc_ALL_SUBDIRS)
AC_SUBST(MCA_svc_STATIC_SUBDIRS)
AC_SUBST(MCA_svc_DSO_SUBDIRS)
AC_SUBST(MCA_svc_STATIC_LTLIBS)

# MPI types

AC_SUBST(MCA_allocator_ALL_SUBDIRS)
AC_SUBST(MCA_allocator_STATIC_SUBDIRS)
AC_SUBST(MCA_allocator_DSO_SUBDIRS)
AC_SUBST(MCA_allocator_STATIC_LTLIBS)

AC_SUBST(MCA_coll_ALL_SUBDIRS)
AC_SUBST(MCA_coll_STATIC_SUBDIRS)
AC_SUBST(MCA_coll_DSO_SUBDIRS)
AC_SUBST(MCA_coll_STATIC_LTLIBS)

AC_SUBST(MCA_io_ALL_SUBDIRS)
AC_SUBST(MCA_io_STATIC_SUBDIRS)
AC_SUBST(MCA_io_DSO_SUBDIRS)
AC_SUBST(MCA_io_STATIC_LTLIBS)

AC_SUBST(MCA_iof_ALL_SUBDIRS)
AC_SUBST(MCA_iof_STATIC_SUBDIRS)
AC_SUBST(MCA_iof_DSO_SUBDIRS)
AC_SUBST(MCA_iof_STATIC_LTLIBS)

AC_SUBST(MCA_mpool_ALL_SUBDIRS)
AC_SUBST(MCA_mpool_STATIC_SUBDIRS)
AC_SUBST(MCA_mpool_DSO_SUBDIRS)
AC_SUBST(MCA_mpool_STATIC_LTLIBS)

AC_SUBST(MCA_pml_ALL_SUBDIRS)
AC_SUBST(MCA_pml_STATIC_SUBDIRS)
AC_SUBST(MCA_pml_DSO_SUBDIRS)
AC_SUBST(MCA_pml_STATIC_LTLIBS)
OMPI_SETUP_DIRECT_CALL(pml)

AC_SUBST(MCA_ptl_ALL_SUBDIRS)
AC_SUBST(MCA_ptl_STATIC_SUBDIRS)
AC_SUBST(MCA_ptl_DSO_SUBDIRS)
AC_SUBST(MCA_ptl_STATIC_LTLIBS)

AC_SUBST(MCA_schema_ALL_SUBDIRS)
AC_SUBST(MCA_schema_STATIC_SUBDIRS)
AC_SUBST(MCA_schema_DSO_SUBDIRS)
AC_SUBST(MCA_schema_STATIC_LTLIBS)

AC_SUBST(MCA_topo_ALL_SUBDIRS)
AC_SUBST(MCA_topo_STATIC_SUBDIRS)
AC_SUBST(MCA_topo_DSO_SUBDIRS)
AC_SUBST(MCA_topo_STATIC_LTLIBS)

# Finally, now that we've filled in all the test variables, get all
# the AM_CONDITIONALs that indicate whether to build components as shared
# or static.

# config/mca_no_configure_components.m4
MCA_AMC_NO_CONFIGURE_COMPONENTS])

dnl -----------------------------------------------------------------------
dnl -----------------------------------------------------------------------
dnl -----------------------------------------------------------------------

AC_DEFUN([MCA_PROCESS_COMPONENT],[
FOUND=$1
HAPPY=$2
type=$3
m=$4

# See if it dropped an output file for us to pick up some
# shell variables in.  

infile="src/mca/$type/$m/post_configure.sh"

# Did we find a valid component, and did its configure run
# successfully?

if test "$HAPPY" = "1"; then

    # Add this subdir to the mast list of all MCA component subdirs

    echo $m >> $outfile.all

    # Is this component going to built staic or shared?

    str="SHARED_TYPE=\$DSO_$type"
    eval $str
    str="SHARED_GENERIC_TYPE=\$DSO_$generic_type"
    eval $str
    str="SHARED_COMPONENT=\$DSO_${type}_$m"
    eval $str


    str="STATIC_TYPE=\$STATIC_$type"
    eval $str
    str="STATIC_GENERIC_TYPE=\$STATIC_$generic_type"
    eval $str
    str="STATIC_COMPONENT=\$STATIC_${type}_$m"
    eval $str

    shared_mode_override=static

    # Setup for either shared or static
    if test "$STATIC_TYPE" = "1" -o \
        "$STATIC_GENERIC_TYPE" = "1" -o \
        "$STATIC_COMPONENT" = "1" -o \
        "$STATIC_all" = "1" ; then
        compile_mode="static"
    elif test "$shared_mode_override" = "dso" -o \
        "$SHARED_TYPE" = "1" -o \
        "$SHARED_GENERIC_TYPE" = "1" -o \
        "$SHARED_COMPONENT" = "1" -o \
        "$DSO_all" = "1"; then
        compile_mode="dso"
    else
        compile_mode="static"
    fi

    if test "$compile_mode" = "dso" ; then
        echo $m >> $outfile.dso
        rm -f "src/dynamic-mca/$type/$m"
        $LN_S "$OMPI_TOP_BUILDDIR/src/mca/$type/$m" \
            "src/dynamic-mca/$type/$m"
    else
        static_ltlibs="mca/$type/$m/libmca_${type}_${m}.la $static_ltlibs"
        echo "extern const mca_base_component_t mca_${type}_${m}_component;" >> $outfile.extern
        echo "  &mca_${type}_${m}_component, " >> $outfile.struct
        echo $m >> $outfile.static
    fi

    # Output pretty results

    AC_MSG_CHECKING([if MCA component $type:$m can compile])
    AC_MSG_RESULT([yes])
    AC_MSG_CHECKING([for MCA component $type:$m compile mode])
    if test "$DIRECT_COMPONENT" = "$m" ; then
        AC_MSG_RESULT([$compile_mode - direct])
    else
        AC_MSG_RESULT([$compile_mode])
    fi
    
    # If there's an output file, add the values to
    # scope_EXTRA_flags.

    if test -f $infile; then

        # First check for the ABORT tag

        line="`grep ABORT= $infile | cut -d= -f2-`"
        if test -n "$line" -a "$line" != "no"; then
            AC_MSG_WARN([MCA component configure script told me to abort])
            AC_MSG_ERROR([cannot continue])
        fi

        # If we're not compiling statically, then only take the
        # "ALWAYS" tags (a uniq will be performed at the end -- no
        # need to worry about duplicate flags here)

        for flags in LDFLAGS LIBS; do
            var_in="LIBMPI_ALWAYS_EXTRA_${flags}"
            var_out="LIBMPI_EXTRA_${flags}"
            line="`grep $var_in= $infile | cut -d= -f2-`"
            eval "line=$line"
            if test -n "$line"; then
                str="$var_out="'"$'"$var_out $var_in $line"'"'
                eval $str
            fi
        done

        for flags in CFLAGS CXXFLAGS FFLAGS FCFLAGS LDFLAGS LIBS; do
            var_in="WRAPPER_ALWAYS_EXTRA_${flags}"
            var_out="WRAPPER_EXTRA_${flags}"
            line="`grep $var_in= $infile | cut -d= -f2-`"
            eval "line=$line"
            if test -n "$line"; then
                str="$var_out="'"$'"$var_out $var_in $line"'"'
                eval $str
            fi
        done

        # Check for flags passed up from the component.  If we're
        # compiling statically, then take all flags passed up from the
        # component.

        if test "$compile_mode" = "static"; then
            for flags in LDFLAGS LIBS; do
                var="LIBMPI_EXTRA_${flags}"
                line="`grep $var= $infile | cut -d= -f2-`"
                eval "line=$line"
                if test -n "$line"; then
                    str="$var="'"$'"$var $line"'"'
                    eval $str
                fi
            done

            for flags in CFLAGS CXXFLAGS FFLAGS FCFLAGS LDFLAGS LIBS; do
                var="WRAPPER_EXTRA_${flags}"
                line="`grep $var= $infile | cut -d= -f2-`"
                eval "line=$line"
                if test -n "$line"; then
                    str="$var="'"$'"$var $line"'"'
                    eval $str
                fi
            done
        fi
        dnl check for direct call header to include.  This will be
        dnl AC_SUBSTed later.
        if test "$DIRECT_COMPONENT" = "$m" ; then
            if test "`grep DIRECT_CALL_HEADER $infile`" != "" ; then
                line="`grep DIRECT_CALL_HEADER $infile | cut -d= -f2-`"
                str="MCA_${type}_DIRECT_CALL_HEADER=\\\"$line\\\""
                eval $str
            else
AC_MSG_ERROR([*** ${type} component ${m} was supposed to be direct-called, but
*** does not appear to support direct calling.
*** Aborting])
            fi
        fi
    else
        # were we supposed to have found something in the 
        # post_configure.sh, but the file didn't exist?
        if test "$DIRECT_COMPONENT" = "$m" ; then
AC_MSG_ERROR([*** ${type} component ${m} was supposed to be direct-called, but
*** does not appear to support direct calling.
*** Aborting])
        fi
    fi
elif test "$FOUND" = "1"; then
    AC_MSG_CHECKING([if MCA component $type:$m can compile])
    AC_MSG_RESULT([no])

    # If this component was requested as the default for this
    # type, then abort.

    str="foo="'"$'"with_$type"'"'
    eval $str
    str="bar="'"$'"with_$generic_type"'"'
    eval $str
    if test "$foo" = "$m" -o "$bar" = "$m"; then
        AC_MSG_WARN([MCA component "$m" failed to configure properly])
        AC_MSG_WARN([This component was selected as the default])
        AC_MSG_ERROR([Cannot continue])
        exit 1
    fi
fi
])


AC_DEFUN([OMPI_SETUP_DIRECT_CALL],[
        AC_SUBST(MCA_$1_DIRECT_CALL_HEADER)
        AC_DEFINE_UNQUOTED([MCA_$1_DIRECT_CALL], [$MCA_$1_DIRECT_CALL],
            [Defined to 1 if $1 should use direct calls instead of components])
        AC_DEFINE_UNQUOTED([MCA_$1_DIRECT_CALL_COMPONENT], [$MCA_$1_DIRECT_CALL_COMPONENT],
            [name of component to use for direct calls, if MCA_$1_DIRECT_CALL is 1])
        OMPI_WRITE_DIRECT_CALL_HEADER($1)
])


AC_DEFUN([OMPI_WRITE_DIRECT_CALL_HEADER],[
    AC_CONFIG_FILES(src/mca/$1/$1_direct_call.h.template)
    AC_CONFIG_COMMANDS($1-direct,
[if test -f "src/mca/$1/$1_direct_call"; then
  diff "src/mca/$1/$1_direct_call.h" "src/mca/$1/$1_direct_call.h.template" > /dev/null 2>&1
  if test "$?" != "0"; then
    cp "src/mca/$1/$1_direct_call.h.template" "src/mca/$1/$1_direct_call.h"
    echo "config.status: regenerating src/mca/$1/$1_direct_call.h"
  else
    echo "config.status: src/mca/$1/$1_direct_call.h unchanged"
  fi
else
  cp "src/mca/$1/$1_direct_call.h.template" "src/mca/$1/$1_direct_call.h"
  echo "config.status: creating src/mca/$1/$1_direct_call.h"
fi
rm src/mca/$1/$1_direct_call.h.template])
])