[Buildroot] [PATCH 06/10] infra/pkg-generic: introduce foo-show-info
Thomas De Schampheleire
patrickdepinguin at gmail.com
Wed Apr 10 09:16:48 UTC 2019
El dom., 7 abr. 2019 a las 13:51, Yann E. MORIN
(<yann.morin.1998 at free.fr>) escribió:
>
> Users are increasingly trying to extract information about packages.
> For example, they might need to get the list of URIs, or the
> dependencies of a package.
>
> Although we do have a bunch of rules to generate some of that, this is
> done in ad-hic way, with most of the output formats just as-hoc, raw,
> unformatted blurbs, mostly internal data dumped as-is.
ad-hic -> ad-hoc
as-hoc -> ad-hoc
>
> Introduce a new rule, foo-show-info, that provides a properly formatted
> output of all the meta-information about a package: name, type, version,
> licenses, dependencies...
>
> We choose to use JSON as the output format, because it is pretty
> veratile, has parsers in virtually all languages, has tols to parse from
versatile
tools
> the shell (jq). It also closely matches Python data structure, which
> makes it easy to use with our own internal tools as well. Finally, JSON
> being a key-value store, allows for easy expanding the output without
> requiring existing consumers to be updated; new, unknown keys are simply
> ignored by those (as long as they are true JSON parsers).
>
> The complex part of this change was the conditional output of parts of
> the data: virtual packages have no source, version, license or
> downloads, unlike non-virtual packages. The basic idea was to
> intersperse those conditions directly inside the $(info ...) block.
> However, becasue key-value pairs in JSON are separated with commas, and
because
> that the comma is also the parameters separator in Makefile, we'd have
> had to use $(comma) to output an actual comma when inside an $(if ...)
> statement, like so:
>
> $(if $$($(2)_IS_VIRTUAL), \
> "virtual": true$(comma), \
> "virtual": false$(comma) \
> "version": "$$($(2)_DL_VERSION)"$(comma) \
> [...]
> )
>
> This was, with the trailing '\'i and the indentation, a bit cumbersome
> to handle, and would be difficult to maintain.
>
> Instead, an intermediate variable is used, which is set conditionally.
> And to make the rest of the information look similar, it is also stored
> in an intermediate variable. This makes it easier to read, and thus to
> maintain (hopefully so).
>
> Note that we can't set part of the variable conditionally, like so:
>
> SOMETHING = YES
> define FOO
> ifeq ($(SOMETHING),YES)
> Meh $(SOMETHING)
> else
> Meh --$(SOMETHING)--
> endif
> endef
> $(info $(FOO))
>
> as that would yield:
>
> ifeq (YES,YES)
> Meh YES
> else
> Meh --YES--
> endif
>
> So, we use intermediate variables.
>
> Finally, the variable is $(strip...)ed before being displayed, so as to
> make it fit on a single line, one per package info. This is just JSON,
> so it does not matter, but at least it should be parallel-safe in the
> future.
>
> Signed-off-by: "Yann E. MORIN" <yann.morin.1998 at free.fr>
> Cc: Thomas De Schampheleire <patrickdepinguin at gmail.com>
> Cc: Thomas Petazzoni <thomas.petazzoni at bootlin.com>
> Cc: Arnout Vandecappelle <arnout at mind.be>
> ---
> package/pkg-generic.mk | 44 ++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 44 insertions(+)
>
> diff --git a/package/pkg-generic.mk b/package/pkg-generic.mk
> index f78ff2e665..72b1a87f5f 100644
> --- a/package/pkg-generic.mk
> +++ b/package/pkg-generic.mk
> @@ -843,6 +843,49 @@ $(1)-external-deps:
> @echo "file://$$($(2)_OVERRIDE_SRCDIR)"
> endif
>
> +ifeq ($$($(2)_IS_VIRTUAL),YES)
> +define $(2)_SHOW_INFO_VIRTUAL
> + "virtual": true,
> +endef
> +else
> +define $(2)_SHOW_INFO_VIRTUAL
> + "virtual": false,
> + "version": "$$($(2)_DL_VERSION)",
> + "licenses": "$$($(2)_LICENSE)",
> + "downloads": [
> + $$(foreach dl,$$($(2)_ALL_DOWNLOADS),
> + {
> + "source": "$$(notdir $$(dl))",
> + "URIs": [
> + $$(call make-comma-list,
> + $$(subst \|,|,
> + $$(call DOWNLOAD_URIS,$$(dl),$(2))
> + )
> + )
> + ]
> + },
> + )
> + null
> + ],
So the 'null' serves as last element in the array and is only needed
because JSON cannot handle the trailing comma, right?
> +endef
> +endif
> +
> +define $(2)_SHOW_INFO
> + "name": "$(1)",
> + "type": "$(4)",
> + $$($(2)_SHOW_INFO_VIRTUAL)
> + "depends on": [
> + $$(call make-comma-list,$$($(2)_FINAL_ALL_DEPENDENCIES))
> + ],
> + "dependency of": [
> + $$(call make-comma-list,$$($(2)_RDEPENDENCIES))
> + ]
It feels odd to me to not use single-word keys here. Why not use
'depends/rdepends', 'dependencies'/'rdependencies' or if you want
dependencies/reverse_dependencies ? The naming 'rdepends' is already
exposed to users 'make show-rdepends' so it makes sense to me to use
the same naming.
> +endef
> +
> +$(1)-show-info:
> + @:
> + $$(info { $$(strip $$($(2)_SHOW_INFO)) })
> +
> $(1)-show-version:
> @echo $$($(2)_VERSION)
>
> @@ -1099,6 +1142,7 @@ DL_TOOLS_DEPENDENCIES += $$(call extractor-dependency,$$($(2)_SOURCE))
> $(1)-rsync \
> $(1)-show-dependency-tree \
> $(1)-show-depends \
> + $(1)-show-info \
> $(1)-show-version \
> $(1)-source
>
> --
> 2.14.1
>
More information about the buildroot
mailing list