Skip to content
Snippets Groups Projects
Commit 15839472 authored by Jorrit Fahlke's avatar Jorrit Fahlke
Browse files

LDFLAGS-transition for the MPI stuff:

  - Introduce autoconf substitutions DUNEMPICPPFLAGS, DUNEMPILDFLAGS and
    DUNEMPILIBS.
  - Deprecate MPI_LDFLAGS and MPI_CPPFLAGS: the automake manual recommends
    against "_" in names of such variables, MPI_LDFLAGS actually contains
    mainly libraries and simply changing MPI_LDFLAGS to MPI_LIBS will probably
    break a lot of stuff.  By deprecating MPI_CPPFLAGS it is possible to make
    the preprocessor generate a deprecation warning with instructions to
    change both MPI_CPPFLAGS and MPI_LDFLAGS (though this has yet to be
    implemented).

[[Imported from SVN: r5806]]
parent 10220c62
No related branches found
No related tags found
No related merge requests found
......@@ -104,6 +104,9 @@ while test $# -gt 0 ; do
--cflags)
tasks="$tasks print_cflags"
;;
--ldflags)
tasks="$tasks print_ldflags"
;;
--libs)
tasks="$tasks print_libs"
;;
......@@ -169,14 +172,19 @@ print_mpiversion() {
print_cflags() {
get_mpiparameters
if test x$disablecxx = xyes; then
MPI_CPPFLAGS="$MPI_CPPFLAGS $MPI_NOCXXFLAGS"
DUNEMPICPPFLAGS="$DUNEMPICPPFLAGS $MPI_NOCXXFLAGS"
fi
echo $MPI_CPPFLAGS
echo $DUNEMPICPPFLAGS
}
print_ldflags() {
get_mpiparameters
echo $DUNEMPILDFLAGS
}
print_libs() {
get_mpiparameters
echo $MPI_LDFLAGS
echo $DUNEMPILIBS
}
for task in $tasks; do
......
......@@ -677,6 +677,10 @@ $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS)
\texttt{configure}, it may contain debugging and optimization options per
default (like \texttt{-DNDEBUG}). The value of \texttt{CPPFLAGS} always
appears after the other preprocessor flags.
\item[\texttt{\textit{LIB}CPPFLAGS}] Class: {\bf external-library}.
Preprocessor flags when building with library \textit{LIB}. This variable
should be include in \texttt{\textit{target}\_CPPFLAGS} or
\texttt{AM\_CPPFLAGS} in the \texttt{Makefile.am}.
\end{description}
\item[C-compiler flags] These flags are passed in any build rule that calls
......@@ -743,9 +747,10 @@ $(target_LDFLAGS) $(LDFLAGS)
\begin{lstlisting}[language=make]
$(AM_LDFLAGS) $(LDFLAGS)
\end{lstlisting}
is used. These variables are inapropriate to pass any \texttt{-L} or
\texttt{-l} options or library files. Use a variable from the {\em
libraries to link to} set to do that.
is used. These variables are inapropriate to pass any options or parameters
that specify libraries of object files, in particular \texttt{-L} or
\texttt{-l} or the libtool options \texttt{-dlopen} and \texttt{-dlpreopen}.
Use a variable from the {\em libraries to link to} set to do that.
\begin{description}
\item[\texttt{\textit{target}\_LDFLAGS}] Class: {\bf target-specific}.
Target-specific C++ compiler flags. If this variable exists, it overrides
......@@ -760,10 +765,15 @@ $(AM_LDFLAGS) $(LDFLAGS)
\texttt{configure}, it may contain debugging, optimization and warning
options per default. The value of \texttt{LDFLAGS} always appears after
the other linker flags.
\item[\texttt{\textit{LIB}LDFLAGS}] Class: {\bf external-library}. Linker
flags needed when linking to library \textit{LIB}. This variable should
be include in \texttt{\textit{target}\_LDFLAGS} or \texttt{AM\_LDFLAGS} in
the \texttt{Makefile.am}.
\end{description}
\item[libraries to link to] These variables are used to determine the
libraries to link to. They are passed whenever the linker is called. When
libraries and object files to link to. They are passed whenever the linker
is called. When
linking a program, extra libraries and objects to link to are given by
\begin{lstlisting}[language=make]
$(target_LDADD) $(LIBS)
......@@ -771,8 +781,9 @@ $(target_LDADD) $(LIBS)
If the {\bf target-specific} variable \texttt{\textit{target}\_LDADD} is not
defined, automake supplies
\begin{lstlisting}[language=make]
$(target_LDADD) = $(LDADD)
target_LDADD = $(LDADD)
\end{lstlisting}
%$\end{lstlisting}
When linking a library, extra libraries and objects to link to are given by
\begin{lstlisting}[language=make]
$(target_LIBADD) $(LIBS)
......@@ -780,16 +791,27 @@ $(target_LIBADD) $(LIBS)
If the {\bf target-specific} variable \texttt{\textit{target}\_LIBADD} is
not defined, automake defines it empty
\begin{lstlisting}[language=make]
$(target_LIBADD) =
target_LIBADD =
\end{lstlisting}
%$\end{lstlisting}
Linker flags except \texttt{-L} or \texttt{-l} are generally inapropriate
for there variables.
Libraries and objects to link to must be given in reverse order: a library
or object file must come before the libraries or object files it depends on
on the linker command line. Thus the value of the \texttt{LIBS} variable is
included after the value of the \texttt{\textit{target}\_LDADD} or
\texttt{\textit{target}\_LIBADD} variable.
In general, any linker flags and argument that specify libraries and object
files should be included in these variables, and nothing else. In
particular that means library and object file names, the options \texttt{-L}
and \texttt{-l}, and the libtool options \texttt{-dlopen} and
\texttt{-dlpreopen}. The option \texttt{-L} should come directly before any
\texttt{-l} options it sets the linker path for, otherwise a path set by
another \texttt{-L} option may take precedence, which may happen to contain
a library by the same name.
\begin{description}
\item[\texttt{\textit{target}\_LDADD}] Class: {\bf target-specific}.
Target-specific libraries and objects to link to {\em for programs}. If
this variable does not exist, it defaults to \texttt{\$(LDADD)}.
\item[\texttt{LDADD}] Class: {\bf target-specific}. Libraries and objects
\item[\texttt{LDADD}] Class: {\bf automake}. Libraries and objects
to link to {\em for programs}. Default for
\texttt{\textit{target}\_LDADD}.
\item[\texttt{\textit{target}\_LIBADD}] Class: {\bf target-specific}.
......@@ -799,9 +821,39 @@ $(target_LIBADD) =
the empty value is assumed.
\item[\texttt{LIBS}] Class: {\bf automake}, {\bf configure-substituted}.
Libraries discovered by configure.
\item[\texttt{\textit{LIB}LIBS}] Class: {\bf external-library}. Libraries
and object files needed to linking against library \textit{LIB}, including
that library itself. This variable should be include in
\texttt{\textit{target}\_LDADD}, \texttt{LDADD}, or
\texttt{\textit{target}\_LIBADD} in the \texttt{Makefile.am}.
\end{description}
\end{description}
\minisec{Individual library variables}
\begin{description}
\item[MPI] The \texttt{DUNE\_MPI} macro sets the following variables with the
help of the macros \texttt{ACX\_MPI} and \texttt{MPI\_CONFIG}: For
compilation with the MPI compiler \texttt{MPICC} and \texttt{MPILIBS}.
These are not used in \dune except that \texttt{MPICC} may be set on the
configure command line to select which MPI installation to use. For
compilation with the standard compiler it sets \texttt{DUNEMPICPPFLAGS},
\texttt{DUNEMPILDFLAGS} and \texttt{DUNEMPILIBS}, and the deprecated
variables \texttt{MPI\_CPPFLAGS} and \texttt{MPI\_LDFLAGS} (note there is no
\texttt{MPI\_LIBS}). Unfortunately with most MPI implementations it is
impossible to obtain the linker flags seperately from the libraries to link
to. Therefore, this macro stuffs everything into \texttt{DUNEMPILIBS},
which has the advantage that it works and the disavantage that users are
unable to overwrite the linker flags. If that is a problem users should set
these variables themselves on the configure command line.
In addition, this macro substitutes \texttt{MPI\_VERSION} a text string
identifying the detected version of MPI. It defines the following
preprocessor defines: \texttt{MPI\_2}, defined if the detected MPI supports
the MPI-2 standard. \texttt{HAVE_MPI}, 1 if MPI is detected and enabled.
It also defines the automake conditional \texttt{MPI}.
\end{description}
\minisec{Conditional builds}
Some parts of \dune only make sense if certain addon-packages were
......
......@@ -84,7 +84,7 @@ AC_DEFUN([DUNE_MPI],[
MPICOMP="$MPICC"
MPI_CONFIG()
MPI_CPPFLAGS="$MPI_CPPFLAGS $MPI_NOCXXFLAGS -DENABLE_MPI=1"
DUNEMPICPPFLAGS="$DUNEMPICPPFLAGS $MPI_NOCXXFLAGS -DENABLE_MPI=1"
with_mpi="yes ($dune_MPI_VERSION)"
],[
......@@ -99,12 +99,14 @@ AC_DEFUN([DUNE_MPI],[
# store old values
ac_save_LIBS="$LIBS"
ac_save_LDFLAGS="$LDFLAGS"
ac_save_CPPFLAGS="$CPPFLAGS"
# looks weird but as the -l... are contained in the MPI_LDFLAGS these
# parameters have to be last on the commandline: with LIBS this is true
LIBS="$MPI_LDFLAGS"
CPPFLAGS="$CPPFLAGS $MPI_CPPFLAGS"
LIBS="$DUNEMPILIBS $LIBS"
LDFLAGS="$LDFLAGS $DUNEMPILDFLAGS"
CPPFLAGS="$CPPFLAGS $DUNEMPICPPFLAGS"
# try to create MPI program
AC_LANG_PUSH([C++])
......@@ -122,7 +124,7 @@ AC_DEFUN([DUNE_MPI],[
)
AS_IF([test "x$mpiruntest" != "xyes"],[
AC_MSG_WARN([Diabled test whether running with $dune_MPI_VERSION works.])
AC_MSG_WARN([Disabled test whether running with $dune_MPI_VERSION works.])
],[
AC_MSG_CHECKING([whether running with $dune_MPI_VERSION works])
AC_RUN_IFELSE(
......@@ -158,14 +160,24 @@ AC_DEFUN([DUNE_MPI],[
])
# set flags
MPI_CPPFLAGS="$DUNEMPICPPFLAGS"
MPI_LDFLAGS="$DUNEMPILDFLAGS $DUNEMPILIBS"
AS_IF([test "x$with_mpi" != "xno"],[
AC_SUBST(DUNEMPICPPFLAGS, $DUNEMPICPPFLAGS)
AC_SUBST(DUNEMPILDFLAGS, $DUNEMPILDFLAGS)
AC_SUBST(DUNEMPILIBS, $DUNEMPILIBS)
AC_SUBST(MPI_CPPFLAGS, $MPI_CPPFLAGS)
AC_SUBST(MPI_LDFLAGS, $MPI_LDFLAGS)
AC_SUBST(MPI_VERSION, $dune_MPI_VERSION)
AC_DEFINE(HAVE_MPI,ENABLE_MPI,[Define if you have the MPI library.
This is only true if MPI was found by configure
_and_ if the application uses the MPI_CPPFLAGS])
This is only true if MPI was found by configure _and_ if the application
uses the DUNEMPICPPFLAGS (or the deprecated MPI_CPPFLAGS)])
],[
AC_SUBST(DUNEMPICPPFLAGS, "")
AC_SUBST(DUNEMPILDFLAGS, "")
AC_SUBST(DUNEMPILIBS, "")
AC_SUBST(MPI_CPPFLAGS, "")
AC_SUBST(MPI_LDFLAGS, "")
])
......
......@@ -52,16 +52,24 @@ _EOF
# seems like LAM >= 7.1 which supports extraction of parameters without
# dummy files
dune_MPI_VERSION="LAM >= 7.1"
MPI_CPPFLAGS="$retval"
mpi_getflags "-showme:link"
MPI_LDFLAGS="$retval"
if test x"$DUNEMPICPPFLAGS" = x; then
DUNEMPICPPFLAGS="$retval"
fi
if x"$DUNEMPILIBS" = x; then
mpi_getflags "-showme:link"
DUNEMPILIBS="$retval"
fi
else
dune_MPI_VERSION="LAM < 7.1"
# use -showme and dummy parameters to extract flags
mpi_getflags "-showme" "-c $MPISOURCE"
MPI_CPPFLAGS="$retval"
mpi_getflags "-showme" "dummy.o -o dummy"
MPI_LDFLAGS="$retval"
if x"$DUNEMPICPPFLAGS" = x; then
mpi_getflags "-showme" "-c $MPISOURCE"
DUNEMPICPPFLAGS="$retval"
fi
if x"$DUNEMPILIBS" = x; then
mpi_getflags "-showme" "dummy.o -o dummy"
DUNEMPILIBS="$retval"
fi
fi
# hack in option to disable LAM-C++-bindings...
# we fake to have mpicxx.h read already
......@@ -77,49 +85,55 @@ _EOF
}
mpi_getmpichflags() {
if test x"$DUNEMPICPPFLAGS" = x; then
# use special commands to extract options
mpi_getflags "-compile_info"
MPI_CPPFLAGS="$retval"
DUNEMPICPPFLAGS="$retval"
# remove implicitly set -c
mpi_remove "$MPI_CPPFLAGS" '-c'
MPI_CPPFLAGS="$retval"
mpi_remove "$DUNEMPICPPFLAGS" '-c'
DUNEMPICPPFLAGS="$retval"
fi
if x"$DUNEMPILIBS" = x; then
# get linker options
mpi_getflags "-link_info"
MPI_LDFLAGS="$retval"
DUNEMPILIBS="$retval"
# strip -o option
mpi_remove "$MPI_LDFLAGS" "-o"
MPI_LDFLAGS="$retval"
#strip MPI_CPPFLAGS (which are included for mpich2 on jugene)
enc=`echo "$MPI_CPPFLAGS" | sed -e 's/\\//\\\\\\//g'`
MPI_LDFLAGS=`echo "$retval" | sed -e "s/$enc / /"`
mpi_remove "$DUNEMPILIBS" "-o"
DUNEMPILIBS="$retval"
#strip DUNEMPICPPFLAGS (which are included for mpich2 on jugene)
enc=`echo "$DUNEMPICPPFLAGS" | sed -e 's/\\//\\\\\\//g'`
DUNEMPILIBS=`echo "$retval" | sed -e "s/$enc / /"`
fi
# hack in option to disable MPICH-C++-bindings...
MPI_NOCXXFLAGS="-DMPICH_SKIP_MPICXX"
# hack in option to disable MPICH-C++-bindings...
MPI_NOCXXFLAGS="-DMPICH_SKIP_MPICXX"
}
mpi_getmpich2flags() {
if test x"$DUNEMPICPPFLAGS" = x; then
# use special commands to extract options
mpi_getflags "-show" "-c"
MPI_CPPFLAGS="$retval"
DUNEMPICPPFLAGS="$retval"
# remove implicitly set -c
mpi_remove "$MPI_CPPFLAGS" '-c'
MPI_CPPFLAGS="$retval"
mpi_remove "$DUNEMPICPPFLAGS" '-c'
DUNEMPICPPFLAGS="$retval"
fi
if x"$DUNEMPILIBS" = x; then
# get linker options
mpi_getflags "-show" "-o"
MPI_LDFLAGS="$retval"
DUNEMPILIBS="$retval"
# strip -o option
mpi_remove "$MPI_LDFLAGS" "-o"
MPI_LDFLAGS="$retval"
#strip MPI_CPPFLAGS (which are included for mpich2 on jugene)
enc=`echo "$MPI_CPPFLAGS" | sed -e 's/\\//\\\\\\//g'`
MPI_LDFLAGS=`echo "$retval" | sed -e "s/$enc / /"`
mpi_remove "$DUNEMPILIBS" "-o"
DUNEMPILIBS="$retval"
#strip DUNEMPICPPFLAGS (which are included for mpich2 on jugene)
enc=`echo "$DUNEMPICPPFLAGS" | sed -e 's/\\//\\\\\\//g'`
DUNEMPILIBS=`echo "$retval" | sed -e "s/$enc / /"`
fi
# hack in option to disable MPICH-C++-bindings...
MPI_NOCXXFLAGS="-DMPICH_SKIP_MPICXX"
# hack in option to disable MPICH-C++-bindings...
MPI_NOCXXFLAGS="-DMPICH_SKIP_MPICXX"
}
test_mpich () {
......@@ -178,10 +192,14 @@ _EOF
if (mpi_preprocess conftest.c | grep -q ompi_communicator_t); then
dune_MPI_VERSION="OpenMPI"
mpi_getflags "-showme:compile"
MPI_CPPFLAGS="$retval"
mpi_getflags "-showme:link"
MPI_LDFLAGS="$retval"
if test x"$DUNEMPICPPFLAGS" = x; then
mpi_getflags "-showme:compile"
DUNEMPICPPFLAGS="$retval"
fi
if x"$DUNEMPILIBS" = x; then
mpi_getflags "-showme:link"
DUNEMPILIBS="$retval"
fi
MPI_NOCXXFLAGS="-DMPIPP_H"
AC_MSG_RESULT([yes])
......@@ -247,30 +265,14 @@ test_ibmmpi() {
if (echo $retval | grep '^xl[[cC]]'); then
dune_MPI_VERSION="IBM MPI"
# get compilation script
# AC_LANG_CASE([C],[
# MPICOMP="$MPICC"
# dune_mpi_isgnu="$GCC"
# ],
# [C++],[
# MPICOMP="$MPICXX"
# dune_mpi_isgnu="$GXX"
# ])
# mpCC assumes xlc is used...
# if test x$dune_mpi_isgnu = xyes ; then
# # change commandline if GNU compiler is used
# retval=`echo $retval | sed -e 's/\(-b[[^ ]]*\)/-Xlinker \1/g'`
# fi
MPI_CPPFLAGS="$retval"
if test x"$DUNEMPICPPFLAGS" = x; then
DUNEMPICPPFLAGS="$retval"
fi
mpi_getflags "-v" "dummy.o -o dummy"
# if test x$dune_mpi_isgnu = xyes ; then
# # change commandline if GNU compiler is used
# retval=`echo $retval | sed -e 's/\(-b[[^ ]]*\)/-Xlinker \1/g'`
# fi
MPI_LDFLAGS="$retval"
if x"$DUNEMPILIBS" = x; then
mpi_getflags "-v" "dummy.o -o dummy"
DUNEMPILIBS="$retval"
fi
AC_MSG_RESULT([yes])
rm -f conftest*
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment