diff options
Diffstat (limited to 'scripts/kconfig/menu.c')
| -rw-r--r-- | scripts/kconfig/menu.c | 25 | 
1 files changed, 25 insertions, 0 deletions
diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c index 7e83aef42c6..5f77dcb8977 100644 --- a/scripts/kconfig/menu.c +++ b/scripts/kconfig/menu.c @@ -140,6 +140,20 @@ struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *e  		}  		if (current_entry->prompt && current_entry != &rootmenu)  			prop_warn(prop, "prompt redefined"); + +		/* Apply all upper menus' visibilities to actual prompts. */ +		if(type == P_PROMPT) { +			struct menu *menu = current_entry; + +			while ((menu = menu->parent) != NULL) { +				if (!menu->visibility) +					continue; +				prop->visible.expr +					= expr_alloc_and(prop->visible.expr, +							 menu->visibility); +			} +		} +  		current_entry->prompt = prop;  	}  	prop->text = prompt; @@ -152,6 +166,12 @@ struct property *menu_add_prompt(enum prop_type type, char *prompt, struct expr  	return menu_add_prop(type, prompt, NULL, dep);  } +void menu_add_visibility(struct expr *expr) +{ +	current_entry->visibility = expr_alloc_and(current_entry->visibility, +	    expr); +} +  void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep)  {  	menu_add_prop(type, NULL, expr, dep); @@ -410,6 +430,11 @@ bool menu_is_visible(struct menu *menu)  	if (!menu->prompt)  		return false; +	if (menu->visibility) { +		if (expr_calc_value(menu->visibility) == no) +			return no; +	} +  	sym = menu->sym;  	if (sym) {  		sym_calc_value(sym);  |