summaryrefslogtreecommitdiff
blob: 39afc59e85ee1246c4e86e01150ee2c24b8c3ffe (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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
# Copyright 1999-2023 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

inherit toolchain-funcs flag-o-matic multilib

SOVER=$(ver_cut 1)

DESCRIPTION="Software for graph, mesh and hypergraph partitioning"
HOMEPAGE="https://www.labri.u-bordeaux.fr/perso/pelegrin/scotch/ https://gitlab.inria.fr/scotch/scotch"
SRC_URI="https://gitlab.inria.fr/${PN}/${PN}/-/archive/v${PV}/${PN}-v${PV}.tar.gz"
S="${WORKDIR}/${PN}-v${PV}"

LICENSE="CeCILL-2"
SLOT="0/${SOVER}"
KEYWORDS="~alpha amd64 arm arm64 ~hppa ~ia64 ~loong ~ppc ppc64 ~riscv ~sparc ~x86 ~amd64-linux ~x86-linux"
IUSE="doc int64 mpi static-libs test tools +threads"
# bug #532620
REQUIRED_USE="test? ( threads )"
RESTRICT="!test? ( test )"

DEPEND="
	sys-libs/zlib
	mpi? ( virtual/mpi )"
RDEPEND="${DEPEND}"

static_to_shared() {
	local libstatic=${1}; shift
	local libname=$(basename ${libstatic%.a})
	local soname=${libname}$(get_libname ${SOVER})
	local libdir=$(dirname ${libstatic})

	einfo "Making ${soname} from ${libstatic}"
	if [[ ${CHOST} == *-darwin* ]] ; then
		${LINK:-$(tc-getCC)} ${LDFLAGS}  \
			-dynamiclib -install_name "${EPREFIX}"/usr/lib/"${soname}" \
			-Wl,-all_load -Wl,${libstatic} \
			"$@" -o ${libdir}/${soname} || die "${soname} failed"
	else
		${LINK:-$(tc-getCC)} ${LDFLAGS}  \
			-shared -Wl,-soname=${soname} \
			-Wl,--whole-archive ${libstatic} -Wl,--no-whole-archive \
			"$@" -o ${libdir}/${soname} || die "${soname} failed"
		VERS_COMP=${PV//.}
		[[ "${#VERS_COMP}" -gt 1 ]] && \
			ln -s ${soname} ${libdir}/${libname}$(get_libname ${SOVER})
		ln -s ${soname} ${libdir}/${libname}$(get_libname)
	fi
}

src_prepare() {
	default
	use int64 && append-cflags -DIDXSIZE64
	if use threads; then
		append-cflags "-DSCOTCH_PTHREAD_NUMBER=$(nproc)"
	else
		append-cflags "-DSCOTCH_PTHREAD_NUMBER=1"
		sed -i \
			-e 's/ -DSCOTCH_PTHREAD//' \
			src/Make.inc/Makefile.inc.i686_pc_linux3 || die
	fi

	# Be careful with replacing here, bug #577272
	sed -e "s/= gcc$/= $(tc-getCC)/" \
		-e "s/-O3/${CFLAGS} -pthread/" \
		-e "s/= ar$/= $(tc-getAR)/" \
		-e "s/= ranlib$/= $(tc-getRANLIB)/" \
		-e "s/= ranlib$/= $(tc-getRANLIB)/" \
		-e "/^LDFLAGS/ s/$/ ${LDFLAGS}/" \
		src/Make.inc/Makefile.inc.i686_pc_linux3 > src/Makefile.inc || die
}

src_compile() {
	emake -C src CLIBFLAGS=-fPIC scotch esmumps
	static_to_shared lib/libscotcherr.a
	static_to_shared lib/libscotcherrexit.a
	static_to_shared lib/libscotch.a -Llib -lz -lm -lrt -lpthread -lscotcherr
	static_to_shared lib/libesmumps.a -Llib -lscotch
	static_to_shared lib/libscotchmetisv3.a -Llib -lscotch
	static_to_shared lib/libscotchmetisv5.a -Llib -lscotch

	if use mpi; then
		emake -C src CLIBFLAGS=-fPIC ptscotch ptesmumps
		export LINK=mpicc
		static_to_shared lib/libptscotcherr.a
		static_to_shared lib/libptscotcherrexit.a
		static_to_shared lib/libptscotch.a -Llib -lscotch -lptscotcherr -lz -lm -lrt
		static_to_shared lib/libptesmumps.a -Llib -lscotch -lptscotch
	fi
	if use static-libs; then
		emake -C src clean
		emake -C src
		use mpi && emake -C src ptscotch
	fi
}

src_test() {
	tc-export FC
	LD_LIBRARY_PATH="${S}/lib" emake -C src check
}

src_install() {
	dolib.so lib/lib*$(get_libname)*
	use static-libs && dolib.a lib/*.a

	# Install metis headers into a subdir
	# to allow usage of real metis and scotch
	# in the same code
	insinto /usr/include/scotch/metis
	doins include/*metis*
	rm include/*metis* || die

	insinto /usr/include/scotch
	doins include/*

	cat <<-EOF > scotchmetis.pc
		prefix=${EPREFIX}/usr
		libdir=\${prefix}/$(get_libdir)
		includedir=\${prefix}/include
		Name: scotchmetis
		Description: ${DESCRIPTION}
		Version: ${PV}
		URL: ${HOMEPAGE}
		Libs: -L\${libdir} -lscotchmetis -lscotcherr -lscotch
		Private: -lm -lz -lrt
		Cflags: -I\${includedir}/scotch/metis
	EOF
	insinto /usr/$(get_libdir)/pkgconfig
	doins scotchmetis.pc

	# Not sure it is actually a full replacement of metis
	#alternatives_for metis scotch 0 \
	#	/usr/$(get_libdir)/pkgconfig/metis.pc scotchmetis.pc

	if use mpi; then
		cat <<-EOF > ptscotchparmetis.pc
			prefix=${EPREFIX}/usr
			libdir=\${prefix}/$(get_libdir)
			includedir=\${prefix}/include
			Name: ptscotchparmetis
			Description: ${DESCRIPTION}
			Version: ${PV}
			URL: ${HOMEPAGE}
			Libs: -L\${libdir} -lptscotchparmetis -lptscotcherr -lptscotch
			Private: -lm -lz -lrt
			Cflags: -I\${includedir}/scotch/metis
			Requires: scotchmetis
		EOF
			insinto /usr/$(get_libdir)/pkgconfig
			doins ptscotchparmetis.pc
			# Not sure it is actually a full replacement of parmetis
			#alternatives_for metis-mpi ptscotch 0 \
			#	/usr/$(get_libdir)/pkgconfig/metis-mpi.pc ptscotchparmetis.pc
	fi

	dodoc README.txt

	if use tools; then
		local b m
		pushd bin > /dev/null || die
		for b in *; do
			newbin ${b} scotch_${b}
		done
		popd > /dev/null || die

		pushd man/man1 > /dev/null || die
		for m in *.1; do
			newman ${m} scotch_${m}
		done
		popd > /dev/null || die
	fi

	use doc && dodoc doc/*.pdf
}