@@ -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_file[vardepsexclude] = "BB_NUMBER_THREADS"
oe.packagedata.emit_pkgdata[vardepsexclude] = "BB_NUMBER_THREADS"
oe.packagedata.read_subpkgdata_extended[vardepsexclude] = "BB_NUMBER_THREADS"
@@ -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")
+ sdir = d.getVar("S")
+ pn = d.getVar('PN')
+ pv = d.getVar('PV')
+ sources_dict = {}
+ for file, src_files in sources_raw:
+ file_clean = file.replace(f"{workdir}/package/","")
+ sources_clean = [
+ src.replace(f"/usr/src/debug/{pn}/", "")
+ .replace(f"{sdir}/", "")
+ .replace(f"/usr/src/kernel/", "")
+ .replace(f"/usr/src/{pn}/", "")
+ .replace(f"{pn}-{pv}/", "")
+ .replace(f"{pv}/", "")
+ 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_file(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
#