Escribir tu propia entrada Kconfig
El lenguaje Kconfig por dentro: cómo se declara una opción, los tipos bool y tristate, las dependencias (depends on, select) y cómo tu feature aparece en menuconfig.
Cuando añades una feature al kernel —tu driver, tu subsistema— necesita una entrada Kconfig para que se pueda activar o desactivar. Aprender el lenguaje Kconfig es lo que integra tu código en el sistema de configuración, en vez de dejarlo como un parche suelto.
- La sintaxis de una entrada Kconfig.
- Tipos: bool vs tristate.
- Dependencias:
depends onyselect. - Cómo aparece en menuconfig.
Una entrada Kconfig
Cada directorio del kernel con features tiene un archivo Kconfig. Una entrada define una opción de configuración:
config MI_DRIVER
tristate "Soporte para mi dispositivo"
depends on PCI
default n
help
Este driver da soporte a mi dispositivo.
Compílalo como módulo (M) si no estás seguro.
Esto crea la opción CONFIG_MI_DRIVER, que aparece en menuconfig con el texto entre comillas, solo si se cumple depends on PCI, y cuya ayuda es el bloque help.
bool vs tristate
bool
Dos estados: dentro del kernel (y) o fuera (n). Para features que no tienen sentido como módulo (opciones del núcleo, del arranque).
tristate
Tres estados: dentro (y), módulo (m) o fuera (n). Para todo lo que pueda ser un módulo cargable — la mayoría de drivers.
La regla: si tu código puede ser un módulo (casi todos los drivers), usa tristate para dar esa flexibilidad (recuerda el nivel 4.1: la opción m es oro).
Dependencias: depends on y select
config MI_DRIVER
tristate "Mi driver"
depends on PCI && NET # solo disponible si PCI y NET están activos
select CRC32 # activa CRC32 automáticamente (lo necesito)
Dos formas de expresar “necesito otra cosa”, con filosofías opuestas. depends on X dice “solo muéstrame esta opción si X ya está activo” — respeta la elección del usuario; si X está apagado, tu opción ni aparece. select X dice “activa X automáticamente porque lo necesito” — fuerza a X sin preguntar. La regla de oro de los mantenedores: usa depends on para dependencias visibles que el usuario podría querer controlar, y reserva select solo para dependencias “invisibles” de infraestructura (como una librería interna que el usuario no configuraría a mano). Abusar de select crea dependencias circulares y estados de configuración imposibles — es uno de los errores por los que más se rechazan parches. Piensa: “¿el usuario debería poder decidir esto?”. Si sí, depends on; si es plumbing interno, select.
Cómo se conecta al build
Para que Kconfig encuentre tu entrada, el Kconfig del directorio padre debe incluir el tuyo con source, y tu opción CONFIG_MI_DRIVER gobierna la compilación en el Makefile (nivel 5.2):
obj-$(CONFIG_MI_DRIVER) += midriver.o
obj-$(CONFIG_MI_DRIVER) se expande a obj-y (si es y), obj-m (si es m) o nada (si es n). Así una sola línea conecta tu opción de Kconfig con qué y cómo se compila. Esta es la elegancia del sistema: la configuración fluye del .config al Makefile automáticamente.
- Abre un
Kconfigdedrivers/y estudia varias entradas reales (tipos, depends, help). - Escribe una entrada
tristatecondepends onpara un driver imaginario. - Explica cuándo usarías
selecten vez dedepends on. - Escribe la línea
obj-$(CONFIG_...)correspondiente en un Makefile.