From: sam@ravnborg.org (Sam Ravnborg)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH -next 2/2] kbuild: fix for updated LZ4 tool with the new streaming format
Date: Wed, 17 Jul 2013 23:16:49 +0200 [thread overview]
Message-ID: <20130717211649.GA5619@merkur.ravnborg.org> (raw)
In-Reply-To: <20130716180408.GA19863@merkur.ravnborg.org>
>
> We could extend the symbol option part to retreive values from a binary.
> Something like this:
>
> config FOOBAR
> bool
> option exec="true"
>
> FOOBAR would assume the value "y" if the command true has exit code == 0, otherwise "n".
> And similar conversions for other types.
>
> This only extendt Kconfig slightly - using an already present method to import
> external values.
>
> The drawback I see with this approach is that we may execute a lot of small programs
> where the value is never used.
Following is a quick patch implmenting this idea.
You need to run gperf manually to enable this.
"gperf -C scripts/kconfig/zconf.gperf > scripts/kconfig/zconf.hash.c"
I did not figure out how to use the built-in rules to generate this file :-(
I have tested this lightly - as we should discuss if this is a viable way forward.
For now I used popen() - so return value of the executed program are ignored.
To test this I used:
config FOOBAR
bool
option exec="echo y"
config FOOBAR_SELECTOR
bool
default FOOBAR
Nothing fancy - but it shows the idea.
Sam
diff --git a/scripts/kconfig/expr.h b/scripts/kconfig/expr.h
index df198a5..a68258b 100644
--- a/scripts/kconfig/expr.h
+++ b/scripts/kconfig/expr.h
@@ -133,6 +133,7 @@ enum prop_type {
P_SELECT, /* select BAR */
P_RANGE, /* range 7..100 (for a symbol) */
P_ENV, /* value from environment variable */
+ P_EXEC, /* value from executable (using symbol option) */
P_SYMBOL, /* where a symbol is defined */
};
diff --git a/scripts/kconfig/lkc.h b/scripts/kconfig/lkc.h
index 09f4edf..371f73b 100644
--- a/scripts/kconfig/lkc.h
+++ b/scripts/kconfig/lkc.h
@@ -61,6 +61,7 @@ enum conf_def_mode {
#define T_OPT_MODULES 1
#define T_OPT_DEFCONFIG_LIST 2
#define T_OPT_ENV 3
+#define T_OPT_EXEC 4
struct kconf_id {
int name;
diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c
index 7e233a6..cfa7aaa 100644
--- a/scripts/kconfig/menu.c
+++ b/scripts/kconfig/menu.c
@@ -213,6 +213,9 @@ void menu_add_option(int token, char *arg)
case T_OPT_ENV:
prop_add_env(arg);
break;
+ case T_OPT_EXEC:
+ prop_add_exec(arg);
+ break;
}
}
diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c
index d550300..b7179a6 100644
--- a/scripts/kconfig/symbol.c
+++ b/scripts/kconfig/symbol.c
@@ -1331,6 +1331,8 @@ const char *prop_get_type_name(enum prop_type type)
return "prompt";
case P_ENV:
return "env";
+ case P_EXEC:
+ return "exec";
case P_COMMENT:
return "comment";
case P_MENU:
@@ -1379,3 +1381,56 @@ static void prop_add_env(const char *env)
else
menu_warn(current_entry, "environment variable %s undefined", env);
}
+
+static void exec_command(const char *command, struct symbol *sym)
+{
+ char buffer[2048];
+ FILE *stream;
+
+ stream = popen(command, "r");
+
+ if (stream != NULL) {
+ if (fgets(buffer, sizeof(buffer), stream) != NULL) {
+ int i;
+
+ buffer[sizeof(buffer) - 1] = '\0';
+
+ /* Drop any trialing newlines */
+ i = strlen(buffer);
+ while (i > 0 && buffer[i - 1] == '\n') {
+ buffer[i - 1] = '\0';
+ i--;
+ }
+ /* Validate the output of the command */
+ if (strlen(buffer) == 0) {
+ menu_warn(current_entry,
+ "command '%s' - invalid (empty?) return value: \"%s\"",
+ command, buffer);
+ return;
+ }
+
+ menu_warn(current_entry, "default: %s", buffer);
+ sym_add_default(sym, buffer);
+ } else {
+ menu_warn(current_entry, "command '%s' - empty return value", command);
+ }
+ pclose(stream);
+ } else {
+ menu_warn(current_entry, "command '%s' failed to execute", command);
+ }
+}
+
+static void prop_add_exec(const char *command)
+{
+ struct property *prop;
+ struct symbol *sym;
+
+ sym = current_entry->sym;
+ sym->flags |= SYMBOL_AUTO;
+
+ prop = prop_alloc(P_EXEC, sym);
+ prop->expr = expr_alloc_symbol(sym_lookup(command, SYMBOL_CONST));
+
+ exec_command(command, sym);
+}
+
diff --git a/scripts/kconfig/zconf.gperf b/scripts/kconfig/zconf.gperf
index f14ab41..02c6a59 100644
--- a/scripts/kconfig/zconf.gperf
+++ b/scripts/kconfig/zconf.gperf
@@ -44,4 +44,5 @@ on, T_ON, TF_PARAM
modules, T_OPT_MODULES, TF_OPTION
defconfig_list, T_OPT_DEFCONFIG_LIST,TF_OPTION
env, T_OPT_ENV, TF_OPTION
+exec, T_OPT_EXEC, TF_OPTION
%%
next prev parent reply other threads:[~2013-07-17 21:16 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-05-06 8:42 [PATCH -next 1/2] arm: Remove enforced Os flag for LZ4 decompressor Kyungsik Lee
2013-05-06 8:42 ` [PATCH -next 2/2] kbuild: fix for updated LZ4 tool with the new streaming format Kyungsik Lee
2013-05-06 9:51 ` Borislav Petkov
2013-07-10 8:12 ` Geert Uytterhoeven
2013-07-10 9:36 ` Borislav Petkov
2013-07-10 18:28 ` Markus Trippelsdorf
2013-07-10 20:01 ` Borislav Petkov
2013-07-11 4:34 ` Kyungsik Lee
2013-07-11 9:46 ` [PATCH] .gitignore: ignore *.lz4 files Markus Trippelsdorf
2013-07-12 7:56 ` [PATCH -next 2/2] kbuild: fix for updated LZ4 tool with the new streaming format Ingo Molnar
2013-07-12 8:01 ` Borislav Petkov
2013-07-12 10:13 ` Ingo Molnar
2013-07-12 10:23 ` Borislav Petkov
2013-07-12 11:18 ` Andrew Morton
2013-07-12 12:06 ` Ingo Molnar
2013-07-12 12:13 ` Borislav Petkov
2013-07-12 12:34 ` Florian Fainelli
2013-07-12 12:46 ` Borislav Petkov
2013-07-15 22:03 ` Andrew Morton
2013-07-15 22:08 ` H. Peter Anvin
2013-07-16 7:47 ` Andrew Morton
2013-07-16 7:56 ` Andrew Morton
2013-07-16 8:08 ` Yann E. MORIN
2013-07-16 8:27 ` Andrew Morton
2013-07-16 9:05 ` Borislav Petkov
2013-07-16 9:12 ` Yann E. MORIN
2013-07-16 9:22 ` Borislav Petkov
2013-07-16 9:32 ` Yann E. MORIN
2013-07-16 9:38 ` Borislav Petkov
2013-07-16 9:45 ` Yann E. MORIN
2013-07-16 9:59 ` Borislav Petkov
2013-07-16 10:04 ` Florian Fainelli
2013-07-16 18:04 ` Sam Ravnborg
2013-07-17 21:16 ` Sam Ravnborg [this message]
2013-07-17 21:44 ` Borislav Petkov
2013-07-17 22:30 ` Yann E. MORIN
2013-07-17 23:22 ` H. Peter Anvin
2013-07-18 8:02 ` Geert Uytterhoeven
2013-07-18 7:22 ` Geert Uytterhoeven
2013-07-18 7:34 ` Andrew Morton
2013-07-18 7:47 ` Yann E. MORIN
2013-07-18 7:52 ` Andrew Morton
2013-07-18 20:47 ` Sam Ravnborg
2013-07-16 9:13 ` Florian Fainelli
2013-07-16 9:25 ` Yann E. MORIN
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20130717211649.GA5619@merkur.ravnborg.org \
--to=sam@ravnborg.org \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).