diff --git a/lib/spack/docs/packaging_guide.rst b/lib/spack/docs/packaging_guide.rst
index bf5763f4f8cdaa91f76d4a987811a8e91d596a1d..a22fcd71bae7530d4b1f122c93a9b31a4297d64a 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 0bb5576708c7388dad7312803740a2c021d71a8e..8535c9d3e3126d472867ecd49693122ffb1c2b26 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 b2911e126a2343f817a320f64990b5c7974b3699..12c7838f63669733eeeb3977d7dbf027a34b746b 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 3df7ca551dbc84077298dfbde3004b03c49035fc..420ab0fc68cbf25fec343789e2cee315b71c491f 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 @@ def install(self, spec, prefix):
         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 311156378a5e794846d7c79299f5a1a622de93a5..99c9b1f15d0e216102d6ec85acd447ea2921602e 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 b37121248c75a78fd588aece24f00deccdcf68ce..bb23513d2f8aea77d7b750b46a98392600ca37cf 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 @@ def install(self, spec, prefix):
         #       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 3304d27bdb0b263ec45004a553ac20b807f8c3c7..000b4e095782574b60eb243b8666634a799e14b1 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 982929b80a5596256270964294a088c4291f7674..72f67ec80d5902efcf11d7917bad5d5b7c73b287 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 6c282dee7cbbbffdb3a89ddee8db0e5661c090f2..70c371b3b817ce955827c08f4eec59ec9de14448 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 23d697ffe8cbcbd50746e13773e36d6804b6825d..3eb97a2d9f054d6d98252006a0fdf8db18332734 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 3af849e7582205bd6c9cef78398990cf6b5bb19f..675eb8f004dfd640638407a25d28b34f8f2e86f8 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 ab0a139f02dd2422a7573fbf8b6d03842d6306ee..56e0b39fd57ce19baa8435c8b9abf0bca3100ebb 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)