dnl -*- shell-script -*- dnl dnl Copyright (c) 2004-2009 The Trustees of Indiana University and Indiana dnl University Research and Technology dnl Corporation. All rights reserved. dnl Copyright (c) 2009-2015 Cisco Systems, Inc. All rights reserved. dnl Copyright (c) 2011-2012 Oak Ridge National Labs. All rights reserved. dnl Copyright (c) 2015 Research Organization for Information Science dnl and Technology (RIST). All rights reserved. dnl $COPYRIGHT$ dnl dnl Additional copyrights may follow dnl dnl $HEADER$ dnl ###################################################################### # # OMPI_EXT # # configure the Interface Extensions [similar to MCA version]. Works hand in # hand with Open MPI's autogen.pl, requiring it's specially formatted lists # of frameworks, components, etc. # # USAGE: # OMPI_EXT() # ###################################################################### AC_DEFUN([OMPI_EXT],[ dnl for OPAL_CONFIGURE_USER env variable AC_REQUIRE([OPAL_CONFIGURE_SETUP]) # Note that we do not build DSO's here -- we *only* build convenience # libraries that get slurped into higher-level libraries # # [default -- no option given] = No extensions built # --enable-mpi-ext=[,]*EXTENSION[,]* # AC_ARG_ENABLE(mpi-ext, AC_HELP_STRING([--enable-mpi-ext[=LIST]], [Comma-separated list of extensions that should be built. Possible values: ompi_mpiext_list. Example: "--enable-mpi-ext=foo,bar" will enable building the MPI extensions "foo" and "bar". If LIST is empty or the special value "all", then all available MPI extensions will be built (default: all).])) # print some nice messages about what we're about to do... AC_MSG_CHECKING([for available MPI Extensions]) AC_MSG_RESULT([ompi_mpiext_list]) AC_MSG_CHECKING([which MPI extension should be enabled]) if test "$enable_mpi_ext" = "" || \ test "$enable_mpi_ext" = "yes" || \ test "$enable_mpi_ext" = "all"; then enable_mpi_ext=all msg="All Available Extensions" str="`echo ENABLE_EXT_ALL=1`" eval $str else ifs_save="$IFS" IFS="${IFS}$PATH_SEPARATOR," msg= for item in $enable_mpi_ext; do type="`echo $item | cut -s -f1 -d-`" if test -z $type ; then type=$item fi str="`echo ENABLE_${type}=1 | sed s/-/_/g`" eval $str msg="$item $msg" done IFS="$ifs_save" fi AC_MSG_RESULT([$msg]) unset msg m4_ifdef([ompi_mpiext_list], [], [m4_fatal([Could not find MPI Extensions list. Aborting.])]) EXT_CONFIGURE ]) ###################################################################### # # EXT_CONFIGURE # # USAGE: # EXT_CONFIGURE() # ###################################################################### AC_DEFUN([EXT_CONFIGURE],[ outdir=ompi/include # first create the output include directory mkdir -p $outdir ############### # C Bindings ############### # remove any previously generated #include files mpi_ext_h=$outdir/mpi-ext.h rm -f $mpi_ext_h # Create the final mpi-ext.h file. cat > $mpi_ext_h <<EOF /* * \$HEADER\$ */ #ifndef OMPI_MPI_EXT_H #define OMPI_MPI_EXT_H 1 #if defined(c_plusplus) || defined(__cplusplus) extern "C" { #endif #define OMPI_HAVE_MPI_EXT 1 EOF ############### # mpif.h Bindings ############### # remove any previously generated #include files mpif_ext_h=$outdir/mpif-ext.h rm -f $mpif_ext_h # Create the final mpif-ext.h file. cat > $mpif_ext_h <<EOF ! -*- fortran -*- ! \$HEADER\$ ! ! *** THIS FILE IS AUTOMATICALLY GENERATED! ! *** Any manual edits will be lost! ! integer OMPI_HAVE_MPI_EXT parameter (OMPI_HAVE_MPI_EXT=1) ! EOF ############### # "use mpi" Bindings ############### # Although Fortran module files are essentially compiled header # files, we don't create them in ompi/include, like we do for # mpi.h and mpif.h. Instead, we build them down in ompi/fortran, # when we build the rest of the Fortran modules. Indeed, in the # "use mpi" case, it needs some of the same internal modules that # the mpi_f08 module itself needs. So the mpi_f08_ext module has # to be built *after* the mpi_f08 module (so that all the internal # modules it needs are already built). # remove any previously generated #include files outdir=ompi/mpi/fortran/mpiext mkdir -p $outdir mpiusempi_ext_h=$outdir/mpi-ext-module.F90 rm -f $mpiusempi_ext_h # Create the final mpiusempi-ext.h file. cat > $mpiusempi_ext_h <<EOF ! -*- fortran -*- ! \$HEADER\$ ! ! *** THIS FILE IS AUTOMATICALLY GENERATED! ! *** Any manual edits will be lost! ! module mpi_ext ! Even though this is not a useful parameter (cannot be used as a ! preprocessor catch) define it to keep the linker from complaining ! during the build. integer OMPI_HAVE_MPI_EXT parameter (OMPI_HAVE_MPI_EXT=1) ! EOF # Make an AM conditional to see whether we're building the mpi_ext # module. Note that we only build it if we support the ignore-tkr # mpi module. AS_IF([test $OMPI_BUILD_FORTRAN_BINDINGS -ge $OMPI_FORTRAN_USEMPI_BINDINGS && \ test $OMPI_FORTRAN_HAVE_IGNORE_TKR -eq 1], [OMPI_BUILD_FORTRAN_USEMPI_EXT=1], [OMPI_BUILD_FORTRAN_USEMPI_EXT=0]) AM_CONDITIONAL(OMPI_BUILD_FORTRAN_USEMPI_EXT, [test $OMPI_BUILD_FORTRAN_USEMPI_EXT -eq 1]) ############### # "use mpi_f08" Bindings ############### # See note above: we generate the mpi_f08_ext module in # ompi/mpi/fortran/mpiext # remove any previously generated #include files mpiusempif08_ext_h=$outdir/mpi-f08-ext-module.F90 rm -f $mpiusempif08_ext_h # Create the final mpiusempi-ext.h file. cat > $mpiusempif08_ext_h <<EOF ! -*- fortran -*- ! \$HEADER\$ ! ! *** THIS FILE IS AUTOMATICALLY GENERATED! ! *** Any manual edits will be lost! ! module mpi_f08_ext ! Even though this is not a useful parameter (cannot be used as a ! preprocessor catch) define it to keep the linker from complaining ! during the build. integer OMPI_HAVE_MPI_EXT parameter (OMPI_HAVE_MPI_EXT=1) ! EOF # Only build this mpi_f08_ext module if we're building the "use # mpi_f08" module *and* it's the non-descriptor one. AS_IF([test $OMPI_BUILD_FORTRAN_BINDINGS -ge $OMPI_FORTRAN_USEMPIF08_BINDINGS && \ test $OMPI_BUILD_FORTRAN_F08_SUBARRAYS -eq 0], [OMPI_BUILD_FORTRAN_USEMPIF08_EXT=1], [OMPI_BUILD_FORTRAN_USEMPIF08_EXT=0]) AM_CONDITIONAL(OMPI_BUILD_FORTRAN_USEMPIF08_EXT, [test $OMPI_BUILD_FORTRAN_USEMPIF08_EXT -eq 1]) # Make an AM conditional to see whether we're building either the # mpi_ext or mpi_f08_Ext modules. AM_CONDITIONAL(OMPI_BUILD_FORTRAN_USEMPI_OR_USEMPIF08_EXT, [test $OMPI_BUILD_FORTRAN_USEMPI_EXT -eq 1 || \ test $OMPI_BUILD_FORTRAN_USEMPIF08_EXT -eq 1]) # # Process each component # # remove any previously generated #include files outfile_real=ompi/mpiext/static-components.h outfile=$outfile_real.new rm -f $outfile $outfile.struct $outfile.extern $MKDIR_P ompi/mpiext touch $outfile.struct $outfile.extern m4_foreach(extension, [ompi_mpiext_list], [m4_ifval(extension, [EXT_CONFIGURE_M4_CONFIG_COMPONENT(extension, [OMPI_MPIEXT_ALL], [OMPI_MPIEXT_C], [OMPI_MPIEXT_MPIFH], [OMPI_MPIEXT_USEMPI], [OMPI_MPIEXT_USEMPIF08])])]) ############### # C Bindings ############### # Create the final mpi-ext.h file. cat >> $mpi_ext_h <<EOF #if defined(c_plusplus) || defined(__cplusplus) } #endif #endif /* OMPI_MPI_EXT_H */ EOF ############### # mpif.h Bindings ############### # Create the final mpif-ext.h file. cat >> $mpif_ext_h <<EOF ! EOF ############### # "use mpi" Bindings ############### # Create the final mpiusempi-ext.h file. cat >> $mpiusempi_ext_h <<EOF ! end module mpi_ext EOF ############### # "use mpi_f08" Bindings ############### # Create the final mpiusempi-ext.h file. cat >> $mpiusempif08_ext_h <<EOF ! end module mpi_f08_ext EOF # 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 "$2" != "common"; then cat > $outfile <<EOF /* * \$HEADER\$ */ #if defined(c_plusplus) || defined(__cplusplus) extern "C" { #endif `cat $outfile.extern` const ompi_mpiext_component_t *ompi_mpiext_components[[]] = { `cat $outfile.struct` NULL }; #if defined(c_plusplus) || defined(__cplusplus) } #endif 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 # We have all the results we need. Now put them in various # variables/defines so that others can see the results. OMPI_EXT_MAKE_DIR_LIST(OMPI_MPIEXT_ALL_SUBDIRS, $OMPI_MPIEXT_ALL) OMPI_EXT_MAKE_LISTS(OMPI_MPIEXT_C, $OMPI_MPIEXT_C, c, c) OMPI_EXT_MAKE_LISTS(OMPI_MPIEXT_MPIFH, $OMPI_MPIEXT_MPIFH, mpif-h, mpifh) OMPI_EXT_MAKE_LISTS(OMPI_MPIEXT_USEMPI, $OMPI_MPIEXT_USEMPI, use-mpi, usempi) OMPI_EXT_MAKE_LISTS(OMPI_MPIEXT_USEMPIF08, $OMPI_MPIEXT_USEMPIF08, use-mpi-f08, usempif08) comps=`echo $OMPI_MPIEXT_C | sed -e 's/^[ \t]*//;s/[ \t]*$//;s/ /, /g'` AC_DEFINE_UNQUOTED([OMPI_MPIEXT_COMPONENTS], ["$comps"], [MPI Extensions included in libmpi]) ]) ###################################################################### # # EXT_CONFIGURE_M4_CONFIG_COMPONENT # # # USAGE: # EXT_CONFIGURE_M4_CONFIG_COMPONENT((1) component_name, # (2) all_components_variable, # (3) c_components_variable, # (4) mpifh_components_variable, # (5) usempi_components_variable, # (6) usempif08_components_variable) # # - component_name is a single, naked string (no prefix) # - all others are naked component names (e.g., "example"). If an # extension is named in that variable, it means that that extension # has bindings of that flavor. # ###################################################################### AC_DEFUN([EXT_CONFIGURE_M4_CONFIG_COMPONENT],[ opal_show_subsubsubtitle "MPI Extension $1" EXT_COMPONENT_BUILD_CHECK($1, [should_build=1], [should_build=0]) # try to configure the component m4_ifdef([OMPI_MPIEXT_$1_CONFIG], [], [m4_fatal([Could not find OMPI_MPIEXT_]$1[_CONFIG macro for ]$1[ component])]) OMPI_MPIEXT_$1_CONFIG([should_build=${should_build}], [should_build=0]) AS_IF([test $should_build -eq 1], [EXT_PROCESS_COMPONENT([$1], [$2], [$3], [$4], [$5], [$6])], [EXT_PROCESS_DEAD_COMPONENT([$1], [$2])]) ]) ###################################################################### # # EXT_PROCESS_COMPONENT # # does all setup work for given component. It should be known before # calling that this component can build properly (and exists) # # USAGE: # EXT_CONFIGURE_ALL_CONFIG_COMPONENTS((1) component_name # (2) all_components_variable, # (3) c_components_variable, # (4) mpifh_components_variable, # (5) usempi_components_variable, # (6) usempif08_components_variable) # # C bindings are mandatory. Other bindings are optional / built if # they are found. Here's the files that the m4 expects: # #-------------------- # # C: # - c/mpiext_<component>_c.h: is included in mpi_ext.h # - c/libmpiext_<component>.la: convneience library slurped into libmpi.la # # mpi.f.h: # - mpif-h/mpiext_<component>_mpifh.h: is included mpi mpif_ext.h # - mpif-h/libmpiext_<component>_mpifh.la: convenience library slurped # into libmpi_mpifh.la # # If the ..._mpifh.h file exists, it is assumed that "make all" will # build the .la file. And therefore we'll include full support for # the mpif.h bindings for this extension in OMPI. # #-------------------- # # use mpi: # - use-mpi/mpiext_<component>_usempi.h: included in the mpi_ext module # # Only supported when the ignore-tkr mpi module is built (this # currently means: when you don't use gfortran). # # If the ..._usempi.h file exists, it is assumed that we'll include # full support for the mpi_ext bindings for this extension in OMPI. # # NO LIBRARY IS SUPPORTED FOR THE mpi MODULE BINDINGS! It is assumed # that all required symbols will be in the # libmpiext_<component>_mpifh.la library, and all that this set of # bindings does it give strong type checking to those subroutines. # #-------------------- # # use mpi_f08: # - use-mpi-f08/mpiext_<component>_usempif08.h: included in the mpi_ext module # - use-mpi-f08/libmpiext_<component>_usempif08.la: convenience # library slurped into libmpi_usempif08.la # # Only supported when the non-descriptor-based mpi_f08 module is built # (this currently means: when you don't use gfortran). # # If the ..._usempif08.h file exists, it is assumed that "make all" # will build the .la file. And therefore we'll include full support # for the mpi_f08 bindings for this extension in OMPI. # ###################################################################### AC_DEFUN([EXT_PROCESS_COMPONENT],[ component=$1 # Output pretty results AC_MSG_CHECKING([if MPI Extension $component can compile]) AC_MSG_RESULT([yes]) tmp[=]m4_translit([$1],[a-z],[A-Z]) component_define="OMPI_HAVE_MPI_EXT_${tmp}" ############### # C Bindings ############### test_header="${srcdir}/ompi/mpiext/$component/c/mpiext_${component}_c.h" AC_MSG_CHECKING([if MPI Extension $component has C bindings]) AS_IF([test ! -e "$test_header" && test ! -e "$test_header.in"], [ # There *must* be C bindings AC_MSG_RESULT([no]) AC_MSG_WARN([C bindings for MPI extensions are required]) AC_MSG_ERROR([Cannot continue])]) AC_MSG_RESULT([yes (required)]) # Save the list of headers and convenience libraries that this # component will output $2="$$2 $component" $3="$$3 $component" # JMS Where is this needed? EXT_C_HEADERS="$EXT_C_HEADERS mpiext/$component/c/mpiext_${component}_c.h" component_header="mpiext_${component}_c.h" cat >> $mpi_ext_h <<EOF /* Enabled Extension: $component */ #define $component_define 1 #include "openmpi/ompi/mpiext/$component/c/$component_header" EOF ############### # mpif.h bindings ############### # # Test if this extension has mpif.h bindings # If not, skip this step. # test_header="${srcdir}/ompi/mpiext/$component/mpif-h/mpiext_${component}_mpifh.h" enabled_mpifh=0 AC_MSG_CHECKING([if MPI Extension $component has mpif.h bindings]) if test -e "$test_header" ; then AC_MSG_RESULT([yes]) enabled_mpifh=1 # JMS Where is this needed? EXT_MPIFH_HEADERS="$EXT_MPIFH_HEADERS mpiext/$component/mpif-h/mpiext_${component}_mpifh.h" $4="$$4 $component" component_header="mpiext_${component}_mpifh.h" cat >> $mpif_ext_h <<EOF ! ! Enabled Extension: $component ! integer $component_define parameter ($component_define=1) include 'openmpi/ompi/mpiext/$component/mpif-h/$component_header' EOF else AC_MSG_RESULT([no]) cat >> $mpif_ext_h <<EOF ! ! Enabled Extension: $component ! No mpif.h bindings available ! integer $component_define parameter ($component_define=0) EOF fi ############### # "use mpi" bindings ############### # # Test if this extension has "use mpi" bindings # If not, skip this step. # test_header="${srcdir}/ompi/mpiext/$component/use-mpi/mpiext_${component}_usempi.h" AC_MSG_CHECKING([if MPI Extension $component has "use mpi" bindings]) if test -e "$test_header" ; then AC_MSG_RESULT([yes]) # JMS Where is this needed? EXT_USEMPI_HEADERS="$EXT_USEMPI_HEADERS mpiext/$component/use-mpi/mpiext_${component}_usempi.h" $5="$$5 $component" component_header="mpiext_${component}_usempi.h" cat >> $mpiusempi_ext_h <<EOF ! ! Enabled Extension: $component ! EOF # # Include the mpif.h header if it is available. Cannot do # this from inside the usempi.h since, for VPATH builds, the # top_ompi_srcdir is needed to find the header. # if test "$enabled_mpifh" = 1; then mpifh_component_header="mpiext_${component}_mpifh.h" cat >> $mpiusempi_ext_h <<EOF include '$top_ompi_srcdir/ompi/mpiext/$component/mpif-h/$mpifh_component_header' EOF fi cat >> $mpiusempi_ext_h <<EOF include '$top_ompi_srcdir/ompi/mpiext/$component/use-mpi/$component_header' EOF else AC_MSG_RESULT([no]) cat >> $mpiusempi_ext_h <<EOF ! ! Enabled Extension: $component ! No "use mpi" bindings available ! EOF fi ############### # "use mpi_f08" bindings ############### # # Test if this extension has "use mpi_f08" bindings # If not, skip this step. # test_header="${srcdir}/ompi/mpiext/$component/use-mpi-f08/mpiext_${component}_usempif08.h" AC_MSG_CHECKING([if MPI Extension $component has "use mpi_f08" bindings]) if test -e "$test_header" ; then AC_MSG_RESULT([yes]) # JMS Where is this needed? EXT_USEMPIF08_HEADERS="$EXT_USEMPIF08_HEADERS mpiext/$component/use-mpi-f08/mpiext_${component}_usempif08.h" $6="$$6 $component" component_header="mpiext_${component}_usempif08.h" cat >> $mpiusempif08_ext_h <<EOF ! ! Enabled Extension: $component ! EOF # # Include the mpif.h header if it is available. Cannot do # this from inside the usempif08.h since, for VPATH builds, # the top_ompi_srcdir is needed to find the header. # if test "$enabled_mpifh" = 1; then mpifh_component_header="mpiext_${component}_mpifh.h" cat >> $mpiusempif08_ext_h <<EOF include '$top_ompi_srcdir/ompi/mpiext/$component/mpif-h/$mpifh_component_header' EOF fi cat >> $mpiusempif08_ext_h <<EOF include '$top_ompi_srcdir/ompi/mpiext/$component/use-mpi-f08/$component_header' EOF else AC_MSG_RESULT([no]) cat >> $mpiusempif08_ext_h <<EOF ! ! Enabled Extension: $component ! No "use mpi_f08" bindings available ! EOF fi m4_ifdef([OMPI_MPIEXT_]$1[_NEED_INIT], [echo "extern const ompi_mpiext_component_t ompi_mpiext_${component};" >> $outfile.extern echo " &ompi_mpiext_${component}, " >> $outfile.struct]) # now add the flags that were set in the environment variables # framework_component_FOO (for example, the flags set by # m4_configure components) m4_foreach(flags, [LDFLAGS, LIBS], [AS_IF([test "$mpiext_$1_WRAPPER_EXTRA_]flags[" = ""], [OPAL_FLAGS_APPEND_UNIQ([ompi_mca_wrapper_extra_]m4_tolower(flags), [$mpiext_$1_]flags)], [OPAL_FLAGS_APPEND_UNIQ([ompi_mca_wrapper_extra_]m4_tolower(flags), [$mpiext_$1_WRAPPER_EXTRA_]flags)]) ]) AS_IF([test "$mpiext_$1_WRAPPER_EXTRA_CPPFLAGS" != ""], [OPAL_FLAGS_APPEND_UNIQ([ompi_mca_wrapper_extra_cppflags], [$mpiext_$1_WRAPPER_EXTRA_CPPFLAGS])]) ]) ###################################################################### # # EXT_PROCESS_DEAD_COMPONENT # # process a component that can not be built. Do the last minute checks # to make sure the user isn't doing something stupid. # # USAGE: # EXT_PROCESS_DEAD_COMPONENT((1) component_name, # (2) all_components_variable) # # NOTE: component_name will not be determined until run time. # ###################################################################### AC_DEFUN([EXT_PROCESS_DEAD_COMPONENT],[ AC_MSG_CHECKING([if MPI Extension $1 can compile]) # Need to add this component to the "all" list so that it is # included in DIST SUBDIRS $2="$$2 $1" AC_MSG_RESULT([no]) ]) ###################################################################### # # EXT_COMPONENT_BUILD_CHECK # # checks the standard rules of component building to see if the # given component should be built. # # USAGE: # EXT_COMPONENT_BUILD_CHECK(component, # action-if-build, action-if-not-build) # ###################################################################### AC_DEFUN([EXT_COMPONENT_BUILD_CHECK],[ AC_REQUIRE([AC_PROG_GREP]) component=$1 component_path="$srcdir/ompi/mpiext/$component" want_component=0 # 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_path ; 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 $component_path/.ompi_ignore ; then # If there is an ompi_ignore file, don't build # the component. Note that this decision can be # overridden by the unignore logic below. want_component=0 fi if test -f $component_path/.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 $component_path/.ompi_unignore ; then want_component=1 elif test ! -z "`$GREP $OPAL_CONFIGURE_USER $component_path/.ompi_unignore`" ; then want_component=1 fi fi fi # if we asked for everything, then allow it to build if able str="ENABLED_COMPONENT_CHECK=\$ENABLE_EXT_ALL" eval $str if test ! "$ENABLED_COMPONENT_CHECK" = "1" ; then # if we were explicitly disabled, don't build :) str="ENABLED_COMPONENT_CHECK=\$ENABLE_${component}" eval $str if test ! "$ENABLED_COMPONENT_CHECK" = "1" ; then want_component=0 fi fi AS_IF([test "$want_component" = "1"], [$2], [$3]) ]) # OMPI_EXT_MAKE_DIR_LIST(subst'ed variable, shell list) # # Prefix every extension name with "mpiext/" and AC subst it. # ------------------------------------------------------------------------- AC_DEFUN([OMPI_EXT_MAKE_DIR_LIST],[ $1= for item in $2 ; do $1="$$1 mpiext/$item" done AC_SUBST($1) ]) # OMPI_EXT_MAKE_LISTS((1) subst'ed variable prefix, # (2) shell list, # (3) bindings dir name, # (4) bindings suffix) # # Prefix every extension name with "mpiext/". # ------------------------------------------------------------------------- AC_DEFUN([OMPI_EXT_MAKE_LISTS],[ # Make the directory list tmp= for item in $2 ; do tmp="$tmp mpiext/$item/$3" done $1_DIRS=$tmp AC_SUBST($1_DIRS) # Make the list of libraries tmp= for item in $2 ; do tmp="$tmp "'$(top_builddir)'"/ompi/mpiext/$item/$3/libmpiext_${item}_$4.la" done $1_LIBS=$tmp AC_SUBST($1_LIBS) ])