diff --git a/lib/spack/docs/packaging_guide.rst b/lib/spack/docs/packaging_guide.rst
index 0f549e2957e1ded5d6949f0869c03a36f8517893..a0d0feabbd3bec8fc76788d612862bcf02b5e3a9 100644
--- a/lib/spack/docs/packaging_guide.rst
+++ b/lib/spack/docs/packaging_guide.rst
@@ -1286,6 +1286,31 @@ command line to find installed packages or to install packages with
 particular constraints, and package authors can use specs to describe
 relationships between packages.
 
+Additionally, dependencies may be specified for specific use cases:
+
+.. code-block:: python
+
+    depends_on("cmake", type="build")
+    depends_on("libelf", type=("build", "link"))
+    depends_on("python", type="run")
+
+The dependency types are:
+
+  * **"build"**: made available during the project's build. The package will
+    be added to ``PATH``, the compiler include paths, and ``PYTHONPATH``.
+    Other projects which depend on this one will not have these modified
+    (building project X doesn't need project Y's build dependencies).
+  * **"link"**: the project is linked to by the project. The package will be
+    added to the current package's ``rpath``.
+  * **"run"**: the project is used by the project at runtime. The package will
+    be added to ``PATH`` and ``PYTHONPATH``.
+
+If not specified, ``type`` is assumed to be ``("build", "link")``. This is the
+common case for compiled language usage. Also available are the aliases
+``alldeps`` for all dependency types and ``nolink`` (``("build", "run")``) for
+use by dependencies which are not expressed via a linker (e.g., Python or Lua
+module loading).
+
 .. _setup-dependent-environment:
 
 ``setup_dependent_environment()``
diff --git a/lib/spack/spack/__init__.py b/lib/spack/spack/__init__.py
index 20c9934704ca1d5acfd73351ba61910e10e05cb2..d67585aac49843a2ca88d1fa160e1ee8fdd94f48 100644
--- a/lib/spack/spack/__init__.py
+++ b/lib/spack/spack/__init__.py
@@ -177,10 +177,11 @@
 #       should live.  This file is overloaded for spack core vs. for packages.
 #
 __all__ = ['Package', 'StagedPackage', 'CMakePackage', \
-    'Version', 'when', 'ver']
+    'Version', 'when', 'ver', 'alldeps', 'nolink']
 from spack.package import Package, ExtensionConflictError
 from spack.package import StagedPackage, CMakePackage
 from spack.version import Version, ver
+from spack.spec import DependencySpec, alldeps, nolink
 from spack.multimethod import when
 
 import llnl.util.filesystem
diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py
index fe5186a7d7f1a81e72622145df6dd9f584bdad9f..93fb0690f7ff70498847cb851bb3ea8d0fee36d8 100644
--- a/lib/spack/spack/build_environment.py
+++ b/lib/spack/spack/build_environment.py
@@ -254,7 +254,8 @@ def set_build_environment_variables(pkg, env, dirty=False):
     env.set_path(SPACK_ENV_PATH, env_paths)
 
     # Prefixes of all of the package's dependencies go in SPACK_DEPENDENCIES
-    dep_prefixes = [d.prefix for d in pkg.spec.traverse(root=False)]
+    dep_prefixes = [d.prefix
+                    for d in pkg.spec.traverse(root=False, deptype='build')]
     env.set_path(SPACK_DEPENDENCIES, dep_prefixes)
     # Add dependencies to CMAKE_PREFIX_PATH
     env.set_path('CMAKE_PREFIX_PATH', dep_prefixes)
@@ -337,10 +338,6 @@ def set_module_variables_for_package(pkg, module):
     # Don't use which for this; we want to find it in the current dir.
     m.configure = Executable('./configure')
 
-    # TODO: shouldn't really use "which" here.  Consider adding notion
-    # TODO: of build dependencies, as opposed to link dependencies.
-    # TODO: Currently, everything is a link dependency, but tools like
-    # TODO: this shouldn't be.
     m.cmake = Executable('cmake')
     m.ctest = Executable('ctest')
 
@@ -388,9 +385,10 @@ def set_module_variables_for_package(pkg, module):
 def get_rpaths(pkg):
     """Get a list of all the rpaths for a package."""
     rpaths = [pkg.prefix.lib, pkg.prefix.lib64]
-    rpaths.extend(d.prefix.lib for d in pkg.spec.dependencies.values()
+    deps = pkg.spec.dependencies(deptype='link')
+    rpaths.extend(d.prefix.lib for d in deps
                   if os.path.isdir(d.prefix.lib))
-    rpaths.extend(d.prefix.lib64 for d in pkg.spec.dependencies.values()
+    rpaths.extend(d.prefix.lib64 for d in deps
                   if os.path.isdir(d.prefix.lib64))
     # Second module is our compiler mod name. We use that to get rpaths from
     # module show output.
@@ -449,7 +447,7 @@ def setup_package(pkg, dirty=False):
     load_external_modules(pkg)
     # traverse in postorder so package can use vars from its dependencies
     spec = pkg.spec
-    for dspec in pkg.spec.traverse(order='post', root=False):
+    for dspec in pkg.spec.traverse(order='post', root=False, deptype='build'):
         # If a user makes their own package repo, e.g.
         # spack.repos.mystuff.libelf.Libelf, and they inherit from
         # an existing class like spack.repos.original.libelf.Libelf,
diff --git a/lib/spack/spack/cmd/fetch.py b/lib/spack/spack/cmd/fetch.py
index e40caaa23477dbd5ba16755dae66cd4892edb189..1afc51d9faef8b901f1ecbef28d1fb8b9585fbca 100644
--- a/lib/spack/spack/cmd/fetch.py
+++ b/lib/spack/spack/cmd/fetch.py
@@ -51,7 +51,7 @@ def fetch(parser, args):
     for spec in specs:
         if args.missing or args.dependencies:
             to_fetch = set()
-            for s in spec.traverse():
+            for s in spec.traverse(deptype_query=spack.alldeps):
                 package = spack.repo.get(s)
                 if args.missing and package.installed:
                     continue
diff --git a/lib/spack/spack/cmd/info.py b/lib/spack/spack/cmd/info.py
index 64d0d20e243d8ed0feaaacdffc2b5242fdcfb9b0..5774034062cc4b8f20ce5c9fd6736c51f0216c9c 100644
--- a/lib/spack/spack/cmd/info.py
+++ b/lib/spack/spack/cmd/info.py
@@ -81,12 +81,14 @@ def print_text_info(pkg):
 
             print "    " + fmt % (name, default, desc)
 
-    print
-    print "Dependencies:"
-    if pkg.dependencies:
-        colify(pkg.dependencies, indent=4)
-    else:
-        print "    None"
+    for deptype in ('build', 'link', 'run'):
+        print
+        print "%s Dependencies:" % deptype.capitalize()
+        deps = pkg.dependencies(deptype)
+        if deps:
+            colify(deps, indent=4)
+        else:
+            print "    None"
 
     print
     print "Virtual packages: "
diff --git a/lib/spack/spack/cmd/mirror.py b/lib/spack/spack/cmd/mirror.py
index d5f7abe212a7499f8f23e61ea800c41c9fb81062..0cf682fc4fd4c887646e53860061b996e89f49f5 100644
--- a/lib/spack/spack/cmd/mirror.py
+++ b/lib/spack/spack/cmd/mirror.py
@@ -179,7 +179,7 @@ def mirror_create(args):
         new_specs = set()
         for spec in specs:
             spec.concretize()
-            for s in spec.traverse():
+            for s in spec.traverse(deptype_query=spack.alldeps):
                 new_specs.add(s)
         specs = list(new_specs)
 
diff --git a/lib/spack/spack/cmd/module.py b/lib/spack/spack/cmd/module.py
index 70da689b67109a974f2d976abf7fdb498967ca2e..55826d133c21396960665192e7868ffe5b736acf 100644
--- a/lib/spack/spack/cmd/module.py
+++ b/lib/spack/spack/cmd/module.py
@@ -87,7 +87,7 @@ def _find_modules(spec, modules_list):
             return
 
         if flags.recurse_dependencies:
-            for dep in spec.dependencies.values():
+            for dep in spec.dependencies():
                 _find_modules(dep, modules_list)
 
         mod = module_types[mtype](spec)
diff --git a/lib/spack/spack/cmd/package-list.py b/lib/spack/spack/cmd/package-list.py
index 6c5c4ae8c6353f11a5cff049b43517f0a93794ba..bc64c77eab4dfd8bfad89b18cde0eded8d768a92 100644
--- a/lib/spack/spack/cmd/package-list.py
+++ b/lib/spack/spack/cmd/package-list.py
@@ -80,11 +80,15 @@ def print_rst_package_list():
         if pkg.versions:
             print "Versions:"
             print "  " + ", ".join(str(v) for v in reversed(sorted(pkg.versions)))
-        if pkg.dependencies:
-            print "Dependencies"
-            print "  " + ", ".join("`%s`_" % d if d != "mpi" else d
-                                   for d in pkg.dependencies)
-            print
+
+        for deptype in ('build', 'link', 'run'):
+            deps = pkg.dependencies(deptype)
+            if deps:
+                print "%s Dependencies" % deptype.capitalize()
+                print "  " + ", ".join("`%s`_" % d if d != "mpi" else d
+                                       for d in build_deps)
+                print
+
         print "Description:"
         print pkg.format_doc(indent=2)
         print
diff --git a/lib/spack/spack/cmd/test-install.py b/lib/spack/spack/cmd/test-install.py
index 45592a7dda4a5a2f1b3fc77f229a5e434672b454..14c06d136d533fb7ae7d60ecc2d6c44b221055c1 100644
--- a/lib/spack/spack/cmd/test-install.py
+++ b/lib/spack/spack/cmd/test-install.py
@@ -133,7 +133,12 @@ def fetch_log(path):
 
 
 def failed_dependencies(spec):
-    return set(item for item in spec.dependencies.itervalues() if not spack.repo.get(item).installed)
+    def get_deps(deptype):
+        return set(item for item in spec.dependencies(deptype)
+                   if not spack.repo.get(item).installed)
+    link_deps = get_deps('link')
+    run_deps = get_deps('run')
+    return link_deps.union(run_deps)
 
 
 def get_top_spec_or_die(args):
diff --git a/lib/spack/spack/concretize.py b/lib/spack/spack/concretize.py
index d9992a56805e1cc16cfa7ba862ba3d28971a7624..386df08b2e5139721883fdc4d156001bfe102459 100644
--- a/lib/spack/spack/concretize.py
+++ b/lib/spack/spack/concretize.py
@@ -103,7 +103,7 @@ def cmp_externals(a, b):
         usable.sort(cmp=cmp_externals)
         return usable
 
-
+    # XXX(deptypes): Look here.
     def choose_virtual_or_external(self, spec):
         """Given a list of candidate virtual and external packages, try to
            find one that is most ABI compatible.
@@ -394,8 +394,10 @@ def find_spec(spec, condition):
     """Searches the dag from spec in an intelligent order and looks
        for a spec that matches a condition"""
     # First search parents, then search children
-    dagiter = chain(spec.traverse(direction='parents',  root=False),
-                    spec.traverse(direction='children', root=False))
+    deptype = ('build', 'link')
+    dagiter = chain(
+            spec.traverse(direction='parents',  deptype=deptype, root=False),
+            spec.traverse(direction='children', deptype=deptype, root=False))
     visited = set()
     for relative in dagiter:
         if condition(relative):
@@ -403,7 +405,7 @@ def find_spec(spec, condition):
         visited.add(id(relative))
 
     # Then search all other relatives in the DAG *except* spec
-    for relative in spec.root.traverse():
+    for relative in spec.root.traverse(deptypes=spack.alldeps):
         if relative is spec: continue
         if id(relative) in visited: continue
         if condition(relative):
diff --git a/lib/spack/spack/database.py b/lib/spack/spack/database.py
index a4bbff3d5a0dfeb47fc4252534d30724a4e7e427..c95abd74236210a68bfe007e9e24193f87e1eece 100644
--- a/lib/spack/spack/database.py
+++ b/lib/spack/spack/database.py
@@ -215,9 +215,14 @@ def _read_spec_from_yaml(self, hash_key, installs, parent_key=None):
         # Add dependencies from other records in the install DB to
         # form a full spec.
         if 'dependencies' in spec_dict[spec.name]:
-            for dep_hash in spec_dict[spec.name]['dependencies'].values():
+            for dep in spec_dict[spec.name]['dependencies'].values():
+                if type(dep) == tuple:
+                    dep_hash, deptypes = dep
+                else:
+                    dep_hash = dep
+                    deptypes = spack.alldeps
                 child = self._read_spec_from_yaml(dep_hash, installs, hash_key)
-                spec._add_dependency(child)
+                spec._add_dependency(child, deptypes)
 
         # Specs from the database need to be marked concrete because
         # they represent actual installations.
@@ -334,7 +339,10 @@ def _check_ref_counts(self):
         counts = {}
         for key, rec in self._data.items():
             counts.setdefault(key, 0)
-            for dep in rec.spec.dependencies.values():
+            # XXX(deptype): This checks all dependencies, but build
+            #               dependencies might be able to be dropped in the
+            #               future.
+            for dep in rec.spec.dependencies():
                 dep_key = dep.dag_hash()
                 counts.setdefault(dep_key, 0)
                 counts[dep_key] += 1
@@ -406,7 +414,7 @@ def _add(self, spec, path, directory_layout=None, explicit=False):
         else:
             self._data[key] = InstallRecord(spec, path, True,
                                             explicit=explicit)
-            for dep in spec.dependencies.values():
+            for dep in spec.dependencies(('link', 'run')):
                 self._increment_ref_count(dep, directory_layout)
 
     def _increment_ref_count(self, spec, directory_layout=None):
@@ -421,7 +429,7 @@ def _increment_ref_count(self, spec, directory_layout=None):
 
             self._data[key] = InstallRecord(spec.copy(), path, installed)
 
-            for dep in spec.dependencies.values():
+            for dep in spec.dependencies('link'):
                 self._increment_ref_count(dep)
 
         self._data[key].ref_count += 1
@@ -466,7 +474,7 @@ def _decrement_ref_count(self, spec):
 
         if rec.ref_count == 0 and not rec.installed:
             del self._data[key]
-            for dep in spec.dependencies.values():
+            for dep in spec.dependencies('link'):
                 self._decrement_ref_count(dep)
 
     def _remove(self, spec):
@@ -480,7 +488,7 @@ def _remove(self, spec):
             return rec.spec
 
         del self._data[key]
-        for dep in rec.spec.dependencies.values():
+        for dep in rec.spec.dependencies('link'):
             self._decrement_ref_count(dep)
 
         # Returns the concrete spec so we know it in the case where a
diff --git a/lib/spack/spack/directives.py b/lib/spack/spack/directives.py
index ca8f21dc088e263110c28367ea4568989dd7ef2f..88d2aaf4728ec50193983c7b6322ef4c1206171f 100644
--- a/lib/spack/spack/directives.py
+++ b/lib/spack/spack/directives.py
@@ -171,7 +171,7 @@ def version(pkg, ver, checksum=None, **kwargs):
     pkg.versions[Version(ver)] = kwargs
 
 
-def _depends_on(pkg, spec, when=None):
+def _depends_on(pkg, spec, when=None, type=None):
     # If when is False do nothing
     if when is False:
         return
@@ -180,10 +180,29 @@ def _depends_on(pkg, spec, when=None):
         when = pkg.name
     when_spec = parse_anonymous_spec(when, pkg.name)
 
+    if type is None:
+        # The default deptype is build and link because the common case is to
+        # build against a library which then turns into a runtime dependency
+        # due to the linker.
+        # XXX(deptype): Add 'run' to this? It's an uncommon dependency type,
+        #               but is most backwards-compatible.
+        type = ('build', 'link')
+
+    if isinstance(type, str):
+        type = (type,)
+
+    for deptype in type:
+        if deptype not in spack.spec.alldeps:
+            raise UnknownDependencyTypeError('depends_on', pkg.name, deptype)
+
     dep_spec = Spec(spec)
     if pkg.name == dep_spec.name:
         raise CircularReferenceError('depends_on', pkg.name)
 
+    pkg_deptypes = pkg._deptypes.setdefault(dep_spec.name, set())
+    for deptype in type:
+        pkg_deptypes.add(deptype)
+
     conditions = pkg.dependencies.setdefault(dep_spec.name, {})
     if when_spec in conditions:
         conditions[when_spec].constrain(dep_spec, deps=False)
@@ -191,13 +210,13 @@ def _depends_on(pkg, spec, when=None):
         conditions[when_spec] = dep_spec
 
 
-@directive('dependencies')
-def depends_on(pkg, spec, when=None):
+@directive(('dependencies', '_deptypes'))
+def depends_on(pkg, spec, when=None, type=None):
     """Creates a dict of deps with specs defining when they apply."""
-    _depends_on(pkg, spec, when=when)
+    _depends_on(pkg, spec, when=when, type=type)
 
 
-@directive(('extendees', 'dependencies'))
+@directive(('extendees', 'dependencies', '_deptypes'))
 def extends(pkg, spec, **kwargs):
     """Same as depends_on, but dependency is symlinked into parent prefix.
 
@@ -326,3 +345,13 @@ def __init__(self, directive, package):
             directive,
             "Package '%s' cannot pass itself to %s" % (package, directive))
         self.package = package
+
+
+class UnknownDependencyTypeError(DirectiveError):
+    """This is raised when a dependency is of an unknown type."""
+    def __init__(self, directive, package, deptype):
+        super(UnknownDependencyTypeError, self).__init__(
+            directive,
+            "Package '%s' cannot depend on a package via %s." %
+                (package, deptype))
+        self.package = package
diff --git a/lib/spack/spack/directory_layout.py b/lib/spack/spack/directory_layout.py
index ee13e2dcbcb51109f3431a36244c0c440f17d780..a5e76043ada4d94398917725243d715d49f3e79b 100644
--- a/lib/spack/spack/directory_layout.py
+++ b/lib/spack/spack/directory_layout.py
@@ -285,7 +285,7 @@ def check_installed(self, spec):
             return path
 
         if spec.dag_hash() == installed_spec.dag_hash():
-            raise SpecHashCollisionError(installed_hash, spec_hash)
+            raise SpecHashCollisionError(spec, installed_spec)
         else:
             raise InconsistentInstallDirectoryError(
                 'Spec file in %s does not match hash!' % spec_file_path)
@@ -431,7 +431,7 @@ class SpecHashCollisionError(DirectoryLayoutError):
     def __init__(self, installed_spec, new_spec):
         super(SpecHashCollisionError, self).__init__(
             'Specs %s and %s have the same SHA-1 prefix!'
-            % installed_spec, new_spec)
+            % (installed_spec, new_spec))
 
 
 class RemoveFailedError(DirectoryLayoutError):
diff --git a/lib/spack/spack/graph.py b/lib/spack/spack/graph.py
index 22058d41d89d6d3224d7fd45be4d8a4df9994956..063e4647b60c6b8ec5580fef1a6c7abd76ce8015 100644
--- a/lib/spack/spack/graph.py
+++ b/lib/spack/spack/graph.py
@@ -80,12 +80,14 @@ def topological_sort(spec, **kwargs):
 
     """
     reverse = kwargs.get('reverse', False)
+    # XXX(deptype): iterate over a certain kind of dependency. Maybe color
+    #               edges based on the type of dependency?
     if not reverse:
-        parents  = lambda s: s.dependents
-        children = lambda s: s.dependencies
+        parents = lambda s: s.dependents()
+        children = lambda s: s.dependencies()
     else:
-        parents  = lambda s: s.dependencies
-        children = lambda s: s.dependents
+        parents = lambda s: s.dependencies()
+        children = lambda s: s.dependents()
 
     # Work on a copy so this is nondestructive.
     spec = spec.copy()
diff --git a/lib/spack/spack/modules.py b/lib/spack/spack/modules.py
index ce46047fa3f6042e2f4627ecde56ea5c5c5ee376..a2e528d295abfdcb308c263792771ec4c0b22808 100644
--- a/lib/spack/spack/modules.py
+++ b/lib/spack/spack/modules.py
@@ -120,7 +120,7 @@ def dependencies(spec, request='all'):
         return []
 
     if request == 'direct':
-        return [xx for _, xx in spec.dependencies.items()]
+        return spec.dependencies()
 
     # FIXME : during module file creation nodes seem to be visited multiple
     # FIXME : times even if cover='nodes' is given. This work around permits
diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py
index 74008c4dd987157d9cce5fc7555686a1fd764f39..7f53b461b2942647ea87b1a3b898fab01b42c57f 100644
--- a/lib/spack/spack/package.py
+++ b/lib/spack/spack/package.py
@@ -577,7 +577,7 @@ def extendee_spec(self):
         name = next(iter(self.extendees))
 
         # If the extendee is in the spec's deps already, return that.
-        for dep in self.spec.traverse():
+        for dep in self.spec.traverse(deptypes=('link', 'run')):
             if name == dep.name:
                 return dep
 
@@ -642,12 +642,13 @@ def preorder_traversal(self, visited=None, **kwargs):
             yield self
 
         for name in sorted(self.dependencies.keys()):
-            spec = self.dependencies[name]
+            dep_spec = self.get_dependency(name)
+            spec = dep_spec.spec
 
-            # currently, we do not descend into virtual dependencies, as this
+            # Currently, we do not descend into virtual dependencies, as this
             # makes doing a sensible traversal much harder.  We just assume
             # that ANY of the virtual deps will work, which might not be true
-            # (due to conflicts or unsatisfiable specs).  For now this is ok
+            # (due to conflicts or unsatisfiable specs).  For now this is ok,
             # but we might want to reinvestigate if we start using a lot of
             # complicated virtual dependencies
             # TODO: reinvestigate this.
@@ -685,7 +686,9 @@ def installed_dependents(self):
         for spec in spack.installed_db.query():
             if self.name == spec.name:
                 continue
-            for dep in spec.traverse():
+            # XXX(deptype): Should build dependencies not count here?
+            #for dep in spec.traverse(deptype=('run')):
+            for dep in spec.traverse(deptype=spack.alldeps):
                 if self.spec == dep:
                     dependents.append(spec)
         return dependents
@@ -908,7 +911,7 @@ def do_install(self,
         run_tests   -- Runn tests within the package's install()
         """
         if not self.spec.concrete:
-            raise ValueError("Can only install concrete packages.")
+            raise ValueError("Can only install concrete packages: %s." % self.spec.name)
 
         # No installation needed if package is external
         if self.spec.external:
@@ -1089,7 +1092,7 @@ def check_paths(path_list, filetype, predicate):
 
     def do_install_dependencies(self, **kwargs):
         # Pass along paths of dependencies here
-        for dep in self.spec.dependencies.values():
+        for dep in self.spec.dependencies():
             dep.package.do_install(**kwargs)
 
     @property
@@ -1270,7 +1273,7 @@ def _sanity_check_extension(self):
                                   (self.name, self.extendee.name))
 
     def do_activate(self, force=False):
-        """Called on an etension to invoke the extendee's activate method.
+        """Called on an extension to invoke the extendee's activate method.
 
         Commands should call this routine, and should not call
         activate() directly.
@@ -1282,7 +1285,7 @@ def do_activate(self, force=False):
 
         # Activate any package dependencies that are also extensions.
         if not force:
-            for spec in self.spec.traverse(root=False):
+            for spec in self.spec.traverse(root=False, deptype='run'):
                 if spec.package.extends(self.extendee_spec):
                     if not spec.package.activated:
                         spec.package.do_activate(force=force)
@@ -1328,7 +1331,7 @@ def do_deactivate(self, **kwargs):
             for name, aspec in activated.items():
                 if aspec == self.spec:
                     continue
