summaryrefslogtreecommitdiff
path: root/sci-libs/cholmod/cholmod-5.3.4-r2.ebuild
blob: 9224e7114c320c3bddc8ea5a13bdda4b7656b79a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
# Copyright 1999-2026 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

Sparse_PV="7.12.2"
Sparse_P="SuiteSparse-${Sparse_PV}"
inherit cmake cuda toolchain-funcs

DESCRIPTION="Sparse Cholesky factorization and update/downdate library"
HOMEPAGE="https://people.engr.tamu.edu/davis/suitesparse.html"
SRC_URI="https://github.com/DrTimothyAldenDavis/SuiteSparse/archive/refs/tags/v${Sparse_PV}.tar.gz -> ${Sparse_P}.gh.tar.gz"
S="${WORKDIR}/${Sparse_P}/${PN^^}"

LICENSE="LGPL-2.1+ modify? ( GPL-2+ ) matrixops? ( GPL-2+ )"
SLOT="0/$(ver_cut 1)"
KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~loong ~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86"
IUSE="+cholesky cuda doc openmp +matrixops +modify +partition +supernodal test"
RESTRICT="!test? ( test )"

DEPEND="
	>=sci-libs/suitesparseconfig-${Sparse_PV}:=
	>=sci-libs/amd-3.3.4:=
	>=sci-libs/colamd-3.3.5:=
	cuda? (
		dev-util/nvidia-cuda-toolkit:=
		x11-drivers/nvidia-drivers
	)
	partition? (
		>=sci-libs/camd-3.3.5:=
		>=sci-libs/ccolamd-3.3.5:=
	)
	supernodal? (
		virtual/lapack
	)
"
RDEPEND="${DEPEND}"
BDEPEND="
	doc? ( virtual/latex-base )
"

REQUIRED_USE="
	supernodal? ( cholesky )
	modify? ( cholesky )
	test? ( cholesky matrixops supernodal )
"

PATCHES=( "${FILESDIR}"/${P}-{metis,gklib}-cmake4.patch ) # bug 957609

pkg_pretend() {
	[[ ${MERGE_TYPE} != binary ]] && use openmp && tc-check-openmp
}

pkg_setup() {
	[[ ${MERGE_TYPE} != binary ]] && use openmp && tc-check-openmp
}

src_prepare() {
	cmake_src_prepare

	if use cuda; then
		cuda_src_prepare
	fi
}

src_configure() {
	# Note that "N" prefixed options are negative options
	# so, they need to be turned OFF if you want that option.
	# Fortran is turned off as it is only used to compile (untested) demo programs.
	# Define SUITESPARSE_INCLUDEDIR_POSTFIX to "" otherwise it take
	# the value suitesparse, and the include directory would be set to
	# /usr/include/suitesparse
	# This need to be set in all suitesparse ebuilds.
	local mycmakeargs=(
		-DBUILD_STATIC_LIBS=OFF
		-DCHOLMOD_USE_CUDA=$(usex cuda)
		-DCHOLMOD_USE_OPENMP=$(usex openmp)
		-DSUITESPARSE_HAS_FORTRAN=OFF
		-DCHOLMOD_CHOLESKY=$(usex cholesky)
		-DCHOLMOD_MATRIXOPS=$(usex matrixops)
		-DCHOLMOD_MODIFY=$(usex modify)
		-DCHOLMOD_PARTITION=$(usex partition)
		-DCHOLMOD_SUPERNODAL=$(usex supernodal)
		-DSUITESPARSE_DEMOS=$(usex test)
		-DSUITESPARSE_INCLUDEDIR_POSTFIX=""
	)

	if has_version 'virtual/blas[index64]'; then
		mycmakeargs+=( -DSUITESPARSE_USE_64BIT_BLAS=ON )
	fi

	if has_version 'virtual/blas[flexiblas]'; then
		mycmakeargs+=( -DBLA_VENDOR=FlexiBLAS )
	else
		mycmakeargs+=( -DBLA_VENDOR=Generic )
	fi
	# TODO: Figure out how to make sci-libs/mkl work. Bug 974246

	if use cuda; then
		cuda_add_sandbox
		addpredict "/dev/char/"

		mycmakeargs+=(
			-DSUITESPARSE_CUDA_ARCHITECTURES="${CUDAARCHS:-all-major}"
		)
		local -x CUDAHOSTCXX="$(cuda_gccdir)"
		local -x CUDAHOSTLD="$(tc-getCXX)"
	fi

	cmake_src_configure
}

src_test() {
	# Because we are not using cmake_src_test,
	# we have to manually go to BUILD_DIR
	cd "${BUILD_DIR}" || die
	# Run demo files
	local type=(
		di
		dl
		si
		sl
	)
	local prog=(
		demo
		simple
	)
	local matrix_file=(
		bcsstk01.tri
		lp_afiro.tri
		can___24.mtx
		c.tri
		bcsstk02.tri
	)
	local i
	local j
	local k
	for i in ${type[@]}; do
		for k in ${prog[@]}; do
			for j in ${matrix_file[@]}; do
				./cholmod_${i}_${k}   < "${S}/Demo/Matrix/${j}" \
					|| die "failed testing cholmod_${i}_${k} with ${j}"
			done
		done
	done
	einfo "All tests passed"
}

src_install() {
	if use doc; then
		pushd "${S}/Doc" || die
		emake clean
		rm -rf *.pdf || die
		emake
		popd || die
		DOCS="${S}/Doc/*.pdf"
	fi
	cmake_src_install
}