cargo: Ensure Dependency.package always has a value
This commit is contained in:
parent
bc91eb5814
commit
3f73aaed2d
|
@ -151,6 +151,7 @@ class Dependency:
|
||||||
|
|
||||||
"""Representation of a Cargo Dependency Entry."""
|
"""Representation of a Cargo Dependency Entry."""
|
||||||
|
|
||||||
|
name: dataclasses.InitVar[str]
|
||||||
version: T.List[str]
|
version: T.List[str]
|
||||||
registry: T.Optional[str] = None
|
registry: T.Optional[str] = None
|
||||||
git: T.Optional[str] = None
|
git: T.Optional[str] = None
|
||||||
|
@ -158,16 +159,19 @@ class Dependency:
|
||||||
rev: T.Optional[str] = None
|
rev: T.Optional[str] = None
|
||||||
path: T.Optional[str] = None
|
path: T.Optional[str] = None
|
||||||
optional: bool = False
|
optional: bool = False
|
||||||
package: T.Optional[str] = None
|
package: str = ''
|
||||||
default_features: bool = True
|
default_features: bool = True
|
||||||
features: T.List[str] = dataclasses.field(default_factory=list)
|
features: T.List[str] = dataclasses.field(default_factory=list)
|
||||||
|
|
||||||
|
def __post_init__(self, name: str) -> None:
|
||||||
|
self.package = self.package or name
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_raw(cls, raw: manifest.DependencyV) -> Dependency:
|
def from_raw(cls, name: str, raw: manifest.DependencyV) -> Dependency:
|
||||||
"""Create a dependency from a raw cargo dictionary"""
|
"""Create a dependency from a raw cargo dictionary"""
|
||||||
if isinstance(raw, str):
|
if isinstance(raw, str):
|
||||||
return cls(version.convert(raw))
|
return cls(name, version.convert(raw))
|
||||||
return cls(**_fixup_raw_mappings(raw))
|
return cls(name, **_fixup_raw_mappings(raw))
|
||||||
|
|
||||||
|
|
||||||
@dataclasses.dataclass
|
@dataclasses.dataclass
|
||||||
|
@ -290,16 +294,16 @@ def _convert_manifest(raw_manifest: manifest.Manifest, subdir: str, path: str =
|
||||||
|
|
||||||
return Manifest(
|
return Manifest(
|
||||||
Package(**pkg),
|
Package(**pkg),
|
||||||
{k: Dependency.from_raw(v) for k, v in raw_manifest.get('dependencies', {}).items()},
|
{k: Dependency.from_raw(k, v) for k, v in raw_manifest.get('dependencies', {}).items()},
|
||||||
{k: Dependency.from_raw(v) for k, v in raw_manifest.get('dev-dependencies', {}).items()},
|
{k: Dependency.from_raw(k, v) for k, v in raw_manifest.get('dev-dependencies', {}).items()},
|
||||||
{k: Dependency.from_raw(v) for k, v in raw_manifest.get('build-dependencies', {}).items()},
|
{k: Dependency.from_raw(k, v) for k, v in raw_manifest.get('build-dependencies', {}).items()},
|
||||||
Library(**lib),
|
Library(**lib),
|
||||||
[Binary(**_fixup_raw_mappings(b)) for b in raw_manifest.get('bin', {})],
|
[Binary(**_fixup_raw_mappings(b)) for b in raw_manifest.get('bin', {})],
|
||||||
[Test(**_fixup_raw_mappings(b)) for b in raw_manifest.get('test', {})],
|
[Test(**_fixup_raw_mappings(b)) for b in raw_manifest.get('test', {})],
|
||||||
[Benchmark(**_fixup_raw_mappings(b)) for b in raw_manifest.get('bench', {})],
|
[Benchmark(**_fixup_raw_mappings(b)) for b in raw_manifest.get('bench', {})],
|
||||||
[Example(**_fixup_raw_mappings(b)) for b in raw_manifest.get('example', {})],
|
[Example(**_fixup_raw_mappings(b)) for b in raw_manifest.get('example', {})],
|
||||||
raw_manifest.get('features', {}),
|
raw_manifest.get('features', {}),
|
||||||
{k: {k2: Dependency.from_raw(v2) for k2, v2 in v.get('dependencies', {}).items()}
|
{k: {k2: Dependency.from_raw(k2, v2) for k2, v2 in v.get('dependencies', {}).items()}
|
||||||
for k, v in raw_manifest.get('target', {}).items()},
|
for k, v in raw_manifest.get('target', {}).items()},
|
||||||
subdir,
|
subdir,
|
||||||
path,
|
path,
|
||||||
|
@ -480,8 +484,6 @@ def _create_features(cargo: Manifest, build: builder.Builder) -> T.List[mparser.
|
||||||
def _create_dependencies(cargo: Manifest, build: builder.Builder) -> T.List[mparser.BaseNode]:
|
def _create_dependencies(cargo: Manifest, build: builder.Builder) -> T.List[mparser.BaseNode]:
|
||||||
ast: T.List[mparser.BaseNode] = []
|
ast: T.List[mparser.BaseNode] = []
|
||||||
for name, dep in cargo.dependencies.items():
|
for name, dep in cargo.dependencies.items():
|
||||||
package_name = dep.package or name
|
|
||||||
|
|
||||||
# xxx_options += {'feature-default': true, ...}
|
# xxx_options += {'feature-default': true, ...}
|
||||||
extra_options: T.Dict[mparser.BaseNode, mparser.BaseNode] = {
|
extra_options: T.Dict[mparser.BaseNode, mparser.BaseNode] = {
|
||||||
build.string(_option_name('default')): build.bool(dep.default_features),
|
build.string(_option_name('default')): build.bool(dep.default_features),
|
||||||
|
@ -515,20 +517,20 @@ def _create_dependencies(cargo: Manifest, build: builder.Builder) -> T.List[mpar
|
||||||
build.assign(
|
build.assign(
|
||||||
build.function(
|
build.function(
|
||||||
'dependency',
|
'dependency',
|
||||||
[build.string(_dependency_name(package_name))],
|
[build.string(_dependency_name(dep.package))],
|
||||||
kw,
|
kw,
|
||||||
),
|
),
|
||||||
_dependency_varname(package_name),
|
_dependency_varname(dep.package),
|
||||||
),
|
),
|
||||||
# if xxx_dep.found()
|
# if xxx_dep.found()
|
||||||
build.if_(build.method('found', build.identifier(_dependency_varname(package_name))), build.block([
|
build.if_(build.method('found', build.identifier(_dependency_varname(dep.package))), build.block([
|
||||||
# actual_features = xxx_dep.get_variable('features', default_value : '').split(',')
|
# actual_features = xxx_dep.get_variable('features', default_value : '').split(',')
|
||||||
build.assign(
|
build.assign(
|
||||||
build.method(
|
build.method(
|
||||||
'split',
|
'split',
|
||||||
build.method(
|
build.method(
|
||||||
'get_variable',
|
'get_variable',
|
||||||
build.identifier(_dependency_varname(package_name)),
|
build.identifier(_dependency_varname(dep.package)),
|
||||||
[build.string('features')],
|
[build.string('features')],
|
||||||
{'default_value': build.string('')}
|
{'default_value': build.string('')}
|
||||||
),
|
),
|
||||||
|
@ -557,7 +559,7 @@ def _create_dependencies(cargo: Manifest, build: builder.Builder) -> T.List[mpar
|
||||||
build.if_(build.not_in(build.identifier('f'), build.identifier('actual_features')), build.block([
|
build.if_(build.not_in(build.identifier('f'), build.identifier('actual_features')), build.block([
|
||||||
build.function('error', [
|
build.function('error', [
|
||||||
build.string('Dependency'),
|
build.string('Dependency'),
|
||||||
build.string(_dependency_name(package_name)),
|
build.string(_dependency_name(dep.package)),
|
||||||
build.string('previously configured with features'),
|
build.string('previously configured with features'),
|
||||||
build.identifier('actual_features'),
|
build.identifier('actual_features'),
|
||||||
build.string('but need'),
|
build.string('but need'),
|
||||||
|
@ -593,10 +595,9 @@ def _create_lib(cargo: Manifest, build: builder.Builder, crate_type: manifest.CR
|
||||||
dependencies: T.List[mparser.BaseNode] = []
|
dependencies: T.List[mparser.BaseNode] = []
|
||||||
dependency_map: T.Dict[mparser.BaseNode, mparser.BaseNode] = {}
|
dependency_map: T.Dict[mparser.BaseNode, mparser.BaseNode] = {}
|
||||||
for name, dep in cargo.dependencies.items():
|
for name, dep in cargo.dependencies.items():
|
||||||
package_name = dep.package or name
|
dependencies.append(build.identifier(_dependency_varname(dep.package)))
|
||||||
dependencies.append(build.identifier(_dependency_varname(package_name)))
|
if name != dep.package:
|
||||||
if name != package_name:
|
dependency_map[build.string(fixup_meson_varname(dep.package))] = build.string(name)
|
||||||
dependency_map[build.string(fixup_meson_varname(package_name))] = build.string(name)
|
|
||||||
|
|
||||||
rust_args: T.List[mparser.BaseNode] = [
|
rust_args: T.List[mparser.BaseNode] = [
|
||||||
build.identifier('features_args'),
|
build.identifier('features_args'),
|
||||||
|
|
Loading…
Reference in New Issue