-                for dep in aspec.traverse():
+                for dep in aspec.traverse(deptype='run'):
                     if self.spec == dep:
                         raise ActivationError(
                             "Cannot deactivate %s because %s is activated and depends on it."  # NOQA: ignore=E501
@@ -1414,9 +1417,10 @@ def fetch_remote_versions(self):
     def rpath(self):
         """Get the rpath this package links with, as a list of paths."""
         rpaths = [self.prefix.lib, self.prefix.lib64]
-        rpaths.extend(d.prefix.lib for d in self.spec.traverse(root=False)
+        deps = self.spec.dependencies(deptype='link')
+        rpaths.extend(d.prefix.lib for d in deps
                       if os.path.isdir(d.prefix.lib))
-        rpaths.extend(d.prefix.lib64 for d in self.spec.traverse(root=False)
+        rpaths.extend(d.prefix.lib64 for d in deps
                       if os.path.isdir(d.prefix.lib64))
         return rpaths
 
diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py
index 77bc57147d52bcd76ca8e5c7570bd381add78368..d3a5f66e57c1379de17f0a206f09762f7583e5eb 100644
--- a/lib/spack/spack/spec.py
+++ b/lib/spack/spack/spec.py
@@ -155,6 +155,9 @@
    every time we call str()"""
 _any_version = VersionList([':'])
 
+alldeps = ('build', 'link', 'run')
+nolink = ('build', 'run')
+
 
 def index_specs(specs):
     """Take a list of specs and return a dict of lists.  Dict is
@@ -291,6 +294,27 @@ def __repr__(self):
         return str(self)
 
 
+@key_ordering
+class DependencySpec(object):
+    """
+    Dependencies have conditions in which they apply.
+
+    This stores both what is depended on and why it is a dependency.
+    """
+    def __init__(self, spec, deptypes):
+        self.spec = spec
+        self.deptypes = deptypes
+
+    def _cmp_key(self):
+        return self.spec
+
+    def copy(self):
+        return DependencySpec(self.spec.copy(), self.deptype)
+
+    def __str__(self):
+        return str(self.spec)
+
+
 @key_ordering
 class VariantSpec(object):
 
@@ -440,11 +464,11 @@ class DependencyMap(HashableMap):
        The DependencyMap is keyed by name. """
     @property
     def concrete(self):
-        return all(d.concrete for d in self.values())
+        return all(d.spec.concrete for d in self.values())
 
     def __str__(self):
         return ''.join(
-            ["^" + str(self[name]) for name in sorted(self.keys())])
+            ["^" + str(self[name].spec) for name in sorted(self.keys())])
 
 
 @key_ordering
@@ -472,13 +496,13 @@ def __init__(self, spec_like, *dep_like, **kwargs):
         # writes directly into this Spec object.
         other = spec_list[0]
         self.name = other.name
-        self.dependents = other.dependents
         self.versions = other.versions
         self.architecture = other.architecture
         self.compiler = other.compiler
         self.compiler_flags = other.compiler_flags
         self.compiler_flags.spec = self
-        self.dependencies = other.dependencies
+        self._dependencies = other._dependencies
+        self._dependents = other._dependents
         self.variants = other.variants
         self.variants.spec = self
         self.namespace = other.namespace
@@ -500,7 +524,49 @@ def __init__(self, spec_like, *dep_like, **kwargs):
         # Spec(a, b) will copy a but just add b as a dep.
         for dep in dep_like:
             spec = dep if isinstance(dep, Spec) else Spec(dep)
-            self._add_dependency(spec)
+            # XXX(deptype): default deptypes
+            self._add_dependency(spec, ('build', 'link'))
+
+    def get_dependency(self, name):
+        dep = self._dependencies.get(name)
+        if dep is not None:
+            return dep
+        raise InvalidDependencyException(
+            self.name + " does not depend on " + comma_or(name))
+
+    def _deptype_norm(self, deptype):
+        if deptype is None:
+            return alldeps
+        # Force deptype to be a set object so that we can do set intersections.
+        if isinstance(deptype, str):
+            return (deptype,)
+        return deptype
+
+    def _find_deps(self, where, deptype):
+        deptype = self._deptype_norm(deptype)
+
+        return [dep.spec
+                for dep in where.values()
+                if deptype and any(d in deptype for d in dep.deptypes)]
+
+    def dependencies(self, deptype=None):
+        return self._find_deps(self._dependencies, deptype)
+
+    def dependents(self, deptype=None):
+        return self._find_deps(self._dependents, deptype)
+
+    def _find_deps_dict(self, where, deptype):
+        deptype = self._deptype_norm(deptype)
+
+        return [(dep.spec.name, dep)
+                for dep in where.values()
+                if deptype and any(d in deptype for d in dep.deptypes)]
+
+    def dependencies_dict(self, deptype=None):
+        return dict(self._find_deps_dict(self._dependencies, deptype))
+
+    def dependents_dict(self, deptype=None):
+        return dict(self._find_deps_dict(self._dependents, deptype))
 
     #
     # Private routines here are called by the parser when building a spec.
@@ -609,13 +675,13 @@ def _set_target(self, value):
         if self.architecture.platform:
             self.architecture.target = self.architecture.platform.target(value)
 
-    def _add_dependency(self, spec):
+    def _add_dependency(self, spec, deptypes):
         """Called by the parser to add another spec as a dependency."""
-        if spec.name in self.dependencies:
+        if spec.name in self._dependencies:
             raise DuplicateDependencyError(
                 "Cannot depend on '%s' twice" % spec)
-        self.dependencies[spec.name] = spec
-        spec.dependents[self.name] = self
+        self._dependencies[spec.name] = DependencySpec(spec, deptypes)
+        spec._dependents[self.name] = DependencySpec(self, deptypes)
 
     #
     # Public interface
@@ -632,15 +698,15 @@ def root(self):
            installed).  This will throw an assertion error if that is not
            the case.
         """
-        if not self.dependents:
+        if not self._dependents:
             return self
 
         # If the spec has multiple dependents, ensure that they all
         # lead to the same place.  Spack shouldn't deal with any DAGs
         # with multiple roots, so something's wrong if we find one.
-        depiter = iter(self.dependents.values())
-        first_root = next(depiter).root
-        assert(all(first_root is d.root for d in depiter))
+        depiter = iter(self._dependents.values())
+        first_root = next(depiter).spec.root
+        assert(all(first_root is d.spec.root for d in depiter))
         return first_root
 
     @property
@@ -687,10 +753,21 @@ def concrete(self):
                               and self.architecture.concrete
                               and self.compiler and self.compiler.concrete
                               and self.compiler_flags.concrete
-                              and self.dependencies.concrete)
+                              and self._dependencies.concrete)
         return self._concrete
 
-    def traverse(self, visited=None, d=0, **kwargs):
+    def traverse(self, visited=None, deptype=None, **kwargs):
+        traversal = self.traverse_with_deptype(visited=visited,
+                                               deptype=deptype,
+                                               **kwargs)
+        if kwargs.get('depth', False):
+            return [(s[0], s[1].spec) for s in traversal]
+        else:
+            return [s.spec for s in traversal]
+
+    def traverse_with_deptype(self, visited=None, d=0, deptype=None,
+                              deptype_query=None, _self_deptype=None,
+                              **kwargs):
         """Generic traversal of the DAG represented by this spec.
            This will yield each node in the spec.  Options:
 
@@ -742,6 +819,12 @@ def traverse(self, visited=None, d=0, **kwargs):
         direction = kwargs.get('direction', 'children')
         order = kwargs.get('order', 'pre')
 
+        if deptype is None:
+            deptype = alldeps
+
+        if deptype_query is None:
+            deptype_query = ('link', 'run')
+
         # Make sure kwargs have legal values; raise ValueError if not.
         def validate(name, val, allowed_values):
             if val not in allowed_values:
@@ -759,30 +842,37 @@ def validate(name, val, allowed_values):
         if key in visited and cover == 'nodes':
             return
 
-        # Determine whether and what to yield for this node.
+        def return_val(res):
+            return (d, res) if depth else res
+
         yield_me = yield_root or d > 0
-        result = (d, self) if depth else self
 
         # Preorder traversal yields before successors
         if yield_me and order == 'pre':
-            yield result
+            yield return_val(DependencySpec(self, _self_deptype))
+
+        deps = self.dependencies_dict(deptype)
 
         # Edge traversal yields but skips children of visited nodes
         if not (key in visited and cover == 'edges'):
             # This code determines direction and yields the children/parents
-            successors = self.dependencies
+            successors = deps
             if direction == 'parents':
-                successors = self.dependents
+                successors = self.dependents_dict()
 
             visited.add(key)
             for name in sorted(successors):
                 child = successors[name]
-                for elt in child.traverse(visited, d + 1, **kwargs):
+                children = child.spec.traverse_with_deptype(
+                        visited, d=d + 1, deptype=deptype_query,
+                        deptype_query=deptype_query,
+                        _self_deptype=child.deptypes, **kwargs)
+                for elt in children:
                     yield elt
 
         # Postorder traversal yields after successors
         if yield_me and order == 'post':
-            yield result
+            yield return_val(DependencySpec(self, _self_deptype))
 
     @property
     def short_spec(self):
@@ -807,6 +897,7 @@ def dag_hash(self, length=None):
         if self._hash:
             return self._hash[:length]
         else:
+            # XXX(deptype): ignore 'build' dependencies here
             yaml_text = yaml.dump(
                 self.to_node_dict(), default_flow_style=True, width=sys.maxint)
             sha = hashlib.sha1(yaml_text)
@@ -819,11 +910,13 @@ def to_node_dict(self):
         params = dict((name, v.value) for name, v in self.variants.items())
         params.update(dict((name, value)
                       for name, value in self.compiler_flags.items()))
+        deps = self.dependencies_dict(deptype=('link', 'run'))
         d = {
-            'parameters' : params,
-            'arch' : self.architecture,
-            'dependencies' : dict((d, self.dependencies[d].dag_hash())
-                                  for d in sorted(self.dependencies))
+            'parameters': params,
+            'arch': self.architecture,
+            'dependencies': dict((d, (deps[d].spec.dag_hash(),
+                                      deps[d].deptypes))
+                                 for d in sorted(deps.keys()))
         }
 
         # Older concrete specs do not have a namespace.  Omit for
@@ -848,7 +941,7 @@ def to_node_dict(self):
 
     def to_yaml(self, stream=None):
         node_list = []
-        for s in self.traverse(order='pre'):
+        for s in self.traverse(order='pre', deptype=('link', 'run')):
             node = s.to_node_dict()
             node[s.name]['hash'] = s.dag_hash()
             node_list.append(node)
@@ -889,6 +982,11 @@ def from_node_dict(node):
             raise SpackRecordError(
                 "Did not find a valid format for variants in YAML file")
 
+        # XXX(deptypes): why are dependencies not meant to be read here?
+        #for name, dep_info in node['dependencies'].items():
+        #    (dag_hash, deptypes) = dep_info
+        #    spec._dependencies[name] = DependencySpec(dag_hash, deptypes)
+
         return spec
 
     @staticmethod
@@ -919,8 +1017,10 @@ def from_yaml(stream):
 
         for node in yfile['spec']:
             name = next(iter(node))
-            for dep_name in node[name]['dependencies']:
-                deps[name].dependencies[dep_name] = deps[dep_name]
+            for dep_name, (dep, deptypes) in \
+                    node[name]['dependencies'].items():
+                deps[name]._dependencies[dep_name] = \
+                        DependencySpec(deps[dep_name], deptypes)
         return spec
 
     def _concretize_helper(self, presets=None, visited=None):
@@ -940,8 +1040,9 @@ def _concretize_helper(self, presets=None, visited=None):
         changed = False
 
         # Concretize deps first -- this is a bottom-up process.
-        for name in sorted(self.dependencies.keys()):
-            changed |= self.dependencies[name]._concretize_helper(presets, visited)
+        for name in sorted(self._dependencies.keys()):
+            changed |= self._dependencies[
+                name].spec._concretize_helper(presets, visited)
 
         if self.name in presets:
             changed |= self.constrain(presets[self.name])
@@ -965,13 +1066,16 @@ def _concretize_helper(self, presets=None, visited=None):
     def _replace_with(self, concrete):
         """Replace this virtual spec with a concrete spec."""
         assert(self.virtual)
-        for name, dependent in self.dependents.items():
+        for name, dep_spec in self._dependents.items():
+            dependent = dep_spec.spec
+            deptypes = dep_spec.deptypes
+
             # remove self from all dependents.
-            del dependent.dependencies[self.name]
+            del dependent._dependencies[self.name]
 
             # add the replacement, unless it is already a dep of dependent.
-            if concrete.name not in dependent.dependencies:
-                dependent._add_dependency(concrete)
+            if concrete.name not in dependent._dependencies:
+                dependent._add_dependency(concrete, deptypes)
 
     def _replace_node(self, replacement):
         """Replace this spec with another.
@@ -982,13 +1086,15 @@ def _replace_node(self, replacement):
         to be normalized.
 
         """
-        for name, dependent in self.dependents.items():
-            del dependent.dependencies[self.name]
-            dependent._add_dependency(replacement)
+        for name, dep_spec in self._dependents.items():
+            dependent = dep_spec.spec
+            deptypes = dep_spec.deptypes
+            del dependent._dependencies[self.name]
+            dependent._add_dependency(replacement, deptypes)
 
-        for name, dep in self.dependencies.items():
-            del dep.dependents[self.name]
-            del self.dependencies[dep.name]
+        for name, dep_spec in self._dependencies.items():
+            del dep_spec.spec.dependents[self.name]
+            del self._dependencies[dep.name]
 
     def _expand_virtual_packages(self):
         """Find virtual packages in this spec, replace them with providers,
@@ -1008,13 +1114,14 @@ def _expand_virtual_packages(self):
               a problem.
         """
         # Make an index of stuff this spec already provides
+        # XXX(deptype): 'link' and 'run'?
         self_index = ProviderIndex(self.traverse(), restrict=True)
         changed = False
         done = False
 
         while not done:
             done = True
-
+            # XXX(deptype): 'link' and 'run'?
             for spec in list(self.traverse()):
                 replacement = None
                 if spec.virtual:
@@ -1054,10 +1161,10 @@ def _expand_virtual_packages(self):
 
                 # If replacement is external then trim the dependencies
                 if replacement.external or replacement.external_module:
-                    if (spec.dependencies):
+                    if (spec._dependencies):
                         changed = True
-                        spec.dependencies = DependencyMap()
-                    replacement.dependencies = DependencyMap()
+                        spec._dependencies = DependencyMap()
+                    replacement._dependencies = DependencyMap()
                     replacement.architecture = self.architecture
 
                 # TODO: could this and the stuff in _dup be cleaned up?
@@ -1068,7 +1175,7 @@ def feq(cfield, sfield):
                     feq(replacement.versions, spec.versions) and
                     feq(replacement.compiler, spec.compiler) and
                     feq(replacement.architecture, spec.architecture) and
-                    feq(replacement.dependencies, spec.dependencies) and
+                    feq(replacement._dependencies, spec._dependencies) and
                     feq(replacement.variants, spec.variants) and
                     feq(replacement.external, spec.external) and
                     feq(replacement.external_module, spec.external_module)):
@@ -1116,7 +1223,7 @@ def concretize(self):
             changed = any(changes)
             force = True
 
-        for s in self.traverse():
+        for s in self.traverse(deptype_query=alldeps):
             # After concretizing, assign namespaces to anything left.
             # Note that this doesn't count as a "change".  The repository
             # configuration is constant throughout a spack run, and
@@ -1146,7 +1253,7 @@ def _mark_concrete(self):
         Only for internal use -- client code should use "concretize"
         unless there is a need to force a spec to be concrete.
         """
-        for s in self.traverse():
+        for s in self.traverse(deptype_query=alldeps):
             s._normal = True
             s._concrete = True
 
@@ -1159,6 +1266,13 @@ def concretized(self):
         return clone
 
     def flat_dependencies(self, **kwargs):
+        flat_deps = DependencyMap()
+        flat_deps_deptypes = self.flat_dependencies_with_deptype(**kwargs)
+        for name, depspec in flat_deps_deptypes.items():
+            flat_deps[name] = depspec.spec
+        return flat_deps
+
+    def flat_dependencies_with_deptype(self, **kwargs):
         """Return a DependencyMap containing all of this spec's
            dependencies with their constraints merged.
 
@@ -1169,23 +1283,31 @@ def flat_dependencies(self, **kwargs):
            returns them.
         """
         copy = kwargs.get('copy', True)
+        deptype_query = kwargs.get('deptype_query')
 
         flat_deps = DependencyMap()
         try:
-            for spec in self.traverse(root=False):
+            deptree = self.traverse_with_deptype(root=False,
+                                                 deptype_query=deptype_query)
+            for depspec in deptree:
+                spec = depspec.spec
+                deptypes = depspec.deptypes
+
                 if spec.name not in flat_deps:
                     if copy:
-                        flat_deps[spec.name] = spec.copy(deps=False)
+                        dep_spec = DependencySpec(spec.copy(deps=False),
+                                                  deptypes)
                     else:
-                        flat_deps[spec.name] = spec
+                        dep_spec = DependencySpec(spec, deptypes)
+                    flat_deps[spec.name] = dep_spec
                 else:
-                    flat_deps[spec.name].constrain(spec)
+                    flat_deps[spec.name].spec.constrain(spec)
 
             if not copy:
-                for dep in flat_deps.values():
-                    dep.dependencies.clear()
-                    dep.dependents.clear()
-                self.dependencies.clear()
+                for depspec in flat_deps.values():
+                    depspec.spec._dependencies.clear()
+                    depspec.spec._dependents.clear()
+                self._dependencies.clear()
 
             return flat_deps
 
@@ -1200,17 +1322,11 @@ def index(self):
         """Return DependencyMap that points to all the dependencies in this
            spec."""
         dm = DependencyMap()
+        # XXX(deptype): use a deptype kwarg.
         for spec in self.traverse():
             dm[spec.name] = spec
         return dm
 
-    def flatten(self):
-        """Pull all dependencies up to the root (this spec).
-           Merge constraints for dependencies with the same name, and if they
-           conflict, throw an exception. """
-        for dep in self.flat_dependencies(copy=False):
-            self._add_dependency(dep)
-
     def _evaluate_dependency_conditions(self, name):
         """Evaluate all the conditions on a dependency with this name.
 
@@ -1267,7 +1383,8 @@ def _find_provider(self, vdep, provider_index):
             elif required:
                 raise UnsatisfiableProviderSpecError(required[0], vdep)
 
-    def _merge_dependency(self, dep, visited, spec_deps, provider_index):
+    def _merge_dependency(self, dep, deptypes, visited, spec_deps,
+                          provider_index):
         """Merge the dependency into this spec.
 
         This is the core of normalize().  There are some basic steps:
@@ -1294,7 +1411,9 @@ def _merge_dependency(self, dep, visited, spec_deps, provider_index):
                 dep = provider
         else:
             index = ProviderIndex([dep], restrict=True)
-            for vspec in (v for v in spec_deps.values() if v.virtual):
+            for vspec in (v.spec
+                          for v in spec_deps.values()
+                          if v.spec.virtual):
                 if index.providers_for(vspec):
                     vspec._replace_with(dep)
                     del spec_deps[vspec.name]
@@ -1307,25 +1426,25 @@ def _merge_dependency(self, dep, visited, spec_deps, provider_index):
         # If the spec isn't already in the set of dependencies, clone
         # it from the package description.
         if dep.name not in spec_deps:
-            spec_deps[dep.name] = dep.copy()
+            spec_deps[dep.name] = DependencySpec(dep.copy(), deptypes)
             changed = True
         # Constrain package information with spec info
         try:
-            changed |= spec_deps[dep.name].constrain(dep)
+            changed |= spec_deps[dep.name].spec.constrain(dep)
 
         except UnsatisfiableSpecError, e:
             e.message = "Invalid spec: '%s'. "
             e.message += "Package %s requires %s %s, but spec asked for %s"
-            e.message %= (spec_deps[dep.name], dep.name, e.constraint_type,
-                          e.required, e.provided)
+            e.message %= (spec_deps[dep.name].spec, dep.name,
+                          e.constraint_type, e.required, e.provided)
             raise e
 
         # Add merged spec to my deps and recurse
         dependency = spec_deps[dep.name]
-        if dep.name not in self.dependencies:
-            self._add_dependency(dependency)
+        if dep.name not in self._dependencies:
+            self._add_dependency(dependency.spec, dependency.deptypes)
 
-        changed |= dependency._normalize_helper(
+        changed |= dependency.spec._normalize_helper(
             visited, spec_deps, provider_index)
         return changed
 
@@ -1351,10 +1470,11 @@ def _normalize_helper(self, visited, spec_deps, provider_index):
             for dep_name in pkg.dependencies:
                 # Do we depend on dep_name?  If so pkg_dep is not None.
                 pkg_dep = self._evaluate_dependency_conditions(dep_name)
+                deptypes = pkg._deptypes[dep_name]
                 # If pkg_dep is a dependency, merge it.
                 if pkg_dep:
                     changed |= self._merge_dependency(
-                        pkg_dep, visited, spec_deps, provider_index)
+                        pkg_dep, deptypes, visited, spec_deps, provider_index)
             any_change |= changed
 
         return any_change
@@ -1385,11 +1505,13 @@ def normalize(self, force=False):
         # Ensure first that all packages & compilers in the DAG exist.
         self.validate_names()
         # Get all the dependencies into one DependencyMap
-        spec_deps = self.flat_dependencies(copy=False)
+        spec_deps = self.flat_dependencies_with_deptype(copy=False,
+                                                        deptype_query=alldeps)
 
         # Initialize index of virtual dependency providers if
         # concretize didn't pass us one already
-        provider_index = ProviderIndex(spec_deps.values(), restrict=True)
+        provider_index = ProviderIndex([s.spec for s in spec_deps.values()],
+                                       restrict=True)
 
         # traverse the package DAG and fill out dependencies according
         # to package files & their 'when' specs
@@ -1510,7 +1632,7 @@ def _constrain_dependencies(self, other):
         """Apply constraints of other spec's dependencies to this spec."""
         other = self._autospec(other)
 
-        if not self.dependencies or not other.dependencies:
+        if not self._dependencies or not other._dependencies:
             return False
 
         # TODO: might want more detail than this, e.g. specific deps
@@ -1526,13 +1648,17 @@ def _constrain_dependencies(self, other):
 
         # Update with additional constraints from other spec
         for name in other.dep_difference(self):
-            self._add_dependency(other[name].copy())
+            dep_spec_copy = other.get_dependency(name)
+            dep_copy = dep_spec_copy.spec
+            deptypes = dep_spec_copy.deptypes
+            self._add_dependency(dep_copy.copy(), deptypes)
             changed = True
 
         return changed
 
     def common_dependencies(self, other):
         """Return names of dependencies that self an other have in common."""
+        # XXX(deptype): handle deptypes via deptype kwarg.
         common = set(
             s.name for s in self.traverse(root=False))
         common.intersection_update(
@@ -1657,13 +1783,14 @@ def satisfies_dependencies(self, other, strict=False):
         other = self._autospec(other)
 
         if strict:
-            if other.dependencies and not self.dependencies:
+            if other._dependencies and not self._dependencies:
                 return False
 
-            if not all(dep in self.dependencies for dep in other.dependencies):
+            if not all(dep in self._dependencies
+                       for dep in other._dependencies):
                 return False
 
-        elif not self.dependencies or not other.dependencies:
+        elif not self._dependencies or not other._dependencies:
             # if either spec doesn't restrict dependencies then both are
             # compatible.
             return True
@@ -1726,8 +1853,8 @@ def _dup(self, other, **kwargs):
         self.architecture = other.architecture
         self.compiler = other.compiler.copy() if other.compiler else None
         if kwargs.get('cleardeps', True):
-            self.dependents = DependencyMap()
-            self.dependencies = DependencyMap()
+            self._dependents = DependencyMap()
+            self._dependencies = DependencyMap()
         self.compiler_flags = other.compiler_flags.copy()
         self.variants = other.variants.copy()
         self.variants.spec = self
@@ -1739,15 +1866,30 @@ def _dup(self, other, **kwargs):
         # If we copy dependencies, preserve DAG structure in the new spec
         if kwargs.get('deps', True):
             # This copies the deps from other using _dup(deps=False)
-            new_nodes = other.flat_dependencies()
+            # XXX(deptype): We can keep different instances of specs here iff
+            #               it is only a 'build' dependency (from its parent).
+            #               All other instances must be shared (due to symbol
+            #               and PATH contention). These should probably search
+            #               for any existing installation which can satisfy the
+            #               build and latch onto that because if 3 things need
+            #               the same build dependency and it is *not*
+            #               available, we only want to build it once.
+            new_nodes = other.flat_dependencies(deptype_query=alldeps)
             new_nodes[self.name] = self
 
-            # Hook everything up properly here by traversing.
-            for spec in other.traverse(cover='nodes'):
-                parent = new_nodes[spec.name]
-                for child in spec.dependencies:
-                    if child not in parent.dependencies:
-                        parent._add_dependency(new_nodes[child])
+            stack = [other]
+            while stack:
+                cur_spec = stack.pop(0)
+                new_spec = new_nodes[cur_spec.name]
+
+                for depspec in cur_spec._dependencies.values():
+                    stack.append(depspec.spec)
+
+                    # XXX(deptype): add any new deptypes that may have appeared
+                    #               here.
+                    if depspec.spec.name not in new_spec._dependencies:
+                        new_spec._add_dependency(
+                                new_nodes[depspec.spec.name], depspec.deptypes)
 
         # Since we preserved structure, we can copy _normal safely.
         self._normal = other._normal
@@ -1790,7 +1932,7 @@ def __getitem__(self, name):
         raise KeyError("No spec with name %s in %s" % (name, self))
 
     def __contains__(self, spec):
-        """True if this spec satisfis the provided spec, or if any dependency
+        """True if this spec satisfies the provided spec, or if any dependency
            does.  If the spec has no name, then we parse this one first.
         """
         spec = self._autospec(spec)
@@ -1814,13 +1956,13 @@ def _eq_dag(self, other, vs, vo):
         if self.ne_node(other):
             return False
 
-        if len(self.dependencies) != len(other.dependencies):
+        if len(self._dependencies) != len(other._dependencies):
             return False
 
-        ssorted = [self.dependencies[name]
-                   for name in sorted(self.dependencies)]
-        osorted = [other.dependencies[name]
-                   for name in sorted(other.dependencies)]
+        ssorted = [self._dependencies[name].spec
+                   for name in sorted(self._dependencies)]
+        osorted = [other._dependencies[name].spec
+                   for name in sorted(other._dependencies)]
 
         for s, o in zip(ssorted, osorted):
             visited_s = id(s) in vs
@@ -1874,9 +2016,10 @@ def _cmp_key(self):
           1. A tuple describing this node in the DAG.
           2. The hash of each of this node's dependencies' cmp_keys.
         """
+        dep_dict = self.dependencies_dict(deptype=('link', 'run'))
         return self._cmp_node() + (
-            tuple(hash(self.dependencies[name])
-                  for name in sorted(self.dependencies)),)
+            tuple(hash(dep_dict[name])
+                  for name in sorted(dep_dict)),)
 
     def colorized(self):
         return colorize_spec(self)
@@ -2081,8 +2224,8 @@ def __cmp__(self, other):
                          self.architecture, other.architecture)
 
         #Dependency is not configurable
-        if self.dependencies != other.dependencies:
-            return -1 if self.dependencies < other.dependencies else 1
+        if self._dependencies != other._dependencies:
+            return -1 if self._dependencies < other._dependencies else 1
 
         #Equal specs
         return 0
@@ -2196,10 +2339,13 @@ def do_parse(self):
                         specs.append(self.spec(None))
                         self.previous = None
                     if self.accept(HASH):
-                        specs[-1]._add_dependency(self.spec_by_hash())
+                        dep = self.spec_by_hash()
                     else:
                         self.expect(ID)
-                        specs[-1]._add_dependency(self.spec(self.token.value))
+                        dep = self.spec(self.token.value)
+                    # XXX(deptype): default deptypes
+                    def_deptypes = ('build', 'link')
+                    specs[-1]._add_dependency(dep, def_deptypes)
 
                 else:
                     # Attempt to construct an anonymous spec, but check that
@@ -2263,8 +2409,8 @@ def spec(self, name, check_valid_token=False):
         spec.external = None
         spec.external_module = None
         spec.compiler_flags = FlagMap(spec)
-        spec.dependents = DependencyMap()
-        spec.dependencies = DependencyMap()
+        spec._dependents = DependencyMap()
+        spec._dependencies = DependencyMap()
         spec.namespace = spec_namespace
         spec._hash = None
 
diff --git a/lib/spack/spack/test/cmd/test_install.py b/lib/spack/spack/test/cmd/test_install.py
index d17e013ed23687d870652e1286c9ebc45b526814..a94d3c8bba025db24b11d1f1a3479f5bb9959ab4 100644
--- a/lib/spack/spack/test/cmd/test_install.py
+++ b/lib/spack/spack/test/cmd/test_install.py
@@ -58,16 +58,39 @@ def mock_open(filename, mode):
 
 class MockSpec(object):
     def __init__(self, name, version, hashStr=None):
-        self.dependencies = {}
+        self._dependencies = {}
         self.name = name
         self.version = version
         self.hash = hashStr if hashStr else hash((name, version))
 
+    def _deptype_norm(self, deptype):
+        if deptype is None:
+            return spack.alldeps
+        # Force deptype to be a tuple so that we can do set intersections.
+        if isinstance(deptype, str):
+            return (deptype,)
+        return deptype
+
+    def _find_deps(self, where, deptype):
+        deptype = self._deptype_norm(deptype)
+
+        return [dep.spec
+                for dep in where.values()
+                if deptype and any(d in deptype for d in dep.deptypes)]
+
+    def dependencies(self, deptype=None):
+        return self._find_deps(self._dependencies, deptype)
+
+    def dependents(self, deptype=None):
+        return self._find_deps(self._dependents, deptype)
+
     def traverse(self, order=None):
-        for _, spec in self.dependencies.items():
-            yield spec
+        for _, spec in self._dependencies.items():
+            yield spec.spec
         yield self
-        #allDeps = itertools.chain.from_iterable(i.traverse() for i in self.dependencies.itervalues())
+        #from_iterable = itertools.chain.from_iterable
+        #allDeps = from_iterable(i.traverse()
+        #                        for i in self.dependencies())
         #return set(itertools.chain([self], allDeps))
 
     def dag_hash(self):
@@ -104,7 +127,7 @@ def mock_fetch_log(path):
 
 specX = MockSpec('X', "1.2.0")
 specY = MockSpec('Y', "2.3.8")
-specX.dependencies['Y'] = specY
+specX._dependencies['Y'] = spack.DependencySpec(specY, spack.alldeps)
 pkgX = MockPackage(specX, 'logX')
 pkgY = MockPackage(specY, 'logY')
 
diff --git a/lib/spack/spack/test/concretize.py b/lib/spack/spack/test/concretize.py
index ce02b08bc342aa4cf7b2e6c131e1c89fe48b3b99..ae3ceecfc8d059ef42e5f01e37db2bac2b0a251b 100644
--- a/lib/spack/spack/test/concretize.py
+++ b/lib/spack/spack/test/concretize.py
@@ -197,32 +197,36 @@ def test_concretize_two_virtuals_with_dual_provider_and_a_conflict(self):
     def test_virtual_is_fully_expanded_for_callpath(self):
         # force dependence on fake "zmpi" by asking for MPI 10.0
         spec = Spec('callpath ^mpi@10.0')
-        self.assertTrue('mpi' in spec.dependencies)
+        self.assertTrue('mpi' in spec._dependencies)
         self.assertFalse('fake' in spec)
 
         spec.concretize()
 
-        self.assertTrue('zmpi' in spec.dependencies)
-        self.assertTrue(all(not 'mpi' in d.dependencies for d in spec.traverse()))
+        self.assertTrue('zmpi' in spec._dependencies)
+        self.assertTrue(all('mpi' not in d._dependencies
+                            for d in spec.traverse()))
         self.assertTrue('zmpi' in spec)
         self.assertTrue('mpi' in spec)
 
-        self.assertTrue('fake' in spec.dependencies['zmpi'])
+        self.assertTrue('fake' in spec._dependencies['zmpi'].spec)
 
 
     def test_virtual_is_fully_expanded_for_mpileaks(self):
         spec = Spec('mpileaks ^mpi@10.0')
-        self.assertTrue('mpi' in spec.dependencies)
+        self.assertTrue('mpi' in spec._dependencies)
         self.assertFalse('fake' in spec)
 
         spec.concretize()
 
