[poky] [PATCH 1/1] yocto-kernel: Use variable-substituted BBLAYERS

Tom Zanussi tom.zanussi at linux.intel.com
Fri Oct 4 07:37:38 PDT 2013


The current find_bblayers() code finds and parses the BBLAYERS
variable manually, and therefore doesn't handle variable substitution,
which causes problems if used.

This change makes find_bblayers() use the variable-substituted
BBLAYERS instead.

Fixes [YOCTO #5106]

Signed-off-by: Tom Zanussi <tom.zanussi at linux.intel.com>
---
 scripts/lib/bsp/kernel.py | 93 +++++++++++++++++++----------------------------
 1 file changed, 38 insertions(+), 55 deletions(-)

diff --git a/scripts/lib/bsp/kernel.py b/scripts/lib/bsp/kernel.py
index 1971e90..5696ca7 100644
--- a/scripts/lib/bsp/kernel.py
+++ b/scripts/lib/bsp/kernel.py
@@ -35,7 +35,7 @@ import subprocess
 from engine import create_context
 
 
-def find_bblayers(scripts_path):
+def find_bblayers():
     """
     Find and return a sanitized list of the layers found in BBLAYERS.
     """
@@ -48,67 +48,50 @@ def find_bblayers(scripts_path):
 
     layers = []
 
-    f = open(bblayers_conf, "r")
-    lines = f.readlines()
-    bblayers_lines = []
-    in_bblayers = False
-    for line in lines:
-        line = line.strip()
-        tokens = line.split()
-        if len(tokens) > 0 and tokens[0] == 'BBLAYERS':
-            bblayers_lines.append(line)
-            in_bblayers = True
-            quotes = line.strip().count('"')
-            if quotes > 1:
-                in_bblayers = False
-            continue
-        if in_bblayers:
-            bblayers_lines.append(line)
-            if line.strip().endswith("\""):
-                in_bblayers = False
-
-    for i, line in enumerate(bblayers_lines):
-        if line.strip().endswith("\\"):
-            bblayers_lines[i] = line.strip().replace('\\', '')
-
-    bblayers_line = " ".join(bblayers_lines)
-
-    openquote = ''
-    for c in bblayers_line:
-        if c == '\"' or c == '\'':
-            if openquote:
-                if c != openquote:
-                    print "Invalid BBLAYERS found in %s, exiting" % bblayers_conf
-                    sys.exit(1)
-                else:
-                    openquote = ''
-            else:
-                openquote = c
-
-    if openquote:
-        print "Invalid BBLAYERS found in %s, exiting" % bblayers_conf
+    bitbake_env_cmd = "bitbake -e"
+    bitbake_env_lines = subprocess.Popen(bitbake_env_cmd, shell=True,
+                                         stdout=subprocess.PIPE).stdout.read()
+
+    if not bitbake_env_lines:
+        print "Couldn't get '%s' output, exiting." % bitbake_env_cmd
         sys.exit(1)
 
-    bblayers_line = bblayers_line.strip().replace('\"', '')
-    bblayers_line = bblayers_line.strip().replace('\'', '')
+    for line in bitbake_env_lines.split('\n'):
+        bblayers = get_line_val(line, "BBLAYERS")
+        if (bblayers):
+            break
+
+    if not bblayers:
+        print "Couldn't find BBLAYERS in 'bitbake -e' output, exiting." % \
+            bitbake_env_cmd
+        sys.exit(1)
 
-    raw_layers = bblayers_line.split()
+    raw_layers = bblayers.split()
 
     for layer in raw_layers:
         if layer == 'BBLAYERS' or '=' in layer:
             continue
         layers.append(layer)
 
-    f.close()
-
     return layers
 
 
-def find_meta_layer(scripts_path):
+def get_line_val(line, key):
+    """
+    Extract the value from the VAR="val" string
+    """
+    if line.startswith(key + "="):
+        stripped_line = line.split('=')[1]
+        stripped_line = stripped_line.replace('\"', '')
+        return stripped_line
+    return None
+
+
+def find_meta_layer():
     """
     Find and return the meta layer in BBLAYERS.
     """
-    layers = find_bblayers(scripts_path)
+    layers = find_bblayers()
 
     for layer in layers:
         if layer.endswith("meta"):
@@ -117,11 +100,11 @@ def find_meta_layer(scripts_path):
     return None
 
 
-def find_bsp_layer(scripts_path, machine):
+def find_bsp_layer(machine):
     """
     Find and return a machine's BSP layer in BBLAYERS.
     """
-    layers = find_bblayers(scripts_path)
+    layers = find_bblayers()
 
     for layer in layers:
         if layer.endswith(machine):
@@ -154,7 +137,7 @@ def open_user_file(scripts_path, machine, userfile, mode):
 
     The caller is responsible for closing the file returned.
     """
-    layer = find_bsp_layer(scripts_path, machine)
+    layer = find_bsp_layer(machine)
     linuxdir = os.path.join(layer, "recipes-kernel/linux")
     linuxdir_list = os.listdir(linuxdir)
     for fileobj in linuxdir_list:
@@ -309,7 +292,7 @@ def find_filesdir(scripts_path, machine):
     (could be in files/, linux-yocto-custom/, etc).  Returns the name
     of the files dir if found, None otherwise.
     """
-    layer = find_bsp_layer(scripts_path, machine)
+    layer = find_bsp_layer(machine)
     filesdir = None
     linuxdir = os.path.join(layer, "recipes-kernel/linux")
     linuxdir_list = os.listdir(linuxdir)
@@ -474,7 +457,7 @@ def kernel_contents_changed(scripts_path, machine):
     Do what we need to do to notify the system that the kernel
     recipe's contents have changed.
     """
-    layer = find_bsp_layer(scripts_path, machine)
+    layer = find_bsp_layer(machine)
 
     kernel = find_current_kernel(layer, machine)
     if not kernel:
@@ -561,7 +544,7 @@ def find_giturl(context):
     filebase = context["filename"]
     scripts_path = context["scripts_path"]
 
-    meta_layer = find_meta_layer(scripts_path)
+    meta_layer = find_meta_layer()
 
     kerndir = os.path.join(meta_layer, "recipes-kernel/linux")
     bbglob = os.path.join(kerndir, "*.bb")
@@ -739,7 +722,7 @@ def yocto_kernel_available_features_list(scripts_path, machine):
     Display the list of all the kernel features available for use in
     BSPs, as gathered from the set of feature sources.
     """
-    layer = find_bsp_layer(scripts_path, machine)
+    layer = find_bsp_layer(machine)
     kernel = find_current_kernel(layer, machine)
     if not kernel:
         print "Couldn't determine the kernel for this BSP, exiting."
@@ -813,7 +796,7 @@ def yocto_kernel_feature_describe(scripts_path, machine, feature):
     Display the description of a specific kernel feature available for
     use in a BSP.
     """
-    layer = find_bsp_layer(scripts_path, machine)
+    layer = find_bsp_layer(machine)
 
     kernel = find_current_kernel(layer, machine)
     if not kernel:
-- 
1.7.11.4




More information about the poky mailing list