Exemplo n.º 1
0
 def remove_temporary_source(self):
     # type: () -> None
     """Remove the source files from this requirement, if they are marked
     for deletion"""
     if self.source_dir and has_delete_marker_file(self.source_dir):
         logger.debug('Removing source in %s', self.source_dir)
         rmtree(self.source_dir)
     self.source_dir = None
     self._temp_build_dir = None
Exemplo n.º 2
0
    def build(
        self,
        requirements,  # type: Iterable[InstallRequirement]
        should_unpack=False  # type: bool
    ):
        # type: (...) -> List[InstallRequirement]
        """Build wheels.

        :param should_unpack: If True, after building the wheel, unpack it
            and replace the sdist with the unpacked version in preparation
            for installation.
        :return: True if all the wheels built correctly.
        """
        # pip install uses should_unpack=True.
        # pip install never provides a _wheel_dir.
        # pip wheel uses should_unpack=False.
        # pip wheel always provides a _wheel_dir (via the preparer).
        assert (
            (should_unpack and not self._wheel_dir) or
            (not should_unpack and self._wheel_dir)
        )

        buildset = []
        cache_available = bool(self.wheel_cache.cache_dir)

        for req in requirements:
            ephem_cache = should_use_ephemeral_cache(
                req,
                should_unpack=should_unpack,
                cache_available=cache_available,
                check_binary_allowed=self.check_binary_allowed,
            )
            if ephem_cache is None:
                continue

            # Determine where the wheel should go.
            if should_unpack:
                if ephem_cache:
                    output_dir = self.wheel_cache.get_ephem_path_for_link(
                        req.link
                    )
                else:
                    output_dir = self.wheel_cache.get_path_for_link(req.link)
            else:
                output_dir = self._wheel_dir

            buildset.append((req, output_dir))

        if not buildset:
            return []

        # TODO by @pradyunsg
        # Should break up this method into 2 separate methods.

        # Build the wheels.
        logger.info(
            'Building wheels for collected packages: %s',
            ', '.join([req.name for (req, _) in buildset]),
        )

        python_tag = None
        if should_unpack:
            python_tag = pep425tags.implementation_tag

        with indent_log():
            build_success, build_failure = [], []
            for req, output_dir in buildset:
                try:
                    ensure_dir(output_dir)
                except OSError as e:
                    logger.warning(
                        "Building wheel for %s failed: %s",
                        req.name, e,
                    )
                    build_failure.append(req)
                    continue

                wheel_file = self._build_one(
                    req, output_dir,
                    python_tag=python_tag,
                )
                if wheel_file:
                    build_success.append(req)
                    self.wheel_filenames.append(
                        os.path.relpath(wheel_file, output_dir)
                    )
                    if should_unpack:
                        # XXX: This is mildly duplicative with prepare_files,
                        # but not close enough to pull out to a single common
                        # method.
                        # The code below assumes temporary source dirs -
                        # prevent it doing bad things.
                        if (
                            req.source_dir and
                            not has_delete_marker_file(req.source_dir)
                        ):
                            raise AssertionError(
                                "bad source dir - missing marker")
                        # Delete the source we built the wheel from
                        req.remove_temporary_source()
                        # set the build directory again - name is known from
                        # the work prepare_files did.
                        req.source_dir = req.ensure_build_location(
                            self.preparer.build_dir
                        )
                        # Update the link for this.
                        req.link = Link(path_to_url(wheel_file))
                        assert req.link.is_wheel
                        # extract the wheel into the dir
                        unpack_file(req.link.file_path, req.source_dir)
                else:
                    build_failure.append(req)

        # notify success/failure
        if build_success:
            logger.info(
                'Successfully built %s',
                ' '.join([req.name for req in build_success]),
            )
        if build_failure:
            logger.info(
                'Failed to build %s',
                ' '.join([req.name for req in build_failure]),
            )
        # Return a list of requirements that failed to build
        return build_failure
