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:
parent
3b2124af6a
commit
81a5146b1d
@ -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')
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
@ -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))
|
||||||
|
|
||||||
|
@ -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))
|
||||||
|
|
||||||
|
@ -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('=====================================================')
|
||||||
|
@ -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'
|
||||||
|
@ -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"),
|
|
||||||
)
|
|
||||||
|
@ -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']
|
||||||
|
@ -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')
|
|
||||||
|
@ -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."""
|
||||||
|
@ -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)
|
|
||||||
|
@ -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
|
||||||
|
]
|
||||||
|
@ -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")
|
|
||||||
)
|
|
||||||
|
@ -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')
|
|
||||||
|
@ -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))
|
||||||
|
|
||||||
|
@ -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')
|
||||||
|
@ -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++']
|
||||||
|
@ -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
|
||||||
|
@ -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')
|
|
||||||
|
@ -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 = [
|
||||||
|
@ -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'
|
|
||||||
|
@ -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',
|
||||||
|
@ -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):
|
||||||
|
@ -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)]
|
||||||
|
Loading…
Reference in New Issue
Block a user