commit:     4ad7a246f67a212419ec1270a868223a9a656cb8
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Mon Jul 21 13:52:30 2025 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Mon Jul 21 15:06:34 2025 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=4ad7a246

sci-libs/mkl: Install a dummy libiomp5.so to fix mkl_rt

Install a dummy libiomp5.so to make MKL_THREADING_LAYER=INTEL work.
Use upstream documented values for MKL_THREADING_LAYER.

Signed-off-by: Michał Górny <mgorny <AT> gentoo.org>

 sci-libs/mkl/mkl-2025.2.0.628-r1.ebuild | 160 ++++++++++++++++++++++++++++++++
 1 file changed, 160 insertions(+)

diff --git a/sci-libs/mkl/mkl-2025.2.0.628-r1.ebuild 
b/sci-libs/mkl/mkl-2025.2.0.628-r1.ebuild
new file mode 100644
index 000000000000..7a2ac73606c2
--- /dev/null
+++ b/sci-libs/mkl/mkl-2025.2.0.628-r1.ebuild
@@ -0,0 +1,160 @@
+# Copyright 1999-2025 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+inherit unpacker
+
+PN_VER=$(ver_cut 1-2)
+MY_PV=$(ver_cut 1-3)-$(ver_cut 4)
+DESCRIPTION="Intel Math Kernel Library"
+HOMEPAGE="https://www.intel.com/content/www/us/en/developer/tools/oneapi/onemkl.html";
+# Upstream packages are a mess -- and most of them are literally empty.
+SRC_URI="
+       
https://apt.repos.intel.com/oneapi/pool/main/intel-oneapi-mkl-core-${PN_VER}-${MY_PV}_amd64.deb
+       
https://apt.repos.intel.com/oneapi/pool/main/intel-oneapi-mkl-core-devel-${PN_VER}-${MY_PV}_amd64.deb
+       
https://apt.repos.intel.com/oneapi/pool/main/intel-oneapi-mkl-classic-include-${PN_VER}-${MY_PV}_amd64.deb
+"
+S="${WORKDIR}"
+
+LICENSE="ISSL"
+SLOT="0"
+KEYWORDS="~amd64"
+IUSE="examples gnu-openmp llvm-openmp static-libs tbb"
+RESTRICT="strip"
+
+RDEPEND="
+       app-eselect/eselect-blas
+       app-eselect/eselect-lapack
+       gnu-openmp? ( sys-devel/gcc:*[openmp] )
+       llvm-openmp? ( llvm-runtimes/openmp )
+       tbb? ( dev-cpp/tbb )
+"
+# bug #801460
+BDEPEND="
+       app-arch/xz-utils[extra-filters(+)]
+       app-eselect/eselect-blas
+       app-eselect/eselect-lapack
+"
+
+QA_PREBUILT="*"
+QA_TEXTRELS="*"
+QA_SONAME="*"
+
+src_install() {
+       local libdir=$(get_libdir)
+       local libroot=opt/intel/oneapi/mkl/${PN_VER}/lib
+
+       if ! use static-libs; then
+               rm -v "${libroot}"/{*.a,pkgconfig/*-static-*.pc} || die
+       fi
+       if ! use examples; then
+               rm -rv 
"opt/intel/oneapi/mkl/${PN_VER}"/share/{mkl/benchmarks,doc/mkl/examples} || die
+       fi
+       if ! use gnu-openmp; then
+               rm -v "${libroot}"/{*_gnu_thread.*,pkgconfig/*-gomp.pc} || die
+       fi
+       if use llvm-openmp; then
+               # Replace Intel OpenMP with LLVM OpenMP.  We could just install
+               # "openmp.pc" for that, but we don't want random packages
+               # to start depending on it.
+               sed -e '/Requires: openmp/d' \
+                       -e '/Libs:/s:$: -lomp:' \
+                       -i "${libroot}"/pkgconfig/*iomp.pc || die
+               # Install a "libiomp5.so" symlink to make the magical lookup
+               # in mkl_rt.so happy too.
+               ln -s "../../../../../../usr/$(get_libdir)/libomp.so" \
+                       "${libroot}"/libiomp5.so || die
+       else
+               rm -v "${libroot}"/{*_intel_thread.*,pkgconfig/*-iomp.pc} || die
+       fi
+       if ! use tbb; then
+               rm -v "${libroot}"/{*_tbb_thread.*,pkgconfig/*-tbb.pc} || die
+       fi
+
+       # Symlink pkgconfig and cmake files
+       pushd "${libroot}/pkgconfig" >/dev/null || die
+       for file in *.pc; do
+               dosym "../../../${libroot}/pkgconfig/${file}" \
+                       "/usr/${libdir}/pkgconfig/${file}"
+       done
+       popd >/dev/null || die
+       pushd "${libroot}/cmake/mkl" >/dev/null || die
+       for file in *.cmake; do
+               dosym "../../../../${libroot}/cmake/mkl/${file}" \
+                       "/usr/${libdir}/cmake/mkl/${file}"
+       done
+       popd >/dev/null || die
+
+       # Move everything over to the image directory
+       mv "${S}/"* "${ED}" || die
+
+       # Create convenience symlink that does not include the version number
+       dosym "${PN_VER}" /opt/intel/oneapi/mkl/latest
+
+       local lib=../../../../${libroot}/libmkl_rt.so
+       dodir "/usr/${libdir}"/{blas,lapack}/mkl
+       dosym "${lib}" "/usr/${libdir}/blas/mkl/libblas.so"
+       dosym "${lib}" "/usr/${libdir}/blas/mkl/libblas.so.3"
+       dosym "${lib}" "/usr/${libdir}/blas/mkl/libcblas.so"
+       dosym "${lib}" "/usr/${libdir}/blas/mkl/libcblas.so.3"
+       dosym "${lib}" "/usr/${libdir}/lapack/mkl/liblapack.so"
+       dosym "${lib}" "/usr/${libdir}/lapack/mkl/liblapack.so.3"
+       dosym "${lib}" "/usr/${libdir}/lapack/mkl/liblapacke.so"
+       dosym "${lib}" "/usr/${libdir}/lapack/mkl/liblapacke.so.3"
+
+       # 
https://www.intel.com/content/www/us/en/docs/onemkl/developer-guide-linux/2025-1/dynamic-select-the-interface-and-threading-layer.html
+       local default_threading_layer
+       if use llvm-openmp; then
+               default_threading_layer=INTEL
+       elif use gnu-openmp; then
+               default_threading_layer=GNU
+       elif use tbb; then
+               default_threading_layer=TBB
+       else
+               default_threading_layer=SEQUENTIAL
+       fi
+
+       newenvd - "70intel-mkl" <<-_EOF_
+               MKLROOT="${EPREFIX}/opt/intel/oneapi/mkl/${PN_VER}"
+               PATH="${EPREFIX}/opt/intel/oneapi/mkl/${PN_VER}/bin"
+               # we need to duplicate it in ROOTPATH for Portage to respect...
+               ROOTPATH="${EPREFIX}/opt/intel/oneapi/mkl/${PN_VER}/bin"
+               LDPATH="${EPREFIX}/opt/intel/oneapi/mkl/${PN_VER}/lib"
+               # respect USE flags for defaults
+               MKL_THREADING_LAYER=${default_threading_layer}
+       _EOF_
+}
+
+pkg_postinst() {
+       local libdir=$(get_libdir) me="mkl"
+
+       # check blas
+       eselect blas add ${libdir} "${EROOT}"/usr/${libdir}/blas/${me} ${me}
+       local current_blas=$(eselect blas show ${libdir} | cut -d' ' -f2)
+       if [[ ${current_blas} == "${me}" || -z ${current_blas} ]]; then
+               eselect blas set ${libdir} ${me}
+               elog "Current eselect: BLAS/CBLAS ($libdir) -> 
[${current_blas}]."
+       else
+               elog "Current eselect: BLAS/CBLAS ($libdir) -> 
[${current_blas}]."
+               elog "To use blas [${me}] implementation, you have to issue (as 
root):"
+               elog "\t eselect blas set ${libdir} ${me}"
+       fi
+
+       # check lapack
+       eselect lapack add ${libdir} "${EROOT}"/usr/${libdir}/lapack/${me} ${me}
+       local current_lapack=$(eselect lapack show ${libdir} | cut -d' ' -f2)
+       if [[ ${current_lapack} == "${me}" || -z ${current_lapack} ]]; then
+               eselect lapack set ${libdir} ${me}
+               elog "Current eselect: LAPACK ($libdir) -> [${current_blas}]."
+       else
+               elog "Current eselect: LAPACK ($libdir) -> [${current_blas}]."
+               elog "To use lapack [${me}] implementation, you have to issue 
(as root):"
+               elog "\t eselect lapack set ${libdir} ${me}"
+       fi
+}
+
+pkg_postrm() {
+       eselect blas validate
+       eselect lapack validate
+}

Reply via email to