-        self.assertTrue('zmpi' in spec.dependencies)
-        self.assertTrue('callpath' in spec.dependencies)
-        self.assertTrue('zmpi' in spec.dependencies['callpath'].dependencies)
-        self.assertTrue('fake' in spec.dependencies['callpath'].dependencies['zmpi'].dependencies)
+        self.assertTrue('zmpi' in spec._dependencies)
+        self.assertTrue('callpath' in spec._dependencies)
+        self.assertTrue('zmpi' in spec._dependencies['callpath'].
+                                  spec._dependencies)
+        self.assertTrue('fake' in spec._dependencies['callpath'].
+                                  spec._dependencies['zmpi'].
+                                  spec._dependencies)
 
-        self.assertTrue(all(not 'mpi' in d.dependencies for d in spec.traverse()))
+        self.assertTrue(all(not 'mpi' in d._dependencies for d in spec.traverse()))
         self.assertTrue('zmpi' in spec)
         self.assertTrue('mpi' in spec)
 
diff --git a/lib/spack/spack/test/mock_packages_test.py b/lib/spack/spack/test/mock_packages_test.py
index c8b06cd7d70d279aaab9f413b5b1b7df988dc645..9d96622a6e3dac2e15ca9eb54649fe880c87bb93 100644
--- a/lib/spack/spack/test/mock_packages_test.py
+++ b/lib/spack/spack/test/mock_packages_test.py
@@ -191,8 +191,7 @@ def initmock(self):
         # restore later.
         self.saved_deps = {}
 
-
-    def set_pkg_dep(self, pkg_name, spec):
+    def set_pkg_dep(self, pkg_name, spec, deptypes=spack.alldeps):
         """Alters dependence information for a package.
 
         Adds a dependency on <spec> to pkg.
@@ -206,7 +205,9 @@ def set_pkg_dep(self, pkg_name, spec):
             self.saved_deps[pkg_name] = (pkg, pkg.dependencies.copy())
 
         # Change dep spec
-        pkg.dependencies[spec.name] = { Spec(pkg_name) : spec }
+        # XXX(deptype): handle deptypes.
+        pkg.dependencies[spec.name] = {Spec(pkg_name): spec}
+        pkg._deptypes[spec.name] = set(deptypes)
 
 
     def cleanmock(self):
@@ -216,6 +217,7 @@ def cleanmock(self):
         shutil.rmtree(self.temp_config, ignore_errors=True)
         spack.config.clear_config_caches()
 
+        # XXX(deptype): handle deptypes.
         # Restore dependency changes that happened during the test
         for pkg_name, (pkg, deps) in self.saved_deps.items():
             pkg.dependencies.clear()
diff --git a/lib/spack/spack/test/mock_repo.py b/lib/spack/spack/test/mock_repo.py
index a8098b8eecdb4c6e2260c274b17f59d09153fc75..386af282e7190435983512f22b4eac84a9d29f5a 100644
--- a/lib/spack/spack/test/mock_repo.py
+++ b/lib/spack/spack/test/mock_repo.py
@@ -103,6 +103,8 @@ class MockGitRepo(MockVCSRepo):
     def __init__(self):
         super(MockGitRepo, self).__init__('mock-git-stage', 'mock-git-repo')
 
+        self.url = 'file://' + self.path
+
         with working_dir(self.path):
             git('init')
 
@@ -140,8 +142,6 @@ def __init__(self):
             self.r1      = self.rev_hash(self.branch)
             self.r1_file = self.branch_file
 
-            self.url = self.path
-
     def rev_hash(self, rev):
         return git('rev-parse', rev, output=str).strip()
 
diff --git a/lib/spack/spack/test/spec_dag.py b/lib/spack/spack/test/spec_dag.py
index c56c70b1fe433bce7a0aa49ad7f55daa49dc6820..972e79aa20f2b1b9ef1b568c22d1eb5c47202696 100644
--- a/lib/spack/spack/test/spec_dag.py
+++ b/lib/spack/spack/test/spec_dag.py
@@ -148,10 +148,12 @@ def test_conflicting_spec_constraints(self):
         # Normalize then add conflicting constraints to the DAG (this is an
         # extremely unlikely scenario, but we test for it anyway)
         mpileaks.normalize()
-        mpileaks.dependencies['mpich'] = Spec('mpich@1.0')
-        mpileaks.dependencies['callpath'].dependencies['mpich'] = Spec('mpich@2.0')
+        mpileaks._dependencies['mpich'].spec = Spec('mpich@1.0')
+        mpileaks._dependencies['callpath']. \
+            spec._dependencies['mpich'].spec = Spec('mpich@2.0')
 
-        self.assertRaises(spack.spec.InconsistentSpecError, mpileaks.flatten)
+        self.assertRaises(spack.spec.InconsistentSpecError,
+                lambda: mpileaks.flat_dependencies(copy=False))
 
 
     def test_normalize_twice(self):
@@ -197,15 +199,17 @@ def test_normalize_with_virtual_spec(self):
 
     def check_links(self, spec_to_check):
         for spec in spec_to_check.traverse():
-            for dependent in spec.dependents.values():
+            for dependent in spec.dependents():
                 self.assertTrue(
-                    spec.name in dependent.dependencies,
-                    "%s not in dependencies of %s" % (spec.name, dependent.name))
+                    spec.name in dependent.dependencies_dict(),
+                    "%s not in dependencies of %s" %
+                        (spec.name, dependent.name))
 
-            for dependency in spec.dependencies.values():
+            for dependency in spec.dependencies():
                 self.assertTrue(
-                    spec.name in dependency.dependents,
-                    "%s not in dependents of %s" % (spec.name, dependency.name))
+                    spec.name in dependency.dependents_dict(),
+                    "%s not in dependents of %s" %
+                        (spec.name, dependency.name))
 
 
     def test_dependents_and_dependencies_are_correct(self):
@@ -442,3 +446,69 @@ def test_copy_concretized(self):
         orig_ids = set(id(s) for s in orig.traverse())
         copy_ids = set(id(s) for s in copy.traverse())
         self.assertFalse(orig_ids.intersection(copy_ids))
+
+    """
+    Here is the graph with deptypes labeled (assume all packages have a 'dt'
+    prefix). Arrows are marked with the deptypes ('b' for 'build', 'l' for
+    'link', 'r' for 'run').
+
+        use -bl-> top
+
+        top -b->  build1
+        top -bl-> link1
+        top -r->  run1
+
+        build1 -b->  build2
+        build1 -bl-> link2
+        build1 -r->  run2
+
+        link1 -bl-> link3
+
+        run1 -bl-> link5
+        run1 -r->  run3
+
+        link3 -b->  build2
+        link3 -bl-> link4
+
+        run3 -b-> build3
+    """
+    def test_deptype_traversal(self):
+        dag = Spec('dtuse')
+        dag.normalize()
+
+        names = ['dtuse', 'dttop', 'dtlink1', 'dtlink3', 'dtlink4',
+                 'dtrun1', 'dtlink5', 'dtrun3']
+
+        traversal = dag.traverse()
+        self.assertEqual([x.name for x in traversal], names)
+
+    def test_deptype_traversal_with_builddeps(self):
+        dag = Spec('dttop')
+        dag.normalize()
+
+        names = ['dttop', 'dtbuild1', 'dtlink2', 'dtrun2', 'dtlink1',
+                 'dtlink3', 'dtlink4', 'dtrun1', 'dtlink5', 'dtrun3']
+
+        traversal = dag.traverse()
+        self.assertEqual([x.name for x in traversal], names)
+
+    def test_deptype_traversal_full(self):
+        dag = Spec('dttop')
+        dag.normalize()
+
+        names = ['dttop', 'dtbuild1', 'dtbuild2', 'dtlink2', 'dtrun2',
+                 'dtlink1', 'dtlink3', 'dtlink4', 'dtrun1', 'dtlink5',
+                 'dtrun3', 'dtbuild3']
+
+        traversal = dag.traverse(deptype_query=spack.alldeps)
+        self.assertEqual([x.name for x in traversal], names)
+
+    def test_deptype_traversal_pythonpath(self):
+        dag = Spec('dttop')
+        dag.normalize()
+
+        names = ['dttop', 'dtbuild1', 'dtrun2', 'dtlink1', 'dtrun1',
+                 'dtrun3']
+
+        traversal = dag.traverse(deptype=spack.nolink, deptype_query='run')
+        self.assertEqual([x.name for x in traversal], names)
diff --git a/lib/spack/spack/test/stage.py b/lib/spack/spack/test/stage.py
index 6d8c3ac67c621b76eab0d06ed9d0837f0f8aafd9..d3e3bf1383d48534a8a16c8cdfe4e9b2f0935b26 100644
--- a/lib/spack/spack/test/stage.py
+++ b/lib/spack/spack/test/stage.py
@@ -35,8 +35,8 @@
 from spack.stage import Stage
 from spack.util.executable import which
 
-test_files_dir = join_path(spack.stage_path, '.test')
-test_tmp_path  = join_path(test_files_dir, 'tmp')
+test_files_dir = os.path.realpath(join_path(spack.stage_path, '.test'))
+test_tmp_path  = os.path.realpath(join_path(test_files_dir, 'tmp'))
 
 archive_dir      = 'test-files'
 archive_name     = archive_dir + '.tar.gz'
diff --git a/var/spack/repos/builtin.mock/packages/cmake-client/package.py b/var/spack/repos/builtin.mock/packages/cmake-client/package.py
index 355689a2d24e36ae13eaf0b20170c9376c890c3a..c58430317ad52c9b145964d3f65f5d94009b9851 100644
--- a/var/spack/repos/builtin.mock/packages/cmake-client/package.py
+++ b/var/spack/repos/builtin.mock/packages/cmake-client/package.py
@@ -38,7 +38,7 @@ class CmakeClient(Package):
 
     version('1.0', '4cb3ff35b2472aae70f542116d616e63')
 
-    depends_on('cmake')
+    depends_on('cmake', type='build')
 
 
     def setup_environment(self, spack_env, run_env):
diff --git a/var/spack/repos/builtin.mock/packages/dtbuild1/package.py b/var/spack/repos/builtin.mock/packages/dtbuild1/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..7429b2a8ef5f922e1151cadb40a302496311e4a0
--- /dev/null
+++ b/var/spack/repos/builtin.mock/packages/dtbuild1/package.py
@@ -0,0 +1,18 @@
+from spack import *
+
+
+class Dtbuild1(Package):
+    """Package for use as a build tool for deptypes testing which has its own
+    deptree"""
+
+    homepage = "http://www.example.com"
+    url = "http://www.example.com/dtbuild1-1.0.tar.gz"
+
+    version('1.0', '0123456789abcdef0123456789abcdef')
+
+    depends_on('dtbuild2', type='build')
+    depends_on('dtlink2')
+    depends_on('dtrun2', type='run')
+
+    def install(self, spec, prefix):
+        pass
diff --git a/var/spack/repos/builtin.mock/packages/dtbuild2/package.py b/var/spack/repos/builtin.mock/packages/dtbuild2/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..cf3bb82a10c31ba9991e7ff97a9ee41b297db29b
--- /dev/null
+++ b/var/spack/repos/builtin.mock/packages/dtbuild2/package.py
@@ -0,0 +1,13 @@
+from spack import *
+
+
+class Dtbuild2(Package):
+    """Simple package which acts as a build dependency"""
+
+    homepage = "http://www.example.com"
+    url = "http://www.example.com/dtbuild2-1.0.tar.gz"
+
+    version('1.0', '0123456789abcdef0123456789abcdef')
+
+    def install(self, spec, prefix):
+        pass
diff --git a/var/spack/repos/builtin.mock/packages/dtbuild3/package.py b/var/spack/repos/builtin.mock/packages/dtbuild3/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..6ba7e69a4111fa47d40dc77ac1775c5c02afc31c
--- /dev/null
+++ b/var/spack/repos/builtin.mock/packages/dtbuild3/package.py
@@ -0,0 +1,13 @@
+from spack import *
+
+
+class Dtbuild3(Package):
+    """Simple package which acts as a build dependency"""
+
+    homepage = "http://www.example.com"
+    url = "http://www.example.com/dtbuild3-1.0.tar.gz"
+
+    version('1.0', '0123456789abcdef0123456789abcdef')
+
+    def install(self, spec, prefix):
+        pass
diff --git a/var/spack/repos/builtin.mock/packages/dtlink1/package.py b/var/spack/repos/builtin.mock/packages/dtlink1/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..2747dcf354e73aaf304a23da0f49254fffdb6059
--- /dev/null
+++ b/var/spack/repos/builtin.mock/packages/dtlink1/package.py
@@ -0,0 +1,15 @@
+from spack import *
+
+
+class Dtlink1(Package):
+    """Simple package which acts as a link dependency"""
+
+    homepage = "http://www.example.com"
+    url = "http://www.example.com/dtlink1-1.0.tar.gz"
+
+    version('1.0', '0123456789abcdef0123456789abcdef')
+
+    depends_on('dtlink3')
+
+    def install(self, spec, prefix):
+        pass
diff --git a/var/spack/repos/builtin.mock/packages/dtlink2/package.py b/var/spack/repos/builtin.mock/packages/dtlink2/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..b80bad053f927bd4b35ac506dc3eac0f4fcbdc27
--- /dev/null
+++ b/var/spack/repos/builtin.mock/packages/dtlink2/package.py
@@ -0,0 +1,13 @@
+from spack import *
+
+
+class Dtlink2(Package):
+    """Simple package which acts as a link dependency"""
+
+    homepage = "http://www.example.com"
+    url = "http://www.example.com/dtlink2-1.0.tar.gz"
+
+    version('1.0', '0123456789abcdef0123456789abcdef')
+
+    def install(self, spec, prefix):
+        pass
diff --git a/var/spack/repos/builtin.mock/packages/dtlink3/package.py b/var/spack/repos/builtin.mock/packages/dtlink3/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..bee8b4b8f8ac3d0bce65ea1c935a3411cd76b437
--- /dev/null
+++ b/var/spack/repos/builtin.mock/packages/dtlink3/package.py
@@ -0,0 +1,16 @@
+from spack import *
+
+
+class Dtlink3(Package):
+    """Simple package which acts as a link dependency"""
+
+    homepage = "http://www.example.com"
+    url = "http://www.example.com/dtlink3-1.0.tar.gz"
+
+    version('1.0', '0123456789abcdef0123456789abcdef')
+
+    depends_on('dtbuild2', type='build')
+    depends_on('dtlink4')
+
+    def install(self, spec, prefix):
+        pass
diff --git a/var/spack/repos/builtin.mock/packages/dtlink4/package.py b/var/spack/repos/builtin.mock/packages/dtlink4/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..3f05d5c0d6649584f744a05cf7e8f3ab1f0427a5
--- /dev/null
+++ b/var/spack/repos/builtin.mock/packages/dtlink4/package.py
@@ -0,0 +1,13 @@
+from spack import *
+
+
+class Dtlink4(Package):
+    """Simple package which acts as a link dependency"""
+
+    homepage = "http://www.example.com"
+    url = "http://www.example.com/dtlink4-1.0.tar.gz"
+
+    version('1.0', '0123456789abcdef0123456789abcdef')
+
+    def install(self, spec, prefix):
+        pass
diff --git a/var/spack/repos/builtin.mock/packages/dtlink5/package.py b/var/spack/repos/builtin.mock/packages/dtlink5/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..c8b1e97d3792570f9b5b95b911070c2572ca35d8
--- /dev/null
+++ b/var/spack/repos/builtin.mock/packages/dtlink5/package.py
@@ -0,0 +1,13 @@
+from spack import *
+
+
+class Dtlink5(Package):
+    """Simple package which acts as a link dependency"""
+
+    homepage = "http://www.example.com"
+    url = "http://www.example.com/dtlink5-1.0.tar.gz"
+
+    version('1.0', '0123456789abcdef0123456789abcdef')
+
+    def install(self, spec, prefix):
+        pass
diff --git a/var/spack/repos/builtin.mock/packages/dtrun1/package.py b/var/spack/repos/builtin.mock/packages/dtrun1/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..fb33b9b2f2de8c7af4f29d9bcf1e93b766bab3e4
--- /dev/null
+++ b/var/spack/repos/builtin.mock/packages/dtrun1/package.py
@@ -0,0 +1,16 @@
+from spack import *
+
+
+class Dtrun1(Package):
+    """Simple package which acts as a run dependency"""
+
+    homepage = "http://www.example.com"
+    url = "http://www.example.com/dtrun1-1.0.tar.gz"
+
+    version('1.0', '0123456789abcdef0123456789abcdef')
+
+    depends_on('dtlink5')
+    depends_on('dtrun3', type='run')
+
+    def install(self, spec, prefix):
+        pass
diff --git a/var/spack/repos/builtin.mock/packages/dtrun2/package.py b/var/spack/repos/builtin.mock/packages/dtrun2/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..e5d4b5e0b4f5a0ab467b03f764d790d2814308be
--- /dev/null
+++ b/var/spack/repos/builtin.mock/packages/dtrun2/package.py
@@ -0,0 +1,13 @@
+from spack import *
+
+
+class Dtrun2(Package):
+    """Simple package which acts as a run dependency"""
+
+    homepage = "http://www.example.com"
+    url = "http://www.example.com/dtrun2-1.0.tar.gz"
+
+    version('1.0', '0123456789abcdef0123456789abcdef')
+
+    def install(self, spec, prefix):
+        pass
diff --git a/var/spack/repos/builtin.mock/packages/dtrun3/package.py b/var/spack/repos/builtin.mock/packages/dtrun3/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..70dacf45ff9dbdeee2130d9c50dc81530db4671d
--- /dev/null
+++ b/var/spack/repos/builtin.mock/packages/dtrun3/package.py
@@ -0,0 +1,15 @@
+from spack import *
+
+
+class Dtrun3(Package):
+    """Simple package which acts as a run dependency"""
+
+    homepage = "http://www.example.com"
+    url = "http://www.example.com/dtrun3-1.0.tar.gz"
+
+    version('1.0', '0123456789abcdef0123456789abcdef')
+
+    depends_on('dtbuild3', type='build')
+
+    def install(self, spec, prefix):
+        pass
diff --git a/var/spack/repos/builtin.mock/packages/dttop/package.py b/var/spack/repos/builtin.mock/packages/dttop/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..202a3b6883c10c388c358c738005a48e777bec14
--- /dev/null
+++ b/var/spack/repos/builtin.mock/packages/dttop/package.py
@@ -0,0 +1,17 @@
+from spack import *
+
+
+class Dttop(Package):
+    """Package with a complicated dependency tree"""
+
+    homepage = "http://www.example.com"
+    url = "http://www.example.com/dttop-1.0.tar.gz"
+
+    version('1.0', '0123456789abcdef0123456789abcdef')
+
+    depends_on('dtbuild1', type='build')
+    depends_on('dtlink1')
+    depends_on('dtrun1', type='run')
+
+    def install(self, spec, prefix):
+        pass
diff --git a/var/spack/repos/builtin.mock/packages/dtuse/package.py b/var/spack/repos/builtin.mock/packages/dtuse/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..bd7391cee8d1ff036676702d9ef2f2700be10fe7
--- /dev/null
+++ b/var/spack/repos/builtin.mock/packages/dtuse/package.py
@@ -0,0 +1,15 @@
+from spack import *
+
+
+class Dtuse(Package):
+    """Simple package which uses dttop"""
+
+    homepage = "http://www.example.com"
+    url = "http://www.example.com/dtuse-1.0.tar.gz"
+
+    version('1.0', '0123456789abcdef0123456789abcdef')
+
+    depends_on('dttop')
+
+    def install(self, spec, prefix):
+        pass
diff --git a/var/spack/repos/builtin/packages/ImageMagick/package.py b/var/spack/repos/builtin/packages/ImageMagick/package.py
index f8173169e11a1932f4f8dd45e3feec3ee8860733..b0ccba100992bd5cedde4f14267de5e0573b2877 100644
--- a/var/spack/repos/builtin/packages/ImageMagick/package.py
+++ b/var/spack/repos/builtin/packages/ImageMagick/package.py
@@ -51,7 +51,7 @@ class Imagemagick(Package):
         url="http://sourceforge.net/projects/imagemagick/files/old-sources/6.x/6.8/ImageMagick-6.8.9-10.tar.gz/download")
 
     depends_on('jpeg')
-    depends_on('libtool')
+    depends_on('libtool', type='build')
     depends_on('libpng')
     depends_on('freetype')
     depends_on('fontconfig')
diff --git a/var/spack/repos/builtin/packages/Mitos/package.py b/var/spack/repos/builtin/packages/Mitos/package.py
index 83aca3dc6a001b56f66dccbf612302bf3a46a810..d577a1b285f54c516c39ca1376a769541ba79cdf 100644
--- a/var/spack/repos/builtin/packages/Mitos/package.py
+++ b/var/spack/repos/builtin/packages/Mitos/package.py
@@ -41,6 +41,7 @@ class Mitos(Package):
     depends_on('dyninst@8.2.1:')
     depends_on('hwloc')
     depends_on('mpi')
+    depends_on('cmake', type='build')
 
     def install(self, spec, prefix):
         with working_dir('spack-build', create=True):
diff --git a/var/spack/repos/builtin/packages/R/package.py b/var/spack/repos/builtin/packages/R/package.py
index 07bb6b6b034beac620f7ea6472ef2af400e12b5f..11c5909efaff44cc363f285dbdec09c45a5f406c 100644
--- a/var/spack/repos/builtin/packages/R/package.py
+++ b/var/spack/repos/builtin/packages/R/package.py
@@ -123,7 +123,7 @@ def setup_dependent_environment(self, spack_env, run_env, extension_spec):
         # Set R_LIBS to include the library dir for the
         # extension and any other R extensions it depends on.
         r_libs_path = []
-        for d in extension_spec.traverse():
+        for d in extension_spec.traverse(deptype=nolink, deptype_query='run'):
             if d.package.extends(self.spec):
                 r_libs_path.append(os.path.join(d.prefix, self.r_lib_dir))
 
diff --git a/var/spack/repos/builtin/packages/adept-utils/package.py b/var/spack/repos/builtin/packages/adept-utils/package.py
index 7b6c3702affc924bb13516db24110294c543b38f..592681bb822391604001eb3981c632b45eb6fc91 100644
--- a/var/spack/repos/builtin/packages/adept-utils/package.py
+++ b/var/spack/repos/builtin/packages/adept-utils/package.py
@@ -35,6 +35,7 @@ class AdeptUtils(Package):
 
     depends_on("boost")
     depends_on("mpi")
+    depends_on('cmake', type='build')
 
     def install(self, spec, prefix):
         cmake(*std_cmake_args)
diff --git a/var/spack/repos/builtin/packages/apex/package.py b/var/spack/repos/builtin/packages/apex/package.py
index 20cbd8e8c6ceab6086a4590ffc6e2af2ff00d507..59fbe50c93f6aa4563c5ff117ee7761eea7506ce 100644
--- a/var/spack/repos/builtin/packages/apex/package.py
+++ b/var/spack/repos/builtin/packages/apex/package.py
@@ -33,7 +33,7 @@ class Apex(Package):
 
     depends_on("binutils+libiberty")
     depends_on("boost@1.54:")
-    depends_on("cmake@2.8.12:")
+    depends_on('cmake@2.8.12:', type='build')
     depends_on("activeharmony@4.5:")
     depends_on("ompt-openmp")
 
diff --git a/var/spack/repos/builtin/packages/arpack-ng/package.py b/var/spack/repos/builtin/packages/arpack-ng/package.py
index d9021f80439385988a652b269167f589720ca2bf..d5dc703c0633b08d53e448703670249b8467e39f 100644
--- a/var/spack/repos/builtin/packages/arpack-ng/package.py
+++ b/var/spack/repos/builtin/packages/arpack-ng/package.py
@@ -72,10 +72,10 @@ class ArpackNg(Package):
 
     depends_on('blas')
     depends_on('lapack')
-    depends_on('automake', when='@3.3.0')
-    depends_on('autoconf', when='@3.3.0')
-    depends_on('libtool@2.4.2:', when='@3.3.0')
-    depends_on('cmake@2.8.6:', when='@3.4.0:')
+    depends_on('automake', when='@3.3.0', type='build')
+    depends_on('autoconf', when='@3.3.0', type='build')
+    depends_on('libtool@2.4.2:', when='@3.3.0', type='build')
+    depends_on('cmake@2.8.6:', when='@3.4.0:', type='build')
 
     depends_on('mpi', when='+mpi')
 
diff --git a/var/spack/repos/builtin/packages/autoconf/package.py b/var/spack/repos/builtin/packages/autoconf/package.py
index 770ceed48b4ec5307462756611ae4267bdf450fa..2de1c390db07002e56a56aa2cd55924866457fd4 100644
--- a/var/spack/repos/builtin/packages/autoconf/package.py
+++ b/var/spack/repos/builtin/packages/autoconf/package.py
@@ -35,7 +35,7 @@ class Autoconf(Package):
     version('2.69', '82d05e03b93e45f5a39b828dc9c6c29b')
     version('2.62', '6c1f3b3734999035d77da5024aab4fbd')
 
-    depends_on('m4')
+    depends_on('m4', type='build')
 
     def _make_executable(self, name):
         return Executable(join_path(self.prefix.bin, name))
diff --git a/var/spack/repos/builtin/packages/automaded/package.py b/var/spack/repos/builtin/packages/automaded/package.py
index fc65a04a066b9afa199adc90c054b9d3210000a6..2b4681778f0529969c709db0e03003bb065d1b35 100644
--- a/var/spack/repos/builtin/packages/automaded/package.py
+++ b/var/spack/repos/builtin/packages/automaded/package.py
@@ -44,6 +44,7 @@ class Automaded(Package):
     depends_on('mpi')
     depends_on('boost')
     depends_on('callpath')
+    depends_on('cmake', type='build')
 
     def install(self, spec, prefix):
         cmake("-DSTATE_TRACKER_WITH_CALLPATH=ON", *std_cmake_args)
diff --git a/var/spack/repos/builtin/packages/bear/package.py b/var/spack/repos/builtin/packages/bear/package.py
index 730a684ec5725f5b6bb15c1ccfa7e356e72fbce7..a137fded088be76f6751d38942e23ad0ca03e783 100644
--- a/var/spack/repos/builtin/packages/bear/package.py
+++ b/var/spack/repos/builtin/packages/bear/package.py
@@ -31,7 +31,7 @@ class Bear(Package):
 
     version('2.0.4', 'fd8afb5e8e18f8737ba06f90bd77d011')
 
-    depends_on("cmake")
+    depends_on('cmake', type='build')
     depends_on("python")
 
     def install(self, spec, prefix):
diff --git a/var/spack/repos/builtin/packages/bertini/package.py b/var/spack/repos/builtin/packages/bertini/package.py
index 8d7da705e453222f64e84d9c8c71c68cde02b3e8..7dd17a062e51c7eee50c44506292853681f1c935 100644
--- a/var/spack/repos/builtin/packages/bertini/package.py
+++ b/var/spack/repos/builtin/packages/bertini/package.py
@@ -37,8 +37,8 @@ class Bertini(Package):
 
     variant('mpi', default=True, description='Compile in parallel')
 
-    depends_on('flex')
-    depends_on('bison')
+    depends_on('flex', type='build')
+    depends_on('bison', type='build')
     depends_on('gmp')
     depends_on('mpfr')
     depends_on('mpi', when='+mpi')
diff --git a/var/spack/repos/builtin/packages/binutils/package.py b/var/spack/repos/builtin/packages/binutils/package.py
index 35d52128c3ccc19a05ec42ff5d1a2a32c8705eba..e329e6fd7a551b4a93305a115bafbdaa18f87f1e 100644
--- a/var/spack/repos/builtin/packages/binutils/package.py
+++ b/var/spack/repos/builtin/packages/binutils/package.py
@@ -38,9 +38,9 @@ class Binutils(Package):
     version('2.23.2', '4f8fa651e35ef262edc01d60fb45702e')
     version('2.20.1', '2b9dc8f2b7dbd5ec5992c6e29de0b764')
 
-    depends_on('m4')
-    depends_on('flex')
-    depends_on('bison')
+    depends_on('m4', type='build')
+    depends_on('flex', type='build')
+    depends_on('bison', type='build')
 
     # Add a patch that creates binutils libiberty_pic.a which is preferred by
     # OpenSpeedShop and cbtf-krell
diff --git a/var/spack/repos/builtin/packages/bison/package.py b/var/spack/repos/builtin/packages/bison/package.py
index c5bc051c800b0ccf1d15679e97d170ed719456c6..c7a125df15b0e08e3eff595be82af2470acfa8e7 100644
--- a/var/spack/repos/builtin/packages/bison/package.py
+++ b/var/spack/repos/builtin/packages/bison/package.py
@@ -34,7 +34,7 @@ class Bison(Package):
 
     version('3.0.4', 'a586e11cd4aff49c3ff6d3b6a4c9ccf8')
 
-    depends_on("m4")
+    depends_on("m4", type='build')
 
     def install(self, spec, prefix):
         configure("--prefix=%s" % prefix)
diff --git a/var/spack/repos/builtin/packages/boxlib/package.py b/var/spack/repos/builtin/packages/boxlib/package.py
index ec7db6c08e5d7f2d6e4a88ac7c82e769f4ca5edd..216ae1ec122758b68338cdf0fa36cd98e00bfcbe 100644
--- a/var/spack/repos/builtin/packages/boxlib/package.py
+++ b/var/spack/repos/builtin/packages/boxlib/package.py
@@ -35,6 +35,7 @@ class Boxlib(Package):
     version('master', git='https://ccse.lbl.gov/pub/Downloads/BoxLib.git')
 
     depends_on('mpi')
+    depends_on('cmake', type='build')
 
     def install(self, spec, prefix):
         args = std_cmake_args
diff --git a/var/spack/repos/builtin/packages/c-blosc/package.py b/var/spack/repos/builtin/packages/c-blosc/package.py
index dee332be14c375201b9c7b34b43dd615a9c397e9..49f986112680e252a125840df368fce85261ba3a 100644
--- a/var/spack/repos/builtin/packages/c-blosc/package.py
+++ b/var/spack/repos/builtin/packages/c-blosc/package.py
@@ -38,7 +38,7 @@ class CBlosc(Package):
     version('1.8.1', 'd73d5be01359cf271e9386c90dcf5b05')
     version('1.8.0', '5b92ecb287695ba20cc33d30bf221c4f')
 
-    depends_on("cmake")
+    depends_on("cmake", type='build')
     depends_on("snappy")
     depends_on("zlib")
 
diff --git a/var/spack/repos/builtin/packages/caliper/package.py b/var/spack/repos/builtin/packages/caliper/package.py
index a424c73859fc27e2f0f8456bfcbc5cf5059a8ce2..4a0fc54acc7e72882217f9160ae6086116ed7af2 100644
--- a/var/spack/repos/builtin/packages/caliper/package.py
+++ b/var/spack/repos/builtin/packages/caliper/package.py
@@ -41,6 +41,7 @@ class Caliper(Package):
     depends_on('libunwind')
     depends_on('papi')
     depends_on('mpi', when='+mpi')
+    depends_on('cmake', type='build')
 
     def install(self, spec, prefix):
       with working_dir('build', create=True):
diff --git a/var/spack/repos/builtin/packages/callpath/package.py b/var/spack/repos/builtin/packages/callpath/package.py
index 2ad2dc60e4dcd07539ff743c57a04503a6afeec1..2f171fb9ce6dd3dcc79028bd6fc04d38c89fa3bc 100644
--- a/var/spack/repos/builtin/packages/callpath/package.py
+++ b/var/spack/repos/builtin/packages/callpath/package.py
@@ -39,6 +39,7 @@ class Callpath(Package):
     depends_on("dyninst")
     depends_on("adept-utils")
     depends_on("mpi")
+    depends_on('cmake', type='build')
 
     def install(self, spec, prefix):
         # TODO: offer options for the walker used.
diff --git a/var/spack/repos/builtin/packages/cantera/package.py b/var/spack/repos/builtin/packages/cantera/package.py
index e9e5da44868ddc07aca513fd8b75ab5cb016f63a..8e4f23046b4b32db42efdbd383db68ebcf947803 100644
--- a/var/spack/repos/builtin/packages/cantera/package.py
+++ b/var/spack/repos/builtin/packages/cantera/package.py
@@ -42,7 +42,7 @@ class Cantera(Package):
     variant('matlab',     default=False, description='Build the Cantera Matlab toolbox')
 
     # Required dependencies
-    depends_on('scons')
+    depends_on('scons', type='build')
 
     # Recommended dependencies
     depends_on('blas',      when='+lapack')
@@ -52,10 +52,10 @@ class Cantera(Package):
 
     # Python module dependencies
     extends('python', when='+python')
-    depends_on('py-numpy',  when='+python')
-    depends_on('py-scipy',  when='+python')
-    depends_on('py-cython', when='+python')
-    depends_on('py-3to2',   when='+python')
+    depends_on('py-numpy',  when='+python', type=nolink)
+    depends_on('py-scipy',  when='+python', type=nolink)
+    depends_on('py-cython', when='+python', type=nolink)
+    depends_on('py-3to2',   when='+python', type=nolink)
     # TODO: these "when" specs don't actually work
     # depends_on('py-unittest2',     when='+python^python@2.6')
     # depends_on('py-unittest2py3k', when='+python^python@3.1')
diff --git a/var/spack/repos/builtin/packages/cbtf-argonavis/package.py b/var/spack/repos/builtin/packages/cbtf-argonavis/package.py
index 7ce90ce0db2f80571e23652be2686f5c03cd3e13..321d02b5568b2960f5d0b6fe99915fff42eb84e1 100644
--- a/var/spack/repos/builtin/packages/cbtf-argonavis/package.py
+++ b/var/spack/repos/builtin/packages/cbtf-argonavis/package.py
@@ -53,7 +53,7 @@ class CbtfArgonavis(Package):
 
     version('1.6', branch='master', git='https://github.com/OpenSpeedShop/cbtf-argonavis.git')
 
-    depends_on("cmake@3.0.2")
+    depends_on("cmake@3.0.2", type='build')
     depends_on("boost@1.50.0:")
     depends_on("papi")
     depends_on("mrnet@5.0.1:+lwthreads+krellpatch")
diff --git a/var/spack/repos/builtin/packages/cbtf-krell/package.py b/var/spack/repos/builtin/packages/cbtf-krell/package.py
index 7506f78146b452032dd026f601ce612b299a1893..acb78a73951105cb8f583ca562f45ae2677308d4 100644
--- a/var/spack/repos/builtin/packages/cbtf-krell/package.py
+++ b/var/spack/repos/builtin/packages/cbtf-krell/package.py
@@ -64,7 +64,7 @@ class CbtfKrell(Package):
     variant('mpich', default=False, description="Build mpi experiment collector for mpich MPI when this variant is enabled.")
 
     # Dependencies for cbtf-krell
-    depends_on("cmake@3.0.2")
+    depends_on("cmake@3.0.2", type='build')
 
     # For binutils service
     depends_on("binutils@2.24+krellpatch")
diff --git a/var/spack/repos/builtin/packages/cbtf-lanl/package.py b/var/spack/repos/builtin/packages/cbtf-lanl/package.py
index fa7de3d4a370b67488446a1eaa6d1b61388c2e5c..5694535fccff615732a615bf3ec9b780139b0b77 100644
--- a/var/spack/repos/builtin/packages/cbtf-lanl/package.py
+++ b/var/spack/repos/builtin/packages/cbtf-lanl/package.py
@@ -53,7 +53,7 @@ class CbtfLanl(Package):
 
     version('1.6', branch='master', git='http://git.code.sf.net/p/cbtf-lanl/cbtf-lanl')
 
-    depends_on("cmake@3.0.2")
+    depends_on("cmake@3.0.2", type='build')
     # Dependencies for cbtf-krell
     depends_on("mrnet@5.0.1:+lwthreads+krellpatch")
     depends_on("xerces-c@3.1.1:")
diff --git a/var/spack/repos/builtin/packages/cbtf/package.py b/var/spack/repos/builtin/packages/cbtf/package.py
index 2231cf1d45bad8b29ca383d495800cffb67d4404..017b897f3c66d355bfac5e2d889c9392b26008ec 100644
--- a/var/spack/repos/builtin/packages/cbtf/package.py
+++ b/var/spack/repos/builtin/packages/cbtf/package.py
@@ -57,7 +57,7 @@ class Cbtf(Package):
 
     variant('runtime', default=False, description="build only the runtime libraries and collectors.")
 
-    depends_on("cmake@3.0.2")
+    depends_on("cmake@3.0.2", type='build')
     depends_on("boost@1.50.0:")
     depends_on("mrnet@5.0.1:+lwthreads+krellpatch")
     depends_on("xerces-c@3.1.1:")
diff --git a/var/spack/repos/builtin/packages/cereal/package.py b/var/spack/repos/builtin/packages/cereal/package.py
index 80198fa2248196f4348e61c8669659b16c5d8523..41dc9a274b8240bcc39e6680772c5bdb8e419836 100644
--- a/var/spack/repos/builtin/packages/cereal/package.py
+++ b/var/spack/repos/builtin/packages/cereal/package.py
@@ -40,7 +40,7 @@ class Cereal(Package):
 
     patch("Werror.patch")
 
-    depends_on("cmake @2.6.2:")
+    depends_on('cmake@2.6.2:', type='build')
 
     def install(self, spec, prefix):
         # Don't use -Werror
diff --git a/var/spack/repos/builtin/packages/cgal/package.py b/var/spack/repos/builtin/packages/cgal/package.py
index ea1b20e34ff141722f81a7a1584d700d0a74feef..5c87978339ee9b4b54dcb04ddd588a08a808b420 100644
--- a/var/spack/repos/builtin/packages/cgal/package.py
+++ b/var/spack/repos/builtin/packages/cgal/package.py
@@ -46,7 +46,7 @@ class Cgal(Package):
     depends_on('mpfr')
     depends_on('gmp')
     depends_on('zlib')
-    depends_on('cmake')
+    depends_on('cmake', type='build')
 
     # FIXME : Qt5 dependency missing (needs Qt5 and OpenGL)
     # FIXME : Optional third party libraries missing
diff --git a/var/spack/repos/builtin/packages/cleverleaf/package.py b/var/spack/repos/builtin/packages/cleverleaf/package.py
index 6b54d1bf267d83753964f996fa8672acc5ac5354..c258e89514aba3b1486dd9b2f15e86276e38a775 100644
--- a/var/spack/repos/builtin/packages/cleverleaf/package.py
+++ b/var/spack/repos/builtin/packages/cleverleaf/package.py
@@ -40,6 +40,7 @@ class Cleverleaf(Package):
     depends_on("SAMRAI@3.8.0:")
     depends_on("hdf5+mpi")
     depends_on("boost")
+    depends_on('cmake', type='build')
 
     def install(self, spec, prefix):
         cmake(*std_cmake_args)
diff --git a/var/spack/repos/builtin/packages/cmake/package.py b/var/spack/repos/builtin/packages/cmake/package.py
index 7b2a125fe50241e3552b98fcd17ef7ea7dfe0c4c..b39b08639660b4cbcd1a15f2280f86a48731cbe8 100644
--- a/var/spack/repos/builtin/packages/cmake/package.py
+++ b/var/spack/repos/builtin/packages/cmake/package.py
@@ -47,8 +47,8 @@ class Cmake(Package):
     depends_on('ncurses', when='+ncurses')
     depends_on('openssl', when='+openssl')
     depends_on('qt', when='+qt')
-    depends_on('python@2.7.11:', when='+doc')
-    depends_on('py-sphinx', when='+doc')
+    depends_on('python@2.7.11:', when='+doc', type='build')
+    depends_on('py-sphinx', when='+doc', type='build')
 
     def url_for_version(self, version):
         """Handle CMake's version-based custom URLs."""
