diff options
Diffstat (limited to 'dev-cpp/eigen/eigen-5.0.9999.ebuild')
| -rw-r--r-- | dev-cpp/eigen/eigen-5.0.9999.ebuild | 665 |
1 files changed, 665 insertions, 0 deletions
diff --git a/dev-cpp/eigen/eigen-5.0.9999.ebuild b/dev-cpp/eigen/eigen-5.0.9999.ebuild new file mode 100644 index 000000000000..2a62c78642c4 --- /dev/null +++ b/dev-cpp/eigen/eigen-5.0.9999.ebuild @@ -0,0 +1,665 @@ +# Copyright 1999-2026 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +LLVM_COMPAT=( {21..23} ) +LLVM_OPTIONAL="cuda-clang" + +PYTHON_COMPAT=( python3_{13..14} ) + +FORTRAN_NEEDED="no" + +LAPACK_ADDONS_PV="3.4.1" + +inherit cmake cuda flag-o-matic fortran-2 llvm-r2 python-any-r1 toolchain-funcs virtualx + +DESCRIPTION="C++ template library for linear algebra" +HOMEPAGE="https://eigen.tuxfamily.org/index.php?title=Main_Page" + +if [[ ${PV} = *9999* ]] ; then + inherit git-r3 + EGIT_REPO_URI="https://gitlab.com/lib${PN}/${PN}.git" + if [[ ${PV} = *.9999* ]] ; then + EGIT_BRANCH="$(ver_cut 1-2)" + fi +else + SRC_URI=" + https://gitlab.com/lib${PN}/${PN}/-/archive/${PV}/${P}.tar.bz2 + " + KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~loong ~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86 ~arm64-macos ~x64-macos" +fi + +SRC_URI+=" + test? ( + lapack? ( + https://downloads.tuxfamily.org/${PN}/lapack_addons_${LAPACK_ADDONS_PV}.tgz + -> ${PN}-lapack_addons-${LAPACK_ADDONS_PV}.tgz + ) + ) +" + +LICENSE="MPL-2.0" +SLOT="3/$(ver_cut 1-2)" + +# The following lines are shamelessly stolen from ffmpeg-9999.ebuild with modifications +ARM_CPU_FEATURES=( + neon:NEON +) +PPC_CPU_FEATURES=( + altivec:ALTIVEC + vsx:VSX +) +X86_CPU_FEATURES=( + avx:AVX + avx2:AVX2 + avx512f:AVX512 + avx512dq:AVX512DQ + f16c:FP16C + fma3:FMA + popcnt:POPCNT + sse:SSE + sse2:SSE2 + sse3:SSE3 + ssse3:SSSE3 + sse4_1:SSE4_1 + sse4_2:SSE4_2 +) +# MIPS_CPU_FEATURES=( +# msa:MSA +# ) +# S390_CPU_FEATURES=( +# z13:Z13 +# z14:Z14 +# ) + +CPU_FEATURES_MAP=( + "${ARM_CPU_FEATURES[@]/#/cpu_flags_arm_}" + "${PPC_CPU_FEATURES[@]/#/cpu_flags_ppc_}" + "${X86_CPU_FEATURES[@]/#/cpu_flags_x86_}" + # "${MIPS_CPU_FEATURES[@]/#/cpu_flags_mips_}" + # "${S390_CPU_FEATURES[@]/#/cpu_flags_s390_}" +) + +IUSE_TEST_BACKENDS=( + "adolc" + "boost" + "cholmod" + "fftw" + "klu" + "metis" + "opengl" + "pastix" + "pocketfft" + "sparsehash" + "spqr" + "superlu" + "umfpack" +) + +IUSE=" + debug + blas lapack + ${CPU_FEATURES_MAP[*]%:*} + cuda cuda-clang hip + doc mathjax + openmp + test ${IUSE_TEST_BACKENDS[*]} +" +# zvector + +REQUIRED_USE=" + lapack? ( + blas + ) + test? ( + || ( ${IUSE_TEST_BACKENDS[*]} ) + cuda-clang? ( + !openmp + ${LLVM_REQUIRED_USE} + ) + ) +" + +# Tests failing again because of compiler issues; bugs #932646, #943401 +RESTRICT="!test? ( test )" +FORTRAN_DEPEND="virtual/fortran" + +BDEPEND=" + doc? ( + app-text/doxygen[dot] + dev-texlive/texlive-bibtexextra + dev-texlive/texlive-fontsextra + dev-texlive/texlive-fontutils + dev-texlive/texlive-latex + dev-texlive/texlive-latexextra + mathjax? ( dev-libs/mathjax ) + ) + test? ( + virtual/pkgconfig + lapack? ( + ${PYTHON_DEPS} + ) + spqr? ( + cholmod? ( + blas? ( + lapack? ( + ${FORTRAN_DEPEND} + ) + ) + ) + ) + pastix? ( ${FORTRAN_DEPEND} ) + ) + blas? ( ${FORTRAN_DEPEND} ) + lapack? ( ${FORTRAN_DEPEND} ) +" + +TEST_BACKENDS=" + adolc? ( sci-libs/adolc[sparse] ) + boost? ( dev-libs/boost ) + cholmod? ( sci-libs/cholmod:=[cuda?] ) + fftw? ( sci-libs/fftw[openmp?] ) + klu? ( sci-libs/klu:= ) + metis? ( + sci-libs/metis[openmp?] + sci-libs/pastix[metis] + ) + opengl? ( + media-libs/freeglut + media-libs/glew + media-libs/libglvnd + ) + pastix? ( + sci-libs/pastix[-mpi] + || ( + sci-libs/pastix[scotch] + sci-libs/pastix[metis] + ) + ) + pocketfft? ( dev-libs/pocketfft ) + sparsehash? ( + amd64? ( dev-cpp/sparsehash ) + arm64? ( dev-cpp/sparsehash ) + ppc64? ( dev-cpp/sparsehash ) + x86? ( dev-cpp/sparsehash ) + ) + spqr? ( sci-libs/spqr:= ) + superlu? ( sci-libs/superlu:= ) + umfpack? ( sci-libs/umfpack:= ) +" + +DEPEND=" + test? ( + cuda? ( + !cuda-clang? ( + dev-util/nvidia-cuda-toolkit + ) + cuda-clang? ( + $(llvm_gen_dep ' + llvm-core/clang:${LLVM_SLOT} + llvm-runtimes/clang-runtime:${LLVM_SLOT}[llvm_targets_NVPTX,offload,openmp] + ') + ) + ) + hip? ( dev-util/hip ) + !blas? ( + virtual/blas + !lapack? ( + virtual/lapacke + ) + ) + ${TEST_BACKENDS} + ) +" + +PATCHES=( + "${FILESDIR}/${PN}-3.4.0-doc-nocompress.patch" # bug 830064 + "${FILESDIR}/${PN}-3.4.0-buildstring.patch" + "${FILESDIR}/${PN}-5.0.0-please_protect_your_min_with_parentheses.patch" + + # PRs + "${FILESDIR}/${PN}-5.0.0-doxygen-1.14.patch" + + "${FILESDIR}/${PN}-5.0.1-c++-20.patch" + "${FILESDIR}/${PN}-5.0.1-cmake-GNUInstallDirs.patch" + "${FILESDIR}/${PN}-5.0.1-make-static-libs-optional.patch" + + "${FILESDIR}/${PN}-5.0.1-Do-not-show-deprecated-CUDA-device-properties-for-CU.patch" +) + +# TODO should be in cuda.eclass +cuda_get_host_compiler() { + if [[ -n "${NVCC_CCBIN}" ]]; then + echo "${NVCC_CCBIN}" + return + fi + + if [[ -n "${CUDAHOSTCXX}" ]]; then + echo "${CUDAHOSTCXX}" + return + fi + + einfo "Trying to find working CUDA host compiler" + + if ! tc-is-gcc && ! tc-is-clang; then + die "$(tc-get-compiler-type) compiler is not supported" + fi + + local compiler compiler_type compiler_version + local package package_version + local -x NVCC_CCBIN + local NVCC_CCBIN_default + + compiler_type="$(tc-get-compiler-type)" + compiler_version="$("${compiler_type}-major-version")" + + # try the default compiler first + NVCC_CCBIN="$(tc-getCXX)" + NVCC_CCBIN_default="${NVCC_CCBIN}-${compiler_version}" + + compiler="${NVCC_CCBIN/%-${compiler_version}}" + + # store the package so we can re-use it later + package="sys-devel/${compiler_type}" + package_version="${package}" + + ebegin "testing ${NVCC_CCBIN_default} (default)" + + while ! nvcc -v -ccbin "${NVCC_CCBIN}" - -x cu <<<"int main(){}" &>> "${T}/cuda_get_host_compiler.log" ; do + eend 1 + + while true; do + # prepare next version + if ! package_version="<$(best_version "${package_version}")"; then + die "could not find a supported version of ${compiler}" + fi + + NVCC_CCBIN="${compiler}-$(ver_cut 1 "${package_version/#<${package}-/}")" + + [[ "${NVCC_CCBIN}" != "${NVCC_CCBIN_default}" ]] && break + done + ebegin "testing ${NVCC_CCBIN}" + done + eend $? + + echo "${NVCC_CCBIN}" + export NVCC_CCBIN +} + +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 + + if use lapack; then + python-any-r1_pkg_setup + fi + + if { use test && { use spqr && use cholmod && use blas && use lapack; } || use pastix; } \ + || use blas \ + || use lapack \ + ; then + fortran-2_pkg_setup + fi + + if use test && use cuda && use cuda-clang; then + llvm-r2_pkg_setup + fi +} + +src_unpack() { + if [[ ${PV} = *9999* ]] ; then + git-r3_src_unpack + else + unpack "${P}.tar.bz2" + fi + + if use test && use lapack; then + pushd "${S}/lapack" > /dev/null || die + unpack "${PN}-lapack_addons-${LAPACK_ADDONS_PV}.tgz" + popd > /dev/null || die + fi +} + +src_prepare() { + # run patches here as we patch in test/ + cmake_src_prepare + + if use test && use lapack; then + pushd "${S}" > /dev/null || die + eapply "${FILESDIR}/${PN}-5.0.1-fix-lapack_testing.py.patch" + popd > /dev/null || die + fi +} + +src_configure() { + if use lapack; then + # bug 878987 + # multiple definition of `cgesdd_' + filter-lto + fi + + local mycmakeargs=( + -DCMAKE_CXX_STANDARD="20" + -DCMAKE_POSITION_INDEPENDENT_CODE="yes" + + -DEIGEN_BUILD_TESTING="$(usex test)" # Enable creation of Eigen tests. + + -DEIGEN_BUILD_BLAS="$(usex blas)" # Toggles the building of the Eigen Blas library + -DEIGEN_BUILD_LAPACK="$(usex blas "$(usex lapack)")" # Toggles the building of the included Eigen LAPACK library + + -DEIGEN_BUILD_DOC="$(usex doc)" # Enable creation of Eigen documentation + -DEIGEN_BUILD_PKGCONFIG="yes" # Build pkg-config .pc file for Eigen + ) + + append-cxxflags "-DEIGEN_USE_OPENBLAS_BFLOAT16=0" + + if use blas; then + mycmakeargs+=( + -DBUILD_SHARED_LIBS="yes" + -DEIGEN_BUILD_SHARED_LIBS="yes" + -DEIGEN_BUILD_STATIC_LIBS="yes" + -DEIGEN_INSTALL_STATIC_LIBS="yes" + ) + + if use lapack; then + mycmakeargs+=( + -DCMAKE_POLICY_DEFAULT_CMP0148="OLD" # FindPythonInterp + -DEIGEN_ENABLE_LAPACK_TESTS="$(usex test)" + ) + fi + fi + + if use doc || use test; then + mycmakeargs+=( + # needs Qt4 + -DEIGEN_TEST_NOQT="yes" # Disable Qt support in unit tests + ) + fi + + if use doc; then + mycmakeargs+=( + -DEIGEN_DOC_USE_MATHJAX="$(usex mathjax)" # Use MathJax for rendering math in HTML docs + -DEIGEN_INTERNAL_DOCUMENTATION=no # Build internal documentation + ) + fi + + if use test; then + mycmakeargs+=( + -DEIGEN_LEAVE_TEST_IN_ALL_TARGET=yes # Leaves tests in the all target, needed by ctest for automatic building + + # the OpenGL testsuite is extremely brittle, bug #712808 + -DEIGEN_TEST_OPENGL="$(usex opengl)" # Enable OpenGL support in unit tests + -DEIGEN_TEST_OPENMP="$(usex openmp)" # Enable/Disable OpenMP in tests/examples + + -DEIGEN_TEST_EXTERNAL_BLAS="$(usex !blas)" # Use external BLAS library for testsuite + + -DEIGEN_TEST_BUILD_DOCUMENTATION="no" # $(usex doc)" # Test building the doxygen documentation + + -DEIGEN_DEBUG_ASSERTS="$(usex debug)" # Enable advanced debugging of assertions + -DEIGEN_SPLIT_LARGE_TESTS="yes" # Split large tests into smaller executables + + -DEIGEN_TEST_CUDA="$(usex cuda)" # Enable CUDA support in unit tests + -DEIGEN_TEST_CUDA_CLANG="$(usex cuda "$(usex cuda-clang)")" # Use clang instead of nvcc to compile the CUDA tests + + -DEIGEN_TEST_HIP="$(usex hip)" # Add HIP support. + + # -DEIGEN_TEST_SYCL="$(usex sycl)" # Add Sycl support. + # -DEIGEN_SYCL_TRISYCL="no" # Use the triSYCL Sycl implementation (ComputeCPP by default). + + $(cmake_use_find_package adolc Adolc) + $(cmake_use_find_package boost Boost) + $(cmake_use_find_package cholmod CHOLMOD) + # -DDUCCFFT="$(usex ducc)" + -DDUCC_ROOT="DUCCFFT" + -DDUCCFFT="NOTFOUND" + $(cmake_use_find_package fftw FFTW ) + $(cmake_use_find_package klu KLU) + -DCMAKE_DISABLE_FIND_PACKAGE_MPREAL=yes + # $(cmake_use_find_package opengl OpenGL) # EIGEN_TEST_OPENGL + # $(cmake_use_find_package openmp OpenMP) # EIGEN_TEST_OPENMP + $(cmake_use_find_package pastix PASTIX) + # prevent pastix_nompi.h lookup it no longer exists, we enforce this via deps + -DPASTIX_pastix_nompi.h_INCLUDE_DIRS="FOUND" + + -DPOCKETFFT="$(usex pocketfft)" + $(cmake_use_find_package sparsehash GoogleHash) + $(cmake_use_find_package spqr SPQR) + $(cmake_use_find_package superlu SuperLU) + $(cmake_use_find_package umfpack UMFPACK) + ) + + if use arm; then + mycmakeargs+=( + -DEIGEN_TEST_NEON="$(usex cpu_flags_arm_neon)" + ) + fi + + if use arm64; then + mycmakeargs+=( + -DEIGEN_TEST_NEON64="$(usex cpu_flags_arm_neon)" + ) + fi + + if use amd64 || use x86; then + mycmakeargs+=( + # -DEIGEN_TEST_32BIT=no # Force generating 32bit code. + # -DEIGEN_TEST_X87=no # Force using X87 instructions. Implies no vectorization. + -DEIGEN_TEST_SSE2="$(usex cpu_flags_x86_sse2)" + -DEIGEN_TEST_SSE3="$(usex cpu_flags_x86_sse3)" + -DEIGEN_TEST_SSSE3="$(usex cpu_flags_x86_ssse3)" + -DEIGEN_TEST_FMA="$(usex cpu_flags_x86_fma3)" + -DEIGEN_TEST_SSE4_1="$(usex cpu_flags_x86_sse4_1)" + -DEIGEN_TEST_SSE4_2="$(usex cpu_flags_x86_sse4_2)" + -DEIGEN_TEST_AVX="$(usex cpu_flags_x86_avx)" + -DEIGEN_TEST_F16C="$(usex cpu_flags_x86_f16c)" + -DEIGEN_TEST_AVX2="$(usex cpu_flags_x86_avx2)" + -DEIGEN_TEST_AVX512="$(usex cpu_flags_x86_avx512f)" + -DEIGEN_TEST_AVX512DQ="$(usex cpu_flags_x86_avx512dq)" + ) + fi + + if use mips; then + mycmakeargs+=( + # -DEIGEN_TEST_MSA=no # Enable/Disable MSA in tests/examples + ) + fi + + if use ppc || use ppc64; then + mycmakeargs+=( + -DEIGEN_TEST_ALTIVEC="$(usex cpu_flags_ppc_altivec)" + -DEIGEN_TEST_VSX="$(usex cpu_flags_ppc_vsx)" + ) + fi + + if use s390; then + mycmakeargs+=( + # -DEIGEN_TEST_Z13=no # Enable/Disable S390X(zEC13) ZVECTOR in tests/examples + # -DEIGEN_TEST_Z14=no # Enable/Disable S390X(zEC14) ZVECTOR in tests/examples + ) + fi + + if use cuda; then + cuda_add_sandbox -w + + if use cuda-clang; then + local llvm_prefix + llvm_prefix="$(get_llvm_prefix -b)" + + # NVCCFLAGS gets injected into CMAKE_CXX_FLAGS, which means we need to use clang as gcc will fail with + # error: unrecognized command-line option + if ! tc-is-clang; then + export CC="${CHOST}-clang-${LLVM_SLOT}" + export CXX="${CHOST}-clang++-${LLVM_SLOT}" + fi + + NVCCFLAGS="${NVCCFLAGS:+${NVCCFLAGS} }--libomptarget-nvptx-bc-path=${llvm_prefix}/$(get_libdir)/nvptx64-nvidia-cuda/libomptarget-nvptx.bc" + + mycmakeargs+=( + -DCUDA_HOST_COMPILER="${CHOST}-clang++-${LLVM_SLOT}" + ) + else + cuda_get_host_compiler + + mycmakeargs+=( + -DCUDA_HOST_COMPILER="${CUDAHOSTCXX}" + ) + if [[ -v CUDACXX ]]; then + mycmakeargs+=( + -DCUDA_NVCC_EXECUTABLE="${CUDACXX}" + -DCMAKE_POLICY_DEFAULT_CMP0146="OLD" # FindCUDA + ) + fi + fi + + if [[ "${CUDA_VERBOSE}" == true ]]; then + mycmakeargs+=( + -DCUDA_VERBOSE_BUILD="yes" + ) + NVCCFLAGS+=" -v" + fi + + if [[ -v CUDAARCHS ]]; then + mycmakeargs+=( + # TODO this needs to be lowest first for eigen + -DEIGEN_CUDA_COMPUTE_ARCH="${CUDAARCHS}" + ) + fi + + # CUDAFLAGS is used by cmake + # NVCCFLAGS is used by cuda.eclass + mycmakeargs+=( + -DEIGEN_CUDA_CXX_FLAGS="${NVCCFLAGS}" + + -DCUDA_USE_STATIC_CUDA_RUNTIME="no" + ) + fi + + if use opengl; then + mycmakeargs+=( + -DOpenGL_GL_PREFERENCE="GLVND" + ) + fi + + if use pocketfft; then + mycmakeargs+=( + -DEIGEN_TEST_CXX11=yes + ) + fi + fi + + cmake_src_configure +} + +src_compile() { + local targets=() + + if use blas; then + targets+=( blas ) + if use lapack; then + targets+=( lapack ) + fi + fi + + if use test; then + targets+=( buildtests ) + + if use cuda || use hip; then + targets+=( buildtests_gpu ) + fi + + # tests generate random data, which fails for some seeds + # we solve this via test reruns now + # export EIGEN_SEED=712808 + fi + + # we add doc last to capture results for buildtests + if use doc; then + targets+=( doc ) + fi + + if [[ -n "${targets[*]}" ]]; then + cmake_src_compile "${targets[@]}" + fi +} + +src_test() { + local CMAKE_SKIP_TESTS=( + "^ref_8$" + ) + + if ! use blas; then + CMAKE_SKIP_TESTS+=( + "^nomalloc_1$" # smoketest + "^nomalloc_2$" + "^nomalloc_3$" + "^nomalloc_4$" + + "^product_notemporary_1$" + "^product_notemporary_2$" + "^product_notemporary_3$" + "^product_notemporary_4$" + ) + fi + + if use cholmod && use blas && use lapack; then + CMAKE_SKIP_TESTS+=( + "^cholmod_support_21$" + "^cholmod_support_22$" + ) + fi + + if use cuda; then + cuda_add_sandbox -w + fi + + if use klu && use blas; then + CMAKE_SKIP_TESTS+=( + "^klu_support_1$" + "^klu_support_2$" + ) + fi + + if use lapack; then + CMAKE_SKIP_TESTS+=( + "^LAPACK-xlintsts_stest_in$" + "^LAPACK-xeigtsts_sep_in$" + "^LAPACK-xeigtsts_svd_in$" + "^LAPACK-xlintstd_dtest_in$" + "^LAPACK-xeigtstd_sep_in$" + "^LAPACK-xeigtstd_svd_in$" + "^LAPACK-xlintstc_ctest_in$" + "^LAPACK-xeigtstc_svd_in$" + ) + fi + + local myctestargs=( + -j1 # otherwise breaks due to cmake reruns + --repeat until-pass:50 + ) + + if use opengl; then + virtx \ + cmake_src_test + else + cmake_src_test + fi +} + +src_install() { + local DOCS=() + cmake_src_install + + if use doc; then + pushd "${BUILD_DIR}/doc" > /dev/null || die + dodoc -r html + popd > /dev/null || die + fi +} |
