[OE-core] [oe-core][PATCH 1/1] package.bbclass: decouple splitting and stripping

Bernhard Reutner-Fischer rep.dot.nop at gmail.com
Fri Mar 13 22:50:12 UTC 2015


On March 13, 2015 10:57:53 PM GMT+01:00, Joe Slater <jslater at windriver.com> wrote:
>Fix logic in split_and_strip_files() to allow splitting or
>stripping independently.  We also return quickly from this
>function if we have nothing to do.  We seek the following behavior:
>
>Strip / Split     Behavior
>yes   / yes       binaries stripped; debug info and source in -dbg
>no    / yes       debug info and source in -dbg
>yes   / no        binaries stripped; -dbg packages empty
>no    / no        -dbg packages empty (not a very useful case)
>
>Currently, no/yes does not work and is the same as no/no.
>
>Signed-off-by: Joe Slater <jslater at windriver.com>
>---
>meta/classes/package.bbclass |  108
>++++++++++++++++++++++--------------------
> 1 file changed, 57 insertions(+), 51 deletions(-)
>
>diff --git a/meta/classes/package.bbclass
>b/meta/classes/package.bbclass
>index 9f64ed7..ad8771f 100644
>--- a/meta/classes/package.bbclass
>+++ b/meta/classes/package.bbclass
>@@ -812,6 +812,12 @@ python fixup_perms () {
> }
> 
> python split_and_strip_files () {

>+    for root, dirs, files in cpath.walk(dvar):
>+        for f in files:
>+            file = os.path.join(root, f)
>+            if file.endswith(".ko") and file.find("/lib/modules/") !=
>-1:
>+                kernmods.append(file)
>+                continue
>  
>+            # Skip debug files
>+            if debugappend and file.endswith(debugappend):
>+                continue
>+            if debugdir and debugdir in
>os.path.dirname(file[len(dvar):]):
>+                continue
>+

It's a pity to first construct the files just to throw them away right afterwards.
Maybe there are other cpath.walk spots that would benefit from file_not_endswith and dir filters?

Thanks,

>+            try:
>+                ltarget = cpath.realpath(file, dvar, False)
>+                s = cpath.lstat(ltarget)
>+            except OSError as e:
>+                (err, strerror) = e.args
>+                if err != errno.ENOENT:
>+                    raise
>+                # Skip broken symlinks
>+                continue
>+            if not s:
>+                continue
>+            # Check its an excutable
>+            if (s[stat.ST_MODE] & stat.S_IXUSR) or (s[stat.ST_MODE] &
>stat.S_IXGRP) or (s[stat.ST_MODE] & stat.S_IXOTH) \
>+                    or ((file.startswith(libdir) or
>file.startswith(baselibdir)) and ".so" in f):
>+                # If it's a symlink, and points to an ELF file, we
>capture the readlink target
>+                if cpath.islink(file):
>+                    target = os.readlink(file)
>+                    if isELF(ltarget):
>+                        #bb.note("Sym: %s (%d)" % (ltarget,
>isELF(ltarget)))
>+                        symlinks[file] = target
>                     continue
>-                # Check its an excutable
>-                if (s[stat.ST_MODE] & stat.S_IXUSR) or
>(s[stat.ST_MODE] & stat.S_IXGRP) or (s[stat.ST_MODE] & stat.S_IXOTH) \
>-                        or ((file.startswith(libdir) or
>file.startswith(baselibdir)) and ".so" in f):
>-                    # If it's a symlink, and points to an ELF file, we
>capture the readlink target
>-                    if cpath.islink(file):
>-                        target = os.readlink(file)
>-                        if isELF(ltarget):
>-                            #bb.note("Sym: %s (%d)" % (ltarget,
>isELF(ltarget)))
>-                            symlinks[file] = target
>+                # It's a file (or hardlink), not a link
>+                # ...but is it ELF, and is it already stripped?
>+                elf_file = isELF(file)
>+                if elf_file & 1:
>+                    if elf_file & 2:
>+                        if 'already-stripped' in
>(d.getVar('INSANE_SKIP_' + pn, True) or "").split():
>+                            bb.note("Skipping file %s from %s for
>already-stripped QA test" % (file[len(dvar):], pn))
>+                        else:
>+                            msg = "File '%s' from %s was already
>stripped, this will prevent future debugging!" % (file[len(dvar):], pn)
>+                           
>package_qa_handle_error("already-stripped", msg, d)
>                         continue
>-                    # It's a file (or hardlink), not a link
>-                    # ...but is it ELF, and is it already stripped?
>-                    elf_file = isELF(file)
>-                    if elf_file & 1:
>-                        if elf_file & 2:
>-                            if 'already-stripped' in
>(d.getVar('INSANE_SKIP_' + pn, True) or "").split():
>-                                bb.note("Skipping file %s from %s for
>already-stripped QA test" % (file[len(dvar):], pn))
>-                            else:
>-                                msg = "File '%s' from %s was already
>stripped, this will prevent future debugging!" % (file[len(dvar):], pn)
>-                               
>package_qa_handle_error("already-stripped", msg, d)
>-                            continue
>-                        # Check if it's a hard link to something else
>-                        if s.st_nlink > 1:
>-                            file_reference = "%d_%d" % (s.st_dev,
>s.st_ino)
>-                            # Hard link to something else
>-                            hardlinks[file] = file_reference
>-                            continue
>-                        elffiles[file] = elf_file
>+                    # Check if it's a hard link to something else
>+                    if s.st_nlink > 1:
>+                        file_reference = "%d_%d" % (s.st_dev,
>s.st_ino)
>+                        # Hard link to something else
>+                        hardlinks[file] = file_reference
>+                        continue
>+                    elffiles[file] = elf_file
> 
>     #
>     # First lets process debug splitting
>     #
>-    if (d.getVar('INHIBIT_PACKAGE_DEBUG_SPLIT', True) != '1'):
>+    if splitting:
>         hardlinkmap = {}
>         # For hardlinks, process only one of the files
>         for file in hardlinks:
>@@ -1008,7 +1014,7 @@ python split_and_strip_files () {
>     #
>     # Now lets go back over things and strip them
>     #
>-    if (d.getVar('INHIBIT_PACKAGE_STRIP', True) != '1'):
>+    if stripping:
>         strip = d.getVar("STRIP", True)
>         sfiles = []
>         for file in elffiles:





More information about the Openembedded-core mailing list