<!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-metadata">
    <title>Syntax and Operators</title>

    <para>
        Bitbake files have their own syntax.
        The syntax has similarities to several
        other languages but also has some unique features.
        This section describes the available syntax and operators
        as well as provides examples.
    </para>

    <section id='basic-syntax'>
        <title>Basic Syntax</title>

        <para>
            This section provides some basic syntax examples.
        </para>

        <section id='basic-variable-setting'>
            <title>Basic Variable Setting</title>

            <para>
                The following example sets <filename>VARIABLE</filename> to
                "value".
                This assignment occurs immediately as the statement is parsed.
                It is a "hard" assignment.
                <literallayout class='monospaced'>
     VARIABLE = "value"
                </literallayout>
                As expected, if you include leading or trailing spaces as part of
                an assignment, the spaces are retained:
                <literallayout class='monospaced'>
     VARIABLE = " value"
     VARIABLE = "value "
                </literallayout>
                Setting <filename>VARIABLE</filename> to "" sets it to an empty string,
                while setting the variable to " " sets it to a blank space
                (i.e. these are not the same values).
                <literallayout class='monospaced'>
     VARIABLE = ""
     VARIABLE = " "
                </literallayout>
            </para>

            <para>
                You can use single quotes instead of double quotes
                when setting a variable's value.
                Doing so allows you to use values that contain the double
                quote character:
                <literallayout class='monospaced'>
     VARIABLE = 'I have a " in my value'
                </literallayout>
                <note>
                    Unlike in Bourne shells, single quotes work identically
                    to double quotes in all other ways.
                    They do not suppress variable expansions.
                </note>
            </para>
        </section>

        <section id='line-joining'>
            <title>Line Joining</title>

            <para>
                Outside of
                <link linkend='functions'>functions</link>, BitBake joins
                any line ending in a backslash character ("\")
                with the following line before parsing statements.
                The most common use for the "\" character is to split variable
                assignments over multiple lines, as in the following example:
                <literallayout class='monospaced'>
     FOO = "bar \
            baz \
            qaz"
                </literallayout>
                Both the "\" character and the newline character
                that follow it are removed when joining lines.
                Thus, no newline characters end up in the value of
                <filename>FOO</filename>.
            </para>

            <para>
                Consider this additional example where the two
                assignments both assign "barbaz" to
                <filename>FOO</filename>:
                <literallayout class='monospaced'>
     FOO = "barbaz"

     FOO = "bar\
     baz"
                </literallayout>
                <note>
                    BitBake does not interpret escape sequences like
                    "\n" in variable values.
                    For these to have an effect, the value must be passed
                    to some utility that interprets escape sequences,
                    such as <filename>printf</filename> or
                    <filename>echo -n</filename>.
                </note>
            </para>
        </section>

        <section id='variable-expansion'>
            <title>Variable Expansion</title>

            <para>
                Variables can reference the contents of other variables
                using a syntax that is similar to variable expansion in
                Bourne shells.
                The following assignments
                result in A containing "aval" and B evaluating to "preavalpost".
                <literallayout class='monospaced'>
     A = "aval"
     B = "pre${A}post"
                </literallayout>
                <note>
                    Unlike in Bourne shells, the curly braces are mandatory:
                    Only <filename>${FOO}</filename> and not
                    <filename>$FOO</filename> is recognized as an expansion of
                    <filename>FOO</filename>.
                </note>
                The "=" operator does not immediately expand variable
                references in the right-hand side.
                Instead, expansion is deferred until the variable assigned to
                is actually used.
                The result depends on the current values of the referenced
                variables.
                The following example should clarify this behavior:
                <literallayout class='monospaced'>
     A = "${B} baz"
     B = "${C} bar"
     C = "foo"
     *At this point, ${A} equals "foo bar baz"*
     C = "qux"
     *At this point, ${A} equals "qux bar baz"*
     B = "norf"
     *At this point, ${A} equals "norf baz"*
                </literallayout>
                Contrast this behavior with the
                <link linkend='immediate-variable-expansion'>immediate variable expansion</link>
                operator (i.e. ":=").
            </para>

            <para>
                If the variable expansion syntax is used on a variable that
                does not exist, the string is kept as is.
                For example, given the following assignment,
                <filename>BAR</filename> expands to the literal string
                "${FOO}" as long as <filename>FOO</filename> does not exist.
                <literallayout class='monospaced'>
     BAR = "${FOO}"
                </literallayout>
            </para>
        </section>

        <section id='setting-a-default-value'>
            <title>Setting a default value (?=)</title>

            <para>
                You can use the "?=" operator to achieve a "softer" assignment
                for a variable.
                This type of assignment allows you to define a variable if it
                is undefined when the statement is parsed, but to leave the
                value alone if the variable has a value.
                Here is an example:
                <literallayout class='monospaced'>
     A ?= "aval"
                </literallayout>
                If <filename>A</filename> is set at the time this statement is parsed,
                the variable retains its value.
                However, if <filename>A</filename> is not set,
                the variable is set to "aval".
                <note>
                    This assignment is immediate.
                    Consequently, if multiple "?=" assignments
                    to a single variable exist, the first of those ends up getting
                    used.
                </note>
            </para>
        </section>

        <section id='setting-a-weak-default-value'>
            <title>Setting a weak default value (??=)</title>

            <para>
                It is possible to use a "weaker" assignment than in the
                previous section by using the "??=" operator.
                This assignment behaves identical to "?=" except that the
                assignment is made at the end of the parsing process rather
                than immediately.
                Consequently, when multiple "??=" assignments exist, the last
                one is used.
                Also, any "=" or "?=" assignment will override the value set with
                "??=".
                Here is an example:
                <literallayout class='monospaced'>
     A ??= "somevalue"
     A ??= "someothervalue"
                </literallayout>
                If <filename>A</filename> is set before the above statements are parsed,
                the variable retains its value.
                If <filename>A</filename> is not set,
                the variable is set to "someothervalue".
            </para>

            <para>
                Again, this assignment is a "lazy" or "weak" assignment
                because it does not occur until the end
                of the parsing process.
            </para>
        </section>

        <section id='immediate-variable-expansion'>
            <title>Immediate variable expansion (:=)</title>

            <para>
                The ":=" operator results in a variable's
                contents being expanded immediately,
                rather than when the variable is actually used:
                <literallayout class='monospaced'>
     T = "123"
     A := "${B} ${A} test ${T}"
     T = "456"
     B = "${T} bval"
     C = "cval"
     C := "${C}append"
                </literallayout>
                In this example, <filename>A</filename> contains
                "test 123" because <filename>${B}</filename> and
                <filename>${A}</filename> at the time of parsing are undefined,
                which leaves "test 123".
                And, the variable <filename>C</filename>
                contains "cvalappend" since <filename>${C}</filename> immediately
                expands to "cval".
            </para>
        </section>

        <section id='appending-and-prepending'>
            <title>Appending (+=) and prepending (=+) With Spaces</title>

            <para>
                Appending and prepending values is common and can be accomplished
                using the "+=" and "=+" operators.
                These operators insert a space between the current
                value and prepended or appended value.
            </para>

            <para>
                These operators take immediate effect during parsing.
                Here are some examples:
                <literallayout class='monospaced'>
     B = "bval"
     B += "additionaldata"
     C = "cval"
     C =+ "test"
                </literallayout>
                The variable <filename>B</filename> contains
                "bval additionaldata" and <filename>C</filename>
                contains "test cval".
            </para>
        </section>

        <section id='appending-and-prepending-without-spaces'>
            <title>Appending (.=) and Prepending (=.) Without Spaces</title>

            <para>
                If you want to append or prepend values without an
                inserted space, use the ".=" and "=." operators.
            </para>

            <para>
                These operators take immediate effect during parsing.
                Here are some examples:
                <literallayout class='monospaced'>
     B = "bval"
     B .= "additionaldata"
     C = "cval"
     C =. "test"
                </literallayout>
                The variable <filename>B</filename> contains
                "bvaladditionaldata" and
                <filename>C</filename> contains "testcval".
            </para>
        </section>

        <section id='appending-and-prepending-override-style-syntax'>
            <title>Appending and Prepending (Override Style Syntax)</title>

            <para>
                You can also append and prepend a variable's value
                using an override style syntax.
                When you use this syntax, no spaces are inserted.
            </para>

            <para>
                These operators differ from the ":=", ".=", "=.", "+=", and "=+"
                operators in that their effects are deferred
                until after parsing completes rather than being immediately
                applied.
                Here are some examples:
                <literallayout class='monospaced'>
     B = "bval"
     B_append = " additional data"
     C = "cval"
     C_prepend = "additional data "
     D = "dval"
     D_append = "additional data"
                </literallayout>
                The variable <filename>B</filename> becomes
                "bval additional data" and <filename>C</filename> becomes
                "additional data cval".
                The variable <filename>D</filename> becomes
                "dvaladditional data".
                <note>
                    You must control all spacing when you use the
                    override syntax.
                </note>
            </para>

            <para>
                It is also possible to append and prepend to shell
                functions and BitBake-style Python functions.
                See the
                "<link linkend='shell-functions'>Shell Functions</link>" and
                "<link linkend='bitbake-style-python-functions'>BitBake-Style Python Functions</link>
                sections for examples.
            </para>
        </section>

        <section id='removing-override-style-syntax'>
            <title>Removal (Override Style Syntax)</title>

            <para>
                You can remove values from lists using the removal
                override style syntax.
                Specifying a value for removal causes all occurrences of that
                value to be removed from the variable.
            </para>

            <para>
                When you use this syntax, BitBake expects one or more strings.
                Surrounding spaces and spacing are preserved.
                Here is an example:
                <literallayout class='monospaced'>
     FOO = "123 456 789 123456 123 456 123 456"
     FOO_remove = "123"
     FOO_remove = "456"
     FOO2 = "abc def ghi abcdef abc def abc def"
     FOO2_remove = "abc def"
                </literallayout>
                The variable <filename>FOO</filename> becomes
                "&nbsp;&nbsp;789 123456&nbsp;&nbsp;&nbsp;&nbsp;"
                and <filename>FOO2</filename> becomes
                "&nbsp;&nbsp;ghi abcdef&nbsp;&nbsp;&nbsp;&nbsp;".
            </para>

            <para>
                Like "_append" and "_prepend", "_remove"
                is deferred until after parsing completes.
            </para>
        </section>

        <section id='override-style-operation-advantages'>
            <title>Override Style Operation Advantages</title>

            <para>
                An advantage of the override style operations
                "_append", "_prepend", and "_remove" as compared to the
                "+=" and "=+" operators is that the override style
                operators provide guaranteed operations.
                For example, consider a class <filename>foo.bbclass</filename>
                that needs to add the value "val" to the variable
                <filename>FOO</filename>, and a recipe that uses
                <filename>foo.bbclass</filename> as follows:
                <literallayout class='monospaced'>
     inherit foo

     FOO = "initial"
                </literallayout>
                If <filename>foo.bbclass</filename> uses the "+=" operator,
                as follows, then the final value of <filename>FOO</filename>
                will be "initial", which is not what is desired:
                <literallayout class='monospaced'>
     FOO += "val"
                </literallayout>
                If, on the other hand, <filename>foo.bbclass</filename>
                uses the "_append" operator, then the final value of
                <filename>FOO</filename> will be "initial val", as intended:
                <literallayout class='monospaced'>
     FOO_append = " val"
                </literallayout>
                <note>
                    It is never necessary to use "+=" together with "_append".
                    The following sequence of assignments appends "barbaz" to
                    <filename>FOO</filename>:
                    <literallayout class='monospaced'>
     FOO_append = "bar"
     FOO_append = "baz"
                    </literallayout>
                    The only effect of changing the second assignment in the
                    previous example to use "+=" would be to add a space before
                    "baz" in the appended value (due to how the "+=" operator
                    works).
                </note>
                Another advantage of the override style operations is that
                you can combine them with other overrides as described in the
                "<link linkend='conditional-syntax-overrides'>Conditional Syntax (Overrides)</link>"
                section.
            </para>
        </section>

        <section id='variable-flag-syntax'>
            <title>Variable Flag Syntax</title>

            <para>
                Variable flags are BitBake's implementation of variable properties
                or attributes.
                It is a way of tagging extra information onto a variable.
                You can find more out about variable flags in general in the
                "<link linkend='variable-flags'>Variable Flags</link>"
                section.
            </para>

            <para>
                You can define, append, and prepend values to variable flags.
                All the standard syntax operations previously mentioned work
                for variable flags except for override style syntax
                (i.e. "_prepend", "_append", and "_remove").
            </para>

            <para>
                Here are some examples showing how to set variable flags:
                <literallayout class='monospaced'>
     FOO[a] = "abc"
     FOO[b] = "123"
     FOO[a] += "456"
                </literallayout>
                The variable <filename>FOO</filename> has two flags:
                <filename>[a]</filename> and <filename>[b]</filename>.
                The flags are immediately set to "abc" and "123", respectively.
                The <filename>[a]</filename> flag becomes "abc 456".
            </para>

            <para>
                No need exists to pre-define variable flags.
                You can simply start using them.
                One extremely common application
                is to attach some brief documentation to a BitBake variable as
                follows:
                <literallayout class='monospaced'>
     CACHE[doc] = "The directory holding the cache of the metadata."
                </literallayout>
            </para>
        </section>

        <section id='inline-python-variable-expansion'>
            <title>Inline Python Variable Expansion</title>

            <para>
                You can use inline Python variable expansion to
                set variables.
                Here is an example:
                <literallayout class='monospaced'>
     DATE = "${@time.strftime('%Y%m%d',time.gmtime())}"
                </literallayout>
                This example results in the <filename>DATE</filename>
                variable being set to the current date.
            </para>

            <para>
                Probably the most common use of this feature is to extract
                the value of variables from BitBake's internal data dictionary,
                <filename>d</filename>.
                The following lines select the values of a package name
                and its version number, respectively:
                <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>
                <note>
                    Inline Python expressions work just like variable expansions
                    insofar as the "=" and ":=" operators are concerned.
                    Given the following assignment, <filename>foo()</filename>
                    is called each time <filename>FOO</filename> is expanded:
                    <literallayout class='monospaced'>
     FOO = "${@foo()}"
                    </literallayout>
                    Contrast this with the following immediate assignment, where
                    <filename>foo()</filename> is only called once, while the
                    assignment is parsed:
                    <literallayout class='monospaced'>
     FOO := "${@foo()}"
                    </literallayout>
                </note>
                For a different way to set variables with Python code during
                parsing, see the
                "<link linkend='anonymous-python-functions'>Anonymous Python Functions</link>"
                section.
            </para>
        </section>

        <section id='unsetting-variables'>
            <title>Unseting variables</title>

            <para>
                It is possible to completely remove a variable or a variable flag
                from BitBake's internal data dictionary by using the "unset" keyword.
                Here is an example:
                <literallayout class='monospaced'>
        unset DATE
        unset do_fetch[noexec]
                </literallayout>
                These two statements remove the <filename>DATE</filename> and the
                <filename>do_fetch[noexec]</filename> flag.
            </para>

        </section>

        <section id='providing-pathnames'>
            <title>Providing Pathnames</title>

            <para>
                When specifying pathnames for use with BitBake,
                do not use the tilde ("~") character as a shortcut
                for your home directory.
                Doing so might cause BitBake to not recognize the
                path since BitBake does not expand this character in
                the same way a shell would.
            </para>

            <para>
                Instead, provide a fuller path as the following
                example illustrates:
                <literallayout class='monospaced'>
     BBLAYERS ?= " \
       /home/scott-lenovo/LayerA \
       "
                </literallayout>
            </para>
        </section>
    </section>

    <section id='exporting-variables-to-the-environment'>
        <title>Exporting Variables to the Environment</title>

        <para>
            You can export variables to the environment of running
            tasks by using the <filename>export</filename> keyword.
            For example, in the following example, the
            <filename>do_foo</filename> task prints "value from
            the environment" when run:
            <literallayout class='monospaced'>
     export ENV_VARIABLE
     ENV_VARIABLE = "value from the environment"

     do_foo() {
         bbplain "$ENV_VARIABLE"
     }
            </literallayout>
            <note>
                BitBake does not expand <filename>$ENV_VARIABLE</filename>
                in this case because it lacks the obligatory
                <filename>{}</filename>.
                Rather, <filename>$ENV_VARIABLE</filename> is expanded
                by the shell.
            </note>
            It does not matter whether
            <filename>export ENV_VARIABLE</filename> appears before or
            after assignments to <filename>ENV_VARIABLE</filename>.
        </para>

        <para>
            It is also possible to combine <filename>export</filename>
            with setting a value for the variable.
            Here is an example:
            <literallayout class='monospaced'>
     export ENV_VARIABLE = "<replaceable>variable-value</replaceable>"
            </literallayout>
            In the output of <filename>bitbake -e</filename>, variables
            that are exported to the environment are preceded by "export".
        </para>

        <para>
            Among the variables commonly exported to the environment
            are <filename>CC</filename> and <filename>CFLAGS</filename>,
            which are picked up by many build systems.
        </para>
    </section>

    <section id='conditional-syntax-overrides'>
        <title>Conditional Syntax (Overrides)</title>

        <para>
            BitBake uses
            <link linkend='var-OVERRIDES'><filename>OVERRIDES</filename></link>
            to control what variables are overridden after BitBake
            parses recipes and configuration files.
            This section describes how you can use
            <filename>OVERRIDES</filename> as conditional metadata,
            talks about key expansion in relationship to
            <filename>OVERRIDES</filename>, and provides some examples
            to help with understanding.
        </para>

        <section id='conditional-metadata'>
            <title>Conditional Metadata</title>

            <para>
                You can use <filename>OVERRIDES</filename> to conditionally select
                a specific version of a variable and to conditionally
                append or prepend the value of a variable.
                <note>
                    Overrides can only use lower-case characters.
                    Additionally, underscores are not permitted in override names
                    as they are used to separate overrides from each other and
                    from the variable name.
                </note>
                <itemizedlist>
                    <listitem><para><emphasis>Selecting a Variable:</emphasis>
                        The <filename>OVERRIDES</filename> variable is
                        a colon-character-separated list that contains items
                        for which you want to satisfy conditions.
                        Thus, if you have a variable that is conditional on “arm”, and “arm”
                        is in <filename>OVERRIDES</filename>, then the “arm”-specific
                        version of the variable is used rather than the non-conditional
                        version.
                        Here is an example:
                        <literallayout class='monospaced'>
     OVERRIDES = "architecture:os:machine"
     TEST = "default"
     TEST_os = "osspecific"
     TEST_nooverride = "othercondvalue"
                        </literallayout>
                        In this example, the <filename>OVERRIDES</filename>
                        variable lists three overrides:
                        "architecture", "os", and "machine".
                        The variable <filename>TEST</filename> by itself has a default
                        value of "default".
                        You select the os-specific version of the <filename>TEST</filename>
                        variable by appending the "os" override to the variable
                        (i.e.<filename>TEST_os</filename>).
                        </para>

                        <para>
                            To better understand this, consider a practical example
                            that assumes an OpenEmbedded metadata-based Linux
                            kernel recipe file.
                            The following lines from the recipe file first set
                            the kernel branch variable <filename>KBRANCH</filename>
                            to a default value, then conditionally override that
                            value based on the architecture of the build:
                        <literallayout class='monospaced'>
     KBRANCH = "standard/base"
     KBRANCH_qemuarm  = "standard/arm-versatile-926ejs"
     KBRANCH_qemumips = "standard/mti-malta32"
     KBRANCH_qemuppc  = "standard/qemuppc"
     KBRANCH_qemux86  = "standard/common-pc/base"
     KBRANCH_qemux86-64  = "standard/common-pc-64/base"
     KBRANCH_qemumips64 = "standard/mti-malta64"
                        </literallayout>
                        </para></listitem>
                    <listitem><para><emphasis>Appending and Prepending:</emphasis>
                        BitBake also supports append and prepend operations to
                        variable values based on whether a specific item is
                        listed in <filename>OVERRIDES</filename>.
                        Here is an example:
                        <literallayout class='monospaced'>
     DEPENDS = "glibc ncurses"
     OVERRIDES = "machine:local"
     DEPENDS_append_machine = " libmad"
                        </literallayout>
                        In this example, <filename>DEPENDS</filename> becomes
                        "glibc ncurses libmad".
                        </para>

                        <para>
                            Again, using an OpenEmbedded metadata-based
                            kernel recipe file as an example, the
                            following lines will conditionally append to the
                            <filename>KERNEL_FEATURES</filename> variable based
                            on the architecture:
                        <literallayout class='monospaced'>
     KERNEL_FEATURES_append = " ${KERNEL_EXTRA_FEATURES}"
     KERNEL_FEATURES_append_qemux86=" cfg/sound.scc cfg/paravirt_kvm.scc"
     KERNEL_FEATURES_append_qemux86-64=" cfg/sound.scc cfg/paravirt_kvm.scc"
                        </literallayout>
                        </para></listitem>
                    <listitem><para><emphasis>Setting a Variable for a Single Task:</emphasis>
                        BitBake supports setting a variable just for the
                        duration of a single task.
                        Here is an example:
                        <literallayout class='monospaced'>
     FOO_task-configure = "val 1"
     FOO_task-compile = "val 2"
                        </literallayout>
                        In the previous example, <filename>FOO</filename>
                        has the value "val 1" while the
                        <filename>do_configure</filename> task is executed,
                        and the value "val 2" while the
                        <filename>do_compile</filename> task is executed.
                        </para>

                        <para>Internally, this is implemented by prepending
                        the task (e.g. "task-compile:") to the value of
                        <link linkend='var-OVERRIDES'><filename>OVERRIDES</filename></link>
                        for the local datastore of the <filename>do_compile</filename>
                        task.</para>

                        <para>You can also use this syntax with other combinations
                        (e.g. "<filename>_prepend</filename>") as shown in the
                        following example:
                        <literallayout class='monospaced'>
     EXTRA_OEMAKE_prepend_task-compile = "${PARALLEL_MAKE} "
                        </literallayout>
                        </para></listitem>
                </itemizedlist>
            </para>
        </section>

        <section id='key-expansion'>
            <title>Key Expansion</title>

            <para>
                Key expansion happens when the BitBake datastore is finalized
                just before BitBake expands overrides.
                To better understand this, consider the following example:
                <literallayout class='monospaced'>
     A${B} = "X"
     B = "2"
     A2 = "Y"
                </literallayout>
                In this case, after all the parsing is complete, and
                before any overrides are handled, BitBake expands
                <filename>${B}</filename> into "2".
                This expansion causes <filename>A2</filename>, which was
                set to "Y" before the expansion, to become "X".
            </para>
        </section>

        <section id='variable-interaction-worked-examples'>
            <title>Examples</title>

            <para>
                Despite the previous explanations that show the different forms of
                variable definitions, it can be hard to work
                out exactly what happens when variable operators, conditional
                overrides, and unconditional overrides are combined.
                This section presents some common scenarios along
                with explanations for variable interactions that
                typically confuse users.
            </para>

            <para>
                There is often confusion concerning the order in which
                overrides and various "append" operators take effect.
                Recall that an append or prepend operation using "_append"
                and "_prepend" does not result in an immediate assignment
                as would "+=", ".=", "=+", or "=.".
                Consider the following example:
                <literallayout class='monospaced'>
     OVERRIDES = "foo"
     A = "Z"
     A_foo_append = "X"
                </literallayout>
                For this case, <filename>A</filename> is
                unconditionally set to "Z" and "X" is
                unconditionally and immediately appended to the variable
                <filename>A_foo</filename>.
                Because overrides have not been applied yet,
                <filename>A_foo</filename> is set to "X" due to the append
                and <filename>A</filename> simply equals "Z".
            </para>

            <para>
                Applying overrides, however, changes things.
                Since "foo" is listed in <filename>OVERRIDES</filename>,
                the conditional variable <filename>A</filename> is replaced
                with the "foo" version, which is equal to "X".
                So effectively, <filename>A_foo</filename> replaces <filename>A</filename>.
            </para>

            <para>
                This next example changes the order of the override and
                the append:
                <literallayout class='monospaced'>
     OVERRIDES = "foo"
     A = "Z"
     A_append_foo = "X"
                </literallayout>
                For this case, before overrides are handled,
                <filename>A</filename> is set to "Z" and <filename>A_append_foo</filename>
                is set to "X".
                Once the override for "foo" is applied, however,
                <filename>A</filename> gets appended with "X".
                Consequently, <filename>A</filename> becomes "ZX".
                Notice that spaces are not appended.
            </para>

            <para>
                This next example has the order of the appends and overrides reversed
                back as in the first example:
                <literallayout class='monospaced'>
     OVERRIDES = "foo"
     A = "Y"
     A_foo_append = "Z"
     A_foo_append = "X"
                </literallayout>
                For this case, before any overrides are resolved,
                <filename>A</filename> is set to "Y" using an immediate assignment.
                After this immediate assignment, <filename>A_foo</filename> is set
                to "Z", and then further appended with
                "X" leaving the variable set to "ZX".
                Finally, applying the override for "foo" results in the conditional
                variable <filename>A</filename> becoming "ZX" (i.e.
                <filename>A</filename> is replaced with <filename>A_foo</filename>).
            </para>

            <para>
                This final example mixes in some varying operators:
                <literallayout class='monospaced'>
     A = "1"
     A_append = "2"
     A_append = "3"
     A += "4"
     A .= "5"
                </literallayout>
                For this case, the type of append operators are affecting the
                order of assignments as BitBake passes through the code
                multiple times.
                Initially, <filename>A</filename> is set to "1 45" because
                of the three statements that use immediate operators.
                After these assignments are made, BitBake applies the
                "_append" operations.
                Those operations result in <filename>A</filename> becoming "1 4523".
            </para>
        </section>
    </section>

    <section id='sharing-functionality'>
        <title>Sharing Functionality</title>

        <para>
            BitBake allows for metadata sharing through include files
            (<filename>.inc</filename>) and class files
            (<filename>.bbclass</filename>).
            For example, suppose you have a piece of common functionality
            such as a task definition that you want to share between
            more than one recipe.
            In this case, creating a <filename>.bbclass</filename>
            file that contains the common functionality and then using
            the <filename>inherit</filename> directive in your recipes to
            inherit the class would be a common way to share the task.
        </para>

        <para>
            This section presents the mechanisms BitBake provides to
            allow you to share functionality between recipes.
            Specifically, the mechanisms include <filename>include</filename>,
            <filename>inherit</filename>, <filename>INHERIT</filename>, and
            <filename>require</filename> directives.
        </para>

        <section id='locating-include-and-class-files'>
            <title>Locating Include and Class Files</title>

            <para>
                BitBake uses the
                <link linkend='var-BBPATH'><filename>BBPATH</filename></link>
                variable to locate needed include and class files.
                Additionally, BitBake searches the current directory for
                <filename>include</filename> and <filename>require</filename>
                directives.
                <note>
                    The <filename>BBPATH</filename> variable is analogous to
                    the environment variable <filename>PATH</filename>.
                </note>
            </para>

            <para>
                In order for include and class files to be found by BitBake,
                they need to be located in a "classes" subdirectory that can
                be found in <filename>BBPATH</filename>.
            </para>
        </section>

        <section id='inherit-directive'>
            <title><filename>inherit</filename> Directive</title>

            <para>
                When writing a recipe or class file, you can use the
                <filename>inherit</filename> directive to inherit the
                functionality of a class (<filename>.bbclass</filename>).
                BitBake only supports this directive when used within recipe
                and class files (i.e. <filename>.bb</filename> and
                <filename>.bbclass</filename>).
            </para>

            <para>
                The <filename>inherit</filename> directive is a rudimentary
                means of specifying functionality contained in class files
                that your recipes require.
                For example, you can easily abstract out the tasks involved in
                building a package that uses Autoconf and Automake and put
                those tasks into a class file and then have your recipe
                inherit that class file.
            </para>

            <para>
                As an example, your recipes could use the following directive
                to inherit an <filename>autotools.bbclass</filename> file.
                The class file would contain common functionality for using
                Autotools that could be shared across recipes:
                <literallayout class='monospaced'>
     inherit autotools
                </literallayout>
                In this case, BitBake would search for the directory
                <filename>classes/autotools.bbclass</filename>
                in <filename>BBPATH</filename>.
                <note>
                    You can override any values and functions of the
                    inherited class within your recipe by doing so
                    after the "inherit" statement.
                </note>
                If you want to use the directive to inherit
                multiple classes, separate them with spaces.
                The following example shows how to inherit both the
                <filename>buildhistory</filename> and <filename>rm_work</filename>
                classes:
                <literallayout class='monospaced'>
     inherit buildhistory rm_work
                </literallayout>
            </para>

            <para>
                An advantage with the inherit directive as compared to both
                the
                <link linkend='include-directive'>include</link> and
                <link linkend='require-inclusion'>require</link> directives
                is that you can inherit class files conditionally.
                You can accomplish this by using a variable expression
                after the <filename>inherit</filename> statement.
                Here is an example:
                <literallayout class='monospaced'>
     inherit ${VARNAME}
                </literallayout>
                If <filename>VARNAME</filename> is going to be set, it needs
                to be set before the <filename>inherit</filename> statement
                is parsed.
                One way to achieve a conditional inherit in this case is to use
                overrides:
                <literallayout class='monospaced'>
     VARIABLE = ""
     VARIABLE_someoverride = "myclass"
                </literallayout>
            </para>

            <para>
                Another method is by using anonymous Python.
                Here is an example:
                <literallayout class='monospaced'>
     python () {
         if condition == value:
             d.setVar('VARIABLE', 'myclass')
         else:
             d.setVar('VARIABLE', '')
     }
                </literallayout>
            </para>

            <para>
                Alternatively, you could use an in-line Python expression
                in the following form:
                <literallayout class='monospaced'>
     inherit ${@'classname' if condition else ''}
     inherit ${@functionname(params)}
                </literallayout>
                In all cases, if the expression evaluates to an empty
                string, the statement does not trigger a syntax error
                because it becomes a no-op.
            </para>
        </section>

        <section id='include-directive'>
            <title><filename>include</filename> Directive</title>

            <para>
                BitBake understands the <filename>include</filename>
                directive.
                This directive causes BitBake to parse whatever file you specify,
                and to insert that file at that location.
                The directive is much like its equivalent in Make except
                that if the path specified on the include line is a relative
                path, BitBake locates the first file it can find
                within <filename>BBPATH</filename>.
            </para>

            <para>
                The include directive is a more generic method of including
                functionality as compared to the
                <link linkend='inherit-directive'>inherit</link> directive,
                which is restricted to class (i.e. <filename>.bbclass</filename>)
                files.
                The include directive is applicable for any other kind of
                shared or encapsulated functionality or configuration that
                does not suit a <filename>.bbclass</filename> file.
            </para>

            <para>
                As an example, suppose you needed a recipe to include some
                self-test definitions:
                <literallayout class='monospaced'>
     include test_defs.inc
                </literallayout>
                <note>
                    The <filename>include</filename> directive does not
                    produce an error when the file cannot be found.
                    Consequently, it is recommended that if the file you
                    are including is expected to exist, you should use
                    <link linkend='require-inclusion'><filename>require</filename></link>
                    instead of <filename>include</filename>.
                    Doing so makes sure that an error is produced if the
                    file cannot be found.
                </note>
            </para>
        </section>

        <section id='require-inclusion'>
            <title><filename>require</filename> Directive</title>

            <para>
                BitBake understands the <filename>require</filename>
                directive.
                This directive behaves just like the
                <filename>include</filename> directive with the exception that
                BitBake raises a parsing error if the file to be included cannot
                be found.
                Thus, any file you require is inserted into the file that is
                being parsed at the location of the directive.
            </para>

            <para>
                The require directive, like the include directive previously
                described, is a more generic method of including
                functionality as compared to the
                <link linkend='inherit-directive'>inherit</link> directive,
                which is restricted to class (i.e. <filename>.bbclass</filename>)
                files.
                The require directive is applicable for any other kind of
                shared or encapsulated functionality or configuration that
                does not suit a <filename>.bbclass</filename> file.
            </para>

            <para>
                Similar to how BitBake handles
                <link linkend='include-directive'><filename>include</filename></link>,
                if the path specified
                on the require line is a relative path, BitBake locates
                the first file it can find within <filename>BBPATH</filename>.
            </para>

            <para>
                As an example, suppose you have two versions of a recipe
                (e.g. <filename>foo_1.2.2.bb</filename> and
                <filename>foo_2.0.0.bb</filename>) where
                each version contains some identical functionality that could be
                shared.
                You could create an include file named <filename>foo.inc</filename>
                that contains the common definitions needed to build "foo".
                You need to be sure <filename>foo.inc</filename> is located in the
                same directory as your two recipe files as well.
                Once these conditions are set up, you can share the functionality
                using a <filename>require</filename> directive from within each
                recipe:
                <literallayout class='monospaced'>
     require foo.inc
                </literallayout>
            </para>
        </section>

        <section id='inherit-configuration-directive'>
            <title><filename>INHERIT</filename> Configuration Directive</title>

            <para>
                When creating a configuration file (<filename>.conf</filename>),
                you can use the
                <link linkend='var-INHERIT'><filename>INHERIT</filename></link>
                configuration directive to inherit a class.
                BitBake only supports this directive when used within
                a configuration file.
            </para>

            <para>
                As an example, suppose you needed to inherit a class
                file called <filename>abc.bbclass</filename> from a
                configuration file as follows:
                <literallayout class='monospaced'>
     INHERIT += "abc"
                </literallayout>
                This configuration directive causes the named
                class to be inherited at the point of the directive
                during parsing.
                As with the <filename>inherit</filename> directive, the
                <filename>.bbclass</filename> file must be located in a
                "classes" subdirectory in one of the directories specified
                in <filename>BBPATH</filename>.
                <note>
                    Because <filename>.conf</filename> files are parsed
                    first during BitBake's execution, using
                    <filename>INHERIT</filename> to inherit a class effectively
                    inherits the class globally (i.e. for all recipes).
                </note>
                If you want to use the directive to inherit
                multiple classes, you can provide them on the same line in the
                <filename>local.conf</filename> file.
                Use spaces to separate the classes.
                The following example shows how to inherit both the
                <filename>autotools</filename> and <filename>pkgconfig</filename>
                classes:
                <literallayout class='monospaced'>
     INHERIT += "autotools pkgconfig"
                </literallayout>
            </para>
        </section>
    </section>

    <section id='functions'>
        <title>Functions</title>

        <para>
            As with most languages, functions are the building blocks that
            are used to build up operations into tasks.
            BitBake supports these types of functions:
            <itemizedlist>
                <listitem><para><emphasis>Shell Functions:</emphasis>
                    Functions written in shell script and executed either
                    directly as functions, tasks, or both.
                    They can also be called by other shell functions.
                    </para></listitem>
                <listitem><para><emphasis>BitBake-Style Python Functions:</emphasis>
                    Functions written in Python and executed by BitBake or other
                    Python functions using <filename>bb.build.exec_func()</filename>.
                    </para></listitem>
                <listitem><para><emphasis>Python Functions:</emphasis>
                    Functions written in Python and executed by Python.
                    </para></listitem>
                <listitem><para><emphasis>Anonymous Python Functions:</emphasis>
                    Python functions executed automatically during
                    parsing.
                    </para></listitem>
            </itemizedlist>
            Regardless of the type of function, you can only
            define them in class (<filename>.bbclass</filename>)
            and recipe (<filename>.bb</filename> or <filename>.inc</filename>)
            files.
        </para>

        <section id='shell-functions'>
            <title>Shell Functions</title>

            <para>
                Functions written in shell script and executed either
                directly as functions, tasks, or both.
                They can also be called by other shell functions.
                Here is an example shell function definition:
                <literallayout class='monospaced'>
     some_function () {
         echo "Hello World"
     }
                </literallayout>
                When you create these types of functions in your recipe
                or class files, you need to follow the shell programming
                rules.
                The scripts are executed by <filename>/bin/sh</filename>,
                which may not be a bash shell but might be something
                such as <filename>dash</filename>.
                You should not use Bash-specific script (bashisms).
            </para>

            <para>
                Overrides and override-style operators like
                <filename>_append</filename> and
                <filename>_prepend</filename> can also be applied to
                shell functions.
                Most commonly, this application would be used in a
                <filename>.bbappend</filename> file to modify functions in
                the main recipe.
                It can also be used to modify functions inherited from
                classes.
            </para>

            <para>
                As an example, consider the following:
                <literallayout class='monospaced'>
     do_foo() {
         bbplain first
         fn
     }

     fn_prepend() {
         bbplain second
     }

     fn() {
         bbplain third
     }

     do_foo_append() {
         bbplain fourth
     }
                </literallayout>
                Running <filename>do_foo</filename>
                prints the following:
                <literallayout class='monospaced'>
     recipename do_foo: first
     recipename do_foo: second
     recipename do_foo: third
     recipename do_foo: fourth
                </literallayout>
                <note>
                    Overrides and override-style operators can
                    be applied to any shell function, not just
                    <link linkend='tasks'>tasks</link>.
                </note>
                You can use the <filename>bitbake -e</filename>&nbsp;<replaceable>recipename</replaceable>
                command to view the final assembled function
                after all overrides have been applied.
            </para>
        </section>

        <section id='bitbake-style-python-functions'>
            <title>BitBake-Style Python Functions</title>

            <para>
                These functions are written in Python and executed by
                BitBake or other Python functions using
                <filename>bb.build.exec_func()</filename>.
            </para>

            <para>
                An example BitBake function is:
                <literallayout class='monospaced'>
     python some_python_function () {
         d.setVar("TEXT", "Hello World")
         print d.getVar("TEXT")
     }
                </literallayout>
                Because the Python "bb" and "os" modules are already
                imported, you do not need to import these modules.
                Also in these types of functions, the datastore ("d")
                is a global variable and is always automatically
                available.
                <note>
                    Variable expressions (e.g. <filename>${X}</filename>)
                    are no longer expanded within Python functions.
                    This behavior is intentional in order to allow you
                    to freely set variable values to expandable expressions
                    without having them expanded prematurely.
                    If you do wish to expand a variable within a Python
                    function, use <filename>d.getVar("X")</filename>.
                    Or, for more complicated expressions, use
                    <filename>d.expand()</filename>.
                </note>
            </para>

            <para>
                Similar to shell functions, you can also apply overrides
                and override-style operators to BitBake-style Python
                functions.
            </para>

            <para>
                As an example, consider the following:
                <literallayout class='monospaced'>
     python do_foo_prepend() {
         bb.plain("first")
     }

     python do_foo() {
         bb.plain("second")
     }

     python do_foo_append() {
         bb.plain("third")
     }
                </literallayout>
                Running <filename>do_foo</filename> prints
                the following:
                <literallayout class='monospaced'>
     recipename do_foo: first
     recipename do_foo: second
     recipename do_foo: third
                </literallayout>
                You can use the <filename>bitbake -e</filename>&nbsp;<replaceable>recipename</replaceable>
                command to view the final assembled function
                after all overrides have been applied.
            </para>
        </section>

        <section id='python-functions'>
            <title>Python Functions</title>

            <para>
                These functions are written in Python and are executed by
                other Python code.
                Examples of Python functions are utility functions
                that you intend to call from in-line Python or
                from within other Python functions.
                Here is an example:
                <literallayout class='monospaced'>
     def get_depends(d):
         if d.getVar('SOMECONDITION'):
             return "dependencywithcond"
         else:
             return "dependency"
     SOMECONDITION = "1"
     DEPENDS = "${@get_depends(d)}"
                </literallayout>
                This would result in <filename>DEPENDS</filename>
                containing <filename>dependencywithcond</filename>.
            </para>

            <para>
                Here are some things to know about Python functions:
                <itemizedlist>
                    <listitem><para>Python functions can take parameters.
                        </para></listitem>
                    <listitem><para>The BitBake datastore is not
                        automatically available.
                        Consequently, you must pass it in as a
                        parameter to the function.
                        </para></listitem>
                    <listitem><para>The "bb" and "os" Python modules are
                        automatically available.
                        You do not need to import them.
                        </para></listitem>
                </itemizedlist>
            </para>
        </section>

        <section id='bitbake-style-python-functions-versus-python-functions'>
            <title>Bitbake-Style Python Functions Versus Python Functions</title>

            <para>
                Following are some important differences between
                BitBake-style Python functions and regular Python
                functions defined with "def":
                <itemizedlist>
                    <listitem><para>
                        Only BitBake-style Python functions can be
                        <link linkend='tasks'>tasks</link>.
                        </para></listitem>
                    <listitem><para>
                        Overrides and override-style operators can only
                        be applied to BitBake-style Python functions.
                        </para></listitem>
                    <listitem><para>
                        Only regular Python functions can take arguments
                        and return values.
                        </para></listitem>
                    <listitem><para>
                        <link linkend='variable-flags'>Variable flags</link>
                        such as <filename>[dirs]</filename>,
                        <filename>[cleandirs]</filename>, and
                        <filename>[lockfiles]</filename> can be used
                        on BitBake-style Python functions, but not on
                        regular Python functions.
                        </para></listitem>
                    <listitem><para>
                        BitBake-style Python functions generate a separate
                        <filename>${</filename><link linkend='var-T'><filename>T</filename></link><filename>}/run.</filename><replaceable>function-name</replaceable><filename>.</filename><replaceable>pid</replaceable>
                        script that is executed to run the function, and also
                        generate a log file in
                        <filename>${T}/log.</filename><replaceable>function-name</replaceable><filename>.</filename><replaceable>pid</replaceable>
                        if they are executed as tasks.</para>

                        <para>
                        Regular Python functions execute "inline" and do not
                        generate any files in <filename>${T}</filename>.
                        </para></listitem>
                    <listitem><para>
                        Regular Python functions are called with the usual
                        Python syntax.
                        BitBake-style Python functions are usually tasks and
                        are called directly by BitBake, but can also be called
                        manually from Python code by using the
                        <filename>bb.build.exec_func()</filename> function.
                        Here is an example:
                        <literallayout class='monospaced'>
     bb.build.exec_func("my_bitbake_style_function", d)
                        </literallayout>
                        <note>
                            <filename>bb.build.exec_func()</filename> can also
                            be used to run shell functions from Python code.
                            If you want to run a shell function before a Python
                            function within the same task, then you can use a
                            parent helper Python function that starts by running
                            the shell function with
                            <filename>bb.build.exec_func()</filename> and then
                            runs the Python code.
                        </note></para>

                        <para>To detect errors from functions executed with
                        <filename>bb.build.exec_func()</filename>, you
                        can catch the <filename>bb.build.FuncFailed</filename>
                        exception.
                        <note>
                            Functions in metadata (recipes and classes) should
                            not themselves raise
                            <filename>bb.build.FuncFailed</filename>.
                            Rather, <filename>bb.build.FuncFailed</filename>
                            should be viewed as a general indicator that the
                            called function failed by raising an exception.
                            For example, an exception raised by
                            <filename>bb.fatal()</filename> will be caught inside
                            <filename>bb.build.exec_func()</filename>, and a
                            <filename>bb.build.FuncFailed</filename> will be raised
                            in response.
                        </note>
                        </para></listitem>
                </itemizedlist>
            </para>

            <para>
                Due to their simplicity, you should prefer regular Python functions
                over BitBake-style Python functions unless you need a feature specific
                to BitBake-style Python functions.
                Regular Python functions in metadata are a more recent invention than
                BitBake-style Python functions, and older code tends to use
                <filename>bb.build.exec_func()</filename> more often.
            </para>
        </section>

        <section id='anonymous-python-functions'>
            <title>Anonymous Python Functions</title>

            <para>
                Sometimes it is useful to set variables or perform
                other operations programmatically during parsing.
                To do this, you can define special Python functions,
                called anonymous Python functions, that run at the
                end of parsing.
                For example, the following conditionally sets a variable
                based on the value of  another variable:
                <literallayout class='monospaced'>
     python () {
         if d.getVar('SOMEVAR') == 'value':
             d.setVar('ANOTHERVAR', 'value2')
     }
                </literallayout>
                An equivalent way to mark a function as an anonymous
                function is to give it the name "__anonymous", rather
                than no name.
            </para>

            <para>
                Anonymous Python functions always run at the end
                of parsing, regardless of where they are defined.
                If a recipe contains many anonymous functions, they
                run in the same order as they are defined within the
                recipe.
                As an example, consider the following snippet:
                <literallayout class='monospaced'>
     python () {
         d.setVar('FOO', 'foo 2')
     }

     FOO = "foo 1"

     python () {
         d.appendVar('BAR', ' bar 2')
     }

     BAR = "bar 1"
                </literallayout>
                The previous example is conceptually equivalent to the
                following snippet:
                <literallayout class='monospaced'>
     FOO = "foo 1"
     BAR = "bar 1"
     FOO = "foo 2"
     BAR += "bar 2"
                </literallayout>
                <filename>FOO</filename> ends up with the value "foo 2",
                and <filename>BAR</filename> with the value "bar 1 bar 2".
                Just as in the second snippet, the values set for the
                variables within the anonymous functions become available
                to tasks, which always run after parsing.
            </para>

            <para>
                Overrides and override-style operators such as
                "<filename>_append</filename>" are applied before
                anonymous functions run.
                In the following example, <filename>FOO</filename> ends
                up with the value "foo from anonymous":
                <literallayout class='monospaced'>
     FOO = "foo"
     FOO_append = " from outside"

     python () {
         d.setVar("FOO", "foo from anonymous")
     }
                </literallayout>
                For methods you can use with anonymous Python functions,
                see the
                "<link linkend='functions-you-can-call-from-within-python'>Functions You Can Call From Within Python</link>"
                section.
                For a different method to run Python code during parsing,
                see the
                "<link linkend='inline-python-variable-expansion'>Inline Python Variable Expansion</link>"
                section.
            </para>
        </section>

        <section id='flexible-inheritance-for-class-functions'>
            <title>Flexible Inheritance for Class Functions</title>

            <para>
                Through coding techniques and the use of
                <filename>EXPORT_FUNCTIONS</filename>, BitBake supports
                exporting a function from a class such that the
                class function appears as the default implementation
                of the function, but can still be called if a recipe
                inheriting the class needs to define its own version of
                the function.
            </para>

            <para>
                To understand the benefits of this feature, consider
                the basic scenario where a class defines a task function
                and your recipe inherits the class.
                In this basic scenario, your recipe inherits the task
                function as defined in the class.
                If desired, your recipe can add to the start and end of the
                function by using the "_prepend" or "_append" operations
                respectively, or it can redefine the function completely.
                However, if it redefines the function, there is
                no means  for it to call the class version of the function.
                <filename>EXPORT_FUNCTIONS</filename> provides a mechanism
                that enables the recipe's version of the function to call
                the original version of the function.
            </para>

            <para>
                To make use of this technique, you need the following
                things in place:
                <itemizedlist>
                    <listitem><para>
                        The class needs to define the function as follows:
                        <literallayout class='monospaced'>
     <replaceable>classname</replaceable><filename>_</filename><replaceable>functionname</replaceable>
                        </literallayout>
                        For example, if you have a class file
                        <filename>bar.bbclass</filename> and a function named
                        <filename>do_foo</filename>, the class must define the function
                        as follows:
                        <literallayout class='monospaced'>
     bar_do_foo
                        </literallayout>
                        </para></listitem>
                    <listitem><para>
                        The class needs to contain the <filename>EXPORT_FUNCTIONS</filename>
                        statement as follows:
                        <literallayout class='monospaced'>
     EXPORT_FUNCTIONS <replaceable>functionname</replaceable>
                        </literallayout>
                        For example, continuing with the same example, the
                        statement in the <filename>bar.bbclass</filename> would be
                        as follows:
                        <literallayout class='monospaced'>
     EXPORT_FUNCTIONS do_foo
                        </literallayout>
                        </para></listitem>
                    <listitem><para>
                        You need to call the function appropriately from within your
                        recipe.
                        Continuing with the same example, if your recipe
                        needs to call the class version of the function,
                        it should call <filename>bar_do_foo</filename>.
                        Assuming <filename>do_foo</filename> was a shell function
                        and <filename>EXPORT_FUNCTIONS</filename> was used as above,
                        the recipe's function could conditionally call the
                        class version of the function as follows:
                        <literallayout class='monospaced'>
     do_foo() {
             if [ somecondition ] ; then
                     bar_do_foo
             else
                     # Do something else
             fi
     }
                        </literallayout>
                        To call your modified version of the function as defined
                        in your recipe, call it as <filename>do_foo</filename>.
                        </para></listitem>
                </itemizedlist>
                With these conditions met, your single recipe
                can freely choose between the original function
                as defined in the class file and the modified function in your recipe.
                If you do not set up these conditions, you are limited to using one function
                or the other.
            </para>
        </section>
    </section>

    <section id='tasks'>
        <title>Tasks</title>

        <para>
            Tasks are BitBake execution units that make up the
            steps that BitBake can run for a given recipe.
            Tasks are only supported in recipes and classes
            (i.e. in <filename>.bb</filename> files and files
            included or inherited from <filename>.bb</filename>
            files).
            By convention, tasks have names that start with "do_".
        </para>

        <section id='promoting-a-function-to-a-task'>
            <title>Promoting a Function to a Task</title>

            <para>
                Tasks are either
                <link linkend='shell-functions'>shell functions</link> or
                <link linkend='bitbake-style-python-functions'>BitBake-style Python functions</link>
                that have been promoted to tasks by using the
                <filename>addtask</filename> command.
                The <filename>addtask</filename> command can also
                optionally describe dependencies between the
                task and other tasks.
                Here is an example that shows how to define a task
                and declare some dependencies:
                <literallayout class='monospaced'>
     python do_printdate () {
         import time
         print time.strftime('%Y%m%d', time.gmtime())
     }
     addtask printdate after do_fetch before do_build
                </literallayout>
                The first argument to <filename>addtask</filename>
                is the name of the function to promote to
                a task.
                If the name does not start with "do_", "do_" is
                implicitly added, which enforces the convention that
                all task names start with "do_".
            </para>

            <para>
                In the previous example, the
                <filename>do_printdate</filename> task becomes a
                dependency of the <filename>do_build</filename>
                task, which is the default task (i.e. the task run by
                the <filename>bitbake</filename> command unless
                another task is specified explicitly).
                Additionally, the <filename>do_printdate</filename>
                task becomes dependent upon the
                <filename>do_fetch</filename> task.
                Running the <filename>do_build</filename> task
                results in the <filename>do_printdate</filename>
                task running first.
                <note>
                    If you try out the previous example, you might see that
                    the <filename>do_printdate</filename> task is only run
                    the first time you build the recipe with
                    the <filename>bitbake</filename> command.
                    This is because BitBake considers the task "up-to-date"
                    after that initial run.
                    If you want to force the task to always be rerun for
                    experimentation purposes, you can make BitBake always
                    consider the task "out-of-date" by using the
                    <filename>[</filename><link linkend='variable-flags'><filename>nostamp</filename></link><filename>]</filename>
                    variable flag, as follows:
                    <literallayout class='monospaced'>
     do_printdate[nostamp] = "1"
                    </literallayout>
                    You can also explicitly run the task and provide the
                    <filename>-f</filename> option as follows:
                    <literallayout class='monospaced'>
     $ bitbake <replaceable>recipe</replaceable> -c printdate -f
                    </literallayout>
                    When manually selecting a task to run with the
                    <filename>bitbake</filename>&nbsp;<replaceable>recipe</replaceable>&nbsp;<filename>-c</filename>&nbsp;<replaceable>task</replaceable>
                    command, you can omit the "do_" prefix as part of the
                    task name.
                </note>
            </para>

            <para>
                You might wonder about the practical effects of using
                <filename>addtask</filename> without specifying any
                dependencies as is done in the following example:
                <literallayout class='monospaced'>
     addtask printdate
                </literallayout>
                In this example, assuming dependencies have not been
                added through some other means, the only way to run
                the task is by explicitly selecting it with
                <filename>bitbake</filename>&nbsp;<replaceable>recipe</replaceable>&nbsp;<filename>-c printdate</filename>.
                You can use the
                <filename>do_listtasks</filename> task to list all tasks
                defined in a recipe as shown in the following example:
                <literallayout class='monospaced'>
     $ bitbake <replaceable>recipe</replaceable> -c listtasks
                </literallayout>
                For more information on task dependencies, see the
                "<link linkend='dependencies'>Dependencies</link>"
                section.
            </para>

            <para>
                See the
                "<link linkend='variable-flags'>Variable Flags</link>"
                section for information on variable flags you can use with
                tasks.
            </para>
        </section>

        <section id='deleting-a-task'>
            <title>Deleting a Task</title>

            <para>
                As well as being able to add tasks, you can delete them.
                Simply use the <filename>deltask</filename> command to
                delete a task.
                For example, to delete the example task used in the previous
                sections, you would use:
                <literallayout class='monospaced'>
     deltask printdate
                </literallayout>
                If you delete a task using the <filename>deltask</filename>
                command and the task has dependencies, the dependencies are
                not reconnected.
                For example, suppose you have three tasks named
                <filename>do_a</filename>, <filename>do_b</filename>, and
                <filename>do_c</filename>.
                Furthermore, <filename>do_c</filename> is dependent on
                <filename>do_b</filename>, which in turn is dependent on
                <filename>do_a</filename>.
                Given this scenario, if you use <filename>deltask</filename>
                to delete <filename>do_b</filename>, the implicit dependency
                relationship between <filename>do_c</filename> and
                <filename>do_a</filename> through <filename>do_b</filename>
                no longer exists, and <filename>do_c</filename> dependencies
                are not updated to include <filename>do_a</filename>.
                Thus, <filename>do_c</filename> is free to run before
                <filename>do_a</filename>.
            </para>

            <para>
                If you want dependencies such as these to remain intact, use
                the <filename>[noexec]</filename> varflag to disable the task
                instead of using the <filename>deltask</filename> command to
                delete it:
                <literallayout class='monospaced'>
     do_b[noexec] = "1"
                </literallayout>
            </para>
        </section>

        <section id='passing-information-into-the-build-task-environment'>
            <title>Passing Information Into the Build Task Environment</title>

            <para>
                When running a task, BitBake tightly controls the shell execution
                environment of the build tasks to make
                sure unwanted contamination from the build machine cannot
                influence the build.
                <note>
                    By default, BitBake cleans the environment to include only those
                    things exported or listed in its whitelist to ensure that the build
                    environment is reproducible and consistent.
                    You can prevent this "cleaning" by setting the
                    <link linkend='var-BB_PRESERVE_ENV'><filename>BB_PRESERVE_ENV</filename></link>
                    variable.
                </note>
                Consequently, if you do want something to get passed into the
                build task environment, you must take these two steps:
                <orderedlist>
                    <listitem><para>
                        Tell BitBake to load what you want from the environment
                        into the datastore.
                        You can do so through the
                        <link linkend='var-BB_ENV_WHITELIST'><filename>BB_ENV_WHITELIST</filename></link>
                        and
                        <link linkend='var-BB_ENV_EXTRAWHITE'><filename>BB_ENV_EXTRAWHITE</filename></link>
                        variables.
                        For example, assume you want to prevent the build system from
                        accessing your <filename>$HOME/.ccache</filename>
                        directory.
                        The following command "whitelists" the environment variable
                        <filename>CCACHE_DIR</filename> causing BitBack to allow that
                        variable into the datastore:
                        <literallayout class='monospaced'>
     export BB_ENV_EXTRAWHITE="$BB_ENV_EXTRAWHITE CCACHE_DIR"
                        </literallayout></para></listitem>
                    <listitem><para>
                        Tell BitBake to export what you have loaded into the
                        datastore to the task environment of every running task.
                        Loading something from the environment into the datastore
                        (previous step) only makes it available in the datastore.
                        To export it to the task environment of every running task,
                        use a command similar to the following in your local configuration
                        file <filename>local.conf</filename> or your
                        distribution configuration file:
                        <literallayout class='monospaced'>
     export CCACHE_DIR
                        </literallayout>
                        <note>
                            A side effect of the previous steps is that BitBake
                            records the variable as a dependency of the build process
                            in things like the setscene checksums.
                            If doing so results in unnecessary rebuilds of tasks, you can
                            whitelist the variable so that the setscene code
                            ignores the dependency when it creates checksums.
                        </note></para></listitem>
                </orderedlist>
            </para>

            <para>
                Sometimes, it is useful to be able to obtain information
                from the original execution environment.
                Bitbake saves a copy of the original environment into
                a special variable named
                <link linkend='var-BB_ORIGENV'><filename>BB_ORIGENV</filename></link>.
            </para>

            <para>
                The <filename>BB_ORIGENV</filename> variable returns a datastore
                object that can be queried using the standard datastore operators
                such as <filename>getVar(, False)</filename>.
                The datastore object is useful, for example, to find the original
                <filename>DISPLAY</filename> variable.
                Here is an example:
                <literallayout class='monospaced'>
     origenv = d.getVar("BB_ORIGENV", False)
     bar = origenv.getVar("BAR", False)
                </literallayout>
                The previous example returns <filename>BAR</filename> from the original
                execution environment.
            </para>
        </section>
    </section>

    <section id='variable-flags'>
        <title>Variable Flags</title>

        <para>
            Variable flags (varflags) help control a task's functionality
            and dependencies.
            BitBake reads and writes varflags to the datastore using the following
            command forms:
            <literallayout class='monospaced'>
     <replaceable>variable</replaceable> = d.getVarFlags("<replaceable>variable</replaceable>")
     self.d.setVarFlags("FOO", {"func": True})
            </literallayout>
        </para>

        <para>
            When working with varflags, the same syntax, with the exception of
            overrides, applies.
            In other words, you can set, append, and prepend varflags just like
            variables.
            See the
            "<link linkend='variable-flag-syntax'>Variable Flag Syntax</link>"
            section for details.
        </para>

        <para>
            BitBake has a defined set of varflags available for recipes and
            classes.
            Tasks support a number of these flags which control various
            functionality of the task:
            <itemizedlist>
                <listitem><para><emphasis><filename>[cleandirs]</filename>:</emphasis>
                    Empty directories that should be created before the
                    task runs.
                    Directories that already exist are removed and recreated
                    to empty them.
                    </para></listitem>
                <listitem><para><emphasis><filename>[depends]</filename>:</emphasis>
                    Controls inter-task dependencies.
                    See the
                    <link linkend='var-DEPENDS'><filename>DEPENDS</filename></link>
                    variable and the
                    "<link linkend='inter-task-dependencies'>Inter-Task Dependencies</link>"
                    section for more information.
                    </para></listitem>
                <listitem><para><emphasis><filename>[deptask]</filename>:</emphasis>
                    Controls task build-time dependencies.
                    See the
                    <link linkend='var-DEPENDS'><filename>DEPENDS</filename></link>
                    variable and the
                    "<link linkend='build-dependencies'>Build Dependencies</link>"
                    section for more information.
                    </para></listitem>
                <listitem><para><emphasis><filename>[dirs]</filename>:</emphasis>
                    Directories that should be created before the task runs.
                    Directories that already exist are left as is.
                    The last directory listed is used as the
                    current working directory for the task.
                    </para></listitem>
                <listitem><para><emphasis><filename>[lockfiles]</filename>:</emphasis>
                     Specifies one or more lockfiles to lock while the task
                     executes.
                     Only one task may hold a lockfile, and any task that
                     attempts to lock an already locked file will block until
                     the lock is released.
                     You can use this variable flag to accomplish mutual
                     exclusion.
                    </para></listitem>
                <listitem><para><emphasis><filename>[noexec]</filename>:</emphasis>
                    When set to "1", marks the task as being empty, with
                    no execution required.
                    You can use the <filename>[noexec]</filename> flag to set up
                    tasks as dependency placeholders, or to disable tasks defined
                    elsewhere that are not needed in a particular recipe.
                    </para></listitem>
                <listitem><para><emphasis><filename>[nostamp]</filename>:</emphasis>
                    When set to "1", tells BitBake to not generate a stamp
                    file for a task, which implies the task should always
                    be executed.
                    <note><title>Caution</title>
                        Any task that depends (possibly indirectly) on a
                        <filename>[nostamp]</filename> task will always be
                        executed as well.
                        This can cause unnecessary rebuilding if you are
                        not careful.
                    </note>
                    </para></listitem>
                <listitem><para><emphasis><filename>[number_threads]</filename>:</emphasis>
                    Limits tasks to a specific number of simultaneous threads
                    during execution.
                    This varflag is useful when your build host has a large number
                    of cores but certain tasks need to be rate-limited due to various
                    kinds of resource constraints (e.g. to avoid network throttling).
                    <filename>number_threads</filename> works similarly to the
                    <link linkend='var-BB_NUMBER_THREADS'><filename>BB_NUMBER_THREADS</filename></link>
                    variable but is task-specific.</para>

                    <para>Set the value globally.
                    For example, the following makes sure the
                    <filename>do_fetch</filename> task uses no more than two
                    simultaneous execution threads:
                    <literallayout class='monospaced'>
     do_fetch[number_threads] = "2"
                    </literallayout>
                    <note><title>Warnings</title>
                        <itemizedlist>
                            <listitem><para>
                                Setting the varflag in individual recipes rather
                                than globally can result in unpredictable behavior.
                                </para></listitem>
                            <listitem><para>
                                Setting the varflag to a value greater than the
                                value used in the <filename>BB_NUMBER_THREADS</filename>
                                variable causes <filename>number_threads</filename>
                                to have no effect.
                                </para></listitem>
                        </itemizedlist>
                    </note>
                    </para></listitem>
                <listitem><para><emphasis><filename>[postfuncs]</filename>:</emphasis>
                    List of functions to call after the completion of the task.
                    </para></listitem>
                <listitem><para><emphasis><filename>[prefuncs]</filename>:</emphasis>
                    List of functions to call before the task executes.
                    </para></listitem>
                <listitem><para><emphasis><filename>[rdepends]</filename>:</emphasis>
                    Controls inter-task runtime dependencies.
                    See the
                    <link linkend='var-RDEPENDS'><filename>RDEPENDS</filename></link>
                    variable, the
                    <link linkend='var-RRECOMMENDS'><filename>RRECOMMENDS</filename></link>
                    variable, and the
                    "<link linkend='inter-task-dependencies'>Inter-Task Dependencies</link>"
                    section for more information.
                    </para></listitem>
                <listitem><para><emphasis><filename>[rdeptask]</filename>:</emphasis>
                    Controls task runtime dependencies.
                    See the
                    <link linkend='var-RDEPENDS'><filename>RDEPENDS</filename></link>
                    variable, the
                    <link linkend='var-RRECOMMENDS'><filename>RRECOMMENDS</filename></link>
                    variable, and the
                    "<link linkend='runtime-dependencies'>Runtime Dependencies</link>"
                    section for more information.
                    </para></listitem>
                <listitem><para><emphasis><filename>[recideptask]</filename>:</emphasis>
                    When set in conjunction with
                    <filename>recrdeptask</filename>, specifies a task that
                    should be inspected for additional dependencies.
                    </para></listitem>
                <listitem><para><emphasis><filename>[recrdeptask]</filename>:</emphasis>
                    Controls task recursive runtime dependencies.
                    See the
                    <link linkend='var-RDEPENDS'><filename>RDEPENDS</filename></link>
                    variable, the
                    <link linkend='var-RRECOMMENDS'><filename>RRECOMMENDS</filename></link>
                    variable, and the
                    "<link linkend='recursive-dependencies'>Recursive Dependencies</link>"
                    section for more information.
                    </para></listitem>
                <listitem><para><emphasis><filename>[stamp-extra-info]</filename>:</emphasis>
                    Extra stamp information to append to the task's stamp.
                    As an example, OpenEmbedded uses this flag to allow
                    machine-specific tasks.
                    </para></listitem>
                <listitem><para><emphasis><filename>[umask]</filename>:</emphasis>
                    The umask to run the task under.
                    </para></listitem>
            </itemizedlist>
        </para>

        <para>
            Several varflags are useful for controlling how signatures are
            calculated for variables.
            For more information on this process, see the
            "<link linkend='checksums'>Checksums (Signatures)</link>"
            section.
            <itemizedlist>
                <listitem><para><emphasis><filename>[vardeps]</filename>:</emphasis>
                    Specifies a space-separated list of additional
                    variables to add to a variable's dependencies
                    for the purposes of calculating its signature.
                    Adding variables to this list is useful, for example, when
                    a function refers to a variable in a manner that
                    does not allow BitBake to automatically determine
                    that the variable is referred to.
                    </para></listitem>
                <listitem><para><emphasis><filename>[vardepsexclude]</filename>:</emphasis>
                    Specifies a space-separated list of variables
                    that should be excluded from a variable's dependencies
                    for the purposes of calculating its signature.
                    </para></listitem>
                <listitem><para><emphasis><filename>[vardepvalue]</filename>:</emphasis>
                    If set, instructs BitBake to ignore the actual
                    value of the variable and instead use the specified
                    value when calculating the variable's signature.
                    </para></listitem>
                <listitem><para><emphasis><filename>[vardepvalueexclude]</filename>:</emphasis>
                    Specifies a pipe-separated list of strings to exclude
                    from the variable's value when calculating the
                    variable's signature.
                    </para></listitem>
            </itemizedlist>
        </para>
    </section>

    <section id='events'>
        <title>Events</title>

        <para>
            BitBake allows installation of event handlers within recipe
            and class files.
            Events are triggered at certain points during operation, such
            as the beginning of operation against a given recipe
            (i.e. <filename>*.bb</filename>), the start of a given task,
            a task failure, a task success, and so forth.
            The intent is to make it easy to do things like email
            notification on build failures.
        </para>

        <para>
            Following is an example event handler that prints the name
            of the event and the content of the
            <filename>FILE</filename> variable:
            <literallayout class='monospaced'>
     addhandler myclass_eventhandler
     python myclass_eventhandler() {
         from bb.event import getName
         print("The name of the Event is %s" % getName(e))
         print("The file we run for is %s" % d.getVar('FILE'))
     }
     myclass_eventhandler[eventmask] = "bb.event.BuildStarted bb.event.BuildCompleted"
            </literallayout>
            In the previous example, an eventmask has been set so that
            the handler only sees the "BuildStarted" and "BuildCompleted"
            events.
            This event handler gets called every time an event matching
            the eventmask is triggered.
            A global variable "e" is defined, which represents the current
            event.
            With the <filename>getName(e)</filename> method, you can get
            the name of the triggered event.
            The global datastore is available as "d".
            In legacy code, you might see "e.data" used to get the datastore.
            However, realize that "e.data" is deprecated and you should use
            "d" going forward.
        </para>

        <para>
            The context of the datastore is appropriate to the event
            in question.
            For example, "BuildStarted" and "BuildCompleted" events run
            before any tasks are executed so would be in the global
            configuration datastore namespace.
            No recipe-specific metadata exists in that namespace.
            The "BuildStarted" and "BuildCompleted" events also run in
            the main cooker/server process rather than any worker context.
            Thus, any changes made to the datastore would be seen by other
            cooker/server events within the current build but not seen
            outside of that build or in any worker context.
            Task events run in the actual tasks in question consequently
            have recipe-specific and task-specific contents.
            These events run in the worker context and are discarded at
            the end of task execution.
        </para>

        <para>
            During a standard build, the following common events might
            occur.
            The following events are the most common kinds of events that
            most metadata might have an interest in viewing:
            <itemizedlist>
                <listitem><para>
                    <filename>bb.event.ConfigParsed()</filename>:
                    Fired when the base configuration; which consists of
                    <filename>bitbake.conf</filename>,
                    <filename>base.bbclass</filename> and any global
                    <filename>INHERIT</filename> statements; has been parsed.
                    You can see multiple such events when each of the
                    workers parse the base configuration or if the server
                    changes configuration and reparses.
                    Any given datastore only has one such event executed
                    against it, however.
                    If
                    <link linkende='var-BB_INVALIDCONF'><filename>BB_INVALIDCONF</filename></link>
                    is set in the datastore by the event handler, the
                    configuration is reparsed and a new event triggered,
                    allowing the metadata to update configuration.
                    </para></listitem>
                <listitem><para>
                    <filename>bb.event.HeartbeatEvent()</filename>:
                    Fires at regular time intervals of one second.
                    You can configure the interval time using the
                    <filename>BB_HEARTBEAT_EVENT</filename> variable.
                    The event's "time" attribute is the
                    <filename>time.time()</filename> value when the
                    event is triggered.
                    This event is useful for activities such as
                    system state monitoring.
                    </para></listitem>
                <listitem><para>
                    <filename>bb.event.ParseStarted()</filename>:
                    Fired when BitBake is about to start parsing recipes.
                    This event's "total" attribute represents the number of
                    recipes BitBake plans to parse.
                    </para></listitem>
                <listitem><para>
                    <filename>bb.event.ParseProgress()</filename>:
                    Fired as parsing progresses.
                    This event's "current" attribute is the number of
                    recipes parsed as well as the "total" attribute.
                    </para></listitem>
                <listitem><para>
                    <filename>bb.event.ParseCompleted()</filename>:
                    Fired when parsing is complete.
                    This event's "cached", "parsed", "skipped", "virtuals",
                    "masked", and "errors" attributes provide statistics
                    for the parsing results.
                    </para></listitem>
                <listitem><para>
                    <filename>bb.event.BuildStarted()</filename>:
                    Fired when a new build starts.
                    BitBake fires multiple "BuildStarted" events (one per configuration)
                    when multiple configuration (multiconfig) is enabled.
                    </para></listitem>
                <listitem><para>
                    <filename>bb.build.TaskStarted()</filename>:
                    Fired when a task starts.
                    This event's "taskfile" attribute points to the recipe
                    from which the task originates.
                    The "taskname" attribute, which is the task's name,
                    includes the <filename>do_</filename> prefix, and the
                    "logfile" attribute point to where the task's output is
                    stored.
                    Finally, the "time" attribute is the task's execution start
                    time.
                    </para></listitem>
                <listitem><para>
                    <filename>bb.build.TaskInvalid()</filename>:
                    Fired if BitBake tries to execute a task that does not exist.
                    </para></listitem>
                <listitem><para>
                    <filename>bb.build.TaskFailedSilent()</filename>:
                    Fired for setscene tasks that fail and should not be
                    presented to the user verbosely.
                    </para></listitem>
                <listitem><para>
                    <filename>bb.build.TaskFailed()</filename>:
                    Fired for normal tasks that fail.
                    </para></listitem>
                <listitem><para>
                    <filename>bb.build.TaskSucceeded()</filename>:
                    Fired when a task successfully completes.
                    </para></listitem>
                <listitem><para>
                    <filename>bb.event.BuildCompleted()</filename>:
                    Fired when a build finishes.
                    </para></listitem>
                <listitem><para>
                    <filename>bb.cooker.CookerExit()</filename>:
                    Fired when the BitBake server/cooker shuts down.
                    This event is usually only seen by the UIs as a
                    sign they should also shutdown.
                    </para></listitem>
            </itemizedlist>
        </para>

        <para>
            This next list of example events occur based on specific
            requests to the server.
            These events are often used to communicate larger pieces of
            information from the BitBake server to other parts of
            BitBake such as user interfaces:
            <itemizedlist>
                <listitem><para>
                    <filename>bb.event.TreeDataPreparationStarted()</filename>
                    </para></listitem>
                <listitem><para>
                    <filename>bb.event.TreeDataPreparationProgress()</filename>
                    </para></listitem>
                <listitem><para>
                    <filename>bb.event.TreeDataPreparationCompleted()</filename>
                    </para></listitem>
                <listitem><para>
                    <filename>bb.event.DepTreeGenerated()</filename>
                    </para></listitem>
                <listitem><para>
                    <filename>bb.event.CoreBaseFilesFound()</filename>
                    </para></listitem>
                <listitem><para>
                    <filename>bb.event.ConfigFilePathFound()</filename>
                    </para></listitem>
                <listitem><para>
                    <filename>bb.event.FilesMatchingFound()</filename>
                    </para></listitem>
                <listitem><para>
                    <filename>bb.event.ConfigFilesFound()</filename>
                    </para></listitem>
                <listitem><para>
                    <filename>bb.event.TargetsTreeGenerated()</filename>
                    </para></listitem>
            </itemizedlist>
        </para>
    </section>

    <section id='variants-class-extension-mechanism'>
        <title>Variants - Class Extension Mechanism</title>

        <para>
            BitBake supports two features that facilitate creating
            from a single recipe file multiple incarnations of that
            recipe file where all incarnations are buildable.
            These features are enabled through the
            <link linkend='var-BBCLASSEXTEND'><filename>BBCLASSEXTEND</filename></link>
            and
            <link linkend='var-BBVERSIONS'><filename>BBVERSIONS</filename></link>
            variables.
            <note>
                The mechanism for this class extension is extremely
                specific to the implementation.
                Usually, the recipe's
                <link linkend='var-PROVIDES'><filename>PROVIDES</filename></link>,
                <link linkend='var-PN'><filename>PN</filename></link>, and
                <link linkend='var-DEPENDS'><filename>DEPENDS</filename></link>
                variables would need to be modified by the extension class.
                For specific examples, see the OE-Core
                <filename>native</filename>, <filename>nativesdk</filename>,
                and <filename>multilib</filename> classes.
            </note>
            <itemizedlist>
                <listitem><para><emphasis><filename>BBCLASSEXTEND</filename>:</emphasis>
                    This variable is a space separated list of classes used to "extend" the
                    recipe for each variant.
                    Here is an example that results in a second incarnation of the current
                    recipe being available.
                    This second incarnation will have the "native" class inherited.
                    <literallayout class='monospaced'>
     BBCLASSEXTEND = "native"
                    </literallayout></para></listitem>
                <listitem><para><emphasis><filename>BBVERSIONS</filename>:</emphasis>
                    This variable allows a single recipe to build multiple versions of a
                    project from a single recipe file.
                    You can also specify conditional metadata
                    (using the
                    <link linkend='var-OVERRIDES'><filename>OVERRIDES</filename></link>
                    mechanism) for a single version, or an optionally named range of versions.
                    Here is an example:
                    <literallayout class='monospaced'>
     BBVERSIONS = "1.0 2.0 git"
     SRC_URI_git = "git://someurl/somepath.git"

     BBVERSIONS = "1.0.[0-6]:1.0.0+ \ 1.0.[7-9]:1.0.7+"
     SRC_URI_append_1.0.7+ = "file://some_patch_which_the_new_versions_need.patch;patch=1"
                    </literallayout>
                    The name of the range defaults to the original version of the
                    recipe.
                    For example, in OpenEmbedded, the recipe file
                    <filename>foo_1.0.0+.bb</filename> creates a default name range
                    of <filename>1.0.0+</filename>.
                    This is useful because the range name is not only placed
                    into overrides, but it is also made available for the metadata to use
                    in the variable that defines the base recipe versions for use in
                    <filename>file://</filename> search paths
                    (<link linkend='var-FILESPATH'><filename>FILESPATH</filename></link>).
                    </para></listitem>
            </itemizedlist>
        </para>
    </section>

    <section id='dependencies'>
        <title>Dependencies</title>

        <para>
            To allow for efficient parallel processing, BitBake handles
            dependencies at the task level.
            Dependencies can exist both between tasks within a single recipe
            and between tasks in different recipes.
            Following are examples of each:
            <itemizedlist>
                <listitem><para>For tasks within a single recipe, a
                    recipe's <filename>do_configure</filename>
                    task might need to complete before its
                    <filename>do_compile</filename> task can run.
                    </para></listitem>
                <listitem><para>For tasks in different recipes, one
                    recipe's <filename>do_configure</filename>
                    task might require another recipe's
                    <filename>do_populate_sysroot</filename>
                    task to finish first such that the libraries and headers
                    provided by the other recipe are available.
                    </para></listitem>
             </itemizedlist>
         </para>

         <para>
             This section describes several ways to declare dependencies.
             Remember, even though dependencies are declared in different ways, they
             are all simply dependencies between tasks.
         </para>

        <section id='dependencies-internal-to-the-bb-file'>
            <title>Dependencies Internal to the <filename>.bb</filename> File</title>

            <para>
                BitBake uses the <filename>addtask</filename> directive
                to manage dependencies that are internal to a given recipe
                file.
                You can use the <filename>addtask</filename> directive to
                indicate when a task is dependent on other tasks or when
                other tasks depend on that recipe.
                Here is an example:
                <literallayout class='monospaced'>
     addtask printdate after do_fetch before do_build
                </literallayout>
                In this example, the <filename>do_printdate</filename>
                task depends on the completion of the
                <filename>do_fetch</filename> task, and the
                <filename>do_build</filename> task depends on the
                completion of the <filename>do_printdate</filename>
                task.
                <note><para>
                    For a task to run, it must be a direct or indirect
                    dependency of some other task that is scheduled to
                    run.</para>

                    <para>For illustration, here are some examples:
                    <itemizedlist>
                        <listitem><para>
                            The directive
                            <filename>addtask mytask before do_configure</filename>
                            causes <filename>do_mytask</filename> to run before
                            <filename>do_configure</filename> runs.
                            Be aware that <filename>do_mytask</filename> still only
                            runs if its <link linkend='checksums'>input checksum</link>
                            has changed since the last time it was run.
                            Changes to the input checksum of
                            <filename>do_mytask</filename> also indirectly cause
                            <filename>do_configure</filename> to run.
                            </para></listitem>
                        <listitem><para>
                            The directive
                            <filename>addtask mytask after do_configure</filename>
                            by itself never causes <filename>do_mytask</filename>
                            to run.
                            <filename>do_mytask</filename> can still be run manually
                            as follows:
                            <literallayout class='monospaced'>
     $ bitbake <replaceable>recipe</replaceable> -c mytask
                            </literallayout>
                            Declaring <filename>do_mytask</filename> as a dependency
                            of some other task that is scheduled to run also causes
                            it to run.
                            Regardless, the task runs after
                            <filename>do_configure</filename>.
                            </para></listitem>
                    </itemizedlist></para>
                </note>
            </para>
        </section>

        <section id='build-dependencies'>
            <title>Build Dependencies</title>

            <para>
                BitBake uses the
                <link linkend='var-DEPENDS'><filename>DEPENDS</filename></link>
                variable to manage build time dependencies.
                The <filename>[deptask]</filename> varflag for tasks
                signifies the task of each
                item listed in <filename>DEPENDS</filename> that must
                complete before that task can be executed.
                Here is an example:
                <literallayout class='monospaced'>
     do_configure[deptask] = "do_populate_sysroot"
                </literallayout>
                In this example, the <filename>do_populate_sysroot</filename>
                task of each item in <filename>DEPENDS</filename> must complete before
                <filename>do_configure</filename> can execute.
            </para>
        </section>

        <section id='runtime-dependencies'>
            <title>Runtime Dependencies</title>

            <para>
                BitBake uses the
                <link linkend='var-PACKAGES'><filename>PACKAGES</filename></link>,
                <link linkend='var-RDEPENDS'><filename>RDEPENDS</filename></link>, and
                <link linkend='var-RRECOMMENDS'><filename>RRECOMMENDS</filename></link>
                variables to manage runtime dependencies.
            </para>

            <para>
                The <filename>PACKAGES</filename> variable lists runtime
                packages.
                Each of those packages can have <filename>RDEPENDS</filename> and
                <filename>RRECOMMENDS</filename> runtime dependencies.
                The <filename>[rdeptask]</filename> flag for tasks is used to
                signify the task of each
                item runtime dependency which must have completed before that
                task can be executed.
                <literallayout class='monospaced'>
     do_package_qa[rdeptask] = "do_packagedata"
                </literallayout>
                In the previous example, the <filename>do_packagedata</filename>
                task of each item in <filename>RDEPENDS</filename> must have
                completed before <filename>do_package_qa</filename> can execute.
            </para>
        </section>

        <section id='recursive-dependencies'>
            <title>Recursive Dependencies</title>

            <para>
                BitBake uses the <filename>[recrdeptask]</filename> flag to manage
                recursive task dependencies.
                BitBake looks through the build-time and runtime
                dependencies of the current recipe, looks through
                the task's inter-task
                dependencies, and then adds dependencies for the
                listed task.
                Once BitBake has accomplished this, it recursively works through
                the dependencies of those tasks.
                Iterative passes continue until all dependencies are discovered
                and added.
            </para>

            <para>
                The <filename>[recrdeptask]</filename> flag is most commonly
                used in high-level
                recipes that need to wait for some task to finish "globally".
                For example, <filename>image.bbclass</filename> has the following:
                <literallayout class='monospaced'>
     do_rootfs[recrdeptask] += "do_packagedata"
                </literallayout>
                This statement says that the <filename>do_packagedata</filename>
                task of the current recipe and all recipes reachable
                (by way of dependencies) from the
                image recipe must run before the <filename>do_rootfs</filename>
                task can run.
            </para>

            <para>
                You might want to not only have BitBake look for
                dependencies of those tasks, but also have BitBake look
                for build-time and runtime dependencies of the dependent
                tasks as well.
                If that is the case, you need to reference the task name
                itself in the task list:
                <literallayout class='monospaced'>
     do_a[recrdeptask] = "do_a do_b"
                </literallayout>
            </para>
        </section>

        <section id='inter-task-dependencies'>
            <title>Inter-Task Dependencies</title>

            <para>
                BitBake uses the <filename>[depends]</filename>
                flag in a more generic form
                to manage inter-task dependencies.
                This more generic form allows for inter-dependency
                checks for specific tasks rather than checks for
                the data in <filename>DEPENDS</filename>.
                Here is an example:
                <literallayout class='monospaced'>
     do_patch[depends] = "quilt-native:do_populate_sysroot"
                </literallayout>
                In this example, the <filename>do_populate_sysroot</filename>
                task of the target <filename>quilt-native</filename>
                must have completed before the
                <filename>do_patch</filename> task can execute.
            </para>

            <para>
                The <filename>[rdepends]</filename> flag works in a similar
                way but takes targets
                in the runtime namespace instead of the build-time dependency
                namespace.
            </para>
        </section>
    </section>

    <section id='functions-you-can-call-from-within-python'>
        <title>Functions You Can Call From Within Python</title>

        <para>
            BitBake provides many functions you can call from
            within Python functions.
            This section lists the most commonly used functions,
            and mentions where to find others.
        </para>

        <section id='functions-for-accessing-datastore-variables'>
            <title>Functions for Accessing Datastore Variables</title>

            <para>
                It is often necessary to access variables in the
                BitBake datastore using Python functions.
                The Bitbake datastore has an API that allows you this
                access.
                Here is a list of available operations:
            </para>

            <para>
                <informaltable frame='none'>
                    <tgroup cols='2' align='left' colsep='1' rowsep='1'>
                        <colspec colname='c1' colwidth='1*'/>
                        <colspec colname='c2' colwidth='1*'/>
                        <thead>
                            <row>
                                <entry align="left"><emphasis>Operation</emphasis></entry>
                                <entry align="left"><emphasis>Description</emphasis></entry>
                            </row>
                        </thead>
                        <tbody>
                            <row>
                                <entry align="left"><filename>d.getVar("X", expand)</filename></entry>
                                <entry align="left">Returns the value of variable "X".
                                    Using "expand=True" expands the value.
                                    Returns "None" if the variable "X" does not exist.</entry>
                            </row>
                            <row>
                                <entry align="left"><filename>d.setVar("X", "value")</filename></entry>
                                <entry align="left">Sets the variable "X" to "value".</entry>
                            </row>
                            <row>
                                <entry align="left"><filename>d.appendVar("X", "value")</filename></entry>
                                <entry align="left">Adds "value" to the end of the variable "X".
                                    Acts like <filename>d.setVar("X", "value")</filename>
                                    if the variable "X" does not exist.</entry>
                            </row>
                            <row>
                                <entry align="left"><filename>d.prependVar("X", "value")</filename></entry>
                                <entry align="left">Adds "value" to the start of the variable "X".
                                    Acts like <filename>d.setVar("X", "value")</filename>
                                    if the variable "X" does not exist.</entry>
                            </row>
                            <row>
                                <entry align="left"><filename>d.delVar("X")</filename></entry>
                                <entry align="left">Deletes the variable "X" from the datastore.
                                    Does nothing if the variable "X" does not exist.</entry>
                            </row>
                            <row>
                                <entry align="left"><filename>d.renameVar("X", "Y")</filename></entry>
                                <entry align="left">Renames the variable "X" to "Y".
                                    Does nothing if the variable "X" does not exist.</entry>
                            </row>
                            <row>
                                <entry align="left"><filename>d.getVarFlag("X", flag, expand)</filename></entry>
                                <entry align="left">Returns the value of variable "X".
                                    Using "expand=True" expands the value.
                                    Returns "None" if either the variable "X" or the named flag
                                    does not exist.</entry>
                            </row>
                            <row>
                                <entry align="left"><filename>d.setVarFlag("X", flag, "value")</filename></entry>
                                <entry align="left">Sets the named flag for variable "X" to "value".</entry>
                            </row>
                            <row>
                                <entry align="left"><filename>d.appendVarFlag("X", flag, "value")</filename></entry>
                                <entry align="left">Appends "value" to the named flag on the
                                    variable "X".
                                    Acts like <filename>d.setVarFlag("X", flag, "value")</filename>
                                    if the named flag does not exist.</entry>
                            </row>
                            <row>
                                <entry align="left"><filename>d.prependVarFlag("X", flag, "value")</filename></entry>
                                <entry align="left">Prepends "value" to the named flag on
                                    the variable "X".
                                    Acts like <filename>d.setVarFlag("X", flag, "value")</filename>
                                    if the named flag does not exist.</entry>
                            </row>
                            <row>
                                <entry align="left"><filename>d.delVarFlag("X", flag)</filename></entry>
                                <entry align="left">Deletes the named flag on the variable
                                    "X" from the datastore.</entry>
                            </row>
                            <row>
                                <entry align="left"><filename>d.setVarFlags("X", flagsdict)</filename></entry>
                                <entry align="left">Sets the flags specified in
                                    the <filename>flagsdict()</filename> parameter.
                                    <filename>setVarFlags</filename> does not clear previous flags.
                                    Think of this operation as <filename>addVarFlags</filename>.</entry>
                            </row>
                            <row>
                                <entry align="left"><filename>d.getVarFlags("X")</filename></entry>
                                <entry align="left">Returns a <filename>flagsdict</filename>
                                    of the flags for the variable "X".
                                    Returns "None" if the variable "X" does not exist.</entry>
                            </row>
                            <row>
                                <entry align="left"><filename>d.delVarFlags("X")</filename></entry>
                                <entry align="left">Deletes all the flags for the variable "X".
                                    Does nothing if the variable "X" does not exist.</entry>
                            </row>
                            <row>
                                <entry align="left"><filename>d.expand(expression)</filename></entry>
                                <entry align="left">Expands variable references in the specified
                                    string expression.
                                    References to variables that do not exist are left as is.
                                    For example, <filename>d.expand("foo ${X}")</filename>
                                    expands to the literal string "foo ${X}" if the
                                    variable "X" does not exist.</entry>
                            </row>
                        </tbody>
                    </tgroup>
                </informaltable>
            </para>
        </section>

        <section id='other-functions'>
            <title>Other Functions</title>

            <para>
                You can find many other functions that can be called
                from Python by looking at the source code of the
                <filename>bb</filename> module, which is in
                <filename>bitbake/lib/bb</filename>.
                For example,
                <filename>bitbake/lib/bb/utils.py</filename> includes
                the commonly used functions
                <filename>bb.utils.contains()</filename> and
                <filename>bb.utils.mkdirhier()</filename>, which come
                with docstrings.
            </para>
        </section>
    </section>

    <section id='task-checksums-and-setscene'>
        <title>Task Checksums and Setscene</title>

        <para>
            BitBake uses checksums (or signatures) along with the setscene
            to determine if a task needs to be run.
            This section describes the process.
            To help understand how BitBake does this, the section assumes an
            OpenEmbedded metadata-based example.
        </para>

        <para>
            These checksums are stored in
            <link linkend='var-STAMP'><filename>STAMP</filename></link>.
            You can examine the checksums using the following BitBake command:
            <literallayout class='monospaced'>
     $ bitbake-dumpsigs
            </literallayout>
            This command returns the signature data in a readable format
            that allows you to examine the inputs used when the
            OpenEmbedded build system generates signatures.
            For example, using <filename>bitbake-dumpsigs</filename>
            allows you to examine the <filename>do_compile</filename>
            task's “sigdata” for a C application (e.g.
            <filename>bash</filename>).
            Running the command also reveals that the “CC” variable is part of
            the inputs that are hashed.
            Any changes to this variable would invalidate the stamp and
            cause the <filename>do_compile</filename> task to run.
        </para>

        <para>
            The following list describes related variables:
            <itemizedlist>
                <listitem><para>
                    <link linkend='var-BB_HASHCHECK_FUNCTION'><filename>BB_HASHCHECK_FUNCTION</filename></link>:
                    Specifies the name of the function to call during
                    the "setscene" part of the task's execution in order
                    to validate the list of task hashes.
                    </para></listitem>
                <listitem><para>
                    <link linkend='var-BB_SETSCENE_DEPVALID'><filename>BB_SETSCENE_DEPVALID</filename></link>:
                    Specifies a function BitBake calls that determines
                    whether BitBake requires a setscene dependency to
                    be met.
                    </para></listitem>
                <listitem><para>
                    <link linkend='var-BB_SETSCENE_VERIFY_FUNCTION2'><filename>BB_SETSCENE_VERIFY_FUNCTION2</filename></link>:
                    Specifies a function to call that verifies the list of
                    planned task execution before the main task execution
                    happens.
                    </para></listitem>
                <listitem><para>
                    <link linkend='var-BB_STAMP_POLICY'><filename>BB_STAMP_POLICY</filename></link>:
                    Defines the mode for comparing timestamps of stamp files.
                    </para></listitem>
                <listitem><para>
                    <link linkend='var-BB_STAMP_WHITELIST'><filename>BB_STAMP_WHITELIST</filename></link>:
                    Lists stamp files that are looked at when the stamp policy
                    is "whitelist".
                    </para></listitem>
                <listitem><para>
                    <link linkend='var-BB_TASKHASH'><filename>BB_TASKHASH</filename></link>:
                    Within an executing task, this variable holds the hash
                    of the task as returned by the currently enabled
                    signature generator.
                    </para></listitem>
                <listitem><para>
                    <link linkend='var-STAMP'><filename>STAMP</filename></link>:
                    The base path to create stamp files.
                    </para></listitem>
                <listitem><para>
                    <link linkend='var-STAMPCLEAN'><filename>STAMPCLEAN</filename></link>:
                    Again, the base path to create stamp files but can use wildcards
                    for matching a range of files for clean operations.
                    </para></listitem>
            </itemizedlist>
        </para>
    </section>

    <section id='wildcard-support-in-variables'>
        <title>Wildcard Support in Variables</title>

        <para>
            Support for wildcard use in variables varies depending on the
            context in which it is used.
            For example, some variables and file names allow limited use of
            wildcards through the "<filename>%</filename>" and
            "<filename>*</filename>" characters.
            Other variables or names support Python's
            <ulink url='https://docs.python.org/3/library/glob.html'><filename>glob</filename></ulink>
            syntax,
            <ulink url='https://docs.python.org/3/library/fnmatch.html#module-fnmatch'><filename>fnmatch</filename></ulink>
            syntax, or
            <ulink url='https://docs.python.org/3/library/re.html#re'><filename>Regular Expression (re)</filename></ulink>
            syntax.
        </para>

        <para>
            For variables that have wildcard suport, the
            documentation describes which form of wildcard, its
            use, and its limitations.
        </para>
    </section>

</chapter>
