summaryrefslogtreecommitdiff
path: root/classes
diff options
context:
space:
mode:
authorRichard Purdie <rpurdie@rpsys.net>2007-09-01 15:08:16 +0000
committerRichard Purdie <rpurdie@rpsys.net>2007-09-01 15:08:16 +0000
commitc55327daed509bd8ce3b81d0b154c2bb3ce65f3c (patch)
tree01dd664434f70cff7898510f91ba2de0110fc30f /classes
parent949aa138f88cdf12b8092890e7f71e06ce23d975 (diff)
package.bbclass: Improve strip function and convert to python (from poky)
Diffstat (limited to 'classes')
-rw-r--r--classes/package.bbclass112
1 files changed, 51 insertions, 61 deletions
diff --git a/classes/package.bbclass b/classes/package.bbclass
index 95e4acd4d6..bc69dc9f8f 100644
--- a/classes/package.bbclass
+++ b/classes/package.bbclass
@@ -136,59 +136,57 @@ python () {
bb.data.setVarFlag('do_package', 'deptask', 'do_package', d)
}
-# file(1) output to match to consider a file an unstripped executable
-FILE_UNSTRIPPED_MATCH ?= "not stripped"
-#FIXME: this should be "" when any errors are gone!
-IGNORE_STRIP_ERRORS ?= "1"
-
-runstrip() {
- # Function to strip a single file, called from RUNSTRIP in populate_packages below
- # A working 'file' (one which works on the target architecture)
- # is necessary for this stuff to work, hence the addition to do_package[depends]
-
- local ro st
-
- st=0
- if { file "$1" || {
- oewarn "file $1: failed (forced strip)" >&2
- echo '${FILE_UNSTRIPPED_MATCH}'
- }
- } | grep -q '${FILE_UNSTRIPPED_MATCH}'
- then
- oenote "${STRIP} $1"
- ro=
- test -w "$1" || {
- ro=1
- chmod +w "$1"
- }
- mkdir -p $(dirname "$1")/.debug
- debugfile="$(dirname "$1")/.debug/$(basename "$1")"
- '${OBJCOPY}' --only-keep-debug "$1" "$debugfile"
- '${STRIP}' "$1"
- st=$?
- '${OBJCOPY}' --add-gnu-debuglink="$debugfile" "$1"
- test -n "$ro" && chmod -w "$1"
- if test $st -ne 0
- then
- oewarn "runstrip: ${STRIP} $1: strip failed" >&2
- if [ x${IGNORE_STRIP_ERRORS} = x1 ]
- then
- #FIXME: remove this, it's for error detection
- if file "$1" 2>/dev/null >&2
- then
- (oefatal "${STRIP} $1: command failed" >/dev/tty)
- else
- (oefatal "file $1: command failed" >/dev/tty)
- fi
- st=0
- fi
- fi
- else
- oenote "runstrip: skip $1"
- fi
- return $st
-}
+def runstrip(file, d):
+ # Function to strip a single file, called from populate_packages below
+ # A working 'file' (one which works on the target architecture)
+ # is necessary for this stuff to work, hence the addition to do_package[depends]
+
+ import bb, os, commands, stat
+
+ pathprefix = "export PATH=%s; " % bb.data.getVar('PATH', d, 1)
+
+ ret, result = commands.getstatusoutput("%sfile '%s'" % (pathprefix, file))
+
+ if ret:
+ bb.error("runstrip: 'file %s' failed (forced strip)" % file)
+
+ if "not stripped" not in result:
+ bb.debug(1, "runstrip: skip %s" % file)
+ return 0
+
+ strip = bb.data.getVar("STRIP", d, 1)
+ objcopy = bb.data.getVar("OBJCOPY", d, 1)
+
+ newmode = None
+ if not os.access(file, os.W_OK):
+ origmode = os.stat(file)[stat.ST_MODE]
+ newmode = origmode | stat.S_IWRITE
+ os.chmod(file, newmode)
+
+ extraflags = ""
+ if ".so" in file and "shared" in result:
+ extraflags = "--remove-section=.comment --remove-section=.note --strip-unneeded"
+ elif "shared" in result or "executable" in result:
+ extraflags = "--remove-section=.comment --remove-section=.note"
+
+ bb.mkdirhier(os.path.join(os.path.dirname(file), ".debug"))
+ debugfile=os.path.join(os.path.dirname(file), ".debug", os.path.basename(file))
+
+ stripcmd = "'%s' %s '%s'" % (strip, extraflags, file)
+ bb.debug(1, "runstrip: %s" % stripcmd)
+
+ os.system("%s'%s' --only-keep-debug '%s' '%s'" % (pathprefix, objcopy, file, debugfile))
+ ret = os.system("%s%s" % (pathprefix, stripcmd))
+ os.system("%s'%s' --add-gnu-debuglink='%s' '%s'" % (pathprefix, objcopy, debugfile, file))
+
+ if newmode:
+ os.chmod(file, origmode)
+
+ if ret:
+ bb.error("runstrip: '%s' strip command failed" % stripcmd)
+
+ return 1
#
# Package data handling routines
@@ -376,19 +374,11 @@ python populate_packages () {
package_list.append(pkg)
if (bb.data.getVar('INHIBIT_PACKAGE_STRIP', d, 1) != '1'):
- stripfunc = ""
for root, dirs, files in os.walk(dvar):
for f in files:
file = os.path.join(root, f)
if not os.path.islink(file) and not os.path.isdir(file) and isexec(file):
- stripfunc += "\trunstrip %s || st=1\n" % (file)
- if not stripfunc == "":
- from bb import build
- localdata = bb.data.createCopy(d)
- # strip
- bb.data.setVar('RUNSTRIP', '\tlocal st\n\tst=0\n%s\treturn $st' % stripfunc, localdata)
- bb.data.setVarFlag('RUNSTRIP', 'func', 1, localdata)
- bb.build.exec_func('RUNSTRIP', localdata)
+ runstrip(file, d)
for pkg in package_list:
localdata = bb.data.createCopy(d)