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.

(From OE-Core rev: 3abe23bd217315246ec2d98dc9c390b85cfe6a92)

Signed-off-by: Ed Bartosh <ed.bartosh@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Ed Bartosh 2015-06-26 21:27:31 +03:00 committed by Richard Purdie
parent 673343414f
commit aa470a1fcd
5 changed files with 37 additions and 102 deletions

View File

@ -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

View File

@ -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" % \

View File

@ -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" % \

View File

@ -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 = ""
_BITBAKE_VARS = defaultdict(dict)
def set_bitbake_env_lines(bitbake_env_lines):
global __bitbake_env_lines
__bitbake_env_lines = bitbake_env_lines
def get_bitbake_env_lines():
return __bitbake_env_lines
def find_bitbake_env_lines(image_name):
def get_bitbake_var(var, image=None):
"""
If image_name is empty, plugins might still be able to use the
environment, so set it regardless.
Get bitbake variable value lazy way, i.e. run
'bitbake -e' only when variable is requested.
"""
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
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
return bitbake_env_lines
# 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 find_artifact(bitbake_env_lines, variable):
"""
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
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):
"""

View File

@ -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()