aboutsummaryrefslogtreecommitdiff
blob: 668ae48048a30047dabb4ee48fd8c133c72f8889 (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
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
# Copyright 1999-2015 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

EAPI=5

inherit cmake-utils toolchain-funcs multilib toolchain-funcs

DESCRIPTION="Scientific library collection for large scale problems"
HOMEPAGE="http://trilinos.sandia.gov/"
SRC_URI="http://trilinos.org/oldsite/download/files/${P}-Source.tar.gz"

KEYWORDS="~amd64 ~x86 ~amd64-linux ~x86-linux"

LICENSE="BSD LGPL-2.1"
SLOT="0"

IUSE="
	adolc arprec boost clp cppunit cuda eigen glpk gtest hdf5 hwloc hypre
	matio metis mkl mumps netcdf petsc qd qt4 scalapack scotch sparse
	superlu taucs tbb test threads tvmet yaml zlib
"

# TODO: fix export cmake function for tests
RESTRICT="test"

RDEPEND="
	virtual/blas
	virtual/lapack
	virtual/mpi
	adolc? ( sci-libs/adolc )
	arprec? ( sci-libs/arprec )
	boost? ( dev-libs/boost )
	clp? ( sci-libs/coinor-clp )
	cuda? ( >=dev-util/nvidia-cuda-toolkit-3.2 )
	eigen? ( dev-cpp/eigen:3 )
	gtest? ( dev-cpp/gtest )
	hdf5? ( sci-libs/hdf5[mpi] )
	hypre? ( sci-libs/hypre )
	hwloc? ( sys-apps/hwloc )
	matio? ( sci-libs/matio )
	mkl? ( sci-libs/mkl )
	metis? ( || ( sci-libs/parmetis sci-libs/metis ) )
	mumps? ( sci-libs/mumps )
	netcdf? ( sci-libs/netcdf )
	petsc? ( sci-mathematics/petsc )
	qd? ( sci-libs/qd )
	qt4? ( dev-qt/qtgui:4 )
	scalapack? ( virtual/scalapack )
	scotch? ( sci-libs/scotch )
	sparse? ( sci-libs/cxsparse sci-libs/umfpack )
	superlu? ( sci-libs/superlu )
	taucs? ( sci-libs/taucs )
	tbb? ( dev-cpp/tbb )
	tvmet? ( dev-libs/tvmet )
	yaml? ( dev-cpp/yaml-cpp )
	zlib? ( sys-libs/zlib )"
DEPEND="${RDEPEND}
	virtual/pkgconfig"

S="${WORKDIR}/${P}-Source"

trilinos_conf() {
	local dirs libs d
	for d in $($(tc-getPKG_CONFIG) --libs-only-L $1); do
		dirs="${dirs};${d:2}"
	done
	[[ -n ${dirs} ]] && mycmakeargs+=( "-D${2}_LIBRARY_DIRS=${dirs:1}" )
	for d in $($(tc-getPKG_CONFIG) --libs-only-l $1); do
		libs="${libs};${d:2}"
	done
	[[ -n ${libs} ]] && mycmakeargs+=( "-D${2}_LIBRARY_NAMES=${libs:1}" )
	dirs=""
	for d in $($(tc-getPKG_CONFIG) --cflags-only-I $1); do
		dirs="${dirs};${d:2}"
	done
	[[ -n ${dirs} ]] && mycmakeargs+=( "-D${2}_INCLUDE_DIRS=${dirs:1}" )
}

trilinos_enable() {
	cmake-utils_use $1 TPL_ENABLE_${2:-${1^^}}
}

src_prepare() {
	epatch "${FILESDIR}"/${P}-fix-install-paths.patch
	epatch "${FILESDIR}"/${P}-fix_install_paths_for_destdir.patch
}

src_configure() {

	# temporarily disable SEACAS and pyTrilinos compilation
	local mycmakeargs=(
		-DBUILD_SHARED_LIBS=ON
		-DCMAKE_INSTALL_PREFIX="${EPREFIX}"
		-DTrilinos_ENABLE_ALL_PACKAGES=ON
		-DTrilinos_ENABLE_SEACAS=OFF
		-DTrilinos_ENABLE_PyTrilinos=OFF
		-DTrilinos_INSTALL_INCLUDE_DIR="${EPREFIX}/usr/include/trilinos"
		-DTrilinos_INSTALL_LIB_DIR="${EPREFIX}/usr/$(get_libdir)/trilinos"
		-DTrilinos_INSTALL_CONFIG_DIR="${EPREFIX}/usr/$(get_libdir)/cmake"
		-DTPL_ENABLE_BinUtils=ON
		-DTPL_ENABLE_MPI=ON
		-DTPL_ENABLE_BLAS=ON
		-DTPL_ENABLE_LAPACK=ON
		$(cmake-utils_use test Trilinos_ENABLE_TESTS)
		$(trilinos_enable adolc)
		$(trilinos_enable arprec)
		$(trilinos_enable boost Boost)
		$(trilinos_enable boost BoostLib)
		$(trilinos_enable cppunit Cppunit)
		$(trilinos_enable clp Clp)
		$(trilinos_enable cuda)
		$(trilinos_enable cuda CUSPARSE)
		$(trilinos_enable cuda Thrust)
		$(trilinos_enable eigen Eigen)
		$(trilinos_enable gtest gtest)
		$(trilinos_enable glpk)
		$(trilinos_enable hdf5)
		$(trilinos_enable hwloc)
		$(trilinos_enable hypre)
		$(trilinos_enable matio)
		$(trilinos_enable metis)
		$(trilinos_enable mkl)
		$(trilinos_enable mkl PARDISO_MKL)
		$(trilinos_enable mumps)
		$(trilinos_enable netcdf Netcdf)
		$(trilinos_enable petsc)
		$(trilinos_enable qd)
		$(trilinos_enable qt4 QT)
		$(trilinos_enable scalapack)
		$(trilinos_enable scalapack BLACS)
		$(trilinos_enable scotch Scotch)
		$(trilinos_enable sparse AMD)
		$(trilinos_enable sparse CSparse)
		$(trilinos_enable sparse UMFPACK)
		$(trilinos_enable superlu SuperLU)
		$(trilinos_enable taucs)
		$(trilinos_enable tbb)
		$(trilinos_enable threads Pthread)
		$(trilinos_enable tvmet)
		$(trilinos_enable yaml yaml-cpp)
		$(trilinos_enable zlib Zlib)
	)

	use eigen && \
		mycmakeargs+=(
		-DEigen_INCLUDE_DIRS="${EPREFIX}/usr/include/eigen3"
	)
	use hypre && \
		mycmakeargs+=(
		-DHYPRE_INCLUDE_DIRS="${EPREFIX}/usr/include/hypre"
	)
	use scotch && \
		mycmakeargs+=(
		-DScotch_INCLUDE_DIRS="${EPREFIX}/usr/include/scotch"
	)

	# cxsparse is a rewrite of csparse + extras
	use sparse && \
		mycmakeargs+=(
		-DCSparse_LIBRARY_NAMES="cxsparse"
	)

	# mandatory blas and lapack
	trilinos_conf blas BLAS
	trilinos_conf lapack LAPACK
	use superlu && trilinos_conf superlu SuperLU
	use metis && trilinos_conf metis METIS

	# blacs library is included in scalapack these days
	if use scalapack; then
		trilinos_conf scalapack SCALAPACK
		mycmakeargs+=(
			-DBLACS_LIBRARY_NAMES="scalapack"
			-DBLACS_INCLUDE_DIRS="${EPREFIX}/usr/include/blacs"
		)
	fi

	# TODO: do we need that line?
	export CC=mpicc CXX=mpicxx && tc-export CC CXX

	# cmake-utils eclass patches the base directory CMakeLists.txt
	# which does not work for complex Trilinos CMake modules
	CMAKE_BUILD_TYPE=RELEASE cmake-utils_src_configure

	# TODO:
	# python bindings with python-r1
	# fix hypre bindings
	# fix hdf5
	# cuda/thrust is untested
	# do we always need mpi? and for all packages: blah[mpi] ?
	# install docs, examples
	# see what packages are related, do we need REQUIRED_USE
	# proper use flags description
	# add more use flags/packages ?
}

src_install() {
	cmake-utils_src_install

	# register $(get_libdir)/trilinos in LDPATH so that the dynamic linker
	# has a chance to pick up the libraries...
	cat >> "${T}"/99trilinos <<- EOF
	LDPATH="${EPREFIX}/usr/$(get_libdir)/trilinos"
	EOF
	doenvd "${T}"/99trilinos
}