From f1a87fadc7c091c67499a0c953603ce63f826177 Mon Sep 17 00:00:00 2001 From: Joshua Lock Date: Fri, 12 Feb 2010 14:55:32 +0000 Subject: relocatable.bbclass: Improve logic and style The initial pass at this class was pretty lame and broke on a lot of native packages. This rewrite makes the code a lot more dynamic, removing use of hard coded paths and improving the logic. The class now runs a chrpath -l over the binary to determine what rpaths are currently set. It then munges the output and determines relative versions of each component of the rpath and uses chrpath -r to set them. Signed-off-by: Joshua Lock --- meta/classes/relocatable.bbclass | 46 +++++++++++++++++++++++++++------------- 1 file changed, 31 insertions(+), 15 deletions(-) (limited to 'meta/classes/relocatable.bbclass') diff --git a/meta/classes/relocatable.bbclass b/meta/classes/relocatable.bbclass index 81fe8c518d..95be7b6e88 100644 --- a/meta/classes/relocatable.bbclass +++ b/meta/classes/relocatable.bbclass @@ -2,23 +2,39 @@ SYSROOT_PREPROCESS_FUNCS += "relocatable_binaries_preprocess" CHRPATH_BIN ?= "chrpath" -def rpath_replace (paths, d): - chrpath = bb.data.expand('${CHRPATH_BIN}', d) +def rpath_replace (path, d): + import subprocess as sub - for path in paths: - for root, dirs, files in os.walk(path): - for f in files: - if 'usr' in path: - os.system("%s -r $ORIGIN/../lib:$ORIGIN/../../lib %s/%s" % (chrpath, path,f)) - else: - os.system("%s -r $ORIGIN/../lib %s/%s" % (chrpath, path, f)) + cmd = bb.data.expand('${CHRPATH_BIN}', d) + tmpdir = bb.data.expand('${base_prefix}', d) -python relocatable_binaries_preprocess() { - paths = [] - target = bb.data.expand("${SYSROOT_DESTDIR}${TMPDIR}/sysroots/${TARGET_ARCH}-${TARGET_OS}", d) + for root, dirs, files in os.walk(path): + for file in files: + fpath = root + '/' + file + if '/bin/' in fpath: + p = sub.Popen([cmd, '-l', fpath],stdout=sub.PIPE,stderr=sub.PIPE) + err, out = p.communicate() + # If returned succesfully, process stderr for results + if p.returncode == 0: + # Throw away everything other than the rpath list + curr_rpath = err.partition("RPATH=")[2] + #bb.note("Current rpath for %s is %s" % (fpath, curr_rpath.strip())) + rpaths = curr_rpath.split(":") + new_rpaths = [] + for rpath in rpaths: + depth = fpath.partition(tmpdir)[2].strip().count('/') + if depth == 3: + # / is two levels up + root = "$ORIGIN/../.." + else: + root = "$ORIGIN/.." - paths.append(target + "/bin") - paths.append(target + "/usr/bin") + # kill everything up to "/" + new_rpaths.append("%s%s" % (root, rpath.partition(tmpdir)[2].strip())) + args = ":".join(new_rpaths) + #bb.note("Setting rpath to " + args) + sub.call([cmd, '-r', args, fpath]) - rpath_replace(paths, d) +python relocatable_binaries_preprocess() { + rpath_replace(bb.data.expand("${SYSROOT_DESTDIR}${TMPDIR}/sysroots/${TARGET_ARCH}-${TARGET_OS}", d), d) } -- cgit v1.2.3-54-g00ecf