diff options
-rw-r--r-- | meta/classes/relocatable.bbclass | 46 |
1 files changed, 31 insertions, 15 deletions
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) } |