diff options
author | 2021-09-07 13:53:50 -0400 | |
---|---|---|
committer | 2021-09-07 13:54:41 -0400 | |
commit | c6902b80403a506ebe337818c849f7d468294927 (patch) | |
tree | 55ac2733533dcae5c5d834d1e5a5889c031b0205 /sci-libs/mumps/mumps-5.3.5-r1.ebuild | |
parent | dev-python/pyzmq: stable 22.1.0 for sparc, bug #808339 (diff) | |
download | gentoo-c6902b80403a506ebe337818c849f7d468294927.tar.gz gentoo-c6902b80403a506ebe337818c849f7d468294927.tar.bz2 gentoo-c6902b80403a506ebe337818c849f7d468294927.zip |
sci-libs/mumps: new revision to fix more underlinking.
When building without USE=mpi, the various lib*mumps libraries use
LAPACK symbols without actually linking to liblapack. There are
already a bunch of hacks in the mumps ebuild to work around these
issues, so all I've done is add one more. As a simple test case,
you can try to run the test suite for sci-libs/coinor-clp with
USE="mumps metis", which now works.
Closes: https://bugs.gentoo.org/777840
Package-Manager: Portage-3.0.20, Repoman-3.0.3
Signed-off-by: Michael Orlitzky <mjo@gentoo.org>
Diffstat (limited to 'sci-libs/mumps/mumps-5.3.5-r1.ebuild')
-rw-r--r-- | sci-libs/mumps/mumps-5.3.5-r1.ebuild | 208 |
1 files changed, 208 insertions, 0 deletions
diff --git a/sci-libs/mumps/mumps-5.3.5-r1.ebuild b/sci-libs/mumps/mumps-5.3.5-r1.ebuild new file mode 100644 index 000000000000..8f970661e820 --- /dev/null +++ b/sci-libs/mumps/mumps-5.3.5-r1.ebuild @@ -0,0 +1,208 @@ +# Copyright 1999-2021 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=7 + +inherit fortran-2 flag-o-matic multilib toolchain-funcs + +MYP=MUMPS_${PV} + +DESCRIPTION="MUltifrontal Massively Parallel sparse direct matrix Solver" +HOMEPAGE="http://mumps.enseeiht.fr/" +SRC_URI="http://mumps.enseeiht.fr/${MYP}.tar.gz" +S="${WORKDIR}/${MYP}" + +LICENSE="public-domain" +SLOT="0" +KEYWORDS="~amd64 ~x86 ~amd64-linux ~x86-linux" +IUSE="doc examples metis mpi +scotch static-libs" + +BDEPEND="virtual/pkgconfig" +RDEPEND=" + virtual/blas + metis? ( + >=sci-libs/metis-5 + mpi? ( >=sci-libs/parmetis-4 ) + ) + mpi? ( sci-libs/scalapack ) + !mpi? ( virtual/lapack ) + scotch? ( >=sci-libs/scotch-6.0.1:=[mpi=] ) +" +DEPEND="${RDEPEND}" + +_get_version_component_count() { + local cnt=( $(ver_rs 1- ' ') ) + echo ${#cnt[@]} || die +} + +static_to_shared() { + local libstatic=${1} + shift + local libname=$(basename ${libstatic%.a}) + local soname=${libname}$(get_libname $(ver_cut 1-2)) + local libdir=$(dirname ${libstatic}) + + einfo "Making ${soname} from ${libstatic}" + if [[ ${CHOST} == *-darwin* ]] ; then + ${LINK:-$(tc-getCC)} ${LDFLAGS} \ + -dynamiclib -install_name "${EPREFIX}"/usr/lib/"${soname}" \ + -Wl,-all_load -Wl,${libstatic} \ + "$@" -o ${libdir}/${soname} || die "${soname} failed" + else + ${LINK:-$(tc-getCC)} ${LDFLAGS} \ + -shared -Wl,-soname=${soname} \ + -Wl,--whole-archive ${libstatic} -Wl,--no-whole-archive \ + "$@" -o ${libdir}/${soname} || die "${soname} failed" + + if [[ $(_get_version_component_count) -ge 1 ]] ; then + ln -s ${soname} ${libdir}/${libname}$(get_libname $(ver_cut 1)) || die + fi + + ln -s ${soname} ${libdir}/${libname}$(get_libname) || die + fi +} + +src_prepare() { + # workaround for gcc10 (bug #743442) + append-fflags $(test-flags-FC -fallow-argument-mismatch) + + sed -e "s;^\(CC\s*=\).*;\1$(tc-getCC);" \ + -e "s;^\(FC\s*=\).*;\1$(tc-getFC);" \ + -e "s;^\(FL\s*=\).*;\1$(tc-getFC);" \ + -e "s;^\(AR\s*=\).*;\1$(tc-getAR) cr ;" \ + -e "s;^\(RANLIB\s*=\).*;\1$(tc-getRANLIB);" \ + -e "s;^\(LIBBLAS\s*=\).*;\1$($(tc-getPKG_CONFIG) --libs blas);" \ + -e "s;^\(INCPAR\s*=\).*;\1;" \ + -e 's;^\(LIBPAR\s*=\).*;\1$(SCALAP);' \ + -e "s;^\(OPTF\s*=\).*;\1${FFLAGS} -DALLOW_NON_INIT \$(PIC);" \ + -e "s;^\(OPTC\s*=\).*;\1${CFLAGS} \$(PIC);" \ + -e "s;^\(OPTL\s*=\).*;\1${LDFLAGS};" \ + Make.inc/Makefile.inc.generic > Makefile.inc || die + # fixed a missing copy of libseq to libdir + + default +} + +src_configure() { + # We abuse LIBADD here to work around the fact that MUMPS is criminally + # underlinked. + LIBADD="$($(tc-getPKG_CONFIG) --libs blas) -Llib -lpord" + local ord="-Dpord" + + if use metis && use mpi; then + sed -i \ + -e "s;#\s*\(LMETIS\s*=\).*;\1$($(tc-getPKG_CONFIG) --libs parmetis);" \ + -e "s;#\s*\(IMETIS\s*=\).*;\1$($(tc-getPKG_CONFIG) --cflags parmetis);" \ + Makefile.inc || die + LIBADD="${LIBADD} $($(tc-getPKG_CONFIG) --libs parmetis)" + ord="${ord} -Dparmetis" + elif use metis; then + sed -i \ + -e "s;#\s*\(LMETIS\s*=\).*;\1$($(tc-getPKG_CONFIG) --libs metis);" \ + -e "s;#\s*\(IMETIS\s*=\).*;\1$($(tc-getPKG_CONFIG) --cflags metis);" \ + Makefile.inc || die + LIBADD="${LIBADD} $($(tc-getPKG_CONFIG) --libs metis)" + ord="${ord} -Dmetis" + fi + if use scotch && use mpi; then + sed -i \ + -e "s;#\s*\(LSCOTCH\s*=\).*;\1-lptesmumps -lptscotch -lptscotcherr;" \ + -e "s;#\s*\(ISCOTCH\s*=\).*;\1-I${ESYSROOT}/usr/include/scotch;" \ + Makefile.inc || die + LIBADD="${LIBADD} -lptesmumps -lptscotch -lptscotcherr" + ord="${ord} -Dptscotch" + elif use scotch; then + sed -i \ + -e "s;#\s*\(LSCOTCH\s*=\).*;\1-lesmumps -lscotch -lscotcherr;" \ + -e "s;#\s*\(ISCOTCH\s*=\).*;\1-I${ESYSROOT}/usr/include/scotch;" \ + Makefile.inc || die + LIBADD="${LIBADD} -lesmumps -lscotch -lscotcherr" + ord="${ord} -Dscotch" + fi + if use mpi; then + sed -i \ + -e "s;^\(CC\s*=\).*;\1mpicc;" \ + -e "s;^\(FC\s*=\).*;\1mpif90;" \ + -e "s;^\(FL\s*=\).*;\1mpif90;" \ + -e "s;^\(SCALAP\s*=\).*;\1$($(tc-getPKG_CONFIG) --libs scalapack);" \ + Makefile.inc || die + export LINK=mpif90 + LIBADD="${LIBADD} $($(tc-getPKG_CONFIG) --libs scalapack)" + else + sed -i \ + -e 's;-Llibseq;-L$(topdir)/libseq;' \ + -e 's;PAR);SEQ);g' \ + -e "s;^\(SCALAP\s*=\).*;\1;" \ + -e 's;^LIBSEQNEEDED =;LIBSEQNEEDED = libseqneeded;g' \ + Makefile.inc || die + LIBADD="${LIBADD} $($(tc-getPKG_CONFIG) --libs lapack)" + export LINK="$(tc-getFC)" + fi + sed -i -e "s;^\s*\(ORDERINGSF\s*=\).*;\1 ${ord};" Makefile.inc || die +} + +src_compile() { + # Workaround #462602 + export FAKEROOTKEY=1 + + emake alllib PIC="-fPIC" + if ! use mpi; then + #$(tc-getAR) crs lib/libmumps_common.a libseq/*.o || die + LIBADD+=" -Llibseq -lmpiseq" + static_to_shared libseq/libmpiseq.a + fi + + static_to_shared lib/libpord.a ${LIBADD} + static_to_shared lib/libmumps_common.a ${LIBADD} + + local i + for i in c d s z; do + static_to_shared lib/lib${i}mumps.a -Llib -lmumps_common ${LIBADD} + done + + if use static-libs; then + emake clean + emake alllib + fi +} + +src_test() { + emake all + + local dotest + if use mpi; then + dotest="mpirun -np 2" + else + export LD_LIBRARY_PATH="${S}/libseq:${LD_LIBRARY_PATH}" + fi + + cd examples + ${dotest} ./ssimpletest < input_simpletest_real || die + ${dotest} ./dsimpletest < input_simpletest_real || die + ${dotest} ./csimpletest < input_simpletest_cmplx || die + ${dotest} ./zsimpletest < input_simpletest_cmplx || die + einfo "The solutions should be close to (1,2,3,4,5)" + ${dotest} ./c_example || die + einfo "The solution should be close to (1,2)" + emake clean +} + +src_install() { + dolib.so lib/lib*$(get_libname)* + use static-libs && dolib.a lib/lib*.a + insinto /usr + + doins -r include + if ! use mpi; then + dolib.so libseq/lib*$(get_libname)* + insinto /usr/include/mpiseq + doins libseq/*.h + use static-libs && dolib.a libseq/libmpiseq.a + fi + + dodoc README ChangeLog VERSION + use doc && dodoc doc/*.pdf + if use examples; then + dodoc -r examples + fi +} |