Skip to content

Commit

Permalink
kconfig: tristate choices with mixed tristate and boolean values
Browse files Browse the repository at this point in the history
Change kconfig behavior so that mixing bool and tristate config settings in
a choice is possible and has the desired effect of offering just the
tristate options individually if the choice gets set to M, and a normal
boolean selection if the choice gets set to Y.

Signed-off-by: Jan Beulich <[email protected]>
Cc: Roman Zippel <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Sam Ravnborg <[email protected]>
  • Loading branch information
Jan Beulich authored and Sam Ravnborg committed Oct 12, 2007
1 parent 7747f96 commit a5bf3d8
Showing 1 changed file with 26 additions and 9 deletions.
35 changes: 26 additions & 9 deletions scripts/kconfig/menu.c
Original file line number Diff line number Diff line change
Expand Up @@ -235,16 +235,23 @@ void menu_finalize(struct menu *parent)
sym = parent->sym;
if (parent->list) {
if (sym && sym_is_choice(sym)) {
/* find the first choice value and find out choice type */
/* find out choice type */
enum symbol_type type = S_UNKNOWN;

for (menu = parent->list; menu; menu = menu->next) {
if (menu->sym) {
current_entry = parent;
menu_set_type(menu->sym->type);
current_entry = menu;
menu_set_type(sym->type);
break;
if (menu->sym && menu->sym->type != S_UNKNOWN) {
if (type == S_UNKNOWN)
type = menu->sym->type;
if (type != S_BOOLEAN)
break;
if (menu->sym->type == S_TRISTATE) {
type = S_TRISTATE;
break;
}
}
}
current_entry = parent;
menu_set_type(type);
parentdep = expr_alloc_symbol(sym);
} else if (parent->prompt)
parentdep = parent->prompt->visible.expr;
Expand All @@ -253,7 +260,16 @@ void menu_finalize(struct menu *parent)

for (menu = parent->list; menu; menu = menu->next) {
basedep = expr_transform(menu->dep);
basedep = expr_alloc_and(expr_copy(parentdep), basedep);
dep = parentdep;
if (sym && sym_is_choice(sym) && menu->sym) {
enum symbol_type type = menu->sym->type;

if (type == S_UNKNOWN)
type = sym->type;
if (type != S_TRISTATE)
dep = expr_alloc_comp(E_EQUAL, sym, &symbol_yes);
}
basedep = expr_alloc_and(expr_copy(dep), basedep);
basedep = expr_eliminate_dups(basedep);
menu->dep = basedep;
if (menu->sym)
Expand Down Expand Up @@ -326,7 +342,8 @@ void menu_finalize(struct menu *parent)
"values not supported");
}
current_entry = menu;
menu_set_type(sym->type);
if (menu->sym->type == S_UNKNOWN)
menu_set_type(sym->type);
menu_add_symbol(P_CHOICE, sym, NULL);
prop = sym_get_choice_prop(sym);
for (ep = &prop->expr; *ep; ep = &(*ep)->left.expr)
Expand Down

0 comments on commit a5bf3d8

Please sign in to comment.