diff options
| author | Paolo Bonzini <pbonzini@redhat.com> | 2025-10-28 13:43:53 +0100 |
|---|---|---|
| committer | Paolo Bonzini <pbonzini@redhat.com> | 2025-12-22 12:01:05 +0100 |
| commit | 013121d3dda42b2bf70cb53675e3f3fe432b1d97 (patch) | |
| tree | 7e36bf6874ec904a0fef7dfdf72ef54d693720d2 | |
| parent | 65e885e1adf0d6735eae9f554ec8f9e94463a950 (diff) | |
| download | meson-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.md | 28 | ||||
| -rw-r--r-- | mesonbuild/modules/rust.py | 54 | ||||
| -rw-r--r-- | test cases/rust/31 rust.workspace package/meson.build | 2 | ||||
| -rw-r--r-- | test cases/rust/32 rust.workspace workspace/meson.build | 2 | ||||
| -rw-r--r-- | test cases/rust/32 rust.workspace workspace/more/meson.build | 1 |
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) |
