summaryrefslogtreecommitdiffstats
path: root/meta/classes/package.bbclass
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2022-07-19 17:32:32 +0100
committerSteve Sakoman <steve@sakoman.com>2024-11-11 06:19:18 -0800
commitd2067f7c272bb338140abdbb835734d4ace59f27 (patch)
treec06d49418786bbe6f85cc40875dc0fc822a0688d /meta/classes/package.bbclass
parent959405cc371df8d51bbd41e7ee970a943c738297 (diff)
downloadpoky-d2067f7c272bb338140abdbb835734d4ace59f27.tar.gz
package: Switch debug source handling to use prefix map
Reproducible builds are no longer a configuration option but are required. We also rely on the prefix mapping capability of the compilers now. As such, rewrite the source locating code to use the prefix maps instead of taking a guess about WORKDIR which isn't correct for kernels, gcc, externalsrc and probably more. Instead, iterate the maps to locate any matching source code, keeping in mind that multiple maps may map to one target location. (From OE-Core rev: 80289f49d0c5ca98da1d1558728b8a468aab4326) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org> (cherry picked from commit cbd6144a9769d21371ae0fe04db2adc05f6eed02) Signed-off-by: Steve Sakoman <steve@sakoman.com>
Diffstat (limited to 'meta/classes/package.bbclass')
-rw-r--r--meta/classes/package.bbclass68
1 files changed, 28 insertions, 40 deletions
diff --git a/meta/classes/package.bbclass b/meta/classes/package.bbclass
index 67351b2510..07bf5eb426 100644
--- a/meta/classes/package.bbclass
+++ b/meta/classes/package.bbclass
@@ -574,26 +574,16 @@ def copydebugsources(debugsrcdir, sources, d):
574 objcopy = d.getVar("OBJCOPY") 574 objcopy = d.getVar("OBJCOPY")
575 workdir = d.getVar("WORKDIR") 575 workdir = d.getVar("WORKDIR")
576 sdir = d.getVar("S") 576 sdir = d.getVar("S")
577 sparentdir = os.path.dirname(os.path.dirname(sdir)) 577 cflags = d.expand("${CFLAGS}")
578 sbasedir = os.path.basename(os.path.dirname(sdir)) + "/" + os.path.basename(sdir)
579 workparentdir = os.path.dirname(os.path.dirname(workdir))
580 workbasedir = os.path.basename(os.path.dirname(workdir)) + "/" + os.path.basename(workdir)
581
582 # If S isnt based on WORKDIR we can infer our sources are located elsewhere,
583 # e.g. using externalsrc; use S as base for our dirs
584 if workdir in sdir or 'work-shared' in sdir:
585 basedir = workbasedir
586 parentdir = workparentdir
587 else:
588 basedir = sbasedir
589 parentdir = sparentdir
590 578
591 # If build path exists in sourcefile, it means toolchain did not use 579 prefixmap = {}
592 # -fdebug-prefix-map to compile 580 for flag in cflags.split():
593 if checkbuildpath(sourcefile, d): 581 if not flag.startswith("-fdebug-prefix-map"):
594 localsrc_prefix = parentdir + "/" 582 continue
595 else: 583 if "recipe-sysroot" in flag:
596 localsrc_prefix = "/usr/src/debug/" 584 continue
585 flag = flag.split("=")
586 prefixmap[flag[1]] = flag[2]
597 587
598 nosuchdir = [] 588 nosuchdir = []
599 basepath = dvar 589 basepath = dvar
@@ -604,28 +594,26 @@ def copydebugsources(debugsrcdir, sources, d):
604 bb.utils.mkdirhier(basepath) 594 bb.utils.mkdirhier(basepath)
605 cpath.updatecache(basepath) 595 cpath.updatecache(basepath)
606 596
607 # Ignore files from the recipe sysroots (target and native) 597 for pmap in prefixmap:
608 processdebugsrc = "LC_ALL=C ; sort -z -u '%s' | egrep -v -z '((<internal>|<built-in>)$|/.*recipe-sysroot.*/)' | " 598 # Ignore files from the recipe sysroots (target and native)
609 # We need to ignore files that are not actually ours 599 cmd = "LC_ALL=C ; sort -z -u '%s' | egrep -v -z '((<internal>|<built-in>)$|/.*recipe-sysroot.*/)' | " % sourcefile
610 # we do this by only paying attention to items from this package 600 # We need to ignore files that are not actually ours
611 processdebugsrc += "fgrep -zw '%s' | " 601 # we do this by only paying attention to items from this package
612 # Remove prefix in the source paths 602 cmd += "fgrep -zw '%s' | " % prefixmap[pmap]
613 processdebugsrc += "sed 's#%s##g' | " 603 # Remove prefix in the source paths
614 processdebugsrc += "(cd '%s' ; cpio -pd0mlL --no-preserve-owner '%s%s' 2>/dev/null)" 604 cmd += "sed 's#%s/##g' | " % (prefixmap[pmap])
615 605 cmd += "(cd '%s' ; cpio -pd0mlL --no-preserve-owner '%s%s' 2>/dev/null)" % (pmap, dvar, prefixmap[pmap])
616 cmd = processdebugsrc % (sourcefile, basedir, localsrc_prefix, parentdir, dvar, debugsrcdir)
617 try:
618 subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT)
619 except subprocess.CalledProcessError:
620 # Can "fail" if internal headers/transient sources are attempted
621 pass
622
623 # cpio seems to have a bug with -lL together and symbolic links are just copied, not dereferenced.
624 # Work around this by manually finding and copying any symbolic links that made it through.
625 cmd = "find %s%s -type l -print0 -delete | sed s#%s%s/##g | (cd '%s' ; cpio -pd0mL --no-preserve-owner '%s%s')" % \
626 (dvar, debugsrcdir, dvar, debugsrcdir, parentdir, dvar, debugsrcdir)
627 subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT)
628 606
607 try:
608 subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT)
609 except subprocess.CalledProcessError:
610 # Can "fail" if internal headers/transient sources are attempted
611 pass
612 # cpio seems to have a bug with -lL together and symbolic links are just copied, not dereferenced.
613 # Work around this by manually finding and copying any symbolic links that made it through.
614 cmd = "find %s%s -type l -print0 -delete | sed s#%s%s/##g | (cd '%s' ; cpio -pd0mL --no-preserve-owner '%s%s')" % \
615 (dvar, prefixmap[pmap], dvar, prefixmap[pmap], pmap, dvar, prefixmap[pmap])
616 subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT)
629 617
630 # debugsources.list may be polluted from the host if we used externalsrc, 618 # debugsources.list may be polluted from the host if we used externalsrc,
631 # cpio uses copy-pass and may have just created a directory structure 619 # cpio uses copy-pass and may have just created a directory structure