# Copyright 1999-2015 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 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 }