binman: Remove templates after use
authorSimon Glass <sjg@chromium.org>
Sun, 23 Jul 2023 03:43:56 +0000 (21:43 -0600)
committerSimon Glass <sjg@chromium.org>
Wed, 2 Aug 2023 18:05:57 +0000 (12:05 -0600)
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>
tools/binman/binman.rst
tools/binman/control.py
tools/binman/ftest.py

index 67bc3e8..147fbc5 100644 (file)
@@ -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
index 963f9b9..da33c88 100644 (file)
@@ -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:
@@ -519,6 +519,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
 
@@ -566,6 +573,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:
index b15f5ac..ecada41 100644 (file)
@@ -6871,6 +6871,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')