Commit 246cf9c26bf11f2bffbecea6e5bd222eee7b1df8

Authored by Catalin Marinas
Committed by Michal Marek
1 parent 60c8eca69f

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: Catalin 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: Michal Marek <mmarek@suse.cz>

Showing 3 changed files with 25 additions and 0 deletions Side-by-side Diff

scripts/kconfig/expr.h
... ... @@ -83,6 +83,7 @@
83 83 tristate visible;
84 84 int flags;
85 85 struct property *prop;
  86 + struct expr_value dir_dep;
86 87 struct expr_value rev_dep;
87 88 };
88 89  
... ... @@ -163,6 +164,7 @@
163 164 struct symbol *sym;
164 165 struct property *prompt;
165 166 struct expr *dep;
  167 + struct expr *dir_dep;
166 168 unsigned int flags;
167 169 char *help;
168 170 struct file *file;
scripts/kconfig/menu.c
... ... @@ -105,6 +105,7 @@
105 105 void menu_add_dep(struct expr *dep)
106 106 {
107 107 current_entry->dep = expr_alloc_and(current_entry->dep, menu_check_dep(dep));
  108 + current_entry->dir_dep = current_entry->dep;
108 109 }
109 110  
110 111 void menu_set_type(int type)
... ... @@ -288,6 +289,10 @@
288 289 for (menu = parent->list; menu; menu = menu->next)
289 290 menu_finalize(menu);
290 291 } else if (sym) {
  292 + /* ignore inherited dependencies for dir_dep */
  293 + sym->dir_dep.expr = expr_transform(expr_copy(parent->dir_dep));
  294 + sym->dir_dep.expr = expr_eliminate_dups(sym->dir_dep.expr);
  295 +
291 296 basedep = parent->prompt ? parent->prompt->visible.expr : NULL;
292 297 basedep = expr_trans_compare(basedep, E_UNEQUAL, &symbol_no);
293 298 basedep = expr_eliminate_dups(expr_transform(basedep));
scripts/kconfig/symbol.c
... ... @@ -205,6 +205,16 @@
205 205 }
206 206 if (sym_is_choice_value(sym))
207 207 return;
  208 + /* defaulting to "yes" if no explicit "depends on" are given */
  209 + tri = yes;
  210 + if (sym->dir_dep.expr)
  211 + tri = expr_calc_value(sym->dir_dep.expr);
  212 + if (tri == mod)
  213 + tri = yes;
  214 + if (sym->dir_dep.tri != tri) {
  215 + sym->dir_dep.tri = tri;
  216 + sym_set_changed(sym);
  217 + }
208 218 tri = no;
209 219 if (sym->rev_dep.expr)
210 220 tri = expr_calc_value(sym->rev_dep.expr);
... ... @@ -321,6 +331,14 @@
321 331 }
322 332 }
323 333 calc_newval:
  334 + if (sym->dir_dep.tri == no && sym->rev_dep.tri != no) {
  335 + fprintf(stderr, "warning: (");
  336 + expr_fprint(sym->rev_dep.expr, stderr);
  337 + fprintf(stderr, ") selects %s which has unmet direct dependencies (",
  338 + sym->name);
  339 + expr_fprint(sym->dir_dep.expr, stderr);
  340 + fprintf(stderr, ")\n");
  341 + }
324 342 newval.tri = EXPR_OR(newval.tri, sym->rev_dep.tri);
325 343 }
326 344 if (newval.tri == mod && sym_get_type(sym) == S_BOOLEAN)