SUMMARY="A C++ template library for linear algebra, vectors and more"
DESCRIPTION="Eigen is a versatile, fast, elegant and reliable template library \
that supports all matrix sizes, from small fixed-size matrices to arbitrarily \
large dense matrices, and even sparse matrices.
- It supports all standard numeric types, including std::complex, integers, \
and is easily extensible to custom numeric types.
- It supports various matrix decompositions and geometry features.
- Its ecosystem of unsupported modules provides many specialized features \
such as non-linear optimization, matrix functions, a polynomial solver, FFT, \
and much more.
- Expression templates allow to intelligently remove temporaries and enable \
lazy evaluation, when that is appropriate.
- Explicit vectorization is performed for SSE 2/3/4, AVX, FMA, AVX512, \
ARM NEON (32-bit and 64-bit), PowerPC instruction sets, and now S390x SIMD \
(ZVector) with graceful fallback to non-vectorized code.
- Fixed-size matrices are fully optimized: dynamic memory allocation is \
avoided, and the loops are unrolled when that makes sense.
- For large matrices, special attention is paid to cache-friendliness.
- Algorithms are carefully selected for reliability. Reliability trade-offs \
are clearly documented and extremely safe decompositions are available.
- Eigen is thoroughly tested through its own test suite (over 500 executables) \
the standard BLAS test suite, and parts of the LAPACK test suite.
- The API is extremely clean and expressive while feeling natural to C++ \
programmers, thanks to expression templates.
- Implementing an algorithm on top of Eigen feels like just copying pseudocode."
HOMEPAGE="http://eigen.tuxfamily.org"
COPYRIGHT="2006-2011 Benoit Jacob
	2008-2012 Gael Guennebaud, et al."
LICENSE="MPL v2"
REVISION="4"
SOURCE_URI="http://gitlab.com/libeigen/eigen/-/archive/$portVersion/eigen-$portVersion.tar.gz"
CHECKSUM_SHA256="7985975b787340124786f092b3a07d594b2e9cd53bbfe5f3d9b1daee7d55f56f"
PATCHES="eigen-$portVersion.patchset"

ARCHITECTURES="all !x86_gcc2"
SECONDARY_ARCHITECTURES="x86"

PROVIDES="
	eigen$secondaryArchSuffix = $portVersion
	devel:eigen$secondaryArchSuffix = $portVersion
	"
REQUIRES="
	haiku$secondaryArchSuffix
	devel:libboost_system$secondaryArchSuffix
	devel:libcholmod$secondaryArchSuffix
	devel:libfftw3f$secondaryArchSuffix
	devel:libGL$secondaryArchSuffix
	devel:libgmp$secondaryArchSuffix
	devel:libmetis$secondaryArchSuffix
	devel:libmpfr$secondaryArchSuffix
	devel:libopenblas$secondaryArchSuffix
	devel:libumfpack$secondaryArchSuffix
	devel:libsuperlu$secondaryArchSuffix
	devel:libspqr$secondaryArchSuffix
	devel:libtbb$secondaryArchSuffix
	"

BUILD_REQUIRES="
	haiku${secondaryArchSuffix}_devel
	devel:libboost_system$secondaryArchSuffix >= 1.69.0
	devel:libcholmod$secondaryArchSuffix
	devel:libfftw3f$secondaryArchSuffix
	devel:libGL$secondaryArchSuffix
	devel:libgmp$secondaryArchSuffix
	devel:libmetis$secondaryArchSuffix
	devel:libmpfr$secondaryArchSuffix >= 6
	devel:libopenblas$secondaryArchSuffix
	devel:libumfpack$secondaryArchSuffix
	devel:libsuperlu$secondaryArchSuffix
	devel:libspqr$secondaryArchSuffix
	devel:libtbb$secondaryArchSuffix
	"
BUILD_PREREQUIRES="
	cmd:cmake
	cmd:gcc$secondaryArchSuffix
	cmd:gfortran$secondaryArchSuffix
	cmd:make
	cmd:pkg_config$secondaryArchSuffix
	"

BUILD()
{
	mkdir -p build
	cd build
	cmake .. \
		-DCMAKE_INSTALL_PREFIX=$prefix \
		-DINCLUDE_INSTALL_DIR=$relativeIncludeDir
	make $jobArgs
}

INSTALL()
{
	cd build
	make install PREFIX=$prefix

	mv $prefix/share/eigen3 $dataDir
	mkdir -p $developLibDir
	mv $prefix/share/pkgconfig $developLibDir
	rmdir $prefix/share

	fixPkgconfig
}

TEST()
{
	cd build
	make check -j 4
}
