[bitbake-devel] python function used in variable expansion called multiple times per recipe

Chris Larson kergoth at gmail.com
Fri Apr 20 00:12:31 UTC 2012


On Thu, Apr 19, 2012 at 4:13 PM, Daniel Lazzari <dlazzari at leapfrog.com> wrote:
>
>
>>On Thu, 2012-04-19 at 21:24 +0000, Daniel Lazzari wrote:
>>> >> I think immediate expansion is what I’ll need to use, thanks for the tip.
>>> >> That at least brings the invocation down to once per run. Unfortunately,
>>the
>>> >> variable doesn’t seem to get filled in when I change to immediate
>>> >expansion.
>>> >>
>>> >> def testFunc(bb, d):
>>> >>                 print( bb.data.getVar("PN", d, True) )
>>> >>                 return "e1"
>>> >>
>>> >> EXTERNPV := "${@testFunc(bb, d)}"
>>> >>
>>> >> Now only prints the package name once, but using –e, I don’t see the
>>> >> variable EXTERNPV at all.
>>> >
>>> >Don't know what to tell you. It does work, so it's something wrong on
>>> >your end. Either it's returning an empty string, which will result in
>>> >-e only showing the commented out definition, or it's raising an
>>> >exception, or something else in your setup. Aside: you don't need to
>>> >pass 'bb' in. That namespace is always accessible, even from def'd
>>> >python functions.
>>> >--
>>> >Christopher Larson
>>>
>>> Just thought I'd provide an update real quick on this. I discovered,
>>> to my dismay, that even doing an immediate expansion still ran the
>>> code before every task for that recipe. I switched to using an event
>>> handler, but the RecipeParsed event occurs before every task for that
>>> recipe. Eventually I discovered that the variable BB_WORKERCONTEXT is
>>> set for RecipeParsed events when they are occurring before a task, but
>>> not for the initial parse. Also, I discovered that setting a variable
>>> in the event handler would not necessarily keep it set through
>>> building the recipe. Thus I devised the below code to run the time
>>> intensive code during initial parse and cache the value in a file so
>>> it can be picked up again in later events. I'm leaving this here in
>>> case it helps someone else.
>>
>>Just as a note, we have the persist_data code in bitbake which was
>>written for this kind of reason in relation to SRCREV and AUTOINC which
>>uses a sqlite backend as the storage. There isn't anything wrong with
>>what you're doing, I just thought I'd mention it.
>>
>>Cheers,
>>
>>Richard
>
> That sounds like a better alternative, but I have no idea how to implement it. Is there documentation for it? I'm not even sure how to get at the persist_data from the event handler. Is there a way to access it using d or something?

The bb.persist_data python module just provides a convenience
dictionary wrapper around an sqlite3 database.

persist = bb.persist_data.persist('some_identifier', d)
persist['foo'] = 'bar'
-- 
Christopher Larson




More information about the bitbake-devel mailing list