diff options
Diffstat (limited to 'yocto-poky/bitbake/doc/bitbake-user-manual/bitbake-user-manual-execution.xml')
-rw-r--r-- | yocto-poky/bitbake/doc/bitbake-user-manual/bitbake-user-manual-execution.xml | 931 |
1 files changed, 0 insertions, 931 deletions
diff --git a/yocto-poky/bitbake/doc/bitbake-user-manual/bitbake-user-manual-execution.xml b/yocto-poky/bitbake/doc/bitbake-user-manual/bitbake-user-manual-execution.xml deleted file mode 100644 index b1b72e0aa..000000000 --- a/yocto-poky/bitbake/doc/bitbake-user-manual/bitbake-user-manual-execution.xml +++ /dev/null @@ -1,931 +0,0 @@ -<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" -"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"> - -<chapter id="bitbake-user-manual-execution"> - <title>Execution</title> - - <para> - The primary purpose for running BitBake is to produce some kind - of output such as a single installable package, a kernel, a software - development kit, or even a full, board-specific bootable Linux image, - complete with bootloader, kernel, and root filesystem. - Of course, you can execute the <filename>bitbake</filename> - command with options that cause it to execute single tasks, - compile single recipe files, capture or clear data, or simply - return information about the execution environment. - </para> - - <para> - This chapter describes BitBake's execution process from start - to finish when you use it to create an image. - The execution process is launched using the following command - form: - <literallayout class='monospaced'> - $ bitbake <replaceable>target</replaceable> - </literallayout> - For information on the BitBake command and its options, - see - "<link linkend='bitbake-user-manual-command'>The BitBake Command</link>" - section. - <note> - <para> - Prior to executing BitBake, you should take advantage of available - parallel thread execution on your build host by setting the - <link linkend='var-BB_NUMBER_THREADS'><filename>BB_NUMBER_THREADS</filename></link> - variable in your project's <filename>local.conf</filename> - configuration file. - </para> - - <para> - A common method to determine this value for your build host is to run - the following: - <literallayout class='monospaced'> - $ grep processor /proc/cpuinfo - </literallayout> - This command returns the number of processors, which takes into - account hyper-threading. - Thus, a quad-core build host with hyper-threading most likely - shows eight processors, which is the value you would then assign to - <filename>BB_NUMBER_THREADS</filename>. - </para> - - <para> - A possibly simpler solution is that some Linux distributions - (e.g. Debian and Ubuntu) provide the <filename>ncpus</filename> command. - </para> - </note> - </para> - - <section id='parsing-the-base-configuration-metadata'> - <title>Parsing the Base Configuration Metadata</title> - - <para> - The first thing BitBake does is parse base configuration - metadata. - Base configuration metadata consists of your project's - <filename>bblayers.conf</filename> file to determine what - layers BitBake needs to recognize, all necessary - <filename>layer.conf</filename> files (one from each layer), - and <filename>bitbake.conf</filename>. - The data itself is of various types: - <itemizedlist> - <listitem><para><emphasis>Recipes:</emphasis> - Details about particular pieces of software. - </para></listitem> - <listitem><para><emphasis>Class Data:</emphasis> - An abstraction of common build information - (e.g. how to build a Linux kernel). - </para></listitem> - <listitem><para><emphasis>Configuration Data:</emphasis> - Machine-specific settings, policy decisions, - and so forth. - Configuration data acts as the glue to bind everything - together.</para></listitem> - </itemizedlist> - </para> - - <para> - The <filename>layer.conf</filename> files are used to - construct key variables such as - <link linkend='var-BBPATH'><filename>BBPATH</filename></link> - and - <link linkend='var-BBFILES'><filename>BBFILES</filename></link>. - <filename>BBPATH</filename> is used to search for - configuration and class files under the - <filename>conf</filename> and <filename>classes</filename> - directories, respectively. - <filename>BBFILES</filename> is used to locate both recipe - and recipe append files - (<filename>.bb</filename> and <filename>.bbappend</filename>). - If there is no <filename>bblayers.conf</filename> file, - it is assumed the user has set the <filename>BBPATH</filename> - and <filename>BBFILES</filename> directly in the environment. - </para> - - <para> - Next, the <filename>bitbake.conf</filename> file is located - using the <filename>BBPATH</filename> variable that was - just constructed. - The <filename>bitbake.conf</filename> file may also include other - configuration files using the - <filename>include</filename> or - <filename>require</filename> directives. - </para> - - <para> - Prior to parsing configuration files, Bitbake looks - at certain variables, including: - <itemizedlist> - <listitem><para> - <link linkend='var-BB_ENV_WHITELIST'><filename>BB_ENV_WHITELIST</filename></link> - </para></listitem> - <listitem><para> - <link linkend='var-BB_ENV_EXTRAWHITE'><filename>BB_ENV_EXTRAWHITE</filename></link> - </para></listitem> - <listitem><para> - <link linkend='var-BB_PRESERVE_ENV'><filename>BB_PRESERVE_ENV</filename></link> - </para></listitem> - <listitem><para> - <link linkend='var-BB_ORIGENV'><filename>BB_ORIGENV</filename></link> - </para></listitem> - <listitem><para> - <link linkend='var-BITBAKE_UI'><filename>BITBAKE_UI</filename></link> - </para></listitem> - </itemizedlist> - The first four variables in this list relate to how BitBake treats shell - environment variables during task execution. - By default, BitBake cleans the environment variables and provides tight - control over the shell execution environment. - However, through the use of these first four variables, you can - apply your control regarding the - environment variables allowed to be used by BitBake in the shell - during execution of tasks. - See the - "<link linkend='passing-information-into-the-build-task-environment'>Passing Information Into the Build Task Environment</link>" - section and the information about these variables in the - variable glossary for more information on how they work and - on how to use them. - </para> - - <para> - The base configuration metadata is global - and therefore affects all recipes and tasks that are executed. - </para> - - <para> - BitBake first searches the current working directory for an - optional <filename>conf/bblayers.conf</filename> configuration file. - This file is expected to contain a - <link linkend='var-BBLAYERS'><filename>BBLAYERS</filename></link> - variable that is a space-delimited list of 'layer' directories. - Recall that if BitBake cannot find a <filename>bblayers.conf</filename> - file, then it is assumed the user has set the <filename>BBPATH</filename> - and <filename>BBFILES</filename> variables directly in the environment. - </para> - - <para> - For each directory (layer) in this list, a <filename>conf/layer.conf</filename> - file is located and parsed with the - <link linkend='var-LAYERDIR'><filename>LAYERDIR</filename></link> - variable being set to the directory where the layer was found. - The idea is these files automatically set up - <link linkend='var-BBPATH'><filename>BBPATH</filename></link> - and other variables correctly for a given build directory. - </para> - - <para> - BitBake then expects to find the <filename>conf/bitbake.conf</filename> - file somewhere in the user-specified <filename>BBPATH</filename>. - That configuration file generally has include directives to pull - in any other metadata such as files specific to the architecture, - the machine, the local environment, and so forth. - </para> - - <para> - Only variable definitions and include directives are allowed - in BitBake <filename>.conf</filename> files. - Some variables directly influence BitBake's behavior. - These variables might have been set from the environment - depending on the environment variables previously - mentioned or set in the configuration files. - The - "<link linkend='ref-variables-glos'>Variables Glossary</link>" - chapter presents a full list of variables. - </para> - - <para> - After parsing configuration files, BitBake uses its rudimentary - inheritance mechanism, which is through class files, to inherit - some standard classes. - BitBake parses a class when the inherit directive responsible - for getting that class is encountered. - </para> - - <para> - The <filename>base.bbclass</filename> file is always included. - Other classes that are specified in the configuration using the - <link linkend='var-INHERIT'><filename>INHERIT</filename></link> - variable are also included. - BitBake searches for class files in a - <filename>classes</filename> subdirectory under - the paths in <filename>BBPATH</filename> in the same way as - configuration files. - </para> - - <para> - A good way to get an idea of the configuration files and - the class files used in your execution environment is to - run the following BitBake command: - <literallayout class='monospaced'> - $ bitbake -e > mybb.log - </literallayout> - Examining the top of the <filename>mybb.log</filename> - shows you the many configuration files and class files - used in your execution environment. - </para> - - <note> - <para> - You need to be aware of how BitBake parses curly braces. - If a recipe uses a closing curly brace within the function and - the character has no leading spaces, BitBake produces a parsing - error. - If you use a pair of curly braces in a shell function, the - closing curly brace must not be located at the start of the line - without leading spaces. - </para> - - <para> - Here is an example that causes BitBake to produce a parsing - error: - <literallayout class='monospaced'> - fakeroot create_shar() { - cat << "EOF" > ${SDK_DEPLOY}/${TOOLCHAIN_OUTPUTNAME}.sh - usage() - { - echo "test" - ###### The following "}" at the start of the line causes a parsing error ###### - } - EOF - } - </literallayout> - Writing the recipe this way avoids the error: - <literallayout class='monospaced'> - fakeroot create_shar() { - cat << "EOF" > ${SDK_DEPLOY}/${TOOLCHAIN_OUTPUTNAME}.sh - usage() - { - echo "test" - ######The following "}" with a leading space at the start of the line avoids the error ###### - } - EOF - } - </literallayout> - </para> - </note> - </section> - - <section id='locating-and-parsing-recipes'> - <title>Locating and Parsing Recipes</title> - - <para> - During the configuration phase, BitBake will have set - <link linkend='var-BBFILES'><filename>BBFILES</filename></link>. - BitBake now uses it to construct a list of recipes to parse, - along with any append files (<filename>.bbappend</filename>) - to apply. - <filename>BBFILES</filename> is a space-separated list of - available files and supports wildcards. - An example would be: - <literallayout class='monospaced'> - BBFILES = "/path/to/bbfiles/*.bb /path/to/appends/*.bbappend" - </literallayout> - BitBake parses each recipe and append file located - with <filename>BBFILES</filename> and stores the values of - various variables into the datastore. - <note> - Append files are applied in the order they are encountered in - <filename>BBFILES</filename>. - </note> - For each file, a fresh copy of the base configuration is - made, then the recipe is parsed line by line. - Any inherit statements cause BitBake to find and - then parse class files (<filename>.bbclass</filename>) - using - <link linkend='var-BBPATH'><filename>BBPATH</filename></link> - as the search path. - Finally, BitBake parses in order any append files found in - <filename>BBFILES</filename>. - </para> - - <para> - One common convention is to use the recipe filename to define - pieces of metadata. - For example, in <filename>bitbake.conf</filename> the recipe - name and version are used to set the variables - <link linkend='var-PN'><filename>PN</filename></link> and - <link linkend='var-PV'><filename>PV</filename></link>: - <literallayout class='monospaced'> - PN = "${@bb.parse.BBHandler.vars_from_file(d.getVar('FILE', False),d)[0] or 'defaultpkgname'}" - PV = "${@bb.parse.BBHandler.vars_from_file(d.getVar('FILE', False),d)[1] or '1.0'}" - </literallayout> - In this example, a recipe called "something_1.2.3.bb" would set - <filename>PN</filename> to "something" and - <filename>PV</filename> to "1.2.3". - </para> - - <para> - By the time parsing is complete for a recipe, BitBake - has a list of tasks that the recipe defines and a set of - data consisting of keys and values as well as - dependency information about the tasks. - </para> - - <para> - BitBake does not need all of this information. - It only needs a small subset of the information to make - decisions about the recipe. - Consequently, BitBake caches the values in which it is - interested and does not store the rest of the information. - Experience has shown it is faster to re-parse the metadata than to - try and write it out to the disk and then reload it. - </para> - - <para> - Where possible, subsequent BitBake commands reuse this cache of - recipe information. - The validity of this cache is determined by first computing a - checksum of the base configuration data (see - <link linkend='var-BB_HASHCONFIG_WHITELIST'><filename>BB_HASHCONFIG_WHITELIST</filename></link>) - and then checking if the checksum matches. - If that checksum matches what is in the cache and the recipe - and class files have not changed, Bitbake is able to use - the cache. - BitBake then reloads the cached information about the recipe - instead of reparsing it from scratch. - </para> - - <para> - Recipe file collections exist to allow the user to - have multiple repositories of - <filename>.bb</filename> files that contain the same - exact package. - For example, one could easily use them to make one's - own local copy of an upstream repository, but with - custom modifications that one does not want upstream. - Here is an example: - <literallayout class='monospaced'> - BBFILES = "/stuff/openembedded/*/*.bb /stuff/openembedded.modified/*/*.bb" - BBFILE_COLLECTIONS = "upstream local" - BBFILE_PATTERN_upstream = "^/stuff/openembedded/" - BBFILE_PATTERN_local = "^/stuff/openembedded.modified/" - BBFILE_PRIORITY_upstream = "5" - BBFILE_PRIORITY_local = "10" - </literallayout> - <note> - The layers mechanism is now the preferred method of collecting - code. - While the collections code remains, its main use is to set layer - priorities and to deal with overlap (conflicts) between layers. - </note> - </para> - </section> - - <section id='bb-bitbake-providers'> - <title>Providers</title> - - <para> - Assuming BitBake has been instructed to execute a target - and that all the recipe files have been parsed, BitBake - starts to figure out how to build the target. - BitBake looks through the <filename>PROVIDES</filename> list - for each of the recipes. - A <filename>PROVIDES</filename> list is the list of names by which - the recipe can be known. - Each recipe's <filename>PROVIDES</filename> list is created - implicitly through the recipe's - <link linkend='var-PN'><filename>PN</filename></link> variable - and explicitly through the recipe's - <link linkend='var-PROVIDES'><filename>PROVIDES</filename></link> - variable, which is optional. - </para> - - <para> - When a recipe uses <filename>PROVIDES</filename>, that recipe's - functionality can be found under an alternative name or names other - than the implicit <filename>PN</filename> name. - As an example, suppose a recipe named <filename>keyboard_1.0.bb</filename> - contained the following: - <literallayout class='monospaced'> - PROVIDES += "fullkeyboard" - </literallayout> - The <filename>PROVIDES</filename> list for this recipe becomes - "keyboard", which is implicit, and "fullkeyboard", which is explicit. - Consequently, the functionality found in - <filename>keyboard_1.0.bb</filename> can be found under two - different names. - </para> - </section> - - <section id='bb-bitbake-preferences'> - <title>Preferences</title> - - <para> - The <filename>PROVIDES</filename> list is only part of the solution - for figuring out a target's recipes. - Because targets might have multiple providers, BitBake needs - to prioritize providers by determining provider preferences. - </para> - - <para> - A common example in which a target has multiple providers - is "virtual/kernel", which is on the - <filename>PROVIDES</filename> list for each kernel recipe. - Each machine often selects the best kernel provider by using a - line similar to the following in the machine configuration file: - <literallayout class='monospaced'> - PREFERRED_PROVIDER_virtual/kernel = "linux-yocto" - </literallayout> - The default - <link linkend='var-PREFERRED_PROVIDER'><filename>PREFERRED_PROVIDER</filename></link> - is the provider with the same name as the target. - Bitbake iterates through each target it needs to build and - resolves them and their dependencies using this process. - </para> - - <para> - Understanding how providers are chosen is made complicated by the fact - that multiple versions might exist for a given provider. - BitBake defaults to the highest version of a provider. - Version comparisons are made using the same method as Debian. - You can use the - <link linkend='var-PREFERRED_VERSION'><filename>PREFERRED_VERSION</filename></link> - variable to specify a particular version. - You can influence the order by using the - <link linkend='var-DEFAULT_PREFERENCE'><filename>DEFAULT_PREFERENCE</filename></link> - variable. - </para> - - <para> - By default, files have a preference of "0". - Setting <filename>DEFAULT_PREFERENCE</filename> to "-1" makes the - recipe unlikely to be used unless it is explicitly referenced. - Setting <filename>DEFAULT_PREFERENCE</filename> to "1" makes it - likely the recipe is used. - <filename>PREFERRED_VERSION</filename> overrides any - <filename>DEFAULT_PREFERENCE</filename> setting. - <filename>DEFAULT_PREFERENCE</filename> is often used to mark newer - and more experimental recipe versions until they have undergone - sufficient testing to be considered stable. - </para> - - <para> - When there are multiple “versions” of a given recipe, - BitBake defaults to selecting the most recent - version, unless otherwise specified. - If the recipe in question has a - <link linkend='var-DEFAULT_PREFERENCE'><filename>DEFAULT_PREFERENCE</filename></link> - set lower than the other recipes (default is 0), then - it will not be selected. - This allows the person or persons maintaining - the repository of recipe files to specify - their preference for the default selected version. - Additionally, the user can specify their preferred version. - </para> - - <para> - If the first recipe is named <filename>a_1.1.bb</filename>, then the - <link linkend='var-PN'><filename>PN</filename></link> variable - will be set to “a”, and the - <link linkend='var-PV'><filename>PV</filename></link> - variable will be set to 1.1. - </para> - - <para> - Thus, if a recipe named <filename>a_1.2.bb</filename> exists, BitBake - will choose 1.2 by default. - However, if you define the following variable in a - <filename>.conf</filename> file that BitBake parses, you - can change that preference: - <literallayout class='monospaced'> - PREFERRED_VERSION_a = "1.1" - </literallayout> - </para> - - <note> - <para> - It is common for a recipe to provide two versions -- a stable, - numbered (and preferred) version, and a version that is - automatically checked out from a source code repository that - is considered more "bleeding edge" but can be selected only - explicitly. - </para> - - <para> - For example, in the OpenEmbedded codebase, there is a standard, - versioned recipe file for BusyBox, - <filename>busybox_1.22.1.bb</filename>, - but there is also a Git-based version, - <filename>busybox_git.bb</filename>, which explicitly contains the line - <literallayout class='monospaced'> - DEFAULT_PREFERENCE = "-1" - </literallayout> - to ensure that the numbered, stable version is always preferred - unless the developer selects otherwise. - </para> - </note> - </section> - - <section id='bb-bitbake-dependencies'> - <title>Dependencies</title> - - <para> - Each target BitBake builds consists of multiple tasks such as - <filename>fetch</filename>, <filename>unpack</filename>, - <filename>patch</filename>, <filename>configure</filename>, - and <filename>compile</filename>. - For best performance on multi-core systems, BitBake considers each - task as an independent - entity with its own set of dependencies. - </para> - - <para> - Dependencies are defined through several variables. - You can find information about variables BitBake uses in - the <link linkend='ref-variables-glos'>Variables Glossary</link> - near the end of this manual. - At a basic level, it is sufficient to know that BitBake uses the - <link linkend='var-DEPENDS'><filename>DEPENDS</filename></link> and - <link linkend='var-RDEPENDS'><filename>RDEPENDS</filename></link> variables when - calculating dependencies. - </para> - - <para> - For more information on how BitBake handles dependencies, see the - "<link linkend='dependencies'>Dependencies</link>" section. - </para> - </section> - - <section id='ref-bitbake-tasklist'> - <title>The Task List</title> - - <para> - Based on the generated list of providers and the dependency information, - BitBake can now calculate exactly what tasks it needs to run and in what - order it needs to run them. - The - "<link linkend='executing-tasks'>Executing Tasks</link>" section has more - information on how BitBake chooses which task to execute next. - </para> - - <para> - The build now starts with BitBake forking off threads up to the limit set in the - <link linkend='var-BB_NUMBER_THREADS'><filename>BB_NUMBER_THREADS</filename></link> - variable. - BitBake continues to fork threads as long as there are tasks ready to run, - those tasks have all their dependencies met, and the thread threshold has not been - exceeded. - </para> - - <para> - It is worth noting that you can greatly speed up the build time by properly setting - the <filename>BB_NUMBER_THREADS</filename> variable. - </para> - - <para> - As each task completes, a timestamp is written to the directory specified by the - <link linkend='var-STAMP'><filename>STAMP</filename></link> variable. - On subsequent runs, BitBake looks in the build directory within - <filename>tmp/stamps</filename> and does not rerun - tasks that are already completed unless a timestamp is found to be invalid. - Currently, invalid timestamps are only considered on a per - recipe file basis. - So, for example, if the configure stamp has a timestamp greater than the - compile timestamp for a given target, then the compile task would rerun. - Running the compile task again, however, has no effect on other providers - that depend on that target. - </para> - - <para> - The exact format of the stamps is partly configurable. - In modern versions of BitBake, a hash is appended to the - stamp so that if the configuration changes, the stamp becomes - invalid and the task is automatically rerun. - This hash, or signature used, is governed by the signature policy - that is configured (see the - "<link linkend='checksums'>Checksums (Signatures)</link>" - section for information). - It is also possible to append extra metadata to the stamp using - the "stamp-extra-info" task flag. - For example, OpenEmbedded uses this flag to make some tasks machine-specific. - </para> - - <note> - Some tasks are marked as "nostamp" tasks. - No timestamp file is created when these tasks are run. - Consequently, "nostamp" tasks are always rerun. - </note> - - <para> - For more information on tasks, see the - "<link linkend='tasks'>Tasks</link>" section. - </para> - </section> - - <section id='executing-tasks'> - <title>Executing Tasks</title> - - <para> - Tasks can be either a shell task or a Python task. - For shell tasks, BitBake writes a shell script to - <filename>${</filename><link linkend='var-T'><filename>T</filename></link><filename>}/run.do_taskname.pid</filename> - and then executes the script. - The generated shell script contains all the exported variables, - and the shell functions with all variables expanded. - Output from the shell script goes to the file - <filename>${T}/log.do_taskname.pid</filename>. - Looking at the expanded shell functions in the run file and - the output in the log files is a useful debugging technique. - </para> - - <para> - For Python tasks, BitBake executes the task internally and logs - information to the controlling terminal. - Future versions of BitBake will write the functions to files - similar to the way shell tasks are handled. - Logging will be handled in a way similar to shell tasks as well. - </para> - - <para> - The order in which BitBake runs the tasks is controlled by its - task scheduler. - It is possible to configure the scheduler and define custom - implementations for specific use cases. - For more information, see these variables that control the - behavior: - <itemizedlist> - <listitem><para> - <link linkend='var-BB_SCHEDULER'><filename>BB_SCHEDULER</filename></link> - </para></listitem> - <listitem><para> - <link linkend='var-BB_SCHEDULERS'><filename>BB_SCHEDULERS</filename></link> - </para></listitem> - </itemizedlist> - It is possible to have functions run before and after a task's main - function. - This is done using the "prefuncs" and "postfuncs" flags of the task - that lists the functions to run. - </para> - </section> - - <section id='checksums'> - <title>Checksums (Signatures)</title> - - <para> - A checksum is a unique signature of a task's inputs. - The signature of a task can be used to determine if a task - needs to be run. - Because it is a change in a task's inputs that triggers running - the task, BitBake needs to detect all the inputs to a given task. - For shell tasks, this turns out to be fairly easy because - BitBake generates a "run" shell script for each task and - it is possible to create a checksum that gives you a good idea of when - the task's data changes. - </para> - - <para> - To complicate the problem, some things should not be included in - the checksum. - First, there is the actual specific build path of a given task - - the working directory. - It does not matter if the working directory changes because it should not - affect the output for target packages. - The simplistic approach for excluding the working directory is to set - it to some fixed value and create the checksum for the "run" script. - BitBake goes one step better and uses the - <link linkend='var-BB_HASHBASE_WHITELIST'><filename>BB_HASHBASE_WHITELIST</filename></link> - variable to define a list of variables that should never be included - when generating the signatures. - </para> - - <para> - Another problem results from the "run" scripts containing functions that - might or might not get called. - The incremental build solution contains code that figures out dependencies - between shell functions. - This code is used to prune the "run" scripts down to the minimum set, - thereby alleviating this problem and making the "run" scripts much more - readable as a bonus. - </para> - - <para> - So far we have solutions for shell scripts. - What about Python tasks? - The same approach applies even though these tasks are more difficult. - The process needs to figure out what variables a Python function accesses - and what functions it calls. - Again, the incremental build solution contains code that first figures out - the variable and function dependencies, and then creates a checksum for the data - used as the input to the task. - </para> - - <para> - Like the working directory case, situations exist where dependencies - should be ignored. - For these cases, you can instruct the build process to ignore a dependency - by using a line like the following: - <literallayout class='monospaced'> - PACKAGE_ARCHS[vardepsexclude] = "MACHINE" - </literallayout> - This example ensures that the <filename>PACKAGE_ARCHS</filename> variable does not - depend on the value of <filename>MACHINE</filename>, even if it does reference it. - </para> - - <para> - Equally, there are cases where we need to add dependencies BitBake - is not able to find. - You can accomplish this by using a line like the following: - <literallayout class='monospaced'> - PACKAGE_ARCHS[vardeps] = "MACHINE" - </literallayout> - This example explicitly adds the <filename>MACHINE</filename> variable as a - dependency for <filename>PACKAGE_ARCHS</filename>. - </para> - - <para> - Consider a case with in-line Python, for example, where BitBake is not - able to figure out dependencies. - When running in debug mode (i.e. using <filename>-DDD</filename>), BitBake - produces output when it discovers something for which it cannot figure out - dependencies. - </para> - - <para> - Thus far, this section has limited discussion to the direct inputs into a task. - Information based on direct inputs is referred to as the "basehash" in the - code. - However, there is still the question of a task's indirect inputs - the - things that were already built and present in the build directory. - The checksum (or signature) for a particular task needs to add the hashes - of all the tasks on which the particular task depends. - Choosing which dependencies to add is a policy decision. - However, the effect is to generate a master checksum that combines the basehash - and the hashes of the task's dependencies. - </para> - - <para> - At the code level, there are a variety of ways both the basehash and the - dependent task hashes can be influenced. - Within the BitBake configuration file, we can give BitBake some extra information - to help it construct the basehash. - The following statement effectively results in a list of global variable - dependency excludes - variables never included in any checksum. - This example uses variables from OpenEmbedded to help illustrate - the concept: - <literallayout class='monospaced'> - BB_HASHBASE_WHITELIST ?= "TMPDIR FILE PATH PWD BB_TASKHASH BBPATH DL_DIR \ - SSTATE_DIR THISDIR FILESEXTRAPATHS FILE_DIRNAME HOME LOGNAME SHELL TERM \ - USER FILESPATH STAGING_DIR_HOST STAGING_DIR_TARGET COREBASE PRSERV_HOST \ - PRSERV_DUMPDIR PRSERV_DUMPFILE PRSERV_LOCKDOWN PARALLEL_MAKE \ - CCACHE_DIR EXTERNAL_TOOLCHAIN CCACHE CCACHE_DISABLE LICENSE_PATH SDKPKGSUFFIX" - </literallayout> - The previous example excludes the work directory, which is part of - <filename>TMPDIR</filename>. - </para> - - <para> - The rules for deciding which hashes of dependent tasks to include through - dependency chains are more complex and are generally accomplished with a - Python function. - The code in <filename>meta/lib/oe/sstatesig.py</filename> shows two examples - of this and also illustrates how you can insert your own policy into the system - if so desired. - This file defines the two basic signature generators OpenEmbedded Core - uses: "OEBasic" and "OEBasicHash". - By default, there is a dummy "noop" signature handler enabled in BitBake. - This means that behavior is unchanged from previous versions. - <filename>OE-Core</filename> uses the "OEBasicHash" signature handler by default - through this setting in the <filename>bitbake.conf</filename> file: - <literallayout class='monospaced'> - BB_SIGNATURE_HANDLER ?= "OEBasicHash" - </literallayout> - The "OEBasicHash" <filename>BB_SIGNATURE_HANDLER</filename> is the same as the - "OEBasic" version but adds the task hash to the stamp files. - This results in any metadata change that changes the task hash, automatically - causing the task to be run again. - This removes the need to bump - <link linkend='var-PR'><filename>PR</filename></link> - values, and changes to metadata automatically ripple across the build. - </para> - - <para> - It is also worth noting that the end result of these signature generators is to - make some dependency and hash information available to the build. - This information includes: - <itemizedlist> - <listitem><para><filename>BB_BASEHASH_task-</filename><replaceable>taskname</replaceable>: - The base hashes for each task in the recipe. - </para></listitem> - <listitem><para><filename>BB_BASEHASH_</filename><replaceable>filename</replaceable><filename>:</filename><replaceable>taskname</replaceable>: - The base hashes for each dependent task. - </para></listitem> - <listitem><para><filename>BBHASHDEPS_</filename><replaceable>filename</replaceable><filename>:</filename><replaceable>taskname</replaceable>: - The task dependencies for each task. - </para></listitem> - <listitem><para><filename>BB_TASKHASH</filename>: - The hash of the currently running task. - </para></listitem> - </itemizedlist> - </para> - - <para> - It is worth noting that BitBake's "-S" option lets you - debug Bitbake's processing of signatures. - The options passed to -S allow different debugging modes - to be used, either using BitBake's own debug functions - or possibly those defined in the metadata/signature handler - itself. - The simplest parameter to pass is "none", which causes a - set of signature information to be written out into - <filename>STAMP_DIR</filename> - corresponding to the targets specified. - The other currently available parameter is "printdiff", - which causes BitBake to try to establish the closest - signature match it can (e.g. in the sstate cache) and then - run <filename>bitbake-diffsigs</filename> over the matches - to determine the stamps and delta where these two - stamp trees diverge. - <note> - It is likely that future versions of BitBake will - provide other signature handlers triggered through - additional "-S" parameters. - </note> - </para> - - <para> - You can find more information on checksum metadata in the - "<link linkend='task-checksums-and-setscene'>Task Checksums and Setscene</link>" - section. - </para> - </section> - - <section id='setscene'> - <title>Setscene</title> - - <para> - The setscene process enables BitBake to handle "pre-built" artifacts. - The ability to handle and reuse these artifacts allows BitBake - the luxury of not having to build something from scratch every time. - Instead, BitBake can use, when possible, existing build artifacts. - </para> - - <para> - BitBake needs to have reliable data indicating whether or not an - artifact is compatible. - Signatures, described in the previous section, provide an ideal - way of representing whether an artifact is compatible. - If a signature is the same, an object can be reused. - </para> - - <para> - If an object can be reused, the problem then becomes how to - replace a given task or set of tasks with the pre-built artifact. - BitBake solves the problem with the "setscene" process. - </para> - - <para> - When BitBake is asked to build a given target, before building anything, - it first asks whether cached information is available for any of the - targets it's building, or any of the intermediate targets. - If cached information is available, BitBake uses this information instead of - running the main tasks. - </para> - - <para> - BitBake first calls the function defined by the - <link linkend='var-BB_HASHCHECK_FUNCTION'><filename>BB_HASHCHECK_FUNCTION</filename></link> - variable with a list of tasks and corresponding - hashes it wants to build. - This function is designed to be fast and returns a list - of the tasks for which it believes in can obtain artifacts. - </para> - - <para> - Next, for each of the tasks that were returned as possibilities, - BitBake executes a setscene version of the task that the possible - artifact covers. - Setscene versions of a task have the string "_setscene" appended to the - task name. - So, for example, the task with the name <filename>xxx</filename> has - a setscene task named <filename>xxx_setscene</filename>. - The setscene version of the task executes and provides the necessary - artifacts returning either success or failure. - </para> - - <para> - As previously mentioned, an artifact can cover more than one task. - For example, it is pointless to obtain a compiler if you - already have the compiled binary. - To handle this, BitBake calls the - <link linkend='var-BB_SETSCENE_DEPVALID'><filename>BB_SETSCENE_DEPVALID</filename></link> - function for each successful setscene task to know whether or not it needs - to obtain the dependencies of that task. - </para> - - <para> - Finally, after all the setscene tasks have executed, BitBake calls the - function listed in - <link linkend='var-BB_SETSCENE_VERIFY_FUNCTION'><filename>BB_SETSCENE_VERIFY_FUNCTION</filename></link> - with the list of tasks BitBake thinks has been "covered". - The metadata can then ensure that this list is correct and can - inform BitBake that it wants specific tasks to be run regardless - of the setscene result. - </para> - - <para> - You can find more information on setscene metadata in the - "<link linkend='task-checksums-and-setscene'>Task Checksums and Setscene</link>" - section. - </para> - </section> -</chapter> |