diff options
| author | Paolo Bonzini <pbonzini@redhat.com> | 2025-10-28 18:09:44 +0100 |
|---|---|---|
| committer | Paolo Bonzini <pbonzini@redhat.com> | 2025-12-22 11:58:30 +0100 |
| commit | db0165e3ad2f5589ee62a22ca77e79adfb714879 (patch) | |
| tree | 50046cbd769282a77fdb1994909aa60d08798ed7 | |
| parent | 2caadfbe5e392714f7b75f9d66874bf7bd231a53 (diff) | |
| download | meson-db0165e3ad2f5589ee62a22ca77e79adfb714879.tar.gz | |
cargo: use cargo_ws.subproject().dependency()
This is up to 2x faster because it avoids checks for pkg-config and cmake.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
| -rw-r--r-- | mesonbuild/cargo/interpreter.py | 44 |
1 files changed, 30 insertions, 14 deletions
diff --git a/mesonbuild/cargo/interpreter.py b/mesonbuild/cargo/interpreter.py index b29548080..30639f526 100644 --- a/mesonbuild/cargo/interpreter.py +++ b/mesonbuild/cargo/interpreter.py @@ -378,7 +378,6 @@ class Interpreter: ast.append(build.function('subdir', [build.string(member)])) processed_members[member] = pkg - ast.append(build.assign(build.function('import', [build.string('rust')]), 'rust')) for member in ws.required_members: _process_member(member) ast = self._create_project(name, processed_members.get('.'), build) + ast @@ -673,7 +672,16 @@ class Interpreter: elif pkg.manifest.package.license_file: kwargs['license_files'] = build.string(pkg.manifest.package.license_file) - return [build.function('project', args, kwargs)] + # project(...) + # rust = import('rust') + # cargo_ws = rust.workspace(dev_dependencies: False) + return [ + build.function('project', args, kwargs), + build.assign(build.function('import', [build.string('rust')]), + 'rust'), + build.assign(build.method('workspace', build.identifier('rust'), []), + 'cargo_ws') + ] def _create_dependencies(self, pkg: PackageState, build: builder.Builder) -> T.List[mparser.BaseNode]: cfg = pkg.cfg @@ -718,12 +726,24 @@ class Interpreter: def _create_dependency(self, pkg: PackageState, dep: Dependency, build: builder.Builder) -> T.List[mparser.BaseNode]: cfg = pkg.cfg - version_ = dep.meson_version or [pkg.manifest.package.version] - kw = { - 'version': build.array([build.string(s) for s in version_]), - } - # Lookup for this dependency with the features we want in default_options kwarg. - # + dep_obj: mparser.BaseNode + if self.cargolock and self.resolve_package(dep.package, dep.api): + dep_obj = build.method( + 'dependency', + build.method( + 'subproject', + build.identifier('cargo_ws'), + [build.string(dep.package), build.string(dep.api)])) + else: + version_ = dep.meson_version or [pkg.manifest.package.version] + kw = { + 'version': build.array([build.string(s) for s in version_]), + } + dep_obj = build.function( + 'dependency', + [build.string(_dependency_name(dep.package, dep.api))], + kw) + # However, this subproject could have been previously configured with a # different set of features. Cargo collects the set of features globally # but Meson can only use features enabled by the first call that triggered @@ -734,13 +754,9 @@ class Interpreter: # option manually with -Dxxx-rs:feature-yyy=true, or the main project can do # that in its project(..., default_options: ['xxx-rs:feature-yyy=true']). return [ - # xxx_dep = dependency('xxx', version : ...) + # xxx_dep = cargo_ws.subproject('xxx', 'api').dependency() build.assign( - build.function( - 'dependency', - [build.string(_dependency_name(dep.package, dep.api))], - kw, - ), + dep_obj, _dependency_varname(dep), ), # actual_features = xxx_dep.get_variable('features', default_value : '').split(',') |
