|
@@ -0,0 +1,167 @@
|
|
|
+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"
|
|
|
+
|
|
|
+
|