[OE-core] [RFC][PATCHv2] cmake.bbclass, perf: don't re-create ${B}
Richard Purdie
richard.purdie at linuxfoundation.org
Tue Sep 22 08:10:34 UTC 2015
On Mon, 2015-09-21 at 22:33 +0200, Martin Jansa wrote:
> * otherwise there is race-condition between do_configure rm+mkdir and
> bitbake trying to use it as CWD for do_populate_lic task, which
> results in errors like this:
>
> NOTE: recipe perf-1.0-r9: task do_configure: Started
> NOTE: recipe perf-1.0-r9: task do_populate_lic: Started
> ERROR: Build of do_populate_lic failed
> ERROR: Traceback (most recent call last):
> File "/OE/build/oe-core/bitbake/lib/bb/build.py", line 553, in exec_task
> return _exec_task(fn, task, d, quieterr)
> File "/OE/build/oe-core/bitbake/lib/bb/build.py", line 493, in _exec_task
> exec_func(func, localdata)
> File "/OE/build/oe-core/bitbake/lib/bb/build.py", line 227, in exec_func
> exec_func_python(func, d, runfile, cwd=adir)
> File "/OE/build/oe-core/bitbake/lib/bb/build.py", line 252, in exec_func_python
> os.chdir(cwd)
> OSError: [Errno 2] No such file or directory: '/OE/build/oe-core/tmp-glibc/work/qemux86-oe-linux/perf/1.0-r9/perf-1.0'
> NOTE: recipe perf-1.0-r9: task do_populate_lic: Failed
> ERROR: Task 7 (/OE/build/oe-core/openembedded-core/meta/recipes-kernel/perf/perf.bb, do_populate_lic) failed with exit code '1'
> NOTE: recipe perf-1.0-r9: task do_configure: Succeeded
>
> or even longer exception:
>
> NOTE: recipe perf-1.0-r9: task do_populate_lic: Started
> NOTE: recipe perf-1.0-r9: task do_configure: Started
> ERROR: Error executing a python function in /OE/build/oe-core/openembedded-core/meta/recipes-kernel/perf/perf.bb:
>
> The stack trace of python calls that resulted in this exception/failure was:
> File: 'sstate_task_postfunc', lineno: 14, function: <module>
> 0010: sstate_package(shared_state, d)
> 0011: os.umask(omask)
> 0012:
> 0013:
> *** 0014:sstate_task_postfunc(d)
> 0015:
> File: 'sstate_task_postfunc', lineno: 4, function: sstate_task_postfunc
> 0001:
> 0002:def sstate_task_postfunc(d):
> 0003: shared_state = sstate_state_fromvars(d)
> *** 0004: sstate_install(shared_state, d)
> 0005: for intercept in shared_state['interceptfuncs']:
> 0006: bb.build.exec_func(intercept, d)
> 0007: omask = os.umask(002)
> 0008: if omask != 002:
> File: 'sstate.bbclass', lineno: 113, function: sstate_install
> 0109: if os.path.exists(state[1]):
> 0110: oe.path.copyhardlinktree(state[1], state[2])
> 0111:
> 0112: for postinst in (d.getVar('SSTATEPOSTINSTFUNCS', True) or '').split():
> *** 0113: bb.build.exec_func(postinst, d)
> 0114:
> 0115: for lock in locks:
> 0116: bb.utils.unlockfile(lock)
> 0117:
The longer stack trace is actually really helpful. I believe the code
here should inherit the working directory of the current task rather
than rely on the default of ${B} which bitbake assigns if there is
nothing else.
The trouble is that if the function does specify a dirs flag, it should
really use that instead of a supplied parameter and if we use the
parameter to exec_func(), it won't do that.
There aren't that many uses of SSTATEPOSTINSTFUNCS in our metadata so
the easiest way to fix this short term is probably to go through them
and add specific [dirs] options to the functions.
Cheers,
Richard
More information about the Openembedded-core
mailing list