译 《Documentación / kbuild / kconfig-language.txt》

Este artículo no es estrictamente una traducción palabra por palabra, y solo se traduce la parte de interés, que proviene de linux-4.1.15 / Documentation / kbuild / kconfig-language.txt

Introducción

La base de datos de configuración es una colección de opciones de configuración
organizadas en una estructura de árbol:
Los datos organizados son una estructura de árbol, como la siguiente

	+- Code maturity level options
	|  +- Prompt for development and/or incomplete code/drivers
	+- General setup
	|  +- Networking support
	|  +- System V IPC
	|  +- BSD Process Accounting
	|  +- Sysctl support
	+- Loadable module support
	|  +- Enable loadable module support
	|     +- Set version information on all module symbols
	|     +- Kernel module loader
	+- ...

Cada entrada tiene sus propias dependencias. Estas dependencias se utilizan
para determinar la visibilidad de una entrada. Cualquier entrada secundaria solo es
visible si su entrada principal también está visible.

Cada entrada (elemento compilado) tiene sus propias dependencias. Estas dependencias determinan la visibilidad de la entrada. Si el elemento secundario va a ser visible, la opción del nivel superior también debe estar visible.

Entradas de menú

La mayoría de los elementos de compilación son configurables, el siguiente es un ejemplo.
La mayoría de las entradas definen una opción de configuración; todas las demás entradas ayudan a organizarlas
. Una única opción de configuración se define así:

config MODVERSIONS
	bool "Set version information on all module symbols"
	depends on MODULES
	help
	  Usually, modules have to be recompiled whenever you switch to a new
	  kernel.  ...

Cada línea comienza con una palabra clave y puede ir seguida de varios
argumentos. "Config" inicia una nueva entrada de configuración. Las siguientes líneas
definen atributos para esta opción de configuración. Los atributos pueden ser el tipo de
opción de configuración, solicitud de entrada, dependencias, texto de ayuda y
valores predeterminados . Una opción de configuración se puede definir varias veces con el mismo
nombre, pero cada definición puede tener una única solicitud de entrada y el tipo no debe entrar en conflicto.

Cada línea tiene una palabra clave, seguida de varios parámetros. Config define un nuevo elemento de configuración. Las siguientes líneas determinan los atributos de este elemento de configuración. Los atributos incluyen: configuración, solicitud, dependencia, información de ayuda y valor predeterminado, un atributo de configuración puede definirse varias veces, pero la solicitud no puede ser del mismo tipo o conflicto.

Atributos del menú

Una entrada de menú puede tener varios atributos. No todos son
aplicables en todas partes (ver sintaxis).

  • definición de tipo: “bool” / “tristate” / “string” / “hex” / “int”
    Cada opción de configuración debe tener un tipo. Solo hay dos tipos básicos:
    triestado y cuerda; los otros tipos se basan en estos dos. La
    definición de tipo acepta opcionalmente una solicitud de entrada, por lo que estos dos ejemplos
    son equivalentes:

Los tipos son: "bool", "tristate", "string", "hex", "int"
Cada elemento de configuración debe tener un tipo, hay dos tipos básicos: triestado y cadena, otros tipos se basan en estos dos tipos, la línea de tipo puede permitir información rápida

	bool "Networking support"
  and
	bool
	prompt "Networking support"

El efecto de estos dos métodos de escritura es el mismo

  • mensaje de entrada: “mensaje” [“si”]
    Cada entrada de menú puede tener como máximo un mensaje, que se utiliza para mostrar
    al usuario. Opcionalmente, las dependencias solo para este mensaje se pueden agregar
    con "si".
    Cada opción de menú solo puede tener como máximo una solicitud de entrada mostrada al usuario. Puede utilizar "si" para indicar la dependencia del mensaje

  • valor predeterminado: "predeterminado" ["si"]
    Una opción de configuración puede tener cualquier número de valores predeterminados. Si hay varios
    valores predeterminados visibles, solo el primero definido está activo.
    Los valores predeterminados no se limitan a la entrada del menú donde están
    definidos. Esto significa que el valor predeterminado se puede definir en otro lugar o se puede
    anular por una definición anterior.
    El valor predeterminado solo se asigna al símbolo de configuración si
    el usuario no estableció ningún otro valor (a través del indicador de entrada anterior). Si una
    solicitud de entrada está visible, el valor predeterminado se presenta al usuario y puede
    ser anulado por él.
    Opcionalmente, las dependencias solo para este valor predeterminado se pueden agregar con
    "si".

