diff options
| -rw-r--r-- | docs/markdown/snippets/main-project-cargo-lock.md | 12 | ||||
| -rw-r--r-- | mesonbuild/interpreter/interpreter.py | 15 |
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)) |
