From: Eugeniu Rosca <eugeniu.m.rosca@gmail.com>
To: yann.morin.1998@free.fr, linux-kbuild@vger.kernel.org, mmarek@suse.cz
Cc: eugeniu.m.rosca@gmail.com
Subject: [PATCH v2] kconfig: Fix menu/endmenu markers in zconfdump()
Date: Sun, 31 Jul 2016 22:48:56 +0200 [thread overview]
Message-ID: <20160731204856.GA16477@eugeniu-X230> (raw)
In-Reply-To: <1468142123-13059-1-git-send-email-eugeniu.m.rosca@gmail.com>
[-- Attachment #1: Type: text/plain, Size: 0 bytes --]
[-- Attachment #2: v2-0001-kconfig-Fix-menu-endmenu-markers-in-zconfdump.patch --]
[-- Type: text/x-diff, Size: 3359 bytes --]
From 4af7b7801e2d7dffd8f943b03415659e42766610 Mon Sep 17 00:00:00 2001
From: Eugeniu Rosca <eugeniu.m.rosca@gmail.com>
Date: Sun, 10 Jul 2016 10:03:53 +0200
Subject: [PATCH v2] kconfig: Fix menu/endmenu markers in zconfdump()
Given a Kconfig.sample, implementing 2 empty and 2 non-empty menu
entries:
menu EMPTY_MENU
endmenu
menu NONEMPTY_MENU
config C1
prompt "C1"
endmenu
menuconfig EMPTY_MENUCONFIG
prompt "M1"
menuconfig NONEMPTY_MENUCONFIG
prompt "M2"
if NONEMPTY_MENUCONFIG
config C2
prompt "C2"
endif
The following can be observed (prerequisite: uncomment zconfdump()
in scripts/kconfig/conf.c):
$ make KBUILD_KCONFIG=Kconfig.sample allnoconfig | grep -cw menu
$ 4
$ make KBUILD_KCONFIG=Kconfig.sample allnoconfig | grep -cw endmenu
$ 3
It looks like zconfdump() has the following inconsistencies:
A. It prints the start marker 'menu' both for empty and non-empty menu
entries, while printing the end marker 'endmenu' only for non-empty
menu entries.
B. At the end of every dump, it prints the end marker of the root
menu, while skipping its start marker, so that even if (A) is fixed,
the number of start and end markers is still not equal.
Fix (A) and (B).
Signed-off-by: Eugeniu Rosca <eugeniu.m.rosca@gmail.com>
---
This is the second attempt to correct one of the zconfdump misbehaviors
regarding "menu" and "endmenu" markers. Without this patch, it is
practically impossible to import the kconfig symbol database into some
3rd party program or script, as the 3rd party tool would rely on the
menu/endmenu keywords to identify the borders between menu entries.
With wrong information about menu borders, no correct connection can
be established between config symbols and their parent menu entries.
Changes from v1:
- Made sure "endmenu" is printed at the end of all menu properties.
scripts/kconfig/zconf.tab.c_shipped | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/scripts/kconfig/zconf.tab.c_shipped b/scripts/kconfig/zconf.tab.c_shipped
index 7a4d658..c77a20a 100644
--- a/scripts/kconfig/zconf.tab.c_shipped
+++ b/scripts/kconfig/zconf.tab.c_shipped
@@ -2446,6 +2446,7 @@ static void print_symbol(FILE *out, struct menu *menu)
{
struct symbol *sym = menu->sym;
struct property *prop;
+ bool empty_menuconfig = false;
if (sym_is_choice(sym))
fprintf(out, "\nchoice\n");
@@ -2510,6 +2511,8 @@ static void print_symbol(FILE *out, struct menu *menu)
fputs( " menu ", out);
print_quoted_string(out, prop->text);
fputc('\n', out);
+ if (!menu->list)
+ empty_menuconfig = true;
break;
default:
fprintf(out, " unknown prop %d!\n", prop->type);
@@ -2522,6 +2525,9 @@ static void print_symbol(FILE *out, struct menu *menu)
menu->help[len] = 0;
fprintf(out, " help\n%s\n", menu->help);
}
+ if (empty_menuconfig)
+ fputs("\nendmenu\n", out);
+
}
void zconfdump(FILE *out)
@@ -2530,7 +2536,7 @@ void zconfdump(FILE *out)
struct symbol *sym;
struct menu *menu;
- menu = rootmenu.list;
+ menu = &rootmenu;
while (menu) {
if ((sym = menu->sym))
print_symbol(out, menu);
@@ -2554,6 +2560,8 @@ void zconfdump(FILE *out)
expr_fprint(prop->visible.expr, out);
fputc('\n', out);
}
+ if ((prop->type == P_MENU) && !menu->list)
+ fputs("endmenu\n", out);
}
if (menu->list)
--
2.9.2
prev parent reply other threads:[~2016-07-31 20:50 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-07-10 9:15 [PATCH] kconfig: Fix menu/endmenu markers in zconfdump() Eugeniu Rosca
2016-07-31 20:48 ` Eugeniu Rosca [this message]
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=20160731204856.GA16477@eugeniu-X230 \
--to=eugeniu.m.rosca@gmail.com \
--cc=linux-kbuild@vger.kernel.org \
--cc=mmarek@suse.cz \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox