[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