pnfft: new package (#2646)

* pnfft: new package

* Convert some packages with overridden install from AutotoolsPackage to Package

* pnfft: fix URL

* Switch FFTW-derived packages back to AutotoolsPackage

* Disable unneeded build phases in FFTW and derived packages

* Separate build phases for FFTW and derived packages

* Fix broken merge

* fftw: pfft_patches for 3.3.6

* fftw: address @adamjstewart’s review comments
This commit is contained in:
Michael Kuron 2017-03-25 20:27:52 +01:00 committed by Adam J. Stewart
parent 3af971165a
commit 55300d1181
4 changed files with 233 additions and 60 deletions

View file

@ -25,7 +25,7 @@
from spack import * from spack import *
class Fftw(Package): class Fftw(AutotoolsPackage):
"""FFTW is a C subroutine library for computing the discrete Fourier """FFTW is a C subroutine library for computing the discrete Fourier
transform (DFT) in one or more dimensions, of arbitrary input transform (DFT) in one or more dimensions, of arbitrary input
size, and of both real and complex data (as well as of even/odd size, and of both real and complex data (as well as of even/odd
@ -41,12 +41,15 @@ class Fftw(Package):
version('3.3.4', '2edab8c06b24feeb3b82bbb3ebf3e7b3') version('3.3.4', '2edab8c06b24feeb3b82bbb3ebf3e7b3')
version('2.1.5', '8d16a84f3ca02a785ef9eb36249ba433') 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('pfft-3.3.4.patch', when="@3.3.4+pfft_patches", level=0)
variant( variant(
'float', default=True, 'float', default=True,
description='Produces a single precision version of the library') description='Produces a single precision version of the library')
variant(
'double', default=True,
description='Produces a double precision version of the library')
variant( variant(
'long_double', default=True, 'long_double', default=True,
description='Produces a long double precision version of the library') description='Produces a long double precision version of the library')
@ -63,8 +66,14 @@ class Fftw(Package):
depends_on('mpi', when='+mpi') depends_on('mpi', when='+mpi')
depends_on('automake', type='build', when='+pfft_patches') depends_on('automake', type='build', when='+pfft_patches')
depends_on('autoconf', type='build', when='+pfft_patches') depends_on('autoconf', type='build', when='+pfft_patches')
depends_on('libtool', type='build', when='+pfft_patches')
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 # Base options
options = [ options = [
'--prefix={0}'.format(prefix), '--prefix={0}'.format(prefix),
@ -90,9 +99,6 @@ def install(self, spec, prefix):
options.insert(0, 'CFLAGS=' + self.compiler.openmp_flag) options.insert(0, 'CFLAGS=' + self.compiler.openmp_flag)
if '+mpi' in spec: if '+mpi' in spec:
options.append('--enable-mpi') options.append('--enable-mpi')
if '+pfft_patches' in spec:
autoreconf = which('autoreconf')
autoreconf('-ifv')
# SIMD support # SIMD support
# TODO: add support for more architectures # TODO: add support for more architectures
@ -102,29 +108,60 @@ def install(self, spec, prefix):
float_options.append('--enable-sse2') float_options.append('--enable-sse2')
double_options.append('--enable-sse2') double_options.append('--enable-sse2')
# Build double precision configure = Executable('../configure')
configure(*(options + double_options))
make()
if self.run_tests:
make("check")
make("install")
# Build float/long double/quad variants # 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: if '+float' in spec:
configure('--enable-float', *(options + float_options)) with working_dir('float', create=True):
make() configure('--enable-float', *(options + float_options))
if self.run_tests:
make("check")
make("install")
if spec.satisfies('@3:+long_double'): if spec.satisfies('@3:+long_double'):
configure('--enable-long-double', *options) with working_dir('long-double', create=True):
make() configure('--enable-long-double', *options)
if self.run_tests:
make("check")
make("install")
if spec.satisfies('@3:+quad'): if spec.satisfies('@3:+quad'):
configure('--enable-quad-precision', *options) with working_dir('quad', create=True):
make() configure('--enable-quad-precision', *options)
if self.run_tests:
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, prefix):
if '+double' in spec:
with working_dir('double'):
make("check") make("check")
make("install") if '+float' in spec:
with working_dir('float'):
make("check")
if '+long_double' in spec:
with working_dir('long-double'):
make("check")
if '+quad' in spec:
with working_dir('quad'):
make("check")
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")

View file

@ -37,27 +37,50 @@ class Nfft(AutotoolsPackage):
depends_on('fftw') depends_on('fftw')
def install(self, spec, prefix): def configure(self, spec, prefix):
options = ['--prefix={0}'.format(prefix)] options = ['--prefix={0}'.format(prefix)]
make("distclean") configure = Executable('../configure')
configure(*options)
make()
if self.run_tests:
make("check")
make("install")
if '+double' in spec['fftw']:
with working_dir('double', create=True):
configure(*options)
if '+float' in spec['fftw']: if '+float' in spec['fftw']:
make("distclean") with working_dir('float', create=True):
configure('--enable-float', *options) configure('--enable-float', *options)
make()
if self.run_tests:
make("check")
make("install")
if '+long_double' in spec['fftw']: if '+long_double' in spec['fftw']:
make("distclean") with working_dir('long-double', create=True):
configure('--enable-long-double', *options) configure('--enable-long-double', *options)
make()
if self.run_tests: def build(self, spec, prefix):
if '+double' in spec['fftw']:
with working_dir('double'):
make()
if '+float' in spec['fftw']:
with working_dir('float'):
make()
if '+long_double' in spec['fftw']:
with working_dir('long-double'):
make()
def check(self, spec, prefix):
if '+double' in spec['fftw']:
with working_dir('double'):
make("check") make("check")
make("install") if '+float' in spec['fftw']:
with working_dir('float'):
make("check")
if '+long_double' in spec['fftw']:
with working_dir('long-double'):
make("check")
def install(self, spec, prefix):
if '+double' in spec['fftw']:
with working_dir('double'):
make("install")
if '+float' in spec['fftw']:
with working_dir('float'):
make("install")
if '+long_double' in spec['fftw']:
with working_dir('long-double'):
make("install")

View file

@ -39,26 +39,52 @@ class Pfft(AutotoolsPackage):
depends_on('fftw+mpi+pfft_patches') depends_on('fftw+mpi+pfft_patches')
depends_on('mpi') depends_on('mpi')
def install(self, spec, prefix): def configure(self, spec, prefix):
options = ['--prefix={0}'.format(prefix)] options = ['--prefix={0}'.format(prefix)]
if not self.compiler.f77 or not self.compiler.fc: if not self.compiler.f77 or not self.compiler.fc:
options.append("--disable-fortran") options.append("--disable-fortran")
configure(*options) configure = Executable('../configure')
make()
if self.run_tests:
make("check")
make("install")
if '+double' in spec['fftw']:
with working_dir('double', create=True):
configure(*options)
if '+float' in spec['fftw']: if '+float' in spec['fftw']:
configure('--enable-float', *options) with working_dir('float', create=True):
make() configure('--enable-float', *options)
if self.run_tests:
make("check")
make("install")
if '+long_double' in spec['fftw']: if '+long_double' in spec['fftw']:
configure('--enable-long-double', *options) with working_dir('long-double', create=True):
make() configure('--enable-long-double', *options)
if self.run_tests:
def build(self, spec, prefix):
if '+double' in spec['fftw']:
with working_dir('double'):
make()
if '+float' in spec['fftw']:
with working_dir('float'):
make()
if '+long_double' in spec['fftw']:
with working_dir('long-double'):
make()
def check(self, spec, prefix):
if '+double' in spec['fftw']:
with working_dir('double'):
make("check") make("check")
make("install") if '+float' in spec['fftw']:
with working_dir('float'):
make("check")
if '+long_double' in spec['fftw']:
with working_dir('long-double'):
make("check")
def install(self, spec, prefix):
if '+double' in spec['fftw']:
with working_dir('double'):
make("install")
if '+float' in spec['fftw']:
with working_dir('float'):
make("install")
if '+long_double' in spec['fftw']:
with working_dir('long-double'):
make("install")

View file

@ -0,0 +1,87 @@
##############################################################################
# Copyright (c) 2013-2016, 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.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License (as
# published by the Free Software Foundation) version 2.1, February 1999.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
# conditions of the GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##############################################################################
from spack import *
class Pnfft(AutotoolsPackage):
"""PNFFT is a parallel software library for the calculation of
three-dimensional nonequispaced FFTs."""
homepage = "https://www-user.tu-chemnitz.de/~potts/workgroup/pippig/software.php.en"
url = "https://www-user.tu-chemnitz.de/~potts/workgroup/pippig/software/pnfft-1.0.7-alpha.tar.gz"
version('1.0.7-alpha', '5caa7f214eed99de2281043ca2367e9e')
depends_on('pfft')
def configure(self, spec, prefix):
options = ['--prefix={0}'.format(prefix)]
if not self.compiler.f77 or not self.compiler.fc:
options.append("--disable-fortran")
configure = Executable('../configure')
if '+double' in spec['fftw']:
with working_dir('double', create=True):
configure(*options)
if '+float' in spec['fftw']:
with working_dir('float', create=True):
configure('--enable-float', *options)
if '+long_double' in spec['fftw']:
with working_dir('long-double', create=True):
configure('--enable-long-double', *options)
def build(self, spec, prefix):
if '+double' in spec['fftw']:
with working_dir('double'):
make()
if '+float' in spec['fftw']:
with working_dir('float'):
make()
if '+long_double' in spec['fftw']:
with working_dir('long-double'):
make()
def check(self, spec, prefix):
if '+double' in spec['fftw']:
with working_dir('double'):
make("check")
if '+float' in spec['fftw']:
with working_dir('float'):
make("check")
if '+long_double' in spec['fftw']:
with working_dir('long-double'):
make("check")
def install(self, spec, prefix):
if '+double' in spec['fftw']:
with working_dir('double'):
make("install")
if '+float' in spec['fftw']:
with working_dir('float'):
make("install")
if '+long_double' in spec['fftw']:
with working_dir('long-double'):
make("install")