diff options
| author | Xavier Claessens <xclaessens@netflix.com> | 2025-10-27 15:05:02 +0000 |
|---|---|---|
| committer | Xavier Claessens <xclaesse@gmail.com> | 2025-10-28 17:44:16 +0100 |
| commit | 1c620b2b783e0f53e7aafaee2fbdfdb72a0b9781 (patch) | |
| tree | 45555835b9a683d2ef0cdb0b1ca758202a694ac3 | |
| parent | 815c2779e077953c27be1e1e2f254fa388d896f2 (diff) | |
| download | meson-1c620b2b783e0f53e7aafaee2fbdfdb72a0b9781.tar.gz | |
cargo: Dependency variable name must include its API
A crate can depend on 2 different API versions of the same crate:
foo_1_dep and foo_2_dep.
Make sure a Dependency always has a version. When it's defined by a git
URL, or a path, the version could be omitted. Update once we fetched the
dependency's package.
| -rw-r--r-- | mesonbuild/cargo/interpreter.py | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/mesonbuild/cargo/interpreter.py b/mesonbuild/cargo/interpreter.py index bd505d7c7..6af7469ae 100644 --- a/mesonbuild/cargo/interpreter.py +++ b/mesonbuild/cargo/interpreter.py @@ -39,8 +39,8 @@ def _dependency_name(package_name: str, api: str, suffix: str = '-rs') -> str: return f'{basename}-{api}{suffix}' -def _dependency_varname(package_name: str) -> str: - return f'{fixup_meson_varname(package_name)}_dep' +def _dependency_varname(dep: Dependency) -> str: + return f'{fixup_meson_varname(dep.package)}_{(dep.api.replace(".", "_"))}_dep' def _extra_args_varname() -> str: @@ -329,6 +329,8 @@ class Interpreter: if not dep.meson_version: raise MesonException(f'Cannot determine version of cargo package {dep.package}') dep_pkg = self._fetch_package(dep.package, dep.api) + if not dep.version: + dep.update_version(f'={dep_pkg.manifest.package.version}') return dep_pkg def _load_manifest(self, subdir: str, workspace: T.Optional[Workspace] = None, member_path: str = '') -> T.Union[Manifest, Workspace]: @@ -513,7 +515,6 @@ class Interpreter: def _create_dependency(self, pkg: PackageState, dep: Dependency, build: builder.Builder) -> T.List[mparser.BaseNode]: version_ = dep.meson_version or [pkg.manifest.package.version] - api = dep.api or pkg.manifest.package.api kw = { 'version': build.array([build.string(s) for s in version_]), } @@ -533,10 +534,10 @@ class Interpreter: build.assign( build.function( 'dependency', - [build.string(_dependency_name(dep.package, api))], + [build.string(_dependency_name(dep.package, dep.api))], kw, ), - _dependency_varname(dep.package), + _dependency_varname(dep), ), # actual_features = xxx_dep.get_variable('features', default_value : '').split(',') build.assign( @@ -544,7 +545,7 @@ class Interpreter: 'split', build.method( 'get_variable', - build.identifier(_dependency_varname(dep.package)), + build.identifier(_dependency_varname(dep)), [build.string('features')], {'default_value': build.string('')} ), @@ -563,7 +564,7 @@ class Interpreter: build.if_(build.not_in(build.identifier('f'), build.identifier('actual_features')), build.block([ build.function('error', [ build.string('Dependency'), - build.string(_dependency_name(dep.package, api)), + build.string(_dependency_name(dep.package, dep.api)), build.string('previously configured with features'), build.identifier('actual_features'), build.string('but need'), @@ -648,7 +649,7 @@ class Interpreter: dependency_map: T.Dict[mparser.BaseNode, mparser.BaseNode] = {} for name in pkg.required_deps: dep = pkg.manifest.dependencies[name] - dependencies.append(build.identifier(_dependency_varname(dep.package))) + dependencies.append(build.identifier(_dependency_varname(dep))) if name != dep.package: dep_pkg = self._dep_package(pkg, dep) dep_lib_name = dep_pkg.manifest.lib.name |
