summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoss Burton <ross.burton@intel.com>2015-09-24 09:54:33 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2015-09-28 12:00:22 +0100
commit5fd30897f5e623d558d0720b24322210a67bb615 (patch)
tree5b9c01c9c0fa4baa845364016837b4a19bfa85db
parent3fb464f6af2ab7c8510996a675e45749a4f985b5 (diff)
downloadpoky-5fd30897f5e623d558d0720b24322210a67bb615.tar.gz
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: 1d3bde02641f4b40030cf7e305ee3d7c2faabe29) (From OE-Core rev: a026dbfa0ce4ee769ae2c714f27f4c4eaa4a0c73) Signed-off-by: Ross Burton <ross.burton@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--meta/classes/sstate.bbclass30
1 files changed, 14 insertions, 16 deletions
diff --git a/meta/classes/sstate.bbclass b/meta/classes/sstate.bbclass
index b9ad6da9dd..d09e27aee4 100644
--- a/meta/classes/sstate.bbclass
+++ b/meta/classes/sstate.bbclass
@@ -61,16 +61,6 @@ SSTATE_SIG_PASSPHRASE ?= ""
61# Whether to verify the GnUPG signatures when extracting sstate archives 61# Whether to verify the GnUPG signatures when extracting sstate archives
62SSTATE_VERIFY_SIG ?= "0" 62SSTATE_VERIFY_SIG ?= "0"
63 63
64# Specify dirs in which the shell function is executed and don't use ${B}
65# as default dirs to avoid possible race about ${B} with other task.
66sstate_create_package[dirs] = "${SSTATE_BUILDDIR}"
67sstate_unpack_package[dirs] = "${SSTATE_INSTDIR}"
68
69# Do not run sstate_hardcode_path() in ${B}:
70# the ${B} maybe removed by cmake_do_configure() while
71# sstate_hardcode_path() running.
72sstate_hardcode_path[dirs] = "${SSTATE_BUILDDIR}"
73
74python () { 64python () {
75 if bb.data.inherits_class('native', d): 65 if bb.data.inherits_class('native', d):
76 d.setVar('SSTATE_PKGARCH', d.getVar('BUILD_ARCH', False)) 66 d.setVar('SSTATE_PKGARCH', d.getVar('BUILD_ARCH', False))
@@ -164,6 +154,8 @@ def sstate_install(ss, d):
164 shareddirs = [] 154 shareddirs = []
165 bb.utils.mkdirhier(d.expand("${SSTATE_MANIFESTS}")) 155 bb.utils.mkdirhier(d.expand("${SSTATE_MANIFESTS}"))
166 156
157 sstateinst = d.expand("${WORKDIR}/sstate-install-%s/" % ss['task'])
158
167 manifest, d2 = oe.sstatesig.sstate_get_manifest_filename(ss['task'], d) 159 manifest, d2 = oe.sstatesig.sstate_get_manifest_filename(ss['task'], d)
168 160
169 if os.access(manifest, os.R_OK): 161 if os.access(manifest, os.R_OK):
@@ -267,7 +259,8 @@ def sstate_install(ss, d):
267 oe.path.copyhardlinktree(state[1], state[2]) 259 oe.path.copyhardlinktree(state[1], state[2])
268 260
269 for postinst in (d.getVar('SSTATEPOSTINSTFUNCS', True) or '').split(): 261 for postinst in (d.getVar('SSTATEPOSTINSTFUNCS', True) or '').split():
270 bb.build.exec_func(postinst, d) 262 # All hooks should run in the SSTATE_INSTDIR
263 bb.build.exec_func(postinst, d, (sstateinst,))
271 264
272 for lock in locks: 265 for lock in locks:
273 bb.utils.unlockfile(lock) 266 bb.utils.unlockfile(lock)
@@ -307,7 +300,8 @@ def sstate_installpkg(ss, d):
307 bb.warn("Cannot verify signature on sstate package %s" % sstatepkg) 300 bb.warn("Cannot verify signature on sstate package %s" % sstatepkg)
308 301
309 for f in (d.getVar('SSTATEPREINSTFUNCS', True) or '').split() + ['sstate_unpack_package'] + (d.getVar('SSTATEPOSTUNPACKFUNCS', True) or '').split(): 302 for f in (d.getVar('SSTATEPREINSTFUNCS', True) or '').split() + ['sstate_unpack_package'] + (d.getVar('SSTATEPOSTUNPACKFUNCS', True) or '').split():
310 bb.build.exec_func(f, d) 303 # All hooks should run in the SSTATE_INSTDIR
304 bb.build.exec_func(f, d, (sstateinst,))
311 305
312 for state in ss['dirs']: 306 for state in ss['dirs']:
313 prepdir(state[1]) 307 prepdir(state[1])
@@ -579,8 +573,9 @@ def sstate_package(ss, d):
579 573
580 for f in (d.getVar('SSTATECREATEFUNCS', True) or '').split() + ['sstate_create_package'] + \ 574 for f in (d.getVar('SSTATECREATEFUNCS', True) or '').split() + ['sstate_create_package'] + \
581 (d.getVar('SSTATEPOSTCREATEFUNCS', True) or '').split(): 575 (d.getVar('SSTATEPOSTCREATEFUNCS', True) or '').split():
582 bb.build.exec_func(f, d) 576 # All hooks should run in SSTATE_BUILDDIR.
583 577 bb.build.exec_func(f, d, (sstatebuild,))
578
584 bb.siggen.dump_this_task(sstatepkg + ".siginfo", d) 579 bb.siggen.dump_this_task(sstatepkg + ".siginfo", d)
585 580
586 return 581 return
@@ -642,19 +637,22 @@ python sstate_task_prefunc () {
642 shared_state = sstate_state_fromvars(d) 637 shared_state = sstate_state_fromvars(d)
643 sstate_clean(shared_state, d) 638 sstate_clean(shared_state, d)
644} 639}
640sstate_task_prefunc[dirs] = "${WORKDIR}"
645 641
646python sstate_task_postfunc () { 642python sstate_task_postfunc () {
647 shared_state = sstate_state_fromvars(d) 643 shared_state = sstate_state_fromvars(d)
644
648 sstate_install(shared_state, d) 645 sstate_install(shared_state, d)
649 for intercept in shared_state['interceptfuncs']: 646 for intercept in shared_state['interceptfuncs']:
650 bb.build.exec_func(intercept, d) 647 bb.build.exec_func(intercept, d, (d.getVar("WORKDIR", True),))
651 omask = os.umask(002) 648 omask = os.umask(002)
652 if omask != 002: 649 if omask != 002:
653 bb.note("Using umask 002 (not %0o) for sstate packaging" % omask) 650 bb.note("Using umask 002 (not %0o) for sstate packaging" % omask)
654 sstate_package(shared_state, d) 651 sstate_package(shared_state, d)
655 os.umask(omask) 652 os.umask(omask)
656} 653}
657 654sstate_task_postfunc[dirs] = "${WORKDIR}"
655
658 656
659# 657#
660# Shell function to generate a sstate package from a directory 658# Shell function to generate a sstate package from a directory