Una opción de configuración puede tener cualquier número de valores predeterminados. Si hay varios valores predeterminados, solo el primer valor definido es válido. El valor predeterminado no está necesariamente definido en la definición del elemento de configuración, lo que significa que el valor predeterminado se puede definir en cualquier lugar o antes Definir cobertura
Si el usuario no lo configura (a través del indicador de entrada anterior), el valor de la opción de configuración es el valor predeterminado. Si se puede mostrar la solicitud de entrada, el valor predeterminado se mostrará al usuario y el usuario puede modificarlo.

La dependencia del valor predeterminado se puede agregar con "si"

  • definición de tipo + valor predeterminado:
    “def_bool” / “def_tristate” [“si”]
    Esta es una notación abreviada para una definición de tipo más un valor.
    Opcionalmente, las dependencias para este valor predeterminado se pueden agregar con "si".

  • dependencias: "depende de"
    Esto define una dependencia para esta entrada de menú. Si
    se definen varias dependencias, se conectan con '&&'. Las dependencias
    se aplican a todas las demás opciones dentro de esta entrada de menú (que también
    aceptan una expresión "si"), por lo que estos dos ejemplos son equivalentes:

Defina una dependencia para el elemento de configuración. Si hay varias dependencias, puede usar el símbolo "&&", y otros elementos del elemento de configuración también pueden usar dependencias y también aceptar "si". La siguiente escritura es equivalente

Solo depende de A, este A está configurado, este elemento de configuración se puede configurar

	bool "foo" if BAR
	default y if BAR
  and
	depends on BAR
	bool "foo"
	default y
  • dependencias inversas: “seleccionar” [“si”]
    Mientras que las dependencias normales reducen el límite superior de un símbolo (ver más
    abajo), las dependencias inversas pueden usarse para forzar un límite inferior de
    otro símbolo. El valor del símbolo del menú actual se utiliza como
    valor mínimo que se puede establecer. Si se selecciona varias
    veces, el límite se establece en la selección más grande.
    Las dependencias inversas solo se pueden utilizar con
    símbolos booleanos o triestados .
    Las dependencias inversas usan "seleccionar",
    Lo configuré yo mismo, todas las demás opciones deben configurarse
    Nota:
    select debe usarse con cuidado. select forzará
    un símbolo a un valor sin visitar las dependencias.
    Al abusar de la selección, puede seleccionar un símbolo FOO incluso
    si FOO depende de la BAR que no está configurada.
    En general, seleccione solo para símbolos no visibles
    (sin avisos en ninguna parte) y para símbolos sin dependencias.
    Eso limitará la utilidad pero, por otro lado, evitará
    las configuraciones ilegales por todas partes.

  • limitación de la visualización del menú: “visible si”
    Este atributo solo es aplicable a los bloques de menú, si la condición es
    falsa, el bloque de menú no se muestra al usuario (
    aunque los símbolos contenidos allí pueden seleccionarse con otros símbolos). Es
    similar a un atributo de "solicitud" condicional para
    entradas de menú individuales . El valor predeterminado de "visible" es verdadero.

  • rangos numéricos: “rango” [“si”]
    Esto permite limitar el rango de posibles valores de entrada para
    símbolos int y hexadecimales. El usuario solo puede ingresar un valor que sea mayor
    o igual que el primer símbolo y menor o igual que el segundo
    símbolo.

  • texto de ayuda: “ayuda” o “—ayuda—”
    Esto define un texto de ayuda. El final del texto de ayuda está determinado por
    el nivel de sangría, esto significa que termina en la primera línea que tiene
    una sangría más pequeña que la primera línea del texto de ayuda.
    “—Ayuda—” y “ayuda” no difieren en el comportamiento, “—ayuda—” se
    usa para ayudar a separar visualmente la lógica de configuración de la ayuda dentro
    del archivo como una ayuda para los desarrolladores.
    ayuda: define un texto de ayuda, el final del texto de ayuda está determinado por el nivel de sangría

  • opciones misceláneas: “opción” [=]
    Se pueden definir varias opciones menos comunes a través de esta sintaxis de opción,
    que puede modificar el comportamiento de la entrada del menú y su
    símbolo de configuración . Actualmente, estas opciones son posibles:

    • “Defconfig_list”
      Esto declara una lista de entradas predeterminadas que se pueden usar cuando se
      busca la configuración predeterminada (que se usa cuando el
      .config principal aún no existe).

    • “Módulos”
      Esto declara el símbolo que se utilizará como símbolo de MÓDULOS, lo que
      habilita el tercer estado modular para todos los símbolos de configuración.
      Como máximo, un símbolo puede tener configurada la opción "módulos".

    • “Env” =
      Esto importa la variable de entorno a Kconfig. Se comporta como
      un valor predeterminado, excepto que el valor proviene del entorno, esto
      también significa que el comportamiento al mezclarlo con los valores predeterminados normales
      no está definido en este punto. Actualmente, el símbolo no se exporta de nuevo
      al entorno de construcción (si se desea, se puede hacer a través de
      otro símbolo).

    • “Allnoconfig_y”
      Esto declara el símbolo como uno que debe tener el valor y cuando se
      usa “allnoconfig”. Se utiliza para símbolos que ocultan otros símbolos.

