AutotoolsPackage: minor improvements (#2859)

* AutotoolsPackage: added configure_directory to permit build out of source. The configure script executable is now invoked with an absolute path. Modified a few packages accordingly.

* build_systems: functions returning directories are now properties

* build_systems: fixed issues with tcl and tk

* AutotoolsPackage: reworked recipe for autoreconf
This commit is contained in:
Massimiliano Culpo 2017-01-26 11:27:15 +01:00 committed by Todd Gamblin
parent 3b2124af6a
commit 81a5146b1d
27 changed files with 179 additions and 173 deletions

View File

@ -30,8 +30,10 @@
from subprocess import PIPE from subprocess import PIPE
from subprocess import check_call from subprocess import check_call
from llnl.util.filesystem import working_dir import llnl.util.tty as tty
from spack.package import PackageBase, run_after from llnl.util.filesystem import working_dir, join_path, force_remove
from spack.package import PackageBase, run_after, run_before
from spack.util.executable import Executable
class AutotoolsPackage(PackageBase): class AutotoolsPackage(PackageBase):
@ -79,8 +81,14 @@ class AutotoolsPackage(PackageBase):
#: phase #: phase
install_targets = ['install'] install_targets = ['install']
#: Callback names for build-time test
build_time_test_callbacks = ['check'] build_time_test_callbacks = ['check']
#: Set to true to force the autoreconf step even if configure is present
force_autoreconf = False
#: Options to be passed to autoreconf when using the default implementation
autoreconf_extra_args = []
def _do_patch_config_guess(self): def _do_patch_config_guess(self):
"""Some packages ship with an older config.guess and need to have """Some packages ship with an older config.guess and need to have
this updated when installed on a newer architecture.""" this updated when installed on a newer architecture."""
@ -147,9 +155,26 @@ def _do_patch_config_guess(self):
return False return False
@property
def configure_directory(self):
"""Returns the directory where 'configure' resides.
:return: directory where to find configure
"""
return self.stage.source_path
@property
def configure_abs_path(self):
# Absolute path to configure
configure_abs_path = join_path(
os.path.abspath(self.configure_directory), 'configure'
)
return configure_abs_path
@property
def build_directory(self): def build_directory(self):
"""Override to provide another place to build the package""" """Override to provide another place to build the package"""
return self.stage.source_path return self.configure_directory
def patch(self): def patch(self):
"""Patches config.guess if """Patches config.guess if
@ -165,21 +190,62 @@ def patch(self):
if not self._do_patch_config_guess(): if not self._do_patch_config_guess():
raise RuntimeError('Failed to find suitable config.guess') raise RuntimeError('Failed to find suitable config.guess')
@run_before('autoreconf')
def delete_configure_to_force_update(self):
if self.force_autoreconf:
force_remove(self.configure_abs_path)
def autoreconf(self, spec, prefix): def autoreconf(self, spec, prefix):
"""Not needed usually, configure should be already there""" """Not needed usually, configure should be already there"""
pass # If configure exists nothing needs to be done
if os.path.exists(self.configure_abs_path):
return
# Else try to regenerate it
autotools = ['m4', 'autoconf', 'automake', 'libtool']
missing = [x for x in autotools if x not in spec]
if missing:
msg = 'Cannot generate configure: missing dependencies {0}'
raise RuntimeError(msg.format(missing))
tty.msg('Configure script not found: trying to generate it')
tty.warn('*********************************************************')
tty.warn('* If the default procedure fails, consider implementing *')
tty.warn('* a custom AUTORECONF phase in the package *')
tty.warn('*********************************************************')
with working_dir(self.configure_directory):
m = inspect.getmodule(self)
# This part should be redundant in principle, but
# won't hurt
m.libtoolize()
m.aclocal()
# This line is what is needed most of the time
# --install, --verbose, --force
autoreconf_args = ['-ivf']
if 'pkg-config' in spec:
autoreconf_args += [
'-I',
join_path(spec['pkg-config'].prefix, 'share', 'aclocal'),
]
autoreconf_args += self.autoreconf_extra_args
m.autoreconf(*autoreconf_args)
@run_after('autoreconf') @run_after('autoreconf')
def is_configure_or_die(self): def set_configure_or_die(self):
"""Checks the presence of a `configure` file after the """Checks the presence of a ``configure`` file after the
:py:meth:`.autoreconf` phase. autoreconf phase. If it is found sets a module attribute
appropriately, otherwise raises an error.
:raise RuntimeError: if the ``configure`` script does not exist. :raises RuntimeError: if a configure script is not found in
:py:meth:`~.configure_directory`
""" """
with working_dir(self.build_directory()): # Check if a configure script is there. If not raise a RuntimeError.
if not os.path.exists('configure'): if not os.path.exists(self.configure_abs_path):
raise RuntimeError( msg = 'configure script not found in {0}'
'configure script not found in {0}'.format(os.getcwd())) raise RuntimeError(msg.format(self.configure_directory))
# Monkey-patch the configure script in the corresponding module
inspect.getmodule(self).configure = Executable(
self.configure_abs_path
)
def configure_args(self): def configure_args(self):
"""Produces a list containing all the arguments that must be passed to """Produces a list containing all the arguments that must be passed to
@ -195,21 +261,21 @@ def configure(self, spec, prefix):
""" """
options = ['--prefix={0}'.format(prefix)] + self.configure_args() options = ['--prefix={0}'.format(prefix)] + self.configure_args()
with working_dir(self.build_directory()): with working_dir(self.build_directory, create=True):
inspect.getmodule(self).configure(*options) inspect.getmodule(self).configure(*options)
def build(self, spec, prefix): def build(self, spec, prefix):
"""Makes the build targets specified by """Makes the build targets specified by
:py:attr:``~.AutotoolsPackage.build_targets`` :py:attr:``~.AutotoolsPackage.build_targets``
""" """
with working_dir(self.build_directory()): with working_dir(self.build_directory):
inspect.getmodule(self).make(*self.build_targets) inspect.getmodule(self).make(*self.build_targets)
def install(self, spec, prefix): def install(self, spec, prefix):
"""Makes the install targets specified by """Makes the install targets specified by
:py:attr:``~.AutotoolsPackage.install_targets`` :py:attr:``~.AutotoolsPackage.install_targets``
""" """
with working_dir(self.build_directory()): with working_dir(self.build_directory):
inspect.getmodule(self).make(*self.install_targets) inspect.getmodule(self).make(*self.install_targets)
run_after('build')(PackageBase._run_default_build_time_test_callbacks) run_after('build')(PackageBase._run_default_build_time_test_callbacks)
@ -218,7 +284,7 @@ def check(self):
"""Searches the Makefile for targets ``test`` and ``check`` """Searches the Makefile for targets ``test`` and ``check``
and runs them if found. and runs them if found.
""" """
with working_dir(self.build_directory()): with working_dir(self.build_directory):
self._if_make_target_execute('test') self._if_make_target_execute('test')
self._if_make_target_execute('check') self._if_make_target_execute('check')

View File

@ -82,6 +82,7 @@ def build_type(self):
""" """
return 'RelWithDebInfo' return 'RelWithDebInfo'
@property
def root_cmakelists_dir(self): def root_cmakelists_dir(self):
"""Returns the location of the root CMakeLists.txt """Returns the location of the root CMakeLists.txt
@ -119,6 +120,7 @@ def _std_args(pkg):
args.append('-DCMAKE_INSTALL_RPATH:STRING={0}'.format(rpaths)) args.append('-DCMAKE_INSTALL_RPATH:STRING={0}'.format(rpaths))
return args return args
@property
def build_directory(self): def build_directory(self):
"""Returns the directory to use when building the package """Returns the directory to use when building the package
@ -141,19 +143,19 @@ def cmake_args(self):
def cmake(self, spec, prefix): def cmake(self, spec, prefix):
"""Runs ``cmake`` in the build directory""" """Runs ``cmake`` in the build directory"""
options = [self.root_cmakelists_dir()] + self.std_cmake_args + \ options = [self.root_cmakelists_dir] + self.std_cmake_args + \
self.cmake_args() self.cmake_args()
with working_dir(self.build_directory(), create=True): with working_dir(self.build_directory, create=True):
inspect.getmodule(self).cmake(*options) inspect.getmodule(self).cmake(*options)
def build(self, spec, prefix): def build(self, spec, prefix):
"""Make the build targets""" """Make the build targets"""
with working_dir(self.build_directory()): with working_dir(self.build_directory):
inspect.getmodule(self).make(*self.build_targets) inspect.getmodule(self).make(*self.build_targets)
def install(self, spec, prefix): def install(self, spec, prefix):
"""Make the install targets""" """Make the install targets"""
with working_dir(self.build_directory()): with working_dir(self.build_directory):
inspect.getmodule(self).make(*self.install_targets) inspect.getmodule(self).make(*self.install_targets)
run_after('build')(PackageBase._run_default_build_time_test_callbacks) run_after('build')(PackageBase._run_default_build_time_test_callbacks)
@ -162,7 +164,7 @@ def check(self):
"""Searches the CMake-generated Makefile for the target ``test`` """Searches the CMake-generated Makefile for the target ``test``
and runs it if found. and runs it if found.
""" """
with working_dir(self.build_directory()): with working_dir(self.build_directory):
self._if_make_target_execute('test') self._if_make_target_execute('test')
# Check that self.prefix is there after installation # Check that self.prefix is there after installation

View File

@ -72,6 +72,7 @@ class MakefilePackage(PackageBase):
#: phase #: phase
install_targets = ['install'] install_targets = ['install']
@property
def build_directory(self): def build_directory(self):
"""Returns the directory containing the main Makefile """Returns the directory containing the main Makefile
@ -89,14 +90,14 @@ def build(self, spec, prefix):
"""Calls make, passing :py:attr:`~.MakefilePackage.build_targets` """Calls make, passing :py:attr:`~.MakefilePackage.build_targets`
as targets. as targets.
""" """
with working_dir(self.build_directory()): with working_dir(self.build_directory):
inspect.getmodule(self).make(*self.build_targets) inspect.getmodule(self).make(*self.build_targets)
def install(self, spec, prefix): def install(self, spec, prefix):
"""Calls make, passing :py:attr:`~.MakefilePackage.install_targets` """Calls make, passing :py:attr:`~.MakefilePackage.install_targets`
as targets. as targets.
""" """
with working_dir(self.build_directory()): with working_dir(self.build_directory):
inspect.getmodule(self).make(*self.install_targets) inspect.getmodule(self).make(*self.install_targets)
# Check that self.prefix is there after installation # Check that self.prefix is there after installation

View File

@ -97,10 +97,11 @@ def configure(self, spec, prefix):
extends('python') extends('python')
def setup_file(self, spec, prefix): def setup_file(self):
"""Returns the name of the setup file to use.""" """Returns the name of the setup file to use."""
return 'setup.py' return 'setup.py'
@property
def build_directory(self): def build_directory(self):
"""The directory containing the ``setup.py`` file.""" """The directory containing the ``setup.py`` file."""
return self.stage.source_path return self.stage.source_path
@ -109,7 +110,7 @@ def python(self, *args):
inspect.getmodule(self).python(*args) inspect.getmodule(self).python(*args)
def setup_py(self, *args): def setup_py(self, *args):
setup = self.setup_file(self.spec, self.prefix) setup = self.setup_file()
with working_dir(self.build_directory()): with working_dir(self.build_directory()):
self.python(setup, '--no-user-cfg', *args) self.python(setup, '--no-user-cfg', *args)

View File

@ -39,6 +39,7 @@ class Astyle(MakefilePackage):
parallel = False parallel = False
@property
def build_directory(self): def build_directory(self):
return join_path(self.stage.source_path, 'build', self.compiler.name) return join_path(self.stage.source_path, 'build', self.compiler.name)

View File

@ -38,6 +38,8 @@ class Autoconf(AutotoolsPackage):
depends_on('m4@1.4.6:', type='build') depends_on('m4@1.4.6:', type='build')
build_directory = 'spack-build'
def _make_executable(self, name): def _make_executable(self, name):
return Executable(join_path(self.prefix.bin, name)) return Executable(join_path(self.prefix.bin, name))

View File

@ -37,6 +37,8 @@ class Automake(AutotoolsPackage):
depends_on('autoconf', type='build') depends_on('autoconf', type='build')
build_directory = 'spack-build'
def _make_executable(self, name): def _make_executable(self, name):
return Executable(join_path(self.prefix.bin, name)) return Executable(join_path(self.prefix.bin, name))

View File

@ -25,10 +25,10 @@
from spack import * from spack import *
class BashCompletion(Package): class BashCompletion(AutotoolsPackage):
"""Programmable completion functions for bash.""" """Programmable completion functions for bash."""
homepage = "https://github.com/scop/bash-completion" homepage = "https://github.com/scop/bash-completion"
url = "https://github.com/scop/bash-completion/archive/2.3.tar.gz" url = "https://github.com/scop/bash-completion/archive/2.3.tar.gz"
version('2.3', '67e50f5f3c804350b43f2b664c33dde811d24292') version('2.3', '67e50f5f3c804350b43f2b664c33dde811d24292')
version('develop', git='https://github.com/scop/bash-completion.git') version('develop', git='https://github.com/scop/bash-completion.git')
@ -41,16 +41,9 @@ class BashCompletion(Package):
# Other dependencies # Other dependencies
depends_on('bash@4.1:', type='run') depends_on('bash@4.1:', type='run')
def install(self, spec, prefix): @run_after('install')
make_args = ['--prefix=%s' % prefix] def show_message_to_user(self):
prefix = self.prefix
autoreconf('-i')
configure(*make_args)
make()
# make("check") # optional, requires dejagnu and tcllib
make("install",
parallel=False)
# Guidelines for individual user as provided by the author at # Guidelines for individual user as provided by the author at
# https://github.com/scop/bash-completion # https://github.com/scop/bash-completion
print('=====================================================') print('=====================================================')
@ -59,6 +52,6 @@ def install(self, spec, prefix):
print('') print('')
print('# Use bash-completion, if available') print('# Use bash-completion, if available')
print('[[ $PS1 && -f %s/share/bash-completion/bash_completion ]] && \ ' % prefix) # NOQA: ignore=E501 print('[[ $PS1 && -f %s/share/bash-completion/bash_completion ]] && \ ' % prefix) # NOQA: ignore=E501
print(' . %s/share/bash-completion/bash_completion' % prefix) print(' . %s/share/bash-completion/bash_completion' % prefix)
print('') print('')
print('=====================================================') print('=====================================================')

View File

@ -36,3 +36,5 @@ class Bison(AutotoolsPackage):
version('3.0.4', 'a586e11cd4aff49c3ff6d3b6a4c9ccf8') version('3.0.4', 'a586e11cd4aff49c3ff6d3b6a4c9ccf8')
depends_on("m4", type='build') depends_on("m4", type='build')
build_directory = 'spack-build'

View File

@ -38,19 +38,3 @@ class Czmq(AutotoolsPackage):
depends_on('autoconf', type='build') depends_on('autoconf', type='build')
depends_on('pkg-config', type='build') depends_on('pkg-config', type='build')
depends_on('zeromq') depends_on('zeromq')
def autoreconf(self, spec, prefix):
# Work around autogen.sh oddities
# bash = which("bash")
# bash("./autogen.sh")
mkdirp("config")
autoreconf = which("autoreconf")
autoreconf("--install", "--verbose", "--force",
"-I", "config",
"-I", join_path(spec['pkg-config'].prefix,
"share", "aclocal"),
"-I", join_path(spec['automake'].prefix,
"share", "aclocal"),
"-I", join_path(spec['libtool'].prefix,
"share", "aclocal"),
)

View File

@ -35,15 +35,15 @@ class Elfutils(AutotoolsPackage):
homepage = "https://fedorahosted.org/elfutils/" homepage = "https://fedorahosted.org/elfutils/"
depends_on('libtool', type='build')
depends_on('automake', type='build')
depends_on('autoconf', type='build')
version('0.163', version('0.163',
git='git://git.fedorahosted.org/git/elfutils.git', git='git://git.fedorahosted.org/git/elfutils.git',
tag='elfutils-0.163') tag='elfutils-0.163')
provides('elf') provides('elf')
def autoreconf(self, spec, prefix):
autoreconf = which('autoreconf')
autoreconf('-if')
def configure_args(self): def configure_args(self):
return ['--enable-maintainer-mode'] return ['--enable-maintainer-mode']

View File

@ -61,11 +61,3 @@ def url_for_version(self, version):
url += "/archive/flex-{0}.tar.gz".format(version.dashed) url += "/archive/flex-{0}.tar.gz".format(version.dashed)
return url return url
def autoreconf(self, spec, prefix):
pass
@when('@:2.6.0')
def autoreconf(self, spec, prefix):
libtoolize('--install', '--force')
autoreconf('--install', '--force')

View File

@ -30,7 +30,7 @@
from os.path import isfile from os.path import isfile
class Gcc(Package): class Gcc(AutotoolsPackage):
"""The GNU Compiler Collection includes front ends for C, C++, """The GNU Compiler Collection includes front ends for C, C++,
Objective-C, Fortran, and Java.""" Objective-C, Fortran, and Java."""
homepage = "https://gcc.gnu.org" homepage = "https://gcc.gnu.org"
@ -85,7 +85,9 @@ class Gcc(Package):
patch('piclibs.patch', when='+piclibs') patch('piclibs.patch', when='+piclibs')
patch('gcc-backport.patch', when='@4.7:4.9.2,5:5.3') patch('gcc-backport.patch', when='@4.7:4.9.2,5:5.3')
def install(self, spec, prefix): def configure_args(self):
spec = self.spec
prefix = self.spec.prefix
# libjava/configure needs a minor fix to install into spack paths. # libjava/configure needs a minor fix to install into spack paths.
filter_file(r"'@.*@'", "'@[[:alnum:]]*@'", 'libjava/configure', filter_file(r"'@.*@'", "'@[[:alnum:]]*@'", 'libjava/configure',
string=True) string=True)
@ -138,18 +140,15 @@ def install(self, spec, prefix):
darwin_options = ["--with-build-config=bootstrap-debug"] darwin_options = ["--with-build-config=bootstrap-debug"]
options.extend(darwin_options) options.extend(darwin_options)
build_dir = join_path(self.stage.path, 'spack-build') return options
configure = Executable(join_path(self.stage.source_path, 'configure'))
with working_dir(build_dir, create=True):
# Rest of install is straightforward.
configure(*options)
if sys.platform == 'darwin':
make("bootstrap")
else:
make()
make("install")
self.write_rpath_specs() build_directory = 'spack-build'
@property
def build_targets(self):
if sys.platform == 'darwin':
return ['bootstrap']
return []
@property @property
def spec_dir(self): def spec_dir(self):
@ -157,6 +156,7 @@ def spec_dir(self):
spec_dir = glob("%s/lib64/gcc/*/*" % self.prefix) spec_dir = glob("%s/lib64/gcc/*/*" % self.prefix)
return spec_dir[0] if spec_dir else None return spec_dir[0] if spec_dir else None
@run_after('install')
def write_rpath_specs(self): def write_rpath_specs(self):
"""Generate a spec file so the linker adds a rpath to the libs """Generate a spec file so the linker adds a rpath to the libs
the compiler used to build the executable.""" the compiler used to build the executable."""

View File

@ -53,22 +53,9 @@ class Glib(AutotoolsPackage):
# around a legitimate usage. # around a legitimate usage.
patch('no-Werror=format-security.patch') patch('no-Werror=format-security.patch')
force_autoreconf = True
def url_for_version(self, version): def url_for_version(self, version):
"""Handle glib's version-based custom URLs.""" """Handle glib's version-based custom URLs."""
url = 'http://ftp.gnome.org/pub/gnome/sources/glib' url = 'http://ftp.gnome.org/pub/gnome/sources/glib'
return url + '/%s/glib-%s.tar.xz' % (version.up_to(2), version) return url + '/%s/glib-%s.tar.xz' % (version.up_to(2), version)
def autoreconf(self, spec, prefix):
autoreconf = which("autoreconf")
autoreconf("--install", "--verbose", "--force",
"-I", "config",
"-I", join_path(spec['pkg-config'].prefix,
"share", "aclocal"),
"-I", join_path(spec['automake'].prefix,
"share", "aclocal"),
"-I", join_path(spec['libtool'].prefix,
"share", "aclocal"),
)
def install(self, spec, prefix):
make("install", parallel=False)

View File

@ -25,11 +25,11 @@
from spack import * from spack import *
class Gource(Package): class Gource(AutotoolsPackage):
"""Software version control visualization.""" """Software version control visualization."""
homepage = "http://gource.io" homepage = "http://gource.io"
url = "https://github.com/acaudwell/Gource/releases/download/gource-0.44/gource-0.44.tar.gz" url = "https://github.com/acaudwell/Gource/releases/download/gource-0.44/gource-0.44.tar.gz"
version('0.44', '79cda1bfaad16027d59cce55455bfab88b57c69d') version('0.44', '79cda1bfaad16027d59cce55455bfab88b57c69d')
@ -49,15 +49,17 @@ class Gource(Package):
depends_on('sdl2') depends_on('sdl2')
depends_on('sdl2-image') depends_on('sdl2-image')
def install(self, spec, prefix): parallel = False
make_args = ['--prefix=%s' % prefix, force_autoreconf = True
'--disable-dependency-tracking',
'--without-x',
'--with-boost=%s' % spec['boost'].prefix]
autoreconf('-i') def url_for_version(self, version):
configure(*make_args) tmp = 'https://github.com/acaudwell/Gource/releases/download/gource-{0}/gource-{0}.tar.gz' # NOQA: ignore=E501
make() return tmp.format(version.dotted)
make("install", def configure_args(self):
parallel=False) spec = self.spec
return [
'--disable-dependency-tracking',
'--without-x',
'--with-boost=%s' % spec['boost'].prefix
]

View File

@ -38,8 +38,9 @@ class Libgd(AutotoolsPackage):
""" """
homepage = "https://github.com/libgd/libgd" homepage = "https://github.com/libgd/libgd"
url = "https://github.com/libgd/libgd/archive/gd-2.1.1.tar.gz" url = 'https://github.com/libgd/libgd/releases/download/gd-2.2.4/libgd-2.2.4.tar.gz'
version('2.2.4', '0a3c307b5075edbe1883543dd1153c02')
version('2.2.3', 'a67bd15fa33d4aac0a1c7904aed19f49') version('2.2.3', 'a67bd15fa33d4aac0a1c7904aed19f49')
version('2.1.1', 'e91a1a99903e460e7ba00a794e72cc1e') version('2.1.1', 'e91a1a99903e460e7ba00a794e72cc1e')
@ -54,16 +55,3 @@ class Libgd(AutotoolsPackage):
depends_on('libpng') depends_on('libpng')
depends_on('libtiff') depends_on('libtiff')
depends_on('fontconfig') depends_on('fontconfig')
def autoreconf(self, spec, prefix):
autoreconf("--install", "--force",
"-I", "m4",
"-I", join_path(spec['gettext'].prefix,
"share", "aclocal"),
"-I", join_path(spec['pkg-config'].prefix,
"share", "aclocal"),
"-I", join_path(spec['automake'].prefix,
"share", "aclocal"),
"-I", join_path(spec['libtool'].prefix,
"share", "aclocal")
)

View File

@ -23,10 +23,9 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
############################################################################## ##############################################################################
from spack import * from spack import *
import os
class Libquo(Package): class Libquo(AutotoolsPackage):
"""QUO (as in "status quo") is a runtime library that aids in accommodating """QUO (as in "status quo") is a runtime library that aids in accommodating
thread-level heterogeneity in dynamic, phased MPI+X applications comprising thread-level heterogeneity in dynamic, phased MPI+X applications comprising
@ -42,25 +41,8 @@ class Libquo(Package):
depends_on('automake', type='build') depends_on('automake', type='build')
depends_on('libtool', type='build') depends_on('libtool', type='build')
def install(self, spec, prefix): def configure_args(self):
autoreconf_options = [ return [
'--install', 'CC={0}'.format(self.spec['mpi'].mpicc),
'--verbose', 'FC={0}'.format(self.spec['mpi'].mpifc)
'--force',
'-I', 'config',
'-I', os.path.join(spec['automake'].prefix,
'share', 'aclocal'),
'-I', os.path.join(spec['libtool'].prefix,
'share', 'aclocal')
] ]
autoreconf(*autoreconf_options)
configure_options = [
'--prefix={0}'.format(prefix),
'CC=%s' % join_path(spec['mpi'].prefix.bin, "mpicc"),
'FC=%s' % join_path(spec['mpi'].prefix.bin, "mpif90")
]
configure(*configure_options)
make()
make('install')

View File

@ -36,6 +36,8 @@ class Libtool(AutotoolsPackage):
depends_on('m4@1.4.6:', type='build') depends_on('m4@1.4.6:', type='build')
build_directory = 'spack-build'
def _make_executable(self, name): def _make_executable(self, name):
return Executable(join_path(self.prefix.bin, name)) return Executable(join_path(self.prefix.bin, name))

View File

@ -37,5 +37,7 @@ class Libuv(AutotoolsPackage):
depends_on('libtool', type='build') depends_on('libtool', type='build')
def autoreconf(self, spec, prefix): def autoreconf(self, spec, prefix):
# This is needed because autogen.sh generates on-the-fly
# an m4 macro needed during configuration
bash = which("bash") bash = which("bash")
bash('autogen.sh') bash('autogen.sh')

View File

@ -41,6 +41,8 @@ class M4(AutotoolsPackage):
depends_on('libsigsegv', when='+sigsegv') depends_on('libsigsegv', when='+sigsegv')
build_directory = 'spack-build'
def configure_args(self): def configure_args(self):
spec = self.spec spec = self.spec
args = ['--enable-c++'] args = ['--enable-c++']

View File

@ -34,8 +34,9 @@ class NetcdfCxx4(AutotoolsPackage):
version('4.2.1', 'd019853802092cf686254aaba165fc81') version('4.2.1', 'd019853802092cf686254aaba165fc81')
depends_on('netcdf') depends_on('netcdf')
depends_on('autoconf', type='build')
def autoreconf(self, spec, prefix): depends_on('automake', type='build')
# Rebuild to prevent problems of inconsistency in git repo depends_on('autoconf', type='build')
which('autoreconf')('-ivf') depends_on('libtool', type='build')
force_autoreconf = True

View File

@ -27,7 +27,7 @@
from spack import * from spack import *
class Plumed(Package): class Plumed(AutotoolsPackage):
"""PLUMED is an open source library for free energy calculations in """PLUMED is an open source library for free energy calculations in
molecular systems which works together with some of the most popular molecular systems which works together with some of the most popular
molecular dynamics engines. molecular dynamics engines.
@ -67,6 +67,8 @@ class Plumed(Package):
depends_on('gsl', when='+gsl') depends_on('gsl', when='+gsl')
depends_on('autoconf', type='build') depends_on('autoconf', type='build')
depends_on('automake', type='build')
depends_on('libtool', type='build')
# Dictionary mapping PLUMED versions to the patches it provides # Dictionary mapping PLUMED versions to the patches it provides
# interactively # interactively
@ -84,6 +86,8 @@ class Plumed(Package):
} }
} }
force_autoreconf = True
def apply_patch(self, other): def apply_patch(self, other):
plumed = subprocess.Popen( plumed = subprocess.Popen(
[join_path(self.spec.prefix.bin, 'plumed'), 'patch', '-p'], [join_path(self.spec.prefix.bin, 'plumed'), 'patch', '-p'],
@ -99,12 +103,15 @@ def setup_dependent_package(self, module, ext_spec):
# Make plumed visible from dependent packages # Make plumed visible from dependent packages
module.plumed = Executable(join_path(self.spec.prefix.bin, 'plumed')) module.plumed = Executable(join_path(self.spec.prefix.bin, 'plumed'))
def install(self, spec, prefix): @run_before('autoreconf')
def filter_gslcblas(self):
# This part is needed to avoid linking with gsl cblas # This part is needed to avoid linking with gsl cblas
# interface which will mask the cblas interface # interface which will mask the cblas interface
# provided by optimized libraries due to linking order # provided by optimized libraries due to linking order
filter_file('-lgslcblas', '', 'configure.ac') filter_file('-lgslcblas', '', 'configure.ac')
autoreconf('-ivf')
def configure_args(self):
spec = self.spec
# From plumed docs : # From plumed docs :
# Also consider that this is different with respect to what some other # Also consider that this is different with respect to what some other
@ -114,8 +121,7 @@ def install(self, spec, prefix):
# with MPI you should use: # with MPI you should use:
# #
# > ./configure CXX="$MPICXX" # > ./configure CXX="$MPICXX"
configure_opts = ['--prefix=' + prefix] configure_opts = []
# If using MPI then ensure the correct compiler wrapper is used. # If using MPI then ensure the correct compiler wrapper is used.
if '+mpi' in spec: if '+mpi' in spec:
configure_opts.extend([ configure_opts.extend([
@ -153,6 +159,4 @@ def install(self, spec, prefix):
configure_opts.extend([ configure_opts.extend([
'--enable-modules={0}'.format("".join(module_opts))]) '--enable-modules={0}'.format("".join(module_opts))])
configure(*configure_opts) return configure_opts
make()
make('install')

View File

@ -51,8 +51,8 @@ class PyMeep(PythonPackage):
phases = ['clean', 'build_ext', 'install', 'bdist'] phases = ['clean', 'build_ext', 'install', 'bdist']
def setup_file(self, spec, prefix): def setup_file(self):
return 'setup-mpi.py' if '+mpi' in spec else 'setup.py' return 'setup-mpi.py' if '+mpi' in self.spec else 'setup.py'
def common_args(self, spec, prefix): def common_args(self, spec, prefix):
include_dirs = [ include_dirs = [

View File

@ -37,8 +37,7 @@ class PyPypar(PythonPackage):
depends_on('mpi') depends_on('mpi')
depends_on('py-numpy', type=('build', 'run')) depends_on('py-numpy', type=('build', 'run'))
build_directory = 'source'
def url_for_version(self, version): def url_for_version(self, version):
return "https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/pypar/pypar-%s.tgz" % version return "https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/pypar/pypar-%s.tgz" % version
def build_directory(self):
return 'source'

View File

@ -58,13 +58,6 @@ def setup_environment(self, spack_env, run_env):
tty.warn('This is needed to clone SWIFT repository') tty.warn('This is needed to clone SWIFT repository')
spack_env.set('GIT_SSL_NO_VERIFY', 1) spack_env.set('GIT_SSL_NO_VERIFY', 1)
def autoreconf(self, spec, prefix):
libtoolize()
aclocal()
autoconf()
autogen = Executable('./autogen.sh')
autogen()
def configure_args(self): def configure_args(self):
return ['--prefix=%s' % self.prefix, return ['--prefix=%s' % self.prefix,
'--enable-mpi' if '+mpi' in self.spec else '--disable-mpi', '--enable-mpi' if '+mpi' in self.spec else '--disable-mpi',

View File

@ -42,6 +42,8 @@ class Tcl(AutotoolsPackage):
depends_on('zlib') depends_on('zlib')
configure_directory = 'unix'
def url_for_version(self, version): def url_for_version(self, version):
base_url = 'http://prdownloads.sourceforge.net/tcl' base_url = 'http://prdownloads.sourceforge.net/tcl'
return '{0}/tcl{1}-src.tar.gz'.format(base_url, version) return '{0}/tcl{1}-src.tar.gz'.format(base_url, version)
@ -52,9 +54,6 @@ def setup_environment(self, spack_env, env):
env.set('TCL_LIBRARY', join_path(self.prefix.lib, 'tcl{0}'.format( env.set('TCL_LIBRARY', join_path(self.prefix.lib, 'tcl{0}'.format(
self.spec.version.up_to(2)))) self.spec.version.up_to(2))))
def build_directory(self):
return 'unix'
@run_after('install') @run_after('install')
def symlink_tclsh(self): def symlink_tclsh(self):
with working_dir(self.prefix.bin): with working_dir(self.prefix.bin):

View File

@ -42,6 +42,8 @@ class Tk(AutotoolsPackage):
depends_on("tcl") depends_on("tcl")
depends_on("libx11", when='+X') depends_on("libx11", when='+X')
configure_directory = 'unix'
def url_for_version(self, version): def url_for_version(self, version):
base_url = "http://prdownloads.sourceforge.net/tcl" base_url = "http://prdownloads.sourceforge.net/tcl"
return "{0}/tk{1}-src.tar.gz".format(base_url, version) return "{0}/tk{1}-src.tar.gz".format(base_url, version)
@ -52,9 +54,6 @@ def setup_environment(self, spack_env, run_env):
run_env.set('TK_LIBRARY', join_path(self.prefix.lib, 'tk{0}'.format( run_env.set('TK_LIBRARY', join_path(self.prefix.lib, 'tk{0}'.format(
self.spec.version.up_to(2)))) self.spec.version.up_to(2))))
def build_directory(self):
return 'unix'
def configure_args(self): def configure_args(self):
spec = self.spec spec = self.spec
return ['--with-tcl={0}'.format(spec['tcl'].prefix.lib)] return ['--with-tcl={0}'.format(spec['tcl'].prefix.lib)]