summaryrefslogtreecommitdiff
path: root/mesonbuild/cargo/interpreter.py
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2025-08-13 15:48:57 +0200
committerDylan Baker <dylan@pnwbakers.com>2025-10-14 09:35:56 -0700
commitdece20658f96c2682240506c7d3acf7c2ddabd83 (patch)
tree44f2d3f74eb52c55483ded8b567cfd794cd0d8b7 /mesonbuild/cargo/interpreter.py
parent5cee5f0321e7cb38a0928938f2430e4b12e04061 (diff)
downloadmeson-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.py17
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':