diff --git a/var/spack/repos/builtin/packages/cmocka/package.py b/var/spack/repos/builtin/packages/cmocka/package.py
index 41f80d9761556ddca58228f46bc6ee2a122ccd92..aa2b3cc3bb224defebade0a9416671766b10c3e5 100644
--- a/var/spack/repos/builtin/packages/cmocka/package.py
+++ b/var/spack/repos/builtin/packages/cmocka/package.py
@@ -32,6 +32,8 @@ class Cmocka(Package):
     version('1.0.1', 'ed861e501a21a92b2af63e466df2015e')
     parallel = False
 
+    depends_on('cmake', type='build')
+
     def install(self, spec, prefix):
         with working_dir('spack-build', create=True):
 	    cmake('..', *std_cmake_args)
diff --git a/var/spack/repos/builtin/packages/cram/package.py b/var/spack/repos/builtin/packages/cram/package.py
index 7e055870872b0d9fd92d121b56256b6bccf9ea27..283bc5adea3b9258a7ccfce5001896b3e26b8946 100644
--- a/var/spack/repos/builtin/packages/cram/package.py
+++ b/var/spack/repos/builtin/packages/cram/package.py
@@ -33,6 +33,7 @@ class Cram(Package):
 
     extends('python')
     depends_on("mpi")
+    depends_on('cmake', type='build')
 
     def install(self, spec, prefix):
         cmake(".", *std_cmake_args)
diff --git a/var/spack/repos/builtin/packages/czmq/package.py b/var/spack/repos/builtin/packages/czmq/package.py
index d69f3e50093bf5ea952c8e5112c0e1ec5cbacd50..a251a94470f1f0dd2830c93cc8a5eb7bc4efdae6 100644
--- a/var/spack/repos/builtin/packages/czmq/package.py
+++ b/var/spack/repos/builtin/packages/czmq/package.py
@@ -32,10 +32,10 @@ class Czmq(Package):
 
     version('3.0.2', '23e9885f7ee3ce88d99d0425f52e9be1', url='https://github.com/zeromq/czmq/archive/v3.0.2.tar.gz')
 
-    depends_on('libtool')
-    depends_on('automake')
-    depends_on('autoconf')
-    depends_on('pkg-config')
+    depends_on('libtool', type='build')
+    depends_on('automake', type='build')
+    depends_on('autoconf', type='build')
+    depends_on('pkg-config', type='build')
     depends_on('zeromq')
 
     def install(self, spec, prefix):
diff --git a/var/spack/repos/builtin/packages/dakota/package.py b/var/spack/repos/builtin/packages/dakota/package.py
index 3a8ddf28ef6f3ed17f742dcd316b2106973192e5..d0d22d97286ae911aa417819b0b13945a70b0745 100644
--- a/var/spack/repos/builtin/packages/dakota/package.py
+++ b/var/spack/repos/builtin/packages/dakota/package.py
@@ -55,6 +55,7 @@ class Dakota(Package):
 
     depends_on('python')
     depends_on('boost')
+    depends_on('cmake', type='build')
 
     def url_for_version(self, version):
         return Dakota._url_str.format(version=version)
diff --git a/var/spack/repos/builtin/packages/damselfly/package.py b/var/spack/repos/builtin/packages/damselfly/package.py
index 42fab63f98f3e27638e83f6506ebab9e6eb4daba..427997072c48b2599fda2678eb1bc60cf0a7e657 100644
--- a/var/spack/repos/builtin/packages/damselfly/package.py
+++ b/var/spack/repos/builtin/packages/damselfly/package.py
@@ -31,6 +31,8 @@ class Damselfly(Package):
 
     version('1.0', '05cf7e2d8ece4408c0f2abb7ab63fd74c0d62895', git='https://github.com/llnl/damselfly.git', tag='v1.0')
 
+    depends_on('cmake', type='build')
+
     def install(self, spec, prefix):
         with working_dir('spack-build', create=True):
 	    cmake('-DCMAKE_BUILD_TYPE=release', '..', *std_cmake_args)
diff --git a/var/spack/repos/builtin/packages/dealii/package.py b/var/spack/repos/builtin/packages/dealii/package.py
index e7984466ba95f3977cd1d5d1c83664c8b62ab177..54604d351ffd3628c7d8b5a7e54290628d0c4035 100644
--- a/var/spack/repos/builtin/packages/dealii/package.py
+++ b/var/spack/repos/builtin/packages/dealii/package.py
@@ -60,7 +60,7 @@ class Dealii(Package):
     depends_on("boost@1.59.0:+thread+system+serialization+iostreams",     when='~mpi')  # NOQA: ignore=E501
     depends_on("boost@1.59.0:+mpi+thread+system+serialization+iostreams", when='+mpi')  # NOQA: ignore=E501
     depends_on("bzip2")
-    depends_on("cmake")
+    depends_on("cmake", type='build')
     depends_on("lapack")
     depends_on("muparser")
     depends_on("suite-sparse")
diff --git a/var/spack/repos/builtin/packages/dia/package.py b/var/spack/repos/builtin/packages/dia/package.py
index 38742b7e7df647fecb64b191da1d4580ccb950f2..1685f0009f57f66eb6ce8d7726a2a2982a068d7b 100644
--- a/var/spack/repos/builtin/packages/dia/package.py
+++ b/var/spack/repos/builtin/packages/dia/package.py
@@ -31,7 +31,7 @@ class Dia(Package):
 
     version('0.97.3',    '0e744a0f6a6c4cb6a089e4d955392c3c')
 
-    depends_on('intltool')
+    depends_on('intltool', type='build')
     depends_on('gtkplus@2.6.0:')
     depends_on('cairo')
     #depends_on('libart') # optional dependency, not yet supported by spack.
diff --git a/var/spack/repos/builtin/packages/doxygen/package.py b/var/spack/repos/builtin/packages/doxygen/package.py
index b2e9582b5a9ad7a823592ebaf2e56be5f53f4554..267ba6175654debe6c0524d03dc0f37452c4b565 100644
--- a/var/spack/repos/builtin/packages/doxygen/package.py
+++ b/var/spack/repos/builtin/packages/doxygen/package.py
@@ -24,6 +24,8 @@
 ##############################################################################
 from spack import *
 