Dependencias del menú

La dependencia determina la visibilidad del elemento compilado y también limita el rango de entrada del atributo tristate. Tristate tiene un estado más que booleano. La expresión de dependencia tiene los siguientes símbolos
Las dependencias definen la visibilidad de una entrada de menú y también pueden reducir
el rango de entrada de símbolos de tres estados. La lógica de tres estados utilizada en las
expresiones usa un estado más que la lógica booleana normal para expresar el
estado del módulo. Las expresiones de dependencia tienen la siguiente sintaxis:

<expr> ::= <symbol>                             (1)
           <symbol> '=' <symbol>                (2)
           <symbol> '!=' <symbol>               (3)
           '(' <expr> ')'                       (4)
           '!' <expr>                           (5)
           <expr> '&&' <expr>                   (6)
           <expr> '||' <expr>                   (7)

Las expresiones se enumeran en orden decreciente de precedencia.
Las expresiones se enumeran en orden de precedencia

(1) Convierta el símbolo en una expresión. Los símbolos booleanos y triestados
se convierten simplemente en los valores de expresión respectivos. Todos los
demás tipos de símbolos dan como resultado 'n'.
(2) Si los valores de ambos símbolos son iguales, devuelve 'y', de lo
contrario 'n'.
(3) Si los valores de ambos símbolos son iguales, devuelve 'n', de lo
contrario 'y'.
(4) Devuelve el valor de la expresión. Se usa para anular la precedencia.
(5) Devuelve el resultado de (2- / expr /).
(6) Devuelve el resultado de min (/ expr /, / expr /).
(7) Devuelve el resultado de max (/ expr /, / expr /).

Una expresión puede tener un valor de 'n', 'm' o 'y' (o 0, 1, 2
respectivamente para los cálculos). Una entrada de menú se vuelve visible cuando su
expresión se evalúa como 'm' o 'y'.

Una expresión puede tener 'n', 'm' o 'y' (0, 1, 2 para el cálculo), y un elemento de configuración es visible si está configurado como 'm' o 'y'

