Skip to content

Commit 0976559

Browse files
committed
cargo: store machine-specific configuration
Make the PackageConfiguration a PerMachine object. This makes it possible to do dependency resolution separately for build- and/or host-side libraries. For now, all users only fill in or consume the host side, but that will change.
1 parent 4e55f30 commit 0976559

File tree

1 file changed

+20
-12
lines changed

1 file changed

+20
-12
lines changed

mesonbuild/cargo/interpreter.py

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
from .cfg import eval_cfg
2323
from .toml import load_toml
2424
from .manifest import Manifest, CargoLock, Workspace, fixup_meson_varname
25-
from ..mesonlib import MesonException, MachineChoice, version_compare_many
25+
from ..mesonlib import MesonException, MachineChoice, PerMachine, version_compare_many
2626
from .. import coredata, mlog
2727
from ..wrap.wrap import PackageDefinition
2828

@@ -66,8 +66,16 @@ class PackageState:
6666
# If this package is member of a workspace.
6767
ws_subdir: T.Optional[str] = None
6868
ws_member: T.Optional[str] = None
69-
# Package configuration state
70-
cfg: T.Optional[PackageConfiguration] = None
69+
# Per-machine configuration state
70+
cfg: PerMachine[T.Optional[PackageConfiguration]] = dataclasses.field(
71+
default_factory=lambda: PerMachine(None, None)
72+
)
73+
74+
def get_or_create_cfg(self, machine: MachineChoice) -> PackageConfiguration:
75+
"""Get configuration for machine, creating if necessary."""
76+
if self.cfg[machine] is None:
77+
self.cfg[machine] = PackageConfiguration()
78+
return self.cfg[machine]
7179

7280

7381
@dataclasses.dataclass(frozen=True)
@@ -140,7 +148,7 @@ def interpret_package(self, manifest: Manifest, build: builder.Builder, subdir:
140148
return build.block(ast)
141149

142150
def _create_package(self, pkg: PackageState, build: builder.Builder, subdir: str) -> T.List[mparser.BaseNode]:
143-
cfg = pkg.cfg
151+
cfg = pkg.cfg[MachineChoice.HOST]
144152
ast = []
145153

146154
ast.extend([
@@ -194,7 +202,7 @@ def _process_member(member: str) -> None:
194202
if member in processed_members:
195203
return
196204
pkg = ws.packages[member]
197-
cfg = pkg.cfg
205+
cfg = pkg.cfg[MachineChoice.HOST]
198206
for depname in cfg.required_deps:
199207
dep = pkg.manifest.dependencies[depname]
200208
if dep.path:
@@ -280,10 +288,10 @@ def _fetch_package_from_subproject(self, package_name: str, meson_depname: str)
280288
return pkg, False
281289

282290
def _prepare_package(self, pkg: PackageState) -> None:
283-
if pkg.cfg:
291+
if pkg.cfg[MachineChoice.HOST]:
284292
return
285293

286-
pkg.cfg = PackageConfiguration()
294+
_ = pkg.get_or_create_cfg(MachineChoice.HOST)
287295
# Merge target specific dependencies that are enabled
288296
cfgs = self._get_cfgs(MachineChoice.HOST)
289297
for condition, dependencies in pkg.manifest.target.items():
@@ -348,7 +356,7 @@ def _load_manifest(self, subdir: str, workspace: T.Optional[Workspace] = None, m
348356
return manifest_
349357

350358
def _add_dependency(self, pkg: PackageState, depname: str) -> None:
351-
cfg = pkg.cfg
359+
cfg = pkg.cfg[MachineChoice.HOST]
352360
if depname in cfg.required_deps:
353361
return
354362
dep = pkg.manifest.dependencies.get(depname)
@@ -366,7 +374,7 @@ def _add_dependency(self, pkg: PackageState, depname: str) -> None:
366374
self._enable_feature(dep_pkg, f)
367375

368376
def _enable_feature(self, pkg: PackageState, feature: str) -> None:
369-
cfg = pkg.cfg
377+
cfg = pkg.cfg[MachineChoice.HOST]
370378
if feature in cfg.features:
371379
return
372380
cfg.features.add(feature)
@@ -479,7 +487,7 @@ def _create_project(self, name: str, pkg: T.Optional[PackageState], build: build
479487
return [build.function('project', args, kwargs)]
480488

481489
def _create_dependencies(self, pkg: PackageState, build: builder.Builder) -> T.List[mparser.BaseNode]:
482-
cfg = pkg.cfg
490+
cfg = pkg.cfg[MachineChoice.HOST]
483491
ast: T.List[mparser.BaseNode] = []
484492
for depname in cfg.required_deps:
485493
dep = pkg.manifest.dependencies[depname]
@@ -520,7 +528,7 @@ def _create_system_dependency(self, name: str, dep: SystemDependency, build: bui
520528
]
521529

522530
def _create_dependency(self, pkg: PackageState, dep: Dependency, build: builder.Builder) -> T.List[mparser.BaseNode]:
523-
cfg = pkg.cfg
531+
cfg = pkg.cfg[MachineChoice.HOST]
524532
version_ = dep.meson_version or [pkg.manifest.package.version]
525533
api = dep.api or pkg.manifest.package.api
526534
kw = {
@@ -601,7 +609,7 @@ def _create_meson_subdir(self, build: builder.Builder) -> T.List[mparser.BaseNod
601609
]
602610

603611
def _create_lib(self, pkg: PackageState, build: builder.Builder, crate_type: raw.CRATE_TYPE) -> T.List[mparser.BaseNode]:
604-
cfg = pkg.cfg
612+
cfg = pkg.cfg[MachineChoice.HOST]
605613
dependencies: T.List[mparser.BaseNode] = []
606614
dependency_map: T.Dict[mparser.BaseNode, mparser.BaseNode] = {}
607615
for name in cfg.required_deps:

0 commit comments

Comments
 (0)