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
|
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
|
CANNED_IMAGE_DIR = "lib/image/canned-wks" # relative to scripts
|
||||||
SCRIPTS_CANNED_IMAGE_DIR = "scripts/" + CANNED_IMAGE_DIR
|
SCRIPTS_CANNED_IMAGE_DIR = "scripts/" + CANNED_IMAGE_DIR
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@ import os
|
||||||
|
|
||||||
from wic import msger
|
from wic import msger
|
||||||
from wic.pluginbase import SourcePlugin
|
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):
|
class RootfsPlugin(SourcePlugin):
|
||||||
"""
|
"""
|
||||||
|
@ -43,12 +43,7 @@ class RootfsPlugin(SourcePlugin):
|
||||||
if os.path.isdir(rootfs_dir):
|
if os.path.isdir(rootfs_dir):
|
||||||
return rootfs_dir
|
return rootfs_dir
|
||||||
|
|
||||||
bitbake_env_lines = find_bitbake_env_lines(rootfs_dir)
|
image_rootfs_dir = get_bitbake_var("IMAGE_ROOTFS", 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")
|
|
||||||
if not os.path.isdir(image_rootfs_dir):
|
if not os.path.isdir(image_rootfs_dir):
|
||||||
msg = "No valid artifact IMAGE_ROOTFS from image named"
|
msg = "No valid artifact IMAGE_ROOTFS from image named"
|
||||||
msg += " %s has been found at %s, exiting.\n" % \
|
msg += " %s has been found at %s, exiting.\n" % \
|
||||||
|
|
|
@ -59,11 +59,7 @@ class RootfsPlugin(SourcePlugin):
|
||||||
if os.path.isdir(rootfs_dir):
|
if os.path.isdir(rootfs_dir):
|
||||||
return rootfs_dir
|
return rootfs_dir
|
||||||
|
|
||||||
bitbake_env_lines = misc.find_bitbake_env_lines(rootfs_dir)
|
image_rootfs_dir = misc.get_bitbake_var("IMAGE_ROOTFS", 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")
|
|
||||||
if not os.path.isdir(image_rootfs_dir):
|
if not os.path.isdir(image_rootfs_dir):
|
||||||
msg = "No valid artifact IMAGE_ROOTFS from image named"
|
msg = "No valid artifact IMAGE_ROOTFS from image named"
|
||||||
msg += " %s has been found at %s, exiting.\n" % \
|
msg += " %s has been found at %s, exiting.\n" % \
|
||||||
|
|
|
@ -25,6 +25,8 @@
|
||||||
# Tom Zanussi <tom.zanussi (at] linux.intel.com>
|
# Tom Zanussi <tom.zanussi (at] linux.intel.com>
|
||||||
#
|
#
|
||||||
|
|
||||||
|
from collections import defaultdict
|
||||||
|
|
||||||
from wic import msger
|
from wic import msger
|
||||||
from wic.utils import runner
|
from wic.utils import runner
|
||||||
|
|
||||||
|
@ -108,62 +110,38 @@ def add_wks_var(key, val):
|
||||||
|
|
||||||
BOOTDD_EXTRA_SPACE = 16384
|
BOOTDD_EXTRA_SPACE = 16384
|
||||||
|
|
||||||
__bitbake_env_lines = ""
|
_BITBAKE_VARS = defaultdict(dict)
|
||||||
|
|
||||||
def set_bitbake_env_lines(bitbake_env_lines):
|
def get_bitbake_var(var, image=None):
|
||||||
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):
|
|
||||||
"""
|
"""
|
||||||
If image_name is empty, plugins might still be able to use the
|
Get bitbake variable value lazy way, i.e. run
|
||||||
environment, so set it regardless.
|
'bitbake -e' only when variable is requested.
|
||||||
"""
|
"""
|
||||||
if image_name:
|
if image not in _BITBAKE_VARS:
|
||||||
bitbake_env_cmd = "bitbake -e %s" % image_name
|
# Get bitbake -e output
|
||||||
else:
|
cmd = "bitbake -e"
|
||||||
bitbake_env_cmd = "bitbake -e"
|
if image:
|
||||||
rc, bitbake_env_lines = __exec_cmd(bitbake_env_cmd)
|
cmd += " %s" % image
|
||||||
if rc != 0:
|
rc, lines = __exec_cmd(cmd)
|
||||||
print "Couldn't get '%s' output." % bitbake_env_cmd
|
if rc:
|
||||||
print "Bitbake failed with error:\n%s\n" % bitbake_env_lines
|
print "Couldn't get '%s' output." % cmd
|
||||||
return None
|
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):
|
return _BITBAKE_VARS[image].get(var)
|
||||||
"""
|
|
||||||
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
|
|
||||||
|
|
||||||
def parse_sourceparams(sourceparams):
|
def parse_sourceparams(sourceparams):
|
||||||
"""
|
"""
|
||||||
|
|
21
scripts/wic
21
scripts/wic
|
@ -52,7 +52,7 @@ if bitbake_exe:
|
||||||
else:
|
else:
|
||||||
bitbake_main = None
|
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 wic.utils.errors import WicError
|
||||||
from image import engine
|
from image import engine
|
||||||
from image import help as hlp
|
from image import help as hlp
|
||||||
|
@ -141,12 +141,6 @@ def wic_create_subcommand(args, usage_str):
|
||||||
else:
|
else:
|
||||||
print "Done.\n"
|
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 = ""
|
bootimg_dir = ""
|
||||||
|
|
||||||
if options.image_name:
|
if options.image_name:
|
||||||
|
@ -160,9 +154,10 @@ def wic_create_subcommand(args, usage_str):
|
||||||
cookerdata.CookerConfiguration()):
|
cookerdata.CookerConfiguration()):
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
(rootfs_dir, kernel_dir, bootimg_dir, native_sysroot) \
|
rootfs_dir = get_bitbake_var("IMAGE_ROOTFS", options.image_name)
|
||||||
= engine.find_artifacts(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:
|
else:
|
||||||
if options.build_rootfs:
|
if options.build_rootfs:
|
||||||
print "Image name is not specified, exiting. (Use -e/--image-name to specify it)\n"
|
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)
|
(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):
|
if not engine.wic_list(args, scripts_path, options.properties_file):
|
||||||
logging.error("Bad list arguments, exiting\n")
|
logging.error("Bad list arguments, exiting\n")
|
||||||
parser.print_help()
|
parser.print_help()
|
||||||
|
|
Loading…
Reference in New Issue