+import sys
+
 
 class Doxygen(Package):
     """Doxygen is the de facto standard tool for generating documentation
@@ -41,12 +43,12 @@ class Doxygen(Package):
     # graphviz appears to be a run-time optional dependency
     variant('graphviz', default=True, description='Build with dot command support from Graphviz.')  # NOQA: ignore=E501
 
-    depends_on("cmake@2.8.12:")
-    depends_on("flex")
-    depends_on("bison")
+    depends_on("cmake@2.8.12:", type='build')
+    depends_on("flex", type='build')
+    depends_on("bison", type='build')
 
     # optional dependencies
-    depends_on("graphviz", when="+graphviz")
+    depends_on("graphviz", when="+graphviz", type='run')
 
     def install(self, spec, prefix):
         cmake('.', *std_cmake_args)
diff --git a/var/spack/repos/builtin/packages/dyninst/package.py b/var/spack/repos/builtin/packages/dyninst/package.py
index 735936f087d999c64273137d47a4f3bd7d98fd4b..efe4de4abf1ffe694d20a92bc57b65f5cb2b6ba6 100644
--- a/var/spack/repos/builtin/packages/dyninst/package.py
+++ b/var/spack/repos/builtin/packages/dyninst/package.py
@@ -43,6 +43,7 @@ class Dyninst(Package):
     depends_on("libelf")
     depends_on("libdwarf")
     depends_on("boost@1.42:")
+    depends_on('cmake', type='build')
 
     # new version uses cmake
     def install(self, spec, prefix):
diff --git a/var/spack/repos/builtin/packages/eigen/package.py b/var/spack/repos/builtin/packages/eigen/package.py
index 9ff41076197cdf7105e429fa6d9c7e5ab41798fc..97343f499b16d15489b70d4743ef9246707044e3 100644
--- a/var/spack/repos/builtin/packages/eigen/package.py
+++ b/var/spack/repos/builtin/packages/eigen/package.py
@@ -47,7 +47,7 @@ class Eigen(Package):
     variant('mpfr', default=True, description='Enables support for multi-precisions floating points via mpfr')
 
     # TODO : dependency on googlehash, superlu, adolc missing
-    depends_on('cmake')
+    depends_on('cmake', type='build')
     depends_on('metis@5:', when='+metis')
     depends_on('scotch', when='+scotch')
     depends_on('fftw', when='+fftw')
diff --git a/var/spack/repos/builtin/packages/environment-modules/package.py b/var/spack/repos/builtin/packages/environment-modules/package.py
index fe7a5ee4f642a65a1033396606b5e11f4947215f..5d5bb3be02944c68c0fa8753ad53b693a636d3e5 100644
--- a/var/spack/repos/builtin/packages/environment-modules/package.py
+++ b/var/spack/repos/builtin/packages/environment-modules/package.py
@@ -35,7 +35,7 @@ class EnvironmentModules(Package):
     version('3.2.10', '8b097fdcb90c514d7540bb55a3cb90fb')
 
     # Dependencies:
-    depends_on('tcl')
+    depends_on('tcl', type=alldeps)
 
     def install(self, spec, prefix):
         tcl_spec = spec['tcl']
diff --git a/var/spack/repos/builtin/packages/exodusii/package.py b/var/spack/repos/builtin/packages/exodusii/package.py
index 5e9227af46da79e2b233e40ecde722a35dd795fa..eb6c23afeb67cc74173cad860bb44655133699db 100644
--- a/var/spack/repos/builtin/packages/exodusii/package.py
+++ b/var/spack/repos/builtin/packages/exodusii/package.py
@@ -44,9 +44,7 @@ class Exodusii(Package):
 
     version('2016-02-08', git='https://github.com/gsjaardema/seacas.git', commit='dcf3529')
 
-    # TODO: Make this a build dependency once build dependencies are supported
-    # (see: https://github.com/LLNL/spack/pull/378).
-    depends_on('cmake@2.8.7:')
+    depends_on('cmake@2.8.7:', type='build')
     depends_on('hdf5~shared~mpi')
     depends_on('netcdf~mpi')
 
diff --git a/var/spack/repos/builtin/packages/expat/package.py b/var/spack/repos/builtin/packages/expat/package.py
index 51e827b2c52c08aa72302045121f178c76ed9c75..2a9ac123f34eaaecd5c7d54adc7dae65a33cea81 100644
--- a/var/spack/repos/builtin/packages/expat/package.py
+++ b/var/spack/repos/builtin/packages/expat/package.py
@@ -31,7 +31,7 @@ class Expat(Package):
 
     version('2.1.0', 'dd7dab7a5fea97d2a6a43f511449b7cd')
 
-    depends_on('cmake')
+    depends_on('cmake', type='build')
 
     def install(self, spec, prefix):
 
diff --git a/var/spack/repos/builtin/packages/flex/package.py b/var/spack/repos/builtin/packages/flex/package.py
index b778538606ae82dc14538817ad0d6253ad4bec94..800e4b9d96ad4425df65d24461a50503545b12cd 100644
--- a/var/spack/repos/builtin/packages/flex/package.py
+++ b/var/spack/repos/builtin/packages/flex/package.py
@@ -34,7 +34,7 @@ class Flex(Package):
     version('2.6.0', '5724bcffed4ebe39e9b55a9be80859ec')
     version('2.5.39', 'e133e9ead8ec0a58d81166b461244fde')
 
-    depends_on("bison")
+    depends_on("bison", type='build')
 
     def install(self, spec, prefix):
         configure("--prefix=%s" % prefix)
diff --git a/var/spack/repos/builtin/packages/flux/package.py b/var/spack/repos/builtin/packages/flux/package.py
index 2b972d63ae8ed65ff1a479cdba1fe6c95ec77bd6..dec339a6affa7e4c4c7d43d97a2ac6903027d84d 100644
--- a/var/spack/repos/builtin/packages/flux/package.py
+++ b/var/spack/repos/builtin/packages/flux/package.py
@@ -45,8 +45,8 @@ class Flux(Package):
     depends_on("py-cffi")
 
     # TODO: This provides a catalog, hacked with environment below for now
-    depends_on("docbook-xml")
-    depends_on("asciidoc")
+    depends_on("docbook-xml", type='build')
+    depends_on("asciidoc", type='build')
 
     def install(self, spec, prefix):
         # Bootstrap with autotools
diff --git a/var/spack/repos/builtin/packages/foam-extend/package.py b/var/spack/repos/builtin/packages/foam-extend/package.py
index 4479fc9beef6d83c9606b8bde061f9f58c197b01..0ff57658950531ae4e5e8b8efe7bc7c337a97942 100644
--- a/var/spack/repos/builtin/packages/foam-extend/package.py
+++ b/var/spack/repos/builtin/packages/foam-extend/package.py
@@ -29,6 +29,7 @@ class FoamExtend(Package):
     depends_on('python')
     depends_on('flex@:2.5.99')
     depends_on('zlib')
+    depends_on('cmake', type='build')
 
     depends_on('scotch ~ metis', when='~ptscotch+scotch')
     depends_on('scotch ~ metis + mpi', when='+ptscotch')
diff --git a/var/spack/repos/builtin/packages/gdal/package.py b/var/spack/repos/builtin/packages/gdal/package.py
index caff06bdd6d9dfe4f370c8f273b94412aca3658e..9ed83bc3be94796cf6efe821d27c978ca5027b42 100644
--- a/var/spack/repos/builtin/packages/gdal/package.py
+++ b/var/spack/repos/builtin/packages/gdal/package.py
@@ -62,7 +62,7 @@ class Gdal(Package):
     depends_on("libpng")
     depends_on("zlib")
     depends_on("proj")
-    depends_on("py-numpy")
+    depends_on("py-numpy", type=nolink)
 
     parallel = False
 
diff --git a/var/spack/repos/builtin/packages/gdb/package.py b/var/spack/repos/builtin/packages/gdb/package.py
index 58d8a545dbca6cd8e210e1c174bf59227006e52a..78ad4b307dce27b363d56141b9853d999f996596 100644
--- a/var/spack/repos/builtin/packages/gdb/package.py
+++ b/var/spack/repos/builtin/packages/gdb/package.py
@@ -41,7 +41,7 @@ class Gdb(Package):
     version('7.9', '8f8ced422fe462a00e0135a643544f17')
     version('7.8.2', '8b0ea8b3559d3d90b3ff4952f0aeafbc')
 
-    depends_on('texinfo')
+    depends_on('texinfo', type='build')
 
     def install(self, spec, prefix):
         configure('--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/gflags/package.py b/var/spack/repos/builtin/packages/gflags/package.py
index 9f3552d53dcd71aad0126c02938d570061245ebb..47bbf369efd6779c54de76c945cfc7b24809be56 100644
--- a/var/spack/repos/builtin/packages/gflags/package.py
+++ b/var/spack/repos/builtin/packages/gflags/package.py
@@ -37,6 +37,8 @@ class Gflags(Package):
 
     version('2.1.2', 'ac432de923f9de1e9780b5254884599f')
 
+    depends_on('cmake', type='build')
+
     def install(self, spec, prefix):
         cmake("-DCMAKE_INSTALL_PREFIX=" + prefix,
               "-DBUILD_SHARED_LIBS=ON")
diff --git a/var/spack/repos/builtin/packages/git/package.py b/var/spack/repos/builtin/packages/git/package.py
index 03e7d3e03122fdcac44d9b993074809218c57aa7..4cbbaac342465bfedf37fbf9b5e8f98b94a93665 100644
--- a/var/spack/repos/builtin/packages/git/package.py
+++ b/var/spack/repos/builtin/packages/git/package.py
@@ -49,7 +49,7 @@ class Git(Package):
 
 
     depends_on("openssl")
-    depends_on("autoconf")
+    depends_on("autoconf", type='build')
     depends_on("curl")
     depends_on("expat")
 
diff --git a/var/spack/repos/builtin/packages/glib/package.py b/var/spack/repos/builtin/packages/glib/package.py
index 342a61a6a1be80c068f5d62ce946faa0850419f4..0a0a02f464e87a0eba451c7b3dc85747467fa53a 100644
--- a/var/spack/repos/builtin/packages/glib/package.py
+++ b/var/spack/repos/builtin/packages/glib/package.py
@@ -38,8 +38,8 @@ class Glib(Package):
 
     depends_on("libffi")
     depends_on("zlib")
-    depends_on("pkg-config")
-    depends_on('gettext', sys.platform == 'darwin')
+    depends_on("pkg-config", type='build')
+    depends_on('gettext', when=sys.platform == 'darwin')
 
     # The following patch is needed for gcc-6.1
     patch('g_date_strftime.patch')
diff --git a/var/spack/repos/builtin/packages/glm/package.py b/var/spack/repos/builtin/packages/glm/package.py
index 0c9212f17d6771f35b5d1568441ecbc45bb2e3dc..442c1cdf40a164b947c24c0e62d3305c8958ecb0 100644
--- a/var/spack/repos/builtin/packages/glm/package.py
+++ b/var/spack/repos/builtin/packages/glm/package.py
@@ -35,8 +35,8 @@ class Glm(Package):
     url = "https://github.com/g-truc/glm/archive/0.9.7.1.tar.gz"
 
     version('0.9.7.1', '61af6639cdf652d1cdd7117190afced8')
-    
-    depends_on ("cmake")
+
+    depends_on('cmake', type='build')
 
     def install(self, spec, prefix):
         with working_dir('spack-build', create=True):
diff --git a/var/spack/repos/builtin/packages/global/package.py b/var/spack/repos/builtin/packages/global/package.py
index c144d6660b228e58d7b3b53f070f2b41a2e3df99..f832834a2804b15ab4769391c8dafee68b159b0c 100644
--- a/var/spack/repos/builtin/packages/global/package.py
+++ b/var/spack/repos/builtin/packages/global/package.py
@@ -34,7 +34,7 @@ class Global(Package):
 
     version('6.5', 'dfec818b4f53d91721e247cf7b218078')
 
-    depends_on('exuberant-ctags')
+    depends_on('exuberant-ctags', type=nolink)
     depends_on('ncurses')
 
     def install(self, spec, prefix):
diff --git a/var/spack/repos/builtin/packages/gmp/package.py b/var/spack/repos/builtin/packages/gmp/package.py
index 3933788425232d3b4d34dcfb12bb07827ceb225c..e2c2892f18c197860572ccbc95707e6a0f7aaff6 100644
--- a/var/spack/repos/builtin/packages/gmp/package.py
+++ b/var/spack/repos/builtin/packages/gmp/package.py
@@ -35,7 +35,7 @@ class Gmp(Package):
     version('6.0.0a', 'b7ff2d88cae7f8085bd5006096eed470')
     version('6.0.0' , '6ef5869ae735db9995619135bd856b84')
 
-    depends_on("m4")
+    depends_on("m4", type='build')
 
     def install(self, spec, prefix):
         configure("--prefix=%s" % prefix)
diff --git a/var/spack/repos/builtin/packages/gmsh/package.py b/var/spack/repos/builtin/packages/gmsh/package.py
index 0951b86d57ecfa6c99a9a503b411dd462eed2c83..fe26cb3bf2da606bac44631c3deb07199f135004 100644
--- a/var/spack/repos/builtin/packages/gmsh/package.py
+++ b/var/spack/repos/builtin/packages/gmsh/package.py
@@ -53,7 +53,7 @@ class Gmsh(Package):
 
     depends_on('blas')
     depends_on('lapack')
-    depends_on('cmake@2.8:')
+    depends_on('cmake@2.8:', type='build')
     depends_on('gmp')
     depends_on('mpi',  when='+mpi')
     # Assumes OpenGL with GLU is already provided by the system:
diff --git a/var/spack/repos/builtin/packages/go/package.py b/var/spack/repos/builtin/packages/go/package.py
index 13b83517d175a4d40c6d859bfdc4fe8798ea6b86..ff2c2f67819bc7f22057efd91228eed7b82f4972 100644
--- a/var/spack/repos/builtin/packages/go/package.py
+++ b/var/spack/repos/builtin/packages/go/package.py
@@ -24,7 +24,7 @@ class Go(Package):
 
     # to-do, make non-c self-hosting compilers feasible without backflips
     # should be a dep on external go compiler
-    depends_on('go-bootstrap')
+    depends_on('go-bootstrap', type='build')
     depends_on('git')
 
     def install(self, spec, prefix):
diff --git a/var/spack/repos/builtin/packages/googletest/package.py b/var/spack/repos/builtin/packages/googletest/package.py
index 9444253c8cb734e823c1321acea9973b2daf25f3..1dc74fbcf4b5455a2bf79abb289d5d252a7ab850 100644
--- a/var/spack/repos/builtin/packages/googletest/package.py
+++ b/var/spack/repos/builtin/packages/googletest/package.py
@@ -31,7 +31,7 @@ class Googletest(Package):
 
     version('1.7.0', '5eaf03ed925a47b37c8e1d559eb19bc4')
 
-    depends_on("cmake")
+    depends_on("cmake", type='build')
 
     def install(self, spec, prefix):
         which('cmake')('.', *std_cmake_args)
diff --git a/var/spack/repos/builtin/packages/graphlib/package.py b/var/spack/repos/builtin/packages/graphlib/package.py
index f70f32cc8a141810b22125eea81c26243a24b3e0..087a322acc9cdefe190006bcc84061d9a6b2470a 100644
--- a/var/spack/repos/builtin/packages/graphlib/package.py
+++ b/var/spack/repos/builtin/packages/graphlib/package.py
@@ -31,6 +31,8 @@ class Graphlib(Package):
 
     version('2.0.0', '43c6df84f1d38ba5a5dce0ae19371a70')
 
+    depends_on('cmake', type='build')
+
     def install(self, spec, prefix):
         cmake(".", *std_cmake_args)
 
diff --git a/var/spack/repos/builtin/packages/graphviz/package.py b/var/spack/repos/builtin/packages/graphviz/package.py
index 2f99015ba2618d44cc6554a214502cf4eefd2efe..e5898a6e590b43d1988472d546110988c593b5d7 100644
--- a/var/spack/repos/builtin/packages/graphviz/package.py
+++ b/var/spack/repos/builtin/packages/graphviz/package.py
@@ -44,7 +44,7 @@ class Graphviz(Package):
     depends_on("swig")
     depends_on("python")
     depends_on("ghostscript")
-    depends_on("pkg-config")
+    depends_on("pkg-config", type='build')
 
     def install(self, spec, prefix):
         options = ['--prefix=%s' % prefix]
diff --git a/var/spack/repos/builtin/packages/gromacs/package.py b/var/spack/repos/builtin/packages/gromacs/package.py
index 1a50a4248882b189071fb51365040b474beb3f41..55eacc8d38dc4d74865fabb90266fbb210dddac6 100644
--- a/var/spack/repos/builtin/packages/gromacs/package.py
+++ b/var/spack/repos/builtin/packages/gromacs/package.py
@@ -50,6 +50,7 @@ class Gromacs(Package):
     depends_on('mpi', when='+mpi')
 
     depends_on('fftw')
+    depends_on('cmake', type='build')
 
     # TODO : add GPU support
 
diff --git a/var/spack/repos/builtin/packages/hdf5-blosc/package.py b/var/spack/repos/builtin/packages/hdf5-blosc/package.py
index 50f380083cf5e3b8cb762780f208b5cd1dfa3cc2..28b65711b0f726e78941279a941128bbe5b43865 100644
--- a/var/spack/repos/builtin/packages/hdf5-blosc/package.py
+++ b/var/spack/repos/builtin/packages/hdf5-blosc/package.py
@@ -53,7 +53,7 @@ class Hdf5Blosc(Package):
 
     depends_on("c-blosc")
     depends_on("hdf5")
-    depends_on("libtool")
+    depends_on("libtool", type='build')
 
     parallel = False
 
diff --git a/var/spack/repos/builtin/packages/hoomd-blue/package.py b/var/spack/repos/builtin/packages/hoomd-blue/package.py
index 90d5107e3be78921ada810f30db2fa9687826802..060cd0b713d2eae72f2e9f04f9f9763cbbb11644 100644
--- a/var/spack/repos/builtin/packages/hoomd-blue/package.py
+++ b/var/spack/repos/builtin/packages/hoomd-blue/package.py
@@ -45,12 +45,12 @@ class HoomdBlue(Package):
     variant('doc',  default=True, description='Generate documentation')
 
     extends('python')
-    depends_on('py-numpy')
+    depends_on('py-numpy', type=nolink)
     depends_on('boost+python')
-    depends_on('cmake')
+    depends_on('cmake', type='build')
     depends_on('mpi', when='+mpi')
     depends_on('cuda', when='+cuda')
-    depends_on('doxygen', when='+doc')
+    depends_on('doxygen', when='+doc', type='build')
 
     def install(self, spec, prefix):
 
diff --git a/var/spack/repos/builtin/packages/ibmisc/package.py b/var/spack/repos/builtin/packages/ibmisc/package.py
index 8e6cf429a7f15320147333afe299ffb11d154dde..ed1e6c6cbf38919fd5f8a02e45fbc0ff83f4ec69 100644
--- a/var/spack/repos/builtin/packages/ibmisc/package.py
+++ b/var/spack/repos/builtin/packages/ibmisc/package.py
@@ -26,13 +26,13 @@ class Ibmisc(CMakePackage):
     depends_on('netcdf-cxx4', when='+netcdf')
     depends_on('udunits2', when='+udunits2')
     depends_on('googletest', when='+googletest')
-    depends_on('py-cython', when='+python')
-    depends_on('py-numpy', when='+python')
+    depends_on('py-cython', when='+python', type=nolink)
+    depends_on('py-numpy', when='+python', type=nolink)
     depends_on('boost', when='+boost')
 
     # Build dependencies
-    depends_on('cmake')
-    depends_on('doxygen')
+    depends_on('cmake', type='build')
+    depends_on('doxygen', type='build')
 
     def configure_args(self):
         spec = self.spec
diff --git a/var/spack/repos/builtin/packages/ipopt/package.py b/var/spack/repos/builtin/packages/ipopt/package.py
index 47c5ca0c0985c23fc2c40b0c7e6f38b95225b9ca..3bd21df89ea9410fde50844636c9ada4e7174002 100644
--- a/var/spack/repos/builtin/packages/ipopt/package.py
+++ b/var/spack/repos/builtin/packages/ipopt/package.py
@@ -38,7 +38,7 @@ class Ipopt(Package):
 
     depends_on("blas")
     depends_on("lapack")
-    depends_on("pkg-config")
+    depends_on("pkg-config", type='build')
     depends_on("mumps+double~mpi") 
     
     def install(self, spec, prefix):
diff --git a/var/spack/repos/builtin/packages/julia/package.py b/var/spack/repos/builtin/packages/julia/package.py
index 99d138dcff930ff7dc37c858a3582f9b6d815894..536ce692364535ec0e60db51e8aa384837d97ada 100644
--- a/var/spack/repos/builtin/packages/julia/package.py
+++ b/var/spack/repos/builtin/packages/julia/package.py
@@ -44,16 +44,16 @@ class Julia(Package):
     patch('openblas.patch', when='@0.4:0.4.5')
 
     # Build-time dependencies:
-    # depends_on("awk")
-    # depends_on("m4")
-    # depends_on("pkg-config")
+    # depends_on("awk", type='build')
+    # depends_on("m4", type='build')
+    # depends_on("pkg-config", type='build')
 
     # Combined build-time and run-time dependencies:
-    depends_on("binutils")
-    depends_on("cmake @2.8:")
-    depends_on("git")
-    depends_on("openssl")
-    depends_on("python @2.7:2.999")
+    depends_on("binutils", type=nolink)
+    depends_on("cmake @2.8:", type=nolink)
+    depends_on("git", type=nolink)
+    depends_on("openssl", type=nolink)
+    depends_on("python @2.7:2.999", type=nolink)
 
     # I think that Julia requires the dependencies above, but it
     # builds fine (on my system) without these. We should enable them
@@ -93,8 +93,8 @@ class Julia(Package):
     # USE_SYSTEM_LIBGIT2=0
 
     # Run-time dependencies for Julia packages:
-    depends_on("hdf5")
-    depends_on("mpi")
+    depends_on("hdf5", type='run')
+    depends_on("mpi", type='run')
 
     def install(self, spec, prefix):
         # Explicitly setting CC, CXX, or FC breaks building libuv, one
diff --git a/var/spack/repos/builtin/packages/launchmon/package.py b/var/spack/repos/builtin/packages/launchmon/package.py
index f2568100059950cf61261f1225a4d8caa445c2ad..8aa6d727278688cfc8c4b28ca6d42233bda81d01 100644
--- a/var/spack/repos/builtin/packages/launchmon/package.py
+++ b/var/spack/repos/builtin/packages/launchmon/package.py
@@ -33,9 +33,9 @@ class Launchmon(Package):
 
     version('1.0.2', '8d6ba77a0ec2eff2fde2c5cc8fa7ff7a')
 
-    depends_on('autoconf')
-    depends_on('automake')
-    depends_on('libtool')
+    depends_on('autoconf', type='build')
+    depends_on('automake', type='build')
+    depends_on('libtool', type='build')
 
     def install(self, spec, prefix):
         configure(
diff --git a/var/spack/repos/builtin/packages/libgd/package.py b/var/spack/repos/builtin/packages/libgd/package.py
index 5e4e420842bc3edd51caf240ae811aa3937632ac..938f4f6f3b7789a3e6f579568043bfbea5be0061 100644
--- a/var/spack/repos/builtin/packages/libgd/package.py
+++ b/var/spack/repos/builtin/packages/libgd/package.py
@@ -40,6 +40,7 @@ class Libgd(Package):
     version('2.1.1', 'e91a1a99903e460e7ba00a794e72cc1e')
 
     depends_on('libpng')
+    depends_on('cmake', type='build')
 
     def install(self, spec, prefix):
 
diff --git a/var/spack/repos/builtin/packages/libjpeg-turbo/package.py b/var/spack/repos/builtin/packages/libjpeg-turbo/package.py
index 8615b2ed833a3d13f84fa2c6b5b8c5ab3715f82d..d1239ba0d989bfd56eb257c81b25f9fbf7d2174f 100644
--- a/var/spack/repos/builtin/packages/libjpeg-turbo/package.py
+++ b/var/spack/repos/builtin/packages/libjpeg-turbo/package.py
@@ -35,8 +35,8 @@ class LibjpegTurbo(Package):
     version('1.3.1', '2c3a68129dac443a72815ff5bb374b05')
 
     # Can use either of these.
-    depends_on("yasm")
-    depends_on("nasm")
+    depends_on("yasm", type='build')
+    depends_on("nasm", type='build')
 
     def install(self, spec, prefix):
         configure("--prefix=%s" % prefix)
diff --git a/var/spack/repos/builtin/packages/libtool/package.py b/var/spack/repos/builtin/packages/libtool/package.py
index 0e410a5061471e365f7d9e7135b78319ff1d80c1..a0070d72d078dff1fead450f98c29e2c3ac3da13 100644
--- a/var/spack/repos/builtin/packages/libtool/package.py
+++ b/var/spack/repos/builtin/packages/libtool/package.py
@@ -35,7 +35,7 @@ class Libtool(Package):
     version('2.4.6', 'addf44b646ddb4e3919805aa88fa7c5e')
     version('2.4.2', 'd2f3b7d4627e69e13514a40e72a24d50')
 
-    depends_on('m4')
+    depends_on('m4', type='build')
 
     def _make_executable(self, name):
         return Executable(join_path(self.prefix.bin, name))
diff --git a/var/spack/repos/builtin/packages/libuv/package.py b/var/spack/repos/builtin/packages/libuv/package.py
index 63565c7aeaba69ece3002985793b80674b5d0131..0d29270b381e22659d3a96118db8b26368b34db7 100644
--- a/var/spack/repos/builtin/packages/libuv/package.py
+++ b/var/spack/repos/builtin/packages/libuv/package.py
@@ -31,9 +31,9 @@ class Libuv(Package):
 
     version('1.9.0', '14737f9c76123a19a290dabb7d1cd04c')
 
-    depends_on('automake')
-    depends_on('autoconf')
-    depends_on('libtool')
+    depends_on('automake', type='build')
+    depends_on('autoconf', type='build')
+    depends_on('libtool', type='build')
 
     def install(self, spec, prefix):
         bash = which("bash")
diff --git a/var/spack/repos/builtin/packages/libxcb/package.py b/var/spack/repos/builtin/packages/libxcb/package.py
index 746d4567e200fbb9fbc9a92a3933b1b13cd7edd9..586eb970d8fe60e63f6c4e3c48bcf124efbe0ac9 100644
--- a/var/spack/repos/builtin/packages/libxcb/package.py
+++ b/var/spack/repos/builtin/packages/libxcb/package.py
@@ -36,9 +36,9 @@ class Libxcb(Package):
     version('1.11', '1698dd837d7e6e94d029dbe8b3a82deb')
     version('1.11.1', '118623c15a96b08622603a71d8789bf3')
 
-    depends_on("python")
+    depends_on("python", type='build')
     depends_on("xcb-proto")
-    depends_on("pkg-config")
+    depends_on("pkg-config", type='build')
     depends_on("libpthread-stubs")
     depends_on('libxau')
 
diff --git a/var/spack/repos/builtin/packages/llvm-lld/package.py b/var/spack/repos/builtin/packages/llvm-lld/package.py
index 073c2d1b9e327bb7bf8209376c4955f8c41f829a..127fe1204d2270261eb768a00f84bdc5b237db4b 100644
--- a/var/spack/repos/builtin/packages/llvm-lld/package.py
+++ b/var/spack/repos/builtin/packages/llvm-lld/package.py
@@ -34,6 +34,8 @@ class LlvmLld(Package):
 
     version('3.4', '3b6a17e58c8416c869c14dd37682f78e')
 
+    depends_on('cmake', type='build')
+
     def install(self, spec, prefix):
         env['CXXFLAGS'] = self.compier.cxx11_flag
 
diff --git a/var/spack/repos/builtin/packages/llvm/package.py b/var/spack/repos/builtin/packages/llvm/package.py
index 7a6ea7401cee6f94ad920b57b013478b5425fbac..e79c123a7eabd14dc408191a5db99a47bb2acbbb 100644
--- a/var/spack/repos/builtin/packages/llvm/package.py
+++ b/var/spack/repos/builtin/packages/llvm/package.py
@@ -51,7 +51,7 @@ class Llvm(Package):
     variant('all_targets', default=True, description="Build all supported targets, default targets <current arch>,NVPTX,AMDGPU,CppBackend")
 
     # Build dependency
-    depends_on('cmake @2.8.12.2:')
+    depends_on('cmake@2.8.12.2:', type='build')
 
     # Universal dependency
     depends_on('python@2.7:2.8')  # Seems not to support python 3.X.Y
diff --git a/var/spack/repos/builtin/packages/lmod/package.py b/var/spack/repos/builtin/packages/lmod/package.py
index 7d75866d52fe73ec8f6a4b63ac02734aad49fa3e..efa235f646a217a96955152637975d1645880f10 100644
--- a/var/spack/repos/builtin/packages/lmod/package.py
+++ b/var/spack/repos/builtin/packages/lmod/package.py
@@ -42,8 +42,8 @@ class Lmod(Package):
     version('6.0.1', '91abf52fe5033bd419ffe2842ebe7af9')
 
     depends_on('lua@5.2:')
-    depends_on('lua-luaposix')
-    depends_on('lua-luafilesystem')
+    depends_on('lua-luaposix', type=nolink)
+    depends_on('lua-luafilesystem', type=nolink)
 
     parallel = False
 
diff --git a/var/spack/repos/builtin/packages/lua/package.py b/var/spack/repos/builtin/packages/lua/package.py
index 48c1c6a9199eb3cf826133d3d82efc05d74041a9..ca0a481a83d8f229f4ba9d1a1a97d867b76937b6 100644
--- a/var/spack/repos/builtin/packages/lua/package.py
+++ b/var/spack/repos/builtin/packages/lua/package.py
@@ -86,7 +86,7 @@ def append_paths(self, paths, cpaths, path):
 
     def setup_dependent_environment(self, spack_env, run_env, extension_spec):
         lua_paths = []
-        for d in extension_spec.traverse():
+        for d in extension_spec.traverse(deptypes=nolink, deptype_query='run'):
             if d.package.extends(self.spec):
                 lua_paths.append(os.path.join(d.prefix, self.lua_lib_dir))
                 lua_paths.append(os.path.join(d.prefix, self.lua_share_dir))
diff --git a/var/spack/repos/builtin/packages/mbedtls/package.py b/var/spack/repos/builtin/packages/mbedtls/package.py
index ae34d25691103cbd02b78f71f920577947b1dff4..13c0ce768fefdc53ddc2c7a89654758c0d26b734 100644
--- a/var/spack/repos/builtin/packages/mbedtls/package.py
+++ b/var/spack/repos/builtin/packages/mbedtls/package.py
@@ -37,7 +37,7 @@ class Mbedtls(Package):
     version('2.1.3' , '7eb4cf1dfa68578a2c8dbd0b6fa752dd')
     version('1.3.16', '4144d7320c691f721aeb9e67a1bc38e0')
 
-    depends_on('cmake')
+    depends_on('cmake', type='build')
 
     def install(self, spec, prefix):
         cmake('.', *std_cmake_args)
diff --git a/var/spack/repos/builtin/packages/memaxes/package.py b/var/spack/repos/builtin/packages/memaxes/package.py
index 135384e2f7746c2b617456760ecbac16187e2249..31672abaec0bf4d78e4d97ab72423f7fd164efcb 100644
--- a/var/spack/repos/builtin/packages/memaxes/package.py
+++ b/var/spack/repos/builtin/packages/memaxes/package.py
@@ -32,7 +32,7 @@ class Memaxes(Package):
     version('0.5', '5874f3fda9fd2d313c0ff9684f915ab5',
             url='https://github.com/llnl/MemAxes/archive/v0.5.tar.gz')
 
-    depends_on("cmake@2.8.9:")
+    depends_on('cmake@2.8.9:', type='build')
     depends_on("qt@5:")
 
     def install(self, spec, prefix):
diff --git a/var/spack/repos/builtin/packages/mesa/package.py b/var/spack/repos/builtin/packages/mesa/package.py
index bd9c9eec4aa370f76a7d3f51508794d343e7bc29..3bad17b5cb0aab545e48f95379d94b64aeb45273 100644
--- a/var/spack/repos/builtin/packages/mesa/package.py
+++ b/var/spack/repos/builtin/packages/mesa/package.py
@@ -44,8 +44,8 @@ class Mesa(Package):
 
     # mesa 10.x
     # depends_on("py-mako")
-    # depends_on("flex")
-    # depends_on("bison")
+    # depends_on("flex", type='build')
+    # depends_on("bison", type='build')
     # depends_on("dri2proto")
     # depends_on("libxcb")
     # depends_on("libxshmfence")
diff --git a/var/spack/repos/builtin/packages/metis/package.py b/var/spack/repos/builtin/packages/metis/package.py
index c4f2afaff258e99c96ca2074e016de9857b2c93d..2180f2cce2f473d2539f834f0578e919176d412c 100644
--- a/var/spack/repos/builtin/packages/metis/package.py
+++ b/var/spack/repos/builtin/packages/metis/package.py
@@ -50,7 +50,7 @@ class Metis(Package):
     variant('idx64', default=False, description='Use int64_t as default index type')
     variant('real64', default=False, description='Use double precision floating point types')
 
-    depends_on('cmake@2.8:', when='@5:')  # build-time dependency
+    depends_on('cmake@2.8:', when='@5:', type='build')
 
     patch('install_gklib_defs_rename.patch', when='@5:')
 
diff --git a/var/spack/repos/builtin/packages/mfem/package.py b/var/spack/repos/builtin/packages/mfem/package.py
index 1b4456380b45dbe834b70a1a145598732a316770..e7a1d963889ed1d0aca0794746092013a704b31a 100644
--- a/var/spack/repos/builtin/packages/mfem/package.py
+++ b/var/spack/repos/builtin/packages/mfem/package.py
@@ -62,7 +62,7 @@ class Mfem(Package):
     depends_on('blas', when='+suite-sparse')
     depends_on('lapack', when='+suite-sparse')
     depends_on('metis@5:', when='+suite-sparse ^suite-sparse@4.5:')
-    depends_on('cmake', when='^metis@5:')
+    depends_on('cmake', when='^metis@5:', type='build')
 
     def check_variants(self, spec):
         if '+mpi' in spec and ('+hypre' not in spec or '+metis' not in spec):
diff --git a/var/spack/repos/builtin/packages/mpibash/package.py b/var/spack/repos/builtin/packages/mpibash/package.py
index b328b98ecf7a4dbf9a31a4127c69bc467d8c8211..e659663d9010bb90dec8c8f7b9b2fa25f5fb6be1 100644
--- a/var/spack/repos/builtin/packages/mpibash/package.py
+++ b/var/spack/repos/builtin/packages/mpibash/package.py
@@ -36,7 +36,7 @@ class Mpibash(Package):
     patch('mpibash-4.3.patch', level=1, when='@4.3')
 
     # above patch modifies configure.ac
-    depends_on('autoconf')
+    depends_on('autoconf', type='build')
 
     # uses MPI_Exscan which is in MPI-1.2 and later
     depends_on('mpi@1.2:')
diff --git a/var/spack/repos/builtin/packages/msgpack-c/package.py b/var/spack/repos/builtin/packages/msgpack-c/package.py
index 925dceabed68f047f96426b045e60cfcb67b299b..d42ac255d0e00e93e9a6ef66a06d80963212f501 100644
--- a/var/spack/repos/builtin/packages/msgpack-c/package.py
+++ b/var/spack/repos/builtin/packages/msgpack-c/package.py
@@ -31,6 +31,8 @@ class MsgpackC(Package):
 
     version('1.4.1', 'e2fd3a7419b9bc49e5017fdbefab87e0')
 
+    depends_on('cmake', type='build')
+
     def install(self, spec, prefix):
         cmake('.', *std_cmake_args)
 
diff --git a/var/spack/repos/builtin/packages/muster/package.py b/var/spack/repos/builtin/packages/muster/package.py
index 993f14724505ce95bf0150a65cccf6b6ce487f31..64b7324415fe6e2292a0d97418697a8992a98ebe 100644
--- a/var/spack/repos/builtin/packages/muster/package.py
+++ b/var/spack/repos/builtin/packages/muster/package.py
@@ -39,6 +39,7 @@ class Muster(Package):
 
     depends_on("boost")
     depends_on("mpi")
+    depends_on('cmake', type='build')
 
     def install(self, spec, prefix):
         cmake(".", *std_cmake_args)
diff --git a/var/spack/repos/builtin/packages/netcdf-cxx4/package.py b/var/spack/repos/builtin/packages/netcdf-cxx4/package.py
index f8af76429b84a4588dcc75ff2140c93a04761a22..0fb181a7b2e31d15c3da40f032a653312e240728 100644
--- a/var/spack/repos/builtin/packages/netcdf-cxx4/package.py
+++ b/var/spack/repos/builtin/packages/netcdf-cxx4/package.py
@@ -34,7 +34,7 @@ class NetcdfCxx4(Package):
     version('4.2.1', 'd019853802092cf686254aaba165fc81')
 
     depends_on('netcdf')
-    depends_on("autoconf")
+    depends_on("autoconf", type='build')
 
     def install(self, spec, prefix):
         # Rebuild to prevent problems of inconsistency in git repo
diff --git a/var/spack/repos/builtin/packages/netcdf/package.py b/var/spack/repos/builtin/packages/netcdf/package.py
index c2256d5e9f9d691ca60e48a3539e393505d8e840..063d38e4f943fa9c526e99149cd1b3b0f246d822 100644
--- a/var/spack/repos/builtin/packages/netcdf/package.py
+++ b/var/spack/repos/builtin/packages/netcdf/package.py
@@ -39,7 +39,7 @@ class Netcdf(Package):
     variant('mpi',  default=True,  description='Enables MPI parallelism')
     variant('hdf4', default=False, description='Enable HDF4 support')
 
-    depends_on("m4")
+    depends_on("m4", type='build')
     depends_on("hdf", when='+hdf4')
 
     # Required for DAP support
diff --git a/var/spack/repos/builtin/packages/netlib-lapack/package.py b/var/spack/repos/builtin/packages/netlib-lapack/package.py
index 47857eb713e6bb199e01e0d6c15a8b3b6940f126..70015baf1c53c7c00491e97fc64acca8bae5a62e 100644
--- a/var/spack/repos/builtin/packages/netlib-lapack/package.py
+++ b/var/spack/repos/builtin/packages/netlib-lapack/package.py
@@ -52,7 +52,7 @@ class NetlibLapack(Package):
     provides('blas', when='~external-blas')
     provides('lapack')
 
-    depends_on('cmake')
+    depends_on('cmake', type='build')
     depends_on('blas', when='+external-blas')
 
 
diff --git a/var/spack/repos/builtin/packages/netlib-scalapack/package.py b/var/spack/repos/builtin/packages/netlib-scalapack/package.py
index f7fe26a42da85c5288ffef8ad8f224c1b816bcf8..a8250a38de3fd5445b85c01e0cca72552c117e8e 100644
--- a/var/spack/repos/builtin/packages/netlib-scalapack/package.py
+++ b/var/spack/repos/builtin/packages/netlib-scalapack/package.py
@@ -42,9 +42,9 @@ class NetlibScalapack(Package):
 
     provides('scalapack')
 
-    depends_on('cmake')
     depends_on('mpi')
     depends_on('lapack')
+    depends_on('cmake', when='@2.0.0:', type='build')
 
     def install(self, spec, prefix):
         options = [
diff --git a/var/spack/repos/builtin/packages/numdiff/package.py b/var/spack/repos/builtin/packages/numdiff/package.py
index e15d60cb0b78536e5ded4eb50ac46b89f87b30c3..97164165e018e6d5509602b4322d8025a25c4fdc 100644
--- a/var/spack/repos/builtin/packages/numdiff/package.py
+++ b/var/spack/repos/builtin/packages/numdiff/package.py
@@ -35,7 +35,7 @@ class Numdiff(Package):
 
     version('5.8.1',    'a295eb391f6cb1578209fc6b4f9d994e')
 
-    depends_on('gettext', sys.platform=='darwin')
+    depends_on('gettext', when=sys.platform=='darwin', type='build')
 
     def install(self, spec, prefix):
         options = ['--prefix=%s' % prefix]
diff --git a/var/spack/repos/builtin/packages/oce/package.py b/var/spack/repos/builtin/packages/oce/package.py
index 06b6b7cbb07a8fac6fbe801f753f09abce8dd6cf..108c8f8a41c0d30242309e859f75ce235e553cf9 100644
--- a/var/spack/repos/builtin/packages/oce/package.py
+++ b/var/spack/repos/builtin/packages/oce/package.py
@@ -42,7 +42,7 @@ class Oce(Package):
 
     variant('tbb', default=True, description='Build with Intel Threading Building Blocks')
 
-    depends_on('cmake@2.8:')
+    depends_on('cmake@2.8:', type='build')
     depends_on('tbb', when='+tbb')
 
     # There is a bug in OCE which appears with Clang (version?) or GCC 6.0
diff --git a/var/spack/repos/builtin/packages/octave/package.py b/var/spack/repos/builtin/packages/octave/package.py
index 6535f528eeec30fb21a4f9e5e3ac8e6b5fafb0d4..aa521899e5c9acacfb40843c59d3d2ceeb93196e 100644
--- a/var/spack/repos/builtin/packages/octave/package.py
+++ b/var/spack/repos/builtin/packages/octave/package.py
@@ -68,9 +68,9 @@ class Octave(Package):
     depends_on('blas')
     depends_on('lapack')
     # Octave does not configure with sed from darwin:
-    depends_on('sed', sys.platform == 'darwin')
+    depends_on('sed', when=sys.platform == 'darwin', type='build')
     depends_on('pcre')
-    depends_on('pkg-config')
+    depends_on('pkg-config', type='build')
 
     # Strongly recommended dependencies
     depends_on('readline',     when='+readline')
diff --git a/var/spack/repos/builtin/packages/ompt-openmp/package.py b/var/spack/repos/builtin/packages/ompt-openmp/package.py
index e74dcf6c23332e8df76dd9e246fd9573ec8f2a38..800c04ae0eaa494db268e68587caa2fa496a4277 100644
--- a/var/spack/repos/builtin/packages/ompt-openmp/package.py
+++ b/var/spack/repos/builtin/packages/ompt-openmp/package.py
@@ -31,7 +31,7 @@ class OmptOpenmp(Package):
 
     version('0.1', '2334e6a84b52da41b27afd9831ed5370')
 
-    # depends_on("foo")
+    depends_on('cmake', type='build')
 
     def install(self, spec, prefix):
         with working_dir("runtime/build", create=True):
diff --git a/var/spack/repos/builtin/packages/opencv/package.py b/var/spack/repos/builtin/packages/opencv/package.py
index 989c66316c3c4ce497fca2b1fe460d40b2fa3d5d..ff551d0b920d06e5beeb875ead6f6165c713a919 100644
--- a/var/spack/repos/builtin/packages/opencv/package.py
+++ b/var/spack/repos/builtin/packages/opencv/package.py
@@ -54,7 +54,8 @@ class Opencv(Package):
     depends_on('python')
     depends_on('py-numpy')
 
-    depends_on('eigen', when='+eigen')
+    depends_on('eigen', when='+eigen', type='build')
+    depends_on('cmake', type='build')
 
     # FIXME : GUI extensions missing
     # FIXME : CUDA extensions still missing
diff --git a/var/spack/repos/builtin/packages/openjpeg/package.py b/var/spack/repos/builtin/packages/openjpeg/package.py
index 1d00edb06d32ca5bef1f5e81ef3f4fe18b89cd9d..1bc5b04f6fca0761d79343da2e6ef543d1a6528a 100644
--- a/var/spack/repos/builtin/packages/openjpeg/package.py
+++ b/var/spack/repos/builtin/packages/openjpeg/package.py
@@ -43,7 +43,7 @@ class Openjpeg(Package):
     version('1.5.2', '545f98923430369a6b046ef3632ef95c')
     version('1.5.1', 'd774e4b5a0db5f0f171c4fc0aabfa14e')
 
-    depends_on('cmake')
+    depends_on('cmake', type='build')
 
     def install(self, spec, prefix):
         cmake('.', *std_cmake_args)
diff --git a/var/spack/repos/builtin/packages/openspeedshop/package.py b/var/spack/repos/builtin/packages/openspeedshop/package.py
index c501ea063c3c2d118fd9bf04e16d8b19a8713d10..4e2694a53c6114d8cc31af8f29d8a17ecc958963 100644
--- a/var/spack/repos/builtin/packages/openspeedshop/package.py
+++ b/var/spack/repos/builtin/packages/openspeedshop/package.py
@@ -80,7 +80,7 @@ class Openspeedshop(Package):
     variant('mpich2', default=False, description="Build mpi experiment collector for mpich2 MPI when this variant is enabled.")
     variant('mpich', default=False, description="Build mpi experiment collector for mpich MPI when this variant is enabled.")
 
-    depends_on("cmake@3.0.2")
+    depends_on("cmake@3.0.2", type='build')
     # Dependencies for openspeedshop that are common to all the variants of the OpenSpeedShop build
     depends_on("bison")
     depends_on("flex")
diff --git a/var/spack/repos/builtin/packages/p4est/package.py b/var/spack/repos/builtin/packages/p4est/package.py
index d0db4f7f2071fe5607bd595de02661e9e9b862b8..4bbf0c1311007ffa36b35a35a0d5381249568448 100644
--- a/var/spack/repos/builtin/packages/p4est/package.py
+++ b/var/spack/repos/builtin/packages/p4est/package.py
@@ -34,9 +34,9 @@ class P4est(Package):
     variant('tests', default=True, description='Run small tests')
 
     # build dependencies
-    depends_on('automake')
-    depends_on('autoconf')
-    depends_on('libtool@2.4.2:')
+    depends_on('automake', type='build')
+    depends_on('autoconf', type='build')
+    depends_on('libtool@2.4.2:', type='build')
 
     # other dependencies
     depends_on('lua') # Needed for the submodule sc
diff --git a/var/spack/repos/builtin/packages/paradiseo/package.py b/var/spack/repos/builtin/packages/paradiseo/package.py
index d6324b63e6c28cecaae309447f0163edbd073106..97d36d94a49c1154f77e64d201fbb2ee528cc6f9 100644
--- a/var/spack/repos/builtin/packages/paradiseo/package.py
+++ b/var/spack/repos/builtin/packages/paradiseo/package.py
@@ -48,13 +48,13 @@ class Paradiseo(Package):
     variant('gnuplot',  default=False, description='Enable GnuPlot support')
     
     # Required dependencies
-    depends_on ("cmake")
+    depends_on ("cmake", type='build')
 
     # Optional dependencies
     depends_on ("mpi", when="+mpi")
-    depends_on ("doxygen", when='+doc')
+    depends_on ("doxygen", when='+doc', type='build')
     depends_on ("gnuplot", when='+gnuplot')
-    depends_on ("eigen", when='+edo')
+    depends_on ("eigen", when='+edo', type='build')
     depends_on ("boost~mpi", when='+edo~mpi')
     depends_on ("boost+mpi", when='+edo+mpi')
 
diff --git a/var/spack/repos/builtin/packages/parallel-netcdf/package.py b/var/spack/repos/builtin/packages/parallel-netcdf/package.py
index 59c44c8a4a2d7d2d1a7e196ebe85d3fdc4d493d1..deee46df8ff50bf2e3fefe07395c1bcb69fc6baf 100644
--- a/var/spack/repos/builtin/packages/parallel-netcdf/package.py
+++ b/var/spack/repos/builtin/packages/parallel-netcdf/package.py
@@ -39,7 +39,7 @@ class ParallelNetcdf(Package):
     variant('fortran', default=True, description='Build the Fortran Interface')
     variant('fpic', default=True, description='Produce position-independent code (for use with shared libraries)')
 
-    depends_on("m4")
+    depends_on("m4", type='build')
     depends_on("mpi")
 
     # See: https://trac.mcs.anl.gov/projects/parallel-netcdf/browser/trunk/INSTALL
diff --git a/var/spack/repos/builtin/packages/paraview/package.py b/var/spack/repos/builtin/packages/paraview/package.py
index 711cbc98c9c7665a1af84fecab11b659d34e522b..75f5272006eb6adaa27b715f203374b2af20c2e6 100644
--- a/var/spack/repos/builtin/packages/paraview/package.py
+++ b/var/spack/repos/builtin/packages/paraview/package.py
@@ -43,12 +43,13 @@ class Paraview(Package):
     variant('opengl2', default=False, description='Enable OpenGL2 backend')
 
     depends_on('python@2:2.7', when='+python')
-    depends_on('py-numpy', when='+python')
-    depends_on('py-matplotlib', when='+python')
+    depends_on('py-numpy', when='+python', type='run')
+    depends_on('py-matplotlib', when='+python', type='run')
     depends_on('tcl', when='+tcl')
     depends_on('mpi', when='+mpi')
     depends_on('qt@:4', when='+qt')
 
+    depends_on('cmake', type='build')
     depends_on('bzip2')
     depends_on('freetype')
     #depends_on('hdf5+mpi', when='+mpi')
diff --git a/var/spack/repos/builtin/packages/parmetis/package.py b/var/spack/repos/builtin/packages/parmetis/package.py
index 9b36f273e4c2a8f243e159c37160281abc3adef2..b2ceadc1283ccab2de2261248896a06b704c3596 100644
--- a/var/spack/repos/builtin/packages/parmetis/package.py
+++ b/var/spack/repos/builtin/packages/parmetis/package.py
@@ -42,7 +42,7 @@ class Parmetis(Package):
     variant('debug', default=False, description='Builds the library in debug mode')
     variant('gdb', default=False, description='Enables gdb support')
 
-    depends_on('cmake@2.8:')  # build dependency
+    depends_on('cmake@2.8:', type='build')  # build dependency
     depends_on('mpi')
     depends_on('metis@5:')
 
diff --git a/var/spack/repos/builtin/packages/pidx/package.py b/var/spack/repos/builtin/packages/pidx/package.py
index d38dcd7b963a46478eec77a5894638e616bf5ae7..e7b18ce7a84d565aca600fb7af3f3e3712a389b9 100644
--- a/var/spack/repos/builtin/packages/pidx/package.py
+++ b/var/spack/repos/builtin/packages/pidx/package.py
@@ -36,6 +36,7 @@ class Pidx(Package):
     version('1.0', git='https://github.com/sci-visus/PIDX.git',
             commit='6afa1cf71d1c41263296dc049c8fabaf73c296da')
 
+    depends_on('cmake', type='build')
     depends_on("mpi")
 
     def install(self, spec, prefix):
diff --git a/var/spack/repos/builtin/packages/psi4/package.py b/var/spack/repos/builtin/packages/psi4/package.py
index fc77ba741237a9e00bfda4cffa313fdf8fd5ee60..192dd86e0ef58299820cf2ca1abf5fefd50bd4e3 100644
--- a/var/spack/repos/builtin/packages/psi4/package.py
+++ b/var/spack/repos/builtin/packages/psi4/package.py
@@ -41,8 +41,8 @@ class Psi4(Package):
     depends_on('lapack')
     depends_on('boost+chrono+filesystem+python+regex+serialization+system+timer+thread')
     depends_on('python')
-    depends_on('cmake')
-    depends_on('py-numpy')
+    depends_on('cmake', type='build')
+    depends_on('py-numpy', type=nolink)
 
     # Optional dependencies
     # TODO: add packages for these
diff --git a/var/spack/repos/builtin/packages/py-astroid/package.py b/var/spack/repos/builtin/packages/py-astroid/package.py
index 8ba6696b0c3f65ef3d4a351e6019445a356e161d..e1ea71fb671754cacc5ca9d84e6ac73f132095cb 100644
--- a/var/spack/repos/builtin/packages/py-astroid/package.py
+++ b/var/spack/repos/builtin/packages/py-astroid/package.py
@@ -22,7 +22,7 @@
 # License along with this program; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 ##############################################################################
-from spack import depends_on, extends, version
+from spack import depends_on, extends, version, nolink
 from spack import Package
 
 
@@ -37,9 +37,9 @@ class PyAstroid(Package):
     version('1.4.1', 'ed70bfed5e4b25be4292e7fe72da2c02')
 
     extends('python')
-    depends_on('py-logilab-common')
-    depends_on('py-setuptools')
-    depends_on('py-six')
+    depends_on('py-logilab-common', type=nolink)
+    depends_on('py-setuptools', type='build')
+    depends_on('py-six', type=nolink)
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-astropy/package.py b/var/spack/repos/builtin/packages/py-astropy/package.py
index a9962777dc037489966ccc6c5b2c7da98a1fb03a..25dce87e4942fee1606f431949b9176406e3751f 100644
--- a/var/spack/repos/builtin/packages/py-astropy/package.py
+++ b/var/spack/repos/builtin/packages/py-astropy/package.py
@@ -38,18 +38,18 @@ class PyAstropy(Package):
 
     # Required dependencies
     extends('python')
-    depends_on('py-numpy')
+    depends_on('py-numpy', type=nolink)
 
     # Optional dependencies
-    depends_on('py-h5py')
-    depends_on('py-beautifulsoup4')
-    depends_on('py-pyyaml')
-    depends_on('py-scipy')
+    depends_on('py-h5py', type=nolink)
+    depends_on('py-beautifulsoup4', type=nolink)
+    depends_on('py-pyyaml', type=nolink)
+    depends_on('py-scipy', type=nolink)
     depends_on('libxml2')
-    depends_on('py-matplotlib')
-    depends_on('py-pytz')
-    depends_on('py-scikit-image')
-    depends_on('py-pandas')
+    depends_on('py-matplotlib', type=nolink)
+    depends_on('py-pytz', type=nolink)
+    depends_on('py-scikit-image', type=nolink)
+    depends_on('py-pandas', type=nolink)
 
     # System dependencies
     depends_on('cfitsio')
diff --git a/var/spack/repos/builtin/packages/py-autopep8/package.py b/var/spack/repos/builtin/packages/py-autopep8/package.py
index f2fd3cd683c15eb00107e67bbf2ca764b09ae044..507664949b81eda054987866ee6cf443eb0c20d9 100644
--- a/var/spack/repos/builtin/packages/py-autopep8/package.py
+++ b/var/spack/repos/builtin/packages/py-autopep8/package.py
@@ -8,8 +8,8 @@ class PyAutopep8(Package):
     version('1.2.2', 'def3d023fc9dfd1b7113602e965ad8e1')
 
     extends('python')
-    depends_on('py-setuptools')
-    depends_on('py-pep8')
+    depends_on('py-setuptools', type='build')
+    depends_on('py-pep8', type=nolink)
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-basemap/package.py b/var/spack/repos/builtin/packages/py-basemap/package.py
index 13f604bacd3d1ec11c0a4d307bc8ed52cd41d32d..9c7f6454df4dfcab2ca05003c24c5272d37a54f2 100644
--- a/var/spack/repos/builtin/packages/py-basemap/package.py
+++ b/var/spack/repos/builtin/packages/py-basemap/package.py
@@ -35,10 +35,10 @@ class PyBasemap(Package):
     version('1.0.7', '48c0557ced9e2c6e440b28b3caff2de8')
 
     extends('python')
-    depends_on('py-setuptools')
-    depends_on('py-numpy')
-    depends_on('py-matplotlib+gui')
-    depends_on('pil')
+    depends_on('py-setuptools', type='build')
+    depends_on('py-numpy', type=nolink)
+    depends_on('py-matplotlib+gui', type=nolink)
+    depends_on('pil', type=nolink)
     depends_on("geos")
 
     def install(self, spec, prefix):
diff --git a/var/spack/repos/builtin/packages/py-biopython/package.py b/var/spack/repos/builtin/packages/py-biopython/package.py
index 26f42e060b6d8850a9419c5deebe2edcda2ef3f9..bcc889756efc8833155ae98b3b2bb7119a495d55 100644
--- a/var/spack/repos/builtin/packages/py-biopython/package.py
+++ b/var/spack/repos/builtin/packages/py-biopython/package.py
@@ -32,8 +32,8 @@ class PyBiopython(Package):
     version('1.65', '143e7861ade85c0a8b5e2bbdd1da1f67')
 
     extends('python')
-    depends_on('py-mx')
-    depends_on('py-numpy')
+    depends_on('py-mx', type=nolink)
+    depends_on('py-numpy', type=nolink)
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-blessings/package.py b/var/spack/repos/builtin/packages/py-blessings/package.py
index 05a1f5bcbbeb93b061896b8f05341446d91b5f78..8d7a2343d114ed5c8c51579582287be403a2fe3c 100644
--- a/var/spack/repos/builtin/packages/py-blessings/package.py
+++ b/var/spack/repos/builtin/packages/py-blessings/package.py
@@ -31,7 +31,7 @@ class PyBlessings(Package):
 
     version('1.6', '4f552a8ebcd4982693c92571beb99394')
 
-    depends_on('py-setuptools')
+    depends_on('py-setuptools', type='build')
 
     extends("python")
 
diff --git a/var/spack/repos/builtin/packages/py-bottleneck/package.py b/var/spack/repos/builtin/packages/py-bottleneck/package.py
index 1a186b219cbeb4afbddd1139894a953600d64b90..2483fab85f1bc5345f518011240fb58fa8f83af6 100644
--- a/var/spack/repos/builtin/packages/py-bottleneck/package.py
+++ b/var/spack/repos/builtin/packages/py-bottleneck/package.py
@@ -32,7 +32,7 @@ class PyBottleneck(Package):
     version('1.0.0', '380fa6f275bd24f27e7cf0e0d752f5d2')
 
     extends('python')
-    depends_on('py-numpy')
+    depends_on('py-numpy', type=nolink)
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-cffi/package.py b/var/spack/repos/builtin/packages/py-cffi/package.py
index 58d0a81990e738d74f73ba99e4ea6360f1d54c50..e54d50fa5060874e2d66f13633aff9993323bcc7 100644
--- a/var/spack/repos/builtin/packages/py-cffi/package.py
+++ b/var/spack/repos/builtin/packages/py-cffi/package.py
@@ -33,8 +33,8 @@ class PyCffi(Package):
     version('1.1.2', 'ca6e6c45b45caa87aee9adc7c796eaea')
 
     extends('python')
-    depends_on('py-setuptools')
-    depends_on('py-pycparser')
+    depends_on('py-setuptools', type='build')
+    depends_on('py-pycparser', type=nolink)
     depends_on('libffi')
 
     def install(self, spec, prefix):
diff --git a/var/spack/repos/builtin/packages/py-coverage/package.py b/var/spack/repos/builtin/packages/py-coverage/package.py
index 92a5bd008840d35254467df8d32e4f560aca6ee0..b7eaf58cd6735f09aef5dd72cc404f53aec2a2e2 100644
--- a/var/spack/repos/builtin/packages/py-coverage/package.py
+++ b/var/spack/repos/builtin/packages/py-coverage/package.py
@@ -32,7 +32,7 @@ class PyCoverage(Package):
 
     version('4.0a6', '1bb4058062646148965bef0796b61efc')
 
-    depends_on('py-setuptools')
+    depends_on('py-setuptools', type='build')
 
     extends('python')
 
diff --git a/var/spack/repos/builtin/packages/py-csvkit/package.py b/var/spack/repos/builtin/packages/py-csvkit/package.py
index 7fe2f953f706abcbd37886e447da28fd88492792..2deaa2f74e84d04935c3ccde6c35c24e96564bb4 100644
--- a/var/spack/repos/builtin/packages/py-csvkit/package.py
+++ b/var/spack/repos/builtin/packages/py-csvkit/package.py
@@ -35,12 +35,12 @@ class PyCsvkit(Package):
 
     extends('python')
 
-    depends_on('py-dateutil')
-    depends_on('py-dbf')
-    depends_on('py-xlrd')
-    depends_on('py-SQLAlchemy')
-    depends_on('py-six')
-    depends_on('py-openpyxl')
+    depends_on('py-dateutil', type=nolink)
+    depends_on('py-dbf', type=nolink)
+    depends_on('py-xlrd', type=nolink)
+    depends_on('py-SQLAlchemy', type=nolink)
+    depends_on('py-six', type=nolink)
+    depends_on('py-openpyxl', type=nolink)
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-dask/package.py b/var/spack/repos/builtin/packages/py-dask/package.py
index 831f86e81cff91358c6bffa59c2443cbcbd57e12..b7dbab3d979e217b824b197e6be22a2fcda02ba7 100644
--- a/var/spack/repos/builtin/packages/py-dask/package.py
+++ b/var/spack/repos/builtin/packages/py-dask/package.py
@@ -33,7 +33,7 @@ class PyDask(Package):
 
     extends('python')
 
-    depends_on('py-setuptools')
+    depends_on('py-setuptools', type='build')
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-dateutil/package.py b/var/spack/repos/builtin/packages/py-dateutil/package.py
index eb8eb09e75da67788fceb34239d7f5fc7959e8c6..dfd1e143d905629c500bc872cf12ca6fc37714ba 100644
--- a/var/spack/repos/builtin/packages/py-dateutil/package.py
+++ b/var/spack/repos/builtin/packages/py-dateutil/package.py
@@ -34,8 +34,8 @@ class PyDateutil(Package):
     version('2.5.2', 'eafe168e8f404bf384514f5116eedbb6')
 
     extends('python')
-    depends_on('py-setuptools')
-    depends_on('py-six')
+    depends_on('py-setuptools', type='build')
+    depends_on('py-six', type=nolink)
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-decorator/package.py b/var/spack/repos/builtin/packages/py-decorator/package.py
index 90a95cd0cb99513366e8d86ec30dcc807cd91572..bd78f262f43906ab1fac7f0dff97baa421009fc6 100644
--- a/var/spack/repos/builtin/packages/py-decorator/package.py
+++ b/var/spack/repos/builtin/packages/py-decorator/package.py
@@ -33,7 +33,7 @@ class PyDecorator(Package):
 
     extends('python')
 
-    depends_on('py-setuptools')
+    depends_on('py-setuptools', type='build')
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-emcee/package.py b/var/spack/repos/builtin/packages/py-emcee/package.py
index d57ef4bd76ca0f051ae8c201c3956be47ff2be9f..397f737cb1db6d52af584d160b3a26ebebf727a2 100644
--- a/var/spack/repos/builtin/packages/py-emcee/package.py
+++ b/var/spack/repos/builtin/packages/py-emcee/package.py
@@ -35,7 +35,7 @@ class PyEmcee(Package):
     version('2.1.0', 'c6b6fad05c824d40671d4a4fc58dfff7')
 
     extends('python')
-    depends_on('py-numpy')
+    depends_on('py-numpy', type=nolink)
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix={0}'.format(prefix))
diff --git a/var/spack/repos/builtin/packages/py-flake8/package.py b/var/spack/repos/builtin/packages/py-flake8/package.py
index b261467d84da9239a2e6247528ed06aa4cd34ee6..2fabe03d6637251eeaaad286d0331556e301fa7e 100644
--- a/var/spack/repos/builtin/packages/py-flake8/package.py
+++ b/var/spack/repos/builtin/packages/py-flake8/package.py
@@ -34,7 +34,7 @@ class PyFlake8(Package):
     version('2.5.4', 'a4585b3569b95c3f66acb8294a7f06ef')
 
     extends('python')
-    depends_on('py-setuptools')
+    depends_on('py-setuptools', type='build')
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-funcsigs/package.py b/var/spack/repos/builtin/packages/py-funcsigs/package.py
index 9d987b284e73ccde1d574124bc2e265ee8e7bb3d..11ba639b85d928923200a94d21975f6ffac85757 100644
--- a/var/spack/repos/builtin/packages/py-funcsigs/package.py
+++ b/var/spack/repos/builtin/packages/py-funcsigs/package.py
@@ -34,7 +34,7 @@ class PyFuncsigs(Package):
 
     extends('python')
 
-    depends_on('py-setuptools')
+    depends_on('py-setuptools', type='build')
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-genshi/package.py b/var/spack/repos/builtin/packages/py-genshi/package.py
index cba479a88f8ebcae6b386aaa67ddbf6001cafcb1..ea8d26c7966fc6ac244ad2d57ede964e3678dd9e 100644
--- a/var/spack/repos/builtin/packages/py-genshi/package.py
+++ b/var/spack/repos/builtin/packages/py-genshi/package.py
@@ -36,7 +36,7 @@ class PyGenshi(Package):
     version('0.6', '604e8b23b4697655d36a69c2d8ef7187')
 
     extends("python")
-    depends_on("py-setuptools")
+    depends_on("py-setuptools", type='build')
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-gnuplot/package.py b/var/spack/repos/builtin/packages/py-gnuplot/package.py
index 3381c4a5ac3f0d65d52ba315248d279720c5b7b2..b08b03d1f1ca172e1502add642af30e4af13cea9 100644
--- a/var/spack/repos/builtin/packages/py-gnuplot/package.py
+++ b/var/spack/repos/builtin/packages/py-gnuplot/package.py
@@ -32,7 +32,7 @@ class PyGnuplot(Package):
     version('1.8', 'abd6f571e7aec68ae7db90a5217cd5b1')
 
     extends('python')
-    depends_on('py-numpy')
+    depends_on('py-numpy', type=nolink)
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-h5py/package.py b/var/spack/repos/builtin/packages/py-h5py/package.py
index 67461babe71fb49f3c18e788783ff9f9dc213f8f..c1950a91ac071ceba5846220c42516dbbfb8ad38 100644
--- a/var/spack/repos/builtin/packages/py-h5py/package.py
+++ b/var/spack/repos/builtin/packages/py-h5py/package.py
@@ -41,17 +41,17 @@ class PyH5py(Package):
     extends('python')
 
     # Build dependencies
-    depends_on('py-cython@0.19:')
-    depends_on('pkg-config')
+    depends_on('py-cython@0.19:', type='build')
+    depends_on('pkg-config', type='build')
     depends_on('hdf5@1.8.4:')
     depends_on('hdf5+mpi', when='+mpi')
     depends_on('mpi', when='+mpi')
 
     # Build and runtime dependencies
-    depends_on('py-numpy@1.6.1:')
+    depends_on('py-numpy@1.6.1:', type=nolink)
 
     # Runtime dependencies
-    depends_on('py-six')
+    depends_on('py-six', type=nolink)
 
     def install(self, spec, prefix):
         python('setup.py', 'configure',
diff --git a/var/spack/repos/builtin/packages/py-iminuit/package.py b/var/spack/repos/builtin/packages/py-iminuit/package.py
index 47751a702d14d8c620f8bc128a64ac48301aa003..d7446c06d47a0f5f0f94c3fb7cba1a3188cdb644 100644
--- a/var/spack/repos/builtin/packages/py-iminuit/package.py
+++ b/var/spack/repos/builtin/packages/py-iminuit/package.py
@@ -35,12 +35,12 @@ class PyIminuit(Package):
 
     # Required dependencies
     extends('python')
-    depends_on('py-setuptools')
+    depends_on('py-setuptools', type='build')
 
     # Optional dependencies
-    depends_on('py-numpy')
-    depends_on('py-matplotlib')
-    depends_on('py-cython')
+    depends_on('py-numpy', type=nolink)
+    depends_on('py-matplotlib', type=nolink)
+    depends_on('py-cython', type='build')
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix={0}'.format(prefix))
diff --git a/var/spack/repos/builtin/packages/py-ipython/package.py b/var/spack/repos/builtin/packages/py-ipython/package.py
index 7a94f90b3868100d945dbf87c18fcb17d6998a7c..b583609953cedb1b1408a79fc3e097fde2270162 100644
--- a/var/spack/repos/builtin/packages/py-ipython/package.py
+++ b/var/spack/repos/builtin/packages/py-ipython/package.py
@@ -33,8 +33,8 @@ class PyIpython(Package):
     version('3.1.0', 'a749d90c16068687b0ec45a27e72ef8f')
 
     extends('python')
-    depends_on('py-pygments')
-    depends_on('py-setuptools')
+    depends_on('py-pygments', type=nolink)
+    depends_on('py-setuptools', type=nolink)
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-jinja2/package.py b/var/spack/repos/builtin/packages/py-jinja2/package.py
index 48312d9baf69885c6ae7e89fd528ae6f1a44bf7b..57f26e3b904f1800d24c17ac693d5d6d65157f7b 100644
--- a/var/spack/repos/builtin/packages/py-jinja2/package.py
+++ b/var/spack/repos/builtin/packages/py-jinja2/package.py
@@ -22,7 +22,7 @@
 # License along with this program; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 ##############################################################################
-from spack import depends_on, extends, version
+from spack import depends_on, extends, version, nolink
 from spack import Package
 
 
@@ -43,8 +43,8 @@ class PyJinja2(Package):
     version('2.7', 'ec70433f325051dcedacbb2465028a35')
 
     extends("python")
-    depends_on("py-setuptools")
-    depends_on("py-markupsafe")
+    depends_on("py-setuptools", type='build')
+    depends_on("py-markupsafe", type=nolink)
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-lockfile/package.py b/var/spack/repos/builtin/packages/py-lockfile/package.py
index 998b41abc65ea17229fa29436ac09bc5c6022f98..38cc81b89531d0a0789cd01db59c74f8e8b37fe7 100644
--- a/var/spack/repos/builtin/packages/py-lockfile/package.py
+++ b/var/spack/repos/builtin/packages/py-lockfile/package.py
@@ -41,7 +41,7 @@ class PyLockfile(Package):
     version('0.10.2', '1aa6175a6d57f082cd12e7ac6102ab15')
 
     extends("python")
-    depends_on("py-setuptools")
+    depends_on("py-setuptools", type='build')
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-logilab-common/package.py b/var/spack/repos/builtin/packages/py-logilab-common/package.py
index 8675c48e9a832ca110585942843b4056ea75d181..6dab4a40e4eb90f88e7cce2a639b6b7bc94c0284 100644
--- a/var/spack/repos/builtin/packages/py-logilab-common/package.py
+++ b/var/spack/repos/builtin/packages/py-logilab-common/package.py
@@ -22,7 +22,7 @@
 # License along with this program; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 ##############################################################################
-from spack import depends_on, extends, version
+from spack import depends_on, extends, version, nolink
 from spack import Package
 
 
@@ -34,8 +34,8 @@ class PyLogilabCommon(Package):
     version('1.2.0', 'f7b51351b7bfe052746fa04c03253c0b')
 
     extends("python")
-    depends_on("py-setuptools")
-    depends_on("py-six")
+    depends_on("py-setuptools", type='build')
+    depends_on("py-six", type=nolink)
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-mako/package.py b/var/spack/repos/builtin/packages/py-mako/package.py
index a03ef4defb9b8106f605b22686529168caa65115..56741ec11f2363152c1c6e62976878d96cd9e708 100644
--- a/var/spack/repos/builtin/packages/py-mako/package.py
+++ b/var/spack/repos/builtin/packages/py-mako/package.py
@@ -33,7 +33,7 @@ class PyMako(Package):
 
     version('1.0.1', '9f0aafd177b039ef67b90ea350497a54')
 
-    depends_on('py-setuptools')
+    depends_on('py-setuptools', type='build')
     extends('python')
 
     def install(self, spec, prefix):
diff --git a/var/spack/repos/builtin/packages/py-markupsafe/package.py b/var/spack/repos/builtin/packages/py-markupsafe/package.py
index 58c9f700665e378845cc6540abdd8f5d1712dde0..ee396de7be60fe8022cd33b7a9c0e3100198af78 100644
--- a/var/spack/repos/builtin/packages/py-markupsafe/package.py
+++ b/var/spack/repos/builtin/packages/py-markupsafe/package.py
@@ -44,7 +44,7 @@ class PyMarkupsafe(Package):
     version('0.19', '64b05361adb92c11839fc470e308c593')
 
     extends("python")
-    depends_on("py-setuptools")
+    depends_on("py-setuptools", type='build')
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-matplotlib/package.py b/var/spack/repos/builtin/packages/py-matplotlib/package.py
index 14f9716ae6bd3e4bfd56b135a4effd0e7bf8d0bd..b5eb8a53c48a6886f28a03f30f6ba3506570d277 100644
--- a/var/spack/repos/builtin/packages/py-matplotlib/package.py
+++ b/var/spack/repos/builtin/packages/py-matplotlib/package.py
@@ -38,19 +38,20 @@ class PyMatplotlib(Package):
 
     extends('python', ignore=r'bin/nosetests.*$|bin/pbr$')
 
-    depends_on('py-pyside', when='+gui')
-    depends_on('py-ipython', when='+ipython')
-    depends_on('py-pyparsing')
-    depends_on('py-six')
-    depends_on('py-dateutil')
-    depends_on('py-pytz')
-    depends_on('py-nose')
-    depends_on('py-numpy')
-    depends_on('py-mock')
-    depends_on('py-pbr')
-    depends_on('py-funcsigs')
+    depends_on('py-setuptools', type='build')
+    depends_on('py-pyside', when='+gui', type=nolink)
+    depends_on('py-ipython', when='+ipython', type=nolink)
+    depends_on('py-pyparsing', type=nolink)
+    depends_on('py-six', type=nolink)
+    depends_on('py-dateutil', type=nolink)
+    depends_on('py-pytz', type=nolink)
+    depends_on('py-nose', type=nolink)
+    depends_on('py-numpy', type=nolink)
+    depends_on('py-mock', type=nolink)
+    depends_on('py-pbr', type=nolink)
+    depends_on('py-funcsigs', type=nolink)
 
-    depends_on('pkg-config')
+    depends_on('pkg-config', type='build')
     depends_on('freetype')
     depends_on('qt', when='+gui')
     depends_on('bzip2')
diff --git a/var/spack/repos/builtin/packages/py-mistune/package.py b/var/spack/repos/builtin/packages/py-mistune/package.py
index 9bcbb5a9270d15fbc22f619d883ce16aafc1f6f4..399c10005ea5db86b6e2b2fbe06da18c00f8cc2c 100644
--- a/var/spack/repos/builtin/packages/py-mistune/package.py
+++ b/var/spack/repos/builtin/packages/py-mistune/package.py
@@ -40,7 +40,7 @@ class PyMistune(Package):
     version('0.5', '997736554f1f95eea78c66ae339b5722')
 
     extends('python')
-    depends_on('py-setuptools')
+    depends_on('py-setuptools', type='build')
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-mock/package.py b/var/spack/repos/builtin/packages/py-mock/package.py
index 0587131b886002e55e538bc1d706bbc836bb111f..f4c178de670718682610cb8df8febe4b92da27e8 100644
--- a/var/spack/repos/builtin/packages/py-mock/package.py
+++ b/var/spack/repos/builtin/packages/py-mock/package.py
@@ -35,8 +35,8 @@ class PyMock(Package):
     version('1.3.0', '73ee8a4afb3ff4da1b4afa287f39fdeb')
 
     extends('python')
-    depends_on('py-pbr')
-    depends_on('py-setuptools@17.1:')
+    depends_on('py-pbr', type=nolink)
+    depends_on('py-setuptools@17.1:', type='build')
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-mpi4py/package.py b/var/spack/repos/builtin/packages/py-mpi4py/package.py
index 2764b8b3c6e626962e5342a367cf6e42d5f90536..a749e16779e47da85e7b396777419000b9f59d8b 100644
--- a/var/spack/repos/builtin/packages/py-mpi4py/package.py
+++ b/var/spack/repos/builtin/packages/py-mpi4py/package.py
@@ -33,7 +33,7 @@ class PyMpi4py(Package):
     version('1.3.1', 'dbe9d22bdc8ed965c23a7ceb6f32fc3c')
 
     extends('python')
-    depends_on('py-setuptools')
+    depends_on('py-setuptools', type='build')
     depends_on('mpi')
 
     def install(self, spec, prefix):
diff --git a/var/spack/repos/builtin/packages/py-mysqldb1/package.py b/var/spack/repos/builtin/packages/py-mysqldb1/package.py
index 9918ba3e64f8954b6c1f1aff458f4c31acd3d56a..46b44f34dd5e598819178b2811881411e44cd6a9 100644
--- a/var/spack/repos/builtin/packages/py-mysqldb1/package.py
+++ b/var/spack/repos/builtin/packages/py-mysqldb1/package.py
@@ -32,7 +32,7 @@ class PyMysqldb1(Package):
     version('1.2.5', '332c8f4955b6bc0c79ea15170bf7321b')
 
     extends('python')
-    depends_on('py-setuptools')
+    depends_on('py-setuptools', type='build')
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-nestle/package.py b/var/spack/repos/builtin/packages/py-nestle/package.py
index 16506e3eca0190ebfeb5935bb4300c1ed6976b4c..81f9fe4d0987e7193000a0e5300f70b1bb58daf0 100644
--- a/var/spack/repos/builtin/packages/py-nestle/package.py
+++ b/var/spack/repos/builtin/packages/py-nestle/package.py
@@ -35,10 +35,10 @@ class PyNestle(Package):
 
     # Required dependencies
     extends('python')
-    depends_on('py-numpy')
+    depends_on('py-numpy', type=nolink)
 
     # Optional dependencies
-    depends_on('py-scipy')
+    depends_on('py-scipy', type=nolink)
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix={0}'.format(prefix))
diff --git a/var/spack/repos/builtin/packages/py-netcdf/package.py b/var/spack/repos/builtin/packages/py-netcdf/package.py
index e3f857a0ceac8f423ebb31a19839d4232594541b..9a354cb1c167bbff2723dcb386cb14c2c1d56335 100644
--- a/var/spack/repos/builtin/packages/py-netcdf/package.py
+++ b/var/spack/repos/builtin/packages/py-netcdf/package.py
@@ -32,8 +32,8 @@ class PyNetcdf(Package):
     version('1.2.3.1', '4fc4320d4f2a77b894ebf8da1c9895af')
 
     extends('python')
-    depends_on('py-numpy')
-    depends_on('py-cython')
+    depends_on('py-numpy', type=nolink)
+    depends_on('py-cython', type=nolink)
     depends_on('netcdf')
 
     def install(self, spec, prefix):
diff --git a/var/spack/repos/builtin/packages/py-networkx/package.py b/var/spack/repos/builtin/packages/py-networkx/package.py
index 6bdb24e36e5a884067f24cdc409078899f027d20..d5457176284c2c29e1b7e2c41cceb06f44b8604f 100644
--- a/var/spack/repos/builtin/packages/py-networkx/package.py
+++ b/var/spack/repos/builtin/packages/py-networkx/package.py
@@ -33,7 +33,7 @@ class PyNetworkx(Package):
 
     extends('python')
 
-    depends_on('py-decorator')
+    depends_on('py-decorator', type=nolink)
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-nose/package.py b/var/spack/repos/builtin/packages/py-nose/package.py
index abb2d500a2bd475e29f9656fb9dd3b6f28680602..d15a1784d1e6a47a336cdc3d103c10f27f709cd8 100644
--- a/var/spack/repos/builtin/packages/py-nose/package.py
+++ b/var/spack/repos/builtin/packages/py-nose/package.py
@@ -37,7 +37,7 @@ class PyNose(Package):
     version('1.3.7', '4d3ad0ff07b61373d2cefc89c5d0b20b')
 
     extends('python', ignore=r'bin/nosetests.*$')
-    depends_on('py-setuptools')
+    depends_on('py-setuptools', type='build')
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-numexpr/package.py b/var/spack/repos/builtin/packages/py-numexpr/package.py
index d8bacd179ff11c46c3b751c48d8ff759b2689f93..fd8d7dc0c6de86667c20535b9a27679ea1362398 100644
--- a/var/spack/repos/builtin/packages/py-numexpr/package.py
+++ b/var/spack/repos/builtin/packages/py-numexpr/package.py
@@ -34,7 +34,7 @@ class PyNumexpr(Package):
     version('2.5', '84f66cced45ba3e30dcf77a937763aaa')
 
     extends('python')
-    depends_on('py-numpy')
+    depends_on('py-numpy', type=nolink)
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-numpy/package.py b/var/spack/repos/builtin/packages/py-numpy/package.py
index e9672b7bb0b75f1032ab5fae9d9eff7b216628ba..273f5bfd8debd964a38cad27a69cd75113515641 100644
--- a/var/spack/repos/builtin/packages/py-numpy/package.py
+++ b/var/spack/repos/builtin/packages/py-numpy/package.py
@@ -43,7 +43,7 @@ class PyNumpy(Package):
     variant('lapack', default=True)
 
     extends('python')
-    depends_on('py-nose')
+    depends_on('py-nose', type='build')
     depends_on('blas',   when='+blas')
     depends_on('lapack', when='+lapack')
 
diff --git a/var/spack/repos/builtin/packages/py-openpyxl/package.py b/var/spack/repos/builtin/packages/py-openpyxl/package.py
index 30cb52348f5057ee7bfc3c12c54935f8714b8154..624da58ff30b533571e67f465b2c740bc4fcf63f 100644
--- a/var/spack/repos/builtin/packages/py-openpyxl/package.py
+++ b/var/spack/repos/builtin/packages/py-openpyxl/package.py
@@ -34,8 +34,8 @@ class PyOpenpyxl(Package):
 
     extends('python')
 
-    depends_on('py-jdcal')
-    depends_on('py-setuptools')
+    depends_on('py-jdcal', type=nolink)
+    depends_on('py-setuptools', type='build')
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-pandas/package.py b/var/spack/repos/builtin/packages/py-pandas/package.py
index 7f54fc5d76131f91110b5b1e3870c0294b9d72c9..8bd4227faf6cdb9d16cd2a3bd92884393d6532a3 100644
--- a/var/spack/repos/builtin/packages/py-pandas/package.py
+++ b/var/spack/repos/builtin/packages/py-pandas/package.py
@@ -35,12 +35,12 @@ class PyPandas(Package):
     version('0.18.0', 'f143762cd7a59815e348adf4308d2cf6')
 
     extends('python')
-    depends_on('py-dateutil')
-    depends_on('py-numpy')
-    depends_on('py-setuptools')
-    depends_on('py-pytz')
-    depends_on('py-numexpr')
-    depends_on('py-bottleneck')
+    depends_on('py-dateutil', type=nolink)
+    depends_on('py-numpy', type=nolink)
+    depends_on('py-setuptools', type='build')
+    depends_on('py-pytz', type=nolink)
+    depends_on('py-numexpr', type=nolink)
+    depends_on('py-bottleneck', type=nolink)
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-pbr/package.py b/var/spack/repos/builtin/packages/py-pbr/package.py
index 336ea37144070ac5343f5ef385265fd19ceaf75c..8502b0b3642bae7b3c6fcc6a243d5dca1f15f857 100644
--- a/var/spack/repos/builtin/packages/py-pbr/package.py
+++ b/var/spack/repos/builtin/packages/py-pbr/package.py
@@ -34,7 +34,7 @@ class PyPbr(Package):
 
     extends('python')
 
-    depends_on('py-setuptools')
+    depends_on('py-setuptools', type='build')
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-pep8/package.py b/var/spack/repos/builtin/packages/py-pep8/package.py
index 987783b39275871ff2d2f3ef17aa07aa619fb080..ffcc2b318c735622d973f4c135a5f741875c6e8d 100644
--- a/var/spack/repos/builtin/packages/py-pep8/package.py
+++ b/var/spack/repos/builtin/packages/py-pep8/package.py
@@ -8,7 +8,7 @@ class PyPep8(Package):
     version('1.7.0', '31070a3a6391928893cbf5fa523eb8d9')
 
     extends('python')
-    depends_on('py-setuptools')
+    depends_on('py-setuptools', type='build')
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-periodictable/package.py b/var/spack/repos/builtin/packages/py-periodictable/package.py
index 7d8a6359792e25d54e6ac18736f987c276eb78ac..608f4e16c16d056b315fd1d3595e7e1c9d94e9ae 100644
--- a/var/spack/repos/builtin/packages/py-periodictable/package.py
+++ b/var/spack/repos/builtin/packages/py-periodictable/package.py
@@ -33,8 +33,8 @@ class PyPeriodictable(Package):
 
     version('1.4.1', '7246b63cc0b6b1be6e86b6616f9e866e')
 
-    depends_on('py-numpy')
-    depends_on('py-pyparsing')
+    depends_on('py-numpy', type=nolink)
+    depends_on('py-pyparsing', type=nolink)
     extends('python')
 
     def install(self, spec, prefix):
diff --git a/var/spack/repos/builtin/packages/py-phonopy/package.py b/var/spack/repos/builtin/packages/py-phonopy/package.py
index 68774c90c2b43896f4c34fb1c94736774221dd70..a3a4b7a9f7f7fc761f87525c4cf2762899d15fa1 100644
--- a/var/spack/repos/builtin/packages/py-phonopy/package.py
+++ b/var/spack/repos/builtin/packages/py-phonopy/package.py
@@ -33,10 +33,10 @@ class PyPhonopy(Package):
     version('1.10.0', '973ed1bcea46e21b9bf747aab9061ff6')
 
     extends('python')
-    depends_on('py-numpy')
-    depends_on('py-scipy')
-    depends_on('py-matplotlib')
-    depends_on('py-pyyaml')
+    depends_on('py-numpy', type=nolink)
+    depends_on('py-scipy', type=nolink)
+    depends_on('py-matplotlib', type=nolink)
+    depends_on('py-pyyaml', type=nolink)
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--home=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-pillow/package.py b/var/spack/repos/builtin/packages/py-pillow/package.py
index 25cf412b31631039eeb537f043d49dcff127bd30..13a09f63cfacc14e8c1efe545f4bff857d7a81cb 100644
--- a/var/spack/repos/builtin/packages/py-pillow/package.py
+++ b/var/spack/repos/builtin/packages/py-pillow/package.py
@@ -62,8 +62,8 @@ class PyPillow(Package):
 
     # Required dependencies
     extends('python')
-    depends_on('binutils')
-    depends_on('py-setuptools')
+    depends_on('binutils', type='build')
+    depends_on('py-setuptools', type='build')
 
     # Recommended dependencies
     depends_on('jpeg', when='+jpeg')
diff --git a/var/spack/repos/builtin/packages/py-prettytable/package.py b/var/spack/repos/builtin/packages/py-prettytable/package.py
index e3edc7b706fb67ee7c123c9cbe695b849fd390cd..cf814733d491dabfb45151ff98380fd01e062d87 100644
--- a/var/spack/repos/builtin/packages/py-prettytable/package.py
+++ b/var/spack/repos/builtin/packages/py-prettytable/package.py
@@ -38,7 +38,7 @@ class PyPrettytable(Package):
     version('0.7.2', 'a6b80afeef286ce66733d54a0296b13b')
 
     extends("python")
-    depends_on("py-setuptools")
+    depends_on("py-setuptools", type='build')
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-protobuf/package.py b/var/spack/repos/builtin/packages/py-protobuf/package.py
index da3a65c22eaf592a22a9599cac2e2d8674311005..dd2b5651de72441634a38f5a8a20b09ee123ca6a 100644
--- a/var/spack/repos/builtin/packages/py-protobuf/package.py
+++ b/var/spack/repos/builtin/packages/py-protobuf/package.py
@@ -44,7 +44,7 @@ class PyProtobuf(Package):
 
     extends('python')
 
-    depends_on('py-setuptools')
+    depends_on('py-setuptools', type='build')
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix={0}'.format(prefix))
diff --git a/var/spack/repos/builtin/packages/py-py2neo/package.py b/var/spack/repos/builtin/packages/py-py2neo/package.py
index 9c6e2192647352a834fd567263a1724041ad27e5..02f37d8b7840aecb2b2ba31353d6f27382d66c9e 100644
--- a/var/spack/repos/builtin/packages/py-py2neo/package.py
+++ b/var/spack/repos/builtin/packages/py-py2neo/package.py
@@ -38,7 +38,7 @@ class PyPy2neo(Package):
     version('2.0.5', '143b1f9c0aa22faf170c1b9f84c7343b')
     version('2.0.4', 'b3f7efd3344dc3f66db4eda11e5899f7')
 
-    depends_on("py-setuptools")
+    depends_on("py-setuptools", type='build')
     extends("python")
 
     def install(self, spec, prefix):
diff --git a/var/spack/repos/builtin/packages/py-pycparser/package.py b/var/spack/repos/builtin/packages/py-pycparser/package.py
index c33769c526fe73cfbba3baab6d3a94de08225fcd..9afba500779cfa66eae840f7544c6974e850499a 100644
--- a/var/spack/repos/builtin/packages/py-pycparser/package.py
+++ b/var/spack/repos/builtin/packages/py-pycparser/package.py
@@ -33,7 +33,7 @@ class PyPycparser(Package):
 
     
     extends('python')
-    depends_on('py-setuptools')
+    depends_on('py-setuptools', type='build')
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-pygments/package.py b/var/spack/repos/builtin/packages/py-pygments/package.py
index fedf3d068dc2071b98b0455a6fdeb8fc95fd92b7..0ca15dd10dc329eed1d93ccd84ed3df909f8daa4 100644
--- a/var/spack/repos/builtin/packages/py-pygments/package.py
+++ b/var/spack/repos/builtin/packages/py-pygments/package.py
@@ -33,7 +33,7 @@ class PyPygments(Package):
     version('2.0.2', '238587a1370d62405edabd0794b3ec4a')
 
     extends('python')
-    depends_on('py-setuptools')
+    depends_on('py-setuptools', type='build')
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-pylint/package.py b/var/spack/repos/builtin/packages/py-pylint/package.py
index 66118e822825730673339cedbb42900d20078da6..7107b2987fdeb15c1c3a9336e6f3c49075f1e6bb 100644
--- a/var/spack/repos/builtin/packages/py-pylint/package.py
+++ b/var/spack/repos/builtin/packages/py-pylint/package.py
@@ -34,8 +34,8 @@ class PyPylint(Package):
     version('1.4.3', '5924c1c7ca5ca23647812f5971d0ea44')
 
     extends('python')
-    depends_on('py-nose')
-    depends_on('py-setuptools')
+    depends_on('py-nose', type='build')
+    depends_on('py-setuptools', type='build')
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-pyqt/package.py b/var/spack/repos/builtin/packages/py-pyqt/package.py
index b090e25682116867f299252cf9c414537475b025..05fb7aa22cc7243b00691f1a6be8bd5561a4e036 100644
--- a/var/spack/repos/builtin/packages/py-pyqt/package.py
+++ b/var/spack/repos/builtin/packages/py-pyqt/package.py
@@ -34,7 +34,7 @@ class PyPyqt(Package):
     version('4.11.3', '997c3e443165a89a559e0d96b061bf70')
 
     extends('python')
-    depends_on('py-sip')
+    depends_on('py-sip', type=nolink)
 
     # TODO: allow qt5 when conditional deps are supported.
     # TODO: Fix version matching so that @4 works like @:4
diff --git a/var/spack/repos/builtin/packages/py-pyside/package.py b/var/spack/repos/builtin/packages/py-pyside/package.py
index affee6c55a1082f72a35b5e171c53f84d9d50562..cd174ce6583f9ee7438d7e9715acccfb336a27f7 100644
--- a/var/spack/repos/builtin/packages/py-pyside/package.py
+++ b/var/spack/repos/builtin/packages/py-pyside/package.py
@@ -32,11 +32,10 @@ class PyPyside(Package):
 
     version('1.2.2', 'c45bc400c8a86d6b35f34c29e379e44d')
 
-    # TODO: make build dependency
-    # depends_on("cmake")
+    depends_on('cmake', type='build')
 
     extends('python')
-    depends_on('py-setuptools')
+    depends_on('py-setuptools', type='build')
     depends_on('qt@:4')
 
     def patch(self):
diff --git a/var/spack/repos/builtin/packages/py-pytables/package.py b/var/spack/repos/builtin/packages/py-pytables/package.py
index 47592fb3d1d8283c70da15cd6f9fd3c99a6567bc..58ed067b2189f0f4e92b10000fae04daf3e559f6 100644
--- a/var/spack/repos/builtin/packages/py-pytables/package.py
+++ b/var/spack/repos/builtin/packages/py-pytables/package.py
@@ -34,9 +34,9 @@ class PyPytables(Package):
 
     extends('python')
     depends_on('hdf5')
-    depends_on('py-numpy')
-    depends_on('py-numexpr')
-    depends_on('py-cython')
+    depends_on('py-numpy', type=nolink)
+    depends_on('py-numexpr', type=nolink)
+    depends_on('py-cython', type=nolink)
 
     def install(self, spec, prefix):
         env["HDF5_DIR"] = spec['hdf5'].prefix
diff --git a/var/spack/repos/builtin/packages/py-python-daemon/package.py b/var/spack/repos/builtin/packages/py-python-daemon/package.py
index ae6393986d67b71dca151b26e0ffd88f0b97ebb3..c2c7c4de4f8f02e410833a2f5210caaed2a67b87 100644
--- a/var/spack/repos/builtin/packages/py-python-daemon/package.py
+++ b/var/spack/repos/builtin/packages/py-python-daemon/package.py
@@ -42,8 +42,8 @@ class PyPythonDaemon(Package):
     version('2.0.5', '73e7f49f525c51fa4a995aea4d80de41')
 
     extends("python")
-    depends_on("py-setuptools")
-    depends_on("py-lockfile")
+    depends_on("py-setuptools", type='build')
+    depends_on("py-lockfile", type=nolink)
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-restview/package.py b/var/spack/repos/builtin/packages/py-restview/package.py
index 91b1db993ed9b5f2f4c37517fa3e02a1b09fa3cf..047214c58ecc2d5a5ef460f12fa91e907db03021 100644
--- a/var/spack/repos/builtin/packages/py-restview/package.py
+++ b/var/spack/repos/builtin/packages/py-restview/package.py
@@ -34,8 +34,8 @@ class PyRestview(Package):
     version('2.6.1', 'ac8b70e15b8f1732d1733d674813666b')
 
     extends('python')
-    depends_on('py-docutils')
-    depends_on('py-pygments')
+    depends_on('py-docutils', type=nolink)
+    depends_on('py-pygments', type=nolink)
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix={0}'.format(prefix))
diff --git a/var/spack/repos/builtin/packages/py-rpy2/package.py b/var/spack/repos/builtin/packages/py-rpy2/package.py
index 03fd2b4a06f64179611efb25d2074314b27cebea..8f4771f0eb5d3b73887b8207b41d1bf43fd62442 100644
--- a/var/spack/repos/builtin/packages/py-rpy2/package.py
+++ b/var/spack/repos/builtin/packages/py-rpy2/package.py
@@ -33,7 +33,7 @@ class PyRpy2(Package):
     version('2.5.6', 'a36e758b633ce6aec6a5f450bfee980f')
 
     extends('python')
-    depends_on('py-setuptools')
+    depends_on('py-setuptools', type='build')
 
     depends_on('R')
 
diff --git a/var/spack/repos/builtin/packages/py-scikit-image/package.py b/var/spack/repos/builtin/packages/py-scikit-image/package.py
index 4c8fd0942a45c87b517a2c2101663c8f598ab485..26c286e4be02355e2f7e1b196f2158b9c49b5cc3 100644
--- a/var/spack/repos/builtin/packages/py-scikit-image/package.py
+++ b/var/spack/repos/builtin/packages/py-scikit-image/package.py
@@ -36,12 +36,12 @@ class PyScikitImage(Package):
 
     extends('python', ignore=r'bin/.*\.py$')
 
-    depends_on('py-dask')
-    depends_on('pil')
-    depends_on('py-networkx')
-    depends_on('py-six')
-    depends_on('py-scipy')
-    depends_on('py-matplotlib')
+    depends_on('py-dask', type=nolink)
+    depends_on('pil', type=nolink)
+    depends_on('py-networkx', type=nolink)
+    depends_on('py-six', type=nolink)
+    depends_on('py-scipy', type=nolink)
+    depends_on('py-matplotlib', type=nolink)
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-scikit-learn/package.py b/var/spack/repos/builtin/packages/py-scikit-learn/package.py
index 7bb5853b19124a00a56c9b14f3097ed1094d3715..1a6112bcf3ec73a469fa3dfeb47a059558565cee 100644
--- a/var/spack/repos/builtin/packages/py-scikit-learn/package.py
+++ b/var/spack/repos/builtin/packages/py-scikit-learn/package.py
@@ -35,9 +35,9 @@ class PyScikitLearn(Package):
 
     extends('python')
 
-    depends_on('py-setuptools')
-    depends_on('py-numpy')
-    depends_on('py-scipy')
+    depends_on('py-setuptools', type='build')
+    depends_on('py-numpy', type=nolink)
+    depends_on('py-scipy', type=nolink)
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-scipy/package.py b/var/spack/repos/builtin/packages/py-scipy/package.py
index f7c372b345959f2883eb0ea5d9ef00b889837911..ea3731cf1bbb086ac60a62b0c686baf816e0eb8e 100644
--- a/var/spack/repos/builtin/packages/py-scipy/package.py
+++ b/var/spack/repos/builtin/packages/py-scipy/package.py
@@ -34,8 +34,8 @@ class PyScipy(Package):
     version('0.15.0', '639112f077f0aeb6d80718dc5019dc7a')
 
     extends('python')
-    depends_on('py-nose')
-    depends_on('py-numpy+blas+lapack')
+    depends_on('py-nose', type='build')
+    depends_on('py-numpy+blas+lapack', type=nolink)
 
     def install(self, spec, prefix):
         if 'atlas' in spec:
diff --git a/var/spack/repos/builtin/packages/py-shiboken/package.py b/var/spack/repos/builtin/packages/py-shiboken/package.py
index a2240c68a4c46c55fafe4781aa9ecb4089670ddb..27188e141729140065471023854ec3fcac44e90d 100644
--- a/var/spack/repos/builtin/packages/py-shiboken/package.py
+++ b/var/spack/repos/builtin/packages/py-shiboken/package.py
@@ -32,11 +32,10 @@ class PyShiboken(Package):
 
     version('1.2.2', '345cfebda221f525842e079a6141e555')
 
-    # TODO: make build dependency
-    # depends_on("cmake")
+    depends_on('cmake', type='build')
 
     extends('python')
-    depends_on("py-setuptools")
+    depends_on("py-setuptools", type='build')
     depends_on("libxml2")
     depends_on("qt@:4.8")
 
diff --git a/var/spack/repos/builtin/packages/py-six/package.py b/var/spack/repos/builtin/packages/py-six/package.py
index 3efb3d43172b69ab0240124cdc9a4db6cc88ae6c..eb4846d5af837785d46a64c162757f5c5bcecadd 100644
--- a/var/spack/repos/builtin/packages/py-six/package.py
+++ b/var/spack/repos/builtin/packages/py-six/package.py
@@ -33,7 +33,7 @@ class PySix(Package):
     version('1.10.0', '34eed507548117b2ab523ab14b2f8b55')
 
     extends('python')
-    depends_on('py-setuptools')
+    depends_on('py-setuptools', type='build')
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-sncosmo/package.py b/var/spack/repos/builtin/packages/py-sncosmo/package.py
index 82ae2a2e69c0af8a6d9349953615d7018ca6dd0a..feb3856e8b85047a72f5531beec82a241131d346 100644
--- a/var/spack/repos/builtin/packages/py-sncosmo/package.py
+++ b/var/spack/repos/builtin/packages/py-sncosmo/package.py
@@ -37,15 +37,15 @@ class PySncosmo(Package):
     # Required dependencies
     # py-sncosmo binaries are duplicates of those from py-astropy
     extends('python', ignore=r'bin/.*')
-    depends_on('py-numpy')
-    depends_on('py-scipy')
-    depends_on('py-astropy')
+    depends_on('py-numpy', type=nolink)
+    depends_on('py-scipy', type=nolink)
+    depends_on('py-astropy', type=nolink)
 
     # Recommended dependencies
-    depends_on('py-matplotlib')
-    depends_on('py-iminuit')
-    depends_on('py-emcee')
-    depends_on('py-nestle')
+    depends_on('py-matplotlib', type=nolink)
+    depends_on('py-iminuit', type=nolink)
+    depends_on('py-emcee', type=nolink)
+    depends_on('py-nestle', type=nolink)
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix={0}'.format(prefix))
diff --git a/var/spack/repos/builtin/packages/py-storm/package.py b/var/spack/repos/builtin/packages/py-storm/package.py
index 53af720c50e3e122528df6ac76cd67b9acf70883..0e972480f369a8f72ef05d6916e698ab43520c19 100644
--- a/var/spack/repos/builtin/packages/py-storm/package.py
+++ b/var/spack/repos/builtin/packages/py-storm/package.py
@@ -34,7 +34,7 @@ class PyStorm(Package):
     version('0.20', '8628503141f0f06c0749d607ac09b9c7')
 
     extends('python')
-    depends_on('py-setuptools')
+    depends_on('py-setuptools', type='build')
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-tappy/package.py b/var/spack/repos/builtin/packages/py-tappy/package.py
index a1026a9b4b4f749ef842ce4fdae70ea2a823caee..b10244acddf844535d5210725decdd2606739e68 100644
--- a/var/spack/repos/builtin/packages/py-tappy/package.py
+++ b/var/spack/repos/builtin/packages/py-tappy/package.py
@@ -33,7 +33,7 @@ class PyTappy(Package):
     version('1.6', 'c8bdb93ad66e05f939905172a301bedf')
 
     extends('python')
-    depends_on('py-setuptools')
+    depends_on('py-setuptools', type='build')
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-tuiview/package.py b/var/spack/repos/builtin/packages/py-tuiview/package.py
index 200a33a676c3cf65d71feb2a106254fc6cfd3424..56056ebad16ae7a1a108fed809f06a1ba30b71e9 100644
--- a/var/spack/repos/builtin/packages/py-tuiview/package.py
+++ b/var/spack/repos/builtin/packages/py-tuiview/package.py
@@ -35,8 +35,8 @@ class PyTuiview(Package):
     version('1.1.7', '4b3b38a820cc239c8ab4a181ac5d4c30')
 
     extends("python")
-    depends_on("py-pyqt")
-    depends_on("py-numpy")
+    depends_on("py-pyqt", type=nolink)
+    depends_on("py-numpy", type=nolink)
     depends_on("gdal")
 
     def install(self, spec, prefix):
diff --git a/var/spack/repos/builtin/packages/py-twisted/package.py b/var/spack/repos/builtin/packages/py-twisted/package.py
index 27db4adff4206c902bbf158ce24b2d1458aa3cbb..2ce83cd24c07043eb16519a9a139716d7cae61ad 100644
--- a/var/spack/repos/builtin/packages/py-twisted/package.py
+++ b/var/spack/repos/builtin/packages/py-twisted/package.py
@@ -32,7 +32,7 @@ class PyTwisted(Package):
     version('15.4.0', '5337ffb6aeeff3790981a2cd56db9655')
     version('15.3.0', 'b58e83da2f00b3352afad74d0c5c4599')
 
-    depends_on('py-setuptools')
+    depends_on('py-setuptools', type='build')
 
     extends('python')
 
diff --git a/var/spack/repos/builtin/packages/py-unittest2/package.py b/var/spack/repos/builtin/packages/py-unittest2/package.py
index f669a500ec8f84a60704526d9c35b5082496dd38..174ab0ca5f262c343572084dfc447c31b6924b00 100644
--- a/var/spack/repos/builtin/packages/py-unittest2/package.py
+++ b/var/spack/repos/builtin/packages/py-unittest2/package.py
@@ -35,7 +35,7 @@ class PyUnittest2(Package):
     version('1.1.0', 'f72dae5d44f091df36b6b513305ea000')
 
     extends('python')
-    depends_on('py-setuptools')
+    depends_on('py-setuptools', type='build')
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-unittest2py3k/package.py b/var/spack/repos/builtin/packages/py-unittest2py3k/package.py
index ca857395fbe2fad4f7864dbc19ce9b4dc10f99b0..95e6dcbff0e576ec24cf363476c6e695d4725b16 100644
--- a/var/spack/repos/builtin/packages/py-unittest2py3k/package.py
+++ b/var/spack/repos/builtin/packages/py-unittest2py3k/package.py
@@ -36,7 +36,7 @@ class PyUnittest2py3k(Package):
     version('0.5.1', '8824ff92044310d9365f90d892bf0f09')
 
     extends('python')
-    depends_on('py-setuptools')
+    depends_on('py-setuptools', type='build')
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-urwid/package.py b/var/spack/repos/builtin/packages/py-urwid/package.py
index 0accc72df8a775424ef30e493ba09e205e90d07c..48ba84e7bc85f8c74a70c44468dea929774346c2 100644
--- a/var/spack/repos/builtin/packages/py-urwid/package.py
+++ b/var/spack/repos/builtin/packages/py-urwid/package.py
@@ -31,7 +31,7 @@ class PyUrwid(Package):
 
     version('1.3.0', 'a989acd54f4ff1a554add464803a9175')
 
-    depends_on('py-setuptools')
+    depends_on('py-setuptools', type='build')
 
     extends("python")
 
diff --git a/var/spack/repos/builtin/packages/py-virtualenv/package.py b/var/spack/repos/builtin/packages/py-virtualenv/package.py
index d42cb96eb77508be92318f0c51ad8c343e39b4b8..d6b33ae175a90821de6914025fa179f7f550cf40 100644
--- a/var/spack/repos/builtin/packages/py-virtualenv/package.py
+++ b/var/spack/repos/builtin/packages/py-virtualenv/package.py
@@ -35,7 +35,7 @@ class PyVirtualenv(Package):
     version('15.0.1', '28d76a0d9cbd5dc42046dd14e76a6ecc')
 
     extends('python')
-    depends_on('py-setuptools')
+    depends_on('py-setuptools', type='build')
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-wcsaxes/package.py b/var/spack/repos/builtin/packages/py-wcsaxes/package.py
index b0adbe365806020cd90163ee7134df6b5e44bbd0..9588b879fa09423a7d5481c3076bb431fb8b8aaf 100644
--- a/var/spack/repos/builtin/packages/py-wcsaxes/package.py
+++ b/var/spack/repos/builtin/packages/py-wcsaxes/package.py
@@ -35,9 +35,9 @@ class PyWcsaxes(Package):
     version('0.8', 'de1c60fdae4c330bf5ddb9f1ab5ab920')
 
     extends('python', ignore=r'bin/pbr')
-    depends_on('py-numpy')
-    depends_on('py-matplotlib')
-    depends_on('py-astropy')
+    depends_on('py-numpy', type=nolink)
+    depends_on('py-matplotlib', type=nolink)
+    depends_on('py-astropy', type=nolink)
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix={0}'.format(prefix))
diff --git a/var/spack/repos/builtin/packages/py-wheel/package.py b/var/spack/repos/builtin/packages/py-wheel/package.py
index 68b6f3d679142aba645652e6442a41ac4eb4d8b2..9e383a9a19fff9b5d4d03454e4963654d29b6b62 100644
--- a/var/spack/repos/builtin/packages/py-wheel/package.py
+++ b/var/spack/repos/builtin/packages/py-wheel/package.py
@@ -33,7 +33,7 @@ class PyWheel(Package):
     version('0.26.0', '4cfc6e7e3dc7377d0164914623922a10')
 
     extends('python')
-    depends_on('py-setuptools')
+    depends_on('py-setuptools', type='build')
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-yapf/package.py b/var/spack/repos/builtin/packages/py-yapf/package.py
index 60f740c98dc4dea5f4fa30c0508ff7706dcbe277..f7fe4037a135755aa3e2da6c9dafe06373bb4ed0 100644
--- a/var/spack/repos/builtin/packages/py-yapf/package.py
+++ b/var/spack/repos/builtin/packages/py-yapf/package.py
@@ -33,7 +33,7 @@ class PyYapf(Package):
     version('0.2.1', '348ccf86cf2057872e4451b204fb914c')
 
     extends('python')
-    depends_on('py-setuptools')
+    depends_on('py-setuptools', type='build')
 
     def install(self, spec, prefix):
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/python/package.py b/var/spack/repos/builtin/packages/python/package.py
index d019133585525570e7b6cdf9e572cdf0df799e7b..dafafabb05a11d472267d6b788ae0d049d6d4fe6 100644
--- a/var/spack/repos/builtin/packages/python/package.py
+++ b/var/spack/repos/builtin/packages/python/package.py
@@ -146,7 +146,7 @@ def setup_dependent_environment(self, spack_env, run_env, extension_spec):
         extension and any other python extensions it depends on."""
 
         python_paths = []
