Commit 246cf9c2 authored by Catalin Marinas's avatar Catalin Marinas Committed by Michal Marek

kbuild: Warn on selecting symbols with unmet direct dependencies

The "select" statement in Kconfig files allows the enabling of options
even if they have unmet direct dependencies (i.e. "depends on" expands
to "no"). Currently, the "depends on" clauses are used in calculating
the visibility but they do not affect the reverse dependencies in any
way.

The patch introduces additional tracking of the "depends on" statements
and prints a warning on selecting an option if its direct dependencies
are not met.
Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
Cc: Sam Ravnborg <sam@ravnborg.org>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: default avatarMichal Marek <mmarek@suse.cz>
parent 60c8eca6
...@@ -83,6 +83,7 @@ struct symbol { ...@@ -83,6 +83,7 @@ struct symbol {
tristate visible; tristate visible;
int flags; int flags;
struct property *prop; struct property *prop;
struct expr_value dir_dep;
struct expr_value rev_dep; struct expr_value rev_dep;
}; };
...@@ -163,6 +164,7 @@ struct menu { ...@@ -163,6 +164,7 @@ struct menu {
struct symbol *sym; struct symbol *sym;
struct property *prompt; struct property *prompt;
struct expr *dep; struct expr *dep;
struct expr *dir_dep;
unsigned int flags; unsigned int flags;
char *help; char *help;
struct file *file; struct file *file;
......
...@@ -105,6 +105,7 @@ static struct expr *menu_check_dep(struct expr *e) ...@@ -105,6 +105,7 @@ static struct expr *menu_check_dep(struct expr *e)
void menu_add_dep(struct expr *dep) void menu_add_dep(struct expr *dep)
{ {
current_entry->dep = expr_alloc_and(current_entry->dep, menu_check_dep(dep)); current_entry->dep = expr_alloc_and(current_entry->dep, menu_check_dep(dep));
current_entry->dir_dep = current_entry->dep;
} }
void menu_set_type(int type) void menu_set_type(int type)
...@@ -288,6 +289,10 @@ void menu_finalize(struct menu *parent) ...@@ -288,6 +289,10 @@ void menu_finalize(struct menu *parent)
for (menu = parent->list; menu; menu = menu->next) for (menu = parent->list; menu; menu = menu->next)
menu_finalize(menu); menu_finalize(menu);
} else if (sym) { } else if (sym) {
/* ignore inherited dependencies for dir_dep */
sym->dir_dep.expr = expr_transform(expr_copy(parent->dir_dep));
sym->dir_dep.expr = expr_eliminate_dups(sym->dir_dep.expr);
basedep = parent->prompt ? parent->prompt->visible.expr : NULL; basedep = parent->prompt ? parent->prompt->visible.expr : NULL;
basedep = expr_trans_compare(basedep, E_UNEQUAL, &symbol_no); basedep = expr_trans_compare(basedep, E_UNEQUAL, &symbol_no);
basedep = expr_eliminate_dups(expr_transform(basedep)); basedep = expr_eliminate_dups(expr_transform(basedep));
......
...@@ -205,6 +205,16 @@ static void sym_calc_visibility(struct symbol *sym) ...@@ -205,6 +205,16 @@ static void sym_calc_visibility(struct symbol *sym)
} }
if (sym_is_choice_value(sym)) if (sym_is_choice_value(sym))
return; return;
/* defaulting to "yes" if no explicit "depends on" are given */
tri = yes;
if (sym->dir_dep.expr)
tri = expr_calc_value(sym->dir_dep.expr);
if (tri == mod)
tri = yes;
if (sym->dir_dep.tri != tri) {
sym->dir_dep.tri = tri;
sym_set_changed(sym);
}
tri = no; tri = no;
if (sym->rev_dep.expr) if (sym->rev_dep.expr)
tri = expr_calc_value(sym->rev_dep.expr); tri = expr_calc_value(sym->rev_dep.expr);
...@@ -321,6 +331,14 @@ void sym_calc_value(struct symbol *sym) ...@@ -321,6 +331,14 @@ void sym_calc_value(struct symbol *sym)
} }
} }
calc_newval: calc_newval:
if (sym->dir_dep.tri == no && sym->rev_dep.tri != no) {
fprintf(stderr, "warning: (");
expr_fprint(sym->rev_dep.expr, stderr);
fprintf(stderr, ") selects %s which has unmet direct dependencies (",
sym->name);
expr_fprint(sym->dir_dep.expr, stderr);
fprintf(stderr, ")\n");
}
newval.tri = EXPR_OR(newval.tri, sym->rev_dep.tri); newval.tri = EXPR_OR(newval.tri, sym->rev_dep.tri);
} }
if (newval.tri == mod && sym_get_type(sym) == S_BOOLEAN) if (newval.tri == mod && sym_get_type(sym) == S_BOOLEAN)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment