binman: Move 'external' support into base class

At present we have an Entry_blob_ext which implement a blob which holds an
external binary. We need to support other entry types that hold external
binaries, e.g. Entry_blob_named_by_arg. Move the support into the base
Entry class to allow this.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass 2020-09-01 05:13:57 -06:00
parent 211cfa503f
commit 8795898a53
5 changed files with 24 additions and 25 deletions

View file

@ -692,7 +692,7 @@ Properties / Entry arguments: (see binman README for more information)
when writing out the map when writing out the map
Properties: Properties:
_allow_missing: True if this section permits external blobs to be allow_missing: True if this section permits external blobs to be
missing their contents. The second will produce an image but of missing their contents. The second will produce an image but of
course it will not work. course it will not work.

View file

@ -57,6 +57,10 @@ class Entry(object):
compress: Compression algoithm used (e.g. 'lz4'), 'none' if none compress: Compression algoithm used (e.g. 'lz4'), 'none' if none
orig_offset: Original offset value read from node orig_offset: Original offset value read from node
orig_size: Original size value read from node orig_size: Original size value read from node
missing: True if this entry is missing its contents
allow_missing: Allow children of this entry to be missing (used by
subclasses such as Entry_section)
external: True if this entry contains an external binary blob
""" """
def __init__(self, section, etype, node, name_prefix=''): def __init__(self, section, etype, node, name_prefix=''):
# Put this here to allow entry-docs and help to work without libfdt # Put this here to allow entry-docs and help to work without libfdt
@ -83,6 +87,8 @@ class Entry(object):
self._expand_size = False self._expand_size = False
self.compress = 'none' self.compress = 'none'
self.missing = False self.missing = False
self.external = False
self.allow_missing = False
@staticmethod @staticmethod
def Lookup(node_path, etype): def Lookup(node_path, etype):
@ -813,3 +819,11 @@ features to produce new behaviours.
""" """
if self.missing: if self.missing:
missing_list.append(self) missing_list.append(self)
def GetAllowMissing(self):
"""Get whether a section allows missing external blobs
Returns:
True if allowed, False if not allowed
"""
return self.allow_missing

View file

@ -37,7 +37,13 @@ class Entry_blob(Entry):
def ObtainContents(self): def ObtainContents(self):
self._filename = self.GetDefaultFilename() self._filename = self.GetDefaultFilename()
self._pathname = tools.GetInputFilename(self._filename) self._pathname = tools.GetInputFilename(self._filename,
self.section.GetAllowMissing())
# Allow the file to be missing
if self.external and not self._pathname:
self.SetContents(b'')
self.missing = True
return True
self.ReadBlobContents() self.ReadBlobContents()
return True return True

View file

@ -26,14 +26,3 @@ class Entry_blob_ext(Entry_blob):
def __init__(self, section, etype, node): def __init__(self, section, etype, node):
Entry_blob.__init__(self, section, etype, node) Entry_blob.__init__(self, section, etype, node)
self.external = True self.external = True
def ObtainContents(self):
self._filename = self.GetDefaultFilename()
self._pathname = tools.GetInputFilename(self._filename,
self.section.GetAllowMissing())
# Allow the file to be missing
if not self._pathname:
self.SetContents(b'')
self.missing = True
return True
return super().ObtainContents()

View file

@ -35,7 +35,7 @@ class Entry_section(Entry):
when writing out the map when writing out the map
Properties: Properties:
_allow_missing: True if this section permits external blobs to be allow_missing: True if this section permits external blobs to be
missing their contents. The second will produce an image but of missing their contents. The second will produce an image but of
course it will not work. course it will not work.
@ -54,8 +54,6 @@ class Entry_section(Entry):
self._sort = False self._sort = False
self._skip_at_start = None self._skip_at_start = None
self._end_4gb = False self._end_4gb = False
self._allow_missing = False
self.missing = False
def ReadNode(self): def ReadNode(self):
"""Read properties from the image node""" """Read properties from the image node"""
@ -549,18 +547,10 @@ class Entry_section(Entry):
Args: Args:
allow_missing: True if allowed, False if not allowed allow_missing: True if allowed, False if not allowed
""" """
self._allow_missing = allow_missing self.allow_missing = allow_missing
for entry in self._entries.values(): for entry in self._entries.values():
entry.SetAllowMissing(allow_missing) entry.SetAllowMissing(allow_missing)
def GetAllowMissing(self):
"""Get whether a section allows missing external blobs
Returns:
True if allowed, False if not allowed
"""
return self._allow_missing
def CheckMissing(self, missing_list): def CheckMissing(self, missing_list):
"""Check if any entries in this section have missing external blobs """Check if any entries in this section have missing external blobs