Matej Stuchlik a7c7b12
diff --git a/pip/cmdoptions.py b/pip/cmdoptions.py
Matej Stuchlik a7c7b12
index 8ed3d91..01b2104 100644
Matej Stuchlik a7c7b12
--- a/pip/cmdoptions.py
Matej Stuchlik a7c7b12
+++ b/pip/cmdoptions.py
Matej Stuchlik a7c7b12
@@ -9,7 +9,7 @@ To be consistent, all options will follow this design.
Matej Stuchlik a7c7b12
 """
Matej Stuchlik a7c7b12
 import copy
Matej Stuchlik a7c7b12
 from optparse import OptionGroup, SUPPRESS_HELP, Option
Matej Stuchlik a7c7b12
-from pip.locations import build_prefix, default_log_file
Matej Stuchlik a7c7b12
+from pip.locations import default_log_file
Matej Stuchlik a7c7b12
 
Matej Stuchlik a7c7b12
 
Matej Stuchlik a7c7b12
 def make_option_group(group, parser):
Matej Stuchlik a7c7b12
@@ -297,10 +297,8 @@ build_dir = OptionMaker(
Matej Stuchlik a7c7b12
     '-b', '--build', '--build-dir', '--build-directory',
Matej Stuchlik a7c7b12
     dest='build_dir',
Matej Stuchlik a7c7b12
     metavar='dir',
Matej Stuchlik a7c7b12
-    default=build_prefix,
Matej Stuchlik a7c7b12
-    help='Directory to unpack packages into and build in. '
Matej Stuchlik a7c7b12
-    'The default in a virtualenv is "<venv path>/build". '
Matej Stuchlik a7c7b12
-    'The default for global installs is "<OS temp dir>/pip_build_<username>".')
Matej Stuchlik a7c7b12
+    help='Directory to unpack packages into and build in.',
Matej Stuchlik a7c7b12
+)
Matej Stuchlik a7c7b12
 
Matej Stuchlik a7c7b12
 install_options = OptionMaker(
Matej Stuchlik a7c7b12
     '--install-option',
Matej Stuchlik a7c7b12
diff --git a/pip/commands/install.py b/pip/commands/install.py
Matej Stuchlik a7c7b12
index cbf22a0..cb7d0db 100644
Matej Stuchlik a7c7b12
--- a/pip/commands/install.py
Matej Stuchlik a7c7b12
+++ b/pip/commands/install.py
Matej Stuchlik a7c7b12
@@ -10,6 +10,7 @@ from pip.basecommand import Command
Matej Stuchlik a7c7b12
 from pip.index import PackageFinder
Matej Stuchlik a7c7b12
 from pip.exceptions import InstallationError, CommandError, PreviousBuildDirError
Matej Stuchlik a7c7b12
 from pip import cmdoptions
Matej Stuchlik a7c7b12
+from pip.util import BuildDirectory
Matej Stuchlik a7c7b12
 
Matej Stuchlik a7c7b12
 
Matej Stuchlik a7c7b12
 class InstallCommand(Command):
Matej Stuchlik a7c7b12
@@ -188,7 +189,7 @@ class InstallCommand(Command):
Matej Stuchlik a7c7b12
         if (
Matej Stuchlik a7c7b12
             options.no_install or
Matej Stuchlik a7c7b12
             options.no_download or
Matej Stuchlik a7c7b12
-            (options.build_dir != build_prefix) or
Matej Stuchlik a7c7b12
+            options.build_dir or
Matej Stuchlik a7c7b12
             options.no_clean
Matej Stuchlik a7c7b12
         ):
Matej Stuchlik a7c7b12
             logger.deprecated('1.7', 'DEPRECATION: --no-install, --no-download, --build, '
Matej Stuchlik a7c7b12
@@ -197,7 +198,16 @@ class InstallCommand(Command):
Matej Stuchlik a7c7b12
         if options.download_dir:
Matej Stuchlik a7c7b12
             options.no_install = True
Matej Stuchlik a7c7b12
             options.ignore_installed = True
Matej Stuchlik a7c7b12
-        options.build_dir = os.path.abspath(options.build_dir)
Matej Stuchlik a7c7b12
+
Matej Stuchlik a7c7b12
+        # If we have --no-install or --no-download and no --build we use the
Matej Stuchlik a7c7b12
+        # legacy static build dir
Matej Stuchlik a7c7b12
+        if (options.build_dir is None
Matej Stuchlik a7c7b12
+                and (options.no_install or options.no_download)):
Matej Stuchlik a7c7b12
+            options.build_dir = build_prefix
Matej Stuchlik a7c7b12
+
Matej Stuchlik a7c7b12
+        if options.build_dir:
Matej Stuchlik a7c7b12
+            options.build_dir = os.path.abspath(options.build_dir)
Matej Stuchlik a7c7b12
+
Matej Stuchlik a7c7b12
         options.src_dir = os.path.abspath(options.src_dir)
Matej Stuchlik a7c7b12
         install_options = options.install_options or []
Matej Stuchlik a7c7b12
         if options.use_user_site:
Matej Stuchlik a7c7b12
@@ -246,73 +256,75 @@ class InstallCommand(Command):
Matej Stuchlik a7c7b12
 
Matej Stuchlik a7c7b12
         finder = self._build_package_finder(options, index_urls, session)
Matej Stuchlik a7c7b12
 
Matej Stuchlik a7c7b12
-        requirement_set = RequirementSet(
Matej Stuchlik a7c7b12
-            build_dir=options.build_dir,
Matej Stuchlik a7c7b12
-            src_dir=options.src_dir,
Matej Stuchlik a7c7b12
-            download_dir=options.download_dir,
Matej Stuchlik a7c7b12
-            download_cache=options.download_cache,
Matej Stuchlik a7c7b12
-            upgrade=options.upgrade,
Matej Stuchlik a7c7b12
-            as_egg=options.as_egg,
Matej Stuchlik a7c7b12
-            ignore_installed=options.ignore_installed,
Matej Stuchlik a7c7b12
-            ignore_dependencies=options.ignore_dependencies,
Matej Stuchlik a7c7b12
-            force_reinstall=options.force_reinstall,
Matej Stuchlik a7c7b12
-            use_user_site=options.use_user_site,
Matej Stuchlik a7c7b12
-            target_dir=temp_target_dir,
Matej Stuchlik a7c7b12
-            session=session,
Matej Stuchlik a7c7b12
-            pycompile=options.compile,
Matej Stuchlik a7c7b12
-        )
Matej Stuchlik a7c7b12
-        for name in args:
Matej Stuchlik a7c7b12
-            requirement_set.add_requirement(
Matej Stuchlik a7c7b12
-                InstallRequirement.from_line(name, None))
Matej Stuchlik a7c7b12
-        for name in options.editables:
Matej Stuchlik a7c7b12
-            requirement_set.add_requirement(
Matej Stuchlik a7c7b12
-                InstallRequirement.from_editable(name, default_vcs=options.default_vcs))
Matej Stuchlik a7c7b12
-        for filename in options.requirements:
Matej Stuchlik a7c7b12
-            for req in parse_requirements(filename, finder=finder, options=options, session=session):
Matej Stuchlik a7c7b12
-                requirement_set.add_requirement(req)
Matej Stuchlik a7c7b12
-        if not requirement_set.has_requirements:
Matej Stuchlik a7c7b12
-            opts = {'name': self.name}
Matej Stuchlik a7c7b12
-            if options.find_links:
Matej Stuchlik a7c7b12
-                msg = ('You must give at least one requirement to %(name)s '
Matej Stuchlik a7c7b12
-                       '(maybe you meant "pip %(name)s %(links)s"?)' %
Matej Stuchlik a7c7b12
-                       dict(opts, links=' '.join(options.find_links)))
Matej Stuchlik a7c7b12
-            else:
Matej Stuchlik a7c7b12
-                msg = ('You must give at least one requirement '
Matej Stuchlik a7c7b12
-                       'to %(name)s (see "pip help %(name)s")' % opts)
Matej Stuchlik a7c7b12
-            logger.warn(msg)
Matej Stuchlik a7c7b12
-            return
Matej Stuchlik a7c7b12
-
Matej Stuchlik a7c7b12
-        try:
Matej Stuchlik a7c7b12
-            if not options.no_download:
Matej Stuchlik a7c7b12
-                requirement_set.prepare_files(finder, force_root_egg_info=self.bundle, bundle=self.bundle)
Matej Stuchlik a7c7b12
-            else:
Matej Stuchlik a7c7b12
-                requirement_set.locate_files()
Matej Stuchlik a7c7b12
-
Matej Stuchlik a7c7b12
-            if not options.no_install and not self.bundle:
Matej Stuchlik a7c7b12
-                requirement_set.install(
Matej Stuchlik a7c7b12
-                    install_options,
Matej Stuchlik a7c7b12
-                    global_options,
Matej Stuchlik a7c7b12
-                    root=options.root_path,
Matej Stuchlik a7c7b12
-                    strip_file_prefix=options.strip_file_prefix)
Matej Stuchlik a7c7b12
-                installed = ' '.join([req.name for req in
Matej Stuchlik a7c7b12
-                                      requirement_set.successfully_installed])
Matej Stuchlik a7c7b12
-                if installed:
Matej Stuchlik a7c7b12
-                    logger.notify('Successfully installed %s' % installed)
Matej Stuchlik a7c7b12
-            elif not self.bundle:
Matej Stuchlik a7c7b12
-                downloaded = ' '.join([req.name for req in
Matej Stuchlik a7c7b12
-                                       requirement_set.successfully_downloaded])
Matej Stuchlik a7c7b12
-                if downloaded:
Matej Stuchlik a7c7b12
-                    logger.notify('Successfully downloaded %s' % downloaded)
Matej Stuchlik a7c7b12
-            elif self.bundle:
Matej Stuchlik a7c7b12
-                requirement_set.create_bundle(self.bundle_filename)
Matej Stuchlik a7c7b12
-                logger.notify('Created bundle in %s' % self.bundle_filename)
Matej Stuchlik a7c7b12
-        except PreviousBuildDirError:
Matej Stuchlik a7c7b12
-            options.no_clean = True
Matej Stuchlik a7c7b12
-            raise
Matej Stuchlik a7c7b12
-        finally:
Matej Stuchlik a7c7b12
-            # Clean up
Matej Stuchlik a7c7b12
-            if (not options.no_clean) and ((not options.no_install) or options.download_dir):
Matej Stuchlik a7c7b12
-                requirement_set.cleanup_files(bundle=self.bundle)
Matej Stuchlik a7c7b12
+        build_delete = (not (options.no_clean or options.build_dir))
Matej Stuchlik a7c7b12
+        with BuildDirectory(options.build_dir, delete=build_delete) as build_dir:
Matej Stuchlik a7c7b12
+            requirement_set = RequirementSet(
Matej Stuchlik a7c7b12
+                build_dir=build_dir,
Matej Stuchlik a7c7b12
+                src_dir=options.src_dir,
Matej Stuchlik a7c7b12
+                download_dir=options.download_dir,
Matej Stuchlik a7c7b12
+                download_cache=options.download_cache,
Matej Stuchlik a7c7b12
+                upgrade=options.upgrade,
Matej Stuchlik a7c7b12
+                as_egg=options.as_egg,
Matej Stuchlik a7c7b12
+                ignore_installed=options.ignore_installed,
Matej Stuchlik a7c7b12
+                ignore_dependencies=options.ignore_dependencies,
Matej Stuchlik a7c7b12
+                force_reinstall=options.force_reinstall,
Matej Stuchlik a7c7b12
+                use_user_site=options.use_user_site,
Matej Stuchlik a7c7b12
+                target_dir=temp_target_dir,
Matej Stuchlik a7c7b12
+                session=session,
Matej Stuchlik a7c7b12
+                pycompile=options.compile,
Matej Stuchlik a7c7b12
+            )
Matej Stuchlik a7c7b12
+            for name in args:
Matej Stuchlik a7c7b12
+                requirement_set.add_requirement(
Matej Stuchlik a7c7b12
+                    InstallRequirement.from_line(name, None))
Matej Stuchlik a7c7b12
+            for name in options.editables:
Matej Stuchlik a7c7b12
+                requirement_set.add_requirement(
Matej Stuchlik a7c7b12
+                    InstallRequirement.from_editable(name, default_vcs=options.default_vcs))
Matej Stuchlik a7c7b12
+            for filename in options.requirements:
Matej Stuchlik a7c7b12
+                for req in parse_requirements(filename, finder=finder, options=options, session=session):
Matej Stuchlik a7c7b12
+                    requirement_set.add_requirement(req)
Matej Stuchlik a7c7b12
+            if not requirement_set.has_requirements:
Matej Stuchlik a7c7b12
+                opts = {'name': self.name}
Matej Stuchlik a7c7b12
+                if options.find_links:
Matej Stuchlik a7c7b12
+                    msg = ('You must give at least one requirement to %(name)s '
Matej Stuchlik a7c7b12
+                           '(maybe you meant "pip %(name)s %(links)s"?)' %
Matej Stuchlik a7c7b12
+                           dict(opts, links=' '.join(options.find_links)))
Matej Stuchlik a7c7b12
+                else:
Matej Stuchlik a7c7b12
+                    msg = ('You must give at least one requirement '
Matej Stuchlik a7c7b12
+                           'to %(name)s (see "pip help %(name)s")' % opts)
Matej Stuchlik a7c7b12
+                logger.warn(msg)
Matej Stuchlik a7c7b12
+                return
Matej Stuchlik a7c7b12
+
Matej Stuchlik a7c7b12
+            try:
Matej Stuchlik a7c7b12
+                if not options.no_download:
Matej Stuchlik a7c7b12
+                    requirement_set.prepare_files(finder, force_root_egg_info=self.bundle, bundle=self.bundle)
Matej Stuchlik a7c7b12
+                else:
Matej Stuchlik a7c7b12
+                    requirement_set.locate_files()
Matej Stuchlik a7c7b12
+
Matej Stuchlik a7c7b12
+                if not options.no_install and not self.bundle:
Matej Stuchlik a7c7b12
+                    requirement_set.install(
Matej Stuchlik a7c7b12
+                        install_options,
Matej Stuchlik a7c7b12
+                        global_options,
Matej Stuchlik a7c7b12
+                        root=options.root_path,
Matej Stuchlik a7c7b12
+                        strip_file_prefix=options.strip_file_prefix)
Matej Stuchlik a7c7b12
+                    installed = ' '.join([req.name for req in
Matej Stuchlik a7c7b12
+                                          requirement_set.successfully_installed])
Matej Stuchlik a7c7b12
+                    if installed:
Matej Stuchlik a7c7b12
+                        logger.notify('Successfully installed %s' % installed)
Matej Stuchlik a7c7b12
+                elif not self.bundle:
Matej Stuchlik a7c7b12
+                    downloaded = ' '.join([req.name for req in
Matej Stuchlik a7c7b12
+                                           requirement_set.successfully_downloaded])
Matej Stuchlik a7c7b12
+                    if downloaded:
Matej Stuchlik a7c7b12
+                        logger.notify('Successfully downloaded %s' % downloaded)
Matej Stuchlik a7c7b12
+                elif self.bundle:
Matej Stuchlik a7c7b12
+                    requirement_set.create_bundle(self.bundle_filename)
Matej Stuchlik a7c7b12
+                    logger.notify('Created bundle in %s' % self.bundle_filename)
Matej Stuchlik a7c7b12
+            except PreviousBuildDirError:
Matej Stuchlik a7c7b12
+                options.no_clean = True
Matej Stuchlik a7c7b12
+                raise
Matej Stuchlik a7c7b12
+            finally:
Matej Stuchlik a7c7b12
+                # Clean up
Matej Stuchlik a7c7b12
+                if (not options.no_clean) and ((not options.no_install) or options.download_dir):
Matej Stuchlik a7c7b12
+                    requirement_set.cleanup_files(bundle=self.bundle)
Matej Stuchlik a7c7b12
 
Matej Stuchlik a7c7b12
         if options.target_dir:
Matej Stuchlik a7c7b12
             if not os.path.exists(options.target_dir):
Matej Stuchlik a7c7b12
diff --git a/pip/commands/wheel.py b/pip/commands/wheel.py
Matej Stuchlik a7c7b12
index 6527063..a96631a 100644
Matej Stuchlik a7c7b12
--- a/pip/commands/wheel.py
Matej Stuchlik a7c7b12
+++ b/pip/commands/wheel.py
Matej Stuchlik a7c7b12
@@ -8,7 +8,7 @@ from pip.index import PackageFinder
Matej Stuchlik a7c7b12
 from pip.log import logger
Matej Stuchlik a7c7b12
 from pip.exceptions import CommandError, PreviousBuildDirError
Matej Stuchlik a7c7b12
 from pip.req import InstallRequirement, RequirementSet, parse_requirements
Matej Stuchlik a7c7b12
-from pip.util import normalize_path
Matej Stuchlik a7c7b12
+from pip.util import BuildDirectory, normalize_path
Matej Stuchlik a7c7b12
 from pip.wheel import WheelBuilder
Matej Stuchlik a7c7b12
 from pip import cmdoptions
Matej Stuchlik a7c7b12
 
Matej Stuchlik a7c7b12
@@ -123,6 +123,9 @@ class WheelCommand(Command):
Matej Stuchlik a7c7b12
                         "--extra-index-url is suggested.")
Matej Stuchlik a7c7b12
             index_urls += options.mirrors
Matej Stuchlik a7c7b12
 
Matej Stuchlik a7c7b12
+        if options.build_dir:
Matej Stuchlik a7c7b12
+            options.build_dir = os.path.abspath(options.build_dir)
Matej Stuchlik a7c7b12
+
Matej Stuchlik a7c7b12
         session = self._build_session(options)
Matej Stuchlik a7c7b12
 
Matej Stuchlik a7c7b12
         finder = PackageFinder(find_links=options.find_links,
Matej Stuchlik a7c7b12
@@ -137,59 +140,60 @@ class WheelCommand(Command):
Matej Stuchlik a7c7b12
                                session=session,
Matej Stuchlik a7c7b12
                             )
Matej Stuchlik a7c7b12
 
Matej Stuchlik a7c7b12
-        options.build_dir = os.path.abspath(options.build_dir)
Matej Stuchlik a7c7b12
-        requirement_set = RequirementSet(
Matej Stuchlik a7c7b12
-            build_dir=options.build_dir,
Matej Stuchlik a7c7b12
-            src_dir=None,
Matej Stuchlik a7c7b12
-            download_dir=None,
Matej Stuchlik a7c7b12
-            download_cache=options.download_cache,
Matej Stuchlik a7c7b12
-            ignore_dependencies=options.ignore_dependencies,
Matej Stuchlik a7c7b12
-            ignore_installed=True,
Matej Stuchlik a7c7b12
-            session=session,
Matej Stuchlik a7c7b12
-            wheel_download_dir=options.wheel_dir
Matej Stuchlik a7c7b12
-        )
Matej Stuchlik a7c7b12
-
Matej Stuchlik a7c7b12
-        # make the wheelhouse
Matej Stuchlik a7c7b12
-        if not os.path.exists(options.wheel_dir):
Matej Stuchlik a7c7b12
-            os.makedirs(options.wheel_dir)
Matej Stuchlik a7c7b12
-
Matej Stuchlik a7c7b12
-        #parse args and/or requirements files
Matej Stuchlik a7c7b12
-        for name in args:
Matej Stuchlik a7c7b12
-            requirement_set.add_requirement(
Matej Stuchlik a7c7b12
-                InstallRequirement.from_line(name, None))
Matej Stuchlik a7c7b12
-
Matej Stuchlik a7c7b12
-        for filename in options.requirements:
Matej Stuchlik a7c7b12
-            for req in parse_requirements(
Matej Stuchlik a7c7b12
-                filename,
Matej Stuchlik a7c7b12
-                finder=finder,
Matej Stuchlik a7c7b12
-                options=options,
Matej Stuchlik a7c7b12
-                session=session):
Matej Stuchlik a7c7b12
-                if req.editable:
Matej Stuchlik a7c7b12
-                    logger.notify("ignoring %s" % req.url)
Matej Stuchlik a7c7b12
-                    continue
Matej Stuchlik a7c7b12
-                requirement_set.add_requirement(req)
Matej Stuchlik a7c7b12
-
Matej Stuchlik a7c7b12
-        #fail if no requirements
Matej Stuchlik a7c7b12
-        if not requirement_set.has_requirements:
Matej Stuchlik a7c7b12
-            opts = {'name': self.name}
Matej Stuchlik a7c7b12
-            msg = ('You must give at least one requirement '
Matej Stuchlik a7c7b12
-                   'to %(name)s (see "pip help %(name)s")' % opts)
Matej Stuchlik a7c7b12
-            logger.error(msg)
Matej Stuchlik a7c7b12
-            return
Matej Stuchlik a7c7b12
+        build_delete = (not (options.no_clean or options.build_dir))
Matej Stuchlik a7c7b12
+        with BuildDirectory(options.build_dir, delete=build_delete) as build_dir:
Matej Stuchlik a7c7b12
+            requirement_set = RequirementSet(
Matej Stuchlik a7c7b12
+                build_dir=build_dir,
Matej Stuchlik a7c7b12
+                src_dir=None,
Matej Stuchlik a7c7b12
+                download_dir=None,
Matej Stuchlik a7c7b12
+                download_cache=options.download_cache,
Matej Stuchlik a7c7b12
+                ignore_dependencies=options.ignore_dependencies,
Matej Stuchlik a7c7b12
+                ignore_installed=True,
Matej Stuchlik a7c7b12
+                session=session,
Matej Stuchlik a7c7b12
+                wheel_download_dir=options.wheel_dir
Matej Stuchlik a7c7b12
+            )
Matej Stuchlik a7c7b12
 
Matej Stuchlik a7c7b12
-        try:
Matej Stuchlik a7c7b12
-            #build wheels
Matej Stuchlik a7c7b12
-            wb = WheelBuilder(
Matej Stuchlik a7c7b12
-                requirement_set,
Matej Stuchlik a7c7b12
-                finder,
Matej Stuchlik a7c7b12
-                options.wheel_dir,
Matej Stuchlik a7c7b12
-                build_options = options.build_options or [],
Matej Stuchlik a7c7b12
-                global_options = options.global_options or []
Matej Stuchlik a7c7b12
-                )
Matej Stuchlik a7c7b12
-            wb.build()
Matej Stuchlik a7c7b12
-        except PreviousBuildDirError:
Matej Stuchlik a7c7b12
-            options.no_clean = True
Matej Stuchlik a7c7b12
-            raise
Matej Stuchlik a7c7b12
-        finally:
Matej Stuchlik a7c7b12
-            if not options.no_clean:
Matej Stuchlik a7c7b12
-                requirement_set.cleanup_files()
Matej Stuchlik a7c7b12
+            # make the wheelhouse
Matej Stuchlik a7c7b12
+            if not os.path.exists(options.wheel_dir):
Matej Stuchlik a7c7b12
+                os.makedirs(options.wheel_dir)
Matej Stuchlik a7c7b12
+
Matej Stuchlik a7c7b12
+            #parse args and/or requirements files
Matej Stuchlik a7c7b12
+            for name in args:
Matej Stuchlik a7c7b12
+                requirement_set.add_requirement(
Matej Stuchlik a7c7b12
+                    InstallRequirement.from_line(name, None))
Matej Stuchlik a7c7b12
+
Matej Stuchlik a7c7b12
+            for filename in options.requirements:
Matej Stuchlik a7c7b12
+                for req in parse_requirements(
Matej Stuchlik a7c7b12
+                    filename,
Matej Stuchlik a7c7b12
+                    finder=finder,
Matej Stuchlik a7c7b12
+                    options=options,
Matej Stuchlik a7c7b12
+                    session=session):
Matej Stuchlik a7c7b12
+                    if req.editable:
Matej Stuchlik a7c7b12
+                        logger.notify("ignoring %s" % req.url)
Matej Stuchlik a7c7b12
+                        continue
Matej Stuchlik a7c7b12
+                    requirement_set.add_requirement(req)
Matej Stuchlik a7c7b12
+
Matej Stuchlik a7c7b12
+            #fail if no requirements
Matej Stuchlik a7c7b12
+            if not requirement_set.has_requirements:
Matej Stuchlik a7c7b12
+                opts = {'name': self.name}
Matej Stuchlik a7c7b12
+                msg = ('You must give at least one requirement '
Matej Stuchlik a7c7b12
+                       'to %(name)s (see "pip help %(name)s")' % opts)
Matej Stuchlik a7c7b12
+                logger.error(msg)
Matej Stuchlik a7c7b12
+                return
Matej Stuchlik a7c7b12
+
Matej Stuchlik a7c7b12
+            try:
Matej Stuchlik a7c7b12
+                #build wheels
Matej Stuchlik a7c7b12
+                wb = WheelBuilder(
Matej Stuchlik a7c7b12
+                    requirement_set,
Matej Stuchlik a7c7b12
+                    finder,
Matej Stuchlik a7c7b12
+                    options.wheel_dir,
Matej Stuchlik a7c7b12
+                    build_options = options.build_options or [],
Matej Stuchlik a7c7b12
+                    global_options = options.global_options or []
Matej Stuchlik a7c7b12
+                    )
Matej Stuchlik a7c7b12
+                wb.build()
Matej Stuchlik a7c7b12
+            except PreviousBuildDirError:
Matej Stuchlik a7c7b12
+                options.no_clean = True
Matej Stuchlik a7c7b12
+                raise
Matej Stuchlik a7c7b12
+            finally:
Matej Stuchlik a7c7b12
+                if not options.no_clean:
Matej Stuchlik a7c7b12
+                    requirement_set.cleanup_files()
Matej Stuchlik a7c7b12
diff --git a/pip/util.py b/pip/util.py
Matej Stuchlik a7c7b12
index f459bb2..f5edeeb 100644
Matej Stuchlik a7c7b12
--- a/pip/util.py
Matej Stuchlik a7c7b12
+++ b/pip/util.py
Matej Stuchlik a7c7b12
@@ -8,6 +8,7 @@ import zipfile
Matej Stuchlik a7c7b12
 import tarfile
Matej Stuchlik a7c7b12
 import subprocess
Matej Stuchlik a7c7b12
 import textwrap
Matej Stuchlik a7c7b12
+import tempfile
Matej Stuchlik a7c7b12
 
Matej Stuchlik a7c7b12
 from pip.exceptions import InstallationError, BadCommand, PipError
Matej Stuchlik a7c7b12
 from pip.backwardcompat import(WindowsError, string_types, raw_input,
Matej Stuchlik a7c7b12
@@ -718,3 +719,35 @@ def is_prerelease(vers):
Matej Stuchlik a7c7b12
 
Matej Stuchlik a7c7b12
     parsed = version._normalized_key(normalized)
Matej Stuchlik a7c7b12
     return any([any([y in set(["a", "b", "c", "rc", "dev"]) for y in x]) for x in parsed])
Matej Stuchlik a7c7b12
+
Matej Stuchlik a7c7b12
+
Matej Stuchlik a7c7b12
+class BuildDirectory(object):
Matej Stuchlik a7c7b12
+
Matej Stuchlik a7c7b12
+    def __init__(self, name=None, delete=None):
Matej Stuchlik a7c7b12
+        # If we were not given an explicit directory, and we were not given an
Matej Stuchlik a7c7b12
+        # explicit delete option, then we'll default to deleting.
Matej Stuchlik a7c7b12
+        if name is None and delete is None:
Matej Stuchlik a7c7b12
+            delete = True
Matej Stuchlik a7c7b12
+
Matej Stuchlik a7c7b12
+        if name is None:
Matej Stuchlik a7c7b12
+            name = tempfile.mkdtemp(prefix="pip-build-")
Matej Stuchlik a7c7b12
+            # If we were not given an explicit directory, and we were not given
Matej Stuchlik a7c7b12
+            # an explicit delete option, then we'll default to deleting.
Matej Stuchlik a7c7b12
+            if delete is None:
Matej Stuchlik a7c7b12
+                delete = True
Matej Stuchlik a7c7b12
+
Matej Stuchlik a7c7b12
+        self.name = name
Matej Stuchlik a7c7b12
+        self.delete = delete
Matej Stuchlik a7c7b12
+
Matej Stuchlik a7c7b12
+    def __repr__(self):
Matej Stuchlik a7c7b12
+        return "<{} {!r}>".format(self.__class__.__name__, self.name)
Matej Stuchlik a7c7b12
+
Matej Stuchlik a7c7b12
+    def __enter__(self):
Matej Stuchlik a7c7b12
+        return self.name
Matej Stuchlik a7c7b12
+
Matej Stuchlik a7c7b12
+    def __exit__(self, exc, value, tb):
Matej Stuchlik a7c7b12
+        self.cleanup()
Matej Stuchlik a7c7b12
+
Matej Stuchlik a7c7b12
+    def cleanup(self):
Matej Stuchlik a7c7b12
+        if self.delete:
Matej Stuchlik a7c7b12
+            rmtree(self.name)