diff options
Diffstat (limited to 'var/spack/repos/builtin/packages/fftw/package.py')
-rw-r--r-- | var/spack/repos/builtin/packages/fftw/package.py | 122 |
1 files changed, 91 insertions, 31 deletions
diff --git a/var/spack/repos/builtin/packages/fftw/package.py b/var/spack/repos/builtin/packages/fftw/package.py index 838f6ff744..e2fc311166 100644 --- a/var/spack/repos/builtin/packages/fftw/package.py +++ b/var/spack/repos/builtin/packages/fftw/package.py @@ -1,13 +1,13 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. # Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved. # LLNL-CODE-647188 # -# For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# For details, see https://github.com/spack/spack +# Please also see the NOTICE and LICENSE files for our notice and the LGPL. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License (as @@ -25,7 +25,7 @@ from spack import * -class Fftw(Package): +class Fftw(AutotoolsPackage): """FFTW is a C subroutine library for computing the discrete Fourier transform (DFT) in one or more dimensions, of arbitrary input size, and of both real and complex data (as well as of even/odd @@ -35,17 +35,24 @@ class Fftw(Package): homepage = "http://www.fftw.org" url = "http://www.fftw.org/fftw-3.3.4.tar.gz" + list_url = "http://www.fftw.org/download.html" + version('3.3.6-pl2', '927e481edbb32575397eb3d62535a856') version('3.3.5', '6cc08a3b9c7ee06fdd5b9eb02e06f569') version('3.3.4', '2edab8c06b24feeb3b82bbb3ebf3e7b3') + version('2.1.5', '8d16a84f3ca02a785ef9eb36249ba433') - patch('pfft-3.3.5.patch', when="@3.3.5+pfft_patches", level=0) + patch('pfft-3.3.5.patch', when="@3.3.5:+pfft_patches", level=0) patch('pfft-3.3.4.patch', when="@3.3.4+pfft_patches", level=0) + patch('pgi-3.3.6-pl2.patch', when="@3.3.6-pl2%pgi", level=0) variant( 'float', default=True, description='Produces a single precision version of the library') variant( + 'double', default=True, + description='Produces a double precision version of the library') + variant( 'long_double', default=True, description='Produces a long double precision version of the library') variant( @@ -61,18 +68,31 @@ class Fftw(Package): depends_on('mpi', when='+mpi') depends_on('automake', type='build', when='+pfft_patches') depends_on('autoconf', type='build', when='+pfft_patches') + depends_on('libtool', type='build', when='+pfft_patches') - # TODO : add support for architecture specific optimizations as soon as - # targets are supported + @property + def libs(self): + result = find_libraries(['libfftw3'], root=self.prefix, recurse=True) + return result - def install(self, spec, prefix): + def autoreconf(self, spec, prefix): + if '+pfft_patches' in spec: + autoreconf = which('autoreconf') + autoreconf('-ifv') + + def configure(self, spec, prefix): + # Base options options = [ '--prefix={0}'.format(prefix), '--enable-shared', '--enable-threads' ] + if not self.compiler.f77 or not self.compiler.fc: + options.append("--disable-fortran") + if spec.satisfies('@:2'): + options.append('--enable-type-prefix') - # Add support for OpenMP + # Variants that affect every precision if '+openmp' in spec: # Note: Apple's Clang does not support OpenMP. if spec.satisfies('%clang'): @@ -80,36 +100,76 @@ class Fftw(Package): if ver.endswith('-apple'): raise InstallError("Apple's clang does not support OpenMP") options.append('--enable-openmp') - if not self.compiler.f77 or not self.compiler.fc: - options.append("--disable-fortran") + if spec.satisfies('@:2'): + # TODO: libtool strips CFLAGS, so 2.x libxfftw_threads + # isn't linked to the openmp library. Patch Makefile? + options.insert(0, 'CFLAGS=' + self.compiler.openmp_flag) if '+mpi' in spec: options.append('--enable-mpi') - if '+pfft_patches' in spec: - autoreconf = which('autoreconf') - autoreconf('-ifv') + # SIMD support + # TODO: add support for more architectures + float_options = [] + double_options = [] + if 'x86_64' in spec.architecture and spec.satisfies('@3:'): + float_options.append('--enable-sse2') + double_options.append('--enable-sse2') - configure(*options) - make() - if self.run_tests: - make("check") - make("install") + configure = Executable('../configure') + # Build double/float/long double/quad variants + if '+double' in spec: + with working_dir('double', create=True): + configure(*(options + double_options)) if '+float' in spec: - configure('--enable-float', *options) - make() - if self.run_tests: + with working_dir('float', create=True): + configure('--enable-float', *(options + float_options)) + if spec.satisfies('@3:+long_double'): + with working_dir('long-double', create=True): + configure('--enable-long-double', *options) + if spec.satisfies('@3:+quad'): + with working_dir('quad', create=True): + configure('--enable-quad-precision', *options) + + def build(self, spec, prefix): + if '+double' in spec: + with working_dir('double'): + make() + if '+float' in spec: + with working_dir('float'): + make() + if '+long_double' in spec: + with working_dir('long-double'): + make() + if '+quad' in spec: + with working_dir('quad'): + make() + + def check(self): + spec = self.spec + if '+double' in spec: + with working_dir('double'): + make("check") + if '+float' in spec: + with working_dir('float'): make("check") - make("install") if '+long_double' in spec: - configure('--enable-long-double', *options) - make() - if self.run_tests: + with working_dir('long-double'): make("check") - make("install") if '+quad' in spec: - configure('--enable-quad-precision', *options) - make() - if self.run_tests: + with working_dir('quad'): make("check") - make("install") + + def install(self, spec, prefix): + if '+double' in spec: + with working_dir('double'): + make("install") + if '+float' in spec: + with working_dir('float'): + make("install") + if '+long_double' in spec: + with working_dir('long-double'): + make("install") + if '+quad' in spec: + with working_dir('quad'): + make("install") |