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.
227 lines
5.1 KiB
227 lines
5.1 KiB
# 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
|
|
|