diff options
author | Gregory Lee <lee218@llnl.gov> | 2016-11-04 12:12:37 -0700 |
---|---|---|
committer | Todd Gamblin <tgamblin@llnl.gov> | 2016-11-04 12:12:37 -0700 |
commit | ee6eb508cbaf6e34643bec8fd2759149b48b92cc (patch) | |
tree | 2c5204e2f42af9160298aca5e3e9d3ed90ce843c | |
parent | 296a349d49f552b222120053eee227ccb14d0b7d (diff) | |
download | spack-ee6eb508cbaf6e34643bec8fd2759149b48b92cc.tar.gz spack-ee6eb508cbaf6e34643bec8fd2759149b48b92cc.tar.bz2 spack-ee6eb508cbaf6e34643bec8fd2759149b48b92cc.tar.xz spack-ee6eb508cbaf6e34643bec8fd2759149b48b92cc.zip |
patch older config.guess for newer architectures (#2221)
-rw-r--r-- | lib/spack/docs/packaging_guide.rst | 4 | ||||
-rw-r--r-- | lib/spack/spack/build_systems/autotools.py | 77 | ||||
-rw-r--r-- | var/spack/repos/builtin/packages/cairo/package.py | 12 | ||||
-rw-r--r-- | var/spack/repos/builtin/packages/dyninst/package.py | 35 | ||||
-rw-r--r-- | var/spack/repos/builtin/packages/fontconfig/package.py | 12 | ||||
-rw-r--r-- | var/spack/repos/builtin/packages/graphviz/package.py | 19 | ||||
-rw-r--r-- | var/spack/repos/builtin/packages/libelf/package.py | 18 | ||||
-rw-r--r-- | var/spack/repos/builtin/packages/libiconv/package.py | 15 | ||||
-rw-r--r-- | var/spack/repos/builtin/packages/libtiff/package.py | 8 | ||||
-rw-r--r-- | var/spack/repos/builtin/packages/lzma/package.py | 10 | ||||
-rw-r--r-- | var/spack/repos/builtin/packages/py-pygobject/package.py | 6 | ||||
-rw-r--r-- | var/spack/repos/builtin/packages/py-pygtk/package.py | 6 |
12 files changed, 145 insertions, 77 deletions
diff --git a/lib/spack/docs/packaging_guide.rst b/lib/spack/docs/packaging_guide.rst index bf5763f4f8..a22fcd71ba 100644 --- a/lib/spack/docs/packaging_guide.rst +++ b/lib/spack/docs/packaging_guide.rst @@ -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 diff --git a/lib/spack/spack/build_systems/autotools.py b/lib/spack/spack/build_systems/autotools.py index 0bb5576708..8535c9d3e3 100644 --- a/lib/spack/spack/build_systems/autotools.py +++ b/lib/spack/spack/build_systems/autotools.py @@ -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""" diff --git a/var/spack/repos/builtin/packages/cairo/package.py b/var/spack/repos/builtin/packages/cairo/package.py index b2911e126a..12c7838f63 100644 --- a/var/spack/repos/builtin/packages/cairo/package.py +++ b/var/spack/repos/builtin/packages/cairo/package.py @@ -25,7 +25,7 @@ from spack import * -class Cairo(Package): +class Cairo(AutotoolsPackage): """Cairo is a 2D graphics library with support for multiple output devices.""" homepage = "http://cairographics.org" @@ -40,9 +40,7 @@ class Cairo(Package): depends_on("pkg-config", type="build") depends_on("fontconfig@2.10.91:") # Require newer version of fontconfig. - def install(self, spec, prefix): - configure("--prefix=%s" % prefix, - "--disable-trace", # can cause problems with libiberty - "--enable-tee") - make() - make("install") + def configure_args(self): + args = ["--disable-trace", # can cause problems with libiberty + "--enable-tee"] + return args diff --git a/var/spack/repos/builtin/packages/dyninst/package.py b/var/spack/repos/builtin/packages/dyninst/package.py index 3df7ca551d..420ab0fc68 100644 --- a/var/spack/repos/builtin/packages/dyninst/package.py +++ b/var/spack/repos/builtin/packages/dyninst/package.py @@ -33,6 +33,13 @@ class Dyninst(Package): url = "https://github.com/dyninst/dyninst/archive/v9.2.0.tar.gz" list_url = "http://www.dyninst.org/downloads/dyninst-8.x" + # version 9.2.1b was the latest git commit when trying to port to a + # ppc64le system to get fixes in computeAddrWidth independent of + # endianness. This version can be removed if the next release includes + # this change. The actual commit was + # b8596ad4023ec40ac07e669ff8ea3ec06e262703 + version('9.2.1b', git='https://github.com/dyninst/dyninst.git', + commit='859cb778e20b619443c943c96dd1851da763142b') version('9.2.0', 'ad023f85e8e57837ed9de073b59d6bab', url="https://github.com/dyninst/dyninst/archive/v9.2.0.tar.gz") version('9.1.0', '5c64b77521457199db44bec82e4988ac', @@ -67,19 +74,21 @@ class Dyninst(Package): libdwarf = spec['libdwarf'].prefix with working_dir('spack-build', create=True): - cmake('..', - '-DBoost_INCLUDE_DIR=%s' % spec['boost'].prefix.include, - '-DBoost_LIBRARY_DIR=%s' % spec['boost'].prefix.lib, - '-DBoost_NO_SYSTEM_PATHS=TRUE', - '-DLIBELF_INCLUDE_DIR=%s' % join_path( - libelf.include, 'libelf'), - '-DLIBELF_LIBRARIES=%s' % join_path( - libelf.lib, 'libelf.so'), - '-DLIBDWARF_INCLUDE_DIR=%s' % libdwarf.include, - '-DLIBDWARF_LIBRARIES=%s' % join_path( - libdwarf.lib, 'libdwarf.so'), - *std_cmake_args) - + args = ['..', + '-DBoost_INCLUDE_DIR=%s' % spec['boost'].prefix.include, + '-DBoost_LIBRARY_DIR=%s' % spec['boost'].prefix.lib, + '-DBoost_NO_SYSTEM_PATHS=TRUE', + '-DLIBELF_INCLUDE_DIR=%s' % join_path( + libelf.include, 'libelf'), + '-DLIBELF_LIBRARIES=%s' % join_path( + libelf.lib, 'libelf.so'), + '-DLIBDWARF_INCLUDE_DIR=%s' % libdwarf.include, + '-DLIBDWARF_LIBRARIES=%s' % join_path( + libdwarf.lib, 'libdwarf.so')] + if spec.satisfies('arch=linux-redhat7-ppc64le'): + args.append('-Darch_ppc64_little_endian=1') + args += std_cmake_args + cmake(*args) make() make("install") diff --git a/var/spack/repos/builtin/packages/fontconfig/package.py b/var/spack/repos/builtin/packages/fontconfig/package.py index 311156378a..99c9b1f15d 100644 --- a/var/spack/repos/builtin/packages/fontconfig/package.py +++ b/var/spack/repos/builtin/packages/fontconfig/package.py @@ -25,7 +25,7 @@ from spack import * -class Fontconfig(Package): +class Fontconfig(AutotoolsPackage): """Fontconfig customizing font access""" homepage = "http://www.freedesktop.org/wiki/Software/fontconfig/" url = "http://www.freedesktop.org/software/fontconfig/release/fontconfig-2.11.1.tar.gz" @@ -36,10 +36,6 @@ class Fontconfig(Package): depends_on('libxml2') depends_on('pkg-config', type='build') - def install(self, spec, prefix): - configure("--prefix=%s" % prefix, - "--enable-libxml2", - "--disable-docs") - - make() - make("install") + def configure_args(self): + args = ["--enable-libxml2", "--disable-docs"] + return args diff --git a/var/spack/repos/builtin/packages/graphviz/package.py b/var/spack/repos/builtin/packages/graphviz/package.py index b37121248c..bb23513d2f 100644 --- a/var/spack/repos/builtin/packages/graphviz/package.py +++ b/var/spack/repos/builtin/packages/graphviz/package.py @@ -24,9 +24,10 @@ ############################################################################## from spack import * import sys +import shutil -class Graphviz(Package): +class Graphviz(AutotoolsPackage): """Graph Visualization Software""" homepage = "http://www.graphviz.org" url = "http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.38.0.tar.gz" @@ -46,11 +47,13 @@ class Graphviz(Package): depends_on("swig") depends_on("python") depends_on("ghostscript") + depends_on("freetype") + depends_on("libtool", type='build') depends_on("pkg-config", type='build') - def install(self, spec, prefix): - options = ['--prefix=%s' % prefix] - if '+perl' not in spec: + def configure_args(self): + options = [] + if '+perl' not in self.spec: options.append('--disable-perl') # On OSX fix the compiler error: @@ -59,7 +62,9 @@ class Graphviz(Package): # include <X11/Xlib.h> if sys.platform == 'darwin': options.append('CFLAGS=-I/opt/X11/include') + options.append('--with-ltdl-lib=%s/lib' % self.spec['libtool'].prefix) - configure(*options) - make() - make("install") + # A hack to patch config.guess in the libltdl sub directory + shutil.copyfile('./config/config.guess', 'libltdl/config/config.guess') + + return options diff --git a/var/spack/repos/builtin/packages/libelf/package.py b/var/spack/repos/builtin/packages/libelf/package.py index 3304d27bdb..000b4e0957 100644 --- a/var/spack/repos/builtin/packages/libelf/package.py +++ b/var/spack/repos/builtin/packages/libelf/package.py @@ -25,7 +25,7 @@ from spack import * -class Libelf(Package): +class Libelf(AutotoolsPackage): """libelf lets you read, modify or create ELF object files in an architecture-independent way. The library takes care of size and endian issues, e.g. you can process a file for SPARC @@ -38,13 +38,13 @@ class Libelf(Package): version('0.8.12', 'e21f8273d9f5f6d43a59878dc274fec7') provides('elf') + depends_on('automake', type='build') - def install(self, spec, prefix): - configure("--prefix=" + prefix, - "--enable-shared", - "--disable-dependency-tracking", - "--disable-debug") - make() + def configure_args(self): + args = ["--enable-shared", + "--disable-dependency-tracking", + "--disable-debug"] + return args - # The mkdir commands in libelf's install can fail in parallel - make("install", parallel=False) + def install(self, spec, prefix): + make('install', parallel=False) diff --git a/var/spack/repos/builtin/packages/libiconv/package.py b/var/spack/repos/builtin/packages/libiconv/package.py index 982929b80a..72f67ec80d 100644 --- a/var/spack/repos/builtin/packages/libiconv/package.py +++ b/var/spack/repos/builtin/packages/libiconv/package.py @@ -23,9 +23,10 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## from spack import * +import shutil -class Libiconv(Package): +class Libiconv(AutotoolsPackage): """GNU libiconv provides an implementation of the iconv() function and the iconv program for character set conversion.""" @@ -38,10 +39,10 @@ class Libiconv(Package): # of C11 any more and thus might not exist. patch("gets.patch") - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix), - '--enable-extra-encodings') + def configure_args(self): + args = ['--enable-extra-encodings'] - make() - make('check') - make('install') + # A hack to patch config.guess in the libcharset sub directory + shutil.copyfile('./build-aux/config.guess', + 'libcharset/build-aux/config.guess') + return args diff --git a/var/spack/repos/builtin/packages/libtiff/package.py b/var/spack/repos/builtin/packages/libtiff/package.py index 6c282dee7c..70c371b3b8 100644 --- a/var/spack/repos/builtin/packages/libtiff/package.py +++ b/var/spack/repos/builtin/packages/libtiff/package.py @@ -25,7 +25,7 @@ from spack import * -class Libtiff(Package): +class Libtiff(AutotoolsPackage): """libtiff graphics format library""" homepage = "http://www.simplesystems.org/libtiff/" url = "ftp://download.osgeo.org/libtiff/tiff-4.0.3.tar.gz" @@ -36,9 +36,3 @@ class Libtiff(Package): depends_on('jpeg') depends_on('zlib') depends_on('xz') - - def install(self, spec, prefix): - configure("--prefix=%s" % prefix) - - make() - make("install") diff --git a/var/spack/repos/builtin/packages/lzma/package.py b/var/spack/repos/builtin/packages/lzma/package.py index 23d697ffe8..3eb97a2d9f 100644 --- a/var/spack/repos/builtin/packages/lzma/package.py +++ b/var/spack/repos/builtin/packages/lzma/package.py @@ -25,7 +25,7 @@ from spack import * -class Lzma(Package): +class Lzma(AutotoolsPackage): """LZMA Utils are legacy data compression software with high compression ratio. LZMA Utils are no longer developed, although critical bugs may be fixed as long as fixing them doesn't require huge changes to the code. @@ -39,11 +39,3 @@ class Lzma(Package): url = "http://tukaani.org/lzma/lzma-4.32.7.tar.gz" version('4.32.7', '2a748b77a2f8c3cbc322dbd0b4c9d06a') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - if self.run_tests: - make('check') # one of the tests fails for me - make('install') diff --git a/var/spack/repos/builtin/packages/py-pygobject/package.py b/var/spack/repos/builtin/packages/py-pygobject/package.py index 3af849e758..675eb8f004 100644 --- a/var/spack/repos/builtin/packages/py-pygobject/package.py +++ b/var/spack/repos/builtin/packages/py-pygobject/package.py @@ -25,7 +25,7 @@ from spack import * -class PyPygobject(Package): +class PyPygobject(AutotoolsPackage): """bindings for the GLib, and GObject, to be used in Python.""" @@ -43,6 +43,4 @@ class PyPygobject(Package): patch('pygobject-2.28.6-introspection-1.patch') def install(self, spec, prefix): - configure("--prefix=%s" % prefix) - make() - make("install", parallel=False) + make('install', parallel=False) diff --git a/var/spack/repos/builtin/packages/py-pygtk/package.py b/var/spack/repos/builtin/packages/py-pygtk/package.py index ab0a139f02..56e0b39fd5 100644 --- a/var/spack/repos/builtin/packages/py-pygtk/package.py +++ b/var/spack/repos/builtin/packages/py-pygtk/package.py @@ -25,7 +25,7 @@ from spack import * -class PyPygtk(Package): +class PyPygtk(AutotoolsPackage): """bindings for the Gtk in Python""" homepage = "http://www.pygtk.org/" url = "http://ftp.gnome.org/pub/GNOME/sources/pygtk/2.24/pygtk-2.24.0.tar.gz" @@ -41,6 +41,4 @@ class PyPygtk(Package): depends_on('py-py2cairo') def install(self, spec, prefix): - configure("--prefix=%s" % prefix) - make() - make("install", parallel=False) + make('install', parallel=False) |