summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2025-08-13 14:31:12 +0200
committerDylan Baker <dylan@pnwbakers.com>2025-10-14 09:35:56 -0700
commit39ebb8598206d92b1f1f49b7589b7e299175683c (patch)
tree9c9049f24c06c476f2fc647235536571d5ac23c4
parent20735c3018f5d4d708a21d47c82b34a592c1a225 (diff)
downloadmeson-39ebb8598206d92b1f1f49b7589b7e299175683c.tar.gz
cargo: pick version from Cargo.toml if not specified in a dependency
Extracted from a patch by Xavier Claessens <xclaessens@netflix.com>
-rw-r--r--mesonbuild/cargo/interpreter.py24
1 files changed, 13 insertions, 11 deletions
diff --git a/mesonbuild/cargo/interpreter.py b/mesonbuild/cargo/interpreter.py
index 85e3e46d9..12b9cc283 100644
--- a/mesonbuild/cargo/interpreter.py
+++ b/mesonbuild/cargo/interpreter.py
@@ -160,7 +160,7 @@ class Interpreter:
self._add_dependency(pkg, depname)
return pkg, False
- def _dep_package(self, dep: Dependency) -> PackageState:
+ def _dep_package(self, pkg: PackageState, dep: Dependency) -> PackageState:
if dep.git:
_, _, directory = _parse_git_url(dep.git, dep.branch)
dep_pkg, _ = self._fetch_package_from_subproject(dep.package, directory)
@@ -203,7 +203,7 @@ class Interpreter:
# It could be build/dev/target dependency. Just ignore it.
return
pkg.required_deps.add(depname)
- dep_pkg = self._dep_package(dep)
+ dep_pkg = self._dep_package(pkg, dep)
if dep.default_features:
self._enable_feature(dep_pkg, 'default')
for f in dep.features:
@@ -227,7 +227,7 @@ class Interpreter:
depname = depname[:-1]
if depname in pkg.required_deps:
dep = pkg.manifest.dependencies[depname]
- dep_pkg = self._dep_package(dep)
+ dep_pkg = self._dep_package(pkg, dep)
self._enable_feature(dep_pkg, dep_f)
else:
# This feature will be enabled only if that dependency
@@ -237,7 +237,7 @@ class Interpreter:
self._add_dependency(pkg, depname)
dep = pkg.manifest.dependencies.get(depname)
if dep:
- dep_pkg = self._dep_package(dep)
+ dep_pkg = self._dep_package(pkg, dep)
self._enable_feature(dep_pkg, dep_f)
elif f.startswith('dep:'):
self._add_dependency(pkg, f[4:])
@@ -302,7 +302,8 @@ class Interpreter:
ast: T.List[mparser.BaseNode] = []
for depname in pkg.required_deps:
dep = pkg.manifest.dependencies[depname]
- ast += self._create_dependency(dep, build)
+ dep_pkg = self._dep_package(pkg, dep)
+ ast += self._create_dependency(dep_pkg, dep, build)
ast.append(build.assign(build.array([]), 'system_deps_args'))
for name, sys_dep in pkg.manifest.system_dependencies.items():
if sys_dep.enabled(pkg.features):
@@ -336,10 +337,11 @@ class Interpreter:
),
]
- def _create_dependency(self, dep: Dependency, build: builder.Builder) -> T.List[mparser.BaseNode]:
- pkg = self._dep_package(dep)
+ def _create_dependency(self, pkg: PackageState, dep: Dependency, build: builder.Builder) -> T.List[mparser.BaseNode]:
+ version_ = dep.meson_version or [pkg.manifest.package.version]
+ api = dep.api or pkg.manifest.package.api
kw = {
- 'version': build.array([build.string(s) for s in dep.meson_version]),
+ 'version': build.array([build.string(s) for s in version_]),
}
# Lookup for this dependency with the features we want in default_options kwarg.
#
@@ -357,7 +359,7 @@ class Interpreter:
build.assign(
build.function(
'dependency',
- [build.string(_dependency_name(dep.package, dep.api))],
+ [build.string(_dependency_name(dep.package, api))],
kw,
),
_dependency_varname(dep.package),
@@ -387,7 +389,7 @@ class Interpreter:
build.if_(build.not_in(build.identifier('f'), build.identifier('actual_features')), build.block([
build.function('error', [
build.string('Dependency'),
- build.string(_dependency_name(dep.package, dep.api)),
+ build.string(_dependency_name(dep.package, api)),
build.string('previously configured with features'),
build.identifier('actual_features'),
build.string('but need'),
@@ -422,7 +424,7 @@ class Interpreter:
dep = pkg.manifest.dependencies[name]
dependencies.append(build.identifier(_dependency_varname(dep.package)))
if name != dep.package:
- dep_pkg = self._dep_package(dep)
+ dep_pkg = self._dep_package(pkg, dep)
dep_lib_name = dep_pkg.manifest.lib.name
dependency_map[build.string(fixup_meson_varname(dep_lib_name))] = build.string(name)
for name, sys_dep in pkg.manifest.system_dependencies.items():