The Meson Build System
http://mesonbuild.com/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
228 lines
5.1 KiB
228 lines
5.1 KiB
3 years ago
|
# SPDX-License-Identifier: Apache-2.0
|
||
|
# Copyright © 2022-2023 Intel Corporation
|
||
|
|
||
|
"""Type definitions for cargo manifest files."""
|
||
|
|
||
|
from __future__ import annotations
|
||
|
import typing as T
|
||
|
|
||
|
from typing_extensions import Literal, TypedDict, Required
|
||
|
|
||
|
EDITION = Literal['2015', '2018', '2021']
|
||
|
CRATE_TYPE = Literal['bin', 'lib', 'dylib', 'staticlib', 'cdylib', 'rlib', 'proc-macro']
|
||
|
|
||
|
Package = TypedDict(
|
||
|
'Package',
|
||
|
{
|
||
|
'name': Required[str],
|
||
|
'version': Required[str],
|
||
|
'authors': T.List[str],
|
||
|
'edition': EDITION,
|
||
|
'rust-version': str,
|
||
|
'description': str,
|
||
|
'readme': str,
|
||
|
'license': str,
|
||
|
'license-file': str,
|
||
|
'keywords': T.List[str],
|
||
|
'categories': T.List[str],
|
||
|
'workspace': str,
|
||
|
'build': str,
|
||
|
'links': str,
|
||
|
'include': T.List[str],
|
||
|
'exclude': T.List[str],
|
||
|
'publish': bool,
|
||
|
'metadata': T.Dict[str, T.Dict[str, str]],
|
||
|
'default-run': str,
|
||
|
'autobins': bool,
|
||
|
'autoexamples': bool,
|
||
|
'autotests': bool,
|
||
|
'autobenches': bool,
|
||
|
},
|
||
|
total=False,
|
||
|
)
|
||
|
"""A description of the Package Dictionary."""
|
||
|
|
||
|
class FixedPackage(TypedDict, total=False):
|
||
|
|
||
|
"""A description of the Package Dictionary, fixed up."""
|
||
|
|
||
|
name: Required[str]
|
||
|
version: Required[str]
|
||
|
authors: T.List[str]
|
||
|
edition: EDITION
|
||
|
rust_version: str
|
||
|
description: str
|
||
|
readme: str
|
||
|
license: str
|
||
|
license_file: str
|
||
|
keywords: T.List[str]
|
||
|
categories: T.List[str]
|
||
|
workspace: str
|
||
|
build: str
|
||
|
links: str
|
||
|
include: T.List[str]
|
||
|
exclude: T.List[str]
|
||
|
publish: bool
|
||
|
metadata: T.Dict[str, T.Dict[str, str]]
|
||
|
default_run: str
|
||
|
autobins: bool
|
||
|
autoexamples: bool
|
||
|
autotests: bool
|
||
|
autobenches: bool
|
||
|
|
||
|
|
||
|
class Badge(TypedDict):
|
||
|
|
||
|
"""An entry in the badge section."""
|
||
|
|
||
|
status: Literal['actively-developed', 'passively-developed', 'as-is', 'experimental', 'deprecated', 'none']
|
||
|
|
||
|
|
||
|
Dependency = TypedDict(
|
||
|
'Dependency',
|
||
|
{
|
||
|
'version': str,
|
||
|
'registry': str,
|
||
|
'git': str,
|
||
|
'branch': str,
|
||
|
'rev': str,
|
||
|
'path': str,
|
||
|
'optional': bool,
|
||
|
'package': str,
|
||
|
'default-features': bool,
|
||
|
'features': T.List[str],
|
||
|
},
|
||
|
total=False,
|
||
|
)
|
||
|
"""An entry in the *dependencies sections."""
|
||
|
|
||
|
|
||
|
class FixedDependency(TypedDict, total=False):
|
||
|
|
||
|
"""An entry in the *dependencies sections, fixed up."""
|
||
|
|
||
|
version: T.List[str]
|
||
|
registry: str
|
||
|
git: str
|
||
|
branch: str
|
||
|
rev: str
|
||
|
path: str
|
||
|
optional: bool
|
||
|
package: str
|
||
|
default_features: bool
|
||
|
features: T.List[str]
|
||
|
|
||
|
|
||
|
DependencyV = T.Union[Dependency, str]
|
||
|
"""A Dependency entry, either a string or a Dependency Dict."""
|
||
|
|
||
|
|
||
|
_BaseBuildTarget = TypedDict(
|
||
|
'_BaseBuildTarget',
|
||
|
{
|
||
|
'path': str,
|
||
|
'test': bool,
|
||
|
'doctest': bool,
|
||
|
'bench': bool,
|
||
|
'doc': bool,
|
||
|
'plugin': bool,
|
||
|
'proc-macro': bool,
|
||
|
'harness': bool,
|
||
|
'edition': EDITION,
|
||
|
'crate-type': T.List[CRATE_TYPE],
|
||
|
'required-features': T.List[str],
|
||
|
},
|
||
|
total=False,
|
||
|
)
|
||
|
|
||
|
|
||
|
class BuildTarget(_BaseBuildTarget, total=False):
|
||
|
|
||
|
name: Required[str]
|
||
|
|
||
|
class LibTarget(_BaseBuildTarget, total=False):
|
||
|
|
||
|
name: str
|
||
|
|
||
|
|
||
|
class _BaseFixedBuildTarget(TypedDict, total=False):
|
||
|
path: str
|
||
|
test: bool
|
||
|
doctest: bool
|
||
|
bench: bool
|
||
|
doc: bool
|
||
|
plugin: bool
|
||
|
harness: bool
|
||
|
edition: EDITION
|
||
|
crate_type: T.List[CRATE_TYPE]
|
||
|
required_features: T.List[str]
|
||
|
|
||
|
|
||
|
class FixedBuildTarget(_BaseFixedBuildTarget, total=False):
|
||
|
|
||
|
name: str
|
||
|
|
||
|
class FixedLibTarget(_BaseFixedBuildTarget, total=False):
|
||
|
|
||
|
name: Required[str]
|
||
|
proc_macro: bool
|
||
|
|
||
|
|
||
|
class Target(TypedDict):
|
||
|
|
||
|
"""Target entry in the Manifest File."""
|
||
|
|
||
|
dependencies: T.Dict[str, DependencyV]
|
||
|
|
||
|
|
||
|
class Workspace(TypedDict):
|
||
|
|
||
|
"""The representation of a workspace.
|
||
|
|
||
|
In a vritual manifest the :attribute:`members` is always present, but in a
|
||
|
project manifest, an empty workspace may be provided, in which case the
|
||
|
workspace is implicitly filled in by values from the path based dependencies.
|
||
|
|
||
|
the :attribute:`exclude` is always optional
|
||
|
"""
|
||
|
|
||
|
members: T.List[str]
|
||
|
exclude: T.List[str]
|
||
|
|
||
|
|
||
|
Manifest = TypedDict(
|
||
|
'Manifest',
|
||
|
{
|
||
|
'package': Package,
|
||
|
'badges': T.Dict[str, Badge],
|
||
|
'dependencies': T.Dict[str, DependencyV],
|
||
|
'dev-dependencies': T.Dict[str, DependencyV],
|
||
|
'build-dependencies': T.Dict[str, DependencyV],
|
||
|
'lib': LibTarget,
|
||
|
'bin': T.List[BuildTarget],
|
||
|
'test': T.List[BuildTarget],
|
||
|
'bench': T.List[BuildTarget],
|
||
|
'example': T.List[BuildTarget],
|
||
|
'features': T.Dict[str, T.List[str]],
|
||
|
'target': T.Dict[str, Target],
|
||
|
'workspace': Workspace,
|
||
|
|
||
|
# TODO: patch?
|
||
|
# TODO: replace?
|
||
|
},
|
||
|
total=False,
|
||
|
)
|
||
|
"""The Cargo Manifest format."""
|
||
|
|
||
|
|
||
|
class VirtualManifest(TypedDict):
|
||
|
|
||
|
"""The Representation of a virtual manifest.
|
||
|
|
||
|
Cargo allows a root manifest that contains only a workspace, this is called
|
||
|
a virtual manifest. This doesn't really map 1:1 with any meson concept,
|
||
|
except perhaps the proposed "meta project".
|
||
|
"""
|
||
|
|
||
|
workspace: Workspace
|