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

Ulf Magnusson ulfalizer at gmail.com
Fri Sep 30 22:54:14 UTC 2016


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'.

Cheers,
Ulf



More information about the Openembedded-core mailing list