xref: /linux/Documentation/kbuild/kconfig-language.rst (revision 3a9dd3ecb207b2cb8a4aabd12d20e43fa360b66d)
1cd238effSMauro Carvalho Chehab================
2cd238effSMauro Carvalho ChehabKconfig Language
3cd238effSMauro Carvalho Chehab================
4cd238effSMauro Carvalho Chehab
5cd238effSMauro Carvalho ChehabIntroduction
6cd238effSMauro Carvalho Chehab------------
7cd238effSMauro Carvalho Chehab
8cd238effSMauro Carvalho ChehabThe configuration database is a collection of configuration options
9cd238effSMauro Carvalho Chehaborganized in a tree structure::
10cd238effSMauro Carvalho Chehab
11cd238effSMauro Carvalho Chehab	+- Code maturity level options
12cd238effSMauro Carvalho Chehab	|  +- Prompt for development and/or incomplete code/drivers
13cd238effSMauro Carvalho Chehab	+- General setup
14cd238effSMauro Carvalho Chehab	|  +- Networking support
15cd238effSMauro Carvalho Chehab	|  +- System V IPC
16cd238effSMauro Carvalho Chehab	|  +- BSD Process Accounting
17cd238effSMauro Carvalho Chehab	|  +- Sysctl support
18cd238effSMauro Carvalho Chehab	+- Loadable module support
19cd238effSMauro Carvalho Chehab	|  +- Enable loadable module support
20cd238effSMauro Carvalho Chehab	|     +- Set version information on all module symbols
21cd238effSMauro Carvalho Chehab	|     +- Kernel module loader
22cd238effSMauro Carvalho Chehab	+- ...
23cd238effSMauro Carvalho Chehab
24cd238effSMauro Carvalho ChehabEvery entry has its own dependencies. These dependencies are used
25cd238effSMauro Carvalho Chehabto determine the visibility of an entry. Any child entry is only
26cd238effSMauro Carvalho Chehabvisible if its parent entry is also visible.
27cd238effSMauro Carvalho Chehab
28cd238effSMauro Carvalho ChehabMenu entries
29cd238effSMauro Carvalho Chehab------------
30cd238effSMauro Carvalho Chehab
31cd238effSMauro Carvalho ChehabMost entries define a config option; all other entries help to organize
32cd238effSMauro Carvalho Chehabthem. A single configuration option is defined like this::
33cd238effSMauro Carvalho Chehab
34cd238effSMauro Carvalho Chehab  config MODVERSIONS
35cd238effSMauro Carvalho Chehab	bool "Set version information on all module symbols"
36cd238effSMauro Carvalho Chehab	depends on MODULES
37cd238effSMauro Carvalho Chehab	help
38cd238effSMauro Carvalho Chehab	  Usually, modules have to be recompiled whenever you switch to a new
39cd238effSMauro Carvalho Chehab	  kernel.  ...
40cd238effSMauro Carvalho Chehab
41cd238effSMauro Carvalho ChehabEvery line starts with a key word and can be followed by multiple
42cd238effSMauro Carvalho Chehabarguments.  "config" starts a new config entry. The following lines
43cd238effSMauro Carvalho Chehabdefine attributes for this config option. Attributes can be the type of
44cd238effSMauro Carvalho Chehabthe config option, input prompt, dependencies, help text and default
45cd238effSMauro Carvalho Chehabvalues. A config option can be defined multiple times with the same
46cd238effSMauro Carvalho Chehabname, but every definition can have only a single input prompt and the
47cd238effSMauro Carvalho Chehabtype must not conflict.
48cd238effSMauro Carvalho Chehab
49cd238effSMauro Carvalho ChehabMenu attributes
50cd238effSMauro Carvalho Chehab---------------
51cd238effSMauro Carvalho Chehab
52cd238effSMauro Carvalho ChehabA menu entry can have a number of attributes. Not all of them are
53cd238effSMauro Carvalho Chehabapplicable everywhere (see syntax).
54cd238effSMauro Carvalho Chehab
55cd238effSMauro Carvalho Chehab- type definition: "bool"/"tristate"/"string"/"hex"/"int"
5616886949SMauro Carvalho Chehab
57cd238effSMauro Carvalho Chehab  Every config option must have a type. There are only two basic types:
58cd238effSMauro Carvalho Chehab  tristate and string; the other types are based on these two. The type
59cd238effSMauro Carvalho Chehab  definition optionally accepts an input prompt, so these two examples
60cd238effSMauro Carvalho Chehab  are equivalent::
61cd238effSMauro Carvalho Chehab
62cd238effSMauro Carvalho Chehab	bool "Networking support"
63cd238effSMauro Carvalho Chehab
64cd238effSMauro Carvalho Chehab  and::
65cd238effSMauro Carvalho Chehab
66cd238effSMauro Carvalho Chehab	bool
67cd238effSMauro Carvalho Chehab	prompt "Networking support"
68cd238effSMauro Carvalho Chehab
69cd238effSMauro Carvalho Chehab- input prompt: "prompt" <prompt> ["if" <expr>]
7016886949SMauro Carvalho Chehab
71cd238effSMauro Carvalho Chehab  Every menu entry can have at most one prompt, which is used to display
72cd238effSMauro Carvalho Chehab  to the user. Optionally dependencies only for this prompt can be added
73cd238effSMauro Carvalho Chehab  with "if".
74cd238effSMauro Carvalho Chehab
75cd238effSMauro Carvalho Chehab- default value: "default" <expr> ["if" <expr>]
7616886949SMauro Carvalho Chehab
77cd238effSMauro Carvalho Chehab  A config option can have any number of default values. If multiple
78cd238effSMauro Carvalho Chehab  default values are visible, only the first defined one is active.
79cd238effSMauro Carvalho Chehab  Default values are not limited to the menu entry where they are
80cd238effSMauro Carvalho Chehab  defined. This means the default can be defined somewhere else or be
81cd238effSMauro Carvalho Chehab  overridden by an earlier definition.
82cd238effSMauro Carvalho Chehab  The default value is only assigned to the config symbol if no other
83cd238effSMauro Carvalho Chehab  value was set by the user (via the input prompt above). If an input
84cd238effSMauro Carvalho Chehab  prompt is visible the default value is presented to the user and can
85cd238effSMauro Carvalho Chehab  be overridden by him.
86cd238effSMauro Carvalho Chehab  Optionally, dependencies only for this default value can be added with
87cd238effSMauro Carvalho Chehab  "if".
88cd238effSMauro Carvalho Chehab
89cd238effSMauro Carvalho Chehab The default value deliberately defaults to 'n' in order to avoid bloating the
90cd238effSMauro Carvalho Chehab build. With few exceptions, new config options should not change this. The
91cd238effSMauro Carvalho Chehab intent is for "make oldconfig" to add as little as possible to the config from
92cd238effSMauro Carvalho Chehab release to release.
93cd238effSMauro Carvalho Chehab
94cd238effSMauro Carvalho Chehab Note:
95cd238effSMauro Carvalho Chehab	Things that merit "default y/m" include:
96cd238effSMauro Carvalho Chehab
97cd238effSMauro Carvalho Chehab	a) A new Kconfig option for something that used to always be built
98cd238effSMauro Carvalho Chehab	   should be "default y".
99cd238effSMauro Carvalho Chehab
100cd238effSMauro Carvalho Chehab	b) A new gatekeeping Kconfig option that hides/shows other Kconfig
101cd238effSMauro Carvalho Chehab	   options (but does not generate any code of its own), should be
102cd238effSMauro Carvalho Chehab	   "default y" so people will see those other options.
103cd238effSMauro Carvalho Chehab
104cd238effSMauro Carvalho Chehab	c) Sub-driver behavior or similar options for a driver that is
105cd238effSMauro Carvalho Chehab	   "default n". This allows you to provide sane defaults.
106cd238effSMauro Carvalho Chehab
107cd238effSMauro Carvalho Chehab	d) Hardware or infrastructure that everybody expects, such as CONFIG_NET
108cd238effSMauro Carvalho Chehab	   or CONFIG_BLOCK. These are rare exceptions.
109cd238effSMauro Carvalho Chehab
110cd238effSMauro Carvalho Chehab- type definition + default value::
111cd238effSMauro Carvalho Chehab
112cd238effSMauro Carvalho Chehab	"def_bool"/"def_tristate" <expr> ["if" <expr>]
113cd238effSMauro Carvalho Chehab
114cd238effSMauro Carvalho Chehab  This is a shorthand notation for a type definition plus a value.
115cd238effSMauro Carvalho Chehab  Optionally dependencies for this default value can be added with "if".
116cd238effSMauro Carvalho Chehab
117cd238effSMauro Carvalho Chehab- dependencies: "depends on" <expr>
11816886949SMauro Carvalho Chehab
119cd238effSMauro Carvalho Chehab  This defines a dependency for this menu entry. If multiple
120cd238effSMauro Carvalho Chehab  dependencies are defined, they are connected with '&&'. Dependencies
121cd238effSMauro Carvalho Chehab  are applied to all other options within this menu entry (which also
122cd238effSMauro Carvalho Chehab  accept an "if" expression), so these two examples are equivalent::
123cd238effSMauro Carvalho Chehab
124cd238effSMauro Carvalho Chehab	bool "foo" if BAR
125cd238effSMauro Carvalho Chehab	default y if BAR
126cd238effSMauro Carvalho Chehab
127cd238effSMauro Carvalho Chehab  and::
128cd238effSMauro Carvalho Chehab
129cd238effSMauro Carvalho Chehab	depends on BAR
130cd238effSMauro Carvalho Chehab	bool "foo"
131cd238effSMauro Carvalho Chehab	default y
132cd238effSMauro Carvalho Chehab
133cd238effSMauro Carvalho Chehab- reverse dependencies: "select" <symbol> ["if" <expr>]
13416886949SMauro Carvalho Chehab
135cd238effSMauro Carvalho Chehab  While normal dependencies reduce the upper limit of a symbol (see
136cd238effSMauro Carvalho Chehab  below), reverse dependencies can be used to force a lower limit of
137cd238effSMauro Carvalho Chehab  another symbol. The value of the current menu symbol is used as the
138cd238effSMauro Carvalho Chehab  minimal value <symbol> can be set to. If <symbol> is selected multiple
139cd238effSMauro Carvalho Chehab  times, the limit is set to the largest selection.
140cd238effSMauro Carvalho Chehab  Reverse dependencies can only be used with boolean or tristate
141cd238effSMauro Carvalho Chehab  symbols.
142cd238effSMauro Carvalho Chehab
143cd238effSMauro Carvalho Chehab  Note:
144cd238effSMauro Carvalho Chehab	select should be used with care. select will force
145cd238effSMauro Carvalho Chehab	a symbol to a value without visiting the dependencies.
146cd238effSMauro Carvalho Chehab	By abusing select you are able to select a symbol FOO even
147cd238effSMauro Carvalho Chehab	if FOO depends on BAR that is not set.
148cd238effSMauro Carvalho Chehab	In general use select only for non-visible symbols
149cd238effSMauro Carvalho Chehab	(no prompts anywhere) and for symbols with no dependencies.
150cd238effSMauro Carvalho Chehab	That will limit the usefulness but on the other hand avoid
151cd238effSMauro Carvalho Chehab	the illegal configurations all over.
152cd238effSMauro Carvalho Chehab
153cd238effSMauro Carvalho Chehab- weak reverse dependencies: "imply" <symbol> ["if" <expr>]
15416886949SMauro Carvalho Chehab
155cd238effSMauro Carvalho Chehab  This is similar to "select" as it enforces a lower limit on another
156cd238effSMauro Carvalho Chehab  symbol except that the "implied" symbol's value may still be set to n
157cd238effSMauro Carvalho Chehab  from a direct dependency or with a visible prompt.
158cd238effSMauro Carvalho Chehab
159cd238effSMauro Carvalho Chehab  Given the following example::
160cd238effSMauro Carvalho Chehab
161cd238effSMauro Carvalho Chehab    config FOO
162*3a9dd3ecSMasahiro Yamada	tristate "foo"
163cd238effSMauro Carvalho Chehab	imply BAZ
164cd238effSMauro Carvalho Chehab
165cd238effSMauro Carvalho Chehab    config BAZ
166*3a9dd3ecSMasahiro Yamada	tristate "baz"
167cd238effSMauro Carvalho Chehab	depends on BAR
168cd238effSMauro Carvalho Chehab
169cd238effSMauro Carvalho Chehab  The following values are possible:
170cd238effSMauro Carvalho Chehab
171cd238effSMauro Carvalho Chehab	===		===		=============	==============
172cd238effSMauro Carvalho Chehab	FOO		BAR		BAZ's default	choice for BAZ
173cd238effSMauro Carvalho Chehab	===		===		=============	==============
174cd238effSMauro Carvalho Chehab	n		y		n		N/m/y
175cd238effSMauro Carvalho Chehab	m		y		m		M/y/n
176def2fbffSMasahiro Yamada	y		y		y		Y/m/n
177*3a9dd3ecSMasahiro Yamada	n		m		n		N/m
178*3a9dd3ecSMasahiro Yamada	m		m		m		M/n
179*3a9dd3ecSMasahiro Yamada	y		m		n		M/n
180cd238effSMauro Carvalho Chehab	y		n		*		N
181cd238effSMauro Carvalho Chehab	===		===		=============	==============
182cd238effSMauro Carvalho Chehab
183cd238effSMauro Carvalho Chehab  This is useful e.g. with multiple drivers that want to indicate their
184cd238effSMauro Carvalho Chehab  ability to hook into a secondary subsystem while allowing the user to
185cd238effSMauro Carvalho Chehab  configure that subsystem out without also having to unset these drivers.
186cd238effSMauro Carvalho Chehab
187def2fbffSMasahiro Yamada  Note: If the combination of FOO=y and BAR=m causes a link error,
188def2fbffSMasahiro Yamada  you can guard the function call with IS_REACHABLE()::
189def2fbffSMasahiro Yamada
190def2fbffSMasahiro Yamada	foo_init()
191def2fbffSMasahiro Yamada	{
192def2fbffSMasahiro Yamada		if (IS_REACHABLE(CONFIG_BAZ))
193def2fbffSMasahiro Yamada			baz_register(&foo);
194def2fbffSMasahiro Yamada		...
195def2fbffSMasahiro Yamada	}
196def2fbffSMasahiro Yamada
197*3a9dd3ecSMasahiro Yamada  Note: If the feature provided by BAZ is highly desirable for FOO,
198*3a9dd3ecSMasahiro Yamada  FOO should imply not only BAZ, but also its dependency BAR::
199*3a9dd3ecSMasahiro Yamada
200*3a9dd3ecSMasahiro Yamada    config FOO
201*3a9dd3ecSMasahiro Yamada	tristate "foo"
202*3a9dd3ecSMasahiro Yamada	imply BAR
203*3a9dd3ecSMasahiro Yamada	imply BAZ
204*3a9dd3ecSMasahiro Yamada
205cd238effSMauro Carvalho Chehab- limiting menu display: "visible if" <expr>
20616886949SMauro Carvalho Chehab
207cd238effSMauro Carvalho Chehab  This attribute is only applicable to menu blocks, if the condition is
208cd238effSMauro Carvalho Chehab  false, the menu block is not displayed to the user (the symbols
209cd238effSMauro Carvalho Chehab  contained there can still be selected by other symbols, though). It is
210cd238effSMauro Carvalho Chehab  similar to a conditional "prompt" attribute for individual menu
211cd238effSMauro Carvalho Chehab  entries. Default value of "visible" is true.
212cd238effSMauro Carvalho Chehab
213cd238effSMauro Carvalho Chehab- numerical ranges: "range" <symbol> <symbol> ["if" <expr>]
21416886949SMauro Carvalho Chehab
215cd238effSMauro Carvalho Chehab  This allows to limit the range of possible input values for int
216cd238effSMauro Carvalho Chehab  and hex symbols. The user can only input a value which is larger than
217cd238effSMauro Carvalho Chehab  or equal to the first symbol and smaller than or equal to the second
218cd238effSMauro Carvalho Chehab  symbol.
219cd238effSMauro Carvalho Chehab
2208f268881SMasahiro Yamada- help text: "help"
22116886949SMauro Carvalho Chehab
222cd238effSMauro Carvalho Chehab  This defines a help text. The end of the help text is determined by
223cd238effSMauro Carvalho Chehab  the indentation level, this means it ends at the first line which has
224cd238effSMauro Carvalho Chehab  a smaller indentation than the first line of the help text.
225cd238effSMauro Carvalho Chehab
226cd238effSMauro Carvalho Chehab- misc options: "option" <symbol>[=<value>]
22716886949SMauro Carvalho Chehab
228cd238effSMauro Carvalho Chehab  Various less common options can be defined via this option syntax,
229cd238effSMauro Carvalho Chehab  which can modify the behaviour of the menu entry and its config
230cd238effSMauro Carvalho Chehab  symbol. These options are currently possible:
231cd238effSMauro Carvalho Chehab
232cd238effSMauro Carvalho Chehab  - "defconfig_list"
233cd238effSMauro Carvalho Chehab    This declares a list of default entries which can be used when
234cd238effSMauro Carvalho Chehab    looking for the default configuration (which is used when the main
235cd238effSMauro Carvalho Chehab    .config doesn't exists yet.)
236cd238effSMauro Carvalho Chehab
237cd238effSMauro Carvalho Chehab  - "modules"
238cd238effSMauro Carvalho Chehab    This declares the symbol to be used as the MODULES symbol, which
239cd238effSMauro Carvalho Chehab    enables the third modular state for all config symbols.
240cd238effSMauro Carvalho Chehab    At most one symbol may have the "modules" option set.
241cd238effSMauro Carvalho Chehab
242cd238effSMauro Carvalho Chehab  - "allnoconfig_y"
243cd238effSMauro Carvalho Chehab    This declares the symbol as one that should have the value y when
244cd238effSMauro Carvalho Chehab    using "allnoconfig". Used for symbols that hide other symbols.
245cd238effSMauro Carvalho Chehab
246cd238effSMauro Carvalho ChehabMenu dependencies
247cd238effSMauro Carvalho Chehab-----------------
248cd238effSMauro Carvalho Chehab
249cd238effSMauro Carvalho ChehabDependencies define the visibility of a menu entry and can also reduce
250cd238effSMauro Carvalho Chehabthe input range of tristate symbols. The tristate logic used in the
251cd238effSMauro Carvalho Chehabexpressions uses one more state than normal boolean logic to express the
252cd238effSMauro Carvalho Chehabmodule state. Dependency expressions have the following syntax::
253cd238effSMauro Carvalho Chehab
254cd238effSMauro Carvalho Chehab  <expr> ::= <symbol>                           (1)
255cd238effSMauro Carvalho Chehab           <symbol> '=' <symbol>                (2)
256cd238effSMauro Carvalho Chehab           <symbol> '!=' <symbol>               (3)
257cd238effSMauro Carvalho Chehab           <symbol1> '<' <symbol2>              (4)
258cd238effSMauro Carvalho Chehab           <symbol1> '>' <symbol2>              (4)
259cd238effSMauro Carvalho Chehab           <symbol1> '<=' <symbol2>             (4)
260cd238effSMauro Carvalho Chehab           <symbol1> '>=' <symbol2>             (4)
261cd238effSMauro Carvalho Chehab           '(' <expr> ')'                       (5)
262cd238effSMauro Carvalho Chehab           '!' <expr>                           (6)
263cd238effSMauro Carvalho Chehab           <expr> '&&' <expr>                   (7)
264cd238effSMauro Carvalho Chehab           <expr> '||' <expr>                   (8)
265cd238effSMauro Carvalho Chehab
266cd238effSMauro Carvalho ChehabExpressions are listed in decreasing order of precedence.
267cd238effSMauro Carvalho Chehab
268cd238effSMauro Carvalho Chehab(1) Convert the symbol into an expression. Boolean and tristate symbols
269cd238effSMauro Carvalho Chehab    are simply converted into the respective expression values. All
270cd238effSMauro Carvalho Chehab    other symbol types result in 'n'.
271cd238effSMauro Carvalho Chehab(2) If the values of both symbols are equal, it returns 'y',
272cd238effSMauro Carvalho Chehab    otherwise 'n'.
273cd238effSMauro Carvalho Chehab(3) If the values of both symbols are equal, it returns 'n',
274cd238effSMauro Carvalho Chehab    otherwise 'y'.
275cd238effSMauro Carvalho Chehab(4) If value of <symbol1> is respectively lower, greater, lower-or-equal,
276cd238effSMauro Carvalho Chehab    or greater-or-equal than value of <symbol2>, it returns 'y',
277cd238effSMauro Carvalho Chehab    otherwise 'n'.
278cd238effSMauro Carvalho Chehab(5) Returns the value of the expression. Used to override precedence.
279cd238effSMauro Carvalho Chehab(6) Returns the result of (2-/expr/).
280cd238effSMauro Carvalho Chehab(7) Returns the result of min(/expr/, /expr/).
281cd238effSMauro Carvalho Chehab(8) Returns the result of max(/expr/, /expr/).
282cd238effSMauro Carvalho Chehab
283cd238effSMauro Carvalho ChehabAn expression can have a value of 'n', 'm' or 'y' (or 0, 1, 2
284cd238effSMauro Carvalho Chehabrespectively for calculations). A menu entry becomes visible when its
285cd238effSMauro Carvalho Chehabexpression evaluates to 'm' or 'y'.
286cd238effSMauro Carvalho Chehab
287cd238effSMauro Carvalho ChehabThere are two types of symbols: constant and non-constant symbols.
288cd238effSMauro Carvalho ChehabNon-constant symbols are the most common ones and are defined with the
289cd238effSMauro Carvalho Chehab'config' statement. Non-constant symbols consist entirely of alphanumeric
290cd238effSMauro Carvalho Chehabcharacters or underscores.
291cd238effSMauro Carvalho ChehabConstant symbols are only part of expressions. Constant symbols are
292cd238effSMauro Carvalho Chehabalways surrounded by single or double quotes. Within the quote, any
293cd238effSMauro Carvalho Chehabother character is allowed and the quotes can be escaped using '\'.
294cd238effSMauro Carvalho Chehab
295cd238effSMauro Carvalho ChehabMenu structure
296cd238effSMauro Carvalho Chehab--------------
297cd238effSMauro Carvalho Chehab
298cd238effSMauro Carvalho ChehabThe position of a menu entry in the tree is determined in two ways. First
299cd238effSMauro Carvalho Chehabit can be specified explicitly::
300cd238effSMauro Carvalho Chehab
301cd238effSMauro Carvalho Chehab  menu "Network device support"
302cd238effSMauro Carvalho Chehab	depends on NET
303cd238effSMauro Carvalho Chehab
304cd238effSMauro Carvalho Chehab  config NETDEVICES
305cd238effSMauro Carvalho Chehab	...
306cd238effSMauro Carvalho Chehab
307cd238effSMauro Carvalho Chehab  endmenu
308cd238effSMauro Carvalho Chehab
309cd238effSMauro Carvalho ChehabAll entries within the "menu" ... "endmenu" block become a submenu of
310cd238effSMauro Carvalho Chehab"Network device support". All subentries inherit the dependencies from
311cd238effSMauro Carvalho Chehabthe menu entry, e.g. this means the dependency "NET" is added to the
312cd238effSMauro Carvalho Chehabdependency list of the config option NETDEVICES.
313cd238effSMauro Carvalho Chehab
314cd238effSMauro Carvalho ChehabThe other way to generate the menu structure is done by analyzing the
315cd238effSMauro Carvalho Chehabdependencies. If a menu entry somehow depends on the previous entry, it
316cd238effSMauro Carvalho Chehabcan be made a submenu of it. First, the previous (parent) symbol must
317cd238effSMauro Carvalho Chehabbe part of the dependency list and then one of these two conditions
318cd238effSMauro Carvalho Chehabmust be true:
319cd238effSMauro Carvalho Chehab
320cd238effSMauro Carvalho Chehab- the child entry must become invisible, if the parent is set to 'n'
321cd238effSMauro Carvalho Chehab- the child entry must only be visible, if the parent is visible::
322cd238effSMauro Carvalho Chehab
323cd238effSMauro Carvalho Chehab    config MODULES
324cd238effSMauro Carvalho Chehab	bool "Enable loadable module support"
325cd238effSMauro Carvalho Chehab
326cd238effSMauro Carvalho Chehab    config MODVERSIONS
327cd238effSMauro Carvalho Chehab	bool "Set version information on all module symbols"
328cd238effSMauro Carvalho Chehab	depends on MODULES
329cd238effSMauro Carvalho Chehab
330cd238effSMauro Carvalho Chehab    comment "module support disabled"
331cd238effSMauro Carvalho Chehab	depends on !MODULES
332cd238effSMauro Carvalho Chehab
333cd238effSMauro Carvalho ChehabMODVERSIONS directly depends on MODULES, this means it's only visible if
334cd238effSMauro Carvalho ChehabMODULES is different from 'n'. The comment on the other hand is only
335cd238effSMauro Carvalho Chehabvisible when MODULES is set to 'n'.
336cd238effSMauro Carvalho Chehab
337cd238effSMauro Carvalho Chehab
338cd238effSMauro Carvalho ChehabKconfig syntax
339cd238effSMauro Carvalho Chehab--------------
340cd238effSMauro Carvalho Chehab
341cd238effSMauro Carvalho ChehabThe configuration file describes a series of menu entries, where every
342cd238effSMauro Carvalho Chehabline starts with a keyword (except help texts). The following keywords
343cd238effSMauro Carvalho Chehabend a menu entry:
344cd238effSMauro Carvalho Chehab
345cd238effSMauro Carvalho Chehab- config
346cd238effSMauro Carvalho Chehab- menuconfig
347cd238effSMauro Carvalho Chehab- choice/endchoice
348cd238effSMauro Carvalho Chehab- comment
349cd238effSMauro Carvalho Chehab- menu/endmenu
350cd238effSMauro Carvalho Chehab- if/endif
351cd238effSMauro Carvalho Chehab- source
352cd238effSMauro Carvalho Chehab
353cd238effSMauro Carvalho ChehabThe first five also start the definition of a menu entry.
354cd238effSMauro Carvalho Chehab
355cd238effSMauro Carvalho Chehabconfig::
35616886949SMauro Carvalho Chehab
357cd238effSMauro Carvalho Chehab	"config" <symbol>
358cd238effSMauro Carvalho Chehab	<config options>
359cd238effSMauro Carvalho Chehab
360cd238effSMauro Carvalho ChehabThis defines a config symbol <symbol> and accepts any of above
361cd238effSMauro Carvalho Chehabattributes as options.
362cd238effSMauro Carvalho Chehab
363cd238effSMauro Carvalho Chehabmenuconfig::
36416886949SMauro Carvalho Chehab
365cd238effSMauro Carvalho Chehab	"menuconfig" <symbol>
366cd238effSMauro Carvalho Chehab	<config options>
367cd238effSMauro Carvalho Chehab
368cd238effSMauro Carvalho ChehabThis is similar to the simple config entry above, but it also gives a
369cd238effSMauro Carvalho Chehabhint to front ends, that all suboptions should be displayed as a
370cd238effSMauro Carvalho Chehabseparate list of options. To make sure all the suboptions will really
371cd238effSMauro Carvalho Chehabshow up under the menuconfig entry and not outside of it, every item
372cd238effSMauro Carvalho Chehabfrom the <config options> list must depend on the menuconfig symbol.
373cd238effSMauro Carvalho ChehabIn practice, this is achieved by using one of the next two constructs::
374cd238effSMauro Carvalho Chehab
375cd238effSMauro Carvalho Chehab  (1):
376cd238effSMauro Carvalho Chehab  menuconfig M
377cd238effSMauro Carvalho Chehab  if M
378cd238effSMauro Carvalho Chehab      config C1
379cd238effSMauro Carvalho Chehab      config C2
380cd238effSMauro Carvalho Chehab  endif
381cd238effSMauro Carvalho Chehab
382cd238effSMauro Carvalho Chehab  (2):
383cd238effSMauro Carvalho Chehab  menuconfig M
384cd238effSMauro Carvalho Chehab  config C1
385cd238effSMauro Carvalho Chehab      depends on M
386cd238effSMauro Carvalho Chehab  config C2
387cd238effSMauro Carvalho Chehab      depends on M
388cd238effSMauro Carvalho Chehab
389cd238effSMauro Carvalho ChehabIn the following examples (3) and (4), C1 and C2 still have the M
390cd238effSMauro Carvalho Chehabdependency, but will not appear under menuconfig M anymore, because
391cd238effSMauro Carvalho Chehabof C0, which doesn't depend on M::
392cd238effSMauro Carvalho Chehab
393cd238effSMauro Carvalho Chehab  (3):
394cd238effSMauro Carvalho Chehab  menuconfig M
395cd238effSMauro Carvalho Chehab      config C0
396cd238effSMauro Carvalho Chehab  if M
397cd238effSMauro Carvalho Chehab      config C1
398cd238effSMauro Carvalho Chehab      config C2
399cd238effSMauro Carvalho Chehab  endif
400cd238effSMauro Carvalho Chehab
401cd238effSMauro Carvalho Chehab  (4):
402cd238effSMauro Carvalho Chehab  menuconfig M
403cd238effSMauro Carvalho Chehab  config C0
404cd238effSMauro Carvalho Chehab  config C1
405cd238effSMauro Carvalho Chehab      depends on M
406cd238effSMauro Carvalho Chehab  config C2
407cd238effSMauro Carvalho Chehab      depends on M
408cd238effSMauro Carvalho Chehab
409cd238effSMauro Carvalho Chehabchoices::
410cd238effSMauro Carvalho Chehab
411cd238effSMauro Carvalho Chehab	"choice" [symbol]
412cd238effSMauro Carvalho Chehab	<choice options>
413cd238effSMauro Carvalho Chehab	<choice block>
414cd238effSMauro Carvalho Chehab	"endchoice"
415cd238effSMauro Carvalho Chehab
416cd238effSMauro Carvalho ChehabThis defines a choice group and accepts any of the above attributes as
417cd238effSMauro Carvalho Chehaboptions. A choice can only be of type bool or tristate.  If no type is
418cd238effSMauro Carvalho Chehabspecified for a choice, its type will be determined by the type of
419cd238effSMauro Carvalho Chehabthe first choice element in the group or remain unknown if none of the
420cd238effSMauro Carvalho Chehabchoice elements have a type specified, as well.
421cd238effSMauro Carvalho Chehab
422cd238effSMauro Carvalho ChehabWhile a boolean choice only allows a single config entry to be
423cd238effSMauro Carvalho Chehabselected, a tristate choice also allows any number of config entries
424cd238effSMauro Carvalho Chehabto be set to 'm'. This can be used if multiple drivers for a single
425cd238effSMauro Carvalho Chehabhardware exists and only a single driver can be compiled/loaded into
426cd238effSMauro Carvalho Chehabthe kernel, but all drivers can be compiled as modules.
427cd238effSMauro Carvalho Chehab
428cd238effSMauro Carvalho ChehabA choice accepts another option "optional", which allows to set the
429cd238effSMauro Carvalho Chehabchoice to 'n' and no entry needs to be selected.
430cd238effSMauro Carvalho ChehabIf no [symbol] is associated with a choice, then you can not have multiple
431cd238effSMauro Carvalho Chehabdefinitions of that choice. If a [symbol] is associated to the choice,
432cd238effSMauro Carvalho Chehabthen you may define the same choice (i.e. with the same entries) in another
433cd238effSMauro Carvalho Chehabplace.
434cd238effSMauro Carvalho Chehab
435cd238effSMauro Carvalho Chehabcomment::
436cd238effSMauro Carvalho Chehab
437cd238effSMauro Carvalho Chehab	"comment" <prompt>
438cd238effSMauro Carvalho Chehab	<comment options>
439cd238effSMauro Carvalho Chehab
440cd238effSMauro Carvalho ChehabThis defines a comment which is displayed to the user during the
441cd238effSMauro Carvalho Chehabconfiguration process and is also echoed to the output files. The only
442cd238effSMauro Carvalho Chehabpossible options are dependencies.
443cd238effSMauro Carvalho Chehab
444cd238effSMauro Carvalho Chehabmenu::
445cd238effSMauro Carvalho Chehab
446cd238effSMauro Carvalho Chehab	"menu" <prompt>
447cd238effSMauro Carvalho Chehab	<menu options>
448cd238effSMauro Carvalho Chehab	<menu block>
449cd238effSMauro Carvalho Chehab	"endmenu"
450cd238effSMauro Carvalho Chehab
451cd238effSMauro Carvalho ChehabThis defines a menu block, see "Menu structure" above for more
452cd238effSMauro Carvalho Chehabinformation. The only possible options are dependencies and "visible"
453cd238effSMauro Carvalho Chehabattributes.
454cd238effSMauro Carvalho Chehab
455cd238effSMauro Carvalho Chehabif::
456cd238effSMauro Carvalho Chehab
457cd238effSMauro Carvalho Chehab	"if" <expr>
458cd238effSMauro Carvalho Chehab	<if block>
459cd238effSMauro Carvalho Chehab	"endif"
460cd238effSMauro Carvalho Chehab
461cd238effSMauro Carvalho ChehabThis defines an if block. The dependency expression <expr> is appended
462cd238effSMauro Carvalho Chehabto all enclosed menu entries.
463cd238effSMauro Carvalho Chehab
464cd238effSMauro Carvalho Chehabsource::
465cd238effSMauro Carvalho Chehab
466cd238effSMauro Carvalho Chehab	"source" <prompt>
467cd238effSMauro Carvalho Chehab
468cd238effSMauro Carvalho ChehabThis reads the specified configuration file. This file is always parsed.
469cd238effSMauro Carvalho Chehab
470cd238effSMauro Carvalho Chehabmainmenu::
471cd238effSMauro Carvalho Chehab
472cd238effSMauro Carvalho Chehab	"mainmenu" <prompt>
473cd238effSMauro Carvalho Chehab
474cd238effSMauro Carvalho ChehabThis sets the config program's title bar if the config program chooses
475cd238effSMauro Carvalho Chehabto use it. It should be placed at the top of the configuration, before any
476cd238effSMauro Carvalho Chehabother statement.
477cd238effSMauro Carvalho Chehab
478cd238effSMauro Carvalho Chehab'#' Kconfig source file comment:
479cd238effSMauro Carvalho Chehab
480cd238effSMauro Carvalho ChehabAn unquoted '#' character anywhere in a source file line indicates
481cd238effSMauro Carvalho Chehabthe beginning of a source file comment.  The remainder of that line
482cd238effSMauro Carvalho Chehabis a comment.
483cd238effSMauro Carvalho Chehab
484cd238effSMauro Carvalho Chehab
485cd238effSMauro Carvalho ChehabKconfig hints
486cd238effSMauro Carvalho Chehab-------------
487cd238effSMauro Carvalho ChehabThis is a collection of Kconfig tips, most of which aren't obvious at
488cd238effSMauro Carvalho Chehabfirst glance and most of which have become idioms in several Kconfig
489cd238effSMauro Carvalho Chehabfiles.
490cd238effSMauro Carvalho Chehab
491cd238effSMauro Carvalho ChehabAdding common features and make the usage configurable
492cd238effSMauro Carvalho Chehab~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
493cd238effSMauro Carvalho ChehabIt is a common idiom to implement a feature/functionality that are
494cd238effSMauro Carvalho Chehabrelevant for some architectures but not all.
495cd238effSMauro Carvalho ChehabThe recommended way to do so is to use a config variable named HAVE_*
496cd238effSMauro Carvalho Chehabthat is defined in a common Kconfig file and selected by the relevant
497cd238effSMauro Carvalho Chehabarchitectures.
498cd238effSMauro Carvalho ChehabAn example is the generic IOMAP functionality.
499cd238effSMauro Carvalho Chehab
500cd238effSMauro Carvalho ChehabWe would in lib/Kconfig see::
501cd238effSMauro Carvalho Chehab
502cd238effSMauro Carvalho Chehab  # Generic IOMAP is used to ...
503cd238effSMauro Carvalho Chehab  config HAVE_GENERIC_IOMAP
504cd238effSMauro Carvalho Chehab
505cd238effSMauro Carvalho Chehab  config GENERIC_IOMAP
506cd238effSMauro Carvalho Chehab	depends on HAVE_GENERIC_IOMAP && FOO
507cd238effSMauro Carvalho Chehab
508cd238effSMauro Carvalho ChehabAnd in lib/Makefile we would see::
509cd238effSMauro Carvalho Chehab
510cd238effSMauro Carvalho Chehab	obj-$(CONFIG_GENERIC_IOMAP) += iomap.o
511cd238effSMauro Carvalho Chehab
512cd238effSMauro Carvalho ChehabFor each architecture using the generic IOMAP functionality we would see::
513cd238effSMauro Carvalho Chehab
514cd238effSMauro Carvalho Chehab  config X86
515cd238effSMauro Carvalho Chehab	select ...
516cd238effSMauro Carvalho Chehab	select HAVE_GENERIC_IOMAP
517cd238effSMauro Carvalho Chehab	select ...
518cd238effSMauro Carvalho Chehab
519cd238effSMauro Carvalho ChehabNote: we use the existing config option and avoid creating a new
520cd238effSMauro Carvalho Chehabconfig variable to select HAVE_GENERIC_IOMAP.
521cd238effSMauro Carvalho Chehab
522cd238effSMauro Carvalho ChehabNote: the use of the internal config variable HAVE_GENERIC_IOMAP, it is
523cd238effSMauro Carvalho Chehabintroduced to overcome the limitation of select which will force a
524cd238effSMauro Carvalho Chehabconfig option to 'y' no matter the dependencies.
525cd238effSMauro Carvalho ChehabThe dependencies are moved to the symbol GENERIC_IOMAP and we avoid the
526cd238effSMauro Carvalho Chehabsituation where select forces a symbol equals to 'y'.
527cd238effSMauro Carvalho Chehab
528cd238effSMauro Carvalho ChehabAdding features that need compiler support
529cd238effSMauro Carvalho Chehab~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
530cd238effSMauro Carvalho Chehab
531cd238effSMauro Carvalho ChehabThere are several features that need compiler support. The recommended way
532cd238effSMauro Carvalho Chehabto describe the dependency on the compiler feature is to use "depends on"
533cd238effSMauro Carvalho Chehabfollowed by a test macro::
534cd238effSMauro Carvalho Chehab
535cd238effSMauro Carvalho Chehab  config STACKPROTECTOR
536cd238effSMauro Carvalho Chehab	bool "Stack Protector buffer overflow detection"
537cd238effSMauro Carvalho Chehab	depends on $(cc-option,-fstack-protector)
538cd238effSMauro Carvalho Chehab	...
539cd238effSMauro Carvalho Chehab
540cd238effSMauro Carvalho ChehabIf you need to expose a compiler capability to makefiles and/or C source files,
541cd238effSMauro Carvalho Chehab`CC_HAS_` is the recommended prefix for the config option::
542cd238effSMauro Carvalho Chehab
543cd238effSMauro Carvalho Chehab  config CC_HAS_STACKPROTECTOR_NONE
544cd238effSMauro Carvalho Chehab	def_bool $(cc-option,-fno-stack-protector)
545cd238effSMauro Carvalho Chehab
546cd238effSMauro Carvalho ChehabBuild as module only
547cd238effSMauro Carvalho Chehab~~~~~~~~~~~~~~~~~~~~
548cd238effSMauro Carvalho ChehabTo restrict a component build to module-only, qualify its config symbol
549cd238effSMauro Carvalho Chehabwith "depends on m".  E.g.::
550cd238effSMauro Carvalho Chehab
551cd238effSMauro Carvalho Chehab  config FOO
552cd238effSMauro Carvalho Chehab	depends on BAR && m
553cd238effSMauro Carvalho Chehab
554cd238effSMauro Carvalho Chehablimits FOO to module (=m) or disabled (=n).
555cd238effSMauro Carvalho Chehab
556cd238effSMauro Carvalho ChehabKconfig recursive dependency limitations
557cd238effSMauro Carvalho Chehab~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
558cd238effSMauro Carvalho Chehab
559cd238effSMauro Carvalho ChehabIf you've hit the Kconfig error: "recursive dependency detected" you've run
560cd238effSMauro Carvalho Chehabinto a recursive dependency issue with Kconfig, a recursive dependency can be
561cd238effSMauro Carvalho Chehabsummarized as a circular dependency. The kconfig tools need to ensure that
562cd238effSMauro Carvalho ChehabKconfig files comply with specified configuration requirements. In order to do
563cd238effSMauro Carvalho Chehabthat kconfig must determine the values that are possible for all Kconfig
564cd238effSMauro Carvalho Chehabsymbols, this is currently not possible if there is a circular relation
565cd238effSMauro Carvalho Chehabbetween two or more Kconfig symbols. For more details refer to the "Simple
566cd238effSMauro Carvalho ChehabKconfig recursive issue" subsection below. Kconfig does not do recursive
567cd238effSMauro Carvalho Chehabdependency resolution; this has a few implications for Kconfig file writers.
568cd238effSMauro Carvalho ChehabWe'll first explain why this issues exists and then provide an example
569cd238effSMauro Carvalho Chehabtechnical limitation which this brings upon Kconfig developers. Eager
570cd238effSMauro Carvalho Chehabdevelopers wishing to try to address this limitation should read the next
571cd238effSMauro Carvalho Chehabsubsections.
572cd238effSMauro Carvalho Chehab
573cd238effSMauro Carvalho ChehabSimple Kconfig recursive issue
574cd238effSMauro Carvalho Chehab~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
575cd238effSMauro Carvalho Chehab
576cd238effSMauro Carvalho ChehabRead: Documentation/kbuild/Kconfig.recursion-issue-01
577cd238effSMauro Carvalho Chehab
578cd238effSMauro Carvalho ChehabTest with::
579cd238effSMauro Carvalho Chehab
580cd238effSMauro Carvalho Chehab  make KBUILD_KCONFIG=Documentation/kbuild/Kconfig.recursion-issue-01 allnoconfig
581cd238effSMauro Carvalho Chehab
582cd238effSMauro Carvalho ChehabCumulative Kconfig recursive issue
583cd238effSMauro Carvalho Chehab~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
584cd238effSMauro Carvalho Chehab
585cd238effSMauro Carvalho ChehabRead: Documentation/kbuild/Kconfig.recursion-issue-02
586cd238effSMauro Carvalho Chehab
587cd238effSMauro Carvalho ChehabTest with::
588cd238effSMauro Carvalho Chehab
589cd238effSMauro Carvalho Chehab  make KBUILD_KCONFIG=Documentation/kbuild/Kconfig.recursion-issue-02 allnoconfig
590cd238effSMauro Carvalho Chehab
591cd238effSMauro Carvalho ChehabPractical solutions to kconfig recursive issue
592cd238effSMauro Carvalho Chehab~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
593cd238effSMauro Carvalho Chehab
594cd238effSMauro Carvalho ChehabDevelopers who run into the recursive Kconfig issue have two options
595cd238effSMauro Carvalho Chehabat their disposal. We document them below and also provide a list of
596cd238effSMauro Carvalho Chehabhistorical issues resolved through these different solutions.
597cd238effSMauro Carvalho Chehab
598cd238effSMauro Carvalho Chehab  a) Remove any superfluous "select FOO" or "depends on FOO"
599cd238effSMauro Carvalho Chehab  b) Match dependency semantics:
600cd238effSMauro Carvalho Chehab
601cd238effSMauro Carvalho Chehab	b1) Swap all "select FOO" to "depends on FOO" or,
602cd238effSMauro Carvalho Chehab
603cd238effSMauro Carvalho Chehab	b2) Swap all "depends on FOO" to "select FOO"
604cd238effSMauro Carvalho Chehab
605cd238effSMauro Carvalho ChehabThe resolution to a) can be tested with the sample Kconfig file
606cd238effSMauro Carvalho ChehabDocumentation/kbuild/Kconfig.recursion-issue-01 through the removal
607cd238effSMauro Carvalho Chehabof the "select CORE" from CORE_BELL_A_ADVANCED as that is implicit already
608cd238effSMauro Carvalho Chehabsince CORE_BELL_A depends on CORE. At times it may not be possible to remove
609cd238effSMauro Carvalho Chehabsome dependency criteria, for such cases you can work with solution b).
610cd238effSMauro Carvalho Chehab
611cd238effSMauro Carvalho ChehabThe two different resolutions for b) can be tested in the sample Kconfig file
612cd238effSMauro Carvalho ChehabDocumentation/kbuild/Kconfig.recursion-issue-02.
613cd238effSMauro Carvalho Chehab
614cd238effSMauro Carvalho ChehabBelow is a list of examples of prior fixes for these types of recursive issues;
6152b5072b9SBjorn Helgaasall errors appear to involve one or more "select" statements and one or more
6162b5072b9SBjorn Helgaas"depends on".
617cd238effSMauro Carvalho Chehab
618cd238effSMauro Carvalho Chehab============    ===================================
619cd238effSMauro Carvalho Chehabcommit          fix
620cd238effSMauro Carvalho Chehab============    ===================================
621cd238effSMauro Carvalho Chehab06b718c01208    select A -> depends on A
622cd238effSMauro Carvalho Chehabc22eacfe82f9    depends on A -> depends on B
623cd238effSMauro Carvalho Chehab6a91e854442c    select A -> depends on A
624cd238effSMauro Carvalho Chehab118c565a8f2e    select A -> select B
625cd238effSMauro Carvalho Chehabf004e5594705    select A -> depends on A
626cd238effSMauro Carvalho Chehabc7861f37b4c6    depends on A -> (null)
627cd238effSMauro Carvalho Chehab80c69915e5fb    select A -> (null)              (1)
628cd238effSMauro Carvalho Chehabc2218e26c0d0    select A -> depends on A        (1)
629cd238effSMauro Carvalho Chehabd6ae99d04e1c    select A -> depends on A
630cd238effSMauro Carvalho Chehab95ca19cf8cbf    select A -> depends on A
631cd238effSMauro Carvalho Chehab8f057d7bca54    depends on A -> (null)
632cd238effSMauro Carvalho Chehab8f057d7bca54    depends on A -> select A
633cd238effSMauro Carvalho Chehaba0701f04846e    select A -> depends on A
634cd238effSMauro Carvalho Chehab0c8b92f7f259    depends on A -> (null)
635cd238effSMauro Carvalho Chehabe4e9e0540928    select A -> depends on A        (2)
636cd238effSMauro Carvalho Chehab7453ea886e87    depends on A > (null)           (1)
637cd238effSMauro Carvalho Chehab7b1fff7e4fdf    select A -> depends on A
638cd238effSMauro Carvalho Chehab86c747d2a4f0    select A -> depends on A
639cd238effSMauro Carvalho Chehabd9f9ab51e55e    select A -> depends on A
640cd238effSMauro Carvalho Chehab0c51a4d8abd6    depends on A -> select A        (3)
641cd238effSMauro Carvalho Chehabe98062ed6dc4    select A -> depends on A        (3)
642cd238effSMauro Carvalho Chehab91e5d284a7f1    select A -> (null)
643cd238effSMauro Carvalho Chehab============    ===================================
644cd238effSMauro Carvalho Chehab
645cd238effSMauro Carvalho Chehab(1) Partial (or no) quote of error.
646cd238effSMauro Carvalho Chehab(2) That seems to be the gist of that fix.
647cd238effSMauro Carvalho Chehab(3) Same error.
648cd238effSMauro Carvalho Chehab
649cd238effSMauro Carvalho ChehabFuture kconfig work
650cd238effSMauro Carvalho Chehab~~~~~~~~~~~~~~~~~~~
651cd238effSMauro Carvalho Chehab
652cd238effSMauro Carvalho ChehabWork on kconfig is welcomed on both areas of clarifying semantics and on
653cd238effSMauro Carvalho Chehabevaluating the use of a full SAT solver for it. A full SAT solver can be
654cd238effSMauro Carvalho Chehabdesirable to enable more complex dependency mappings and / or queries,
655cd238effSMauro Carvalho Chehabfor instance on possible use case for a SAT solver could be that of handling
656cd238effSMauro Carvalho Chehabthe current known recursive dependency issues. It is not known if this would
657cd238effSMauro Carvalho Chehabaddress such issues but such evaluation is desirable. If support for a full SAT
658cd238effSMauro Carvalho Chehabsolver proves too complex or that it cannot address recursive dependency issues
659cd238effSMauro Carvalho ChehabKconfig should have at least clear and well defined semantics which also
660cd238effSMauro Carvalho Chehabaddresses and documents limitations or requirements such as the ones dealing
661cd238effSMauro Carvalho Chehabwith recursive dependencies.
662cd238effSMauro Carvalho Chehab
663cd238effSMauro Carvalho ChehabFurther work on both of these areas is welcomed on Kconfig. We elaborate
664cd238effSMauro Carvalho Chehabon both of these in the next two subsections.
665cd238effSMauro Carvalho Chehab
666cd238effSMauro Carvalho ChehabSemantics of Kconfig
667cd238effSMauro Carvalho Chehab~~~~~~~~~~~~~~~~~~~~
668cd238effSMauro Carvalho Chehab
669cd238effSMauro Carvalho ChehabThe use of Kconfig is broad, Linux is now only one of Kconfig's users:
670cd238effSMauro Carvalho Chehabone study has completed a broad analysis of Kconfig use in 12 projects [0]_.
671cd238effSMauro Carvalho ChehabDespite its widespread use, and although this document does a reasonable job
672cd238effSMauro Carvalho Chehabin documenting basic Kconfig syntax a more precise definition of Kconfig
673cd238effSMauro Carvalho Chehabsemantics is welcomed. One project deduced Kconfig semantics through
674cd238effSMauro Carvalho Chehabthe use of the xconfig configurator [1]_. Work should be done to confirm if
675cd238effSMauro Carvalho Chehabthe deduced semantics matches our intended Kconfig design goals.
676cd238effSMauro Carvalho Chehab
677cd238effSMauro Carvalho ChehabHaving well defined semantics can be useful for tools for practical
6782b5072b9SBjorn Helgaasevaluation of dependencies, for instance one such case was work to
679cd238effSMauro Carvalho Chehabexpress in boolean abstraction of the inferred semantics of Kconfig to
680cd238effSMauro Carvalho Chehabtranslate Kconfig logic into boolean formulas and run a SAT solver on this to
681cd238effSMauro Carvalho Chehabfind dead code / features (always inactive), 114 dead features were found in
682cd238effSMauro Carvalho ChehabLinux using this methodology [1]_ (Section 8: Threats to validity).
683cd238effSMauro Carvalho Chehab
684cd238effSMauro Carvalho ChehabConfirming this could prove useful as Kconfig stands as one of the the leading
685cd238effSMauro Carvalho Chehabindustrial variability modeling languages [1]_ [2]_. Its study would help
686cd238effSMauro Carvalho Chehabevaluate practical uses of such languages, their use was only theoretical
687cd238effSMauro Carvalho Chehaband real world requirements were not well understood. As it stands though
688cd238effSMauro Carvalho Chehabonly reverse engineering techniques have been used to deduce semantics from
689cd238effSMauro Carvalho Chehabvariability modeling languages such as Kconfig [3]_.
690cd238effSMauro Carvalho Chehab
691cd238effSMauro Carvalho Chehab.. [0] http://www.eng.uwaterloo.ca/~shshe/kconfig_semantics.pdf
692cd238effSMauro Carvalho Chehab.. [1] http://gsd.uwaterloo.ca/sites/default/files/vm-2013-berger.pdf
693cd238effSMauro Carvalho Chehab.. [2] http://gsd.uwaterloo.ca/sites/default/files/ase241-berger_0.pdf
694cd238effSMauro Carvalho Chehab.. [3] http://gsd.uwaterloo.ca/sites/default/files/icse2011.pdf
695cd238effSMauro Carvalho Chehab
696cd238effSMauro Carvalho ChehabFull SAT solver for Kconfig
697cd238effSMauro Carvalho Chehab~~~~~~~~~~~~~~~~~~~~~~~~~~~
698cd238effSMauro Carvalho Chehab
699cd238effSMauro Carvalho ChehabAlthough SAT solvers [4]_ haven't yet been used by Kconfig directly, as noted
700cd238effSMauro Carvalho Chehabin the previous subsection, work has been done however to express in boolean
701cd238effSMauro Carvalho Chehababstraction the inferred semantics of Kconfig to translate Kconfig logic into
702cd238effSMauro Carvalho Chehabboolean formulas and run a SAT solver on it [5]_. Another known related project
703cd238effSMauro Carvalho Chehabis CADOS [6]_ (former VAMOS [7]_) and the tools, mainly undertaker [8]_, which
704cd238effSMauro Carvalho Chehabhas been introduced first with [9]_.  The basic concept of undertaker is to
7052b5072b9SBjorn Helgaasextract variability models from Kconfig and put them together with a
706cd238effSMauro Carvalho Chehabpropositional formula extracted from CPP #ifdefs and build-rules into a SAT
707cd238effSMauro Carvalho Chehabsolver in order to find dead code, dead files, and dead symbols. If using a SAT
708cd238effSMauro Carvalho Chehabsolver is desirable on Kconfig one approach would be to evaluate repurposing
709cd238effSMauro Carvalho Chehabsuch efforts somehow on Kconfig. There is enough interest from mentors of
710cd238effSMauro Carvalho Chehabexisting projects to not only help advise how to integrate this work upstream
711cd238effSMauro Carvalho Chehabbut also help maintain it long term. Interested developers should visit:
712cd238effSMauro Carvalho Chehab
713cd238effSMauro Carvalho Chehabhttp://kernelnewbies.org/KernelProjects/kconfig-sat
714cd238effSMauro Carvalho Chehab
715cd238effSMauro Carvalho Chehab.. [4] http://www.cs.cornell.edu/~sabhar/chapters/SATSolvers-KR-Handbook.pdf
716cd238effSMauro Carvalho Chehab.. [5] http://gsd.uwaterloo.ca/sites/default/files/vm-2013-berger.pdf
717cd238effSMauro Carvalho Chehab.. [6] https://cados.cs.fau.de
718cd238effSMauro Carvalho Chehab.. [7] https://vamos.cs.fau.de
719cd238effSMauro Carvalho Chehab.. [8] https://undertaker.cs.fau.de
720cd238effSMauro Carvalho Chehab.. [9] https://www4.cs.fau.de/Publications/2011/tartler_11_eurosys.pdf
721