blob: 6c1df9055aa486d57e10788b3115a16db2fc6208 (
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
|
# Copyright 1999-2015 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$
EAPI=4
FORTRAN_NEEDED=fortran
inherit autotools eutils flag-o-matic fortran-2 toolchain-funcs
DESCRIPTION="Fast C library for the Discrete Fourier Transform"
SRC_URI="http://www.fftw.org/${P}.tar.gz"
HOMEPAGE="http://www.fftw.org"
DEPEND="mpi? ( virtual/mpi )"
RDEPEND="${DEPEND}"
SLOT="2.1"
LICENSE="GPL-2+"
IUSE="doc float fortran mpi openmp threads static-libs"
KEYWORDS="alpha amd64 arm hppa ia64 ppc ppc64 s390 sparc x86 ~amd64-linux ~x86-linux ~ppc-macos ~x86-macos"
pkg_setup() {
use openmp && FORTRAN_NEED_OPENMP="1"
fortran-2_pkg_setup
# this one is reported to cause trouble on pentium4 m series
filter-mfpmath "sse"
# here I need (surprise) to increase optimization:
# --enable-i386-hacks requires -fomit-frame-pointer to work properly
if use x86; then
is-flag "-fomit-frame-pointer" || append-flags "-fomit-frame-pointer"
fi
if use openmp && [[ $(tc-getCC) == *gcc* ]] && ! tc-has-openmp; then
ewarn "You are using gcc and OpenMP is only available with gcc >= 4.2 "
ewarn "If you want to build fftw with OpenMP, abort now,"
ewarn "and switch CC to an OpenMP capable compiler"
ewarn "Otherwise the configure script will select POSIX threads."
fi
use openmp && [[ $(tc-getCC)$ == icc* ]] && append-ldflags $(no-as-needed)
}
src_prepare() {
# doc suggests installing single and double precision versions
# via separate compilations. will do in two separate source trees
# since some sed'ing is done during the build
# (?if --enable-type-prefix is set?)
epatch \
"${FILESDIR}"/${P}-as-needed.patch \
"${FILESDIR}"/${P}-configure.in.patch \
"${FILESDIR}"/${P}-no-test.patch \
"${FILESDIR}"/${P}-cc.patch \
"${FILESDIR}"/${P}-texinfo5.1.patch
# fix info files
for infofile in doc/fftw*info*; do
cat >> ${infofile} <<-EOF
INFO-DIR-SECTION Libraries
START-INFO-DIR-ENTRY
* fftw: (fftw). ${DESCRIPTION}
END-INFO-DIR-ENTRY
EOF
done
sed -i 's/AM_CONFIG_HEADER/AC_CONFIG_HEADERS/g' configure.in || die
eautoreconf
cd "${WORKDIR}"
cp -R ${P} ${P}-double
mv ${P} ${P}-single
ln -s ${P}-single ${P}
}
src_configure() {
local myconf="
--enable-shared
--enable-type-prefix
--enable-vec-recurse
$(use_enable fortran)
$(use_enable mpi)
$(use_enable static-libs static)
$(use_enable x86 i386-hacks)"
if use openmp; then
myconf="${myconf}
--enable-threads
--with-openmp"
elif use threads; then
myconf="${myconf}
--enable-threads
--without-openmp"
else
myconf="${myconf}
--disable-threads
--without-openmp"
fi
cd "${S}-single"
econf ${myconf} \
--enable-float \
--with-gcc=$(tc-getCC)
cd "${S}-double"
econf ${myconf} \
--with-gcc=$(tc-getCC)
}
src_compile() {
local dir
for dir in "${S}-single" "${S}-double"
do
einfo "Running compilation in ${dir}"
emake -C ${dir}
done
}
src_test() {
local dir
for dir in "${S}-single" "${S}-double"
do
einfo "Running tests in ${dir}"
emake -C ${dir} -j1 check
done
}
src_install () {
# both builds are installed in the same place
# libs are distinguished by prefix (s or d), see docs for details
local dir
for dir in "${S}-single" "${S}-double"
do
emake DESTDIR="${D}" -C ${dir} install
done
insinto /usr/include
doins fortran/fftw_f77.i
dodoc AUTHORS ChangeLog NEWS TODO README README.hacks
use doc && dohtml doc/*
if use float; then
for f in "${ED}"/usr/{include,$(get_libdir)}/*sfft*; do
ln -s $(basename ${f}) ${f/sfft/fft}
done
for f in "${ED}"/usr/{include,$(get_libdir)}/*srfft*; do
ln -s $(basename ${f}) ${f/srfft/rfft}
done
else
for f in "${ED}"/usr/{include,$(get_libdir)}/*dfft*; do
ln -s $(basename ${f}) ${f/dfft/fft}
done
for f in "${ED}"/usr/{include,$(get_libdir)}/*drfft*; do
ln -s $(basename ${f}) ${f/drfft/rfft}
done
fi
}
|