summaryrefslogtreecommitdiff
blob: faf13095e74bf2cbe56d2655294cda76a4948f8f (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
# Copyright 1999-2023 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

DOCS_BUILDER="doxygen"
DOCS_DEPEND="media-gfx/graphviz"
DOCS_DIR="doxydoc"
DOCS_CONFIG_NAME="doxygen.conf"
inherit docs toolchain-funcs

MY_PN=Clp

DESCRIPTION="COIN-OR linear programming solver"
HOMEPAGE="https://github.com/coin-or/Clp"
SRC_URI="https://github.com/coin-or/Clp/archive/releases/${PV}.tar.gz -> ${P}.tar.gz"
S="${WORKDIR}/${MY_PN}-releases-${PV}/${MY_PN}"

LICENSE="EPL-1.0"
SLOT="0/1" # major soname component
KEYWORDS="~amd64 ~loong ~riscv ~x86 ~amd64-linux ~x86-linux"
IUSE="examples glpk metis mpi mumps sparse static-libs test"
REQUIRED_USE="mpi? ( mumps )"
RESTRICT="!test? ( test )"

# Fortran is NOT needed, but the ./configure scripts for all of the CoinOR
# packages contain a check for it. Gentoo bug 601648 and upstream issue,
#
#   https://github.com/coin-or/CoinUtils/issues/132
#
BDEPEND="
	virtual/fortran
	virtual/pkgconfig
	test? ( sci-libs/coinor-sample )
"
DEPEND="
	sci-libs/coinor-osi:=
	sci-libs/coinor-utils:=
	glpk? ( sci-mathematics/glpk:= sci-libs/amd )
	metis? ( sci-libs/metis )
	mumps? ( sci-libs/mumps[mpi?] )
	sparse? ( sci-libs/cholmod )
"
RDEPEND="${DEPEND}"

src_prepare() {
	# Needed to make the --with-coin-instdir in src_configure happy.
	dodir /usr

	mumpslibs="-lmumps_common -ldmumps -lzmumps -lsmumps -lcmumps"

	if use mumps; then
		if use mpi; then
			# https://github.com/coin-or/Clp/issues/199
			eapply "${FILESDIR}/${P}-remove-extern-C-for-MPI.patch"
			export CXX=mpicxx
		else
			# The file ClpCholeskyMumps.cpp does #include "mpi.h", and we
			# need to point it to the right file. Our sci-libs/mumps ebuild
			# is so ridiculous that I can't even tell if this is our fault
			# or if it's something that should be reported upstream.
			ln -s "${EPREFIX}/usr/include/mpiseq/mpi.h" src/mpi.h || die
			mumpslibs="${mumpslibs} -lmpiseq"
		fi
	fi

	# They don't need to guess at this, but they do, and get it wrong...
	sed -e "s|lib/pkgconfig|$(get_libdir)/pkgconfig|g" \
		-i configure \
		|| die "failed to fix the pkgconfig path in ${S}/configure"

	default
}

src_configure() {
	# The --enable-aboca flag is temporarily disabled, because the build
	# is broken with it (see https://github.com/coin-or/Clp/issues/139).
	# There's a fix, but I'm not going to bother with a patch for an
	# an experimental feature.
	local myeconfargs=(
		--enable-dependency-linking
		--with-coin-instdir="${ED}"/usr
		$(use_with doc dot)
	)
	if use glpk; then
		myeconfargs+=(
			--with-amd-incdir="${EPREFIX}"/usr/include
			--with-amd-lib=-lamd
			--with-glpk-incdir="${EPREFIX}"/usr/include
			--with-glpk-lib=-lglpk
		)
	else
		myeconfargs+=( --without-glpk )
	fi
	if use sparse; then
		myeconfargs+=(
			--with-amd-incdir="${EPREFIX}"/usr/include
			--with-amd-lib=-lamd
			--with-cholmod-incdir="${EPREFIX}"/usr/include
			--with-cholmod-lib=-lcholmod
		)
	else
		myeconfargs+=( --without-amd --without-cholmod )
	fi
	if use metis; then
		myeconfargs+=(
			--with-metis-incdir="$($(tc-getPKG_CONFIG) --cflags metis | sed s/-I//)"
			--with-metis-lib="$($(tc-getPKG_CONFIG) --libs metis)"
		)
	else
		myeconfargs+=( --without-metis )
	fi
	if use mumps; then
		myeconfargs+=(
			--with-mumps-incdir="${EPREFIX}"/usr/include
			--with-mumps-lib="$mumpslibs"
		)
	else
		myeconfargs+=( --without-mumps )
	fi

	econf "${myeconfargs[@]}"
}

src_compile() {
	emake all
	docs_compile
}

src_test() {
	# NOT redundant! The build system has a "make check" target that does
	# nothing, so if you don't specify "test" here, you'll get a no-op.
	emake test
}

src_install() {
	emake DESTDIR="${ED}" install
	einstalldocs

	# Duplicate junk, and in the wrong location.
	rm -r "${ED}/usr/share/coin/doc/${MY_PN}" || die

	use examples && dodoc -r examples

	find "${ED}" -name '*.la' -delete || die
}