package: export debugsources in PKGDESTWORK as json

The source information used during packaging can be use from other tasks to
have more detailed information on the files used during the compilation and
improve SPDX accuracy.

Source files used during compilation are store as compressed zstd json in
pkgdata/debugsources/$PN-debugsources.json.zstd
Format:
{ binary1: [src1, src2, ...], binary2: [src1, src2, ...] }

I checked the sstate size, and it slightly increases using core-image-full-cmdline:
without patch: 2456792 KB sstate-cache/
with patch:    2460028 KB sstate-cache/
(4236 KB or 0.17%)

CC: Richard Purdie <richard.purdie@linuxfoundation.org>
(From OE-Core rev: c507dcb8a8780a42bfe68b1ebaff0909b4236e6b)

Signed-off-by: Daniel Turull <daniel.turull@ericsson.com>
Signed-off-by: Mathieu Dubois-Briand <mathieu.dubois-briand@bootlin.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Daniel Turull 2025-06-10 17:24:41 +02:00 committed by Richard Purdie
parent 436bde4c5f
commit d0d9f1e88d
2 changed files with 48 additions and 0 deletions

View File

@ -991,5 +991,7 @@ oe.sstatesig.find_sstate_manifest[vardepsexclude] = "BBEXTENDCURR BBEXTENDVARIAN
oe.utils.get_multilib_datastore[vardepsexclude] = "DEFAULTTUNE_MULTILIB_ORIGINAL OVERRIDES"
oe.path.format_display[vardepsexclude] = "TOPDIR"
oe.utils.get_bb_number_threads[vardepsexclude] = "BB_NUMBER_THREADS"
oe.package.save_debugsources_info[vardepsexclude] = "BB_NUMBER_THREADS"
oe.package.read_debugsources_info[vardepsexclude] = "BB_NUMBER_THREADS"
oe.packagedata.emit_pkgdata[vardepsexclude] = "BB_NUMBER_THREADS"
oe.packagedata.read_subpkgdata_extended[vardepsexclude] = "BB_NUMBER_THREADS"

View File

@ -1049,6 +1049,49 @@ def copydebugsources(debugsrcdir, sources, d):
if os.path.exists(p) and not os.listdir(p):
os.rmdir(p)
def save_debugsources_info(debugsrcdir, sources_raw, d):
import json
import bb.compress.zstd
if debugsrcdir and sources_raw:
debugsources_file = d.expand("${PKGDESTWORK}/debugsources/${PN}-debugsources.json.zstd")
debugsources_dir = os.path.dirname(debugsources_file)
if not os.path.isdir(debugsources_dir):
bb.utils.mkdirhier(debugsources_dir)
bb.utils.remove(debugsources_file)
workdir = d.getVar("WORKDIR")
pn = d.getVar('PN')
# Kernel sources are in a different directory and are special case
# we format the sources as expected by spdx by replacing /usr/src/kernel/
# into BP/
kernel_src = d.getVar('KERNEL_SRC_PATH')
bp = d.getVar('BP')
sources_dict = {}
for file, src_files in sources_raw:
file_clean = file.replace(f"{workdir}/package/","")
sources_clean = [
src.replace(f"{debugsrcdir}/{pn}/", "")
if not kernel_src else src.replace(f"{kernel_src}/", f"{bp}/")
for src in src_files
if not any(keyword in src for keyword in ("<internal>", "<built-in>")) and not src.endswith("/")
]
sources_dict[file_clean] = sorted(sources_clean)
num_threads = int(d.getVar("BB_NUMBER_THREADS"))
with bb.compress.zstd.open(debugsources_file, "wt", encoding="utf-8", num_threads=num_threads) as f:
json.dump(sources_dict, f, sort_keys=True)
def read_debugsources_info(d):
import json
import bb.compress.zstd
try:
fn = d.expand("${PKGDESTWORK}/debugsources/${PN}-debugsources.json.zstd")
num_threads = int(d.getVar("BB_NUMBER_THREADS"))
with bb.compress.zstd.open(fn, "rt", encoding="utf-8", num_threads=num_threads) as f:
return json.load(f)
except FileNotFoundError:
bb.debug(1, f"File not found: {fn}")
return None
def process_split_and_strip_files(d):
cpath = oe.cachedpath.CachedPath()
@ -1280,6 +1323,9 @@ def process_split_and_strip_files(d):
# Process the dv["srcdir"] if requested...
# This copies and places the referenced sources for later debugging...
copydebugsources(dv["srcdir"], sources, d)
# Save source info to be accessible to other tasks
save_debugsources_info(dv["srcdir"], results, d)
#
# End of debug splitting
#