[OE-core] [PATCH 03/17] conf/bitbake.conf package.bbclass: improve dbg package sources generation from work-shared
Hongxu Jia
hongxu.jia at windriver.com
Mon Mar 28 08:18:47 UTC 2016
Previously, the dbg package could not generate sources if they
are in work-shared dir (toolchain, kernel).
The fix add a new fdebug-prefix-map to remap work-shared dir
and collect sources to dbg package.
[YOCTO #9305]
Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
---
meta/classes/package.bbclass | 100 +++++++++++++++++++++++++++++++------------
meta/conf/bitbake.conf | 1 +
2 files changed, 73 insertions(+), 28 deletions(-)
diff --git a/meta/classes/package.bbclass b/meta/classes/package.bbclass
index bdbe96d..f862d0b 100644
--- a/meta/classes/package.bbclass
+++ b/meta/classes/package.bbclass
@@ -300,6 +300,14 @@ def get_conffiles(pkg, d):
os.chdir(cwd)
return conf_list
+def checkworkshared(file, d):
+ with open(file) as f:
+ file_content = f.read()
+ if "work-shared" in file_content:
+ return True
+
+ return False
+
def checkbuildpath(file, d):
tmpdir = d.getVar('TMPDIR', True)
with open(file) as f:
@@ -309,6 +317,50 @@ def checkbuildpath(file, d):
return False
+def collectsources(sourcefile, prefix_new, prefix_old, dest, d):
+ bb.utils.mkdirhier(dest)
+
+ # List all available sources
+ cmd = "LC_ALL=C ; sort -z -u '%s' | " % sourcefile
+
+ # Filter out <internal> and <built-in>
+ cmd += "egrep -v -z '(<internal>|<built-in>)$' | "
+
+ # We need to ignore files that are not actually ours
+ # we do this by only paying attention to items from this package
+ cmd += "fgrep -zw '%s' | " % prefix_new
+
+ # Remove prefix in the source paths
+ cmd += "sed 's#%s/##g' | " % prefix_new
+
+ # If sources in WORKDIR, it ignores work-shared;
+ # If sources in work-shared, it filters nothing;
+ cmd += " sed -z '/work-shared/d' | "
+
+ # Enter dir prefix_old to copy sources
+ cmd += "(cd '%s' ; cpio -pd0mlL --no-preserve-owner '%s' 2>/dev/null)" % (prefix_old, dest)
+
+ (retval, output) = oe.utils.getstatusoutput(cmd)
+ # Can "fail" if internal headers/transient sources are attempted
+ #if retval:
+ # bb.fatal("debug source copy failed with exit code %s (cmd was %s)" % (retval, cmd))
+
+# cpio seems to have a bug with -lL together and symbolic links are just copied, not dereferenced.
+# Work around this by manually finding and copying any symbolic links that made it through.
+def dereferencesymlink(prefix_old, dest, d):
+ # Enter dir dest, list all available symlinks that were removed prefix dest
+ cmd = "find %s -type l -print0 -delete | sed 's#%s/##g' | " % (dest, dest)
+
+ # If sources in WORKDIR, it ignores work-shared;
+ # If sources in work-shared, it filters nothing;
+ cmd += " sed '/work-shared/d' | "
+
+ # Enter dir prefix_old to copy sources to dest
+ cmd += "(cd '%s'; cpio -pd0mL --no-preserve-owner '%s' 2>/dev/null)" % (prefix_old, dest)
+ (retval, output) = oe.utils.getstatusoutput(cmd)
+ if retval:
+ bb.fatal("debugsrc symlink fixup failed with exit code %s (cmd was %s)" % (retval, cmd))
+
def splitdebuginfo(file, debugfile, debugsrcdir, sourcefile, d):
# Function to split a single file into two components, one is the stripped
# target system binary, the other contains any debugging information. The
@@ -370,15 +422,6 @@ def copydebugsources(debugsrcdir, d):
objcopy = d.getVar("OBJCOPY", True)
debugedit = d.expand("${STAGING_LIBDIR_NATIVE}/rpm/bin/debugedit")
workdir = d.getVar("WORKDIR", True)
- workparentdir = os.path.dirname(os.path.dirname(workdir))
- workbasedir = os.path.basename(os.path.dirname(workdir)) + "/" + os.path.basename(workdir)
-
- # If build path exists in sourcefile, it means toolchain did not use
- # -fdebug-prefix-map to compile
- if checkbuildpath(sourcefile, d):
- localsrc_prefix = workparentdir + "/"
- else:
- localsrc_prefix = "/usr/src/debug/"
nosuchdir = []
basepath = dvar
@@ -389,26 +432,27 @@ def copydebugsources(debugsrcdir, d):
bb.utils.mkdirhier(basepath)
cpath.updatecache(basepath)
- processdebugsrc = "LC_ALL=C ; sort -z -u '%s' | egrep -v -z '(<internal>|<built-in>)$' | "
- # We need to ignore files that are not actually ours
- # we do this by only paying attention to items from this package
- processdebugsrc += "fgrep -zw '%s' | "
- # Remove prefix in the source paths
- processdebugsrc += "sed 's#%s##g' | "
- processdebugsrc += "(cd '%s' ; cpio -pd0mlL --no-preserve-owner '%s%s' 2>/dev/null)"
-
- cmd = processdebugsrc % (sourcefile, workbasedir, localsrc_prefix, workparentdir, dvar, debugsrcdir)
- (retval, output) = oe.utils.getstatusoutput(cmd)
- # Can "fail" if internal headers/transient sources are attempted
- #if retval:
- # bb.fatal("debug source copy failed with exit code %s (cmd was %s)" % (retval, cmd))
+ # Collect sources in work-shared
+ if checkworkshared(sourcefile, d):
+ if checkbuildpath(sourcefile, d):
+ prefix_new = prefix_old = d.expand("${TMPDIR}/work-shared")
+ else:
+ prefix_old = d.expand("${TMPDIR}/work-shared")
+ prefix_new = d.expand("/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR}/work-shared")
+ dest = "%s%s" % (dvar, d.expand("/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR}/work-shared"))
+ collectsources(sourcefile, prefix_new, prefix_old, dest, d)
+ dereferencesymlink(prefix_old, dest, d)
- # cpio seems to have a bug with -lL together and symbolic links are just copied, not dereferenced.
- # Work around this by manually finding and copying any symbolic links that made it through.
- cmd = "find %s%s -type l -print0 -delete | sed s#%s%s/##g | (cd '%s' ; cpio -pd0mL --no-preserve-owner '%s%s' 2>/dev/null)" % (dvar, debugsrcdir, dvar, debugsrcdir, workparentdir, dvar, debugsrcdir)
- (retval, output) = oe.utils.getstatusoutput(cmd)
- if retval:
- bb.fatal("debugsrc symlink fixup failed with exit code %s (cmd was %s)" % (retval, cmd))
+ # If build path exists in sourcefile, it means toolchain did not use
+ # -fdebug-prefix-map to compile
+ if checkbuildpath(sourcefile, d):
+ prefix_new = prefix_old = workdir
+ else:
+ prefix_old = workdir
+ prefix_new = d.expand("/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR}")
+ dest = "%s%s" % (dvar, d.expand("/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR}"))
+ collectsources(sourcefile, prefix_new, prefix_old, dest, d)
+ dereferencesymlink(prefix_old, dest, d)
# The copy by cpio may have resulted in some empty directories! Remove these
cmd = "find %s%s -empty -type d -delete" % (dvar, debugsrcdir)
diff --git a/meta/conf/bitbake.conf b/meta/conf/bitbake.conf
index 0eb288e..007ae0f 100644
--- a/meta/conf/bitbake.conf
+++ b/meta/conf/bitbake.conf
@@ -550,6 +550,7 @@ EXTRA_OEMAKE_prepend_task-install = "${PARALLEL_MAKEINST} "
# Optimization flags.
##################################################################
DEBUG_FLAGS ?= "-g -feliminate-unused-debug-types \
+ -fdebug-prefix-map=${TMPDIR}/work-shared=/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR}/work-shared \
-fdebug-prefix-map=${WORKDIR}=/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR} \
-fdebug-prefix-map=${STAGING_DIR_NATIVE}= \
-fdebug-prefix-map=${STAGING_DIR_HOST}= \
--
1.9.1
More information about the Openembedded-core
mailing list