patch older config.guess for newer architectures (#2221)

This commit is contained in:
Gregory Lee
2016-11-04 12:12:37 -07:00
committed by Todd Gamblin
parent 296a349d49
commit ee6eb508cb
12 changed files with 145 additions and 77 deletions

View File

@@ -2026,8 +2026,8 @@ The last element of a package is its ``install()`` method. This is
where the real work of installation happens, and it's the main part of
the package you'll need to customize for each piece of software.
.. literalinclude:: ../../../var/spack/repos/builtin/packages/libelf/package.py
:pyobject: Libelf.install
.. literalinclude:: ../../../var/spack/repos/builtin/packages/libpng/package.py
:pyobject: Libpng.install
:linenos:
``install`` takes a ``spec``: a description of how the package should

View File

@@ -24,7 +24,11 @@
##############################################################################
import inspect
import os
import os.path
import shutil
from subprocess import PIPE
from subprocess import check_call
import llnl.util.tty as tty
from spack.package import PackageBase
@@ -46,6 +50,79 @@ class AutotoolsPackage(PackageBase):
# To be used in UI queries that require to know which
# build-system class we are using
build_system_class = 'AutotoolsPackage'
patch_config_guess = True
def do_patch_config_guess(self):
"""Some packages ship with an older config.guess and need to have
this updated when installed on a newer architecture."""
my_config_guess = None
config_guess = None
if os.path.exists('config.guess'):
# First search the top-level source directory
my_config_guess = 'config.guess'
else:
# Then search in all sub directories.
# We would like to use AC_CONFIG_AUX_DIR, but not all packages
# ship with their configure.in or configure.ac.
d = '.'
dirs = [os.path.join(d, o) for o in os.listdir(d)
if os.path.isdir(os.path.join(d, o))]
for dirname in dirs:
path = os.path.join(dirname, 'config.guess')
if os.path.exists(path):
my_config_guess = path
if my_config_guess is not None:
try:
check_call([my_config_guess], stdout=PIPE, stderr=PIPE)
# The package's config.guess already runs OK, so just use it
return True
except:
pass
# Look for a spack-installed automake package
if 'automake' in self.spec:
automake_path = os.path.join(self.spec['automake'].prefix, 'share',
'automake-' +
str(self.spec['automake'].version))
path = os.path.join(automake_path, 'config.guess')
if os.path.exists(path):
config_guess = path
if config_guess is not None:
try:
check_call([config_guess], stdout=PIPE, stderr=PIPE)
shutil.copyfile(config_guess, my_config_guess)
return True
except:
pass
# Look for the system's config.guess
if os.path.exists('/usr/share'):
automake_dir = [s for s in os.listdir('/usr/share') if
"automake" in s]
if automake_dir:
automake_path = os.path.join('/usr/share', automake_dir[0])
path = os.path.join(automake_path, 'config.guess')
if os.path.exists(path):
config_guess = path
if config_guess is not None:
try:
check_call([config_guess], stdout=PIPE, stderr=PIPE)
shutil.copyfile(config_guess, my_config_guess)
return True
except:
pass
return False
def patch(self):
"""Perform any required patches."""
if self.patch_config_guess and self.spec.satisfies(
'arch=linux-redhat7-ppc64le'):
if not self.do_patch_config_guess():
raise RuntimeError('Failed to find suitable config.guess')
def autoreconf(self, spec, prefix):
"""Not needed usually, configure should be already there"""