On Sat, Oct 1, 2016 at 12:54 AM, Ulf Magnusson <ulfali...@gmail.com> wrote: > On Fri, Sep 30, 2016 at 10:33 PM, Fabio Berton > <fabio.ber...@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.ber...@ossystems.com.br> >> Signed-off-by: Otavio Salvador <ota...@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 -- _______________________________________________ Openembedded-core mailing list Openembedded-core@lists.openembedded.org http://lists.openembedded.org/mailman/listinfo/openembedded-core