def _make_building_args(self, ireq: shims.InstallRequirement) -> Dict[str, Any]: src_dir = ireq.source_dir or self._get_source_dir() if ireq.editable: build_dir = src_dir else: build_dir = create_tracked_tempdir(prefix="pdm-build") download_dir = context.cache("pkgs") wheel_download_dir = context.cache("wheels") return { "build_dir": build_dir, "src_dir": src_dir, "download_dir": download_dir.as_posix(), "wheel_download_dir": wheel_download_dir.as_posix(), }
def build(self, ireq: shims.InstallRequirement, hashes: Optional[Dict[str, str]] = None) -> str: """Build egg_info directory for editable candidates and a wheel for others. :param ireq: the InstallRequirment of the candidate. :param hashes: a dictionary of filename: hash_value to check against downloaded artifacts. :returns: The full path of the built artifact. """ from pip._internal.utils.temp_dir import global_tempdir_manager from pdm.builders import EditableBuilder from pdm.builders import WheelBuilder kwargs = self._make_building_args(ireq) with self.get_finder() as finder: with allow_all_wheels(): # temporarily allow all wheels to get a link. ireq.populate_link(finder, False, bool(hashes)) if not ireq.editable and not ireq.req.name: ireq.source_dir = kwargs["build_dir"] else: ireq.ensure_has_source_dir(kwargs["build_dir"]) download_dir = kwargs["download_dir"] only_download = False if ireq.link.is_wheel: download_dir = kwargs["wheel_download_dir"] only_download = True if hashes: ireq.options["hashes"] = convert_hashes(hashes) if not (ireq.editable and ireq.req.is_local_dir): with global_tempdir_manager(): downloaded = shims.shim_unpack( link=ireq.link, download_dir=download_dir, location=ireq.source_dir, hashes=ireq.hashes(False), only_download=only_download, session=finder.session, ) # Preserve the downloaded file so that it won't be cleared. if downloaded and only_download: try: shutil.copy(downloaded, download_dir) except shutil.SameFileError: pass # Now all source is prepared, build it. if ireq.link.is_wheel: return (context.cache("wheels") / ireq.link.filename).as_posix() builder_class = EditableBuilder if ireq.editable else WheelBuilder kwargs["finder"] = finder with builder_class(ireq) as builder: return builder.build(**kwargs)