Commit 246cf9c26bf11f2bffbecea6e5bd222eee7b1df8
Committed by
Michal Marek
1 parent
60c8eca69f
Exists in
master
and in
7 other branches
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) |