On Mon, 2 Mar 2020, Masahiro Yamada wrote: > 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 <masahiroy@xxxxxxxxxx> Acked-by: Nicolas Pitre <nico@xxxxxxxxxxx> > --- > > Documentation/kbuild/kconfig-language.rst | 7 +++++-- > scripts/kconfig/symbol.c | 4 +++- > 2 files changed, 8 insertions(+), 3 deletions(-) > > diff --git a/Documentation/kbuild/kconfig-language.rst b/Documentation/kbuild/kconfig-language.rst > index d4d988aea679..68719e78ff85 100644 > --- a/Documentation/kbuild/kconfig-language.rst > +++ b/Documentation/kbuild/kconfig-language.rst > @@ -159,11 +159,11 @@ applicable everywhere (see syntax). > Given the following example:: > > config FOO > - tristate > + tristate "foo" > imply BAZ > > config BAZ > - tristate > + tristate "baz" > depends on BAR > > The following values are possible: > @@ -174,6 +174,9 @@ applicable everywhere (see syntax). > n y n N/m/y > m y m M/y/n > y y y Y/m/n > + n m n N/m > + m m m M/n > + y m n M/n > y n * N > === === ============= ============== > > diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c > index b101ef3c377a..3dc81397d003 100644 > --- a/scripts/kconfig/symbol.c > +++ b/scripts/kconfig/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.17.1 > >