From 35b87fb25488f2369ab85be61c68a64f83efb6dd Mon Sep 17 00:00:00 2001 From: Masahiro Yamada Date: Mon, 2 Mar 2020 15:23:40 +0900 Subject: [PATCH] kconfig: make 'imply' obey the direct dependency The 'imply' statement may create unmet direct dependency when the implied symbol depends on m. [Test Code] config FOO tristate "foo" imply BAZ config BAZ tristate "baz" depends on BAR config BAR def_tristate m config MODULES def_bool y option modules If you set FOO=y, BAZ is also promoted to y, which results in the following .config file: CONFIG_FOO=y CONFIG_BAZ=y CONFIG_BAR=m CONFIG_MODULES=y This does not meet the dependency 'BAZ depends on BAR'. Unlike 'select', what is worse, Kconfig never shows the 'WARNING: unmet direct dependencies detected for ...' for this case. Because 'imply' is considered to be weaker than 'depends on', Kconfig should take the direct dependency into account. For clarification, describe this case in kconfig-language.rst too. Signed-off-by: Masahiro Yamada Acked-by: Nicolas Pitre Tested-by: Geert Uytterhoeven Signed-off-by: Christian Lamparter --- config/symbol.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/config/symbol.c b/config/symbol.c index b101ef3..3dc8139 100644 --- a/config/symbol.c +++ b/config/symbol.c @@ -221,7 +221,7 @@ static void sym_calc_visibility(struct symbol *sym) sym_set_changed(sym); } tri = no; - if (sym->implied.expr && sym->dir_dep.tri != no) + if (sym->implied.expr) tri = expr_calc_value(sym->implied.expr); if (tri == mod && sym_get_type(sym) == S_BOOLEAN) tri = yes; @@ -394,6 +394,8 @@ void sym_calc_value(struct symbol *sym) if (sym->implied.tri != no) { sym->flags |= SYMBOL_WRITE; newval.tri = EXPR_OR(newval.tri, sym->implied.tri); + newval.tri = EXPR_AND(newval.tri, + sym->dir_dep.tri); } } calc_newval: -- 2.31.1