Hay dos tipos de símbolos: símbolos constantes y no constantes.
Los símbolos no constantes son los más comunes y se definen con la
declaración 'config'. Los símbolos no constantes constan completamente de
caracteres alfanuméricos o guiones bajos.
Los símbolos constantes son solo una parte de las expresiones. Los símbolos constantes
siempre están rodeados por comillas simples o dobles. Dentro de la cita,
se permite cualquier otro carácter y las comillas se pueden escapar usando ''.

Estructura del menú

Hay dos formas de definir los elementos del menú, la primera es explícita
La posición de una entrada de menú en el árbol se determina de dos formas. Primero
se puede especificar explícitamente:

menu "Network device support"
	depends on NET

config NETDEVICES
	...

endmenu

Todas las entradas dentro del bloque "menú" ... "menú final" se convierten en un submenú de
"Soporte de dispositivos de red". Todas las subentradas heredan las dependencias de
la entrada del menú, por ejemplo, esto significa que la dependencia “NET” se agrega a la
lista de dependencias de la opción de configuración NETDEVICES.

Los elementos de configuración del menú "Soporte de dispositivos de red" están empaquetados en la estructura de "menú" ... "menú final", y todas las dependencias de los elementos de configuración de nivel inferior heredan el menú de nivel superior. En otras palabras, el elemento de configuración NETDEVICES también depende de "NET"

La otra forma de generar la estructura del menú se realiza analizando las
dependencias. Si una entrada de menú depende de alguna manera de la entrada anterior, se
puede convertir en un submenú de la misma. Primero, el símbolo anterior (padre) debe
ser parte de la lista de dependencias y luego una de estas dos condiciones
debe ser verdadera:

  • la entrada secundaria debe volverse invisible, si el padre está configurado en 'n'
  • la entrada secundaria solo debe ser visible, si el padre es visible
    La segunda forma de generar un menú es analizar las dependencias. Si el elemento de configuración depende del elemento de configuración definido previamente, entonces este elemento de configuración es un submenú del elemento de configuración anterior.
    En primer lugar, si el proyecto principal (anterior) es una dependencia de este proyecto y se deben cumplir las dos condiciones siguientes

1. Si el menú principal se establece en "n", el submenú debe estar visible,
1. Si el menú principal está visible, el submenú debe estar visible,

config MODULES
	bool "Enable loadable module support"

config MODVERSIONS
	bool "Set version information on all module symbols"
	depends on MODULES

comment "module support disabled"
	depends on !MODULES

MODVERSIONS depende directamente de MODULES, esto significa que solo es visible si
MODULES es diferente de 'n'. Por otro lado, el comentario siempre está
visible cuando MODULES está visible (la dependencia (vacía) de MODULES
también es parte de las dependencias de comentarios).

MODVERSIONS depende directamente de MODULES, lo que significa que mientras MODULES no sea "n", MODVERSIONS es visible

Sintaxis de Kconfig

El archivo de configuración tiene muchos menús, las palabras clave son las siguientes:
El archivo de configuración describe una serie de entradas de menú, donde cada
línea comienza con una palabra clave (excepto los textos de ayuda). Las siguientes palabras clave
terminan una entrada de menú:

- config
- menuconfig
- choice/endchoice
- comment
- menu/endmenu
- if/endif
- source

Los primeros cinco también inician la definición de una entrada de menú.
Los primeros cinco se utilizan para definir una entrada de menú.
config:

	"config" <symbol>
	<config options>

Esto define un símbolo de configuración y acepta cualquiera de los
atributos anteriores como opciones.

menuconfig:

	"menuconfig" <symbol>
	<config options>

Esto es similar a la entrada de configuración simple anterior, pero también da una
pista a las interfaces, que todas las subopciones deben mostrarse como una
lista separada de opciones.

opciones:

	"choice" [symbol]
	<choice options>
	<choice block>
	"endchoice"

