summaryrefslogtreecommitdiffstats
path: root/meta/classes
diff options
context:
space:
mode:
authorPaul Eggleton <paul.eggleton@linux.intel.com>2013-12-02 18:50:44 +0000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2013-12-03 17:45:49 +0000
commit4a75e83b29d6736a17d3a461774adb18b8ff5abf (patch)
tree4f676dbd0a8ca75e13c31287439a6b498bb72712 /meta/classes
parenta6450a951fd52d1330c577139dd492f0c8abb1f8 (diff)
downloadast2050-yocto-poky-4a75e83b29d6736a17d3a461774adb18b8ff5abf.zip
ast2050-yocto-poky-4a75e83b29d6736a17d3a461774adb18b8ff5abf.tar.gz
classes/package: fix FILES_INFO serialisation in pkgdata
The FILES_INFO entry in each pkgdata file stores the list of files for each package. Make the following improvements to how this is stored: * Store paths as they would be seen on the target rather than erroneously including the full path to PKGDEST (which is specific to the build host the package was built on) * For simplicity when loading the data, store complete paths for each entry instead of trying to break off the first part and use it as the dict key * Record sizes for each file (as needed by Toaster) * Serialise the value explicitly using json rather than just passing it through str(). Fixes [YOCTO #5443]. (From OE-Core rev: ca86603607a69a17cc5540d69de0e242b33382d3) Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/classes')
-rw-r--r--meta/classes/package.bbclass19
-rw-r--r--meta/classes/toaster.bbclass28
2 files changed, 14 insertions, 33 deletions
diff --git a/meta/classes/package.bbclass b/meta/classes/package.bbclass
index 48bb982..cce2499 100644
--- a/meta/classes/package.bbclass
+++ b/meta/classes/package.bbclass
@@ -1110,6 +1110,7 @@ PKGDESTWORK = "${WORKDIR}/pkgdata"
python emit_pkgdata() {
from glob import glob
+ import json
def write_if_exists(f, pkg, var):
def encode(str):
@@ -1173,22 +1174,20 @@ python emit_pkgdata() {
workdir = d.getVar('WORKDIR', True)
for pkg in packages.split():
- items = {}
- for files_list in pkgfiles[pkg]:
- item_name = os.path.basename(files_list)
- item_path = os.path.dirname(files_list)
- if item_path not in items:
- items[item_path] = []
- items[item_path].append(item_name)
- subdata_file = pkgdatadir + "/runtime/%s" % pkg
-
pkgval = d.getVar('PKG_%s' % pkg, True)
if pkgval is None:
pkgval = pkg
d.setVar('PKG_%s' % pkg, pkg)
- d.setVar('FILES_INFO', str(items))
+ pkgdestpkg = os.path.join(pkgdest, pkg)
+ files = {}
+ for f in pkgfiles[pkg]:
+ relpth = os.path.relpath(f, pkgdestpkg)
+ fstat = os.lstat(f)
+ files[os.sep + relpth] = fstat.st_size
+ d.setVar('FILES_INFO', json.dumps(files))
+ subdata_file = pkgdatadir + "/runtime/%s" % pkg
sf = open(subdata_file, 'w')
write_if_exists(sf, pkg, 'PN')
write_if_exists(sf, pkg, 'PV')
diff --git a/meta/classes/toaster.bbclass b/meta/classes/toaster.bbclass
index 7dbb384..8dc1663 100644
--- a/meta/classes/toaster.bbclass
+++ b/meta/classes/toaster.bbclass
@@ -39,8 +39,7 @@ python toaster_package_dumpdata() {
# scan and send data for each package
- import ast
- import fnmatch
+ import json
lpkgdata = {}
for pkg in packages.split():
@@ -54,28 +53,11 @@ python toaster_package_dumpdata() {
(n, v) = line.rstrip().split(":", 1)
if pkg in n:
n = n.replace("_" + pkg, "")
- lpkgdata[n] = v.strip()
- line = sf.readline()
- pkgsplitname = os.path.join(pkgdest, pkg)
- # replace FILES_INFO data with a dictionary of file name - file size
if n == 'FILES_INFO':
- filesizedata = {}
- val = v.strip().replace('\\\'', '\'')
- dictval = ast.literal_eval(val)
- for parent, dirlist in dictval.items():
- idx = parent.find(pkgsplitname)
- if idx > -1:
- parent = parent[idx+len(pkgsplitname):]
- else:
- bb.error("Invalid path while looking for file ", parent)
- for basename in dirlist:
- fullpath = os.path.join(parent, basename)
- try:
- filesizedata[fullpath] = os.stat(pkgsplitname + fullpath).st_size
- except OSError:
- # we may hit a symlink that is not pointing correctly over package-split
- filesizedata[fullpath] = 0
- lpkgdata[n] = filesizedata
+ lpkgdata[n] = json.loads(v)
+ else:
+ lpkgdata[n] = v.strip()
+ line = sf.readline()
# Fire an event containing the pkg data
bb.event.fire(bb.event.MetadataEvent("SinglePackageInfo", lpkgdata), d)
OpenPOWER on IntegriCloud