From 934f2ed2539e046f91a234d30fc4da71ffbe28a0 Mon Sep 17 00:00:00 2001 From: Tom Zanussi Date: Mon, 11 Mar 2013 21:25:46 -0500 Subject: yocto-kernel: add support for listing available kernel features Add a yocto-kernel command allowing users to list all the kernel features available to a BSP. This includes the features contained in linux-yocto meta branches as well as recipe-space features defined locally to the BSP. (From meta-yocto rev: 12f3af8d92456ad9212170decdbe102fc78b58f6) Signed-off-by: Tom Zanussi Signed-off-by: Richard Purdie --- scripts/lib/bsp/help.py | 31 ++++++++++++++ scripts/lib/bsp/kernel.py | 107 ++++++++++++++++++++++++++++++++++++++++++++++ scripts/yocto-kernel | 27 +++++++++++- 3 files changed, 164 insertions(+), 1 deletion(-) (limited to 'scripts') diff --git a/scripts/lib/bsp/help.py b/scripts/lib/bsp/help.py index 2d7b6fe6d2..9ba6a931ee 100644 --- a/scripts/lib/bsp/help.py +++ b/scripts/lib/bsp/help.py @@ -386,6 +386,7 @@ yocto_kernel_usage = """ feature list List the features used by a BSP feature add Have a BSP use a feature feature rm Have a BSP stop using a feature + features list List the features available to BSPs See 'yocto-kernel help COMMAND' for more information on a specific command. @@ -692,6 +693,36 @@ DESCRIPTION remove. """ + +yocto_kernel_available_features_list_usage = """ + + List the set of kernel features available to a BSP + + usage: yocto-kernel features list + + This command lists the complete set of kernel features available to a + BSP. This includes the features contained in linux-yocto meta + branches as well as recipe-space features defined locally to the BSP. +""" + + +yocto_kernel_available_features_list_help = """ + +NAME + yocto-kernel features list - List the set of kernel features + available to a BSP + +SYNOPSIS + yocto-kernel features list + +DESCRIPTION + This command lists the complete set of kernel features available + to a BSP. This includes the features contained in linux-yocto + meta branches as well as recipe-space features defined locally to + the BSP. +""" + + ## # yocto-layer help and usage strings ## diff --git a/scripts/lib/bsp/kernel.py b/scripts/lib/bsp/kernel.py index 0fa228a58a..0308600a42 100644 --- a/scripts/lib/bsp/kernel.py +++ b/scripts/lib/bsp/kernel.py @@ -32,6 +32,7 @@ import shutil from tags import * import glob import subprocess +from engine import create_context def find_bblayers(scripts_path): @@ -651,6 +652,112 @@ def yocto_kernel_feature_add(scripts_path, machine, features): for n in new_items: print "\t%s" % n + +def find_feature_url(git_url): + """ + Find the url of the kern-features.rc kernel for the kernel repo + specified from the BSP's kernel recipe SRC_URI. + """ + feature_url = "" + if git_url.startswith("git://"): + git_url = git_url[len("git://"):].strip() + s = git_url.split("/") + if s[1].endswith(".git"): + s[1] = s[1][:len(s[1]) - len(".git")] + feature_url = "http://" + s[0] + "/cgit/cgit.cgi/" + s[1] + \ + "/plain/meta/cfg/kern-features.rc?h=meta" + + return feature_url + + +def find_feature_desc(lines): + """ + Find the feature description and compatibility in the passed-in + set of lines. Returns a string string of the form 'desc + [compat]'. + """ + desc = "no description available" + compat = "unknown" + + for line in lines: + idx = line.find("KFEATURE_DESCRIPTION") + if idx != -1: + desc = line[idx + len("KFEATURE_DESCRIPTION"):].strip() + if desc.startswith("\""): + desc = desc[1:] + if desc.endswith("\""): + desc = desc[:-1] + else: + idx = line.find("KFEATURE_COMPATIBILITY") + if idx != -1: + compat = line[idx + len("KFEATURE_COMPATIBILITY"):].strip() + + return desc + " [" + compat + "]" + + +def print_feature_descs(layer, feature_dir): + """ + Print the feature descriptions for the features in feature_dir. + """ + kernel_files_features = os.path.join(layer, "recipes-kernel/linux/files/" + + feature_dir) + for root, dirs, files in os.walk(kernel_files_features): + for file in files: + if file.endswith("~") or file.endswith("#"): + continue + if file.endswith(".scc"): + fullpath = os.path.join(layer, "recipes-kernel/linux/files/" + + feature_dir + "/" + file) + f = open(fullpath) + feature_desc = find_feature_desc(f.readlines()) + print feature_dir + "/" + file + ": " + feature_desc + + +def yocto_kernel_available_features_list(scripts_path, machine): + """ + Display the list of all the kernel features available for use in + BSPs, as gathered from the set of feature sources. + """ + layer = find_bsp_layer(scripts_path, machine) + kernel = find_current_kernel(layer, machine) + if not kernel: + print "Couldn't determine the kernel for this BSP, exiting." + sys.exit(1) + + context = create_context(machine, "arch", scripts_path) + context["name"] = "name" + context["filename"] = kernel + giturl = find_giturl(context) + feature_url = find_feature_url(giturl) + + feature_cmd = "wget -q -O - " + feature_url + tmp = subprocess.Popen(feature_cmd, shell=True, stdout=subprocess.PIPE).stdout.read() + + print "The current set of kernel features available to %s is:\n" % machine + + if tmp: + tmpline = tmp.split("\n") + in_kernel_options = False + for line in tmpline: + if not "=" in line: + if in_kernel_options: + break + if "kernel-options" in line: + in_kernel_options = True + continue + if in_kernel_options: + feature_def = line.split("=") + feature_type = feature_def[0].strip() + feature = feature_def[1].strip() + desc = get_feature_desc(giturl, feature) + print "%s: %s" % (feature, desc) + + print "[local]" + + print_feature_descs(layer, "cfg") + print_feature_descs(layer, "features") + + def base_branches(context): """ diff --git a/scripts/yocto-kernel b/scripts/yocto-kernel index 72b407109d..a66a7272db 100755 --- a/scripts/yocto-kernel +++ b/scripts/yocto-kernel @@ -221,6 +221,28 @@ def yocto_kernel_feature_rm_subcommand(args, usage_str): yocto_kernel_feature_rm(scripts_path, args[0]) +def yocto_kernel_available_features_list_subcommand(args, usage_str): + """ + Command-line handling for listing all the kernel features + available for use in a BSP. This includes the features present in + the meta branch(es) of the pointed-to repo(s) as well as the local + features added in recipe-space to the current BSP as well. The + real work is done by bsp.kernel.yocto_kernel_available_features_list(). + """ + logging.debug("yocto_kernel_feature_available_features_list_subcommand") + + parser = optparse.OptionParser(usage = usage_str) + + (options, args) = parser.parse_args(args) + + if len(args) != 1: + logging.error("Wrong number of arguments, exiting\n") + parser.print_help() + sys.exit(1) + + yocto_kernel_available_features_list(scripts_path, args[0]) + + subcommands = { "config-list": [yocto_kernel_config_list_subcommand, yocto_kernel_config_list_usage, @@ -249,6 +271,9 @@ subcommands = { "feature-rm": [yocto_kernel_feature_rm_subcommand, yocto_kernel_feature_rm_usage, yocto_kernel_feature_rm_help], + "features-list": [yocto_kernel_available_features_list_subcommand, + yocto_kernel_available_features_list_usage, + yocto_kernel_available_features_list_help], } @@ -281,7 +306,7 @@ def main(): sc = 0 if args[sc] == "config" or args[sc] == "patch" or \ - args[sc] == "feature": + args[sc] == "feature" or args[sc] == "features": if len(args) < 2 + sc: parser.print_help() sys.exit(1) -- cgit v1.2.3-54-g00ecf