Browse Source

external-toolchain.bbclass: expand permissions beyond user

Signed-off-by: Serge Semin <fancer.lancer@gmail.com>
Signed-off-by: Christopher Larson <chris_larson@mentor.com>
Serge Semin 6 years ago
parent
commit
e687093b60
1 changed files with 28 additions and 0 deletions
  1. 28 0
      classes/external-toolchain.bbclass

+ 28 - 0
classes/external-toolchain.bbclass

@@ -53,6 +53,11 @@ EXTERNAL_TOOLCHAIN[vardepvalue] = "${EXTERNAL_TOOLCHAIN}"
 external_toolchain_do_install[vardepsexclude] += "EXTERNAL_TOOLCHAIN"
 EXTERNAL_INSTALL_SOURCE_PATHS[vardepsexclude] += "EXTERNAL_TOOLCHAIN"
 
+# Propagate file permissions mode from owner to the rest of the user
+# so the toolchain bits would be available for everyone to use even in the
+# directories with root permissions.
+EXTERNAL_PROPAGATE_MODE ?= "0"
+
 python () {
     # Skipping only matters up front
     if d.getVar('BB_WORKERCONTEXT', True) == '1':
@@ -88,6 +93,28 @@ python do_install () {
     pass # Sentinel
 }
 
+def external_toolchain_propagate_mode (d, installdest):
+    import stat
+
+    propagate = d.getVar('EXTERNAL_PROPAGATE_MODE', True)
+    if propagate == '0':
+        return
+
+    for root, dirs, files in os.walk(installdest):
+        for bit in dirs + files:
+            path = os.path.join(root, bit)
+            try:
+                bitstat = os.stat(path)
+            except ValueError:
+                continue
+            else:
+                newmode = bitstat.st_mode
+                if bitstat.st_mode & stat.S_IRUSR:
+                    newmode |= stat.S_IRGRP | stat.S_IROTH
+                if bitstat.st_mode & stat.S_IXUSR:
+                    newmode |= stat.S_IXGRP | stat.S_IXOTH
+                os.chmod(path, newmode)
+
 python external_toolchain_do_install () {
     import subprocess
     installdest = d.getVar('D', True)
@@ -96,6 +123,7 @@ python external_toolchain_do_install () {
     oe.external.copy_from_sysroots(files, sysroots, mirrors, installdest)
     if 'do_install_extra' in d:
         bb.build.exec_func('do_install_extra', d)
+    external_toolchain_propagate_mode(d, installdest)
     subprocess.check_call(['chown', '-R', 'root:root', installdest])
 }
 external_toolchain_do_install[vardeps] += "${@' '.join('FILES_%s' % pkg for pkg in '${PACKAGES}'.split())}"