summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/markdown/snippets/main-project-cargo-lock.md12
-rw-r--r--mesonbuild/interpreter/interpreter.py15
2 files changed, 27 insertions, 0 deletions
diff --git a/docs/markdown/snippets/main-project-cargo-lock.md b/docs/markdown/snippets/main-project-cargo-lock.md
new file mode 100644
index 000000000..0f3c67e5e
--- /dev/null
+++ b/docs/markdown/snippets/main-project-cargo-lock.md
@@ -0,0 +1,12 @@
+## Common `Cargo.lock` for all Cargo subprojects
+
+Whenever Meson finds a `Cargo.lock` file in the toplevel directory
+of the project, it will use it to resolve the versions of Cargo
+subprojects in preference to per-subproject `Cargo.lock` files.
+Per-subproject lock files are only used if the invoking project
+did not have a `Cargo.lock` file itself.
+
+If you wish to experiment with Cargo subprojects, it is recommended
+to use `cargo` to set up `Cargo.lock` and `Cargo.toml` files,
+encompassing all Rust targets, in the toplevel source directory.
+Cargo subprojects remain unstable and subject to change.
diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py
index b8c1f8298..631890d0f 100644
--- a/mesonbuild/interpreter/interpreter.py
+++ b/mesonbuild/interpreter/interpreter.py
@@ -314,6 +314,18 @@ class Interpreter(InterpreterBase, HoldableObject):
def __getnewargs_ex__(self) -> T.Tuple[T.Tuple[object], T.Dict[str, object]]:
raise MesonBugException('This class is unpicklable')
+ def load_root_cargo_lock_file(self) -> None:
+ cargo_lock_filename = os.path.join(self.subdir, 'Cargo.lock')
+ cargo_lock = os.path.join(self.source_root, cargo_lock_filename)
+ if not os.path.isfile(cargo_lock):
+ return
+ from .. import cargo
+ try:
+ self.cargo = cargo.Interpreter(self.environment, self.subdir, self.subproject_dir)
+ except cargo.TomlImplementationMissing as e:
+ # error delayed to actual usage of a Cargo subproject
+ mlog.warning(f'cannot load Cargo.lock: {e}', fatal=False)
+
def _redetect_machines(self) -> None:
# Re-initialize machine descriptions. We can do a better job now because we
# have the compilers needed to gain more knowledge, so wipe out old
@@ -1286,6 +1298,9 @@ class Interpreter(InterpreterBase, HoldableObject):
assert self.environment.wrap_resolver is not None, 'for mypy'
self.environment.wrap_resolver.load_and_merge(subprojects_dir, self.subproject)
+ if self.cargo is None:
+ self.load_root_cargo_lock_file()
+
self.build.projects[self.subproject] = proj_name
mlog.log('Project name:', mlog.bold(proj_name))
mlog.log('Project version:', mlog.bold(self.project_version))