Handle IMAGE_BOOT_FILES having wildcard patterns for dtbs. This requires
that the recipe depend on the deployment of the dtbs in order for the
correct file names to be expanded.

This change also improves the parsing of the IMAGE_BOOT_FILES variable
and splits out the python functions for doing this into a separate
image-wic-utils.bbclass file.

Signed-off-by: Nathan Rossi <nat...@nathanrossi.com>
---
 meta-xilinx-bsp/classes/image-wic-utils.bbclass    | 51 ++++++++++++++++++++
 .../recipes-bsp/u-boot/u-boot-zynq-uenv.bb         | 55 ++++++++--------------
 2 files changed, 71 insertions(+), 35 deletions(-)
 create mode 100644 meta-xilinx-bsp/classes/image-wic-utils.bbclass

diff --git a/meta-xilinx-bsp/classes/image-wic-utils.bbclass 
b/meta-xilinx-bsp/classes/image-wic-utils.bbclass
new file mode 100644
index 0000000000..6f66d553e7
--- /dev/null
+++ b/meta-xilinx-bsp/classes/image-wic-utils.bbclass
@@ -0,0 +1,51 @@
+# Helper/utility functions to work with the IMAGE_BOOT_FILES variable and its
+# expected behvaior with regards to the contents of the DEPLOY_DIR_IMAGE.
+#
+# The use of these functions assume that the deploy directory is populated with
+# any dependent files/etc. Such that the recipe using these functions depends
+# on the recipe that provides the files being used/queried.
+
+def boot_files_split_expand(d):
+    # IMAGE_BOOT_FILES has extra renaming info in the format 
'<source>;<target>'
+    for f in (d.getVar("IMAGE_BOOT_FILES") or "").split(" "):
+        parts = f.split(";", 1)
+        sources = [parts[0]]
+        if "*" in parts[0]:
+            # has glob part
+            import glob
+            deployroot = d.getVar("DEPLOY_DIR_IMAGE")
+            sources = []
+            for i in glob.glob(os.path.join(deployroot, parts[0])):
+                sources.append(os.path.basename(i))
+
+        # for all sources, yield an entry
+        for s in sources:
+            if len(parts) == 2:
+                yield s, parts[1]
+            yield s, s
+
+def boot_files_bitstream(d):
+    expectedfiles = [("bitstream", True)]
+    expectedexts = [(".bit", True), (".bin", False)]
+    # search for bitstream paths, use the renamed file. First matching is used
+    for source, target in boot_files_split_expand(d):
+        # skip boot.bin and u-boot.bin, it is not a bitstream
+        skip = ["boot.bin", "u-boot.bin"]
+        if source in skip or target in skip:
+            continue
+
+        for e, t in expectedfiles:
+            if source == e or target == e:
+                return target, t
+        for e, t in expectedexts:
+            if source.endswith(e) or target.endswith(e):
+                return target, t
+    return "", False
+
+def boot_files_dtb_filepath(d):
+    dtbs = (d.getVar("IMAGE_BOOT_FILES") or "").split(" ")
+    for source, target in boot_files_split_expand(d):
+        if target.endswith(".dtb"):
+            return target
+    return ""
+
diff --git a/meta-xilinx-bsp/recipes-bsp/u-boot/u-boot-zynq-uenv.bb 
b/meta-xilinx-bsp/recipes-bsp/u-boot/u-boot-zynq-uenv.bb
index f6c2a00d4b..952077d12a 100644
--- a/meta-xilinx-bsp/recipes-bsp/u-boot/u-boot-zynq-uenv.bb
+++ b/meta-xilinx-bsp/recipes-bsp/u-boot/u-boot-zynq-uenv.bb
@@ -5,43 +5,28 @@ LIC_FILES_CHKSUM = 
"file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda
 INHIBIT_DEFAULT_DEPS = "1"
 PACKAGE_ARCH = "${MACHINE_ARCH}"
 
+python () {
+    # The device trees must be populated in the deploy directory to correctly
+    # detect them and their names. This means that this recipe needs to depend
+    # on those deployables just like the image recipe does.
+    deploydeps = ["virtual/kernel"]
+    for i in (d.getVar("MACHINE_ESSENTIAL_EXTRA_RDEPENDS") or "").split():
+        if i != d.getVar("BPN"):
+            deploydeps.append(i)
+    for i in (d.getVar("EXTRA_IMAGEDEPENDS") or "").split():
+        if i != d.getVar("BPN"):
+            deploydeps.append(i)
+
+    # add as DEPENDS since the targets might not have do_deploy tasks
+    if len(deploydeps) != 0:
+        d.appendVar("DEPENDS", " " + " ".join(deploydeps))
+}
+
 COMPATIBLE_MACHINE = "^$"
 COMPATIBLE_MACHINE_zynq = ".*"
 COMPATIBLE_MACHINE_zynqmp = ".*"
 
-inherit deploy
-
-def bootfiles_bitstream(d):
-    expectedfiles = [("bitstream", True)]
-    expectedexts = [(".bit", True), (".bin", False)]
-    # search for bitstream paths, use the renamed file. First matching is used
-    for f in (d.getVar("IMAGE_BOOT_FILES") or "").split():
-        sf, rf = f, f
-        if ';' in f:
-            sf, rf = f.split(';')
-
-        # skip boot.bin and u-boot.bin, it is not a bitstream
-        skip = ["boot.bin", "u-boot.bin"]
-        if sf in skip or rf in skip:
-            continue
-
-        for e, t in expectedfiles:
-            if sf == e or rf == e:
-                return rf, t
-        for e, t in expectedexts:
-            if sf.endswith(e) or rf.endswith(e):
-                return rf, t
-    return "", False
-
-def bootfiles_dtb_filepath(d):
-    if d.getVar("IMAGE_BOOT_FILES"):
-        dtbs = d.getVar("IMAGE_BOOT_FILES").split(" ")
-        # IMAGE_BOOT_FILES has extra renaming info in the format 
'<source>;<target>'
-        dtbs = [f.split(";")[0] for f in dtbs]
-        dtbs = [f for f in dtbs if f.endswith(".dtb")]
-        if len(dtbs) != 0:
-            return dtbs[0]
-    return ""
+inherit deploy image-wic-utils
 
 def uboot_boot_cmd(d):
     if d.getVar("KERNEL_IMAGETYPE") in ["uImage", "fitImage"]:
@@ -61,7 +46,7 @@ def uenv_populate(d):
     env["kernel_image"] = d.getVar("KERNEL_IMAGETYPE")
     env["kernel_load_address"] = d.getVar("KERNEL_LOAD_ADDRESS")
 
-    env["devicetree_image"] = bootfiles_dtb_filepath(d)
+    env["devicetree_image"] = boot_files_dtb_filepath(d)
     env["devicetree_load_address"] = d.getVar("DEVICETREE_LOAD_ADDRESS")
 
     env["bootargs"] = d.getVar("KERNEL_BOOTARGS")
@@ -73,7 +58,7 @@ def uenv_populate(d):
     # default uenvcmd does not load bitstream
     env["uenvcmd"] = "run bootkernel"
 
-    bitstream, bitstreamtype = bootfiles_bitstream(d)
+    bitstream, bitstreamtype = boot_files_bitstream(d)
     if bitstream:
         env["bitstream_image"] = bitstream
         env["bitstream_load_address"] = "0x100000"
-- 
2.15.1

-- 
_______________________________________________
meta-xilinx mailing list
meta-xilinx@yoctoproject.org
https://lists.yoctoproject.org/listinfo/meta-xilinx

Reply via email to