kconfig: make 'imply' obey the direct dependency
authorMasahiro Yamada <masahiroy@kernel.org>
Mon, 2 Mar 2020 06:23:40 +0000 (15:23 +0900)
committerMasahiro Yamada <masahiroy@kernel.org>
Fri, 13 Mar 2020 01:05:34 +0000 (10:05 +0900)
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>
Tested-by: Geert Uytterhoeven <geert@linux-m68k.org>
Documentation/kbuild/kconfig-language.rst
scripts/kconfig/symbol.c

index d4d988aea679788d60329c4ea7b3517e77096c68..a1601ec3317b49dab521f06296f9b7427f8795eb 100644 (file)
@@ -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
        ===             ===             =============   ==============
 
@@ -191,6 +194,14 @@ applicable everywhere (see syntax).
                ...
        }
 
+  Note: If the feature provided by BAZ is highly desirable for FOO,
+  FOO should imply not only BAZ, but also its dependency BAR::
+
+    config FOO
+       tristate "foo"
+       imply BAR
+       imply BAZ
+
 - limiting menu display: "visible if" <expr>
 
   This attribute is only applicable to menu blocks, if the condition is
index b101ef3c377a6b98d76e8d93a3c5be1c45d8fb7f..3dc81397d0038495a4a9a11925990a42fedf46ce 100644 (file)
@@ -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: