diff mbox series

[2/2] kconfig: make 'imply' obey the direct dependency

Message ID 20200302062340.21453-2-masahiroy@kernel.org (mailing list archive)
State New, archived
Headers show
Series [1/2] kconfig: allow symbols implied by y to become m | expand

Commit Message

Masahiro Yamada March 2, 2020, 6:23 a.m. UTC
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@kernel.org>
---

 Documentation/kbuild/kconfig-language.rst | 7 +++++--
 scripts/kconfig/symbol.c                  | 4 +++-
 2 files changed, 8 insertions(+), 3 deletions(-)

Comments

Nicolas Pitre March 2, 2020, 3:33 p.m. UTC | #1
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@kernel.org>

Acked-by: Nicolas Pitre <nico@fluxnic.net>

> ---
> 
>  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
> 
>
Geert Uytterhoeven March 6, 2020, 12:17 p.m. UTC | #2
Hi Yamada-san,

On Mon, Mar 2, 2020 at 7:24 AM Masahiro Yamada <masahiroy@kernel.org> 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@kernel.org>

This fixes some issue with "imply SND_SOC_WCD934X".
Tested-by: Geert Uytterhoeven <geert@linux-m68k.org>

Gr{oetje,eeting}s,

                        Geert


--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds
diff mbox series

Patch

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: