All of lore.kernel.org
 help / color / mirror / Atom feed
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
 %%

  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: link
Be 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.