Documentation: kbuild: explain handling optional dependencies
authorArnd Bergmann <arnd@arndb.de>
Sun, 17 Sep 2023 19:19:59 +0000 (21:19 +0200)
committerMasahiro Yamada <masahiroy@kernel.org>
Mon, 25 Sep 2023 07:01:05 +0000 (16:01 +0900)
This problem frequently comes up in randconfig testing, with
drivers failing to link because of a dependency on an optional
feature.

The Kconfig language for this is very confusing, so try to
document it in "Kconfig hints" section.

Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Reviewed-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Reviewed-by: Nicolas Schier <nicolas@fjasle.eu>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
Documentation/kbuild/kconfig-language.rst

index 858ed5d..0135905 100644 (file)
@@ -573,6 +573,32 @@ above, leading to:
        bool "Support for foo hardware"
        depends on ARCH_FOO_VENDOR || COMPILE_TEST
 
+Optional dependencies
+~~~~~~~~~~~~~~~~~~~~~
+
+Some drivers are able to optionally use a feature from another module
+or build cleanly with that module disabled, but cause a link failure
+when trying to use that loadable module from a built-in driver.
+
+The most common way to express this optional dependency in Kconfig logic
+uses the slightly counterintuitive::
+
+  config FOO
+       tristate "Support for foo hardware"
+       depends on BAR || !BAR
+
+This means that there is either a dependency on BAR that disallows
+the combination of FOO=y with BAR=m, or BAR is completely disabled.
+For a more formalized approach if there are multiple drivers that have
+the same dependency, a helper symbol can be used, like::
+
+  config FOO
+       tristate "Support for foo hardware"
+       depends on BAR_OPTIONAL
+
+  config BAR_OPTIONAL
+       def_tristate BAR || !BAR
+
 Kconfig recursive dependency limitations
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~