[oe-commits] Joshua Lock : relocatable.bbclass: Handle files which don't have read/ write permissions

git version control git at git.openembedded.org
Wed May 5 11:10:27 UTC 2010


Module: openembedded.git
Branch: rpurdie/work-in-progress
Commit: 8294bd074c7cbfa54ec1ebbd64c71c4c0b12f5f0
URL:    http://gitweb.openembedded.net/?p=openembedded.git&a=commit;h=8294bd074c7cbfa54ec1ebbd64c71c4c0b12f5f0

Author: Joshua Lock <josh at linux.intel.com>
Date:   Thu Apr  8 16:47:48 2010 +0100

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 at linux.intel.com>

---

 classes/relocatable.bbclass |   26 ++++++++++++++++++++------
 1 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/classes/relocatable.bbclass b/classes/relocatable.bbclass
index 25eb99e..eb5b9e6 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)
 





More information about the Openembedded-commits mailing list