New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
build: add option to create JSON info files #2192
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -7,6 +7,13 @@ | |
|
||
menu "Global build settings" | ||
|
||
config JSON_ADD_IMAGE_INFO | ||
bool "Create JSON info files per build image" | ||
default BUILDBOT | ||
help | ||
The JSON info files contain information about the device and | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Suggestion: The generated JSON files, named after the base name of image (e.g. "openwrt-ath79-generic-8dev_carambola2..."), will be stored in the same directory as built image files. Each JSON file contains meta information about the devices supported by a family of images There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thank you I will update that |
||
build images, stored next to the firmware images. | ||
|
||
config ALL_NONSHARED | ||
bool "Select all target specific packages by default" | ||
select ALL_KMODS | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -571,7 +571,32 @@ define Device/Build/image | |
|
||
$(BIN_DIR)/$(call IMAGE_NAME,$(1),$(2)): $(KDIR)/tmp/$(call IMAGE_NAME,$(1),$(2)) | ||
cp $$^ $$@ | ||
|
||
$(if $(CONFIG_JSON_ADD_IMAGE_INFO), \ | ||
DEVICE_ID="$(DEVICE_NAME)" \ | ||
BIN_DIR="$(BIN_DIR)" \ | ||
IMAGE_NAME="$(IMAGE_NAME)" \ | ||
IMAGE_TYPE=$(word 1,$(subst ., ,$(2))) \ | ||
IMAGE_PREFIX="$(IMAGE_PREFIX)" \ | ||
DEVICE_VENDOR="$(DEVICE_VENDOR)" \ | ||
DEVICE_MODEL="$(DEVICE_MODEL)" \ | ||
DEVICE_VARIANT="$(DEVICE_VARIANT)" \ | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would suppress an empty VARIANT in json file instead of the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why suppress it? Reading it from a any other script would cause an empty string "" instead of a key error, what do you think? |
||
DEVICE_ALT0_VENDOR="$(DEVICE_ALT0_VENDOR)" \ | ||
DEVICE_ALT0_MODEL="$(DEVICE_ALT0_MODEL)" \ | ||
DEVICE_ALT0_VARIANT="$(DEVICE_ALT0_VARIANT)" \ | ||
DEVICE_ALT1_VENDOR="$(DEVICE_ALT1_VENDOR)" \ | ||
DEVICE_ALT1_MODEL="$(DEVICE_ALT1_MODEL)" \ | ||
DEVICE_ALT1_VARIANT="$(DEVICE_ALT1_VARIANT)" \ | ||
DEVICE_ALT2_VENDOR="$(DEVICE_ALT2_VENDOR)" \ | ||
DEVICE_ALT2_MODEL="$(DEVICE_ALT2_MODEL)" \ | ||
DEVICE_ALT2_VARIANT="$(DEVICE_ALT2_VARIANT)" \ | ||
DEVICE_TITLE="$(DEVICE_TITLE)" \ | ||
TARGET="$(BOARD)" \ | ||
SUBTARGET="$(SUBTARGET)" \ | ||
VERSION_NUMBER="$(VERSION_NUMBER)" \ | ||
VERSION_CODE="$(VERSION_CODE)" \ | ||
SUPPORTED_DEVICES="$(SUPPORTED_DEVICES)" \ | ||
$(TOPDIR)/scripts/json_add_image_info.py \ | ||
) | ||
endef | ||
|
||
define Device/Build/artifact | ||
|
@@ -589,6 +614,8 @@ define Device/Build/artifact | |
endef | ||
|
||
define Device/Build | ||
$(shell rm -f $(BIN_DIR)/$(IMG_PREFIX)-$(1).json) | ||
|
||
$(if $(CONFIG_TARGET_ROOTFS_INITRAMFS),$(call Device/Build/initramfs,$(1))) | ||
$(call Device/Build/kernel,$(1)) | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
#!/usr/bin/env python3 | ||
|
||
import json | ||
import os | ||
import hashlib | ||
|
||
|
||
def e(variable, default=None): | ||
return os.environ.get(variable, default) | ||
|
||
|
||
json_path = "{}{}{}.json".format(e("BIN_DIR"), os.sep, e("IMAGE_PREFIX")) | ||
|
||
with open(os.path.join(e("BIN_DIR"), e("IMAGE_NAME")), "rb") as image_file: | ||
image_hash = hashlib.sha256(image_file.read()).hexdigest() | ||
|
||
|
||
def get_titles(): | ||
titles = [] | ||
for prefix in ["", "ALT0_", "ALT1_", "ALT2_"]: | ||
title = {} | ||
for var in ["vendor", "model", "variant"]: | ||
if e("DEVICE_{}{}".format(prefix, var.upper())): | ||
title[var] = e("DEVICE_{}{}".format(prefix, var.upper())) | ||
|
||
if title: | ||
titles.append(title) | ||
|
||
if not titles: | ||
titles.append({"title": e("DEVICE_TITLE")}) | ||
|
||
return titles | ||
|
||
|
||
if not os.path.exists(json_path): | ||
device_info = { | ||
"id": e("DEVICE_ID"), | ||
"image_prefix": e("IMAGE_PREFIX"), | ||
"images": [], | ||
"metadata_version": 1, | ||
"supported_devices": e("SUPPORTED_DEVICES").split(), | ||
"target": "{}/{}".format(e("TARGET"), e("SUBTARGET", "generic")), | ||
"titles": get_titles(), | ||
"version_commit": e("VERSION_CODE"), | ||
"version_number": e("VERSION_NUMBER"), | ||
} | ||
else: | ||
with open(json_path, "r") as json_file: | ||
device_info = json.load(json_file) | ||
|
||
image_info = {"type": e("IMAGE_TYPE"), "name": e("IMAGE_NAME"), "sha256": image_hash} | ||
device_info["images"].append(image_info) | ||
|
||
with open(json_path, "w") as json_file: | ||
json.dump(device_info, json_file, sort_keys=True, indent=" ") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should that be
per built image
?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, actually even
files per build profile
, as a profile may contain multiple images (factory, sysupgrade,...). Will update that