diff mbox series

[v2,5/6] binman: Remove templates after use

Message ID 20230723034406.87673-6-sjg@chromium.org
State Accepted
Commit af41b24ebac86f25145f39f4eec4467d4c501bed
Delegated to: Simon Glass
Headers show
Series binman: Template fixes and improvements | expand

Commit Message

Simon Glass July 23, 2023, 3:43 a.m. UTC
It is not necessary to keep templates around after they have been
processed. They can cause confusion and potentially duplicate phandles.

Remove them.

Use the same means of detecting a template node in _ReadImageDesc so that
the two places are consistent.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

(no changes since v1)

 tools/binman/binman.rst |  8 +++++---
 tools/binman/control.py | 14 +++++++++++++-
 tools/binman/ftest.py   |  7 +++++++
 3 files changed, 25 insertions(+), 4 deletions(-)

Comments

Simon Glass Aug. 2, 2023, 6:07 p.m. UTC | #1
It is not necessary to keep templates around after they have been
processed. They can cause confusion and potentially duplicate phandles.

Remove them.

Use the same means of detecting a template node in _ReadImageDesc so that
the two places are consistent.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

(no changes since v1)

 tools/binman/binman.rst |  8 +++++---
 tools/binman/control.py | 14 +++++++++++++-
 tools/binman/ftest.py   |  7 +++++++
 3 files changed, 25 insertions(+), 4 deletions(-)

Applied to u-boot-dm, thanks!
diff mbox series

Patch

diff --git a/tools/binman/binman.rst b/tools/binman/binman.rst
index 67bc3e87531b..147fbc5ff1b9 100644
--- a/tools/binman/binman.rst
+++ b/tools/binman/binman.rst
@@ -1256,11 +1256,13 @@  Properties in the template node are inserted into the destination node if they
 do not exist there. In the example above, `some-property` is added to each of
 `spi-image` and `mmc-image`.
 
+Note that template nodes are removed from the binman description after
+processing and before binman builds the image descriptions.
+
 The initial devicetree produced by the templating process is written to the
 `u-boot.dtb.tmpl1` file. This can be useful to see what is going on if there is
-a failure before the final `u-boot.dtb.out` file is written.
-
-Note that template nodes are not removed from the binman description at present.
+a failure before the final `u-boot.dtb.out` file is written. A second
+`u-boot.dtb.tmpl2` file is written when the templates themselves are removed.
 
 
 Updating an ELF file
diff --git a/tools/binman/control.py b/tools/binman/control.py
index 9a9a4817eeaf..3857f50e6436 100644
--- a/tools/binman/control.py
+++ b/tools/binman/control.py
@@ -57,7 +57,7 @@  def _ReadImageDesc(binman_node, use_expanded):
     images = OrderedDict()
     if 'multiple-images' in binman_node.props:
         for node in binman_node.subnodes:
-            if 'template' not in node.name:
+            if not node.name.startswith('template'):
                 images[node.name] = Image(node.name, node,
                                           use_expanded=use_expanded)
     else:
@@ -511,6 +511,13 @@  def _ProcessTemplates(parent):
         found |= _ProcessTemplates(node)
     return found
 
+def _RemoveTemplates(parent):
+    """Remove any templates in the binman description
+    """
+    for node in parent.subnodes:
+        if node.name.startswith('template'):
+            node.Delete()
+
 def PrepareImagesAndDtbs(dtb_fname, select_images, update_fdt, use_expanded):
     """Prepare the images to be processed and select the device tree
 
@@ -558,6 +565,11 @@  def PrepareImagesAndDtbs(dtb_fname, select_images, update_fdt, use_expanded):
         fname = tools.get_output_filename('u-boot.dtb.tmpl1')
         tools.write_file(fname, dtb.GetContents())
 
+        _RemoveTemplates(node)
+        dtb.Sync(True)
+        fname = tools.get_output_filename('u-boot.dtb.tmpl2')
+        tools.write_file(fname, dtb.GetContents())
+
     images = _ReadImageDesc(node, use_expanded)
 
     if select_images:
diff --git a/tools/binman/ftest.py b/tools/binman/ftest.py
index 80d41cf5c35f..7ea4797ad6ac 100644
--- a/tools/binman/ftest.py
+++ b/tools/binman/ftest.py
@@ -6802,6 +6802,13 @@  fdt         fdtmap                Extract the devicetree blob from the fdtmap
         vga = dtb.GetNode('/binman/first/intel-vga')
         self.assertTrue(vga)
 
+        dtb_fname2 = tools.get_output_filename('u-boot.dtb.tmpl2')
+        self.assertTrue(os.path.exists(dtb_fname2))
+        dtb2 = fdt.Fdt.FromData(tools.read_file(dtb_fname2))
+        dtb2.Scan()
+        node2 = dtb2.GetNode('/binman/template')
+        self.assertFalse(node2)
+
     def testTemplateBlobMulti(self):
         """Test using a template with 'multiple-images' enabled"""
         TestFunctional._MakeInputFile('my-blob.bin', b'blob')