summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2025-10-28 13:43:53 +0100
committerPaolo Bonzini <pbonzini@redhat.com>2025-12-22 12:01:05 +0100
commit013121d3dda42b2bf70cb53675e3f3fe432b1d97 (patch)
tree7e36bf6874ec904a0fef7dfdf72ef54d693720d2
parent65e885e1adf0d6735eae9f554ec8f9e94463a950 (diff)
downloadmeson-013121d3dda42b2bf70cb53675e3f3fe432b1d97.tar.gz
modules: rust: add dependencies() method to package object
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
-rw-r--r--docs/markdown/Rust-module.md28
-rw-r--r--mesonbuild/modules/rust.py54
-rw-r--r--test cases/rust/31 rust.workspace package/meson.build2
-rw-r--r--test cases/rust/32 rust.workspace workspace/meson.build2
-rw-r--r--test cases/rust/32 rust.workspace workspace/more/meson.build1
5 files changed, 76 insertions, 11 deletions
diff --git a/docs/markdown/Rust-module.md b/docs/markdown/Rust-module.md
index 37ba59d8e..1acb9324b 100644
--- a/docs/markdown/Rust-module.md
+++ b/docs/markdown/Rust-module.md
@@ -269,6 +269,19 @@ Arguments:
- `package_name`: (str, optional) Name of the package; not needed for the
root package of a workspace
+Example usage:
+```meson
+rustmod = import('rust')
+cargo_ws = rustmod.workspace()
+pkg = cargo_ws.package()
+
+executable('my_app', 'src/main.rs',
+ dependencies: pkg.dependencies(),
+ rust_args: pkg.rust_args(),
+ rust_dependency_map: pkg.rust_dependency_map(),
+)
+```
+
### workspace.subproject()
```meson
@@ -353,6 +366,21 @@ dep_map = pkg.rust_dependency_map()
Returns rust dependency mapping for this package.
+#### package.dependencies()
+
+```meson
+deps = pkg.dependencies(...)
+```
+
+Returns a list of dependency objects for all the dependencies required by this
+Rust package, including both Rust crate dependencies and system dependencies.
+The returned dependencies can be used directly in build target declarations.
+
+Keyword arguments:
+- `dependencies`: (`bool`, default: true) Whether to include regular Rust crate dependencies
+- `dev_dependencies`: (`bool`, default: false) Whether to include development dependencies (not yet implemented)
+- `system_dependencies`: (`bool`, default: true) Whether to include system dependencies
+
### Subprojects only
#### subproject.dependency()
diff --git a/mesonbuild/modules/rust.py b/mesonbuild/modules/rust.py
index 5ba2a5f17..c1fcf049d 100644
--- a/mesonbuild/modules/rust.py
+++ b/mesonbuild/modules/rust.py
@@ -91,6 +91,16 @@ def no_spaces_validator(arg: T.Optional[T.Union[str, T.List]]) -> T.Optional[str
return 'must not contain spaces due to limitations of rustdoc'
return None
+def dep_to_system_dependency(dep: Dependency, depname: str) -> Dependency:
+ if not dep.found():
+ return dep
+ if not depname:
+ if not dep.name:
+ raise MesonException("rust.to_system_dependency() called with an unnamed dependency and no explicit name")
+ depname = dep.name
+ depname = re.sub(r'[^a-zA-Z0-9]', '_', depname)
+ rust_args = ['--cfg', f'system_deps_have_{depname}']
+ return RustSystemDependency(dep.version, compile_args=rust_args, ext_deps=[dep], name=dep.name)
class RustWorkspace(ModuleObject):
"""Represents a Rust workspace, controlling the build of packages
@@ -218,6 +228,40 @@ class RustPackage(RustCrate):
def __init__(self, rust_ws: RustWorkspace, package: cargo.PackageState) -> None:
super().__init__(rust_ws, package)
+ self.methods.update({
+ 'dependencies': self.dependencies_method,
+ })
+
+ @noPosargs
+ @typed_kwargs('package.dependencies',
+ KwargInfo('dependencies', bool, default=True),
+ KwargInfo('dev_dependencies', bool, default=False),
+ KwargInfo('system_dependencies', bool, default=True))
+ def dependencies_method(self, state: ModuleState, args: T.List, kwargs: T.Dict[str, T.Any]) -> T.List[Dependency]:
+ """Returns the dependencies for this package."""
+ dependencies: T.List[Dependency] = []
+ cfg = self.package.cfg
+
+ if kwargs['dependencies']:
+ for dep_key, dep_pkg in cfg.dep_packages.items():
+ if dep_pkg.manifest.lib:
+ # Get the dependency name for this package
+ depname = dep_pkg.get_dependency_name(None)
+ dependency = state.overridden_dependency(depname)
+ dependencies.append(dependency)
+
+ if kwargs['dev_dependencies']:
+ raise MesonException('dev_dependencies is not implemented yet')
+
+ if kwargs['system_dependencies']:
+ for name, sys_dep in self.package.manifest.system_dependencies.items():
+ if sys_dep.enabled(cfg.features):
+ # System dependencies use the original dependency name from Cargo.toml
+ dependency = state.dependency(sys_dep.name, required=not sys_dep.optional,
+ wanted=sys_dep.meson_version)
+ dependencies.append(dep_to_system_dependency(dependency, name))
+
+ return dependencies
class RustSubproject(RustCrate):
@@ -664,15 +708,7 @@ class RustModule(ExtensionModule):
@noKwargs
def to_system_dependency(self, state: ModuleState, args: T.Tuple[Dependency, T.Optional[str]], kwargs: TYPE_kwargs) -> Dependency:
dep, depname = args
- if not dep.found():
- return dep
- if not depname:
- if not dep.name:
- raise MesonException("rust.to_system_dependency() called with an unnamed dependency and no explicit name")
- depname = dep.name
- depname = re.sub(r'[^a-zA-Z0-9]', '_', depname)
- rust_args = ['--cfg', f'system_deps_have_{depname}']
- return RustSystemDependency(dep.version, compile_args=rust_args, ext_deps=[dep], name=dep.name)
+ return dep_to_system_dependency(dep, depname)
@FeatureNew('rust.workspace', '1.11.0')
@noPosargs
diff --git a/test cases/rust/31 rust.workspace package/meson.build b/test cases/rust/31 rust.workspace package/meson.build
index 5a9b44e41..ec17a00f5 100644
--- a/test cases/rust/31 rust.workspace package/meson.build
+++ b/test cases/rust/31 rust.workspace package/meson.build
@@ -28,7 +28,7 @@ assert(answer_rs.all_features() == ['default', 'large'])
assert(answer_rs.features() == ['default', 'large'])
e = executable('package-test', 'src/main.rs',
- dependencies: [hello_rs.dependency(), answer_rs.dependency()],
+ dependencies: main_pkg.dependencies(),
rust_args: main_pkg.rust_args(),
rust_dependency_map: main_pkg.rust_dependency_map(),
)
diff --git a/test cases/rust/32 rust.workspace workspace/meson.build b/test cases/rust/32 rust.workspace workspace/meson.build
index f42630b3d..63df7b1c4 100644
--- a/test cases/rust/32 rust.workspace workspace/meson.build
+++ b/test cases/rust/32 rust.workspace workspace/meson.build
@@ -30,7 +30,7 @@ assert(answer_rs.features() == ['default', 'large'])
subdir('more')
e = executable('workspace-test', 'src/main.rs',
- dependencies: [hello_rs.dependency(), answer_rs.dependency(), more_dep],
+ dependencies: main_pkg.dependencies(),
rust_args: main_pkg.rust_args(),
rust_dependency_map: main_pkg.rust_dependency_map(),
)
diff --git a/test cases/rust/32 rust.workspace workspace/more/meson.build b/test cases/rust/32 rust.workspace workspace/more/meson.build
index d7317a268..37ae51604 100644
--- a/test cases/rust/32 rust.workspace workspace/more/meson.build
+++ b/test cases/rust/32 rust.workspace workspace/more/meson.build
@@ -9,3 +9,4 @@ l = static_library('more', 'src/lib.rs',
rust_dependency_map: more_pkg.rust_dependency_map(),
)
more_dep = declare_dependency(link_with: l)
+meson.override_dependency('more-0.1-rs', more_dep)