diff options
| author | Paolo Bonzini <pbonzini@redhat.com> | 2025-08-13 15:48:57 +0200 |
|---|---|---|
| committer | Dylan Baker <dylan@pnwbakers.com> | 2025-10-14 09:35:56 -0700 |
| commit | dece20658f96c2682240506c7d3acf7c2ddabd83 (patch) | |
| tree | 44f2d3f74eb52c55483ded8b567cfd794cd0d8b7 /mesonbuild/cargo/interpreter.py | |
| parent | 5cee5f0321e7cb38a0928938f2430e4b12e04061 (diff) | |
| download | meson-dece20658f96c2682240506c7d3acf7c2ddabd83.tar.gz | |
cargo: retrieve cfgs on demand
Allow creating the cargo.Interpreter (and thus parsing the Cargo.lock file)
even before 'rust' is added as a language.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'mesonbuild/cargo/interpreter.py')
| -rw-r--r-- | mesonbuild/cargo/interpreter.py | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/mesonbuild/cargo/interpreter.py b/mesonbuild/cargo/interpreter.py index 82d2b5836..2bb17024b 100644 --- a/mesonbuild/cargo/interpreter.py +++ b/mesonbuild/cargo/interpreter.py @@ -11,6 +11,7 @@ port will be required. from __future__ import annotations import dataclasses +import functools import os import collections import urllib.parse @@ -66,13 +67,10 @@ class PackageKey: class Interpreter: def __init__(self, env: Environment) -> None: self.environment = env - self.host_rustc = T.cast('RustCompiler', self.environment.coredata.compilers[MachineChoice.HOST]['rust']) # Map Cargo.toml's subdir to loaded manifest. self.manifests: T.Dict[str, Manifest] = {} # Map of cargo package (name + api) to its state self.packages: T.Dict[PackageKey, PackageState] = {} - # Rustc's config - self.cfgs = self._get_cfgs() def get_build_def_files(self) -> T.List[str]: return [os.path.join(subdir, 'Cargo.toml') for subdir in self.manifests] @@ -121,8 +119,9 @@ class Interpreter: pkg = PackageState(manifest, downloaded) self.packages[key] = pkg # Merge target specific dependencies that are enabled + cfgs = self._get_cfgs(MachineChoice.HOST) for condition, dependencies in manifest.target.items(): - if cfg.eval_cfg(condition, self.cfgs): + if cfg.eval_cfg(condition, cfgs): manifest.dependencies.update(dependencies) # Fetch required dependencies recursively. for depname, dep in manifest.dependencies.items(): @@ -196,9 +195,13 @@ class Interpreter: else: self._enable_feature(pkg, f) - def _get_cfgs(self) -> T.Dict[str, str]: - cfgs = self.host_rustc.get_cfgs().copy() - rustflags = self.environment.coredata.get_external_args(MachineChoice.HOST, 'rust') + @functools.lru_cache(maxsize=None) + def _get_cfgs(self, machine: MachineChoice) -> T.Dict[str, str]: + if not self.environment.is_cross_build(): + machine = MachineChoice.HOST + rustc = T.cast('RustCompiler', self.environment.coredata.compilers[machine]['rust']) + cfgs = rustc.get_cfgs().copy() + rustflags = self.environment.coredata.get_external_args(machine, 'rust') rustflags_i = iter(rustflags) for i in rustflags_i: if i == '--cfg': |
