diff --git a/m4/dune_mpi.m4 b/m4/dune_mpi.m4 new file mode 100644 index 0000000000000000000000000000000000000000..fdad32290fa352e0ca544efe2fb59ef40f3da532 --- /dev/null +++ b/m4/dune_mpi.m4 @@ -0,0 +1,126 @@ +# $Id$ + +# wrapper for the autoconf-archive check. Note: compiling MPI-stuff sucks! + +# Explanation: +# ============ +# + +# compilation of MPI-programs is normally done by a +# mpicc/mpiCC-wrapper that adds all options needed. Thus, it may seem +# possible to just replace the compiler call by the wrapper and +# everything works. Unfortunately that's not the case: automake and +# libtool both show strange behaviour. +# +# In detail: replacing the compiler globally via ./configure CXX=mpiCC +# should work (at least I've found reports claiming this) but that is +# not what we want: mainly, it just adds a level of possible errors +# (mpiCC from MPICH does _nothing_ if "mpicc -c dummy.cc" is called!) +# and might introduce nice library-clashes. +# +# The next approach would be to include +# if MPI +# CXX = $(MPICXX) +# endif +# in the Makefile.am where MPI is needed. First, this will change +# compilations of all binaries in this directory and secondly the +# dependency-tracking seems to break: the first compilation worked but +# the second failed with the compiler complaining about mismatching +# flags... There is no 'program_CXX = ...' in automake but even if +# there were it would break as well +# +# Thus, the best solution is to extract the flags needed for +# compilation and linking. Unfortunately, the parameters and behaviour +# of mpicc is not at all consistent over different +# implementations. For MPICH the parameters -compile_info and +# -link_info exist (albeit not being documented in the manpage, only +# in -help), for LAM dummy-calls of compilation and linking together +# with a -showme parameter (which is called -show in MPICH...) have to +# be used. Obviously, we have to identify the type of package... this +# is done via mpiCC-calls for now, I wouldn't be surprised if ths +# breaks often. Bad luck. Blame the MPI folks for this mess. And blame +# them a lot. [Thimo 26.8.2004] + +# TODO: +# +# - add --disable-mpi + +AC_DEFUN([DUNE_MPI],[ + + AC_LANG_PUSH([C++]) + # implicitly sets the HAVE_MPI-define and the MPICXX-substitution + ACX_MPI() + AC_LANG_POP([C++]) + +# somehow variables like $1, $2 seem to disappear after m4... Quote them... +dune_mpi_getflags () { + # call mpiCC, remove compiler name + # the additional brackets keep m4 from interpreting the brackets + # in the sed-command... + retval=[`$MPICXX ${1} ${2} 2>/dev/null | sed -e 's/^[^ ]\+ //'`] + # remove dummy-parameter (if existing) + if test ${#} = 2 ; then + retval=`echo $retval | sed -e "s/${2}//"` + fi +} + + # taken from acx_mpi: test succeeded if MPILIBS is not empty + if test x != x"$MPILIBS" -a x != x"$MPICXX" ; then + with_mpi="no" + + AC_MSG_CHECKING([MPI-package]) + # the MPICH mpiCC knows a -show parameter + dune_mpi_getflags "-show" + if test x"$retval" != x ; then + with_mpi="MPICH" + + # use special commands to extract options + + dune_mpi_getflags "-compile_info" + # hack in option to disable MPICH-C++-bindings... + MPI_CXXFLAGS="$retval -DMPICH_SKIP_MPICXX" + + dune_mpi_getflags "-link_info" + MPI_LDFLAGS="$retval" + + AC_MSG_RESULT([MPICH]) + else + # the LAM mpiCC knows a -showme parameter + dune_mpi_getflags "-showme" + if test x"$retval" != x ; then + AC_MSG_RESULT([LAM]) + with_mpi="LAM" + + # use -showme and dummy parameters to extract flags + + dune_mpi_getflags "-showme" "-c dummy.cc" + MPI_CXXFLAGS="$retval" + + dune_mpi_getflags "-showme" "dummy.o -o dummy" + MPI_LDFLAGS="$retval" + else + # neither MPICH nor LAM.... + AC_MSG_RESULT([unknown]) + fi + fi + + # fallback... can't extract flags :( + if test x$with_mpi = xno ; then + AC_MSG_WARN([Could not identify MPI-package! Please send a bugreport and tell us what MPI-package you're using]) + fi + else + # ACX_MPI didn't find anything + with_mpi="no" + fi + + # set flags + if test x$with_mpi != xno ; then + AC_SUBST(MPI_CXXFLAGS, $MPI_CXXFLAGS) + AC_SUBST(MPI_LDFLAGS, $MPI_LDFLAGS) + else + AC_SUBST(MPI_CXXFLAGS, "") + AC_SUBST(MPI_LDFLAGS, "") + fi + + AM_CONDITIONAL(MPI, test x$with_mpi != xno) +])