summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRogerio Guerra Borin <rogerio.borin@toradex.com>2023-12-13 00:25:48 -0300
committerMax Krummenacher <max.krummenacher@toradex.com>2024-01-21 13:26:03 +0100
commitfa8aab8528cd119d318c53b19148ab4397833c92 (patch)
tree3ebe2c8805b2cbe8ea629ceee07190e70548d1d0
parent5c19725fcd25e5f3a4c0f680ad055446969504a5 (diff)
image_type_tezi: allow populating "filelist" field
The "filelist" property allows extra files to be copied into the target filesystem at image installation time. With this implementation we let users fill in that property at build-time; this is done by settting the value of the OE variable TEZI_ROOT_FILELIST. The files referenced by that variable will also become part of the Toradex Easy Installer image. Relate-to: TOR-2915 Signed-off-by: Rogerio Guerra Borin <rogerio.borin@toradex.com> (cherry picked from commit c4c08c8a099fb40b455701cc7364e0d905443e4f)
-rw-r--r--classes/image_type_tezi.bbclass93
1 files changed, 81 insertions, 12 deletions
diff --git a/classes/image_type_tezi.bbclass b/classes/image_type_tezi.bbclass
index 877045b..2c7c432 100644
--- a/classes/image_type_tezi.bbclass
+++ b/classes/image_type_tezi.bbclass
@@ -31,6 +31,7 @@ TEZI_ROOT_FSOPTS ?= "-E nodiscard"
TEZI_ROOT_LABEL ??= "RFS"
TEZI_ROOT_NAME ??= "rootfs"
TEZI_ROOT_SUFFIX ??= "tar.xz"
+TEZI_ROOT_FILELIST ??= ""
TEZI_USE_BOOTFILES ??= "true"
TEZI_AUTO_INSTALL ??= "false"
TEZI_BOOT_SUFFIX ??= "${@'bootfs.tar.xz' if oe.types.boolean('${TEZI_USE_BOOTFILES}') else ''}"
@@ -77,6 +78,59 @@ def get_bootfs_part_size(d):
part_size = 3 * 2 ** (1 + int(log(get_uncompressed_size(d, 'bootfs'), 2)))
return max(16, part_size)
+def get_filelist_var(d, varname):
+ filelist = d.getVar(varname)
+ if not filelist:
+ return None
+ import re
+ return re.split(r"\s+", filelist.strip())
+
+def get_tezi_filelist_artifacts(d):
+ filelist = get_filelist_var(d, 'TEZI_ROOT_FILELIST')
+ if not filelist:
+ return None
+ artifacts = []
+ for entry in filelist:
+ artifacts.append(entry.split(":")[0])
+ return artifacts
+
+# Determine the storage space required for the given "filelist".
+def get_filelist_extra_size(d, filelist):
+ import shlex
+ import subprocess
+
+ extra_size = 0
+ for entry in filelist:
+ unpack = False
+ flds = entry.split(":")
+ fpath = os.path.join(d.getVar('IMGDEPLOYDIR'), flds[0])
+ # Any non-empty string is considered as true except the strings "0" and
+ # "false"; this is to be compatible with the QVariant used by Tezi.
+ if len(flds) >= 3 and (flds[2] and flds[2].lower() not in ["0", "false"]):
+ unpack = True
+ if unpack and fpath.endswith(".zip"):
+ # Deal with .zip files only:
+ cmd = ("unzip -p %s | wc -c" % shlex.quote(fpath))
+ bb.debug(1, "Running command [%s]" % cmd)
+ outp = subprocess.check_output(cmd, shell=True)
+ size = int(outp)
+ bb.debug(1, "Unpacked size of '%s': %d (bytes)" % (fpath, size))
+ elif unpack:
+ # Deal with .tar.(gz|xz|bz2|lzo|zstd):
+ cmd = ("tar -xf %s -O | wc -c" % shlex.quote(fpath))
+ bb.debug(1, "Running command [%s]" % cmd)
+ outp = subprocess.check_output(cmd, shell=True)
+ size = int(outp)
+ bb.debug(1, "Unpacked size of '%s': %d (bytes)" % (fpath, size))
+ else:
+ stat = os.stat(fpath)
+ size = stat.st_size
+ bb.debug(1, "Size of '%s': %d (bytes)" % (fpath, size))
+ extra_size += size
+
+ # Returned size is in MB.
+ return float(extra_size) / 1024 / 1024
+
# Whitespace separated list of files declared by 'deploy_var' variable
# from 'source_dir' (DEPLOY_DIR_IMAGE by default) to place in 'deploy_dir'.
# Entries will be installed under a same name as the source file. To change
@@ -185,18 +239,24 @@ def rootfs_tezi_emmc(d, use_bootfiles):
}
})
- filesystem_partitions.append(
- {
- "partition_size_nominal": 512,
- "want_maximised": True,
- "content": {
- "label": d.getVar('TEZI_ROOT_LABEL'),
- "filesystem_type": d.getVar('TEZI_ROOT_FSTYPE'),
- "mkfs_options": d.getVar('TEZI_ROOT_FSOPTS'),
- "filename": imagename + "." + d.getVar('TEZI_ROOT_SUFFIX'),
- "uncompressed_size": get_uncompressed_size(d, d.getVar('TEZI_ROOT_NAME'))
- }
- })
+ rootfs = {
+ "partition_size_nominal": 512,
+ "want_maximised": True,
+ "content": {
+ "label": d.getVar('TEZI_ROOT_LABEL'),
+ "filesystem_type": d.getVar('TEZI_ROOT_FSTYPE'),
+ "mkfs_options": d.getVar('TEZI_ROOT_FSOPTS'),
+ "filename": imagename + "." + d.getVar('TEZI_ROOT_SUFFIX'),
+ "uncompressed_size": get_uncompressed_size(d, d.getVar('TEZI_ROOT_NAME'))
+ }
+ }
+
+ rootfs_filelist = get_filelist_var(d, 'TEZI_ROOT_FILELIST')
+ if rootfs_filelist:
+ rootfs["content"]["filelist"] = rootfs_filelist
+ rootfs["content"]["uncompressed_size"] += get_filelist_extra_size(d, rootfs_filelist)
+
+ filesystem_partitions.append(rootfs)
return [
OrderedDict({
@@ -252,6 +312,11 @@ def rootfs_tezi_rawnand(d):
}
}
+ rootfs_filelist = get_filelist_var(d, 'TEZI_ROOT_FILELIST')
+ if rootfs_filelist:
+ rootfs["content"]["filelist"] = rootfs_filelist
+ rootfs["content"]["uncompressed_size"] += get_filelist_extra_size(d, rootfs_filelist)
+
kernel = {
"name": "kernel",
"size_kib": 12288,
@@ -379,6 +444,10 @@ python rootfs_tezi_run_json() {
bb.fatal("Toradex flash type unknown")
artifacts += " " + uenv_file + " " + uboot_file
+ artifacts_fl = get_tezi_filelist_artifacts(d)
+ if artifacts_fl:
+ for artifact in artifacts_fl:
+ artifacts += " %s/%s" % (d.getVar('IMGDEPLOYDIR'), artifact)
d.setVar("TEZI_ARTIFACTS", artifacts)
rootfs_tezi_json(d, flash_type, flash_data, "image-%s.json" % d.getVar('IMAGE_BASENAME'), uenv_file)