From: Sam Ravnborg <sam@ravnborg.org> To: "Yann E. MORIN" <yann.morin.1998@free.fr> Cc: Andrew Morton <akpm@linux-foundation.org>, "H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@kernel.org>, Kyungsik Lee <kyungsik.lee@lge.com>, Michal Marek <mmarek@suse.cz>, linux-kernel@vger.kernel.org, linux-kbuild@vger.kernel.org, x86@kernel.org, celinux-dev@lists.celinuxforum.org, linux-arm-kernel@lists.infradead.org, hyojun.im@lge.com, chan.jeong@lge.com, raphael.andy.lee@gmail.com, Ingo Molnar <mingo@elte.hu>, Thomas Gleixner <tglx@linutronix.de>, Russell King <rmk@arm.linux.org.uk>, Borislav Petkov <bp@alien8.de>, Florian Fainelli <florian@openwrt.org>, Yann Collet <yann.collet.73@gmail.com>, Chanho Min <chanho.min@lge.com> Subject: Re: [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 %%
WARNING: multiple messages have this Message-ID (diff)
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: 110+ 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 ` 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 8:42 ` Kyungsik Lee 2013-05-06 9:51 ` Borislav Petkov 2013-05-06 9:51 ` Borislav Petkov 2013-07-10 8:12 ` Geert Uytterhoeven 2013-07-10 8:12 ` Geert Uytterhoeven 2013-07-10 8:12 ` Geert Uytterhoeven 2013-07-10 9:36 ` Borislav Petkov 2013-07-10 9:36 ` Borislav Petkov 2013-07-10 9:36 ` Borislav Petkov 2013-07-10 18:28 ` Markus Trippelsdorf 2013-07-10 18:28 ` Markus Trippelsdorf 2013-07-10 18:28 ` Markus Trippelsdorf 2013-07-10 18:28 ` Markus Trippelsdorf 2013-07-10 20:01 ` Borislav Petkov 2013-07-10 20:01 ` Borislav Petkov 2013-07-10 20:01 ` Borislav Petkov 2013-07-10 20:01 ` Borislav Petkov 2013-07-11 4:34 ` Kyungsik Lee 2013-07-11 4:34 ` Kyungsik Lee 2013-07-11 4:34 ` Kyungsik Lee 2013-07-11 4:34 ` Kyungsik Lee 2013-07-11 9:46 ` [PATCH] .gitignore: ignore *.lz4 files Markus Trippelsdorf 2013-07-11 9:46 ` Markus Trippelsdorf 2013-07-11 9:46 ` Markus Trippelsdorf 2013-07-11 9:46 ` 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 7:56 ` Ingo Molnar 2013-07-12 8:01 ` Borislav Petkov 2013-07-12 8:01 ` Borislav Petkov 2013-07-12 10:13 ` Ingo Molnar 2013-07-12 10:13 ` Ingo Molnar 2013-07-12 10:23 ` Borislav Petkov 2013-07-12 10:23 ` Borislav Petkov 2013-07-12 11:18 ` Andrew Morton 2013-07-12 11:18 ` Andrew Morton 2013-07-12 12:06 ` Ingo Molnar 2013-07-12 12:06 ` Ingo Molnar 2013-07-12 12:13 ` Borislav Petkov 2013-07-12 12:13 ` Borislav Petkov 2013-07-12 12:34 ` Florian Fainelli 2013-07-12 12:34 ` Florian Fainelli 2013-07-12 12:34 ` Florian Fainelli 2013-07-12 12:46 ` Borislav Petkov 2013-07-12 12:46 ` Borislav Petkov 2013-07-12 12:46 ` Borislav Petkov 2013-07-15 22:03 ` Andrew Morton 2013-07-15 22:03 ` Andrew Morton 2013-07-15 22:08 ` H. Peter Anvin 2013-07-15 22:08 ` H. Peter Anvin 2013-07-16 7:47 ` Andrew Morton 2013-07-16 7:47 ` Andrew Morton 2013-07-16 7:56 ` Andrew Morton 2013-07-16 7:56 ` Andrew Morton 2013-07-16 8:08 ` Yann E. MORIN 2013-07-16 8:08 ` Yann E. MORIN 2013-07-16 8:27 ` Andrew Morton 2013-07-16 8:27 ` Andrew Morton 2013-07-16 9:05 ` Borislav Petkov 2013-07-16 9:05 ` Borislav Petkov 2013-07-16 9:12 ` Yann E. MORIN 2013-07-16 9:12 ` Yann E. MORIN 2013-07-16 9:22 ` Borislav Petkov 2013-07-16 9:22 ` Borislav Petkov 2013-07-16 9:32 ` Yann E. MORIN 2013-07-16 9:32 ` Yann E. MORIN 2013-07-16 9:38 ` Borislav Petkov 2013-07-16 9:38 ` Borislav Petkov 2013-07-16 9:45 ` Yann E. MORIN 2013-07-16 9:45 ` Yann E. MORIN 2013-07-16 9:59 ` Borislav Petkov 2013-07-16 9:59 ` Borislav Petkov 2013-07-16 10:04 ` Florian Fainelli 2013-07-16 10:04 ` Florian Fainelli 2013-07-16 10:04 ` Florian Fainelli 2013-07-16 18:04 ` Sam Ravnborg 2013-07-16 18:04 ` Sam Ravnborg 2013-07-17 21:16 ` Sam Ravnborg [this message] 2013-07-17 21:16 ` Sam Ravnborg 2013-07-17 21:44 ` Borislav Petkov 2013-07-17 21:44 ` Borislav Petkov 2013-07-17 22:30 ` Yann E. MORIN 2013-07-17 22:30 ` Yann E. MORIN 2013-07-17 23:22 ` H. Peter Anvin 2013-07-17 23:22 ` H. Peter Anvin 2013-07-18 8:02 ` Geert Uytterhoeven 2013-07-18 8:02 ` Geert Uytterhoeven 2013-07-18 8:02 ` Geert Uytterhoeven 2013-07-18 7:22 ` Geert Uytterhoeven 2013-07-18 7:22 ` Geert Uytterhoeven 2013-07-18 7:22 ` Geert Uytterhoeven 2013-07-18 7:34 ` Andrew Morton 2013-07-18 7:34 ` Andrew Morton 2013-07-18 7:34 ` Andrew Morton 2013-07-18 7:47 ` Yann E. MORIN 2013-07-18 7:47 ` Yann E. MORIN 2013-07-18 7:47 ` Yann E. MORIN 2013-07-18 7:52 ` Andrew Morton 2013-07-18 7:52 ` Andrew Morton 2013-07-18 7:52 ` Andrew Morton 2013-07-18 20:47 ` Sam Ravnborg 2013-07-18 20:47 ` Sam Ravnborg 2013-07-16 9:13 ` Florian Fainelli 2013-07-16 9:13 ` Florian Fainelli 2013-07-16 9:13 ` Florian Fainelli 2013-07-16 9:25 ` Yann E. MORIN 2013-07-16 9:25 ` Yann E. MORIN 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=akpm@linux-foundation.org \ --cc=bp@alien8.de \ --cc=celinux-dev@lists.celinuxforum.org \ --cc=chan.jeong@lge.com \ --cc=chanho.min@lge.com \ --cc=florian@openwrt.org \ --cc=hpa@zytor.com \ --cc=hyojun.im@lge.com \ --cc=kyungsik.lee@lge.com \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-kbuild@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=mingo@elte.hu \ --cc=mingo@kernel.org \ --cc=mmarek@suse.cz \ --cc=raphael.andy.lee@gmail.com \ --cc=rmk@arm.linux.org.uk \ --cc=tglx@linutronix.de \ --cc=x86@kernel.org \ --cc=yann.collet.73@gmail.com \ --cc=yann.morin.1998@free.fr \ /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: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.