summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEd Bartosh <ed.bartosh@linux.intel.com>2015-06-26 21:27:31 +0300
committerRichard Purdie <richard.purdie@linuxfoundation.org>2015-07-02 23:01:17 +0100
commit3abe23bd217315246ec2d98dc9c390b85cfe6a92 (patch)
tree088fc8e061b3008d9ceab7b52175148243e259c2
parent8becfc2281282a2e63b3bf511936df36315c9cb1 (diff)
downloadopenembedded-core-contrib-3abe23bd217315246ec2d98dc9c390b85cfe6a92.tar.gz
openembedded-core-contrib-3abe23bd217315246ec2d98dc9c390b85cfe6a92.tar.bz2
openembedded-core-contrib-3abe23bd217315246ec2d98dc9c390b85cfe6a92.zip
wic: Refactor getting bitbake variables
Wic gets bitbake variables by parsing output of 'bitbake -e' command. This implementation improves this procedure as it runs 'bitbake -e' only when API is called and does it only once, i.e. in a "lazy" way. As parsing results are cached 'bitbake -e' is run only once and results are parsed only once per requested set of variables. get_bitbake_var became the only API call. It replaces find_artifacts, find_artifact, find_bitbake_env_lines, get_bitbake_env_lines, set_bitbake_env_lines and get_line_val calls making API much more clear. Signed-off-by: Ed Bartosh <ed.bartosh@linux.intel.com>
-rw-r--r--scripts/lib/image/engine.py23
-rw-r--r--scripts/lib/wic/plugins/source/rootfs.py9
-rw-r--r--scripts/lib/wic/plugins/source/rootfs_pcbios_ext.py6
-rw-r--r--scripts/lib/wic/utils/oe/misc.py82
-rwxr-xr-xscripts/wic21
5 files changed, 38 insertions, 103 deletions
diff --git a/scripts/lib/image/engine.py b/scripts/lib/image/engine.py
index 47950f8d15..92dcc5a4f9 100644
--- a/scripts/lib/image/engine.py
+++ b/scripts/lib/image/engine.py
@@ -60,29 +60,6 @@ def verify_build_env():
return True
-def find_artifacts(image_name):
- """
- Gather the build artifacts for the current image (the image_name
- e.g. core-image-minimal) for the current MACHINE set in local.conf
- """
- bitbake_env_lines = misc.get_bitbake_env_lines()
-
- rootfs_dir = kernel_dir = bootimg_dir = native_sysroot = ""
-
- for line in bitbake_env_lines.split('\n'):
- if misc.get_line_val(line, "IMAGE_ROOTFS"):
- rootfs_dir = misc.get_line_val(line, "IMAGE_ROOTFS")
- continue
- if misc.get_line_val(line, "DEPLOY_DIR_IMAGE"):
- kernel_dir = misc.get_line_val(line, "DEPLOY_DIR_IMAGE")
- continue
- if misc.get_line_val(line, "STAGING_DIR_NATIVE"):
- native_sysroot = misc.get_line_val(line, "STAGING_DIR_NATIVE")
- continue
-
- return (rootfs_dir, kernel_dir, bootimg_dir, native_sysroot)
-
-
CANNED_IMAGE_DIR = "lib/image/canned-wks" # relative to scripts
SCRIPTS_CANNED_IMAGE_DIR = "scripts/" + CANNED_IMAGE_DIR
diff --git a/scripts/lib/wic/plugins/source/rootfs.py b/scripts/lib/wic/plugins/source/rootfs.py
index 12fbf67a6e..a90712b247 100644
--- a/scripts/lib/wic/plugins/source/rootfs.py
+++ b/scripts/lib/wic/plugins/source/rootfs.py
@@ -29,7 +29,7 @@ import os
from wic import msger
from wic.pluginbase import SourcePlugin
-from wic.utils.oe.misc import find_bitbake_env_lines, find_artifact
+from wic.utils.oe.misc import get_bitbake_var
class RootfsPlugin(SourcePlugin):
"""
@@ -43,12 +43,7 @@ class RootfsPlugin(SourcePlugin):
if os.path.isdir(rootfs_dir):
return rootfs_dir
- bitbake_env_lines = find_bitbake_env_lines(rootfs_dir)
- if not bitbake_env_lines:
- msg = "Couldn't get bitbake environment, exiting."
- msger.error(msg)
-
- image_rootfs_dir = find_artifact(bitbake_env_lines, "IMAGE_ROOTFS")
+ image_rootfs_dir = get_bitbake_var("IMAGE_ROOTFS", rootfs_dir)
if not os.path.isdir(image_rootfs_dir):
msg = "No valid artifact IMAGE_ROOTFS from image named"
msg += " %s has been found at %s, exiting.\n" % \
diff --git a/scripts/lib/wic/plugins/source/rootfs_pcbios_ext.py b/scripts/lib/wic/plugins/source/rootfs_pcbios_ext.py
index 533eaa7bd1..76e7b033fb 100644
--- a/scripts/lib/wic/plugins/source/rootfs_pcbios_ext.py
+++ b/scripts/lib/wic/plugins/source/rootfs_pcbios_ext.py
@@ -59,11 +59,7 @@ class RootfsPlugin(SourcePlugin):
if os.path.isdir(rootfs_dir):
return rootfs_dir
- bitbake_env_lines = misc.find_bitbake_env_lines(rootfs_dir)
- if not bitbake_env_lines:
- msger.error("Couldn't get bitbake environment, exiting.")
-
- image_rootfs_dir = misc.find_artifact(bitbake_env_lines, "IMAGE_ROOTFS")
+ image_rootfs_dir = misc.get_bitbake_var("IMAGE_ROOTFS", rootfs_dir)
if not os.path.isdir(image_rootfs_dir):
msg = "No valid artifact IMAGE_ROOTFS from image named"
msg += " %s has been found at %s, exiting.\n" % \
diff --git a/scripts/lib/wic/utils/oe/misc.py b/scripts/lib/wic/utils/oe/misc.py
index 2f916ddf45..1de6f46a38 100644
--- a/scripts/lib/wic/utils/oe/misc.py
+++ b/scripts/lib/wic/utils/oe/misc.py
@@ -25,6 +25,8 @@
# Tom Zanussi <tom.zanussi (at] linux.intel.com>
#
+from collections import defaultdict
+
from wic import msger
from wic.utils import runner
@@ -108,62 +110,38 @@ def add_wks_var(key, val):
BOOTDD_EXTRA_SPACE = 16384
-__bitbake_env_lines = ""
-
-def set_bitbake_env_lines(bitbake_env_lines):
- global __bitbake_env_lines
- __bitbake_env_lines = bitbake_env_lines
+_BITBAKE_VARS = defaultdict(dict)
-def get_bitbake_env_lines():
- return __bitbake_env_lines
-
-def find_bitbake_env_lines(image_name):
- """
- If image_name is empty, plugins might still be able to use the
- environment, so set it regardless.
+def get_bitbake_var(var, image=None):
"""
- if image_name:
- bitbake_env_cmd = "bitbake -e %s" % image_name
- else:
- bitbake_env_cmd = "bitbake -e"
- rc, bitbake_env_lines = __exec_cmd(bitbake_env_cmd)
- if rc != 0:
- print "Couldn't get '%s' output." % bitbake_env_cmd
- print "Bitbake failed with error:\n%s\n" % bitbake_env_lines
- return None
-
- return bitbake_env_lines
-
-def find_artifact(bitbake_env_lines, variable):
+ Get bitbake variable value lazy way, i.e. run
+ 'bitbake -e' only when variable is requested.
"""
- Gather the build artifact for the current image (the image_name
- e.g. core-image-minimal) for the current MACHINE set in local.conf
- """
- retval = ""
-
- for line in bitbake_env_lines.split('\n'):
- if get_line_val(line, variable):
- retval = get_line_val(line, variable)
- break
-
- return retval
+ if image not in _BITBAKE_VARS:
+ # Get bitbake -e output
+ cmd = "bitbake -e"
+ if image:
+ cmd += " %s" % image
+ rc, lines = __exec_cmd(cmd)
+ if rc:
+ print "Couldn't get '%s' output." % cmd
+ print "Bitbake failed with error:\n%s\n" % lines
+ return
+
+ # Parse bitbake -e output
+ for line in lines.split('\n'):
+ if "=" not in line:
+ continue
+ try:
+ key, val = line.split("=")
+ except ValueError:
+ continue
+ key = key.strip()
+ val = val.strip()
+ if key.replace('_', '').isalnum():
+ _BITBAKE_VARS[image][key] = val.strip('"')
-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 get_bitbake_var(key):
- for line in __bitbake_env_lines.split('\n'):
- if get_line_val(line, key):
- val = get_line_val(line, key)
- return val
- return None
+ return _BITBAKE_VARS[image].get(var)
def parse_sourceparams(sourceparams):
"""
diff --git a/scripts/wic b/scripts/wic
index a39ec95e0b..b75d122482 100755
--- a/scripts/wic
+++ b/scripts/wic
@@ -52,7 +52,7 @@ if bitbake_exe:
else:
bitbake_main = None
-from wic.utils.oe.misc import find_bitbake_env_lines, set_bitbake_env_lines
+from wic.utils.oe.misc import get_bitbake_var
from wic.utils.errors import WicError
from image import engine
from image import help as hlp
@@ -141,12 +141,6 @@ def wic_create_subcommand(args, usage_str):
else:
print "Done.\n"
- bitbake_env_lines = find_bitbake_env_lines(options.image_name)
- if not bitbake_env_lines:
- print "Couldn't get bitbake environment, exiting."
- sys.exit(1)
- set_bitbake_env_lines(bitbake_env_lines)
-
bootimg_dir = ""
if options.image_name:
@@ -160,9 +154,10 @@ def wic_create_subcommand(args, usage_str):
cookerdata.CookerConfiguration()):
sys.exit(1)
- (rootfs_dir, kernel_dir, bootimg_dir, native_sysroot) \
- = engine.find_artifacts(options.image_name)
-
+ rootfs_dir = get_bitbake_var("IMAGE_ROOTFS", options.image_name)
+ kernel_dir = get_bitbake_var("DEPLOY_DIR_IMAGE", options.image_name)
+ native_sysroot = get_bitbake_var("STAGING_DIR_NATIVE",
+ options.image_name)
else:
if options.build_rootfs:
print "Image name is not specified, exiting. (Use -e/--image-name to specify it)\n"
@@ -244,12 +239,6 @@ def wic_list_subcommand(args, usage_str):
(options, args) = parser.parse_args(args)
- bitbake_env_lines = find_bitbake_env_lines(None)
- if not bitbake_env_lines:
- print "Couldn't get bitbake environment, exiting."
- sys.exit(1)
- set_bitbake_env_lines(bitbake_env_lines)
-
if not engine.wic_list(args, scripts_path, options.properties_file):
logging.error("Bad list arguments, exiting\n")
parser.print_help()