Skip to content

Commit 5e61207

Browse files
committed
cargo: use cargo.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>
1 parent b1da7cc commit 5e61207

File tree

1 file changed

+30
-14
lines changed

1 file changed

+30
-14
lines changed

mesonbuild/cargo/interpreter.py

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,6 @@ def _process_member(member: str) -> None:
371371
ast.append(build.function('subdir', [build.string(member)]))
372372
processed_members[member] = pkg
373373

374-
ast.append(build.assign(build.function('import', [build.string('rust')]), 'rust'))
375374
for member in ws.required_members:
376375
_process_member(member)
377376
ast = self._create_project(name, processed_members.get('.'), build) + ast
@@ -652,7 +651,16 @@ def _create_project(self, name: str, pkg: T.Optional[PackageState], build: build
652651
elif pkg.manifest.package.license_file:
653652
kwargs['license_files'] = build.string(pkg.manifest.package.license_file)
654653

655-
return [build.function('project', args, kwargs)]
654+
# project(...)
655+
# rust = import('rust')
656+
# cargo = rust.workspace(dev_dependencies: False)
657+
return [
658+
build.function('project', args, kwargs),
659+
build.assign(build.function('import', [build.string('rust')]),
660+
'rust'),
661+
build.assign(build.method('workspace', build.identifier('rust'), []),
662+
'cargo')
663+
]
656664

657665
def _create_dependencies(self, pkg: PackageState, build: builder.Builder) -> T.List[mparser.BaseNode]:
658666
cfg = pkg.cfg
@@ -697,12 +705,24 @@ def _create_system_dependency(self, name: str, dep: SystemDependency, build: bui
697705

698706
def _create_dependency(self, pkg: PackageState, dep: Dependency, build: builder.Builder) -> T.List[mparser.BaseNode]:
699707
cfg = pkg.cfg
700-
version_ = dep.meson_version or [pkg.manifest.package.version]
701-
kw = {
702-
'version': build.array([build.string(s) for s in version_]),
703-
}
704-
# Lookup for this dependency with the features we want in default_options kwarg.
705-
#
708+
dep_obj: mparser.BaseNode
709+
if self.cargolock and self.resolve_package(dep.package, dep.api):
710+
dep_obj = build.method(
711+
'dependency',
712+
build.method(
713+
'subproject',
714+
build.identifier('cargo'),
715+
[build.string(dep.package), build.string(dep.api)]))
716+
else:
717+
version_ = dep.meson_version or [pkg.manifest.package.version]
718+
kw = {
719+
'version': build.array([build.string(s) for s in version_]),
720+
}
721+
dep_obj = build.function(
722+
'dependency',
723+
[build.string(_dependency_name(dep.package, dep.api))],
724+
kw)
725+
706726
# However, this subproject could have been previously configured with a
707727
# different set of features. Cargo collects the set of features globally
708728
# but Meson can only use features enabled by the first call that triggered
@@ -713,13 +733,9 @@ def _create_dependency(self, pkg: PackageState, dep: Dependency, build: builder.
713733
# option manually with -Dxxx-rs:feature-yyy=true, or the main project can do
714734
# that in its project(..., default_options: ['xxx-rs:feature-yyy=true']).
715735
return [
716-
# xxx_dep = dependency('xxx', version : ...)
736+
# xxx_dep = cargo.subproject('xxx', 'api').dependency()
717737
build.assign(
718-
build.function(
719-
'dependency',
720-
[build.string(_dependency_name(dep.package, dep.api))],
721-
kw,
722-
),
738+
dep_obj,
723739
_dependency_varname(dep),
724740
),
725741
# actual_features = xxx_dep.get_variable('features', default_value : '').split(',')

0 commit comments

Comments
 (0)