summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Lock <josh@linux.intel.com>2010-04-08 16:47:48 +0100
committerRichard Purdie <rpurdie@linux.intel.com>2010-05-05 15:05:49 +0100
commit5c72f087792cfc1d7bc2d1c1d0ccdb1a0dfd88c1 (patch)
tree62feb177025448e8fd4b7a1a384fce6472cda71e
parent4806fcf56c7533f2c9c7c6fe0d0f0966f805a793 (diff)
relocatable.bbclass: Handle files which don't have read/write permissions
It's possible to have files in our sysroot which don't have the write (or in some cases even the read) bit set. Test for these and if they are not set temporarily set them so that we can chrpath the binaries. Also remove following of symlinks because if it links to a file created by the package install we already handle it when we process the sysroot. Further, by ignoring symlinks here we don't cause a build to fail when the symlink is to somewhere in the host OS. Signed-off-by: Joshua Lock <josh@linux.intel.com>
-rw-r--r--classes/relocatable.bbclass26
1 files changed, 20 insertions, 6 deletions
diff --git a/classes/relocatable.bbclass b/classes/relocatable.bbclass
index 25eb99ecff..eb5b9e62ed 100644
--- a/classes/relocatable.bbclass
+++ b/classes/relocatable.bbclass
@@ -5,12 +5,13 @@ PREPROCESS_RELOCATE_DIRS ?= ""
def process_dir (directory, d):
import subprocess as sub
+ import stat
cmd = bb.data.expand('${CHRPATH_BIN}', d)
tmpdir = bb.data.getVar('TMPDIR', d)
basedir = bb.data.expand('${base_prefix}', d)
- bb.debug("Checking %s for binaries to process" % directory)
+ #bb.debug("Checking %s for binaries to process" % directory)
if not os.path.exists(directory):
return
@@ -18,14 +19,24 @@ def process_dir (directory, d):
for file in dirs:
fpath = directory + "/" + file
if os.path.islink(fpath):
- fpath = os.readlink(fpath)
- if not os.path.isabs(fpath):
- fpath = os.path.normpath(os.path.join(directory, fpath))
+ # Skip symlinks
+ continue
if os.path.isdir(fpath):
process_dir(fpath, d)
else:
#bb.note("Testing %s for relocatability" % fpath)
+
+ # We need read and write permissions for chrpath, if we don't have
+ # them then set them temporarily. Take a copy of the files
+ # permissions so that we can restore them afterwards.
+ perms = os.stat(fpath)[stat.ST_MODE]
+ if os.access(fpath, os.W_OK|os.R_OK):
+ perms = None
+ else:
+ # Temporarily make the file writeable so we can chrpath it
+ os.chmod(fpath, perms|stat.S_IRWXU)
+
p = sub.Popen([cmd, '-l', fpath],stdout=sub.PIPE,stderr=sub.PIPE)
err, out = p.communicate()
# If returned succesfully, process stderr for results
@@ -63,14 +74,17 @@ def process_dir (directory, d):
# if we have modified some rpaths call chrpath to update the binary
if len(new_rpaths):
args = ":".join(new_rpaths)
- #bb.note("Setting rpath to " + args)
+ #bb.note("Setting rpath for %s to %s" %(fpath,args))
sub.call([cmd, '-r', args, fpath])
+ if perms:
+ os.chmod(fpath, perms)
+
def rpath_replace (path, d):
bindirs = bb.data.expand("${bindir} ${sbindir} ${base_sbindir} ${base_bindir} ${libdir} ${base_libdir} ${PREPROCESS_RELOCATE_DIRS}", d).split()
for bindir in bindirs:
- bb.note ("Processing directory " + bindir)
+ #bb.note ("Processing directory " + bindir)
directory = path + "/" + bindir
process_dir (directory, d)