[yocto] RFC: Yocto BSP and kernel usability tools

McClintock Matthew-B29882 B29882 at freescale.com
Tue Dec 27 16:36:17 PST 2011


(This probably belongs somewhere inline but I got lost on the long email)

A lot of times users would already have a git tree containing linux
and/or u-boot already working for their boards. Perhaps you could let
the user point at external linux and/or u-boot trees with defconfigs,
u-boot configs, device trees, etc for their target BSP?

-M

On Mon, Dec 19, 2011 at 10:55 AM, Tom Zanussi <tom.zanussi at intel.com> wrote:
> Hi,
>
> This is what I hope to implement in the M2 timeframe.
>
> Any and all comments welcome...
>
> Thanks,
>
> Tom
>
> ---
>
> Getting Yocto running on a new board is often a prerequisite task to
> the real task of interest for new users, which is creating new
> applications designed to run on the board, or creating new
> board-specific embedded systems.  In other words, most users just want
> to get the hardware up and running and not have to think too much
> about it before moving on to what they're really interested in, which
> is the stuff running on top of it.
>
> While there really can't be any such thing as a magic-bullet
> application that would do that automatically i.e. generate and
> maintain a guaranteed-working Yocto BSP for any given piece of
> hardware, it should at least be possible to provide a tool that would
> generate a base BSP usable as a starting point for that, and which
> would additionally allow the user to tweak various BSP settings,
> including kernel configuration options and simple kernel patches.
> Such a tool should be usable with only a minimal understanding of the
> Yocto build system and metadata, and with no knowledge at all of
> kernel internals or the Yocto kernel recipe bindings, or of the
> details of the internals of yocto kernel repositories, or in fact any
> knowledge of git or any other specific build-related tool.
>
> This document provides the design for such a tool.  At a high level,
> the goal of the tool is to provide a user the means of creating a new
> Yocto BSP from which it should be possible (assuming a perfect
> run-time outcome, admittedly unlikely on a first pass) to submit a
> 'pull request' for inclusion into any repo(s) that would accept an
> 'official' Yocto BSP.  For example, the output of the tool should
> produce metadata and kernel configuration that would be directly
> mergeable into the meta-intel and the linux-yocto kernel repos.  The
> tool should also allow the BSP maintainer to afterwards at any time
> make changes to the kernel configuration and/or submit kernel patches
> for the BSP.
>
> Note that although knowledge of the Yocto kernel or kernel internals
> is not expected, the user is expected to know the basics of how to
> deal with the linux kernel at the 'user' level, specifically
> understanding and determining the specific kernel config options
> needed for the user's BSP.
>
> Specifically, the tool will allow for the following high-level tasks,
> which are discussed in more detail below:
>
> - create a new BSP from scratch from a set of user-settable parameters
> - manage individual kernel config settings
> - create and use groups of kernel config settings as KERNEL_FEATUREs
> - apply patches to a BSP's machine branch
>
> The following capabilities are specifically not provided by the tool:
>
> - help in determining a 'correct' set of kernel config options to set.
>  The tool assumes the user already knows that, either through diffs
>  of .config files before and after using 'bitbake -c menuconfig', or
>  some other means.
>
> - modification of the BSP metadata after BSP creation.  The tool
>  provides an initial 'write-once' BSP-generation capability, but
>  doesn't allow it to be read in and modified after the initial pass.
>  The user will have to make further modifications manually.  The one
>  exception to this is kernel features, which can be added to an
>  already existing kernel bbappend file.
>
> - a guarantee or even expectation that the generated BSP will work on
>  the actual hardware it's targeted for - it's highly unlikely the BSP
>  will work 'out-of-the-box' and it's the developer's reponsibility to
>  do the often hard work of figuring out what settings and/or code are
>  actually needed to get the hardware to work as expected.  The goal
>  of the tool is to make that job easier, not to actually do that job.
>
> Also, though it's not explicitly a requirement of this tool, the
> design should be sufficiently modular to allow for its participation
> in generic logical pipelines.  For instance, while the tool may
> present to the user a text-based UI for gathering information, it
> should also be able to operate without any kind of user interaction
> and retrieve the data it needs from a file, for instance e.g.:
>
>  $ yocto-bsp create < x86-input.json
>
> Another example that the design should not preclude would be its use
> at the end of a bsp-import pipeline e.g.:
>
>  $ cat 3rdparty.bsp | 3rdparty2yocto | yocto-bsp create
>
> The tool will initially be implemented as a set of command-line tools
> which will essentially be thin layers on top of a modular Python API;
> future tools may be GUI-based but would make use of the functionality
> exposed through the same API.  There might also be an opportunity for
> future integration into existing tools such as hob; this isn't
> explicitly catered for in the current design, but it should be
> possible to do that based either on the functionality provided by the
> command-line interface or equivalently via the Python module API.
>
>
> A Quick Overview
> ----------------
>
> The initial set of tools will comprise 'yocto-bsp', for creating Yocto
> BSPs, and 'yocto-kernel', for BSP and BSP-related Yocto kernel
> maintenance tasks on existing BSPs.
>
> The interface and detailed description of each tool are described
> below, and the underlying templating mechanism is described following
> that, but it would be good for context to first try to give an overall
> picture of how the tools were designed to work and be used together.
>
> The envisioned usage model is that a user would first start out by
> creating a new BSP for a given architecture by invoking the 'yocto-bsp
> create' command.  Choosing the architecture essentially chooses a set
> of files that the BSP will be based on.  This set of files is a
> combination of a set of 'common' files that all BSPs inherit and a set
> of architecture-specific files that match the specified architecture.
>
> Neither set of files can be used unmodified on their own as simple
> static copies of the originals in order to create a working BSP for a
> real machine - many of those files need to be tailored for the
> hardware using information supplied by the user.  To accomplish this
> in an automated way, both the specific portions of the BSP files that
> need to be filled in with user input, and the means of (optionally)
> getting that input from the user are included as in-line annotations
> to the BSP files themselves using a simple templating scheme based on
> conventions used by web2py.  Essentially, in the default case, the
> templating system is used to generate a series of text-based prompts
> that ask the user questions about the BSP being created.  The data
> supplied by the user is then used to fill in the missing information
> in the BSP files.  The user can also choose to specify all the
> information needed directly to the 'yocto-bsp create' command
> invocation itself; the 'yocto-bsp list' command exists to provide the
> user the list of 'properties' and enumerations of possible values for
> those properties, which taken together represent the data items needed
> to generate the BSP.  The user can even more directly supply the
> information as a json object representing a serialized python
> dictionary, which is what the templating interface uses natively to
> represent properties and values needed for BSP generation.
>
> The end result is a Yocto-compliant BSP that should be directly
> buildable by the Yocto build system.  The generated BSP is completely
> self-contained - it includes not only the BSP metadata, but also the
> necessary kernel components, which are normally for BSPs contained in
> the linux-yocto repo's meta and machine branches for the BSP.  In
> order to help make the tool more efficient for the user, the tool does
> everything it needs to locally by initially using the linux-yocto
> SRC_URI; once ready, the user can then migrate the kernel components
> to an actual linux-yocto repo by using the 'yocto-kernel migrate'
> command.  Once that's done, the user is in a position to submit both
> the BSP metadata and the linux-yocto commits upstream.
>
> Once a BSP is created, the job of 'yocto-bsp' is done (in the initial
> version of the tools - it may have sub-commands added later that could
> possibly manage the non-kernel aspects of a BSP) and the
> 'yocto-kernel' command can be used going forward to maintain the
> kernel portion of a BSP.  'yocto-kernel' allows both bare kernel
> config items and higher-level 'kernel features' to be created, used
> and removed, patches to be added to a BSP's machine branch, and the
> kernel changes to a BSP migrated to a linux-yocto repo.  These
> have typically been difficult tasks for many users; the hope is that
> 'yocto-kernel' will make those tasks more manageable for everyone.
>
> The sections below describe each tool in detail.
>
> Following those sections is a detailed description of the templating
> mechanism, useful for anyone who needs to create templates for
> creating new BSPs using the 'yocto-bsp create' tool.
>
>
> The top-level bsp-creation tool, 'yocto-bsp'
> ============================================
>
> All of the functionality of the Yocto bsp-creation tool is available
> via the single 'yocto-bsp' command.  Access to the specific functions
> provided by the tool is accomplished by specifying sub-commands to the
> main 'yocto-bsp' command.  The design of the command-line interface is
> based on similar interfaces provided by git and perf, which is
> familiar to many users and is easily extensible.
>
> Usage help is always available for the command itself as well as for
> all sub-commands.  Executing the top-level command displays a list of
> the available sub-commands, with descriptions:
>
>  $ yocto-bsp
>
>  usage: yocto-bsp [--version] [--help] COMMAND [ARGS]
>
>  The most commonly used 'yocto-bsp' commands are:
>   create            Create a new Yocto BSP
>   list              List available values for options and BSP properties
>
>  See 'yocto-bsp help COMMAND' for more information on a specific command.
>
>
> 'yocto-bsp create' - Create a new Yocto BSP
> -------------------------------------------
>
> NAME
>    yocto-bsp-create - Create a new Yocto BSP
>
> SYNOPSIS
>    yocto-bsp create <bsp-name> <karch> <kmachine>
>        [--property <NAME:VAL> | -p <NAME:VAL>]
>
> DESCRIPTION
>    This command creates a Yocto BSP based on the specified
>    parameters.  The new BSP will be a new Yocto BSP layer contained
>    within the top-level directory specified as bsp-name i.e. not
>    'meta-bsp-name'.  The value of the 'karch' parameter determines
>    the set of files that will be generated for the BSP, along with
>    the specific set of 'properties' that will be used to fill out the
>    BSP-specific portions of the BSP.
>
>    The BSP-specific properties that define the values that will be
>    used to generate a particular BSP can be specified on the
>    comman-line using the --property option for each property, which
>    is a colon-separated name:value pair.
>
>    The set of properties and enumerations of their possible values
>    can be displayed using the 'yocto-bsp list' command.
>
>    It isn't necessary however for the user to explicitly specify the
>    property values using --property options - if none are specified
>    in the 'yocto-bsp create' invocation, the user will be
>    interactively prompted for each of the required property values,
>    which will then be used as values for BSP generation.
>
>    The 'kmachine' parameter names the 'machine branch' that the BSP's
>    machine branch will be based on; the list of branches meaningful
>    for that purpose can also be listed using the 'yocto-bsp list'
>    command.
>
>    The 'yocto-bsp list' command can also be used to list the possible
>    values for the 'karch' parameter.
>
>    An typical example that would query the user for property values
>    would be:
>
>    $ yocto-bsp create meta-foo i386 yocto/standard/common-pc/foo
>
>    Because the user hasn't specified any values for the BSP
>    properties, yocto-bsp will query the user for each of the
>    unspecified property values required to create the BSP i.e. the
>    properties listed by 'yocto-bsp list properties'.
>
>    Here's an example using explicitly-specified properties:
>
>    $ yocto-bsp create meta-foo i386 yocto/standard/common-pc/foo
>       --property tunefile:tune-atom --property touchscreen:true
>       --property kfeature:cfg/smp [...]
>
>
> 'yocto-bsp list' - List available values for options and BSP properties
> -----------------------------------------------------------------------
>
> NAME
>    yocto-bsp-list - List available values for options and BSP properties
>
> SYNOPSIS
>    yocto bsp list <karch | kmachine>
>    yocto bsp list <karch> properties
>    yocto bsp list <karch> property <xxx>
>
> DESCRIPTION
>    This command enumerates the complete set of possible values for a
>    specified option or property needed by the BSP creation process.
>
>    The first form enumerates all the possible values that exist and
>    can be specified for the 'karch' or 'kmachine' parameters to the
>    'yocto bsp create' command.  Example output for those options:
>
>     $ yocto-bsp list karch
>         i386
>         x86_64
>         arm
>         powerpc
>         mips
>
>     $ yocto-bsp list kmachine
>         yocto
>         yocto/standard
>         yocto/standard/common-pc
>         yocto/standard/common-pc-64
>         yocto/standard/preempt-rt
>
>    The second form enumerates all the possible properties that exist
>    and must have values specified for them in the 'yocto bsp create'
>    command for the given 'karch'.  Example output for that command:
>
>     $ yocto-bsp list i386 properties
>         "machine": boolean,
>          "kmachine": choice,
>          "tunefile": choicelist,
>          "smp": boolean,
>          "xserver": choicelist
>              ["xserver-choice": choice]
>          "kfeatures": choicelist
>              ["kfeature": choice]
>           "touchscreen": boolean,
>           "keyboard": boolean
>
>    The third form enumerates all the possible values that exist and
>    can be specified for any of the enumerable properties of the given
>    'karch' in the 'yocto bsp create' command.  Example output for
>    those properties:
>
>     $ yocto-bsp list i386 property xserver
>          xserver-vesa
>          xserver-i915
>          xserver-emgd
>
>     $ yocto-bsp list i386 property kfeatures
>          features/taskstats
>          cfg/sound
>
>     $ yocto-bsp list i386 property tunefile
>          i386
>              tune-atom
>              tune-core2
>
>     $ yocto-bsp list x86_64 property tunefile
>          x86_64
>              tune-x86_64
>              tune-corei7
>              tune-ivb
>
>     $ yocto-bsp list powerpc property tunefile
>          powerpc
>              tune-ppc603e
>              tune-ppce300c2
>              tune-ppce500
>              tune-ppce500mc
>              tune-ppce500v2
>              tune-ppce5500-32b
>              tune-ppce5500-64b
>
>     $ yocto-bsp list arm property tunefile
>          arm
>              tune-arm1136jf-s
>              tune-arm920t
>              tune-arm926ejs
>              tune-arm9tdmi
>              tune-armv7
>
>     $ yocto-bsp list mips property tunefile
>          mips
>              tune-mips32
>
>
> The top-level kernel usability tool, 'yocto-kernel'
> ===================================================
>
> All of the functionality of the Yocto kernel usability tool is
> available via the single 'yocto-kernel' command.  Access to the
> specific functions provided by the tool is accomplished by specifying
> sub-commands to the main 'yocto-kernel' command.  The design of the
> command-line interface is based on similar interfaces provided by git
> and perf, which is familiar to many users and is easily extensible.
>
> Usage help is always available for the command itself as well as for
> all sub-commands.  Executing the top-level command displays a list of
> the available sub-commands, with descriptions:
>
>  $ yocto-kernel
>
>  usage: yocto-kernel [--version] [--help] COMMAND [ARGS]
>
>  The most commonly used 'yocto-kernel' commands are:
>   feature-list      List available Yocto KERNEL_FEATUREs
>   feature-define    Define a new Yocto KERNEL_FEATURE
>   feature-add       Add Yocto KERNEL_FEATUREs to a BSP
>   feature-rm        Remove Yocto KERNEL_FEATUREs from a BSP
>   config-list       List the modifiable set of bare kernel config options for a BSP
>   config-add        Add or modify bare kernel config options for a BSP
>   config-rm         Remove bare kernel config options from a BSP
>   patch-add         Patch the Yocto kernel for a specific BSP
>   migrate           Move local kernel config/patches to a git repo
>
>  See 'yocto-kernel help COMMAND' for more information on a specific command.
>
>
> 'yocto-kernel feature list' - List available Yocto KERNEL_FEATUREs
> ------------------------------------------------------------------
>
> NAME
>    yocto-kernel-feature-list - List available Yocto KERNEL_FEATUREs
>
> SYNOPSIS
>    yocto-kernel feature list <bsp-name> --used
>
> DESCRIPTION
>    This command lists all the kernel features available to a BSP.
>    This includes any features temporarily attached to the named BSP
>    via the 'feature define' command and thus the reason this command
>    takes bsp-name as a parameter.
>
>    If the --used param is specified, only the KERNEL_FEATURES used by
>    the BSP are listed.
>
>
> 'yocto-kernel feature define' - Define a new Yocto KERNEL_FEATURE
> -----------------------------------------------------------------
>
> NAME
>    yocto-kernel-feature-define - Define a new Yocto KERNEL_FEATURE
>
> SYNOPSIS
>    yocto-kernel feature define <bsp-name> <feature-name> <feature-desc>
>    [<CONFIG_XXX=x> ...] [--dirname <dirname>] [--policy <hw|non-hw>]
>
> DESCRIPTION
>    This command defines a new kernel feature, resulting in the
>    addition of two new files for feature xxx to the named BSP's
>    SRC_URI.  If dirname is specified, the feature files will be named
>    features_dirname_xxx.cfg and features_dirname_xxx.scc.  Otherwise,
>    the features will be named cfg_xxx.cfg and cfg_xxx.scc.  The idea
>    behind the naming is that the names reflect the user's intent to
>    have the feature migrated to either the kernel-cache/cfg or
>    kernel-cache/features directory if/when the kernel portion of the
>    BSP is migrated into the linux-yocto kernel repo.
>
>    The policy stating whether the new feature is considered to be a
>    hardware or a non-hardware feature also needs to be specified in
>    order to create a new feature, and a description of the new
>    feature is also required; this will be added as a comment to the
>    .scc file.
>
>    NOTE: Although features are not BSP-specific, until the user has
>    gone through the steps of migrating a feature to the linux-yocto
>    repo, it needs to live somewhere accessible to the BSP metadata,
>    which logically would be the kernel SRC_URI for the BSP using it.
>
>    NOTE: It's up to the user to determine whether or not the config
>    options for a feature being added make sense or not - this command
>    does no sanity checking or verification of any kind to ensure that
>    the config options contained in a kernel feature really make sense
>    and will actually be set in in the final config.  For example, if
>    a config option depends on other config options, it will be turned
>    off by kconfig if the other options aren't set correctly.
>
>
> 'yocto-kernel feature add' - Add Yocto KERNEL_FEATUREs to a BSP
> ---------------------------------------------------------------
>
> NAME
>    yocto-kernel-feature-add - Add Yocto KERNEL_FEATUREs to a BSP
>
> SYNOPSIS
>    yocto-kernel feature add <bsp-name> [<FEATURE> ...]
>
> DESCRIPTION
>
>    This command adds one or more kernel features to a BSP.  The set
>    of features available to be added by this command for a BSP can be
>    found via the 'yocto-kernel feature list' command.  This command
>    essentially adds a new machine-specific KERNEL_FEATURE_append to
>    the linux-yocto .bbappend for the BSP.
>
>
> 'yocto-kernel feature rm' - Remove Yocto KERNEL_FEATUREs from a BSP
> -------------------------------------------------------------------
>
> NAME
>    yocto-kernel-feature-rm - Remove Yocto KERNEL_FEATUREs from a BSP
>
> SYNOPSIS
>    yocto-kernel feature rm <bsp-name> [<FEATURE> ...]
>
> DESCRIPTION
>
>    This command removes one or more kernel features from a BSP.  The
>    set of features available to be removed by this command for a BSP
>    can be found via the 'yocto-kernel feature list' command, if the
>    --used option to that command is specified.  This command
>    essentially removes a machine-specific KERNEL_FEATURE from the
>    linux-yocto .bbappend for the BSP.
>
>
> 'yocto-kernel config list' - List a BSP's modifiable config options
> -------------------------------------------------------------------
>
> NAME
>    yocto-kernel-config-list - List the modifiable set of bare kernel
>    config options for a BSP
>
> SYNOPSIS
>    yocto-kernel config list <bsp-name>
>
> DESCRIPTION
>    This command lists the 'modifiable' config items for a BSP
>    i.e. the items which are eligible for modification or removal by
>    other yocto-kernel commands.
>
>    'modifiable' config items are the config items contained a BSP's
>    foo.cfg base config.
>
>
> 'yocto-kernel config add' - Add or modify a BSP's kernel config options
> -----------------------------------------------------------------------
>
> NAME
>    yocto-kernel-config-add - Add or modify bare kernel config options
>    for a BSP
>
> SYNOPSIS
>    yocto-kernel config add <bsp-name> [<CONFIG_XXX=x> ...]
>
> DESCRIPTION
>    This command adds one or more CONFIG_XXX=x items to a BSP's
>    foo.cfg base config.  If a config item is already present, the new
>    value will simply overwrite the old value.
>
>    NOTE: It's up to the user to determine whether or not the config
>    options being added make sense or not - this command does no
>    sanity checking or verification of any kind to ensure that a
>    config option really makes sense and will actually be set in in
>    the final config.  For example, if a config option depends on
>    other config options, it will be turned off by kconfig if the
>    other options aren't set correctly.
>
>
> 'yocto-kernel config rm' - Remove BSP kernel config options
> -----------------------------------------------------------
>
> NAME
>    yocto-kernel-config-rm - Remove bare kernel config options from a
>    BSP
>
> SYNOPSIS
>    yocto-kernel config rm <bsp-name> [<CONFIG_XXX> ...]
>
> DESCRIPTION
>    This command removes (turns off) one or more CONFIG_XXX items to a
>    BSP's foo.cfg base config.
>
>    The set of config items available to be removed by this command
>    for a BSP can be found via the 'yocto-kernel config list'
>    command.
>
>
> 'yocto-kernel patch add' - Patch the Yocto kernel for a specific BSP
> --------------------------------------------------------------------
>
> NAME
>    yocto-kernel-patch-add - Patch the Yocto kernel for a specific BSP
>
> SYNOPSIS
>    yocto-kernel patch add <bsp-name> [<PATCH> ...]
>
> DESCRIPTION
>    This command adds one or more patches to a BSP's machine branch.
>    The patch will be added to the BSP's linux-yocto kernel SRC_URI
>    and will be guaranteed to be applied in the order specified.
>
>    NOTE: It's up to the user to determine whether or not the patches
>    being added makes sense or not - this command does no sanity
>    checking or verification of any kind to ensure that a patch can
>    actually be applied to the BSP's kernel branch; it's assumed that
>    the user has already done that.
>
>
> 'yocto-kernel migrate' - Move local kernel config/patches to a git repo
> -----------------------------------------------------------------------
>
> NAME
>    yocto-kernel-migrate - Move local kernel config/patches to a git repo
>
> SYNOPSIS
>    yocto-kernel migrate <bsp-name> <local linux-yocto repo>
>
> DESCRIPTION
>    This command converts the kernel configuration changes, patches,
>    and features collected in a BSP's linux-yocto SRC_URI into an
>    equivalent set of commits in a local linux-yocto repo.  On
>    success, the local files will named in the SRC_URI will be
>    removed, and the linux-yocto .bbappend will be fixed up to point
>    to the new repo.
>
>    NOTE: The user is responsible for submitting the generated commits
>    upstream and subsequently modifying the kernel .bbappend to
>    use the upsteam kernel repo.
>
>
> The design of the 'yocto-bsp create' templating mechanism
> ==========================================================
>
> This section describes the details of the templating mechanism used by
> 'yocto-bsp' to generate BSPs.
>
> Generating a new BSP is basically a templating exercise.  A given BSP
> is comprised of a combination of a set of common files that all BSPs
> share along with a set of files specific to a given BSP type.  Many of
> the files in both sets need to be configured according to the needs of
> the BSP; this also extends to the naming and existence of the files
> themselves.
>
> The templating scheme used in the Yocto tool is partly inspired by
> ideas from web2py, but adapted to a more general input mechanism for
> the specific problems posed by Yocto.
>
> There are no special files, just marked-up BSP metadata and kernel
> configuration, .scc, and patch files.
>
> The Yocto BSP markup is meant to be extremely simple and limited to
> pretty much this initial set of items; it is however designed to be
> extensible enough to cover any future need.
>
> Anything within double braces is considered to be a Yocto BSP markup
> tag:
>
> {{ foo }}
>
> Anything within double braces and starting with {{= is considered to
> implement simple variable replacement, where variables are by default
> simply keys in a dictionary representing the BSP and containing values
> for the whole BSP:
>
> {{=machine}}
>
> The above means that the whole expression will be replaced with the
> value of the 'machine' entry in the BSP dictionary.  The syntax is
> actually shorthand for the equivalent Python code for accessing the
> value of a given key, but isn't restricted to that e.g. it could
> reference a local variable defined in a previous tag, for instance.
>
> In every other case, the 'yocto-bsp' tool will pre-process the
> contents looking for certain keywords at the beginning.  The rest it
> will treat as Python code.  As of now, there's only one keyword that's
> meaningful:
>
> {{ input }}
>
> which signals that anything contained is input-related.  The
> 'yocto-bsp' implementation will use this information to prompt the
> user for input.  Under certain conditions e.g. when the user has
> already supplied this information via a file for instance, anything
> contained in this is considered a no-op and ignored.
>
> Anything else is considered to be Python code and will be directly
> incorporated into the BSP generation code.
>
> {{ if keyboard == False: }}
>
> Note also that any of the above can also be used in file and directory
> names, which will also be processed in the same way; this allows us to
> avoid extraneous files is consistent with the rest of the scheme.
>
> Internally, the way things are envisioned to work is that the tool
> will first read in the set of files that makes up the BSP for the
> chosen architecture.  It will then pre-process all the 'input' tags it
> finds and use that to prepare a series of text-based prompts to
> retrieve the needed information from the user.  The end result of
> presenting all that to the user will be a completd BSP dictionary
> containing all the key/value pairs needed to fill in the BSP.  Once
> that information is available, it will make a second pass over the
> remaining tags and fill them in with the Python code needed to
> retrieve and replace the remaining tags with their corresponding
> values from the BSP dictionary (or any other source possibly
> introduced by other tags).  The end result of this second pass will be
> executed as Python code to produce the final BSP metadata.
>
> For the first version, the 'input' tags will be used to construct a
> series of text-based questions for the user.  The design, however,
> should make it relatively trivial to create an application that could
> create real GUI that would do the same thing at some later point.  For
> example, such an application could use the input tags to generate a
> web-based form, which would return the results gathered from the user
> to a web service in the form of a json blob that could directly be
> converted into the BSP Python dictionary needed. e.g. the browser
> would return something like this to the web service, which would in
> turn send it to the 'bsp-create' library function to create the final
> BSP.
>
> {
>    "machine": "foo",
>    "kmachine": "/yocto/standard/base",
>    "tunefile": "tune-atom",
>    "smp": true,
>    "xserver": {
>             "xserver-choice": "xserver-i915",
>    },
>    "kfeatures": [
>             "kfeature": "features/taskstats",
>             "kfeature": "cfg/sound",
>             ]
>    },
>    touchscreen: false,
>    keyboard: true
> }
>
> Below are some concrete examples of specific tags and how they're used.
>
> Here's a simple example of markup that describes information needed
> from the user about touchscreen and keyboard capabilities in the
> formfactor 'machconfig' file:
>
> # Assume a USB mouse and keyboard are connected
> {{ input type:"boolean" name:"touchscreen" msg:"Does your BSP have a touchscreen?" }}
> HAVE_TOUCHSCREEN={{=touchscreen}}
> {{ input type:"boolean" name:"keyboard" msg:"Does your BSP have a keyboard?" }}
> HAVE_KEYBOARD={{=keyboard}}
>
> For instance, the touchscreen 'input' tag above describes everything a
> UI would need in order to retrieve an answer from the user as to
> whether the hardware in question has a touchscreen or not.
>
> The 'type' key comprises a small set of possible input types that
> include things like 'boolean' (yes/no) choices and lists of choices
> (type:"choicelist").
>
> The 'name' key provides a means for later markup to access the value
> of the variable containing the user's answer for that input.  For
> example, the name:"touchscreen" simply references the value in the BSP
> dictionary that was filled in with the user's response to the question
> which was formed and presented to the user using the "msg" tag in the
> input tag.
>
> Below the input tag is the actual content that will be rendered into
> the 'machconfig' file, but with the {{=}} portion replaced with the
> 'touchscreen' value supplied by the user i.e.:
>
> HAVE_TOUCHSCREEN={{=touchscreen}}
>
> will be rendered as:
>
> HAVE_TOUCHSCREEN=0
>
> Assuming the user answered 'no'.
>
> Another interesting thing to note about this example is that in Yocto
> BSPs, the machconfig files are contained within a filesystem location
> that includes the machine name in the path e.g.
>
> recipes-bsp/formfactor/formfactor/foo/machconfig
>
> To accomplish this, the directory names themselves contain markup that
> gets processed and replaced by the tool:
>
> recipes-bsp/formfactor/formfactor/{{=machine}}/machconfig
>
> Here, the {{=machine} directory is renamed to /foo to match the
> machine name of the BSP.
>
> Here's a more involved example, markup included in the
> i386/conf/{{=machine}}.conf file:
>
> {{ input type:"boolean" name:"xserver" msg:"Do you need support for X?" }}
> {{ if xserver: }}
> XSERVER ?= "${XSERVER_IA32_BASE} \
>           ${XSERVER_IA32_EXT} \
> {{ input type:"choicelist" name:"xserver_choice" msg:"Please select an xserver for this machine" }}
> {{ input type:"choice" val:"xserver-vesa" msg:"VESA xserver support" }}
>           ${XSERVER_IA32_VESA} \
> {{ input type:"choice" val:"xserver-emgd" msg:"EMGD xserver support (proprietary)" }}
>           ${XSERVER_IA32_EMGD} \
> {{ input type:"choice" val:"xserver-i915" desc:"i915 xserver support" }}
>           ${XSERVER_IA32_I915} \
>           "
>
> In this case, we start off with a boolean 'input' question asking if
> the BSP needs to support X.  The following line is straight Python
> code which essentially skips the following sections (until a blank
> line) if the user's answer was 'no', or if the answer was 'yes',
> creates a further query to the user asking which xserver type to use.
> In the latter case, the input type is a list of choices resulting in
> the values specified by the 'val' tag appearing as the value for the
> 'xserver_choice' dictionary key.
>
> Code further down in the .conf file can also make use of this
> information to include or exclude content based on the value of the
> xserver_choice variable:
>
> {{ if xserver_choice == "xserver-emgd": }}
> PREFERRED_VERSION_xserver-xorg ?= "1.9.3"
> PREFERRED_VERSION_mesa-dri ?= "7.11"
> PREFERRED_VERSION_emgd-driver-bin ?= "1.8"
>
> {{ if xserver_choice == "xserver-vesa" or xserver_choice == "xserver-emgd": }}
> APPEND += "video=vesafb vga=0x318"
>
> Note again that the tags used to determine whether or not to include
> content simply contain Python code used to directly implement the
> needed logic.  Not only is there no need for the user to learn a
> special-purpose language, but gives the tool the flexibility to add
> essentially any kind of processing logic needed in the future.
>
> In the case of xserver choices, we also need to use the value of
> xserver_choice to determine which xorg.conf file to add to the BSP.
> Again, consistent with the rest of the markup processing, this is
> seamlessly accomplished by adding markup to the filenames themselves:
>
> recipes-graphics/xserver-xf86-config/{{=machine}}/{{ if xserver_choice == xserver_emgd: }} xorg.conf
> recipes-graphics/xserver-xf86-config/{{=machine}}/{{ if xserver_choice == xserver_vesa: }} xorg.conf
> recipes-graphics/xserver-xf86-config/{{=machine}}/{{ if xserver_choice == xserver_i915: }} xorg.conf
>
> In this case, the filenames actually contain Python code that
> describes the conditions needed to include those particular files.
>
> Here's another example, again making use of general-purpose Python in
> the markup to generate an open-ended list of choices for the user, in
> this case in linux-yocto_3.0.bbappend, to generate a list of available
> KERNEL_FEATURES for the user to choose from:
>
> {{ input type:"checklist" name:"kfeatures" gen:"fetch-kernel-features()" msg:"Please choose the kernel features to use in this BSP on" }}
> {{ for kfeature in kfeatures: }}
> KERNEL_FEATURES_append_{{=machine}} += {{=kfeature}}
>
> In this case an 'input' tag calls an internally-defined yocto-bsp
> function named fetch_kernel_feature() that generates the list of
> available KERNEL_FEATURES.  The output of that call is a Python list
> containing the features, which is assigned to the 'kfeatures'
> variable.  The next tag contains Python code that simply iterates over
> that list, and uses the value of the current feature, 'kfeature', to
> append the chosen kernel features to the list of features used by the
> BSP.
>
> Finally, because the kernel components are actually part of the BSP
> metadata, the user-specified values are also available in the
> processing of those files.  For instance, in the below case, we can
> use the xserver_choice to include or exclude specific kernel
> configuration settings in the
> recipes-kernel/linux/linux-yocto/{{=machine}}.scc file associated with
> the BSP:
>
> {{ if xserver_choice == "xserver-emgd": }}
> include features/drm-emgd/drm-emgd.scc
>
> ---
>
> For reference, here's an example of how the tools are expected to be
> laid out.  Everything is contained within a 'bsp-tools' directory
> under '/scripts'.  The 'common' portion, containing the files common
> to every BSP are:
>
> bsp-tools/
> bsp-tools/yocto-bsp.py
> bsp-tools/yocto-kernel.py
> bsp-tools/bsp-cache
> bsp-tools/bsp-cache/target
> bsp-tools/bsp-cache/target/arch
> bsp-tools/bsp-cache/target/arch/common
> bsp-tools/bsp-cache/target/arch/common/README.sources
> bsp-tools/bsp-cache/target/arch/common/binary
> bsp-tools/bsp-cache/target/arch/common/binary/.gitignore
> bsp-tools/bsp-cache/target/arch/common/recipes-kernel
> bsp-tools/bsp-cache/target/arch/common/recipes-kernel/linux
> bsp-tools/bsp-cache/target/arch/common/COPYING.MIT
> bsp-tools/bsp-cache/target/arch/common/README
> bsp-tools/bsp-cache/target/arch/common/recipes-graphics
> bsp-tools/bsp-cache/target/arch/common/recipes-graphics/xorg-xserver
> bsp-tools/bsp-cache/target/arch/common/recipes-graphics/xorg-xserver/{{ if xserver: }} xserver-xf86-config_0.1.bbappend
> bsp-tools/bsp-cache/target/arch/common/conf
> bsp-tools/bsp-cache/target/arch/common/conf/layer.conf
> bsp-tools/bsp-cache/target/arch/common/recipes-core
> bsp-tools/bsp-cache/target/arch/common/recipes-core/tasks
> bsp-tools/bsp-cache/target/arch/common/recipes-core/tasks/task-core-tools.bbappend
> bsp-tools/bsp-cache/target/arch/common/recipes-bsp
> bsp-tools/bsp-cache/target/arch/common/recipes-bsp/formfactor
> bsp-tools/bsp-cache/target/arch/common/recipes-bsp/formfactor/formfactor_0.0.bbappend
> bsp-tools/bsp-cache/target/arch/common/recipes-bsp/formfactor/formfactor
> bsp-tools/bsp-cache/target/arch/common/recipes-bsp/formfactor/formfactor/{{=machine}}
> bsp-tools/bsp-cache/target/arch/common/recipes-bsp/formfactor/formfactor/{{=machine}}/machconfig
>
> The BSP-specific files are contained in directories named for the
> architecture.  In this case, only the i386 files are expanded as an
> example.
>
> bsp-tools/bsp-cache/target/arch/arm
> bsp-tools/bsp-cache/target/arch/powerpc
> bsp-tools/bsp-cache/target/arch/i386
> bsp-tools/bsp-cache/target/arch/i386/recipes-kernel
> bsp-tools/bsp-cache/target/arch/i386/recipes-kernel/linux
> bsp-tools/bsp-cache/target/arch/i386/recipes-kernel/linux/linux-yocto-rt_3.0.bbappend
> bsp-tools/bsp-cache/target/arch/i386/recipes-kernel/linux/linux-yocto_3.0.bbappend
> bsp-tools/bsp-cache/target/arch/i386/recipes-kernel/linux/linux-yocto
> bsp-tools/bsp-cache/target/arch/i386/recipes-kernel/linux/linux-yocto/{{=machine}}.cfg
> bsp-tools/bsp-cache/target/arch/i386/recipes-kernel/linux/linux-yocto/{{=machine}}.scc
> bsp-tools/bsp-cache/target/arch/i386/recipes-kernel/linux/linux-yocto/{{=machine}}-preempt-rt.scc
> bsp-tools/bsp-cache/target/arch/i386/recipes-kernel/linux/linux-yocto/{{=machine}}-standard.scc
> bsp-tools/bsp-cache/target/arch/i386/recipes-kernel/linux/linux-yocto-rt
> bsp-tools/bsp-cache/target/arch/i386/recipes-kernel/linux/linux-yocto-rt/{{=machine}}.cfg
> bsp-tools/bsp-cache/target/arch/i386/recipes-kernel/linux/linux-yocto-rt/{{=machine}}.scc
> bsp-tools/bsp-cache/target/arch/i386/recipes-kernel/linux/linux-yocto-rt/{{=machine}}-preempt-rt.scc
> bsp-tools/bsp-cache/target/arch/i386/recipes-kernel/linux/linux-yocto-rt/{{=machine}}-standard.scc
> bsp-tools/bsp-cache/target/arch/i386/recipes-graphics
> bsp-tools/bsp-cache/target/arch/i386/recipes-graphics/xserver-xf86-config
> bsp-tools/bsp-cache/target/arch/i386/recipes-graphics/xserver-xf86-config/{{=machine}}
> bsp-tools/bsp-cache/target/arch/i386/recipes-graphics/xserver-xf86-config/{{=machine}}/{{ if xserver-choice == xserver-emgd: }} xorg.conf
> bsp-tools/bsp-cache/target/arch/i386/recipes-graphics/xserver-xf86-config/{{=machine}}/{{ if xserver-choice == xserver-vesa: }} xorg.conf
> bsp-tools/bsp-cache/target/arch/i386/recipes-graphics/xserver-xf86-config/{{=machine}}/{{ if xserver-choice == xserver-i915: }} xorg.conf
> bsp-tools/bsp-cache/target/arch/i386/conf
> bsp-tools/bsp-cache/target/arch/i386/conf/machine
> bsp-tools/bsp-cache/target/arch/i386/conf/machine/{{=machine}}.conf
> bsp-tools/bsp-cache/target/arch/mips
> bsp-tools/bsp-cache/target/arch/x86_64
>
>
> _______________________________________________
> yocto mailing list
> yocto at yoctoproject.org
> https://lists.yoctoproject.org/listinfo/yocto



More information about the yocto mailing list