From: Patrick Ohly <patrick.o...@intel.com> If a certain image type can be created both by applying conversion commands to a base type as well as via a specialized command (like a fictious IMAGE_CMD_ext4.xz, or some dedicated task, as indicated by IMAGE_TYPES_MASKED = ext4.xz), then pick the more specialized method and skip generating the conversion commands.
That way developers can choose between using the builtin conversion support or re-implementing certain types, for example more efficiently without intermediate files. [YOCTO #9076] Signed-off-by: Patrick Ohly <patrick.o...@intel.com> Signed-off-by: Ed Bartosh <ed.bart...@linux.intel.com> --- meta/classes/image.bbclass | 21 +++++++++++++-------- meta/classes/image_types.bbclass | 16 +++++++++++++--- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/meta/classes/image.bbclass b/meta/classes/image.bbclass index 5edbca1..d497747 100644 --- a/meta/classes/image.bbclass +++ b/meta/classes/image.bbclass @@ -372,7 +372,7 @@ python () { alltypes.append("debugfs_" + t) def _add_type(t): - baset = image_split_type(t, ctypes)[0] + baset = image_split_type(t, ctypes, d)[0] input_t = t if baset not in basetypes: basetypes[baset]= [] @@ -391,7 +391,7 @@ python () { if dep not in alltypes: alltypes.append(dep) _add_type(dep) - basedep = image_split_type(dep, ctypes)[0] + basedep = image_split_type(dep, ctypes, d)[0] typedeps[baset].add(basedep) if baset != input_t: @@ -442,14 +442,17 @@ python () { d.delVarFlag('IMAGE_CMD_' + realt, 'func') rm_tmp_images = set() - def gen_conversion_cmds(bt): + def gen_conversion_cmds(basetype, type): + if basetype == type: + # Done, no further conversions needed. + return for ctype in ctypes: - if bt[bt.find('.') + 1:] == ctype: - type = bt[0:-len(ctype) - 1] + if type.endswith("." + ctype): + type = type[0:-len(ctype) - 1] if type.startswith("debugfs_"): type = type[8:] # Create input image first. - gen_conversion_cmds(type) + gen_conversion_cmds(basetype, type) localdata.setVar('type', type) cmd = "\t" + (localdata.getVar("CONVERSION_CMD_" + ctype, True) or localdata.getVar("COMPRESS_CMD_" + ctype, True)) if cmd not in cmds: @@ -462,8 +465,10 @@ python () { if type not in alltypes: rm_tmp_images.add(localdata.expand("${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.${type}")) - for bt in basetypes[t]: - gen_conversion_cmds(bt) + for type in basetypes[t]: + # Probably t == bt, but better check explicitly, perhaps that'll change. + bt = image_split_type(type, ctypes, d)[0] + gen_conversion_cmds(bt, type) localdata.setVar('type', realt) if t not in alltypes: diff --git a/meta/classes/image_types.bbclass b/meta/classes/image_types.bbclass index e632fd1..8a5346e 100644 --- a/meta/classes/image_types.bbclass +++ b/meta/classes/image_types.bbclass @@ -9,10 +9,20 @@ IMAGE_NAME_SUFFIX ??= ".rootfs" # set this value to 2048 (2MiB alignment). IMAGE_ROOTFS_ALIGNMENT ?= "1" -def image_split_type(type, allctypes): +def image_split_type(type, allctypes, d): '''Returns (basetype, set of compression types in use).''' basetype = type compressiontypes = set() + + # Abort stripping the type further if "basetype" has a matching + # IMAGE_CMD or is a masked image type. For example, if there + # was a fictional IMAGE_CMD_ext4.xz which creates a compressed + # file directly, then we should use that instead of using + # IMAGE_CMD_ext4 + CONVERSION_CMD_xz. + if d.getVar('IMAGE_CMD_' + basetype, True) or \ + basetype in d.getVar('IMAGE_TYPES_MASKED', True).split(): + return (basetype, compressiontypes) + for ctype in allctypes: if type.endswith("." + ctype): basetype = type[:-len("." + ctype)] @@ -21,7 +31,7 @@ def image_split_type(type, allctypes): if basetype != type: # New base type itself might be generated by a conversion command. - basetype, newctypes = image_split_type(basetype, allctypes) + basetype, newctypes = image_split_type(basetype, allctypes, d) compressiontypes.update(newctypes) return (basetype, compressiontypes) @@ -38,7 +48,7 @@ def image_getdepends(d): deps = [] ctypes = set(d.getVar('CONVERSIONTYPES', True).split()) for type in (d.getVar('IMAGE_FSTYPES', True) or "").split(): - basetype, compressiontypes = image_split_type(type, ctypes) + basetype, compressiontypes = image_split_type(type, ctypes, d) for ctype in compressiontypes: adddep(d.getVar("CONVERSION_DEPENDS_%s" % ctype, True), deps) for typedepends in (d.getVar("IMAGE_TYPEDEP_%s" % basetype, True) or "").split(): -- 2.1.4 -- _______________________________________________ Openembedded-core mailing list Openembedded-core@lists.openembedded.org http://lists.openembedded.org/mailman/listinfo/openembedded-core