-        for d in extension_spec.traverse():
+        for d in extension_spec.traverse(deptype=nolink, deptype_query='run'):
             if d.package.extends(self.spec):
                 python_paths.append(join_path(d.prefix,
                                               self.site_packages_dir))
diff --git a/var/spack/repos/builtin/packages/qhull/package.py b/var/spack/repos/builtin/packages/qhull/package.py
index 280c9cc12c0ab32f584c2db64c2bc481b4639ae0..f7cbcc273659ef5412a288bd4c1031fc3058ea30 100644
--- a/var/spack/repos/builtin/packages/qhull/package.py
+++ b/var/spack/repos/builtin/packages/qhull/package.py
@@ -45,7 +45,7 @@ class Qhull(Package):
     # https://github.com/qhull/qhull/pull/5
     patch('qhull-iterator.patch', when='@1.0')
     
-    depends_on('cmake')
+    depends_on('cmake', type='build')
 
     def install(self, spec, prefix):
         with working_dir('spack-build', create=True):
diff --git a/var/spack/repos/builtin/packages/qt/package.py b/var/spack/repos/builtin/packages/qt/package.py
index 0c91a5ce87cc34a3146a30e053dabec513ac1d1e..f33e5c2d0e580cdf2364743267a200246ffa35a5 100644
--- a/var/spack/repos/builtin/packages/qt/package.py
+++ b/var/spack/repos/builtin/packages/qt/package.py
@@ -60,8 +60,8 @@ class Qt(Package):
 
     # Webkit
     # depends_on("gperf")
