diff options
| -rw-r--r-- | meta/classes-global/package.bbclass | 68 |
1 files changed, 28 insertions, 40 deletions
diff --git a/meta/classes-global/package.bbclass b/meta/classes-global/package.bbclass index 418400da8c..2d985d8aff 100644 --- a/meta/classes-global/package.bbclass +++ b/meta/classes-global/package.bbclass | |||
| @@ -565,26 +565,16 @@ def copydebugsources(debugsrcdir, sources, d): | |||
| 565 | objcopy = d.getVar("OBJCOPY") | 565 | objcopy = d.getVar("OBJCOPY") |
| 566 | workdir = d.getVar("WORKDIR") | 566 | workdir = d.getVar("WORKDIR") |
| 567 | sdir = d.getVar("S") | 567 | sdir = d.getVar("S") |
| 568 | sparentdir = os.path.dirname(os.path.dirname(sdir)) | 568 | cflags = d.expand("${CFLAGS}") |
| 569 | sbasedir = os.path.basename(os.path.dirname(sdir)) + "/" + os.path.basename(sdir) | ||
| 570 | workparentdir = os.path.dirname(os.path.dirname(workdir)) | ||
| 571 | workbasedir = os.path.basename(os.path.dirname(workdir)) + "/" + os.path.basename(workdir) | ||
| 572 | |||
| 573 | # If S isnt based on WORKDIR we can infer our sources are located elsewhere, | ||
| 574 | # e.g. using externalsrc; use S as base for our dirs | ||
| 575 | if workdir in sdir or 'work-shared' in sdir: | ||
| 576 | basedir = workbasedir | ||
| 577 | parentdir = workparentdir | ||
| 578 | else: | ||
| 579 | basedir = sbasedir | ||
| 580 | parentdir = sparentdir | ||
| 581 | 569 | ||
| 582 | # If build path exists in sourcefile, it means toolchain did not use | 570 | prefixmap = {} |
| 583 | # -fdebug-prefix-map to compile | 571 | for flag in cflags.split(): |
| 584 | if checkbuildpath(sourcefile, d): | 572 | if not flag.startswith("-fdebug-prefix-map"): |
| 585 | localsrc_prefix = parentdir + "/" | 573 | continue |
| 586 | else: | 574 | if "recipe-sysroot" in flag: |
| 587 | localsrc_prefix = "/usr/src/debug/" | 575 | continue |
| 576 | flag = flag.split("=") | ||
| 577 | prefixmap[flag[1]] = flag[2] | ||
| 588 | 578 | ||
| 589 | nosuchdir = [] | 579 | nosuchdir = [] |
| 590 | basepath = dvar | 580 | basepath = dvar |
| @@ -595,28 +585,26 @@ def copydebugsources(debugsrcdir, sources, d): | |||
| 595 | bb.utils.mkdirhier(basepath) | 585 | bb.utils.mkdirhier(basepath) |
| 596 | cpath.updatecache(basepath) | 586 | cpath.updatecache(basepath) |
| 597 | 587 | ||
| 598 | # Ignore files from the recipe sysroots (target and native) | 588 | for pmap in prefixmap: |
| 599 | processdebugsrc = "LC_ALL=C ; sort -z -u '%s' | egrep -v -z '((<internal>|<built-in>)$|/.*recipe-sysroot.*/)' | " | 589 | # Ignore files from the recipe sysroots (target and native) |
| 600 | # We need to ignore files that are not actually ours | 590 | cmd = "LC_ALL=C ; sort -z -u '%s' | egrep -v -z '((<internal>|<built-in>)$|/.*recipe-sysroot.*/)' | " % sourcefile |
| 601 | # we do this by only paying attention to items from this package | 591 | # We need to ignore files that are not actually ours |
| 602 | processdebugsrc += "fgrep -zw '%s' | " | 592 | # we do this by only paying attention to items from this package |
| 603 | # Remove prefix in the source paths | 593 | cmd += "fgrep -zw '%s' | " % prefixmap[pmap] |
| 604 | processdebugsrc += "sed 's#%s##g' | " | 594 | # Remove prefix in the source paths |
| 605 | processdebugsrc += "(cd '%s' ; cpio -pd0mlL --no-preserve-owner '%s%s' 2>/dev/null)" | 595 | cmd += "sed 's#%s/##g' | " % (prefixmap[pmap]) |
| 606 | 596 | cmd += "(cd '%s' ; cpio -pd0mlL --no-preserve-owner '%s%s' 2>/dev/null)" % (pmap, dvar, prefixmap[pmap]) | |
| 607 | cmd = processdebugsrc % (sourcefile, basedir, localsrc_prefix, parentdir, dvar, debugsrcdir) | ||
| 608 | try: | ||
| 609 | subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT) | ||
| 610 | except subprocess.CalledProcessError: | ||
| 611 | # Can "fail" if internal headers/transient sources are attempted | ||
| 612 | pass | ||
| 613 | |||
| 614 | # cpio seems to have a bug with -lL together and symbolic links are just copied, not dereferenced. | ||
| 615 | # Work around this by manually finding and copying any symbolic links that made it through. | ||
| 616 | cmd = "find %s%s -type l -print0 -delete | sed s#%s%s/##g | (cd '%s' ; cpio -pd0mL --no-preserve-owner '%s%s')" % \ | ||
| 617 | (dvar, debugsrcdir, dvar, debugsrcdir, parentdir, dvar, debugsrcdir) | ||
| 618 | subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT) | ||
| 619 | 597 | ||
| 598 | try: | ||
| 599 | subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT) | ||
| 600 | except subprocess.CalledProcessError: | ||
| 601 | # Can "fail" if internal headers/transient sources are attempted | ||
| 602 | pass | ||
| 603 | # cpio seems to have a bug with -lL together and symbolic links are just copied, not dereferenced. | ||
| 604 | # Work around this by manually finding and copying any symbolic links that made it through. | ||
| 605 | cmd = "find %s%s -type l -print0 -delete | sed s#%s%s/##g | (cd '%s' ; cpio -pd0mL --no-preserve-owner '%s%s')" % \ | ||
| 606 | (dvar, prefixmap[pmap], dvar, prefixmap[pmap], pmap, dvar, prefixmap[pmap]) | ||
| 607 | subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT) | ||
| 620 | 608 | ||
| 621 | # debugsources.list may be polluted from the host if we used externalsrc, | 609 | # debugsources.list may be polluted from the host if we used externalsrc, |
| 622 | # cpio uses copy-pass and may have just created a directory structure | 610 | # cpio uses copy-pass and may have just created a directory structure |
