build: store artifacts in JSON
authorPaul Spooren <mail@aparcar.org>
Mon, 13 Sep 2021 09:44:04 +0000 (23:44 -1000)
committerPaul Spooren <mail@aparcar.org>
Tue, 14 Sep 2021 20:42:38 +0000 (10:42 -1000)
Multiple profiles create artifacts, these should be stored in the JSON
file as well, allowing downstream tooling to show those files, too.

Artifacts don't have specific filesystems so only the fields `name`,
`type` and `sha256` are available.

Rename env variable names from IMAGE_ to FILE_ prefixes to reflect that
images, kernels and artifacts are added with the same command.

Signed-off-by: Paul Spooren <mail@aparcar.org>
include/image.mk
scripts/json_add_image_info.py

index 6298e3085eb9fd4e4952b4980e1d25e23d94a38b..1150f84ce5b747511438550c63d5a35c73bc48ef 100644 (file)
@@ -494,9 +494,9 @@ define Device/Build/initramfs
        DEVICE_ID="$(1)" \
        BIN_DIR="$(BIN_DIR)" \
        SOURCE_DATE_EPOCH=$(SOURCE_DATE_EPOCH) \
-       DEVICE_IMG_NAME="$$(notdir $$^)" \
-       IMAGE_TYPE="kernel" \
-       IMAGE_FILESYSTEM="initramfs" \
+       FILE_NAME="$$(notdir $$^)" \
+       FILE_TYPE="kernel" \
+       FILE_FILESYSTEM="initramfs" \
        DEVICE_IMG_PREFIX="$$(DEVICE_IMG_PREFIX)" \
        DEVICE_VENDOR="$$(DEVICE_VENDOR)" \
        DEVICE_MODEL="$$(DEVICE_MODEL)" \
@@ -601,9 +601,9 @@ define Device/Build/image
        DEVICE_ID="$(DEVICE_NAME)" \
        BIN_DIR="$(BIN_DIR)" \
        SOURCE_DATE_EPOCH=$(SOURCE_DATE_EPOCH) \
-       DEVICE_IMG_NAME="$(DEVICE_IMG_NAME)" \
-       IMAGE_TYPE=$(word 1,$(subst ., ,$(2))) \
-       IMAGE_FILESYSTEM="$(1)" \
+       FILE_NAME="$(DEVICE_IMG_NAME)" \
+       FILE_TYPE=$(word 1,$(subst ., ,$(2))) \
+       FILE_FILESYSTEM="$(1)" \
        DEVICE_IMG_PREFIX="$(DEVICE_IMG_PREFIX)" \
        DEVICE_VENDOR="$(DEVICE_VENDOR)" \
        DEVICE_MODEL="$(DEVICE_MODEL)" \
@@ -629,7 +629,9 @@ define Device/Build/image
 endef
 
 define Device/Build/artifact
-  $$(_TARGET): $(BIN_DIR)/$(DEVICE_IMG_PREFIX)-$(1)
+  $$(_TARGET): $(if $(CONFIG_JSON_OVERVIEW_IMAGE_INFO), \
+         $(BUILD_DIR)/json_info_files/$(DEVICE_IMG_PREFIX)-$(1).json, \
+         $(BIN_DIR)/$(DEVICE_IMG_PREFIX)-$(1))
   $(eval $(call Device/Export,$(KDIR)/tmp/$(DEVICE_IMG_PREFIX)-$(1)))
   $(KDIR)/tmp/$(DEVICE_IMG_PREFIX)-$(1): $$(KDIR_KERNEL_IMAGE) $(2)-images
        @rm -f $$@
@@ -640,6 +642,35 @@ define Device/Build/artifact
   $(BIN_DIR)/$(DEVICE_IMG_PREFIX)-$(1): $(KDIR)/tmp/$(DEVICE_IMG_PREFIX)-$(1)
        cp $$^ $$@
 
+  $(BUILD_DIR)/json_info_files/$(DEVICE_IMG_PREFIX)-$(1).json: $(BIN_DIR)/$(DEVICE_IMG_PREFIX)-$(1)
+       @mkdir -p $$(shell dirname $$@)
+       DEVICE_ID="$(DEVICE_NAME)" \
+       BIN_DIR="$(BIN_DIR)" \
+       SOURCE_DATE_EPOCH=$(SOURCE_DATE_EPOCH) \
+       FILE_NAME="$(DEVICE_IMG_PREFIX)-$(1)" \
+       FILE_TYPE="$(1)" \
+       DEVICE_IMG_PREFIX="$(DEVICE_IMG_PREFIX)" \
+       DEVICE_VENDOR="$(DEVICE_VENDOR)" \
+       DEVICE_MODEL="$(DEVICE_MODEL)" \
+       DEVICE_VARIANT="$(DEVICE_VARIANT)" \
+       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)" \
+       DEVICE_PACKAGES="$(DEVICE_PACKAGES)" \
+       TARGET="$(BOARD)" \
+       SUBTARGET="$(if $(SUBTARGET),$(SUBTARGET),generic)" \
+       VERSION_NUMBER="$(VERSION_NUMBER)" \
+       VERSION_CODE="$(VERSION_CODE)" \
+       SUPPORTED_DEVICES="$(SUPPORTED_DEVICES)" \
+       $(TOPDIR)/scripts/json_add_image_info.py $$@
+
 endef
 
 define Device/Build
index 38cd3c487d00a8809d0a7df4ecc4cbc12cfe52b8..23033f9fc480910a1a906c33d5ec6c6422d309dd 100755 (executable)
@@ -12,10 +12,10 @@ if len(argv) != 2:
 
 json_path = Path(argv[1])
 bin_dir = Path(getenv("BIN_DIR"))
-image_file = bin_dir / getenv("DEVICE_IMG_NAME")
+file_path = bin_dir / getenv("FILE_NAME")
 
-if not image_file.is_file():
-    print("Skip JSON creation for non existing image ", image_file)
+if not file_path.is_file():
+    print("Skip JSON creation for non existing file", file_path)
     exit(0)
 
 
@@ -37,9 +37,9 @@ def get_titles():
 
 
 device_id = getenv("DEVICE_ID")
-image_hash = hashlib.sha256(image_file.read_bytes()).hexdigest()
+file_hash = hashlib.sha256(file_path.read_bytes()).hexdigest()
 
-image_info = {
+file_info = {
     "metadata_version": 1,
     "target": "{}/{}".format(getenv("TARGET"), getenv("SUBTARGET")),
     "version_code": getenv("VERSION_CODE"),
@@ -50,10 +50,9 @@ image_info = {
             "image_prefix": getenv("DEVICE_IMG_PREFIX"),
             "images": [
                 {
-                    "type": getenv("IMAGE_TYPE"),
-                    "filesystem": getenv("IMAGE_FILESYSTEM"),
-                    "name": getenv("DEVICE_IMG_NAME"),
-                    "sha256": image_hash,
+                    "type": getenv("FILE_TYPE"),
+                    "name": getenv("FILE_NAME"),
+                    "sha256": file_hash,
                 }
             ],
             "device_packages": getenv("DEVICE_PACKAGES").split(),
@@ -63,4 +62,9 @@ image_info = {
     },
 }
 
-json_path.write_text(json.dumps(image_info, separators=(",", ":")))
+if getenv("FILE_FILESYSTEM"):
+    file_info["profiles"][device_id]["images"][0]["filesystem"] = getenv(
+        "FILE_FILESYSTEM"
+    )
+
+json_path.write_text(json.dumps(file_info, separators=(",", ":")))