On Fri, Jul 8, 2022 at 2:17 PM Alexander Kanavin <[email protected]> wrote:
>
> From: Joshua Watt <[email protected]>
>
> Defines a common schema for layer setup that can be consumed by tools to
> know how to fetch and assemble layers for end users. Also includes an
> example of the layer setup that constructs poky/meta-intel/imaginary product 
> layer
> for reference.
>
> The schema can be used to validate a layer setup file with the commands:
>
>  $ python3 -m pip install jsonschema
>  $ jsonschema -i meta/files/layers.example.json meta/files/layers.schema.json
>
> Signed-off-by: Joshua Watt <[email protected]>
>
> Alex: I made the following modifications to Joshua's original commit:
>
> - moved the files from meta/lib to meta/files
>
> - the example json showcases a multi-repo, multi-layer setup with additional
> configurations and machines, instead of just poky - closer to a typical 
> product
>
> - the schema is modified so that:
>
> -- all lists (sources, layers, remotes) are replaced by objects keyed by 
> 'name' properties of the list items.
> This allows using them as dicts inside Python, and makes the json more 
> compact and readable.

As long as the order is truly irrelevant because different
implementations (and even different versions of Python!) will result
in a different processing order.

>
> -- added 'contains_this_file' property to source object
>
> -- added 'buildconfigs', 'machines' and 'distros' properties to layer objects.
>
> -- replaced 'remote' property with a 'oneOf' definition for git with a 
> specific
> 'git-remote' property. 'oneOf' is problematic when schema validation fails:
> the diagnostic is only that none of oneOf variants matched, which is too 
> non-specific.
>
> -- added 'describe' property to 'git-remote' object.
>
> FIXME:
> - oe-selftest that validates the example json against the schema using 
> python3-jsonschema-native
>
> Signed-off-by: Alexander Kanavin <[email protected]>
> ---
>  meta/files/layers.example.json | 115 ++++++++++++++++++++++++++++++
>  meta/files/layers.schema.json  | 125 +++++++++++++++++++++++++++++++++
>  2 files changed, 240 insertions(+)
>  create mode 100644 meta/files/layers.example.json
>  create mode 100644 meta/files/layers.schema.json
>
> diff --git a/meta/files/layers.example.json b/meta/files/layers.example.json
> new file mode 100644
> index 0000000000..f606567b9d
> --- /dev/null
> +++ b/meta/files/layers.example.json
> @@ -0,0 +1,115 @@
> +{

Missing the version? Although I see it's in the schema.

> +    "sources": {
> +        "meta-alex": {
> +            "contains_this_file": true,
> +            "git-remote": {

The problem with this is that there has been some desire for other
fetching mechanisms; Perhaps we can say git is only supported, but
that was the reason I used `oneOf`: it allows for other fetching types
in the future.

> +                "branch": "master",
> +                "describe": "",
> +                "remotes": {
> +                    "remote-alex": {
> +                        "uri": "https://github.com/kanavin/meta-alex";
> +                    }

Multiple remotes are nice.... but not strictly necessary, since you
can only have one rev checked out. I don't care too much one way or
another but it's something to think about since it makes the fetching
more complicated.

> +                },
> +                "rev": "05b25605fb8b2399e4706d7323828676bf0da0b5"
> +            },
> +            "layers": {
> +                "meta-alex": {
> +                    "buildconfigs": {
> +                        "conf/templates/configuration-gadget": {},
> +                        "conf/templates/configuration-gizmo": {}

I think these fall under the same category as the machines below, but
I don't use  TEMPLATECONF so I'm not sure.

> +                    },
> +                    "subpath": ""
> +                }
> +            },
> +            "path": "meta-alex"
> +        },
> +        "meta-intel": {
> +            "git-remote": {
> +                "branch": "master",
> +                "describe": "15.0-hardknott-3.3-310-g0a96edae",
> +                "remotes": {
> +                    "origin": {
> +                        "uri": "git://git.yoctoproject.org/meta-intel"
> +                    }
> +                },
> +                "rev": "0a96edae609a3f48befac36af82cf1eed6786b4a"
> +            },
> +            "layers": {
> +                "meta-intel": {
> +                    "machines": {
> +                        "intel-core2-32": {},
> +                        "intel-corei7-64": {},
> +                        "intel-skylake-64": {}

Why does this need to be listed here? Isn't this just the contents of
the conf/machine directory in the layer? I really don't want to be
duplicating information; IHMO it's better to let the layer itself be
canonical about what machines/distros/etc. it supports

> +                    },
> +                    "subpath": ""
> +                }
> +            },
> +            "path": "meta-intel"
> +        },
> +        "poky": {
> +            "git-remote": {
> +                "branch": "akanavin/setup-layers",
> +                "describe": "4.1_M1-374-g9dda719b2a",
> +                "remotes": {
> +                    "origin": {
> +                        "uri": "git://git.yoctoproject.org/poky"
> +                    },
> +                    "poky-contrib": {
> +                        "uri": 
> "ssh://[email protected]/poky-contrib"
> +                    }
> +                },
> +                "rev": "9dda719b2a4727a4d43a6ab8d9e23f8ca68790ec"
> +            },
> +            "layers": {
> +                "meta": {
> +                    "distros": {
> +                        "defaultsetup": {}

Same as machines above

> +                    },
> +                    "machines": {
> +                        "qemuarm": {},
> +                        "qemuarm64": {},
> +                        "qemuarmv5": {},
> +                        "qemumips": {},
> +                        "qemumips64": {},
> +                        "qemuppc": {},
> +                        "qemuppc64": {},
> +                        "qemuriscv32": {},
> +                        "qemuriscv64": {},
> +                        "qemux86": {},
> +                        "qemux86-64": {}
> +                    },
> +                    "subpath": "meta"
> +                },
> +                "meta-poky": {
> +                    "buildconfigs": {
> +                        "conf": {}
> +                    },
> +                    "distros": {
> +                        "poky": {},
> +                        "poky-altcfg": {},
> +                        "poky-bleeding": {},
> +                        "poky-tiny": {}
> +                    },
> +                    "subpath": "meta-poky"
> +                },
> +                "meta-selftest": {
> +                    "machines": {
> +                        "qemux86copy": {}
> +                    },
> +                    "subpath": "meta-selftest"
> +                },
> +                "meta-yocto-bsp": {
> +                    "machines": {
> +                        "beaglebone-yocto": {},
> +                        "edgerouter": {},
> +                        "genericx86": {},
> +                        "genericx86-64": {}
> +                    },
> +                    "subpath": "meta-yocto-bsp"
> +                }
> +            },
> +            "path": "poky"
> +        }
> +    },
> +    "version": "1.0"
> +}
> \ No newline at end of file
> diff --git a/meta/files/layers.schema.json b/meta/files/layers.schema.json
> new file mode 100644
> index 0000000000..ba46e00b52
> --- /dev/null
> +++ b/meta/files/layers.schema.json
> @@ -0,0 +1,125 @@
> +{
> +    "description": "OpenEmbedder Layer Setup Manifest",
> +    "type": "object",
> +    "additionalProperties": false,
> +    "required": [
> +        "version"
> +    ],
> +    "properties": {
> +        "version": {
> +            "description": "The version of this document; currently '1.0'",
> +            "enum": ["1.0"]
> +        },
> +        "sources": {
> +            "description": "The dict of layer sources",
> +            "type": "object",
> +            "patternProperties": { ".*" : {
> +                "type": "object",
> +                "description": "The upstream source from which a set of 
> layers may be fetched",
> +                "additionalProperties": false,
> +                "required": [
> +                    "path"
> +                ],
> +                "properties": {
> +                    "path": {
> +                        "description": "The path where this layer source 
> will be placed when fetching",
> +                        "type": "string"
> +                    },
> +                    "description": {
> +                        "description": "A description of this layer source",
> +                        "type": "string"
> +                    },
> +                    "contains_this_file": {
> +                        "description": "Whether the directory with the layer 
> source also contains this json description. Tools may want to skip the 
> checkout of the source then.",
> +                        "type": "boolean"
> +                    },
> +                    "layers": {
> +                        "description": "The dict of layers to be used from 
> this upstream source",
> +                        "type": "object",
> +                        "patternProperties": { ".*" : {
> +                            "description": "A layer from the upstream 
> source",
> +                            "type": "object",
> +                            "additionalProperties": false,
> +                            "properties": {
> +                                "subpath": {
> +                                    "description": "The subpath (relative to 
> the source root) for this layer. Omit if the source root is the layer path",
> +                                    "type": "string"
> +                                },
> +                                "buildconfigs": {
> +                                    "description": "A dict of template build 
> configurations in the layer, keyed by relative path to the layer root",
> +                                    "type": "object",
> +                                    "patternProperties": { ".*" : {
> +                                        "description": "Properties of a 
> build confuguration template",
> +                                        "type": "object",
> +                                        "additionalProperties": false,
> +                                        "properties":{}
> +                                    }}
> +                                },
> +                                "machines": {
> +                                    "description": "A dict of machine 
> definitions in the layer",
> +                                    "type": "object",
> +                                    "patternProperties": { ".*" : {
> +                                        "description": "Properties of a 
> machine definition",
> +                                        "type": "object",
> +                                        "additionalProperties": false,
> +                                        "properties":{}
> +                                    }}
> +                                },
> +                                "distros": {
> +                                    "description": "A dict of distro 
> definitions in the layer",
> +                                    "type": "object",
> +                                    "patternProperties": { ".*" : {
> +                                        "description": "Properties of a 
> distro definition",
> +                                        "type": "object",
> +                                        "additionalProperties": false,
> +                                        "properties":{}
> +                                    }}
> +                                }
> +                            }
> +                        }}
> +                    },
> +                    "git-remote": {
> +                                "description": "A remote git source from 
> which to fetch",
> +                                "type": "object",
> +                                "additionalProperties": false,
> +                                "required": [
> +                                    "rev"
> +                                ],
> +                                "properties": {
> +                                    "branch": {
> +                                        "description": "The git branch to 
> fetch (optional)",
> +                                        "type": "string"
> +                                    },
> +                                    "rev": {
> +                                        "description": "The git revision to 
> checkout",
> +                                        "type": "string"
> +                                    },
> +                                    "describe": {
> +                                        "description": "The output of 'git 
> describe' (human readable description of the revision using tags in revision 
> history).",
> +                                        "type": "string"
> +                                    },
> +                                    "remotes": {
> +                                        "description": "The dict of git 
> remotes to add to this repository",
> +                                        "type": "object",
> +                                        "patternProperties": { ".*" : {
> +                                            "description": "A git remote",
> +                                            "type": "object",
> +                                            "addtionalProperties": false,
> +                                            "required": [
> +                                                "uri"
> +                                            ],
> +                                            "properties": {
> +                                                "uri": {
> +                                                    "description": "The URI 
> for the remote",
> +                                                    "type": "string"
> +                                                }
> +                                            }
> +                                        }}
> +                                    }
> +                                }
> +                    }
> +                }
> +            }
> +        }}
> +    }
> +}
> --
> 2.30.2
>
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#167832): 
https://lists.openembedded.org/g/openembedded-core/message/167832
Mute This Topic: https://lists.openembedded.org/mt/92259024/21656
Group Owner: [email protected]
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to