Exemplo n.º 3
0
    def build(
            self,
            requirements,  # type: Iterable[InstallRequirement]
            should_unpack,  # type: bool
    ):
        # type: (...) -> List[InstallRequirement]
        """Build wheels.

        :param should_unpack: If True, after building the wheel, unpack it
            and replace the sdist with the unpacked version in preparation
            for installation.
        :return: The list of InstallRequirement that failed to build.
        """
        # pip install uses should_unpack=True.
        # pip install never provides a _wheel_dir.
        # pip wheel uses should_unpack=False.
        # pip wheel always provides a _wheel_dir (via the preparer).
        assert ((should_unpack and not self._wheel_dir)
                or (not should_unpack and self._wheel_dir))

        buildset = _collect_buildset(
            requirements,
            wheel_cache=self.wheel_cache,
            check_binary_allowed=self.check_binary_allowed,
            need_wheel=not should_unpack,
        )
        if not buildset:
            return []

        # TODO by @pradyunsg
        # Should break up this method into 2 separate methods.

        # Build the wheels.
        logger.info(
            'Building wheels for collected packages: %s',
            ', '.join([req.name for (req, _) in buildset]),
        )

        with indent_log():
            build_success, build_failure = [], []
            for req, cache_dir in buildset:
                wheel_file = self._build_one(req, cache_dir)
                if wheel_file:
                    if should_unpack:
                        # XXX: This is mildly duplicative with prepare_files,
                        # but not close enough to pull out to a single common
                        # method.
                        # The code below assumes temporary source dirs -
                        # prevent it doing bad things.
                        if (req.source_dir and
                                not has_delete_marker_file(req.source_dir)):
                            raise AssertionError(
                                "bad source dir - missing marker")
                        # Delete the source we built the wheel from
                        req.remove_temporary_source()
                        # set the build directory again - name is known from
                        # the work prepare_files did.
                        req.source_dir = req.ensure_build_location(
                            self.preparer.build_dir)
                        # Update the link for this.
                        req.link = Link(path_to_url(wheel_file))
                        req.local_file_path = req.link.file_path
                        assert req.link.is_wheel
                        # extract the wheel into the dir
                        unpack_file(req.link.file_path, req.source_dir)
                    else:
                        # copy from cache to target directory
                        try:
                            ensure_dir(self._wheel_dir)
                            shutil.copy(wheel_file, self._wheel_dir)
                        except OSError as e:
                            logger.warning(
                                "Building wheel for %s failed: %s",
                                req.name,
                                e,
                            )
                            build_failure.append(req)
                            continue
                    build_success.append(req)
                else:
                    build_failure.append(req)

        # notify success/failure
        if build_success:
            logger.info(
                'Successfully built %s',
                ' '.join([req.name for req in build_success]),
            )
        if build_failure:
            logger.info(
                'Failed to build %s',
                ' '.join([req.name for req in build_failure]),
            )
        # Return a list of requirements that failed to build
        return build_failure
Exemplo n.º 4
0
    def build(
            self,
            requirements,  # type: Iterable[InstallRequirement]
            should_unpack,  # type: bool
            wheel_cache,  # type: WheelCache
            build_options,  # type: List[str]
            global_options,  # type: List[str]
            check_binary_allowed=None,  # type: Optional[BinaryAllowedPredicate]
    ):
        # type: (...) -> BuildResult
        """Build wheels.

        :param should_unpack: If True, after building the wheel, unpack it
            and replace the sdist with the unpacked version in preparation
            for installation.
        :return: The list of InstallRequirement that succeeded to build and
            the list of InstallRequirement that failed to build.
        """
        if check_binary_allowed is None:
            # Binaries allowed by default.
            check_binary_allowed = _always_true

        buildset = _collect_buildset(
            requirements,
            wheel_cache=wheel_cache,
            check_binary_allowed=check_binary_allowed,
            need_wheel=not should_unpack,
        )
        if not buildset:
            return [], []

        # TODO by @pradyunsg
        # Should break up this method into 2 separate methods.

        # Build the wheels.
        logger.info(
            'Building wheels for collected packages: %s',
            ', '.join([req.name for (req, _) in buildset]),
        )

        with indent_log():
            build_successes, build_failures = [], []
            for req, cache_dir in buildset:
                wheel_file = _build_one(req, cache_dir, build_options,
                                        global_options)
                if wheel_file:
                    # Update the link for this.
                    req.link = Link(path_to_url(wheel_file))
                    req.local_file_path = req.link.file_path
                    assert req.link.is_wheel
                    if should_unpack:
                        # XXX: This is mildly duplicative with prepare_files,
                        # but not close enough to pull out to a single common
                        # method.
                        # The code below assumes temporary source dirs -
                        # prevent it doing bad things.
                        if (req.source_dir and
                                not has_delete_marker_file(req.source_dir)):
                            raise AssertionError(
                                "bad source dir - missing marker")
                        # Delete the source we built the wheel from
                        req.remove_temporary_source()
                        # set the build directory again - name is known from
                        # the work prepare_files did.
                        req.source_dir = req.ensure_build_location(
                            self.preparer.build_dir)
                        # extract the wheel into the dir
                        unpack_file(req.link.file_path, req.source_dir)
                    build_successes.append(req)
                else:
                    build_failures.append(req)

        # notify success/failure
        if build_successes:
            logger.info(
                'Successfully built %s',
                ' '.join([req.name for req in build_successes]),
            )
        if build_failures:
            logger.info(
                'Failed to build %s',
                ' '.join([req.name for req in build_failures]),
            )
        # Return a list of requirements that failed to build
        return build_successes, build_failures