commit: ad3f8891f4d1d9fb3cbd5952ee028e638633cc8d Author: Michał Górny <mgorny <AT> gentoo <DOT> org> AuthorDate: Sun Sep 28 17:28:14 2025 +0000 Commit: Michał Górny <mgorny <AT> gentoo <DOT> org> CommitDate: Sun Sep 28 18:19:47 2025 +0000 URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=ad3f8891
sci-libs/flexiblas: Backport upstream patch adding xerbla_array_ Closes: https://bugs.gentoo.org/963033 Signed-off-by: Michał Górny <mgorny <AT> gentoo.org> .../files/flexiblas-3.4.82-xerbla-array.patch | 55 ++++++ sci-libs/flexiblas/flexiblas-3.4.82-r2.ebuild | 211 +++++++++++++++++++++ 2 files changed, 266 insertions(+) diff --git a/sci-libs/flexiblas/files/flexiblas-3.4.82-xerbla-array.patch b/sci-libs/flexiblas/files/flexiblas-3.4.82-xerbla-array.patch new file mode 100644 index 000000000000..4df5e904eb9a --- /dev/null +++ b/sci-libs/flexiblas/files/flexiblas-3.4.82-xerbla-array.patch @@ -0,0 +1,55 @@ +diff --git a/src/xerbla.c b/src/xerbla.c +index a12fc78e..209c0f23 100644 +--- a/src/xerbla.c ++++ b/src/xerbla.c +@@ -42,6 +42,7 @@ void flexiblas_internal_xerbla(char *SNAME, Int *Info, flexiblas_fortran_charlen + #ifdef __ELF__ + #pragma weak xerbla_ + #pragma weak xerbla ++#pragma weak XERBLA + void xerbla_(char *, Int *, flexiblas_fortran_charlen_t) __attribute__ (( alias ("flexiblas_internal_xerbla"))); + void xerbla(char *, Int *, flexiblas_fortran_charlen_t) __attribute__ (( alias ("flexiblas_internal_xerbla"))); + void XERBLA(char *, Int *, flexiblas_fortran_charlen_t) __attribute__ (( alias ("flexiblas_internal_xerbla"))); +@@ -130,6 +131,33 @@ void flexiblas_internal_xerbla(char *SNAME, Int *Info, flexiblas_fortran_charlen + return; + } + ++/* XERBLA_ARRAY handler */ ++ ++void xerbla_array_ (char *srname_array, Int *srname_len, Int *info, flexiblas_fortran_charlen_t srname_array_len) ++{ ++ size_t k = 0; ++ size_t len = 0; ++ if (*srname_len > 0 ) len = (int) *srname_len; ++ (void) srname_array_len; ++ char tmp[len+1]; ++ tmp[len] = '\0'; ++ ++ for(k = 0; k < len; k++) tmp[k] = srname_array[k]; ++ ++ flexiblas_internal_xerbla(tmp, info, len); ++ return; ++} ++ ++void xerbla_array(char *srname_array, Int *srname_len, Int *info, flexiblas_fortran_charlen_t srname_array_len) ++{ ++ xerbla_array_(srname_array, srname_len, info, srname_array_len); ++} ++ ++void XERBLA_ARRAY(char *srname_array, Int *srname_len, Int *info, flexiblas_fortran_charlen_t srname_array_len) ++{ ++ xerbla_array_(srname_array, srname_len, info, srname_array_len); ++} ++ + + + /* +@@ -155,7 +183,7 @@ void internal_cblas_xerbla(CBLAS_INT _info, const char *rout, const char *form, + va_list argptr; + + va_start(argptr, form); +- Int info = _info; ++ Int info = _info; + + if (RowMajorStrg) + { diff --git a/sci-libs/flexiblas/flexiblas-3.4.82-r2.ebuild b/sci-libs/flexiblas/flexiblas-3.4.82-r2.ebuild new file mode 100644 index 000000000000..ac2d6f8de2f2 --- /dev/null +++ b/sci-libs/flexiblas/flexiblas-3.4.82-r2.ebuild @@ -0,0 +1,211 @@ +# Copyright 2025 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +inherit cmake multilib toolchain-funcs + +MY_P=flexiblas-release-v${PV} +DESCRIPTION="A BLAS and LAPACK wrapper library with runtime exchangable backends" +HOMEPAGE=" + https://www.mpi-magdeburg.mpg.de/projects/flexiblas/ + https://gitlab.mpi-magdeburg.mpg.de/software/flexiblas-release/ +" +SRC_URI=" + https://gitlab.mpi-magdeburg.mpg.de/software/flexiblas-release/-/archive/v${PV}/${MY_P}.tar.bz2 +" +S=${WORKDIR}/${MY_P} + +# BSD for vendored cblas/lapacke +LICENSE="LGPL-3+ BSD" +SLOT="0" +KEYWORDS="~amd64 ~arm ~arm64 ~ppc ~ppc64 ~riscv ~x86" +IUSE="blis index64 mkl openblas openmp tbb test" +RESTRICT="!test? ( test )" + +# flexiblas only supports gnu-openmp using clang/gcc +DEPEND=" + sci-libs/lapack:=[deprecated,index64(-)?] + blis? ( sci-libs/blis:=[-64bit-index(-),index64(-)?] ) + mkl? ( + sci-libs/mkl:=[tbb?] + openmp? ( sci-libs/mkl[gnu-openmp] ) + ) + openblas? ( sci-libs/openblas:=[index64(-)?] ) +" +RDEPEND=" + ${DEPEND} +" + +pkg_pretend() { + if [[ ${MERGE_TYPE} != binary ]] && use openmp; then + tc-check-openmp + fi +} + +pkg_setup() { + if [[ ${MERGE_TYPE} != binary ]] && use openmp; then + tc-check-openmp + fi +} + +src_prepare() { + local PATCHES=( + # extracted from + # https://gitlab.mpi-magdeburg.mpg.de/software/flexiblas-release/-/commit/04021ceada30f136036a22dc6c811b3d352b199d + "${FILESDIR}/${P}-xerbla-array.patch" + ) + + cmake_src_prepare + + # remove bundled netlib blas/lapack + # (we still need vendored cblas/lapacke) + rm -r contributed/lapack-* || die +} + +src_configure() { + BACKENDS=( $(usev blis) $(usev openblas) ) + local extra=${BACKENDS[*]} + local libdir="${ESYSROOT}/usr/$(get_libdir)" + local mycmakeargs=( + -DTESTS=$(usex test) + -DCBLAS=ON + -DINTEGER8=OFF + -DLAPACK=ON + -DLINK_OPENMP=$(usex openmp) + -DEXAMPLES=OFF + # we need to enable autodetection for mkl + -DBLAS_AUTO_DETECT=ON + # ...so we need to explicitly disable autodetecting other libraries + # that would be pinned to their openmp/pthread/serial variants + -DOpenBLASSerial=OFF + -DOpenBLASPThread=OFF + -DOpenBLASOpenMP=OFF + -DOpenBLASSerial64=OFF + -DOpenBLASPThread64=OFF + -DOpenBLASOpenMP64=OFF + -DBlisSerial=OFF + -DBlisPThread=OFF + -DBlisOpenMP=OFF + -DBlisSerial64=OFF + -DBlisPThread64=OFF + -DBlisOpenMP64=OFF + # variants we use autodetection for + -DMklSerial=$(usex mkl ON OFF) + -DMklOpenMP=$(usex mkl "$(usex openmp ON OFF)" OFF) + -DMklTBB=$(usex mkl "$(usex tbb ON OFF)" OFF) + # unsupported + -DCMAKE_DISABLE_FIND_PACKAGE_nvpl=ON + -DATLAS=OFF + -DTATLAS=OFF + # and then enable our custom names via EXTRA + -DEXTRA="${extra// /;}" + # respect CFLAGS + -DLTO=OFF + # use system sci-libs/lapack + -DSYS_BLAS_LIBRARY="${libdir}/libblas.so" + -DSYS_LAPACK_LIBRARY="${libdir}/liblapack.so" + # these are used only with -DEXTRA + -Dblis_LIBRARY="${libdir}/libblis.so" + -Dopenblas_LIBRARY="${libdir}/libopenblas.so" + ) + + cmake_src_configure + + if use index64; then + mycmakeargs+=( + -DINTEGER8=ON + -DSYS_BLAS_LIBRARY="${libdir}/libblas64.so" + -DSYS_LAPACK_LIBRARY="${libdir}/liblapack64.so" + -Dblis_LIBRARY="${libdir}/libblis64.so" + -Dopenblas_LIBRARY="${libdir}/libopenblas64.so" + ) + + BUILD_DIR=${BUILD_DIR}-ilp64 cmake_src_configure + fi + + BACKENDS+=( netlib ) + BACKENDS_ILP64=( "${BACKENDS[@]}" ) + if use mkl; then + BACKENDS+=( + MklSerial + $(usev openmp MklOpenMP) + $(usev tbb MklTBB) + ) + BACKENDS_ILP64+=( + MklSerial64 + $(usev openmp MklOpenMP64) + $(usev tbb MklTBB64) + ) + fi +} + +src_compile() { + cmake_src_compile + use index64 && BUILD_DIR=${BUILD_DIR}-ilp64 cmake_src_compile +} + +my_test() { + # We run tests in parallel, so avoid having n^2 threads. + local -x BLIS_NUM_THREADS=1 + local -x MKL_NUM_THREADS=1 + local -x OMP_NUM_THREADS=1 + local -x OPENBLAS_NUM_THREADS=1 + + local failures=() + local backend + for backend in "${@}"; do + # TODO: remove this, and XFAIL them properly when cmake.eclass + # is fixed to respect nonfatal, https://bugs.gentoo.org/961929 + if [[ ${backend} == Mkl* ]]; then + einfo "Skipping ${backend} tests, XFAIL" + continue + fi + + local -x FLEXIBLAS_TEST=${backend} + local log=${BUILD_DIR}/Testing/Temporary/LastTest.log + einfo "Testing backend ${backend}" + if ! nonfatal cmake_src_test; then + failures+=( "${backend}" ) + fi + if grep -q 'BLAS backend .* not found' "${log}"; then + die "Backend ${backend} failed to load while testing, see ${log}" + fi + done + + if [[ ${failures[@]} ]]; then + die "Test runs failed for backends: ${failures[*]}" + fi +} + +src_test() { + my_test "${BACKENDS[@]}" + use index64 && BUILD_DIR=${BUILD_DIR}-ilp64 my_test "${BACKENDS_ILP64[@]}" +} + +verify_backends() { + local lib=${1} + shift + cd "${ED}/usr/$(get_libdir)/${lib}" || die + + local missing=() + local backend + for backend in "${@}"; do + if [[ ! -f libflexiblas_${backend,,}$(get_libname) ]]; then + missing+=( "${backend}" ) + fi + done + + if [[ ${missing[@]} ]]; then + die "Not all requested ${lib} backends built. Missing: ${missing[*]}" + fi +} + +src_install() { + cmake_src_install + use index64 && BUILD_DIR=${BUILD_DIR}-ilp64 cmake_src_install + + # verify built backends + verify_backends flexiblas "${BACKENDS[@]}" + use index64 && verify_backends flexiblas64 "${BACKENDS_ILP64[@]}" +}
