aboutsummaryrefslogtreecommitdiffstats
path: root/meta
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2013-02-01 15:03:41 +0000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2013-02-06 13:11:20 +0000
commit981fed49ee80560fb067b3f47aeada1fdee792ca (patch)
treebfb80b96a66cf55225d59c6f7f45c6afda45065e /meta
parent060f617cea4ea0a5af28d31ea19c0387e9773fce (diff)
downloadopenembedded-core-981fed49ee80560fb067b3f47aeada1fdee792ca.tar.gz
package: Process package stripping in parallel
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta')
-rw-r--r--meta/classes/package.bbclass58
-rw-r--r--meta/lib/oe/package.py45
2 files changed, 58 insertions, 45 deletions
diff --git a/meta/classes/package.bbclass b/meta/classes/package.bbclass
index d93783f83b..61d90cc12e 100644
--- a/meta/classes/package.bbclass
+++ b/meta/classes/package.bbclass
@@ -309,49 +309,6 @@ def copydebugsources(debugsrcdir, d):
if os.path.exists(p) and not os.listdir(p):
os.rmdir(p)
-def runstrip(file, elftype, d):
- # Function to strip a single file, called from split_and_strip_files below
- # A working 'file' (one which works on the target architecture)
- #
- # The elftype is a bit pattern (explained in split_and_strip_files) to tell
- # us what type of file we're processing...
- # 4 - executable
- # 8 - shared library
-
- import commands, stat, subprocess
-
- strip = d.getVar("STRIP", True)
-
- newmode = None
- if not os.access(file, os.W_OK) or os.access(file, os.R_OK):
- origmode = os.stat(file)[stat.ST_MODE]
- newmode = origmode | stat.S_IWRITE | stat.S_IREAD
- os.chmod(file, newmode)
-
- extraflags = ""
-
- # .so and shared library
- if elftype & 16:
- extraflags = "--strip-debug --remove-section=.comment --remove-section=.note --preserve-dates"
- elif ".so" in file and elftype & 8:
- extraflags = "--remove-section=.comment --remove-section=.note --strip-unneeded"
- # shared or executable:
- elif elftype & 8 or elftype & 4:
- extraflags = "--remove-section=.comment --remove-section=.note"
-
- stripcmd = "'%s' %s '%s'" % (strip, extraflags, file)
- bb.debug(1, "runstrip: %s" % stripcmd)
-
- ret = subprocess.call(stripcmd, shell=True)
-
- if newmode:
- os.chmod(file, origmode)
-
- if ret:
- bb.error("runstrip: '%s' strip command failed" % stripcmd)
-
- return 0
-
#
# Package data handling routines
#
@@ -902,13 +859,24 @@ python split_and_strip_files () {
# Now lets go back over things and strip them
#
if (d.getVar('INHIBIT_PACKAGE_STRIP', True) != '1'):
+ strip = d.getVar("STRIP", True)
+ sfiles = []
for file in file_list:
if file_list[file].startswith("ELF: "):
elf_file = int(file_list[file][5:])
#bb.note("Strip %s" % file)
- runstrip(file, elf_file, d)
+ sfiles.append((file, elf_file, strip))
for f in kernmods:
- runstrip(f, 16, d)
+ sfiles.append((f, 16, strip))
+
+
+ import multiprocessing
+ nproc = multiprocessing.cpu_count()
+ pool = multiprocessing.Pool(nproc)
+ processed = pool.imap(oe.package.runstrip, sfiles)
+ pool.close()
+ pool.join()
+
#
# End of strip
#
diff --git a/meta/lib/oe/package.py b/meta/lib/oe/package.py
index 6b1c1f48ce..9a0ddb8536 100644
--- a/meta/lib/oe/package.py
+++ b/meta/lib/oe/package.py
@@ -1,3 +1,48 @@
+def runstrip(arg):
+ # Function to strip a single file, called from split_and_strip_files below
+ # A working 'file' (one which works on the target architecture)
+ #
+ # The elftype is a bit pattern (explained in split_and_strip_files) to tell
+ # us what type of file we're processing...
+ # 4 - executable
+ # 8 - shared library
+ # 16 - kernel module
+
+ import commands, stat, subprocess
+
+ (file, elftype, strip) = arg
+
+ newmode = None
+ if not os.access(file, os.W_OK) or os.access(file, os.R_OK):
+ origmode = os.stat(file)[stat.ST_MODE]
+ newmode = origmode | stat.S_IWRITE | stat.S_IREAD
+ os.chmod(file, newmode)
+
+ extraflags = ""
+
+ # kernel module
+ if elftype & 16:
+ extraflags = "--strip-debug --remove-section=.comment --remove-section=.note --preserve-dates"
+ # .so and shared library
+ elif ".so" in file and elftype & 8:
+ extraflags = "--remove-section=.comment --remove-section=.note --strip-unneeded"
+ # shared or executable:
+ elif elftype & 8 or elftype & 4:
+ extraflags = "--remove-section=.comment --remove-section=.note"
+
+ stripcmd = "'%s' %s '%s'" % (strip, extraflags, file)
+ bb.debug(1, "runstrip: %s" % stripcmd)
+
+ ret = subprocess.call(stripcmd, shell=True)
+
+ if newmode:
+ os.chmod(file, origmode)
+
+ if ret:
+ bb.error("runstrip: '%s' strip command failed" % stripcmd)
+
+ return
+
def file_translate(file):
ft = file.replace("@", "@at@")