1
0
mirror of https://git.yoctoproject.org/poky synced 2026-05-31 12:49:46 +00:00

sstate: run recipe-provided hooks outside of ${B}

To avoid races between the sstate tasks/hooks using ${B} as the cwd, and other
tasks such as cmake_do_configure which deletes and re-creates ${B}, ensure that
all sstate hooks are run in the right directory, and run the prefunc/postfunc in WORKDIR.

(From OE-Core rev: dc8546241a66c6eb076dc67fd165b5216b822ced)

Signed-off-by: Ross Burton <ross.burton@intel.com>
Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Ross Burton
2015-09-29 13:45:59 +02:00
committed by Richard Purdie
parent 85f6cf736b
commit 03666c8a74
+12 -14
View File
@@ -42,16 +42,6 @@ EXTRA_STAGING_FIXMES ?= ""
SIGGEN_LOCKEDSIGS_CHECK_LEVEL ?= 'error' SIGGEN_LOCKEDSIGS_CHECK_LEVEL ?= 'error'
# Specify dirs in which the shell function is executed and don't use ${B}
# as default dirs to avoid possible race about ${B} with other task.
sstate_create_package[dirs] = "${SSTATE_BUILDDIR}"
sstate_unpack_package[dirs] = "${SSTATE_INSTDIR}"
# Do not run sstate_hardcode_path() in ${B}:
# the ${B} maybe removed by cmake_do_configure() while
# sstate_hardcode_path() running.
sstate_hardcode_path[dirs] = "${SSTATE_BUILDDIR}"
python () { python () {
if bb.data.inherits_class('native', d): if bb.data.inherits_class('native', d):
d.setVar('SSTATE_PKGARCH', d.getVar('BUILD_ARCH')) d.setVar('SSTATE_PKGARCH', d.getVar('BUILD_ARCH'))
@@ -144,6 +134,8 @@ def sstate_install(ss, d):
shareddirs = [] shareddirs = []
bb.utils.mkdirhier(d.expand("${SSTATE_MANIFESTS}")) bb.utils.mkdirhier(d.expand("${SSTATE_MANIFESTS}"))
sstateinst = d.expand("${WORKDIR}/sstate-install-%s/" % ss['task'])
d2 = d.createCopy() d2 = d.createCopy()
extrainf = d.getVarFlag("do_" + ss['task'], 'stamp-extra-info', True) extrainf = d.getVarFlag("do_" + ss['task'], 'stamp-extra-info', True)
if extrainf: if extrainf:
@@ -237,7 +229,8 @@ def sstate_install(ss, d):
oe.path.copyhardlinktree(state[1], state[2]) oe.path.copyhardlinktree(state[1], state[2])
for postinst in (d.getVar('SSTATEPOSTINSTFUNCS', True) or '').split(): for postinst in (d.getVar('SSTATEPOSTINSTFUNCS', True) or '').split():
bb.build.exec_func(postinst, d) # All hooks should run in the SSTATE_INSTDIR
bb.build.exec_func(postinst, d, (sstateinst,))
for lock in locks: for lock in locks:
bb.utils.unlockfile(lock) bb.utils.unlockfile(lock)
@@ -273,7 +266,8 @@ def sstate_installpkg(ss, d):
d.setVar('SSTATE_PKG', sstatepkg) d.setVar('SSTATE_PKG', sstatepkg)
for f in (d.getVar('SSTATEPREINSTFUNCS', True) or '').split() + ['sstate_unpack_package'] + (d.getVar('SSTATEPOSTUNPACKFUNCS', True) or '').split(): for f in (d.getVar('SSTATEPREINSTFUNCS', True) or '').split() + ['sstate_unpack_package'] + (d.getVar('SSTATEPOSTUNPACKFUNCS', True) or '').split():
bb.build.exec_func(f, d) # All hooks should run in the SSTATE_INSTDIR
bb.build.exec_func(f, d, (sstateinst,))
for state in ss['dirs']: for state in ss['dirs']:
prepdir(state[1]) prepdir(state[1])
@@ -545,7 +539,8 @@ def sstate_package(ss, d):
for f in (d.getVar('SSTATECREATEFUNCS', True) or '').split() + ['sstate_create_package'] + \ for f in (d.getVar('SSTATECREATEFUNCS', True) or '').split() + ['sstate_create_package'] + \
(d.getVar('SSTATEPOSTCREATEFUNCS', True) or '').split(): (d.getVar('SSTATEPOSTCREATEFUNCS', True) or '').split():
bb.build.exec_func(f, d) # All hooks should run in SSTATE_BUILDDIR.
bb.build.exec_func(f, d, (sstatebuild,))
bb.siggen.dump_this_task(sstatepkg + ".siginfo", d) bb.siggen.dump_this_task(sstatepkg + ".siginfo", d)
@@ -604,18 +599,21 @@ python sstate_task_prefunc () {
shared_state = sstate_state_fromvars(d) shared_state = sstate_state_fromvars(d)
sstate_clean(shared_state, d) sstate_clean(shared_state, d)
} }
sstate_task_prefunc[dirs] = "${WORKDIR}"
python sstate_task_postfunc () { python sstate_task_postfunc () {
shared_state = sstate_state_fromvars(d) shared_state = sstate_state_fromvars(d)
sstate_install(shared_state, d) sstate_install(shared_state, d)
for intercept in shared_state['interceptfuncs']: for intercept in shared_state['interceptfuncs']:
bb.build.exec_func(intercept, d) bb.build.exec_func(intercept, d, (d.getVar("WORKDIR", True),))
omask = os.umask(002) omask = os.umask(002)
if omask != 002: if omask != 002:
bb.note("Using umask 002 (not %0o) for sstate packaging" % omask) bb.note("Using umask 002 (not %0o) for sstate packaging" % omask)
sstate_package(shared_state, d) sstate_package(shared_state, d)
os.umask(omask) os.umask(omask)
} }
sstate_task_postfunc[dirs] = "${WORKDIR}"
# #