def get_shared_env(cls, key: int) -> str: if key in cls._shared_envs: logger.debug("Reusing shared build env: %s", cls._shared_envs[key]) return cls._shared_envs[key] # We don't save the cache here, instead it will be done after the installation # finished. return create_tracked_tempdir("-shared", "pdm-build-env-")
def prepare_metadata(self) -> Distribution: """Prepare the metadata for the candidate. Will call the prepare_metadata_* hooks behind the scene """ self.obtain(allow_all=True) metadir_parent = create_tracked_tempdir(prefix="pdm-meta-") result: Distribution if self.wheel: self._metadata_dir = _get_wheel_metadata_from_wheel( self.wheel, metadir_parent) result = PathDistribution(Path(self._metadata_dir)) else: source_dir = self.ireq.unpacked_source_directory builder = EditableBuilder if self.req.editable else WheelBuilder try: self._metadata_dir = builder( source_dir, self.environment).prepare_metadata(metadir_parent) except BuildError: termui.logger.warn( "Failed to build package, try parsing project files.") result = parse_metadata_from_source(source_dir) else: result = PathDistribution(Path(self._metadata_dir)) if not self.candidate.name: self.req.name = self.candidate.name = cast(str, result.metadata["Name"]) if not self.candidate.version: self.candidate.version = result.version if not self.candidate.requires_python: self.candidate.requires_python = cast( str, result.metadata.get("Requires-Python", "")) return result
def _get_wheel_dir(self) -> str: assert self.ireq.original_link if self.should_cache(): wheel_cache = self.environment.project.make_wheel_cache() return wheel_cache.get_path_for_link(self.ireq.original_link) else: return create_tracked_tempdir(prefix="pdm-wheel-")
def metadata(self) -> Distribution: """Get the metadata of the candidate. Will call the prepare_metadata_* hooks behind the scene """ self.prepare(True) metadir_parent = create_tracked_tempdir(prefix="pdm-meta-") if self.wheel: self._metadata_dir = _get_wheel_metadata_from_wheel( self.wheel, metadir_parent) result: Distribution = PathDistribution(Path(self._metadata_dir)) else: assert self.source_dir builder = EditableBuilder if self.req.editable else WheelBuilder try: self._metadata_dir = builder( self.source_dir, self.environment).prepare_metadata(metadir_parent) except BuildError: termui.logger.warn( "Failed to build package, try parsing project files.") result = parse_metadata_from_source(self.source_dir) else: result = PathDistribution(Path(self._metadata_dir)) if not self.name: self.name = str(result.metadata["Name"]) # type: ignore self.req.name = self.name if not self.version: self.version = result.version # type: ignore self.requires_python = result.metadata.get("Requires-Python") return result
def _get_source_dir(self) -> str: build_dir = self.packages_path if build_dir: src_dir = build_dir / "src" src_dir.mkdir(exist_ok=True) return src_dir.as_posix() venv = os.environ.get("VIRTUAL_ENV", None) if venv: src_dir = os.path.join(venv, "src") if os.path.exists(src_dir): return src_dir return create_tracked_tempdir("pdm-src")
def _make_building_args(self, ireq: pip_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 = self.project.cache("pkgs") wheel_download_dir = self.project.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 _populate_source_dir(self, ireq: pip_shims.InstallRequirement) -> None: assert self.link if self.link.is_existing_dir(): ireq.source_dir = self.link.file_path elif self.req.editable: if self.environment.packages_path: src_dir = self.environment.packages_path / "src" elif os.getenv("VIRTUAL_ENV"): src_dir = Path(os.environ["VIRTUAL_ENV"]) / "src" else: src_dir = Path("src") if not src_dir.is_dir(): src_dir.mkdir() ireq.ensure_has_source_dir(str(src_dir)) elif not ireq.source_dir: ireq.source_dir = create_tracked_tempdir(prefix="pdm-build-")
def _get_wheel_dir(self) -> str: should_cache = False wheel_cache = self.environment.project.make_wheel_cache() assert self.link if self.link.is_vcs and not self.req.editable: vcs = pip_shims.VcsSupport() vcs_backend = vcs.get_backend_for_scheme(self.link.scheme) if vcs_backend and vcs_backend.is_immutable_rev_checkout( self.link.url, cast(str, self.ireq.source_dir)): should_cache = True elif not self.link.is_existing_dir(): base, _ = self.link.splitext() if _egg_info_re.search(base) is not None: # Determine whether the string looks like an egg_info. should_cache = True if should_cache: return wheel_cache.get_path_for_link(self.link) else: return create_tracked_tempdir(prefix="pdm-wheel-")
def _populate_source_dir(self) -> None: ireq = self.ireq assert ireq.original_link if ireq.original_link.is_existing_dir(): ireq.source_dir = ireq.original_link.file_path elif self.req.editable: if self.environment.packages_path: src_dir = self.environment.packages_path / "src" else: venv_prefix = get_venv_like_prefix( self.environment.interpreter.executable) if venv_prefix is not None: src_dir = venv_prefix / "src" else: src_dir = Path("src") if not src_dir.is_dir(): src_dir.mkdir() ireq.ensure_has_source_dir(str(src_dir)) elif not ireq.source_dir: ireq.source_dir = create_tracked_tempdir(prefix="pdm-build-")
def get_env_path(cls, src_dir: str | Path) -> str: key = os.path.normpath(src_dir).rstrip("\\/") if key not in cls._env_cache: cls._env_cache[key] = create_tracked_tempdir( prefix="pdm-build-env-") return cls._env_cache[key]
def _get_build_dir(self, ireq: pip_shims.InstallRequirement) -> str: if ireq.editable: return ireq.source_dir or self._get_source_dir() else: return create_tracked_tempdir(prefix="pdm-build-")
def get_overlay_env(cls, key: str) -> str: if key not in cls._overlay_envs: cls._overlay_envs[key] = create_tracked_tempdir( "-overlay", "pdm-build-env-") return cls._overlay_envs[key]
def get_shared_env(cls, key: int) -> str: if key in cls._shared_envs: logger.debug("Reusing shared build env: %s", cls._shared_envs[key]) return cls._shared_envs[key] # Postpone the cache after installation is done return create_tracked_tempdir("-shared", "pdm-build-env-")
def _get_build_dir(self, ireq: pip_shims.InstallRequirement) -> str: if ireq.editable or ireq.link and ireq.link.is_existing_dir(): return self._get_source_dir(ireq) else: return create_tracked_tempdir(prefix="pdm-build-")