Solo hay dos tipos de elementos de configuración definidos en choice: bool o tristate. Solo se puede seleccionar uno de los tipos bool en este bloque de opciones (similar a la selección única), y el número de tipos de tristate puede ser ilimitado. El elemento de configuración es configurado como "m", (módulo). Esta función se puede utilizar para un dispositivo de hardware correspondiente a varios controladores, de modo que todos los controladores se pueden compilar en forma de módulos, pero solo uno se puede compilar en el kernel
Esto define un grupo de opciones y acepta cualquiera de los atributos anteriores como
opciones. Una opción solo puede ser de tipo bool o tristate, mientras que una
opción booleana solo permite seleccionar una única entrada de configuración, una
opción tristate también permite que cualquier número de entradas de configuración se establezca en 'm'. Esto
se puede usar si existen varios controladores para un solo hardware y solo
se puede compilar / cargar un solo controlador en el kernel, pero todos los controladores
se pueden compilar como módulos.
Una opción acepta otra opción “opcional”, que permite establecer la
opción en 'n' y no es necesario seleccionar ninguna entrada.
Si no hay [símbolo] asociado con una opción, entonces no puede tener múltiples
definiciones de esa opción. Si un [símbolo] está asociado a la elección,
entonces puede definir la misma opción (es decir, con las mismas entradas) en otro
lugar.

comentario:

	"comment" <prompt>
	<comment options>

Esto define un comentario que se muestra al usuario durante el
proceso de configuración y también se refleja en los archivos de salida. Las únicas
opciones posibles son las dependencias.

menú:

	"menu" <prompt>
	<menu options>
	<menu block>
	"endmenu"

Definir un bloque de menú
Esto define un bloque de menú, consulte "Estructura de menú" más arriba para
obtener más información. Las únicas opciones posibles son las dependencias y los
atributos "visibles" .

si:

	"if" <expr>
	<if block>
	"endif"

Esto define un bloque if. La expresión de dependencia se adjunta
a todas las entradas de menú adjuntas.

fuente:

	"source" <prompt>

Similar a incluir
Esto lee el archivo de configuración especificado. Este archivo siempre se analiza.

menú principal:

	"mainmenu" <prompt>

Menu principal
Esto establece la barra de título del programa de configuración si el programa de configuración elige
usarlo. Debe colocarse en la parte superior de la configuración, antes de cualquier
otra declaración.

Sugerencias de Kconfig

Esta es una colección de consejos de Kconfig, la mayoría de los cuales no son obvios a
primera vista y la mayoría se han convertido en modismos en varios
archivos de Kconfig .

Agregar funciones comunes y hacer que el uso sea configurable

It is a common idiom to implement a feature/functionality that are
relevant for some architectures but not all.
The recommended way to do so is to use a config variable named HAVE_*
that is defined in a common Kconfig file and selected by the relevant
architectures.
An example is the generic IOMAP functionality.

We would in lib/Kconfig see:

# Generic IOMAP is used to ...
config HAVE_GENERIC_IOMAP

config GENERIC_IOMAP
	depends on HAVE_GENERIC_IOMAP && FOO

And in lib/Makefile we would see:
obj-$(CONFIG_GENERIC_IOMAP) += iomap.o

For each architecture using the generic IOMAP functionality we would see:

config X86
	select ...
	select HAVE_GENERIC_IOMAP
	select ...

Note: we use the existing config option and avoid creating a new
config variable to select HAVE_GENERIC_IOMAP.

Note: the use of the internal config variable HAVE_GENERIC_IOMAP, it is
introduced to overcome the limitation of select which will force a
config option to 'y' no matter the dependencies.
The dependencies are moved to the symbol GENERIC_IOMAP and we avoid the
situation where select forces a symbol equals to 'y'.

Build as module only
~~~~~~~~~~~~~~~~~~~~
To restrict a component build to module-only, qualify its config symbol
with "depends on m".  E.g.:

config FOO
	depends on BAR && m

limits FOO to module (=m) or disabled (=n).

Supongo que te gusta

Origin blog.csdn.net/amwha/article/details/86597692
Recomendado
Clasificación