From: Arnaud Lacombe <lacombar@gmail.com>
To: linux-kbuild@vger.kernel.org
Cc: Michal Marek <mmarek@suse.cz>, Arnaud Lacombe <lacombar@gmail.com>
Subject: [RFC] kconfig: zconfdump() clean-up
Date: Mon, 16 May 2011 00:06:35 -0400 [thread overview]
Message-ID: <1305518795-9360-1-git-send-email-lacombar@gmail.com> (raw)
Hi Michal,
The following patch is a summarize of changes I made in zconfdump() last week
when debugging Yann's multiple choice issue. This might help debugging a bit,
espectially by exposing the tree depth.
Considering the following Kconfig:
config A
bool "A"
if A
choice C
bool "C"
config C1
bool "C1"
config C2
bool "C2"
endchoice
endif # A
config B
bool "B"
depends on ! A
if B
choice C
bool "C"
config C1
bool "C1"
config C2
bool "C2"
endchoice
endif # A
It generates the following output, after menu_finalize():
config A
boolean
symbol
prompt "A"
choice C
boolean
symbol
#choice
prompt "C" if A
config C1
boolean
symbol
prompt "C1" if C
#choice
config C2
boolean
symbol
prompt "C2" if C
#choice
endchoice
config B
boolean
symbol
prompt "B" if !A
choice C
boolean
symbol
#choice
prompt "C" if B
config C1
boolean
symbol
prompt "C1" if C
config C2
boolean
symbol
prompt "C2" if C
endchoice
instead of:
config A
boolean
unknown prop 9!
prompt "A"
choice
boolean
unknown prop 9!
#choice value
prompt "C" if A
config C1
boolean
unknown prop 9!
prompt "C1" if C
#choice value
config C2
boolean
unknown prop 9!
prompt "C2" if C
#choice value
config B
boolean
unknown prop 9!
prompt "B" if !A
choice
boolean
unknown prop 9!
#choice value
prompt "C" if B
config C1
boolean
unknown prop 9!
prompt "C1" if C
config C2
boolean
unknown prop 9!
prompt "C2" if C
endmenu
Broken down patches are available at:
https://github.com/lacombar/linux-2.6/tree/kconfig-zconfdump
Not for merge for now, even if it merges fine with your kbuild/kconfig's tip.
Regards,
- Arnaud
---
scripts/kconfig/zconf.y | 161 +++++++++++++++++++----------------------------
1 files changed, 66 insertions(+), 95 deletions(-)
diff --git a/scripts/kconfig/zconf.y b/scripts/kconfig/zconf.y
index 237ae2a..f18bc5a 100644
--- a/scripts/kconfig/zconf.y
+++ b/scripts/kconfig/zconf.y
@@ -612,129 +612,100 @@ static void print_quoted_string(FILE *out, const char *str)
putc('"', out);
}
-static void print_symbol(FILE *out, struct menu *menu)
+static int indent;
+
+static void print_property(FILE *out, struct property *prop)
{
- struct symbol *sym = menu->sym;
- struct property *prop;
+ const char *prop_string;
- if (sym_is_choice(sym))
- fprintf(out, "\nchoice\n");
- else
- fprintf(out, "\nconfig %s\n", sym->name);
- switch (sym->type) {
- case S_BOOLEAN:
- fputs(" boolean\n", out);
- break;
- case S_TRISTATE:
- fputs(" tristate\n", out);
+ prop_string = prop_get_type_name(prop->type);
+ if (prop_string == NULL)
+ return;
+
+ fprintf(out, "%*s %s%s ", indent * 8, "",
+ (prop->type == P_CHOICE) ? "#" : "",
+ prop_string);
+
+ switch (prop->type) {
+ case P_PROMPT:
+ print_quoted_string(out, prop->text);
+ if (!expr_is_yes(prop->visible.expr)) {
+ fputs(" if ", out);
+ expr_fprint(prop->visible.expr, out);
+ }
break;
- case S_STRING:
- fputs(" string\n", out);
+ case P_DEFAULT:
+ expr_fprint(prop->expr, out);
+ if (!expr_is_yes(prop->visible.expr)) {
+ fputs(" if ", out);
+ expr_fprint(prop->visible.expr, out);
+ }
break;
- case S_INT:
- fputs(" integer\n", out);
+ case P_SELECT:
+ case P_RANGE:
+ expr_fprint(prop->expr, out);
break;
- case S_HEX:
- fputs(" hex\n", out);
+ case P_MENU:
+ case P_COMMENT:
+ print_quoted_string(out, prop->text);
break;
default:
- fputs(" ???\n", out);
break;
}
+ fprintf(out, "\n");
+}
+
+static void print_symbol(FILE *out, struct menu *menu)
+{
+ struct symbol *sym = menu->sym;
+ struct property *prop;
+
+ fprintf(out, "%*s%s %s\n", indent * 8, "",
+ (sym_is_choice(sym)) ? "choice" : "config",
+ (sym->name) ? sym->name: "");
+ fprintf(out, "%*s %s\n", indent * 8, "",
+ sym_type_name(sym->type));
+
for (prop = sym->prop; prop; prop = prop->next) {
if (prop->menu != menu)
continue;
- switch (prop->type) {
- case P_PROMPT:
- fputs(" prompt ", out);
- print_quoted_string(out, prop->text);
- if (!expr_is_yes(prop->visible.expr)) {
- fputs(" if ", out);
- expr_fprint(prop->visible.expr, out);
- }
- fputc('\n', out);
- break;
- case P_DEFAULT:
- fputs( " default ", out);
- expr_fprint(prop->expr, out);
- if (!expr_is_yes(prop->visible.expr)) {
- fputs(" if ", out);
- expr_fprint(prop->visible.expr, out);
- }
- fputc('\n', out);
- break;
- case P_CHOICE:
- fputs(" #choice value\n", out);
- break;
- case P_SELECT:
- fputs( " select ", out);
- expr_fprint(prop->expr, out);
- fputc('\n', out);
- break;
- case P_RANGE:
- fputs( " range ", out);
- expr_fprint(prop->expr, out);
- fputc('\n', out);
- break;
- case P_MENU:
- fputs( " menu ", out);
- print_quoted_string(out, prop->text);
- fputc('\n', out);
- break;
- case P_SYMBOL:
- break;
- default:
- fprintf(out, " unknown prop %d!\n", prop->type);
- break;
- }
- }
- if (menu->help) {
- int len = strlen(menu->help);
- while (menu->help[--len] == '\n')
- menu->help[len] = 0;
- fprintf(out, " help\n%s\n", menu->help);
+ print_property(out, prop);
}
+ fprintf(out, "\n");
}
void zconfdump(FILE *out)
{
- struct property *prop;
- struct symbol *sym;
struct menu *menu;
menu = rootmenu.list;
while (menu) {
- if ((sym = menu->sym))
+ if (menu->sym)
print_symbol(out, menu);
- else if ((prop = menu->prompt)) {
- switch (prop->type) {
- case P_COMMENT:
- fputs("\ncomment ", out);
- print_quoted_string(out, prop->text);
- fputs("\n", out);
- break;
- case P_MENU:
- fputs("\nmenu ", out);
- print_quoted_string(out, prop->text);
- fputs("\n", out);
- break;
- default:
- ;
- }
- if (!expr_is_yes(prop->visible.expr)) {
- fputs(" depends ", out);
- expr_fprint(prop->visible.expr, out);
- fputc('\n', out);
- }
+
+ if (menu->help) {
+ int len = strlen(menu->help);
+ while (menu->help[--len] == '\n')
+ menu->help[len] = 0;
+ fprintf(out, "%*s help\n%s\n", indent * 8, "",
+ menu->help);
}
- if (menu->list)
+ if (menu->list) {
+ indent++;
menu = menu->list;
+ }
else if (menu->next)
menu = menu->next;
else while ((menu = menu->parent)) {
- if (menu->prompt && menu->prompt->type == P_MENU)
- fputs("\nendmenu\n", out);
+ if (menu != &rootmenu)
+ indent--;
+ fprintf(out, "%*s", indent * 8, "");
+ if (menu->sym && sym_is_choice(menu->sym))
+ fprintf(out, "endchoice\n\n");
+ if (menu->prompt && menu->prompt->type == P_MENU &&
+ menu != &rootmenu)
+ fprintf(out, "endmenu\n\n");
if (menu->next) {
menu = menu->next;
break;
--
1.7.3.4.574.g608b.dirty
next reply other threads:[~2011-05-16 4:06 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-05-16 4:06 Arnaud Lacombe [this message]
2011-05-16 4:07 ` [RFC] kconfig: zconfdump() clean-up Arnaud Lacombe
2011-05-31 1:24 ` Arnaud Lacombe
2011-06-08 5:05 ` Arnaud Lacombe
2011-06-24 14:08 ` Michal Marek
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=1305518795-9360-1-git-send-email-lacombar@gmail.com \
--to=lacombar@gmail.com \
--cc=linux-kbuild@vger.kernel.org \
--cc=mmarek@suse.cz \
/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.