diff options
| author | Xavier Claessens <xclaessens@netflix.com> | 2025-10-19 12:35:24 -0400 |
|---|---|---|
| committer | Xavier Claessens <xclaesse@gmail.com> | 2025-10-20 17:50:31 -0400 |
| commit | 8c7f8d9dc2887b165d469a2362935f27aae44ac1 (patch) | |
| tree | 92d26e280aada7874b32120037bf2a6ad3ab46ab | |
| parent | 27ff5a53ffa074f77f979bb51b7cb6f62413b66e (diff) | |
| download | meson-8c7f8d9dc2887b165d469a2362935f27aae44ac1.tar.gz | |
cargo: Do not look pkg in subprojects when we have its manifest
It was wasteful, but also failed when the .wrap file miss that
dependency from [provide] section and no Cargo.lock file provide it
either.
| -rw-r--r-- | mesonbuild/cargo/interpreter.py | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/mesonbuild/cargo/interpreter.py b/mesonbuild/cargo/interpreter.py index ba08e6d7c..52c4816f8 100644 --- a/mesonbuild/cargo/interpreter.py +++ b/mesonbuild/cargo/interpreter.py @@ -117,7 +117,7 @@ class Interpreter: member = ws.packages_to_member[manifest.package.name] pkg = ws.packages[member] else: - pkg, cached = self._fetch_package(manifest.package.name, manifest.package.api) + pkg, cached = self._fetch_package_from_manifest(manifest) if not cached: # This is an entry point, always enable the 'default' feature. # FIXME: We should have a Meson option similar to `cargo build --no-default-features` @@ -223,15 +223,15 @@ class Interpreter: ws.required_members.append(member) return pkg - def _fetch_package(self, package_name: str, api: str) -> T.Tuple[PackageState, bool]: + def _fetch_package(self, package_name: str, api: str) -> PackageState: key = PackageKey(package_name, api) pkg = self.packages.get(key) if pkg: - return pkg, True + return pkg meson_depname = _dependency_name(package_name, api) return self._fetch_package_from_subproject(package_name, meson_depname) - def _fetch_package_from_subproject(self, package_name: str, meson_depname: str) -> T.Tuple[PackageState, bool]: + def _fetch_package_from_subproject(self, package_name: str, meson_depname: str) -> PackageState: subp_name, _ = self.environment.wrap_resolver.find_dep_provider(meson_depname) if subp_name is None: # If Cargo.lock has a different version, this could be a resolution @@ -251,17 +251,28 @@ class Interpreter: downloaded = \ subp_name in self.environment.wrap_resolver.wraps and \ self.environment.wrap_resolver.wraps[subp_name].type is not None + if isinstance(manifest, Workspace): ws = self._get_workspace(manifest, subdir) member = ws.packages_to_member[package_name] pkg = self._require_workspace_member(ws, member) - return pkg, False + return pkg + key = PackageKey(package_name, version.api(manifest.package.version)) + pkg = self.packages.get(key) + if pkg: + return pkg + pkg = PackageState(manifest, downloaded) + self.packages[key] = pkg + self._prepare_package(pkg) + return pkg + def _fetch_package_from_manifest(self, manifest: Manifest) -> T.Tuple[PackageState, bool]: + key = PackageKey(manifest.package.name, version.api(manifest.package.version)) pkg = self.packages.get(key) if pkg: return pkg, True - pkg = PackageState(manifest, downloaded) + pkg = PackageState(manifest, downloaded=False) self.packages[key] = pkg self._prepare_package(pkg) return pkg, False @@ -287,7 +298,7 @@ class Interpreter: dep_pkg = self._require_workspace_member(ws, dep_member) elif dep.git: _, _, directory = _parse_git_url(dep.git, dep.branch) - dep_pkg, _ = self._fetch_package_from_subproject(dep.package, directory) + dep_pkg = self._fetch_package_from_subproject(dep.package, directory) else: # From all available versions from Cargo.lock, pick the most recent # satisfying the constraints @@ -302,7 +313,7 @@ class Interpreter: else: if not dep.meson_version: raise MesonException(f'Cannot determine version of cargo package {dep.package}') - dep_pkg, _ = self._fetch_package(dep.package, dep.api) + dep_pkg = self._fetch_package(dep.package, dep.api) return dep_pkg def _load_manifest(self, subdir: str, workspace: T.Optional[Workspace] = None, member_path: str = '') -> T.Union[Manifest, Workspace]: |
