kconfig: doc: document behavior of 'select' and 'imply' followed by 'if'
authorMasahiro Yamada <masahiroy@kernel.org>
Mon, 3 Jun 2024 16:19:03 +0000 (01:19 +0900)
committerMasahiro Yamada <masahiroy@kernel.org>
Thu, 6 Jun 2024 11:05:15 +0000 (20:05 +0900)
Documentation/kbuild/kconfig-language.rst explains the behavior of
'select' as follows:

  reverse dependencies can be used to force a lower limit of
  another symbol. The value of the current menu symbol is used as the
  minimal value <symbol> can be set to.

This is not true when the 'select' property is followed by 'if'.

[Test Code]

    config MODULES
            def_bool y
            modules

    config A
            def_tristate y
            select C if B

    config B
            def_tristate m

    config C
            tristate

[Result]

    CONFIG_MODULES=y
    CONFIG_A=y
    CONFIG_B=m
    CONFIG_C=m

If "the value of A is used as the minimal value C can be set to",
C must be 'y'.

The actual behavior is "C is selected by (A && B)". The lower limit of
C is downgraded due to B being 'm'.

This behavior is kind of weird, and this has arisen several times in
the mailing list.

I do not know whether it is a bug or intended behavior. Anyway, it is
not feasible to change it now because many Kconfig files are written
based on this behavior. The same applies to 'imply'.

Document this (but reserve the possibility for a future change).

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
Reviewed-by: Randy Dunlap <rdunlap@infradead.org>
Documentation/kbuild/kconfig-language.rst

index 86be5b857cc498853cef23550656d12ceddb0258..1fb3f5e6193c33313980b3d504f7c53899f0fce1 100644 (file)
@@ -150,6 +150,12 @@ applicable everywhere (see syntax).
        That will limit the usefulness but on the other hand avoid
        the illegal configurations all over.
 
+       If "select" <symbol> is followed by "if" <expr>, <symbol> will be
+       selected by the logical AND of the value of the current menu symbol
+       and <expr>. This means, the lower limit can be downgraded due to the
+       presence of "if" <expr>. This behavior may seem weird, but we rely on
+       it. (The future of this behavior is undecided.)
+
 - weak reverse dependencies: "imply" <symbol> ["if" <expr>]
 
   This is similar to "select" as it enforces a lower limit on another
@@ -202,6 +208,10 @@ applicable everywhere (see syntax).
        imply BAR
        imply BAZ
 
+  Note: If "imply" <symbol> is followed by "if" <expr>, the default of <symbol>
+  will be the logical AND of the value of the current menu symbol and <expr>.
+  (The future of this behavior is undecided.)
+
 - limiting menu display: "visible if" <expr>
 
   This attribute is only applicable to menu blocks, if the condition is