summaryrefslogtreecommitdiffstats
path: root/meta
diff options
context:
space:
mode:
authorJoshua Watt <jpewhacker@gmail.com>2023-03-27 15:05:27 -0500
committerRichard Purdie <richard.purdie@linuxfoundation.org>2023-04-01 20:23:23 +0100
commit3cf950b245b6407cb9c5077016217975f8cd92ac (patch)
tree1a6b376b850a35e5c331f54b16c94b3faae21373 /meta
parent7e24067f7819e09b3093a2d76a7f3761d3a4b475 (diff)
downloadpoky-3cf950b245b6407cb9c5077016217975f8cd92ac.tar.gz
classes/package: Add extended packaged data
Adds extended package data which is encoded as JSON which allows it to encode more structure than the "flat" package data files. The extended data might be much larger than the standard package data, so it is not read by default and instead requires oe.packagedata.read_subpkgdata_extended() to be called Currently, the file sizes and ELF debug sources are saved off into the extended package data (cherry picked from commit db9cf430e54ae68da80fbc3fba80ce88d8df164d) (From OE-Core rev: 2318cb79ef1652fb19d696a8d43826e39c22834e) Signed-off-by: Joshua Watt <JPEWhacker@gmail.com> Reviewed-by: Saul Wold <saul.wold@windriver.com> Signed-off-by: Joshua Watt <JPEWhacker@gmail.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org> Signed-off-by: Steve Sakoman <steve@sakoman.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta')
-rw-r--r--meta/classes/package.bbclass40
-rw-r--r--meta/lib/oe/packagedata.py12
2 files changed, 49 insertions, 3 deletions
diff --git a/meta/classes/package.bbclass b/meta/classes/package.bbclass
index 702427fecc..84fdafa8fe 100644
--- a/meta/classes/package.bbclass
+++ b/meta/classes/package.bbclass
@@ -1140,6 +1140,14 @@ python split_and_strip_files () {
1140 # Modified the file so clear the cache 1140 # Modified the file so clear the cache
1141 cpath.updatecache(file) 1141 cpath.updatecache(file)
1142 1142
1143 def strip_pkgd_prefix(f):
1144 nonlocal dvar
1145
1146 if f.startswith(dvar):
1147 return f[len(dvar):]
1148
1149 return f
1150
1143 # 1151 #
1144 # First lets process debug splitting 1152 # First lets process debug splitting
1145 # 1153 #
@@ -1153,6 +1161,8 @@ python split_and_strip_files () {
1153 for file in staticlibs: 1161 for file in staticlibs:
1154 results.append( (file,source_info(file, d)) ) 1162 results.append( (file,source_info(file, d)) )
1155 1163
1164 d.setVar("PKGDEBUGSOURCES", {strip_pkgd_prefix(f): sorted(s) for f, s in results})
1165
1156 sources = set() 1166 sources = set()
1157 for r in results: 1167 for r in results:
1158 sources.update(r[1]) 1168 sources.update(r[1])
@@ -1460,6 +1470,7 @@ PKGDATA_VARS = "PN PE PV PR PKGE PKGV PKGR LICENSE DESCRIPTION SUMMARY RDEPENDS
1460python emit_pkgdata() { 1470python emit_pkgdata() {
1461 from glob import glob 1471 from glob import glob
1462 import json 1472 import json
1473 import bb.compress.zstd
1463 1474
1464 def process_postinst_on_target(pkg, mlprefix): 1475 def process_postinst_on_target(pkg, mlprefix):
1465 pkgval = d.getVar('PKG_%s' % pkg) 1476 pkgval = d.getVar('PKG_%s' % pkg)
@@ -1532,6 +1543,8 @@ fi
1532 with open(data_file, 'w') as fd: 1543 with open(data_file, 'w') as fd:
1533 fd.write("PACKAGES: %s\n" % packages) 1544 fd.write("PACKAGES: %s\n" % packages)
1534 1545
1546 pkgdebugsource = d.getVar("PKGDEBUGSOURCES") or []
1547
1535 pn = d.getVar('PN') 1548 pn = d.getVar('PN')
1536 global_variants = (d.getVar('MULTILIB_GLOBAL_VARIANTS') or "").split() 1549 global_variants = (d.getVar('MULTILIB_GLOBAL_VARIANTS') or "").split()
1537 variants = (d.getVar('MULTILIB_VARIANTS') or "").split() 1550 variants = (d.getVar('MULTILIB_VARIANTS') or "").split()
@@ -1551,17 +1564,32 @@ fi
1551 pkgval = pkg 1564 pkgval = pkg
1552 d.setVar('PKG_%s' % pkg, pkg) 1565 d.setVar('PKG_%s' % pkg, pkg)
1553 1566
1567 extended_data = {
1568 "files_info": {}
1569 }
1570
1554 pkgdestpkg = os.path.join(pkgdest, pkg) 1571 pkgdestpkg = os.path.join(pkgdest, pkg)
1555 files = {} 1572 files = {}
1573 files_extra = {}
1556 total_size = 0 1574 total_size = 0
1557 seen = set() 1575 seen = set()
1558 for f in pkgfiles[pkg]: 1576 for f in pkgfiles[pkg]:
1559 relpth = os.path.relpath(f, pkgdestpkg) 1577 fpath = os.sep + os.path.relpath(f, pkgdestpkg)
1578
1560 fstat = os.lstat(f) 1579 fstat = os.lstat(f)
1561 files[os.sep + relpth] = fstat.st_size 1580 files[fpath] = fstat.st_size
1581
1582 extended_data["files_info"].setdefault(fpath, {})
1583 extended_data["files_info"][fpath]['size'] = fstat.st_size
1584
1562 if fstat.st_ino not in seen: 1585 if fstat.st_ino not in seen:
1563 seen.add(fstat.st_ino) 1586 seen.add(fstat.st_ino)
1564 total_size += fstat.st_size 1587 total_size += fstat.st_size
1588
1589 if fpath in pkgdebugsource:
1590 extended_data["files_info"][fpath]['debugsrc'] = pkgdebugsource[fpath]
1591 del pkgdebugsource[fpath]
1592
1565 d.setVar('FILES_INFO', json.dumps(files, sort_keys=True)) 1593 d.setVar('FILES_INFO', json.dumps(files, sort_keys=True))
1566 1594
1567 process_postinst_on_target(pkg, d.getVar("MLPREFIX")) 1595 process_postinst_on_target(pkg, d.getVar("MLPREFIX"))
@@ -1582,6 +1610,11 @@ fi
1582 1610
1583 sf.write('%s_%s: %d\n' % ('PKGSIZE', pkg, total_size)) 1611 sf.write('%s_%s: %d\n' % ('PKGSIZE', pkg, total_size))
1584 1612
1613 subdata_extended_file = pkgdatadir + "/extended/%s.json.zstd" % pkg
1614 num_threads = int(d.getVar("BB_NUMBER_THREADS"))
1615 with bb.compress.zstd.open(subdata_extended_file, "wt", encoding="utf-8", num_threads=num_threads) as f:
1616 json.dump(extended_data, f, sort_keys=True, separators=(",", ":"))
1617
1585 # Symlinks needed for rprovides lookup 1618 # Symlinks needed for rprovides lookup
1586 rprov = d.getVar('RPROVIDES_%s' % pkg) or d.getVar('RPROVIDES') 1619 rprov = d.getVar('RPROVIDES_%s' % pkg) or d.getVar('RPROVIDES')
1587 if rprov: 1620 if rprov:
@@ -1612,7 +1645,8 @@ fi
1612 write_extra_runtime_pkgs(global_variants, packages, pkgdatadir) 1645 write_extra_runtime_pkgs(global_variants, packages, pkgdatadir)
1613 1646
1614} 1647}
1615emit_pkgdata[dirs] = "${PKGDESTWORK}/runtime ${PKGDESTWORK}/runtime-reverse ${PKGDESTWORK}/runtime-rprovides" 1648emit_pkgdata[dirs] = "${PKGDESTWORK}/runtime ${PKGDESTWORK}/runtime-reverse ${PKGDESTWORK}/runtime-rprovides ${PKGDESTWORK}/extended"
1649emit_pkgdata[vardepsexclude] = "BB_NUMBER_THREADS"
1616 1650
1617ldconfig_postinst_fragment() { 1651ldconfig_postinst_fragment() {
1618if [ x"$D" = "x" ]; then 1652if [ x"$D" = "x" ]; then
diff --git a/meta/lib/oe/packagedata.py b/meta/lib/oe/packagedata.py
index a82085a792..00f7dc1f3d 100644
--- a/meta/lib/oe/packagedata.py
+++ b/meta/lib/oe/packagedata.py
@@ -57,6 +57,18 @@ def read_subpkgdata_dict(pkg, d):
57 ret[newvar] = subd[var] 57 ret[newvar] = subd[var]
58 return ret 58 return ret
59 59
60def read_subpkgdata_extended(pkg, d):
61 import json
62 import bb.compress.zstd
63
64 fn = d.expand("${PKGDATA_DIR}/extended/%s.json.zstd" % pkg)
65 try:
66 num_threads = int(d.getVar("BB_NUMBER_THREADS"))
67 with bb.compress.zstd.open(fn, "rt", encoding="utf-8", num_threads=num_threads) as f:
68 return json.load(f)
69 except FileNotFoundError:
70 return None
71
60def _pkgmap(d): 72def _pkgmap(d):
61 """Return a dictionary mapping package to recipe name.""" 73 """Return a dictionary mapping package to recipe name."""
62 74