[PATCH] build: put DT "compatible" value as "board_name" in profiles.json

mail at adrianschmutzler.de mail at adrianschmutzler.de
Wed Jul 8 15:41:43 EDT 2020


> -----Original Message-----
> From: Paul Spooren [mailto:mail at aparcar.org]
> Sent: Mittwoch, 8. Juli 2020 21:34
> To: Rafał Miłecki <zajec5 at gmail.com>; openwrt-devel at lists.openwrt.org
> Cc: Rafał Miłecki <rafal at milecki.pl>; Adrian Schmutzler
> <freifunk at adrianschmutzler.de>; Petr Štetiar <ynezz at true.cz>; Moritz
> Warning <moritzwarning at web.de>; Daniel Golle <daniel at makrotopia.org>
> Subject: Re: [PATCH] build: put DT "compatible" value as "board_name" in
> profiles.json
> 
> TL;DR: I think the issue is solved for devices using DT, the problem are the
> other targets with custom solutions.
> 
> I think there is a policy for new DT devices to use the compatible string as
> profile.
> 
> Multiple targets contain the following line in the target Makefile, which
> automatically adds the profile name as supported device:
> 
> SUPPORTED_DEVICES := $(subst _,$(comma),$(1))
> 
> So ideally for all devices using DT, the profile and compatible string are the
> same except for '_' replaced by ','.
> 
> For instance, the "Linksys WRT3200ACM" has the profile ID
> `linksys_wrt3200acm` and the automatically added compatible string
> `linksys,wrt3200acm`. So if that device wanted to search the
> `mvebu/cortexa9/profiles.json` for available sysupgrades, it takes the first
> entry from /proc/device-tree/compatible, replaces ',' with '_'
> find images in profiles.json['profiles']['linksys_wrt3200acm']['images'].
> 
> For cases where DT compatible and OpenWrt profile ID/name where
> different either one was patched[0].
> 
> I think the question is therefore more on how to deal with devices that do
> not use DT? If we use a per device rootfs a line could be added to /etc/os-
> release containing something like OPENWRT_PROFILE="SpEcIaL-CaSEv100",
> which is then shown via `ubus call system borad`.

Well, one could just use something like this, which we had before the compatible was used:

https://github.com/openwrt/openwrt/blob/openwrt-19.07/target/linux/ramips/base-files/lib/ramips.sh

There, one could just use the "profile names" instead, with "_" replaced by "," for the few non-DT targets.
However, this assumes a 1-to-1 relation between boards and profiles, and I'm not sure whether that always exists.
And somebody would have to create that by hand.

But I somehow lost track what's the ultimate goal of the proposed changes here, so maybe I'm not going into the right direction with this.

Best

Adrian

> 
> Another hack could be to add it to /proc/cmdline?
> 
> [0]:
> https://github.com/openwrt/openwrt/commit/df6f3090c48e3bafa0ace7450
> 488b0a20a8074fb
> 
> On 08.07.20 05:09, Rafał Miłecki wrote:
> > From: Rafał Miłecki <rafal at milecki.pl>
> >
> > The purpose of "board_name" in JSON is matchine OpenWrt running
> device
> > with JSON profile entry. Right now it gets filled for devices using DT.
> > Other targets will require custom solutions or just speciyfing that
> > value manually.
> >
> > Signed-off-by: Rafał Miłecki <rafal at milecki.pl>
> > ---
> >   include/image.mk               |  3 +++
> >   scripts/json_add_image_info.py | 19 +++++++++++++++++++
> >   2 files changed, 22 insertions(+)
> >
> > diff --git a/include/image.mk b/include/image.mk index
> > 15f4fe9d3b..b33c1032f8 100644
> > --- a/include/image.mk
> > +++ b/include/image.mk
> > @@ -532,10 +532,13 @@ define Device/Build/image
> >   	@mkdir -p $$(shell dirname $$@)
> >   	DEVICE_ID="$(DEVICE_NAME)" \
> >   	BIN_DIR="$(BIN_DIR)" \
> > +	LINUX_DIR="$(LINUX_DIR)" \
> > +	KDIR="$(KDIR)" \
> >   	IMAGE_NAME="$(IMAGE_NAME)" \
> >   	IMAGE_TYPE=$(word 1,$(subst ., ,$(2))) \
> >   	IMAGE_PREFIX="$(IMAGE_PREFIX)" \
> >   	DEVICE_TITLE="$(DEVICE_TITLE)" \
> > +	DEVICE_DTS="$(DEVICE_DTS)" \
> >   	TARGET="$(BOARD)" \
> >   	SUBTARGET="$(if $(SUBTARGET),$(SUBTARGET),generic)" \
> >   	VERSION_NUMBER="$(VERSION_NUMBER)" \ diff --git
> > a/scripts/json_add_image_info.py b/scripts/json_add_image_info.py
> > index b4d2dd8d71..5df4bf2a2a 100755
> > --- a/scripts/json_add_image_info.py
> > +++ b/scripts/json_add_image_info.py
> > @@ -5,6 +5,8 @@ from pathlib import Path
> >   from sys import argv
> >   import hashlib
> >   import json
> > +import re
> > +import subprocess
> >
> >   if len(argv) != 2:
> >       print("ERROR: JSON info script requires output arg") @@ -22,6
> > +24,20 @@ if not image_file.is_file():
> >   def get_titles():
> >       return [{"title": getenv("DEVICE_TITLE")}]
> >
> > +def get_board_name():
> > +    device_dts = getenv("DEVICE_DTS")
> > +    if device_dts is not None:
> > +        dtc = getenv("LINUX_DIR") + "/scripts/dtc/dtc"
> > +        dtb_file = getenv("KDIR") + "/image-" + device_dts + ".dtb"
> > +        dts = subprocess.run([dtc, "-q", "-I", "dtb", "-O", "dts", "-o", "-",
> dtb_file], capture_output=True, text=True)
> > +        if dts.returncode != 0:
> > +            return None
> > +        match = re.search("compatible = \"([^\"]*)", dts.stdout)
> > +        if match is None:
> > +            return None
> > +        return match[1]
> > +    return None
> > +
> >
> >   device_id = getenv("DEVICE_ID")
> >   image_hash = hashlib.sha256(image_file.read_bytes()).hexdigest()
> > @@ -46,5 +62,8 @@ image_info = {
> >           }
> >       },
> >   }
> > +board_name = get_board_name()
> > +if board_name is not None:
> > +    image_info["profiles"][device_id]["board_name"] = board_name
> >
> >   json_path.write_text(json.dumps(image_info, separators=(",", ":")))
-------------- next part --------------
A non-text attachment was scrubbed...
Name: openpgp-digital-signature.asc
Type: application/pgp-signature
Size: 834 bytes
Desc: not available
URL: <http://lists.openwrt.org/pipermail/openwrt-devel/attachments/20200708/0b222273/attachment.sig>


More information about the openwrt-devel mailing list