168 lines
6.1 KiB
Plaintext
168 lines
6.1 KiB
Plaintext
|
WORKDIR_PKGDATA = "${WORKDIR}/pkgdata-sysroot"
|
||
|
|
||
|
def package_populate_pkgdata_dir(pkgdatadir, d):
|
||
|
import glob
|
||
|
|
||
|
postinsts = []
|
||
|
seendirs = set()
|
||
|
stagingdir = d.getVar("PKGDATA_DIR")
|
||
|
pkgarchs = ['${MACHINE_ARCH}']
|
||
|
pkgarchs = pkgarchs + list(reversed(d.getVar("PACKAGE_EXTRA_ARCHS").split()))
|
||
|
pkgarchs.append('allarch')
|
||
|
|
||
|
bb.utils.mkdirhier(pkgdatadir)
|
||
|
for pkgarch in pkgarchs:
|
||
|
for manifest in glob.glob(d.expand("${SSTATE_MANIFESTS}/manifest-%s-*.packagedata" % pkgarch)):
|
||
|
with open(manifest, "r") as f:
|
||
|
for l in f:
|
||
|
l = l.strip()
|
||
|
dest = l.replace(stagingdir, "")
|
||
|
if l.endswith("/"):
|
||
|
staging_copydir(l, pkgdatadir, dest, seendirs)
|
||
|
continue
|
||
|
try:
|
||
|
staging_copyfile(l, pkgdatadir, dest, postinsts, seendirs)
|
||
|
except FileExistsError:
|
||
|
continue
|
||
|
|
||
|
python package_prepare_pkgdata() {
|
||
|
import copy
|
||
|
import glob
|
||
|
|
||
|
taskdepdata = d.getVar("BB_TASKDEPDATA", False)
|
||
|
mytaskname = d.getVar("BB_RUNTASK")
|
||
|
if mytaskname.endswith("_setscene"):
|
||
|
mytaskname = mytaskname.replace("_setscene", "")
|
||
|
workdir = d.getVar("WORKDIR")
|
||
|
pn = d.getVar("PN")
|
||
|
stagingdir = d.getVar("PKGDATA_DIR")
|
||
|
pkgdatadir = d.getVar("WORKDIR_PKGDATA")
|
||
|
|
||
|
# Detect bitbake -b usage
|
||
|
nodeps = d.getVar("BB_LIMITEDDEPS") or False
|
||
|
if nodeps:
|
||
|
staging_package_populate_pkgdata_dir(pkgdatadir, d)
|
||
|
return
|
||
|
|
||
|
start = None
|
||
|
configuredeps = []
|
||
|
for dep in taskdepdata:
|
||
|
data = taskdepdata[dep]
|
||
|
if data[1] == mytaskname and data[0] == pn:
|
||
|
start = dep
|
||
|
break
|
||
|
if start is None:
|
||
|
bb.fatal("Couldn't find ourself in BB_TASKDEPDATA?")
|
||
|
|
||
|
# We need to figure out which sysroot files we need to expose to this task.
|
||
|
# This needs to match what would get restored from sstate, which is controlled
|
||
|
# ultimately by calls from bitbake to setscene_depvalid().
|
||
|
# That function expects a setscene dependency tree. We build a dependency tree
|
||
|
# condensed to inter-sstate task dependencies, similar to that used by setscene
|
||
|
# tasks. We can then call into setscene_depvalid() and decide
|
||
|
# which dependencies we can "see" and should expose in the recipe specific sysroot.
|
||
|
setscenedeps = copy.deepcopy(taskdepdata)
|
||
|
|
||
|
start = set([start])
|
||
|
|
||
|
sstatetasks = d.getVar("SSTATETASKS").split()
|
||
|
# Add recipe specific tasks referenced by setscene_depvalid()
|
||
|
sstatetasks.append("do_stash_locale")
|
||
|
|
||
|
# If start is an sstate task (like do_package) we need to add in its direct dependencies
|
||
|
# else the code below won't recurse into them.
|
||
|
for dep in set(start):
|
||
|
for dep2 in setscenedeps[dep][3]:
|
||
|
start.add(dep2)
|
||
|
start.remove(dep)
|
||
|
|
||
|
# Create collapsed do_populate_sysroot -> do_populate_sysroot tree
|
||
|
for dep in taskdepdata:
|
||
|
data = setscenedeps[dep]
|
||
|
if data[1] not in sstatetasks:
|
||
|
for dep2 in setscenedeps:
|
||
|
data2 = setscenedeps[dep2]
|
||
|
if dep in data2[3]:
|
||
|
data2[3].update(setscenedeps[dep][3])
|
||
|
data2[3].remove(dep)
|
||
|
if dep in start:
|
||
|
start.update(setscenedeps[dep][3])
|
||
|
start.remove(dep)
|
||
|
del setscenedeps[dep]
|
||
|
|
||
|
# Remove circular references
|
||
|
for dep in setscenedeps:
|
||
|
if dep in setscenedeps[dep][3]:
|
||
|
setscenedeps[dep][3].remove(dep)
|
||
|
|
||
|
# Direct dependencies should be present and can be depended upon
|
||
|
for dep in set(start):
|
||
|
if setscenedeps[dep][1] == "do_packagedata":
|
||
|
if dep not in configuredeps:
|
||
|
configuredeps.append(dep)
|
||
|
|
||
|
msgbuf = []
|
||
|
# Call into setscene_depvalid for each sub-dependency and only copy sysroot files
|
||
|
# for ones that would be restored from sstate.
|
||
|
done = list(start)
|
||
|
next = list(start)
|
||
|
while next:
|
||
|
new = []
|
||
|
for dep in next:
|
||
|
data = setscenedeps[dep]
|
||
|
for datadep in data[3]:
|
||
|
if datadep in done:
|
||
|
continue
|
||
|
taskdeps = {}
|
||
|
taskdeps[dep] = setscenedeps[dep][:2]
|
||
|
taskdeps[datadep] = setscenedeps[datadep][:2]
|
||
|
retval = setscene_depvalid(datadep, taskdeps, [], d, msgbuf)
|
||
|
done.append(datadep)
|
||
|
new.append(datadep)
|
||
|
if retval:
|
||
|
msgbuf.append("Skipping setscene dependency %s" % datadep)
|
||
|
continue
|
||
|
if datadep not in configuredeps and setscenedeps[datadep][1] == "do_packagedata":
|
||
|
configuredeps.append(datadep)
|
||
|
msgbuf.append("Adding dependency on %s" % setscenedeps[datadep][0])
|
||
|
else:
|
||
|
msgbuf.append("Following dependency on %s" % setscenedeps[datadep][0])
|
||
|
next = new
|
||
|
|
||
|
# This logging is too verbose for day to day use sadly
|
||
|
#bb.debug(2, "\n".join(msgbuf))
|
||
|
|
||
|
seendirs = set()
|
||
|
postinsts = []
|
||
|
multilibs = {}
|
||
|
manifests = {}
|
||
|
|
||
|
msg_adding = []
|
||
|
|
||
|
for dep in configuredeps:
|
||
|
c = setscenedeps[dep][0]
|
||
|
msg_adding.append(c)
|
||
|
|
||
|
manifest, d2 = oe.sstatesig.find_sstate_manifest(c, setscenedeps[dep][2], "packagedata", d, multilibs)
|
||
|
destsysroot = pkgdatadir
|
||
|
|
||
|
if manifest:
|
||
|
targetdir = destsysroot
|
||
|
with open(manifest, "r") as f:
|
||
|
manifests[dep] = manifest
|
||
|
for l in f:
|
||
|
l = l.strip()
|
||
|
dest = targetdir + l.replace(stagingdir, "")
|
||
|
if l.endswith("/"):
|
||
|
staging_copydir(l, targetdir, dest, seendirs)
|
||
|
continue
|
||
|
staging_copyfile(l, targetdir, dest, postinsts, seendirs)
|
||
|
|
||
|
bb.note("Installed into pkgdata-sysroot: %s" % str(msg_adding))
|
||
|
|
||
|
}
|
||
|
package_prepare_pkgdata[cleandirs] = "${WORKDIR_PKGDATA}"
|
||
|
package_prepare_pkgdata[vardepsexclude] += "MACHINE_ARCH PACKAGE_EXTRA_ARCHS SDK_ARCH BUILD_ARCH SDK_OS BB_TASKDEPDATA SSTATETASKS"
|
||
|
|
||
|
|