-    # depends_on("flex")
-    # depends_on("bison")
+    # depends_on("flex", type='build')
+    # depends_on("bison", type='build')
     # depends_on("ruby")
     # depends_on("icu4c")
 
diff --git a/var/spack/repos/builtin/packages/ravel/package.py b/var/spack/repos/builtin/packages/ravel/package.py
index 763ec1b9a2efbba59887123e20dbc257d083f3c9..96692ac7c14d58788ab7ba9d4c7bfe357f105456 100644
--- a/var/spack/repos/builtin/packages/ravel/package.py
+++ b/var/spack/repos/builtin/packages/ravel/package.py
@@ -33,8 +33,7 @@ class Ravel(Package):
 
     version('1.0.0', 'b25fece58331c2adfcce76c5036485c2')
 
-    # TODO: make this a build dependency
-    depends_on('cmake@2.8.9:')
+    depends_on('cmake@2.8.9:', type='build')
 
     depends_on('muster@1.0.1:')
     depends_on('otf')
diff --git a/var/spack/repos/builtin/packages/rose/package.py b/var/spack/repos/builtin/packages/rose/package.py
index b8a65e8574bb11e75119ac041297f9d7c2a8dcad..bcd317eb8ffbe1da0069b52a372af8c6676dcf77 100644
--- a/var/spack/repos/builtin/packages/rose/package.py
+++ b/var/spack/repos/builtin/packages/rose/package.py
@@ -40,9 +40,9 @@ class Rose(Package):
 
     patch('add_spack_compiler_recognition.patch')
 
