diff options
author | Ed Bartosh <ed.bartosh@linux.intel.com> | 2015-06-26 21:27:31 +0300 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2015-07-02 23:01:17 +0100 |
commit | 3abe23bd217315246ec2d98dc9c390b85cfe6a92 (patch) | |
tree | 088fc8e061b3008d9ceab7b52175148243e259c2 /scripts/lib | |
parent | 8becfc2281282a2e63b3bf511936df36315c9cb1 (diff) | |
download | openembedded-core-3abe23bd217315246ec2d98dc9c390b85cfe6a92.tar.gz openembedded-core-3abe23bd217315246ec2d98dc9c390b85cfe6a92.tar.bz2 openembedded-core-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>
Diffstat (limited to 'scripts/lib')
-rw-r--r-- | scripts/lib/image/engine.py | 23 | ||||
-rw-r--r-- | scripts/lib/wic/plugins/source/rootfs.py | 9 | ||||
-rw-r--r-- | scripts/lib/wic/plugins/source/rootfs_pcbios_ext.py | 6 | ||||
-rw-r--r-- | scripts/lib/wic/utils/oe/misc.py | 82 |
4 files changed, 33 insertions, 87 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): """ |