[OE-core] [PATCH 1/2] classes/uboot-extlinux-config: Add class

Fabio Berton fabio.berton at ossystems.com.br
Mon Oct 3 12:09:41 UTC 2016


Hi Ulf,

Thanks for review.

I agree and I'll change code and use bb.fatal() instead of FuncFailed and
send a v2.

Fabio

On Fri, Sep 30, 2016 at 8:07 PM, Ulf Magnusson <ulfalizer at gmail.com> wrote:

> On Sat, Oct 1, 2016 at 12:54 AM, Ulf Magnusson <ulfalizer at gmail.com>
> wrote:
> > On Fri, Sep 30, 2016 at 10:33 PM, Fabio Berton
> > <fabio.berton at ossystems.com.br> wrote:
> >> This class allow the extlinux.conf generation for U-Boot use.
> >> The U-Boot support for it is given to allow the Generic Distribution
> >> Configuration specification use by OpenEmbedded-based products.
> >>
> >> This class can be inherited by u-boot recipes to create extlinux.conf
> >> and boot using menu options.
> >>
> >> U-boot with extlinux support is machine dependent, so to use this class
> >> you need to set UBOOT_EXTLINUX to 1 in machine configuration file and
> >> also set root= kernel cmdline UBOOT_EXTLINUX_ROOT. This variable is used
> >> to pass root kernel cmdline, e.g:
> >>
> >> UBOOT_EXTLINUX_ROOT = "root=/dev/mmcblk2p2"
> >>
> >> Signed-off-by: Fabio Berton <fabio.berton at ossystems.com.br>
> >> Signed-off-by: Otavio Salvador <otavio at ossystems.com.br>
> >> ---
> >>  meta/classes/uboot-extlinux-config.bbclass | 130
> +++++++++++++++++++++++++++++
> >>  1 file changed, 130 insertions(+)
> >>  create mode 100644 meta/classes/uboot-extlinux-config.bbclass
> >>
> >> diff --git a/meta/classes/uboot-extlinux-config.bbclass
> b/meta/classes/uboot-extlinux-config.bbclass
> >> new file mode 100644
> >> index 0000000..3480dd6
> >> --- /dev/null
> >> +++ b/meta/classes/uboot-extlinux-config.bbclass
> >> @@ -0,0 +1,130 @@
> >> +# uboot-extlinux-config.bbclass
> >> +#
> >> +# This class allow the extlinux.conf generation for U-Boot use. The
> >> +# U-Boot support for it is given to allow the Generic Distribution
> >> +# Configuration specification use by OpenEmbedded-based products.
> >> +#
> >> +# External variables:
> >> +#
> >> +# UBOOT_EXTLINUX_CONFIG            - Configuration file default set to
> source dir.
> >> +# UBOOT_EXTLINUX_CONSOLE           - Set to "console=ttyX" to change
> kernel boot
> >> +#                                    default console.
> >> +# UBOOT_EXTLINUX_LABELS            - A list of targets for the
> automatic config.
> >> +# UBOOT_EXTLINUX_KERNEL_ARGS       - Add additional kernel arguments.
> >> +# UBOOT_EXTLINUX_KERNEL_IMAGE      - Kernel image name.
> >> +# UBOOT_EXTLINUX_FDTDIR            - Device tree directory.
> >> +# UBOOT_EXTLINUX_INITRD            - Indicates a list of filesystem
> images to
> >> +#                                    concatenate and use as an initrd
> (optional).
> >> +# UBOOT_EXTLINUX_MENU_DESCRIPTION  - Name to use as description.
> >> +# UBOOT_EXTLINUX_ROOT              - Root kernel cmdline.
> >> +#
> >> +# If there's only one label system will boot automatically and menu
> won't be
> >> +# created. If you want to use more than one labels, e.g linux and
> alternate,
> >> +# use overrides to set menu description, console and others variables.
> >> +#
> >> +# Ex:
> >> +#
> >> +# UBOOT_EXTLINUX_LABELS ??= "default fallback"
> >> +#
> >> +# UBOOT_EXTLINUX_KERNEL_IMAGE_default ??= "../zImage"
> >> +# UBOOT_EXTLINUX_MENU_DESCRIPTION_default ??= "Linux Default"
> >> +#
> >> +# UBOOT_EXTLINUX_KERNEL_IMAGE_fallback ??= "../zImage-fallback"
> >> +# UBOOT_EXTLINUX_MENU_DESCRIPTION_fallback ??= "Linux Fallback"
> >> +#
> >> +# Results:
> >> +#
> >> +# menu title Select the boot mode
> >> +# LABEL Linux Default
> >> +#   KERNEL ../zImage
> >> +#   FDTDIR ../
> >> +#   APPEND root=/dev/mmcblk2p2 rootwait rw console=${console}
> >> +# LABEL Linux Fallback
> >> +#   KERNEL ../zImage-fallback
> >> +#   FDTDIR ../
> >> +#   APPEND root=/dev/mmcblk2p2 rootwait rw console=${console}
> >> +#
> >> +# Copyright (C) 2016, O.S. Systems Software LTDA.  All Rights Reserved
> >> +# Released under the MIT license (see packages/COPYING)
> >> +#
> >> +# The kernel has an internal default console, which you can override
> with
> >> +# a console=...some_tty...
> >> +UBOOT_EXTLINUX_CONSOLE ??= "console=${console}"
> >> +UBOOT_EXTLINUX_CONFIG ??= "${S}/extlinux.conf"
> >> +UBOOT_EXTLINUX_LABELS ??= "linux"
> >> +UBOOT_EXTLINUX_FDTDIR ??= "../"
> >> +UBOOT_EXTLINUX_KERNEL_IMAGE ??= "../${KERNEL_IMAGETYPE}"
> >> +UBOOT_EXTLINUX_KERNEL_ARGS ??= "rootwait rw"
> >> +UBOOT_EXTLINUX_MENU_DESCRIPTION_linux ??= "${DISTRO_NAME}"
> >> +
> >> +python create_extlinux_config() {
> >> +    if d.getVar("UBOOT_EXTLINUX", False) == "1":
> >> +        workdir = d.getVar('WORKDIR', True)
> >> +        if not workdir:
> >> +            bb.error("WORKDIR not defined, unable to package")
> >> +            return
> >> +
> >> +        labels = d.getVar('UBOOT_EXTLINUX_LABELS', True)
> >> +        if not labels:
> >> +            bb.debug(1, "UBOOT_EXTLINUX_LABELS not defined, nothing to
> do")
> >> +            return
> >> +
> >> +        if labels == []:
> >> +            bb.debug(1, "No labels, nothing to do")
> >> +            return
> >> +
> >> +        cfile = d.getVar('UBOOT_EXTLINUX_CONFIG', True)
> >> +        if not cfile:
> >> +            raise bb.build.FuncFailed('Unable to read
> UBOOT_EXTLINUX_CONFIG')
> >> +
> >> +        try:
> >> +            cfgfile = open(cfile, 'w')
> >> +        except OSError:
> >> +            raise bb.build.FuncFailed('Unable to open %s' % (cfile))
> >> +
> >> +        cfgfile.write('# Generic Distro Configuration file generated
> by OpenEmbedded\n')
> >> +
> >> +        if len(labels.split()) > 1:
> >> +            cfgfile.write('menu title Select the boot mode\n')
> >> +
> >> +        for label in labels.split():
> >> +            localdata = bb.data.createCopy(d)
> >> +
> >> +            overrides = localdata.getVar('OVERRIDES', True)
> >> +            if not overrides:
> >> +                raise bb.build.FuncFailed('OVERRIDES not defined')
> >> +
> >> +            localdata.setVar('OVERRIDES', label + ':' + overrides)
> >> +            bb.data.update_data(localdata)
> >> +
> >> +            extlinux_console = localdata.getVar('UBOOT_EXTLINUX_CONSOLE',
> True)
> >> +
> >> +            menu_description = localdata.getVar('UBOOT_EXTLINUX_MENU_DESCRIPTION',
> True)
> >> +            if not menu_description:
> >> +                menu_description = label
> >> +
> >> +            root = localdata.getVar('UBOOT_EXTLINUX_ROOT', True)
> >> +            if not root:
> >> +                raise bb.build.FuncFailed('UBOOT_EXTLINUX_ROOT not
> defined')
> >> +
> >> +            kernel_image = localdata.getVar('UBOOT_EXTLINUX_KERNEL_IMAGE',
> True)
> >> +            fdtdir = localdata.getVar('UBOOT_EXTLINUX_FDTDIR', True)
> >> +            if fdtdir:
> >> +                cfgfile.write('LABEL %s\n\tKERNEL %s\n\tFDTDIR %s\n' %
> >> +                             (menu_description, kernel_image, fdtdir))
> >> +            else:
> >> +                cfgfile.write('LABEL %s\n\tKERNEL %s\n' %
> (menu_description, kernel_image))
> >> +
> >> +            kernel_args = localdata.getVar('UBOOT_EXTLINUX_KERNEL_ARGS',
> True)
> >> +
> >> +            initrd = localdata.getVar('UBOOT_EXTLINUX_INITRD', True)
> >> +            if initrd:
> >> +                cfgfile.write('\tINITRD %s\n'% initrd)
> >> +
> >> +            kernel_args = root + " " + kernel_args
> >> +            cfgfile.write('\tAPPEND %s %s\n' % (kernel_args,
> extlinux_console))
> >> +
> >> +        cfgfile.close()
> >> +}
> >> +
> >> +do_install[prefuncs] += "create_extlinux_config"
> >> --
> >> 2.1.4
> >>
> >> --
> >
> > Out of personal curiosity, when would 'raise bb.build.FuncFailed(msg)'
> > be preferred over bb.fatal(msg)?
> >
> > Looking at the FuncFailed() constructor, it seems the argument was
> > originally meant to be the name of the function, though no one seems
> > to use it like that. It's still called 'name'.
>
> Looks like bitbake/lib/bb/build.py raises a FuncFailed with the
> function name. That one's raised as a side effect of calling
> bb.fatal() too, after bb.fatal() logs the message and raises
> BBHandledException.
>
> Got the following on IRC, so seems bb.fatal() might be more appropriate:
>
> < kergoth> the *original* intent was for the function/task to error
> via whatever appropriate means, bb.fatal, whatever, and funcfailed was
> what you'd catch if you were calling exec_func/exec_task. that is,
> it's what those functions raise, not what metadata functions should be
> raising
> < kergoth> it didn't end up being used that way
> < kergoth> but there's really never a reason to raise it yourself
>
> Cheers,
> Ulf
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openembedded.org/pipermail/openembedded-core/attachments/20161003/158dbf75/attachment-0002.html>


More information about the Openembedded-core mailing list