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:
parent
673343414f
commit
aa470a1fcd
|
@ -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
|
||||
|
||||
|
|
|
@ -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" % \
|
||||
|
|
|
@ -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" % \
|
||||
|
|
|
@ -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):
|
||||
"""
|
||||
|
|
21
scripts/wic
21
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()
|
||||
|
|
Loading…
Reference in New Issue