-    depends_on("autoconf@2.69")
-    depends_on("automake@1.14")
-    depends_on("libtool@2.4")
+    depends_on("autoconf@2.69", type='build')
+    depends_on("automake@1.14", type='build')
+    depends_on("libtool@2.4", type='build')
     depends_on("boost@1.54.0")
     depends_on("jdk@8u25-linux-x64")
 
diff --git a/var/spack/repos/builtin/packages/scotch/package.py b/var/spack/repos/builtin/packages/scotch/package.py
index 2f6e42c439a370395e2ae88112581d6869323e10..c2bad20c2fe39c7a28cd7c21fe5e2daf3d1ed00b 100644
--- a/var/spack/repos/builtin/packages/scotch/package.py
+++ b/var/spack/repos/builtin/packages/scotch/package.py
@@ -45,8 +45,8 @@ class Scotch(Package):
     variant('shared', default=True, description='Build a shared version of the library')
     variant('metis', default=True, description='Build metis and parmetis wrapper libraries')
 
-    depends_on('flex')
-    depends_on('bison')
+    depends_on('flex', type='build')
+    depends_on('bison', type='build')
     depends_on('mpi', when='+mpi')
     depends_on('zlib', when='+compression')
 
diff --git a/var/spack/repos/builtin/packages/serf/package.py b/var/spack/repos/builtin/packages/serf/package.py
index ff6fd2da9b0bdb1956a34d2e61bb1bab97bbc6a4..ebca74a3ab89df456c7b5094eb1a14cd5d8c1886 100644
--- a/var/spack/repos/builtin/packages/serf/package.py
+++ b/var/spack/repos/builtin/packages/serf/package.py
@@ -36,7 +36,7 @@ class Serf(Package):
 
     depends_on('apr')
     depends_on('apr-util')
-    depends_on('scons')
+    depends_on('scons', type='build')
     depends_on('expat')
     depends_on('openssl')
     depends_on('zlib')
diff --git a/var/spack/repos/builtin/packages/spot/package.py b/var/spack/repos/builtin/packages/spot/package.py
index 59535dcc4cb829a83d7ad0c847b792861c8cae3e..21bb6f03a70e483747eaf8812207e0e42a44b17c 100644
--- a/var/spack/repos/builtin/packages/spot/package.py
+++ b/var/spack/repos/builtin/packages/spot/package.py
@@ -32,7 +32,7 @@ class Spot(Package):
 
     version('1.99.3', 'd53adcb2d0fe7c69f45d4e595a58254e')
 
-    #depends_on("gcc@4.8:")
+    #depends_on("gcc@4.8:", type='build')
     depends_on("python@3.2:")
 
     def install(self, spec, prefix):
diff --git a/var/spack/repos/builtin/packages/stat/package.py b/var/spack/repos/builtin/packages/stat/package.py
index 80d27e149f98f1cf1c879e7dbec83ae148df0502..a03713397b66d46c6609f32a95acd777d57962a8 100644
--- a/var/spack/repos/builtin/packages/stat/package.py
+++ b/var/spack/repos/builtin/packages/stat/package.py
@@ -39,7 +39,7 @@ class Stat(Package):
     depends_on('libdwarf')
     depends_on('dyninst')
     depends_on('graphlib')
-    depends_on('graphviz')
+    depends_on('graphviz', type=alldeps)
     depends_on('launchmon')
     depends_on('mrnet')
 
diff --git a/var/spack/repos/builtin/packages/sundials/package.py b/var/spack/repos/builtin/packages/sundials/package.py
index c55198a8502cd8dda26903eaa9bb355506554c0e..e52b90eb8addd00be201b099745052fdfd0aed92 100644
--- a/var/spack/repos/builtin/packages/sundials/package.py
+++ b/var/spack/repos/builtin/packages/sundials/package.py
@@ -42,6 +42,7 @@ class Sundials(Package):
     variant('openmp',  default=False, description='Enable OpenMP support')
     variant('pthread', default=True,  description='Enable POSIX threads support')
 
+    depends_on('cmake', type='build')
     depends_on('mpi',                when='+mpi')
     depends_on('blas',               when='+lapack')
     depends_on('lapack',             when='+lapack')
diff --git a/var/spack/repos/builtin/packages/swiftsim/package.py b/var/spack/repos/builtin/packages/swiftsim/package.py
index 42e8fb466a0a1a1b249e9574f591b277671db0f7..37862a73a9a4dec1feda9738b6f40d61eb2a52fb 100644
--- a/var/spack/repos/builtin/packages/swiftsim/package.py
+++ b/var/spack/repos/builtin/packages/swiftsim/package.py
@@ -43,10 +43,10 @@ class Swiftsim(Package):
     variant('mpi', default=True, description='Enable distributed memory parallelism')
 
     # Build dependencies
-    depends_on('autoconf')
-    depends_on('automake')
-    depends_on('libtool')
-    depends_on('m4')
+    depends_on('autoconf', type='build')
+    depends_on('automake', type='build')
+    depends_on('libtool', type='build')
+    depends_on('m4', type='build')
     # link-time / run-time dependencies
     depends_on('mpi', when='+mpi')
     depends_on('metis')
diff --git a/var/spack/repos/builtin/packages/task/package.py b/var/spack/repos/builtin/packages/task/package.py
index dc52c4f9f6faa4cb28b29381e9d09ebe1bef07e1..8c3b412f48de761ca59b34c0870960f9ef220791 100644
--- a/var/spack/repos/builtin/packages/task/package.py
+++ b/var/spack/repos/builtin/packages/task/package.py
@@ -31,6 +31,7 @@ class Task(Package):
 
     version('2.4.4', '517450c4a23a5842df3e9905b38801b3')
 
+    depends_on('cmake', type='build')
     depends_on("gnutls")
     depends_on("libuuid")
     # depends_on("gcc@4.8:")
diff --git a/var/spack/repos/builtin/packages/taskd/package.py b/var/spack/repos/builtin/packages/taskd/package.py
index 8a022b4fe9869980ebe8d944a62d908f412e50fa..1d7f9ed49ea796fcd895e8b9c1b651c1a3c86fcf 100644
--- a/var/spack/repos/builtin/packages/taskd/package.py
+++ b/var/spack/repos/builtin/packages/taskd/package.py
@@ -32,6 +32,7 @@ class Taskd(Package):
 
     version('1.1.0', 'ac855828c16f199bdbc45fbc227388d0')
 
+    depends_on('cmake', type='build')
     depends_on("libuuid")
     depends_on("gnutls")
 
diff --git a/var/spack/repos/builtin/packages/tetgen/package.py b/var/spack/repos/builtin/packages/tetgen/package.py
index c301a5b4e5b01861e881011924b3de66aae325d8..97aa68be65a08ee558bbe0d7c417aa245b82001c 100644
--- a/var/spack/repos/builtin/packages/tetgen/package.py
+++ b/var/spack/repos/builtin/packages/tetgen/package.py
@@ -38,9 +38,7 @@ class Tetgen(Package):
     version('1.4.3', 'd6a4bcdde2ac804f7ec66c29dcb63c18')
     version('1.5.0', '3b9fd9cdec121e52527b0308f7aad5c1', url='http://www.tetgen.org/1.5/src/tetgen1.5.0.tar.gz')
 
-    # TODO: Make this a build dependency once build dependencies are supported
-    # (see: https://github.com/LLNL/spack/pull/378).
-    depends_on('cmake@2.8.7:', when='@1.5.0:')
+    depends_on('cmake@2.8.7:', when='@1.5.0:', type='build')
 
     def install(self, spec, prefix):
         make('tetgen', 'tetlib')
diff --git a/var/spack/repos/builtin/packages/the_platinum_searcher/package.py b/var/spack/repos/builtin/packages/the_platinum_searcher/package.py
index 9c9a66cdefc9894edeafb6111fe0d1672e1c2064..0d2c2918c4f6518ccee970209af36ed0cc873024 100644
--- a/var/spack/repos/builtin/packages/the_platinum_searcher/package.py
+++ b/var/spack/repos/builtin/packages/the_platinum_searcher/package.py
@@ -12,7 +12,7 @@ class ThePlatinumSearcher(Package):
 
     version('head', go=package)
 
-    extends("go")
+    extends("go", deptypes='build')
 
     def install(self, spec, prefix):
         env = os.environ
diff --git a/var/spack/repos/builtin/packages/the_silver_searcher/package.py b/var/spack/repos/builtin/packages/the_silver_searcher/package.py
index e289b6d7836aff6ba3db0c4ae780b78be3fc5ea3..988619df304ee4a0df4f526b4a1703ad65021dcd 100644
--- a/var/spack/repos/builtin/packages/the_silver_searcher/package.py
+++ b/var/spack/repos/builtin/packages/the_silver_searcher/package.py
@@ -33,7 +33,7 @@ class TheSilverSearcher(Package):
 
     depends_on('pcre')
     depends_on('xz')
-    depends_on('pkg-config')
+    depends_on('pkg-config', type='build')
 
     def install(self, spec, prefix):
         configure("--prefix=%s" % prefix)
diff --git a/var/spack/repos/builtin/packages/thrift/package.py b/var/spack/repos/builtin/packages/thrift/package.py
index 6d834c6321d8b0a4f503be820d11a020a03270f9..025ee2b88582ab37ba071820d136dcadde165964 100644
--- a/var/spack/repos/builtin/packages/thrift/package.py
+++ b/var/spack/repos/builtin/packages/thrift/package.py
@@ -41,12 +41,12 @@ class Thrift(Package):
     variant('python', default=True, description="Build support for python")
 
     depends_on('jdk')
-    depends_on('autoconf')
-    depends_on('automake')
-    depends_on('libtool')
+    depends_on('autoconf', type='build')
+    depends_on('automake', type='build')
+    depends_on('libtool', type='build')
     depends_on('boost@1.53:')
-    depends_on('bison')
-    depends_on('flex')
+    depends_on('bison', type='build')
+    depends_on('flex', type='build')
     depends_on('openssl')
 
     # Variant dependencies
diff --git a/var/spack/repos/builtin/packages/trilinos/package.py b/var/spack/repos/builtin/packages/trilinos/package.py
index 3a53ac5c01c13fb7d397fa5c2f6ffdb6fd20737e..56499af8d99c80a422c0f75cae47463523d7ef8d 100644
--- a/var/spack/repos/builtin/packages/trilinos/package.py
+++ b/var/spack/repos/builtin/packages/trilinos/package.py
@@ -68,6 +68,8 @@ class Trilinos(Package):
     variant('debug',        default=False, description='Builds a debug version of the libraries')
     variant('boost',        default=True, description='Compile with Boost')
 
+    depends_on('cmake', type='build')
+
     # Everything should be compiled with -fpic
     depends_on('blas')
     depends_on('lapack')
diff --git a/var/spack/repos/builtin/packages/vim/package.py b/var/spack/repos/builtin/packages/vim/package.py
index f66c20894bbb4dcd02b00b4fbfdfe6603c13b255..e0dfb64879187ed2a82cdcd247e5b8ac9b36a18d 100644
--- a/var/spack/repos/builtin/packages/vim/package.py
+++ b/var/spack/repos/builtin/packages/vim/package.py
@@ -60,7 +60,7 @@ class Vim(Package):
     depends_on('ruby', when='+ruby')
 
     variant('cscope', default=False, description="build with cscope support")
-    depends_on('cscope', when='+cscope')
+    depends_on('cscope', when='+cscope', type='run')
 
     variant('gui', default=False, description="build with gui (gvim)")
     # virtual dependency?
diff --git a/var/spack/repos/builtin/packages/vtk/package.py b/var/spack/repos/builtin/packages/vtk/package.py
index d2296dbc266c188983bb1a93074311bbce9482df..5c196b5ea8146e53125c86a75d142fed4ddf13a3 100644
--- a/var/spack/repos/builtin/packages/vtk/package.py
+++ b/var/spack/repos/builtin/packages/vtk/package.py
@@ -37,6 +37,7 @@ class Vtk(Package):
 
     version('6.1.0', '25e4dfb3bad778722dcaec80cd5dab7d')
 
+    depends_on('cmake', type='build')
     depends_on("qt")
 
     # VTK7 defaults to OpenGL2 rendering backend