blob: 3908985c7b294a6db9d48cbc736382e0e1b188d3 [file] [log] [blame]
Tom Rini3c5f4152019-09-20 17:42:09 -04001# Copyright (c) 2011-2019, Ulf Magnusson
Tom Rini10e47792018-05-06 17:58:06 -04002# SPDX-License-Identifier: ISC
Masahiro Yamadac908bc82014-09-01 19:57:37 +09003
4"""
Tom Rini3c5f4152019-09-20 17:42:09 -04005Overview
6========
Masahiro Yamadac908bc82014-09-01 19:57:37 +09007
Tom Rini3c5f4152019-09-20 17:42:09 -04008Kconfiglib is a Python 2/3 library for scripting and extracting information
9from Kconfig (https://www.kernel.org/doc/Documentation/kbuild/kconfig-language.txt)
10configuration systems.
Masahiro Yamadac908bc82014-09-01 19:57:37 +090011
Tom Rini3c5f4152019-09-20 17:42:09 -040012See the homepage at https://github.com/ulfalizer/Kconfiglib for a longer
13overview.
Masahiro Yamadac908bc82014-09-01 19:57:37 +090014
Tom Rini3c5f4152019-09-20 17:42:09 -040015Since Kconfiglib 12.0.0, the library version is available in
16kconfiglib.VERSION, which is a (<major>, <minor>, <patch>) tuple, e.g.
17(12, 0, 0).
Masahiro Yamadac908bc82014-09-01 19:57:37 +090018
Masahiro Yamadac908bc82014-09-01 19:57:37 +090019
Tom Rini3c5f4152019-09-20 17:42:09 -040020Using Kconfiglib on the Linux kernel with the Makefile targets
21==============================================================
Masahiro Yamadac908bc82014-09-01 19:57:37 +090022
Tom Rini3c5f4152019-09-20 17:42:09 -040023For the Linux kernel, a handy interface is provided by the
24scripts/kconfig/Makefile patch, which can be applied with either 'git am' or
25the 'patch' utility:
Masahiro Yamadac908bc82014-09-01 19:57:37 +090026
Tom Rini3c5f4152019-09-20 17:42:09 -040027 $ wget -qO- https://raw.githubusercontent.com/ulfalizer/Kconfiglib/master/makefile.patch | git am
28 $ wget -qO- https://raw.githubusercontent.com/ulfalizer/Kconfiglib/master/makefile.patch | patch -p1
Masahiro Yamadac908bc82014-09-01 19:57:37 +090029
Tom Rini3c5f4152019-09-20 17:42:09 -040030Warning: Not passing -p1 to patch will cause the wrong file to be patched.
Masahiro Yamadac908bc82014-09-01 19:57:37 +090031
Tom Rini3c5f4152019-09-20 17:42:09 -040032Please tell me if the patch does not apply. It should be trivial to apply
33manually, as it's just a block of text that needs to be inserted near the other
34*conf: targets in scripts/kconfig/Makefile.
Masahiro Yamadac908bc82014-09-01 19:57:37 +090035
Tom Rini3c5f4152019-09-20 17:42:09 -040036Look further down for a motivation for the Makefile patch and for instructions
37on how you can use Kconfiglib without it.
Masahiro Yamadac908bc82014-09-01 19:57:37 +090038
Tom Rini3c5f4152019-09-20 17:42:09 -040039If you do not wish to install Kconfiglib via pip, the Makefile patch is set up
40so that you can also just clone Kconfiglib into the kernel root:
Masahiro Yamadac908bc82014-09-01 19:57:37 +090041
Tom Rini3c5f4152019-09-20 17:42:09 -040042 $ git clone git://github.com/ulfalizer/Kconfiglib.git
43 $ git am Kconfiglib/makefile.patch (or 'patch -p1 < Kconfiglib/makefile.patch')
Masahiro Yamadac908bc82014-09-01 19:57:37 +090044
Tom Rini3c5f4152019-09-20 17:42:09 -040045Warning: The directory name Kconfiglib/ is significant in this case, because
46it's added to PYTHONPATH by the new targets in makefile.patch.
Masahiro Yamadac908bc82014-09-01 19:57:37 +090047
Tom Rini3c5f4152019-09-20 17:42:09 -040048The targets added by the Makefile patch are described in the following
49sections.
Masahiro Yamadac908bc82014-09-01 19:57:37 +090050
Ulf Magnusson1e642d72015-08-13 19:55:40 +020051
Tom Rini3c5f4152019-09-20 17:42:09 -040052make kmenuconfig
53----------------
Ulf Magnusson1e642d72015-08-13 19:55:40 +020054
Tom Rini3c5f4152019-09-20 17:42:09 -040055This target runs the curses menuconfig interface with Python 3. As of
56Kconfiglib 12.2.0, both Python 2 and Python 3 are supported (previously, only
57Python 3 was supported, so this was a backport).
Ulf Magnusson1e642d72015-08-13 19:55:40 +020058
Masahiro Yamadac908bc82014-09-01 19:57:37 +090059
Tom Rini3c5f4152019-09-20 17:42:09 -040060make guiconfig
61--------------
Masahiro Yamadac908bc82014-09-01 19:57:37 +090062
Tom Rini3c5f4152019-09-20 17:42:09 -040063This target runs the Tkinter menuconfig interface. Both Python 2 and Python 3
64are supported. To change the Python interpreter used, pass
65PYTHONCMD=<executable> to 'make'. The default is 'python'.
Masahiro Yamadac908bc82014-09-01 19:57:37 +090066
Masahiro Yamadac908bc82014-09-01 19:57:37 +090067
Tom Rini3c5f4152019-09-20 17:42:09 -040068make [ARCH=<arch>] iscriptconfig
69--------------------------------
Masahiro Yamadac908bc82014-09-01 19:57:37 +090070
Tom Rini3c5f4152019-09-20 17:42:09 -040071This target gives an interactive Python prompt where a Kconfig instance has
72been preloaded and is available in 'kconf'. To change the Python interpreter
73used, pass PYTHONCMD=<executable> to 'make'. The default is 'python'.
Masahiro Yamadac908bc82014-09-01 19:57:37 +090074
Tom Rini3c5f4152019-09-20 17:42:09 -040075To get a feel for the API, try evaluating and printing the symbols in
76kconf.defined_syms, and explore the MenuNode menu tree starting at
77kconf.top_node by following 'next' and 'list' pointers.
Masahiro Yamadac908bc82014-09-01 19:57:37 +090078
Tom Rini3c5f4152019-09-20 17:42:09 -040079The item contained in a menu node is found in MenuNode.item (note that this can
80be one of the constants kconfiglib.MENU and kconfiglib.COMMENT), and all
81symbols and choices have a 'nodes' attribute containing their menu nodes
82(usually only one). Printing a menu node will print its item, in Kconfig
83format.
Masahiro Yamadac908bc82014-09-01 19:57:37 +090084
Tom Rini3c5f4152019-09-20 17:42:09 -040085If you want to look up a symbol by name, use the kconf.syms dictionary.
Masahiro Yamadac908bc82014-09-01 19:57:37 +090086
Masahiro Yamadac908bc82014-09-01 19:57:37 +090087
Tom Rini3c5f4152019-09-20 17:42:09 -040088make scriptconfig SCRIPT=<script> [SCRIPT_ARG=<arg>]
89----------------------------------------------------
Masahiro Yamadac908bc82014-09-01 19:57:37 +090090
Tom Rini3c5f4152019-09-20 17:42:09 -040091This target runs the Python script given by the SCRIPT parameter on the
92configuration. sys.argv[1] holds the name of the top-level Kconfig file
93(currently always "Kconfig" in practice), and sys.argv[2] holds the SCRIPT_ARG
94argument, if given.
Masahiro Yamadac908bc82014-09-01 19:57:37 +090095
Tom Rini3c5f4152019-09-20 17:42:09 -040096See the examples/ subdirectory for example scripts.
Ulf Magnusson1e642d72015-08-13 19:55:40 +020097
Masahiro Yamadac908bc82014-09-01 19:57:37 +090098
Tom Rini3c5f4152019-09-20 17:42:09 -040099make dumpvarsconfig
100-------------------
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900101
Tom Rini3c5f4152019-09-20 17:42:09 -0400102This target prints a list of all environment variables referenced from the
103Kconfig files, together with their values. See the
104Kconfiglib/examples/dumpvars.py script.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900105
Tom Rini3c5f4152019-09-20 17:42:09 -0400106Only environment variables that are referenced via the Kconfig preprocessor
107$(FOO) syntax are included. The preprocessor was added in Linux 4.18.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900108
Ulf Magnusson1682e052017-09-19 12:52:55 +0200109
Tom Rini3c5f4152019-09-20 17:42:09 -0400110Using Kconfiglib without the Makefile targets
111=============================================
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900112
Tom Rini3c5f4152019-09-20 17:42:09 -0400113The make targets are only needed to pick up environment variables exported from
114the Kbuild makefiles and referenced inside Kconfig files, via e.g.
115'source "arch/$(SRCARCH)/Kconfig" and commands run via '$(shell,...)'.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900116
Tom Rini3c5f4152019-09-20 17:42:09 -0400117These variables are referenced as of writing (Linux 4.18), together with sample
118values:
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900119
Tom Rini3c5f4152019-09-20 17:42:09 -0400120 srctree (.)
121 ARCH (x86)
122 SRCARCH (x86)
123 KERNELVERSION (4.18.0)
124 CC (gcc)
125 HOSTCC (gcc)
126 HOSTCXX (g++)
127 CC_VERSION_TEXT (gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0)
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900128
Tom Rini3c5f4152019-09-20 17:42:09 -0400129Older kernels only reference ARCH, SRCARCH, and KERNELVERSION.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900130
Tom Rini3c5f4152019-09-20 17:42:09 -0400131If your kernel is recent enough (4.18+), you can get a list of referenced
132environment variables via 'make dumpvarsconfig' (see above). Note that this
133command is added by the Makefile patch.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900134
Tom Rini3c5f4152019-09-20 17:42:09 -0400135To run Kconfiglib without the Makefile patch, set the environment variables
136manually:
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900137
Tom Rini3c5f4152019-09-20 17:42:09 -0400138 $ srctree=. ARCH=x86 SRCARCH=x86 KERNELVERSION=`make kernelversion` ... python(3)
139 >>> import kconfiglib
140 >>> kconf = kconfiglib.Kconfig() # filename defaults to "Kconfig"
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900141
Tom Rini3c5f4152019-09-20 17:42:09 -0400142Search the top-level Makefile for "Additional ARCH settings" to see other
143possibilities for ARCH and SRCARCH.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900144
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900145
Tom Rini3c5f4152019-09-20 17:42:09 -0400146Intro to symbol values
147======================
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900148
Tom Rini3c5f4152019-09-20 17:42:09 -0400149Kconfiglib has the same assignment semantics as the C implementation.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900150
Tom Rini3c5f4152019-09-20 17:42:09 -0400151Any symbol can be assigned a value by the user (via Kconfig.load_config() or
152Symbol.set_value()), but this user value is only respected if the symbol is
153visible, which corresponds to it (currently) being visible in the menuconfig
154interface.
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200155
Tom Rini3c5f4152019-09-20 17:42:09 -0400156For symbols with prompts, the visibility of the symbol is determined by the
157condition on the prompt. Symbols without prompts are never visible, so setting
158a user value on them is pointless. A warning will be printed by default if
159Symbol.set_value() is called on a promptless symbol. Assignments to promptless
160symbols are normal within a .config file, so no similar warning will be printed
161by load_config().
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200162
Tom Rini3c5f4152019-09-20 17:42:09 -0400163Dependencies from parents and 'if'/'depends on' are propagated to properties,
164including prompts, so these two configurations are logically equivalent:
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900165
Tom Rini3c5f4152019-09-20 17:42:09 -0400166(1)
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200167
Tom Rini3c5f4152019-09-20 17:42:09 -0400168 menu "menu"
169 depends on A
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200170
Tom Rini3c5f4152019-09-20 17:42:09 -0400171 if B
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900172
Tom Rini3c5f4152019-09-20 17:42:09 -0400173 config FOO
174 tristate "foo" if D
175 default y
176 depends on C
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900177
Tom Rini3c5f4152019-09-20 17:42:09 -0400178 endif
Masahiro Yamada48386dd2015-05-27 11:39:22 +0900179
Tom Rini3c5f4152019-09-20 17:42:09 -0400180 endmenu
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900181
Tom Rini3c5f4152019-09-20 17:42:09 -0400182(2)
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900183
Tom Rini3c5f4152019-09-20 17:42:09 -0400184 menu "menu"
185 depends on A
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900186
Tom Rini3c5f4152019-09-20 17:42:09 -0400187 config FOO
188 tristate "foo" if A && B && C && D
189 default y if A && B && C
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900190
Tom Rini3c5f4152019-09-20 17:42:09 -0400191 endmenu
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900192
Tom Rini3c5f4152019-09-20 17:42:09 -0400193In this example, A && B && C && D (the prompt condition) needs to be non-n for
194FOO to be visible (assignable). If its value is m, the symbol can only be
195assigned the value m: The visibility sets an upper bound on the value that can
196be assigned by the user, and any higher user value will be truncated down.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900197
Tom Rini3c5f4152019-09-20 17:42:09 -0400198'default' properties are independent of the visibility, though a 'default' will
199often get the same condition as the prompt due to dependency propagation.
200'default' properties are used if the symbol is not visible or has no user
201value.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900202
Tom Rini3c5f4152019-09-20 17:42:09 -0400203Symbols with no user value (or that have a user value but are not visible) and
204no (active) 'default' default to n for bool/tristate symbols, and to the empty
205string for other symbol types.
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200206
Tom Rini3c5f4152019-09-20 17:42:09 -0400207'select' works similarly to symbol visibility, but sets a lower bound on the
208value of the symbol. The lower bound is determined by the value of the
209select*ing* symbol. 'select' does not respect visibility, so non-visible
210symbols can be forced to a particular (minimum) value by a select as well.
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200211
Tom Rini3c5f4152019-09-20 17:42:09 -0400212For non-bool/tristate symbols, it only matters whether the visibility is n or
213non-n: m visibility acts the same as y visibility.
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200214
Tom Rini3c5f4152019-09-20 17:42:09 -0400215Conditions on 'default' and 'select' work in mostly intuitive ways. If the
216condition is n, the 'default' or 'select' is disabled. If it is m, the
217'default' or 'select' value (the value of the selecting symbol) is truncated
218down to m.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900219
Tom Rini3c5f4152019-09-20 17:42:09 -0400220When writing a configuration with Kconfig.write_config(), only symbols that are
221visible, have an (active) default, or are selected will get written out (note
222that this includes all symbols that would accept user values). Kconfiglib
223matches the .config format produced by the C implementations down to the
224character. This eases testing.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900225
Tom Rini3c5f4152019-09-20 17:42:09 -0400226For a visible bool/tristate symbol FOO with value n, this line is written to
227.config:
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900228
Tom Rini3c5f4152019-09-20 17:42:09 -0400229 # CONFIG_FOO is not set
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900230
Tom Rini3c5f4152019-09-20 17:42:09 -0400231The point is to remember the user n selection (which might differ from the
232default value the symbol would get), while at the same sticking to the rule
233that undefined corresponds to n (.config uses Makefile format, making the line
234above a comment). When the .config file is read back in, this line will be
235treated the same as the following assignment:
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200236
Tom Rini3c5f4152019-09-20 17:42:09 -0400237 CONFIG_FOO=n
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200238
Tom Rini3c5f4152019-09-20 17:42:09 -0400239In Kconfiglib, the set of (currently) assignable values for a bool/tristate
240symbol appear in Symbol.assignable. For other symbol types, just check if
241sym.visibility is non-0 (non-n) to see whether the user value will have an
242effect.
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200243
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200244
Tom Rini3c5f4152019-09-20 17:42:09 -0400245Intro to the menu tree
246======================
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200247
Tom Rini3c5f4152019-09-20 17:42:09 -0400248The menu structure, as seen in e.g. menuconfig, is represented by a tree of
249MenuNode objects. The top node of the configuration corresponds to an implicit
250top-level menu, the title of which is shown at the top in the standard
251menuconfig interface. (The title is also available in Kconfig.mainmenu_text in
252Kconfiglib.)
Simon Glass2b72a072017-08-04 03:30:30 -0600253
Tom Rini3c5f4152019-09-20 17:42:09 -0400254The top node is found in Kconfig.top_node. From there, you can visit child menu
255nodes by following the 'list' pointer, and any following menu nodes by
256following the 'next' pointer. Usually, a non-None 'list' pointer indicates a
257menu or Choice, but menu nodes for symbols can sometimes have a non-None 'list'
258pointer too due to submenus created implicitly from dependencies.
Ulf Magnusson1682e052017-09-19 12:52:55 +0200259
Tom Rini3c5f4152019-09-20 17:42:09 -0400260MenuNode.item is either a Symbol or a Choice object, or one of the constants
261MENU and COMMENT. The prompt of the menu node can be found in MenuNode.prompt,
262which also holds the title for menus and comments. For Symbol and Choice,
263MenuNode.help holds the help text (if any, otherwise None).
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200264
Tom Rini3c5f4152019-09-20 17:42:09 -0400265Most symbols will only have a single menu node. A symbol defined in multiple
266locations will have one menu node for each location. The list of menu nodes for
267a Symbol or Choice can be found in the Symbol/Choice.nodes attribute.
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200268
Tom Rini3c5f4152019-09-20 17:42:09 -0400269Note that prompts and help texts for symbols and choices are stored in their
270menu node(s) rather than in the Symbol or Choice objects themselves. This makes
271it possible to define a symbol in multiple locations with a different prompt or
272help text in each location. To get the help text or prompt for a symbol with a
273single menu node, do sym.nodes[0].help and sym.nodes[0].prompt, respectively.
274The prompt is a (text, condition) tuple, where condition determines the
275visibility (see 'Intro to expressions' below).
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200276
Tom Rini3c5f4152019-09-20 17:42:09 -0400277This organization mirrors the C implementation. MenuNode is called
278'struct menu' there, but I thought "menu" was a confusing name.
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200279
Tom Rini3c5f4152019-09-20 17:42:09 -0400280It is possible to give a Choice a name and define it in multiple locations,
281hence why Choice.nodes is also a list.
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200282
Tom Rini3c5f4152019-09-20 17:42:09 -0400283As a convenience, the properties added at a particular definition location are
284available on the MenuNode itself, in e.g. MenuNode.defaults. This is helpful
285when generating documentation, so that symbols/choices defined in multiple
286locations can be shown with the correct properties at each location.
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200287
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200288
Tom Rini3c5f4152019-09-20 17:42:09 -0400289Intro to expressions
290====================
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200291
Tom Rini3c5f4152019-09-20 17:42:09 -0400292Expressions can be evaluated with the expr_value() function and printed with
293the expr_str() function (these are used internally as well). Evaluating an
294expression always yields a tristate value, where n, m, and y are represented as
2950, 1, and 2, respectively.
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200296
Tom Rini3c5f4152019-09-20 17:42:09 -0400297The following table should help you figure out how expressions are represented.
298A, B, C, ... are symbols (Symbol instances), NOT is the kconfiglib.NOT
299constant, etc.
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200300
Tom Rini3c5f4152019-09-20 17:42:09 -0400301Expression Representation
302---------- --------------
303A A
304"A" A (constant symbol)
305!A (NOT, A)
306A && B (AND, A, B)
307A && B && C (AND, A, (AND, B, C))
308A || B (OR, A, B)
309A || (B && C && D) (OR, A, (AND, B, (AND, C, D)))
310A = B (EQUAL, A, B)
311A != "foo" (UNEQUAL, A, foo (constant symbol))
312A && B = C && D (AND, A, (AND, (EQUAL, B, C), D))
313n Kconfig.n (constant symbol)
314m Kconfig.m (constant symbol)
315y Kconfig.y (constant symbol)
316"y" Kconfig.y (constant symbol)
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200317
Tom Rini3c5f4152019-09-20 17:42:09 -0400318Strings like "foo" in 'default "foo"' or 'depends on SYM = "foo"' are
319represented as constant symbols, so the only values that appear in expressions
320are symbols***. This mirrors the C implementation.
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200321
Tom Rini3c5f4152019-09-20 17:42:09 -0400322***For choice symbols, the parent Choice will appear in expressions as well,
323but it's usually invisible as the value interfaces of Symbol and Choice are
324identical. This mirrors the C implementation and makes different choice modes
325"just work".
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200326
Tom Rini3c5f4152019-09-20 17:42:09 -0400327Manual evaluation examples:
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200328
Tom Rini3c5f4152019-09-20 17:42:09 -0400329 - The value of A && B is min(A.tri_value, B.tri_value)
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200330
Tom Rini3c5f4152019-09-20 17:42:09 -0400331 - The value of A || B is max(A.tri_value, B.tri_value)
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200332
Tom Rini3c5f4152019-09-20 17:42:09 -0400333 - The value of !A is 2 - A.tri_value
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200334
Tom Rini3c5f4152019-09-20 17:42:09 -0400335 - The value of A = B is 2 (y) if A.str_value == B.str_value, and 0 (n)
336 otherwise. Note that str_value is used here instead of tri_value.
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200337
Tom Rini3c5f4152019-09-20 17:42:09 -0400338 For constant (as well as undefined) symbols, str_value matches the name of
339 the symbol. This mirrors the C implementation and explains why
340 'depends on SYM = "foo"' above works as expected.
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200341
Tom Rini3c5f4152019-09-20 17:42:09 -0400342n/m/y are automatically converted to the corresponding constant symbols
343"n"/"m"/"y" (Kconfig.n/m/y) during parsing.
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200344
Tom Rini3c5f4152019-09-20 17:42:09 -0400345Kconfig.const_syms is a dictionary like Kconfig.syms but for constant symbols.
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200346
Tom Rini3c5f4152019-09-20 17:42:09 -0400347If a condition is missing (e.g., <cond> when the 'if <cond>' is removed from
348'default A if <cond>'), it is actually Kconfig.y. The standard __str__()
349functions just avoid printing 'if y' conditions to give cleaner output.
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200350
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200351
Tom Rini3c5f4152019-09-20 17:42:09 -0400352Kconfig extensions
353==================
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200354
Tom Rini3c5f4152019-09-20 17:42:09 -0400355Kconfiglib includes a couple of Kconfig extensions:
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900356
Tom Rini3c5f4152019-09-20 17:42:09 -0400357'source' with relative path
358---------------------------
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900359
Tom Rini3c5f4152019-09-20 17:42:09 -0400360The 'rsource' statement sources Kconfig files with a path relative to directory
361of the Kconfig file containing the 'rsource' statement, instead of relative to
362the project root.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900363
Tom Rini3c5f4152019-09-20 17:42:09 -0400364Consider following directory tree:
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200365
Tom Rini3c5f4152019-09-20 17:42:09 -0400366 Project
367 +--Kconfig
368 |
369 +--src
370 +--Kconfig
371 |
372 +--SubSystem1
373 +--Kconfig
374 |
375 +--ModuleA
376 +--Kconfig
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900377
Tom Rini3c5f4152019-09-20 17:42:09 -0400378In this example, assume that src/SubSystem1/Kconfig wants to source
379src/SubSystem1/ModuleA/Kconfig.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900380
Tom Rini3c5f4152019-09-20 17:42:09 -0400381With 'source', this statement would be used:
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900382
Tom Rini3c5f4152019-09-20 17:42:09 -0400383 source "src/SubSystem1/ModuleA/Kconfig"
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900384
Tom Rini3c5f4152019-09-20 17:42:09 -0400385With 'rsource', this turns into
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900386
Tom Rini3c5f4152019-09-20 17:42:09 -0400387 rsource "ModuleA/Kconfig"
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900388
Tom Rini3c5f4152019-09-20 17:42:09 -0400389If an absolute path is given to 'rsource', it acts the same as 'source'.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900390
Tom Rini3c5f4152019-09-20 17:42:09 -0400391'rsource' can be used to create "position-independent" Kconfig trees that can
392be moved around freely.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900393
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900394
Tom Rini3c5f4152019-09-20 17:42:09 -0400395Globbing 'source'
396-----------------
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900397
Tom Rini3c5f4152019-09-20 17:42:09 -0400398'source' and 'rsource' accept glob patterns, sourcing all matching Kconfig
399files. They require at least one matching file, raising a KconfigError
400otherwise.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900401
Tom Rini3c5f4152019-09-20 17:42:09 -0400402For example, the following statement might source sub1/foofoofoo and
403sub2/foobarfoo:
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900404
Tom Rini3c5f4152019-09-20 17:42:09 -0400405 source "sub[12]/foo*foo"
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900406
Tom Rini3c5f4152019-09-20 17:42:09 -0400407The glob patterns accepted are the same as for the standard glob.glob()
408function.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900409
Tom Rini3c5f4152019-09-20 17:42:09 -0400410Two additional statements are provided for cases where it's acceptable for a
411pattern to match no files: 'osource' and 'orsource' (the o is for "optional").
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900412
Tom Rini3c5f4152019-09-20 17:42:09 -0400413For example, the following statements will be no-ops if neither "foo" nor any
414files matching "bar*" exist:
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900415
Tom Rini3c5f4152019-09-20 17:42:09 -0400416 osource "foo"
417 osource "bar*"
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900418
Tom Rini3c5f4152019-09-20 17:42:09 -0400419'orsource' does a relative optional source.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900420
Tom Rini3c5f4152019-09-20 17:42:09 -0400421'source' and 'osource' are analogous to 'include' and '-include' in Make.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900422
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900423
Tom Rini3c5f4152019-09-20 17:42:09 -0400424Generalized def_* keywords
425--------------------------
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900426
Tom Rini3c5f4152019-09-20 17:42:09 -0400427def_int, def_hex, and def_string are available in addition to def_bool and
428def_tristate, allowing int, hex, and string symbols to be given a type and a
429default at the same time.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900430
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900431
Tom Rini3c5f4152019-09-20 17:42:09 -0400432Extra optional warnings
433-----------------------
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900434
Tom Rini3c5f4152019-09-20 17:42:09 -0400435Some optional warnings can be controlled via environment variables:
Ulf Magnusson1682e052017-09-19 12:52:55 +0200436
Tom Rini3c5f4152019-09-20 17:42:09 -0400437 - KCONFIG_WARN_UNDEF: If set to 'y', warnings will be generated for all
438 references to undefined symbols within Kconfig files. The only gotcha is
439 that all hex literals must be prefixed with "0x" or "0X", to make it
440 possible to distinguish them from symbol references.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900441
Tom Rini3c5f4152019-09-20 17:42:09 -0400442 Some projects (e.g. the Linux kernel) use multiple Kconfig trees with many
443 shared Kconfig files, leading to some safe undefined symbol references.
444 KCONFIG_WARN_UNDEF is useful in projects that only have a single Kconfig
445 tree though.
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200446
Tom Rini3c5f4152019-09-20 17:42:09 -0400447 KCONFIG_STRICT is an older alias for this environment variable, supported
448 for backwards compatibility.
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200449
Tom Rini3c5f4152019-09-20 17:42:09 -0400450 - KCONFIG_WARN_UNDEF_ASSIGN: If set to 'y', warnings will be generated for
451 all assignments to undefined symbols within .config files. By default, no
452 such warnings are generated.
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200453
Tom Rini3c5f4152019-09-20 17:42:09 -0400454 This warning can also be enabled/disabled via the Kconfig.warn_assign_undef
455 variable.
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200456
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200457
Tom Rini3c5f4152019-09-20 17:42:09 -0400458Preprocessor user functions defined in Python
459---------------------------------------------
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200460
Tom Rini3c5f4152019-09-20 17:42:09 -0400461Preprocessor functions can be defined in Python, which makes it simple to
462integrate information from existing Python tools into Kconfig (e.g. to have
463Kconfig symbols depend on hardware information stored in some other format).
Ulf Magnusson1682e052017-09-19 12:52:55 +0200464
Tom Rini3c5f4152019-09-20 17:42:09 -0400465Putting a Python module named kconfigfunctions(.py) anywhere in sys.path will
466cause it to be imported by Kconfiglib (in Kconfig.__init__()). Note that
467sys.path can be customized via PYTHONPATH, and includes the directory of the
468module being run by default, as well as installation directories.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900469
Tom Rini3c5f4152019-09-20 17:42:09 -0400470If the KCONFIG_FUNCTIONS environment variable is set, it gives a different
471module name to use instead of 'kconfigfunctions'.
Ulf Magnusson1682e052017-09-19 12:52:55 +0200472
Tom Rini3c5f4152019-09-20 17:42:09 -0400473The imported module is expected to define a global dictionary named 'functions'
474that maps function names to Python functions, as follows:
Ulf Magnusson1682e052017-09-19 12:52:55 +0200475
Tom Rini3c5f4152019-09-20 17:42:09 -0400476 def my_fn(kconf, name, arg_1, arg_2, ...):
477 # kconf:
478 # Kconfig instance
479 #
480 # name:
481 # Name of the user-defined function ("my-fn"). Think argv[0].
482 #
483 # arg_1, arg_2, ...:
484 # Arguments passed to the function from Kconfig (strings)
485 #
486 # Returns a string to be substituted as the result of calling the
487 # function
488 ...
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900489
Tom Rini3c5f4152019-09-20 17:42:09 -0400490 def my_other_fn(kconf, name, arg_1, arg_2, ...):
491 ...
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900492
Tom Rini3c5f4152019-09-20 17:42:09 -0400493 functions = {
494 "my-fn": (my_fn, <min.args>, <max.args>/None),
495 "my-other-fn": (my_other_fn, <min.args>, <max.args>/None),
496 ...
497 }
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900498
Tom Rini3c5f4152019-09-20 17:42:09 -0400499 ...
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900500
Tom Rini3c5f4152019-09-20 17:42:09 -0400501<min.args> and <max.args> are the minimum and maximum number of arguments
502expected by the function (excluding the implicit 'name' argument). If
503<max.args> is None, there is no upper limit to the number of arguments. Passing
504an invalid number of arguments will generate a KconfigError exception.
Ulf Magnusson1682e052017-09-19 12:52:55 +0200505
Tom Rini3c5f4152019-09-20 17:42:09 -0400506Functions can access the current parsing location as kconf.filename/linenr.
507Accessing other fields of the Kconfig object is not safe. See the warning
508below.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900509
Tom Rini3c5f4152019-09-20 17:42:09 -0400510Keep in mind that for a variable defined like 'foo = $(fn)', 'fn' will be
511called only when 'foo' is expanded. If 'fn' uses the parsing location and the
512intent is to use the location of the assignment, you want 'foo := $(fn)'
513instead, which calls the function immediately.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900514
Tom Rini3c5f4152019-09-20 17:42:09 -0400515Once defined, user functions can be called from Kconfig in the same way as
516other preprocessor functions:
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900517
Tom Rini3c5f4152019-09-20 17:42:09 -0400518 config FOO
519 ...
520 depends on $(my-fn,arg1,arg2)
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900521
Tom Rini3c5f4152019-09-20 17:42:09 -0400522If my_fn() returns "n", this will result in
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900523
Tom Rini3c5f4152019-09-20 17:42:09 -0400524 config FOO
525 ...
526 depends on n
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900527
Tom Rini3c5f4152019-09-20 17:42:09 -0400528Warning
529*******
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900530
Tom Rini3c5f4152019-09-20 17:42:09 -0400531User-defined preprocessor functions are called as they're encountered at parse
532time, before all Kconfig files have been processed, and before the menu tree
533has been finalized. There are no guarantees that accessing Kconfig symbols or
534the menu tree via the 'kconf' parameter will work, and it could potentially
535lead to a crash.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900536
Tom Rini3c5f4152019-09-20 17:42:09 -0400537Preferably, user-defined functions should be stateless.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900538
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900539
Tom Rini3c5f4152019-09-20 17:42:09 -0400540Feedback
541========
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900542
Tom Rini3c5f4152019-09-20 17:42:09 -0400543Send bug reports, suggestions, and questions to ulfalizer a.t Google's email
544service, or open a ticket on the GitHub page.
545"""
546import errno
547import importlib
548import os
549import re
550import sys
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900551
Tom Rini3c5f4152019-09-20 17:42:09 -0400552# Get rid of some attribute lookups. These are obvious in context.
553from glob import iglob
554from os.path import dirname, exists, expandvars, islink, join, realpath
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900555
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900556
Tom Rini3c5f4152019-09-20 17:42:09 -0400557VERSION = (12, 14, 0)
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900558
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900559
Tom Rini3c5f4152019-09-20 17:42:09 -0400560# File layout:
561#
562# Public classes
563# Public functions
564# Internal functions
565# Global constants
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900566
Tom Rini3c5f4152019-09-20 17:42:09 -0400567# Line length: 79 columns
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200568
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900569
Tom Rini3c5f4152019-09-20 17:42:09 -0400570#
571# Public classes
572#
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900573
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900574
Tom Rini3c5f4152019-09-20 17:42:09 -0400575class Kconfig(object):
576 """
577 Represents a Kconfig configuration, e.g. for x86 or ARM. This is the set of
578 symbols, choices, and menu nodes appearing in the configuration. Creating
579 any number of Kconfig objects (including for different architectures) is
580 safe. Kconfiglib doesn't keep any global state.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900581
Tom Rini3c5f4152019-09-20 17:42:09 -0400582 The following attributes are available. They should be treated as
583 read-only, and some are implemented through @property magic.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900584
Tom Rini3c5f4152019-09-20 17:42:09 -0400585 syms:
586 A dictionary with all symbols in the configuration, indexed by name. Also
587 includes all symbols that are referenced in expressions but never
588 defined, except for constant (quoted) symbols.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900589
Tom Rini3c5f4152019-09-20 17:42:09 -0400590 Undefined symbols can be recognized by Symbol.nodes being empty -- see
591 the 'Intro to the menu tree' section in the module docstring.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900592
Tom Rini3c5f4152019-09-20 17:42:09 -0400593 const_syms:
594 A dictionary like 'syms' for constant (quoted) symbols
Ulf Magnusson1682e052017-09-19 12:52:55 +0200595
Tom Rini3c5f4152019-09-20 17:42:09 -0400596 named_choices:
597 A dictionary like 'syms' for named choices (choice FOO)
Ulf Magnusson1682e052017-09-19 12:52:55 +0200598
Tom Rini3c5f4152019-09-20 17:42:09 -0400599 defined_syms:
600 A list with all defined symbols, in the same order as they appear in the
601 Kconfig files. Symbols defined in multiple locations appear multiple
602 times.
Ulf Magnusson1682e052017-09-19 12:52:55 +0200603
Tom Rini3c5f4152019-09-20 17:42:09 -0400604 Note: You probably want to use 'unique_defined_syms' instead. This
605 attribute is mostly maintained for backwards compatibility.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900606
Tom Rini3c5f4152019-09-20 17:42:09 -0400607 unique_defined_syms:
608 A list like 'defined_syms', but with duplicates removed. Just the first
609 instance is kept for symbols defined in multiple locations. Kconfig order
610 is preserved otherwise.
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200611
Tom Rini3c5f4152019-09-20 17:42:09 -0400612 Using this attribute instead of 'defined_syms' can save work, and
613 automatically gives reasonable behavior when writing configuration output
614 (symbols defined in multiple locations only generate output once, while
615 still preserving Kconfig order for readability).
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200616
Tom Rini3c5f4152019-09-20 17:42:09 -0400617 choices:
618 A list with all choices, in the same order as they appear in the Kconfig
619 files.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900620
Tom Rini3c5f4152019-09-20 17:42:09 -0400621 Note: You probably want to use 'unique_choices' instead. This attribute
622 is mostly maintained for backwards compatibility.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900623
Tom Rini3c5f4152019-09-20 17:42:09 -0400624 unique_choices:
625 Analogous to 'unique_defined_syms', for choices. Named choices can have
626 multiple definition locations.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900627
Tom Rini3c5f4152019-09-20 17:42:09 -0400628 menus:
629 A list with all menus, in the same order as they appear in the Kconfig
630 files
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900631
Tom Rini3c5f4152019-09-20 17:42:09 -0400632 comments:
633 A list with all comments, in the same order as they appear in the Kconfig
634 files
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900635
Tom Rini3c5f4152019-09-20 17:42:09 -0400636 kconfig_filenames:
637 A list with the filenames of all Kconfig files included in the
638 configuration, relative to $srctree (or relative to the current directory
639 if $srctree isn't set), except absolute paths (e.g.
640 'source "/foo/Kconfig"') are kept as-is.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900641
Tom Rini3c5f4152019-09-20 17:42:09 -0400642 The files are listed in the order they are source'd, starting with the
643 top-level Kconfig file. If a file is source'd multiple times, it will
644 appear multiple times. Use set() to get unique filenames.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900645
Tom Rini3c5f4152019-09-20 17:42:09 -0400646 Note that Kconfig.sync_deps() already indirectly catches any file
647 modifications that change configuration output.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900648
Tom Rini3c5f4152019-09-20 17:42:09 -0400649 env_vars:
650 A set() with the names of all environment variables referenced in the
651 Kconfig files.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900652
Tom Rini3c5f4152019-09-20 17:42:09 -0400653 Only environment variables referenced with the preprocessor $(FOO) syntax
654 will be registered. The older $FOO syntax is only supported for backwards
655 compatibility.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900656
Tom Rini3c5f4152019-09-20 17:42:09 -0400657 Also note that $(FOO) won't be registered unless the environment variable
658 $FOO is actually set. If it isn't, $(FOO) is an expansion of an unset
659 preprocessor variable (which gives the empty string).
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900660
Tom Rini3c5f4152019-09-20 17:42:09 -0400661 Another gotcha is that environment variables referenced in the values of
662 recursively expanded preprocessor variables (those defined with =) will
663 only be registered if the variable is actually used (expanded) somewhere.
Masahiro Yamada48386dd2015-05-27 11:39:22 +0900664
Tom Rini3c5f4152019-09-20 17:42:09 -0400665 The note from the 'kconfig_filenames' documentation applies here too.
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200666
Tom Rini3c5f4152019-09-20 17:42:09 -0400667 n/m/y:
668 The predefined constant symbols n/m/y. Also available in const_syms.
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200669
Tom Rini3c5f4152019-09-20 17:42:09 -0400670 modules:
671 The Symbol instance for the modules symbol. Currently hardcoded to
672 MODULES, which is backwards compatible. Kconfiglib will warn if
673 'option modules' is set on some other symbol. Tell me if you need proper
674 'option modules' support.
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200675
Tom Rini3c5f4152019-09-20 17:42:09 -0400676 'modules' is never None. If the MODULES symbol is not explicitly defined,
677 its tri_value will be 0 (n), as expected.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900678
Tom Rini3c5f4152019-09-20 17:42:09 -0400679 A simple way to enable modules is to do 'kconf.modules.set_value(2)'
680 (provided the MODULES symbol is defined and visible). Modules are
681 disabled by default in the kernel Kconfig files as of writing, though
682 nearly all defconfig files enable them (with 'CONFIG_MODULES=y').
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900683
Tom Rini3c5f4152019-09-20 17:42:09 -0400684 defconfig_list:
685 The Symbol instance for the 'option defconfig_list' symbol, or None if no
686 defconfig_list symbol exists. The defconfig filename derived from this
687 symbol can be found in Kconfig.defconfig_filename.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900688
Tom Rini3c5f4152019-09-20 17:42:09 -0400689 defconfig_filename:
690 The filename given by the defconfig_list symbol. This is taken from the
691 first 'default' with a satisfied condition where the specified file
692 exists (can be opened for reading). If a defconfig file foo/defconfig is
693 not found and $srctree was set when the Kconfig was created,
694 $srctree/foo/defconfig is looked up as well.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900695
Tom Rini3c5f4152019-09-20 17:42:09 -0400696 'defconfig_filename' is None if either no defconfig_list symbol exists,
697 or if the defconfig_list symbol has no 'default' with a satisfied
698 condition that specifies a file that exists.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900699
Tom Rini3c5f4152019-09-20 17:42:09 -0400700 Gotcha: scripts/kconfig/Makefile might pass --defconfig=<defconfig> to
701 scripts/kconfig/conf when running e.g. 'make defconfig'. This option
702 overrides the defconfig_list symbol, meaning defconfig_filename might not
703 always match what 'make defconfig' would use.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900704
Tom Rini3c5f4152019-09-20 17:42:09 -0400705 top_node:
706 The menu node (see the MenuNode class) of the implicit top-level menu.
707 Acts as the root of the menu tree.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900708
Tom Rini3c5f4152019-09-20 17:42:09 -0400709 mainmenu_text:
710 The prompt (title) of the top menu (top_node). Defaults to "Main menu".
711 Can be changed with the 'mainmenu' statement (see kconfig-language.txt).
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900712
Tom Rini3c5f4152019-09-20 17:42:09 -0400713 variables:
714 A dictionary with all preprocessor variables, indexed by name. See the
715 Variable class.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900716
Tom Rini3c5f4152019-09-20 17:42:09 -0400717 warn:
718 Set this variable to True/False to enable/disable warnings. See
719 Kconfig.__init__().
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900720
Tom Rini3c5f4152019-09-20 17:42:09 -0400721 When 'warn' is False, the values of the other warning-related variables
722 are ignored.
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200723
Tom Rini3c5f4152019-09-20 17:42:09 -0400724 This variable as well as the other warn* variables can be read to check
725 the current warning settings.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900726
Tom Rini3c5f4152019-09-20 17:42:09 -0400727 warn_to_stderr:
728 Set this variable to True/False to enable/disable warnings on stderr. See
729 Kconfig.__init__().
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900730
Tom Rini3c5f4152019-09-20 17:42:09 -0400731 warn_assign_undef:
732 Set this variable to True to generate warnings for assignments to
733 undefined symbols in configuration files.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900734
Tom Rini3c5f4152019-09-20 17:42:09 -0400735 This variable is False by default unless the KCONFIG_WARN_UNDEF_ASSIGN
736 environment variable was set to 'y' when the Kconfig instance was
737 created.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900738
Tom Rini3c5f4152019-09-20 17:42:09 -0400739 warn_assign_override:
740 Set this variable to True to generate warnings for multiple assignments
741 to the same symbol in configuration files, where the assignments set
742 different values (e.g. CONFIG_FOO=m followed by CONFIG_FOO=y, where the
743 last value would get used).
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900744
Tom Rini3c5f4152019-09-20 17:42:09 -0400745 This variable is True by default. Disabling it might be useful when
746 merging configurations.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900747
Tom Rini3c5f4152019-09-20 17:42:09 -0400748 warn_assign_redun:
749 Like warn_assign_override, but for multiple assignments setting a symbol
750 to the same value.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900751
Tom Rini3c5f4152019-09-20 17:42:09 -0400752 This variable is True by default. Disabling it might be useful when
753 merging configurations.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900754
Tom Rini3c5f4152019-09-20 17:42:09 -0400755 warnings:
756 A list of strings containing all warnings that have been generated, for
757 cases where more flexibility is needed.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900758
Tom Rini3c5f4152019-09-20 17:42:09 -0400759 See the 'warn_to_stderr' parameter to Kconfig.__init__() and the
760 Kconfig.warn_to_stderr variable as well. Note that warnings still get
761 added to Kconfig.warnings when 'warn_to_stderr' is True.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900762
Tom Rini3c5f4152019-09-20 17:42:09 -0400763 Just as for warnings printed to stderr, only warnings that are enabled
764 will get added to Kconfig.warnings. See the various Kconfig.warn*
765 variables.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900766
Tom Rini3c5f4152019-09-20 17:42:09 -0400767 missing_syms:
768 A list with (name, value) tuples for all assignments to undefined symbols
769 within the most recently loaded .config file(s). 'name' is the symbol
770 name without the 'CONFIG_' prefix. 'value' is a string that gives the
771 right-hand side of the assignment verbatim.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900772
Tom Rini3c5f4152019-09-20 17:42:09 -0400773 See Kconfig.load_config() as well.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900774
Tom Rini3c5f4152019-09-20 17:42:09 -0400775 srctree:
776 The value of the $srctree environment variable when the configuration was
777 loaded, or the empty string if $srctree wasn't set. This gives nice
778 behavior with os.path.join(), which treats "" as the current directory,
779 without adding "./".
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900780
Tom Rini3c5f4152019-09-20 17:42:09 -0400781 Kconfig files are looked up relative to $srctree (unless absolute paths
782 are used), and .config files are looked up relative to $srctree if they
783 are not found in the current directory. This is used to support
784 out-of-tree builds. The C tools use this environment variable in the same
785 way.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900786
Tom Rini3c5f4152019-09-20 17:42:09 -0400787 Changing $srctree after creating the Kconfig instance has no effect. Only
788 the value when the configuration is loaded matters. This avoids surprises
789 if multiple configurations are loaded with different values for $srctree.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900790
Tom Rini3c5f4152019-09-20 17:42:09 -0400791 config_prefix:
792 The value of the $CONFIG_ environment variable when the configuration was
793 loaded. This is the prefix used (and expected) on symbol names in .config
794 files and C headers. Defaults to "CONFIG_". Used in the same way in the C
795 tools.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900796
Tom Rini3c5f4152019-09-20 17:42:09 -0400797 Like for srctree, only the value of $CONFIG_ when the configuration is
798 loaded matters.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900799
Tom Rini3c5f4152019-09-20 17:42:09 -0400800 filename/linenr:
801 The current parsing location, for use in Python preprocessor functions.
802 See the module docstring.
803 """
804 __slots__ = (
805 "_encoding",
806 "_functions",
807 "_set_match",
808 "_srctree_prefix",
809 "_unset_match",
810 "_warn_assign_no_prompt",
811 "choices",
812 "comments",
813 "config_prefix",
814 "const_syms",
815 "defconfig_list",
816 "defined_syms",
817 "env_vars",
818 "kconfig_filenames",
819 "m",
820 "menus",
821 "missing_syms",
822 "modules",
823 "n",
824 "named_choices",
825 "srctree",
826 "syms",
827 "top_node",
828 "unique_choices",
829 "unique_defined_syms",
830 "variables",
831 "warn",
832 "warn_assign_override",
833 "warn_assign_redun",
834 "warn_assign_undef",
835 "warn_to_stderr",
836 "warnings",
837 "y",
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900838
Tom Rini3c5f4152019-09-20 17:42:09 -0400839 # Parsing-related
840 "_parsing_kconfigs",
841 "_readline",
842 "filename",
843 "linenr",
844 "_include_path",
845 "_filestack",
846 "_line",
847 "_tokens",
848 "_tokens_i",
849 "_reuse_tokens",
850 )
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900851
Tom Rini3c5f4152019-09-20 17:42:09 -0400852 #
853 # Public interface
854 #
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900855
Tom Rini3c5f4152019-09-20 17:42:09 -0400856 def __init__(self, filename="Kconfig", warn=True, warn_to_stderr=True,
857 encoding="utf-8"):
858 """
859 Creates a new Kconfig object by parsing Kconfig files.
860 Note that Kconfig files are not the same as .config files (which store
861 configuration symbol values).
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900862
Tom Rini3c5f4152019-09-20 17:42:09 -0400863 See the module docstring for some environment variables that influence
864 default warning settings (KCONFIG_WARN_UNDEF and
865 KCONFIG_WARN_UNDEF_ASSIGN).
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900866
Tom Rini3c5f4152019-09-20 17:42:09 -0400867 Raises KconfigError on syntax/semantic errors, and OSError or (possibly
868 a subclass of) IOError on IO errors ('errno', 'strerror', and
869 'filename' are available). Note that IOError is an alias for OSError on
870 Python 3, so it's enough to catch OSError there. If you need Python 2/3
871 compatibility, it's easiest to catch EnvironmentError, which is a
872 common base class of OSError/IOError on Python 2 and an alias for
873 OSError on Python 3.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900874
Tom Rini3c5f4152019-09-20 17:42:09 -0400875 filename (default: "Kconfig"):
876 The Kconfig file to load. For the Linux kernel, you'll want "Kconfig"
877 from the top-level directory, as environment variables will make sure
878 the right Kconfig is included from there (arch/$SRCARCH/Kconfig as of
879 writing).
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900880
Tom Rini3c5f4152019-09-20 17:42:09 -0400881 If $srctree is set, 'filename' will be looked up relative to it.
882 $srctree is also used to look up source'd files within Kconfig files.
883 See the class documentation.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900884
Tom Rini3c5f4152019-09-20 17:42:09 -0400885 If you are using Kconfiglib via 'make scriptconfig', the filename of
886 the base base Kconfig file will be in sys.argv[1]. It's currently
887 always "Kconfig" in practice.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900888
Tom Rini3c5f4152019-09-20 17:42:09 -0400889 warn (default: True):
890 True if warnings related to this configuration should be generated.
891 This can be changed later by setting Kconfig.warn to True/False. It
892 is provided as a constructor argument since warnings might be
893 generated during parsing.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900894
Tom Rini3c5f4152019-09-20 17:42:09 -0400895 See the other Kconfig.warn_* variables as well, which enable or
896 suppress certain warnings when warnings are enabled.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900897
Tom Rini3c5f4152019-09-20 17:42:09 -0400898 All generated warnings are added to the Kconfig.warnings list. See
899 the class documentation.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900900
Tom Rini3c5f4152019-09-20 17:42:09 -0400901 warn_to_stderr (default: True):
902 True if warnings should be printed to stderr in addition to being
903 added to Kconfig.warnings.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900904
Tom Rini3c5f4152019-09-20 17:42:09 -0400905 This can be changed later by setting Kconfig.warn_to_stderr to
906 True/False.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900907
Tom Rini3c5f4152019-09-20 17:42:09 -0400908 encoding (default: "utf-8"):
909 The encoding to use when reading and writing files, and when decoding
910 output from commands run via $(shell). If None, the encoding
911 specified in the current locale will be used.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900912
Tom Rini3c5f4152019-09-20 17:42:09 -0400913 The "utf-8" default avoids exceptions on systems that are configured
914 to use the C locale, which implies an ASCII encoding.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900915
Tom Rini3c5f4152019-09-20 17:42:09 -0400916 This parameter has no effect on Python 2, due to implementation
917 issues (regular strings turning into Unicode strings, which are
918 distinct in Python 2). Python 2 doesn't decode regular strings
919 anyway.
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900920
Tom Rini3c5f4152019-09-20 17:42:09 -0400921 Related PEP: https://www.python.org/dev/peps/pep-0538/
922 """
923 self._encoding = encoding
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900924
Tom Rini3c5f4152019-09-20 17:42:09 -0400925 self.srctree = os.getenv("srctree", "")
926 # A prefix we can reliably strip from glob() results to get a filename
927 # relative to $srctree. relpath() can cause issues for symlinks,
928 # because it assumes symlink/../foo is the same as foo/.
929 self._srctree_prefix = realpath(self.srctree) + os.sep
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900930
Tom Rini3c5f4152019-09-20 17:42:09 -0400931 self.warn = warn
932 self.warn_to_stderr = warn_to_stderr
933 self.warn_assign_undef = os.getenv("KCONFIG_WARN_UNDEF_ASSIGN") == "y"
934 self.warn_assign_override = True
935 self.warn_assign_redun = True
936 self._warn_assign_no_prompt = True
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900937
Tom Rini3c5f4152019-09-20 17:42:09 -0400938 self.warnings = []
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900939
Tom Rini3c5f4152019-09-20 17:42:09 -0400940 self.config_prefix = os.getenv("CONFIG_", "CONFIG_")
941 # Regular expressions for parsing .config files
942 self._set_match = _re_match(self.config_prefix + r"([^=]+)=(.*)")
943 self._unset_match = _re_match(r"# {}([^ ]+) is not set".format(
944 self.config_prefix))
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900945
Tom Rini3c5f4152019-09-20 17:42:09 -0400946 self.syms = {}
947 self.const_syms = {}
948 self.defined_syms = []
949 self.missing_syms = []
950 self.named_choices = {}
951 self.choices = []
952 self.menus = []
953 self.comments = []
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900954
Tom Rini3c5f4152019-09-20 17:42:09 -0400955 for nmy in "n", "m", "y":
956 sym = Symbol()
957 sym.kconfig = self
958 sym.name = nmy
959 sym.is_constant = True
960 sym.orig_type = TRISTATE
961 sym._cached_tri_val = STR_TO_TRI[nmy]
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900962
Tom Rini3c5f4152019-09-20 17:42:09 -0400963 self.const_syms[nmy] = sym
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900964
Tom Rini3c5f4152019-09-20 17:42:09 -0400965 self.n = self.const_syms["n"]
966 self.m = self.const_syms["m"]
967 self.y = self.const_syms["y"]
Masahiro Yamadac908bc82014-09-01 19:57:37 +0900968
Tom Rini3c5f4152019-09-20 17:42:09 -0400969 # Make n/m/y well-formed symbols
970 for nmy in "n", "m", "y":
971 sym = self.const_syms[nmy]
972 sym.rev_dep = sym.weak_rev_dep = sym.direct_dep = self.n
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200973
Tom Rini3c5f4152019-09-20 17:42:09 -0400974 # Maps preprocessor variables names to Variable instances
975 self.variables = {}
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200976
Tom Rini3c5f4152019-09-20 17:42:09 -0400977 # Predefined preprocessor functions, with min/max number of arguments
978 self._functions = {
979 "info": (_info_fn, 1, 1),
980 "error-if": (_error_if_fn, 2, 2),
981 "filename": (_filename_fn, 0, 0),
982 "lineno": (_lineno_fn, 0, 0),
983 "shell": (_shell_fn, 1, 1),
984 "warning-if": (_warning_if_fn, 2, 2),
985 }
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200986
Tom Rini3c5f4152019-09-20 17:42:09 -0400987 # Add any user-defined preprocessor functions
988 try:
989 self._functions.update(
990 importlib.import_module(
991 os.getenv("KCONFIG_FUNCTIONS", "kconfigfunctions")
992 ).functions)
993 except ImportError:
994 pass
Ulf Magnusson1e642d72015-08-13 19:55:40 +0200995
Tom Rini3c5f4152019-09-20 17:42:09 -0400996 # This determines whether previously unseen symbols are registered.
997 # They shouldn't be if we parse expressions after parsing, as part of
998 # Kconfig.eval_string().
999 self._parsing_kconfigs = True
Ulf Magnusson1e642d72015-08-13 19:55:40 +02001000
Tom Rini3c5f4152019-09-20 17:42:09 -04001001 self.modules = self._lookup_sym("MODULES")
1002 self.defconfig_list = None
Ulf Magnusson1e642d72015-08-13 19:55:40 +02001003
Tom Rini3c5f4152019-09-20 17:42:09 -04001004 self.top_node = MenuNode()
1005 self.top_node.kconfig = self
1006 self.top_node.item = MENU
1007 self.top_node.is_menuconfig = True
1008 self.top_node.visibility = self.y
1009 self.top_node.prompt = ("Main menu", self.y)
1010 self.top_node.parent = None
1011 self.top_node.dep = self.y
1012 self.top_node.filename = filename
1013 self.top_node.linenr = 1
1014 self.top_node.include_path = ()
Ulf Magnusson1e642d72015-08-13 19:55:40 +02001015
Tom Rini3c5f4152019-09-20 17:42:09 -04001016 # Parse the Kconfig files
Ulf Magnusson1e642d72015-08-13 19:55:40 +02001017
Tom Rini3c5f4152019-09-20 17:42:09 -04001018 # Not used internally. Provided as a convenience.
1019 self.kconfig_filenames = [filename]
1020 self.env_vars = set()
Ulf Magnusson1e642d72015-08-13 19:55:40 +02001021
Tom Rini3c5f4152019-09-20 17:42:09 -04001022 # Keeps track of the location in the parent Kconfig files. Kconfig
1023 # files usually source other Kconfig files. See _enter_file().
1024 self._filestack = []
1025 self._include_path = ()
Ulf Magnusson1e642d72015-08-13 19:55:40 +02001026
Tom Rini3c5f4152019-09-20 17:42:09 -04001027 # The current parsing location
1028 self.filename = filename
1029 self.linenr = 0
Ulf Magnusson1e642d72015-08-13 19:55:40 +02001030
Tom Rini3c5f4152019-09-20 17:42:09 -04001031 # Used to avoid retokenizing lines when we discover that they're not
1032 # part of the construct currently being parsed. This is kinda like an
1033 # unget operation.
1034 self._reuse_tokens = False
Ulf Magnusson1e642d72015-08-13 19:55:40 +02001035
Tom Rini3c5f4152019-09-20 17:42:09 -04001036 # Open the top-level Kconfig file. Store the readline() method directly
1037 # as a small optimization.
1038 self._readline = self._open(join(self.srctree, filename), "r").readline
Ulf Magnusson1e642d72015-08-13 19:55:40 +02001039
Tom Rini3c5f4152019-09-20 17:42:09 -04001040 try:
1041 # Parse the Kconfig files
1042 self._parse_block(None, self.top_node, self.top_node)
1043 self.top_node.list = self.top_node.next
1044 self.top_node.next = None
1045 except UnicodeDecodeError as e:
1046 _decoding_error(e, self.filename)
Ulf Magnusson1e642d72015-08-13 19:55:40 +02001047
Tom Rini3c5f4152019-09-20 17:42:09 -04001048 # Close the top-level Kconfig file. __self__ fetches the 'file' object
1049 # for the method.
1050 self._readline.__self__.close()
Ulf Magnusson1e642d72015-08-13 19:55:40 +02001051
Tom Rini3c5f4152019-09-20 17:42:09 -04001052 self._parsing_kconfigs = False
Ulf Magnusson1e642d72015-08-13 19:55:40 +02001053
Tom Rini3c5f4152019-09-20 17:42:09 -04001054 # Do various menu tree post-processing
1055 self._finalize_node(self.top_node, self.y)
Ulf Magnusson1e642d72015-08-13 19:55:40 +02001056
Tom Rini3c5f4152019-09-20 17:42:09 -04001057 self.unique_defined_syms = _ordered_unique(self.defined_syms)
1058 self.unique_choices = _ordered_unique(self.choices)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001059
Tom Rini3c5f4152019-09-20 17:42:09 -04001060 # Do sanity checks. Some of these depend on everything being finalized.
1061 self._check_sym_sanity()
1062 self._check_choice_sanity()
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001063
Tom Rini3c5f4152019-09-20 17:42:09 -04001064 # KCONFIG_STRICT is an older alias for KCONFIG_WARN_UNDEF, supported
1065 # for backwards compatibility
1066 if os.getenv("KCONFIG_WARN_UNDEF") == "y" or \
1067 os.getenv("KCONFIG_STRICT") == "y":
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001068
Tom Rini3c5f4152019-09-20 17:42:09 -04001069 self._check_undef_syms()
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001070
Tom Rini3c5f4152019-09-20 17:42:09 -04001071 # Build Symbol._dependents for all symbols and choices
1072 self._build_dep()
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001073
Tom Rini3c5f4152019-09-20 17:42:09 -04001074 # Check for dependency loops
1075 check_dep_loop_sym = _check_dep_loop_sym # Micro-optimization
1076 for sym in self.unique_defined_syms:
1077 check_dep_loop_sym(sym, False)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001078
Tom Rini3c5f4152019-09-20 17:42:09 -04001079 # Add extra dependencies from choices to choice symbols that get
1080 # awkward during dependency loop detection
1081 self._add_choice_deps()
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001082
Tom Rini3c5f4152019-09-20 17:42:09 -04001083 @property
1084 def mainmenu_text(self):
1085 """
1086 See the class documentation.
1087 """
1088 return self.top_node.prompt[0]
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001089
Tom Rini3c5f4152019-09-20 17:42:09 -04001090 @property
1091 def defconfig_filename(self):
1092 """
1093 See the class documentation.
1094 """
1095 if self.defconfig_list:
1096 for filename, cond in self.defconfig_list.defaults:
1097 if expr_value(cond):
1098 try:
1099 with self._open_config(filename.str_value) as f:
1100 return f.name
1101 except EnvironmentError:
1102 continue
Ulf Magnusson1e642d72015-08-13 19:55:40 +02001103
Tom Rini3c5f4152019-09-20 17:42:09 -04001104 return None
Ulf Magnusson1e642d72015-08-13 19:55:40 +02001105
Tom Rini3c5f4152019-09-20 17:42:09 -04001106 def load_config(self, filename=None, replace=True, verbose=None):
1107 """
1108 Loads symbol values from a file in the .config format. Equivalent to
1109 calling Symbol.set_value() to set each of the values.
Ulf Magnusson1e642d72015-08-13 19:55:40 +02001110
Tom Rini3c5f4152019-09-20 17:42:09 -04001111 "# CONFIG_FOO is not set" within a .config file sets the user value of
1112 FOO to n. The C tools work the same way.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001113
Tom Rini3c5f4152019-09-20 17:42:09 -04001114 For each symbol, the Symbol.user_value attribute holds the value the
1115 symbol was assigned in the .config file (if any). The user value might
1116 differ from Symbol.str/tri_value if there are unsatisfied dependencies.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001117
Tom Rini3c5f4152019-09-20 17:42:09 -04001118 Calling this function also updates the Kconfig.missing_syms attribute
1119 with a list of all assignments to undefined symbols within the
1120 configuration file. Kconfig.missing_syms is cleared if 'replace' is
1121 True, and appended to otherwise. See the documentation for
1122 Kconfig.missing_syms as well.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001123
Tom Rini3c5f4152019-09-20 17:42:09 -04001124 See the Kconfig.__init__() docstring for raised exceptions
1125 (OSError/IOError). KconfigError is never raised here.
Ulf Magnusson1e642d72015-08-13 19:55:40 +02001126
Tom Rini3c5f4152019-09-20 17:42:09 -04001127 filename (default: None):
1128 Path to load configuration from (a string). Respects $srctree if set
1129 (see the class documentation).
Ulf Magnusson1e642d72015-08-13 19:55:40 +02001130
Tom Rini3c5f4152019-09-20 17:42:09 -04001131 If 'filename' is None (the default), the configuration file to load
1132 (if any) is calculated automatically, giving the behavior you'd
1133 usually want:
Ulf Magnusson1e642d72015-08-13 19:55:40 +02001134
Tom Rini3c5f4152019-09-20 17:42:09 -04001135 1. If the KCONFIG_CONFIG environment variable is set, it gives the
1136 path to the configuration file to load. Otherwise, ".config" is
1137 used. See standard_config_filename().
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001138
Tom Rini3c5f4152019-09-20 17:42:09 -04001139 2. If the path from (1.) doesn't exist, the configuration file
1140 given by kconf.defconfig_filename is loaded instead, which is
1141 derived from the 'option defconfig_list' symbol.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001142
Tom Rini3c5f4152019-09-20 17:42:09 -04001143 3. If (1.) and (2.) fail to find a configuration file to load, no
1144 configuration file is loaded, and symbols retain their current
1145 values (e.g., their default values). This is not an error.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001146
Tom Rini3c5f4152019-09-20 17:42:09 -04001147 See the return value as well.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001148
Tom Rini3c5f4152019-09-20 17:42:09 -04001149 replace (default: True):
1150 If True, all existing user values will be cleared before loading the
1151 .config. Pass False to merge configurations.
Ulf Magnusson1e642d72015-08-13 19:55:40 +02001152
Tom Rini3c5f4152019-09-20 17:42:09 -04001153 verbose (default: None):
1154 Limited backwards compatibility to prevent crashes. A warning is
1155 printed if anything but None is passed.
Ulf Magnusson1e642d72015-08-13 19:55:40 +02001156
Tom Rini3c5f4152019-09-20 17:42:09 -04001157 Prior to Kconfiglib 12.0.0, this option enabled printing of messages
1158 to stdout when 'filename' was None. A message is (always) returned
1159 now instead, which is more flexible.
Ulf Magnusson1e642d72015-08-13 19:55:40 +02001160
Tom Rini3c5f4152019-09-20 17:42:09 -04001161 Will probably be removed in some future version.
Ulf Magnusson1e642d72015-08-13 19:55:40 +02001162
Tom Rini3c5f4152019-09-20 17:42:09 -04001163 Returns a string with a message saying which file got loaded (or
1164 possibly that no file got loaded, when 'filename' is None). This is
1165 meant to reduce boilerplate in tools, which can do e.g.
1166 print(kconf.load_config()). The returned message distinguishes between
1167 loading (replace == True) and merging (replace == False).
1168 """
1169 if verbose is not None:
1170 _warn_verbose_deprecated("load_config")
Ulf Magnusson1e642d72015-08-13 19:55:40 +02001171
Tom Rini3c5f4152019-09-20 17:42:09 -04001172 msg = None
1173 if filename is None:
1174 filename = standard_config_filename()
1175 if not exists(filename) and \
1176 not exists(join(self.srctree, filename)):
1177 defconfig = self.defconfig_filename
1178 if defconfig is None:
1179 return "Using default symbol values (no '{}')" \
1180 .format(filename)
Ulf Magnusson1e642d72015-08-13 19:55:40 +02001181
Tom Rini3c5f4152019-09-20 17:42:09 -04001182 msg = " default configuration '{}' (no '{}')" \
1183 .format(defconfig, filename)
1184 filename = defconfig
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001185
Tom Rini3c5f4152019-09-20 17:42:09 -04001186 if not msg:
1187 msg = " configuration '{}'".format(filename)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001188
Tom Rini3c5f4152019-09-20 17:42:09 -04001189 # Disable the warning about assigning to symbols without prompts. This
1190 # is normal and expected within a .config file.
1191 self._warn_assign_no_prompt = False
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001192
Tom Rini3c5f4152019-09-20 17:42:09 -04001193 # This stub only exists to make sure _warn_assign_no_prompt gets
1194 # reenabled
1195 try:
1196 self._load_config(filename, replace)
1197 except UnicodeDecodeError as e:
1198 _decoding_error(e, filename)
1199 finally:
1200 self._warn_assign_no_prompt = True
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001201
Tom Rini3c5f4152019-09-20 17:42:09 -04001202 return ("Loaded" if replace else "Merged") + msg
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001203
Tom Rini3c5f4152019-09-20 17:42:09 -04001204 def _load_config(self, filename, replace):
1205 with self._open_config(filename) as f:
1206 if replace:
1207 self.missing_syms = []
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001208
Tom Rini3c5f4152019-09-20 17:42:09 -04001209 # If we're replacing the configuration, keep track of which
1210 # symbols and choices got set so that we can unset the rest
1211 # later. This avoids invalidating everything and is faster.
1212 # Another benefit is that invalidation must be rock solid for
1213 # it to work, making it a good test.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001214
Tom Rini3c5f4152019-09-20 17:42:09 -04001215 for sym in self.unique_defined_syms:
1216 sym._was_set = False
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001217
Tom Rini3c5f4152019-09-20 17:42:09 -04001218 for choice in self.unique_choices:
1219 choice._was_set = False
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001220
Tom Rini3c5f4152019-09-20 17:42:09 -04001221 # Small optimizations
1222 set_match = self._set_match
1223 unset_match = self._unset_match
1224 get_sym = self.syms.get
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001225
Tom Rini3c5f4152019-09-20 17:42:09 -04001226 for linenr, line in enumerate(f, 1):
1227 # The C tools ignore trailing whitespace
1228 line = line.rstrip()
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001229
Tom Rini3c5f4152019-09-20 17:42:09 -04001230 match = set_match(line)
1231 if match:
1232 name, val = match.groups()
1233 sym = get_sym(name)
1234 if not sym or not sym.nodes:
1235 self._undef_assign(name, val, filename, linenr)
1236 continue
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001237
Tom Rini3c5f4152019-09-20 17:42:09 -04001238 if sym.orig_type in _BOOL_TRISTATE:
1239 # The C implementation only checks the first character
1240 # to the right of '=', for whatever reason
1241 if not (sym.orig_type is BOOL
1242 and val.startswith(("y", "n")) or
1243 sym.orig_type is TRISTATE
1244 and val.startswith(("y", "m", "n"))):
1245 self._warn("'{}' is not a valid value for the {} "
1246 "symbol {}. Assignment ignored."
1247 .format(val, TYPE_TO_STR[sym.orig_type],
1248 _name_and_loc(sym)),
1249 filename, linenr)
1250 continue
Ulf Magnusson1682e052017-09-19 12:52:55 +02001251
Tom Rini3c5f4152019-09-20 17:42:09 -04001252 val = val[0]
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001253
Tom Rini3c5f4152019-09-20 17:42:09 -04001254 if sym.choice and val != "n":
1255 # During .config loading, we infer the mode of the
1256 # choice from the kind of values that are assigned
1257 # to the choice symbols
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001258
Tom Rini3c5f4152019-09-20 17:42:09 -04001259 prev_mode = sym.choice.user_value
1260 if prev_mode is not None and \
1261 TRI_TO_STR[prev_mode] != val:
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001262
Tom Rini3c5f4152019-09-20 17:42:09 -04001263 self._warn("both m and y assigned to symbols "
1264 "within the same choice",
1265 filename, linenr)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001266
Tom Rini3c5f4152019-09-20 17:42:09 -04001267 # Set the choice's mode
1268 sym.choice.set_value(val)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001269
Tom Rini3c5f4152019-09-20 17:42:09 -04001270 elif sym.orig_type is STRING:
1271 match = _conf_string_match(val)
1272 if not match:
1273 self._warn("malformed string literal in "
1274 "assignment to {}. Assignment ignored."
1275 .format(_name_and_loc(sym)),
1276 filename, linenr)
1277 continue
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001278
Tom Rini3c5f4152019-09-20 17:42:09 -04001279 val = unescape(match.group(1))
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001280
Tom Rini3c5f4152019-09-20 17:42:09 -04001281 else:
1282 match = unset_match(line)
1283 if not match:
1284 # Print a warning for lines that match neither
1285 # set_match() nor unset_match() and that are not blank
1286 # lines or comments. 'line' has already been
1287 # rstrip()'d, so blank lines show up as "" here.
1288 if line and not line.lstrip().startswith("#"):
1289 self._warn("ignoring malformed line '{}'"
1290 .format(line),
1291 filename, linenr)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001292
Tom Rini3c5f4152019-09-20 17:42:09 -04001293 continue
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001294
Tom Rini3c5f4152019-09-20 17:42:09 -04001295 name = match.group(1)
1296 sym = get_sym(name)
1297 if not sym or not sym.nodes:
1298 self._undef_assign(name, "n", filename, linenr)
1299 continue
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001300
Tom Rini3c5f4152019-09-20 17:42:09 -04001301 if sym.orig_type not in _BOOL_TRISTATE:
1302 continue
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001303
Tom Rini3c5f4152019-09-20 17:42:09 -04001304 val = "n"
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001305
Tom Rini3c5f4152019-09-20 17:42:09 -04001306 # Done parsing the assignment. Set the value.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001307
Tom Rini3c5f4152019-09-20 17:42:09 -04001308 if sym._was_set:
1309 self._assigned_twice(sym, val, filename, linenr)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001310
Tom Rini3c5f4152019-09-20 17:42:09 -04001311 sym.set_value(val)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001312
Tom Rini3c5f4152019-09-20 17:42:09 -04001313 if replace:
1314 # If we're replacing the configuration, unset the symbols that
1315 # didn't get set
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001316
Tom Rini3c5f4152019-09-20 17:42:09 -04001317 for sym in self.unique_defined_syms:
1318 if not sym._was_set:
1319 sym.unset_value()
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001320
Tom Rini3c5f4152019-09-20 17:42:09 -04001321 for choice in self.unique_choices:
1322 if not choice._was_set:
1323 choice.unset_value()
Ulf Magnusson1e642d72015-08-13 19:55:40 +02001324
Tom Rini3c5f4152019-09-20 17:42:09 -04001325 def _undef_assign(self, name, val, filename, linenr):
1326 # Called for assignments to undefined symbols during .config loading
Ulf Magnusson1e642d72015-08-13 19:55:40 +02001327
Tom Rini3c5f4152019-09-20 17:42:09 -04001328 self.missing_syms.append((name, val))
1329 if self.warn_assign_undef:
1330 self._warn(
1331 "attempt to assign the value '{}' to the undefined symbol {}"
1332 .format(val, name), filename, linenr)
Ulf Magnusson1e642d72015-08-13 19:55:40 +02001333
Tom Rini3c5f4152019-09-20 17:42:09 -04001334 def _assigned_twice(self, sym, new_val, filename, linenr):
1335 # Called when a symbol is assigned more than once in a .config file
Ulf Magnusson1e642d72015-08-13 19:55:40 +02001336
Tom Rini3c5f4152019-09-20 17:42:09 -04001337 # Use strings for bool/tristate user values in the warning
1338 if sym.orig_type in _BOOL_TRISTATE:
1339 user_val = TRI_TO_STR[sym.user_value]
1340 else:
1341 user_val = sym.user_value
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001342
Tom Rini3c5f4152019-09-20 17:42:09 -04001343 msg = '{} set more than once. Old value "{}", new value "{}".'.format(
1344 _name_and_loc(sym), user_val, new_val)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001345
Tom Rini3c5f4152019-09-20 17:42:09 -04001346 if user_val == new_val:
1347 if self.warn_assign_redun:
1348 self._warn(msg, filename, linenr)
1349 elif self.warn_assign_override:
1350 self._warn(msg, filename, linenr)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001351
Tom Rini3c5f4152019-09-20 17:42:09 -04001352 def write_autoconf(self, filename,
1353 header="/* Generated by Kconfiglib (https://github.com/ulfalizer/Kconfiglib) */\n"):
1354 r"""
1355 Writes out symbol values as a C header file, matching the format used
1356 by include/generated/autoconf.h in the kernel.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001357
Tom Rini3c5f4152019-09-20 17:42:09 -04001358 The ordering of the #defines matches the one generated by
1359 write_config(). The order in the C implementation depends on the hash
1360 table implementation as of writing, and so won't match.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001361
Tom Rini3c5f4152019-09-20 17:42:09 -04001362 If 'filename' exists and its contents is identical to what would get
1363 written out, it is left untouched. This avoids updating file metadata
1364 like the modification time and possibly triggering redundant work in
1365 build tools.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001366
Tom Rini3c5f4152019-09-20 17:42:09 -04001367 filename:
1368 Self-explanatory.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001369
Tom Rini3c5f4152019-09-20 17:42:09 -04001370 header (default: "/* Generated by Kconfiglib (https://github.com/ulfalizer/Kconfiglib) */\n"):
1371 Text that will be inserted verbatim at the beginning of the file. You
1372 would usually want it enclosed in '/* */' to make it a C comment,
1373 and include a final terminating newline.
Ulf Magnusson1e642d72015-08-13 19:55:40 +02001374 """
Tom Rini3c5f4152019-09-20 17:42:09 -04001375 self._write_if_changed(filename, self._autoconf_contents(header))
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001376
Tom Rini3c5f4152019-09-20 17:42:09 -04001377 def _autoconf_contents(self, header):
1378 # write_autoconf() helper. Returns the contents to write as a string,
1379 # with 'header' at the beginning.
Ulf Magnusson1e642d72015-08-13 19:55:40 +02001380
Tom Rini3c5f4152019-09-20 17:42:09 -04001381 # "".join()ed later
1382 chunks = [header]
1383 add = chunks.append
Ulf Magnusson1e642d72015-08-13 19:55:40 +02001384
Tom Rini3c5f4152019-09-20 17:42:09 -04001385 for sym in self.unique_defined_syms:
1386 # _write_to_conf is determined when the value is calculated. This
1387 # is a hidden function call due to property magic.
1388 #
1389 # Note: In client code, you can check if sym.config_string is empty
1390 # instead, to avoid accessing the internal _write_to_conf variable
1391 # (though it's likely to keep working).
1392 val = sym.str_value
1393 if not sym._write_to_conf:
1394 continue
Ulf Magnusson1e642d72015-08-13 19:55:40 +02001395
Tom Rini3c5f4152019-09-20 17:42:09 -04001396 if sym.orig_type in _BOOL_TRISTATE:
1397 if val == "y":
1398 add("#define {}{} 1\n"
1399 .format(self.config_prefix, sym.name))
1400 elif val == "m":
1401 add("#define {}{}_MODULE 1\n"
1402 .format(self.config_prefix, sym.name))
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001403
Tom Rini3c5f4152019-09-20 17:42:09 -04001404 elif sym.orig_type is STRING:
1405 add('#define {}{} "{}"\n'
1406 .format(self.config_prefix, sym.name, escape(val)))
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001407
Tom Rini3c5f4152019-09-20 17:42:09 -04001408 else: # sym.orig_type in _INT_HEX:
1409 if sym.orig_type is HEX and \
1410 not val.startswith(("0x", "0X")):
1411 val = "0x" + val
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001412
Tom Rini3c5f4152019-09-20 17:42:09 -04001413 add("#define {}{} {}\n"
1414 .format(self.config_prefix, sym.name, val))
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001415
Tom Rini3c5f4152019-09-20 17:42:09 -04001416 return "".join(chunks)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001417
Tom Rini3c5f4152019-09-20 17:42:09 -04001418 def write_config(self, filename=None,
1419 header="# Generated by Kconfiglib (https://github.com/ulfalizer/Kconfiglib)\n",
1420 save_old=True, verbose=None):
1421 r"""
1422 Writes out symbol values in the .config format. The format matches the
1423 C implementation, including ordering.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001424
Tom Rini3c5f4152019-09-20 17:42:09 -04001425 Symbols appear in the same order in generated .config files as they do
1426 in the Kconfig files. For symbols defined in multiple locations, a
1427 single assignment is written out corresponding to the first location
1428 where the symbol is defined.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001429
Tom Rini3c5f4152019-09-20 17:42:09 -04001430 See the 'Intro to symbol values' section in the module docstring to
1431 understand which symbols get written out.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001432
Tom Rini3c5f4152019-09-20 17:42:09 -04001433 If 'filename' exists and its contents is identical to what would get
1434 written out, it is left untouched. This avoids updating file metadata
1435 like the modification time and possibly triggering redundant work in
1436 build tools.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001437
Tom Rini3c5f4152019-09-20 17:42:09 -04001438 See the Kconfig.__init__() docstring for raised exceptions
1439 (OSError/IOError). KconfigError is never raised here.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001440
Tom Rini3c5f4152019-09-20 17:42:09 -04001441 filename (default: None):
1442 Filename to save configuration to (a string).
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001443
Tom Rini3c5f4152019-09-20 17:42:09 -04001444 If None (the default), the filename in the environment variable
1445 KCONFIG_CONFIG is used if set, and ".config" otherwise. See
1446 standard_config_filename().
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001447
Tom Rini3c5f4152019-09-20 17:42:09 -04001448 header (default: "# Generated by Kconfiglib (https://github.com/ulfalizer/Kconfiglib)\n"):
1449 Text that will be inserted verbatim at the beginning of the file. You
1450 would usually want each line to start with '#' to make it a comment,
1451 and include a final terminating newline.
Ulf Magnusson1682e052017-09-19 12:52:55 +02001452
Tom Rini3c5f4152019-09-20 17:42:09 -04001453 save_old (default: True):
1454 If True and <filename> already exists, a copy of it will be saved to
1455 <filename>.old in the same directory before the new configuration is
1456 written.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001457
Tom Rini3c5f4152019-09-20 17:42:09 -04001458 Errors are silently ignored if <filename>.old cannot be written (e.g.
1459 due to being a directory, or <filename> being something like
1460 /dev/null).
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001461
Tom Rini3c5f4152019-09-20 17:42:09 -04001462 verbose (default: None):
1463 Limited backwards compatibility to prevent crashes. A warning is
1464 printed if anything but None is passed.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001465
Tom Rini3c5f4152019-09-20 17:42:09 -04001466 Prior to Kconfiglib 12.0.0, this option enabled printing of messages
1467 to stdout when 'filename' was None. A message is (always) returned
1468 now instead, which is more flexible.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001469
Tom Rini3c5f4152019-09-20 17:42:09 -04001470 Will probably be removed in some future version.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001471
Tom Rini3c5f4152019-09-20 17:42:09 -04001472 Returns a string with a message saying which file got saved. This is
1473 meant to reduce boilerplate in tools, which can do e.g.
1474 print(kconf.write_config()).
1475 """
1476 if verbose is not None:
1477 _warn_verbose_deprecated("write_config")
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001478
Tom Rini3c5f4152019-09-20 17:42:09 -04001479 if filename is None:
1480 filename = standard_config_filename()
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001481
Tom Rini3c5f4152019-09-20 17:42:09 -04001482 contents = self._config_contents(header)
1483 if self._contents_eq(filename, contents):
1484 return "No change to '{}'".format(filename)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001485
Tom Rini3c5f4152019-09-20 17:42:09 -04001486 if save_old:
1487 _save_old(filename)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001488
Tom Rini3c5f4152019-09-20 17:42:09 -04001489 with self._open(filename, "w") as f:
1490 f.write(contents)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001491
Tom Rini3c5f4152019-09-20 17:42:09 -04001492 return "Configuration saved to '{}'".format(filename)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001493
Tom Rini3c5f4152019-09-20 17:42:09 -04001494 def _config_contents(self, header):
1495 # write_config() helper. Returns the contents to write as a string,
1496 # with 'header' at the beginning.
1497 #
1498 # More memory friendly would be to 'yield' the strings and
1499 # "".join(_config_contents()), but it was a bit slower on my system.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001500
Tom Rini3c5f4152019-09-20 17:42:09 -04001501 # node_iter() was used here before commit 3aea9f7 ("Add '# end of
1502 # <menu>' after menus in .config"). Those comments get tricky to
1503 # implement with it.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001504
Tom Rini3c5f4152019-09-20 17:42:09 -04001505 for sym in self.unique_defined_syms:
1506 sym._visited = False
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001507
Tom Rini3c5f4152019-09-20 17:42:09 -04001508 # Did we just print an '# end of ...' comment?
1509 after_end_comment = False
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001510
Tom Rini3c5f4152019-09-20 17:42:09 -04001511 # "".join()ed later
1512 chunks = [header]
1513 add = chunks.append
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001514
Tom Rini3c5f4152019-09-20 17:42:09 -04001515 node = self.top_node
1516 while 1:
1517 # Jump to the next node with an iterative tree walk
1518 if node.list:
1519 node = node.list
1520 elif node.next:
1521 node = node.next
1522 else:
1523 while node.parent:
1524 node = node.parent
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001525
Tom Rini3c5f4152019-09-20 17:42:09 -04001526 # Add a comment when leaving visible menus
1527 if node.item is MENU and expr_value(node.dep) and \
1528 expr_value(node.visibility) and \
1529 node is not self.top_node:
1530 add("# end of {}\n".format(node.prompt[0]))
1531 after_end_comment = True
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001532
Tom Rini3c5f4152019-09-20 17:42:09 -04001533 if node.next:
1534 node = node.next
1535 break
1536 else:
1537 # No more nodes
1538 return "".join(chunks)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001539
Tom Rini3c5f4152019-09-20 17:42:09 -04001540 # Generate configuration output for the node
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001541
Tom Rini3c5f4152019-09-20 17:42:09 -04001542 item = node.item
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001543
Tom Rini3c5f4152019-09-20 17:42:09 -04001544 if item.__class__ is Symbol:
1545 if item._visited:
1546 continue
1547 item._visited = True
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001548
Tom Rini3c5f4152019-09-20 17:42:09 -04001549 conf_string = item.config_string
1550 if not conf_string:
1551 continue
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001552
Tom Rini3c5f4152019-09-20 17:42:09 -04001553 if after_end_comment:
1554 # Add a blank line before the first symbol printed after an
1555 # '# end of ...' comment
1556 after_end_comment = False
1557 add("\n")
1558 add(conf_string)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001559
Tom Rini3c5f4152019-09-20 17:42:09 -04001560 elif expr_value(node.dep) and \
1561 ((item is MENU and expr_value(node.visibility)) or
1562 item is COMMENT):
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001563
Tom Rini3c5f4152019-09-20 17:42:09 -04001564 add("\n#\n# {}\n#\n".format(node.prompt[0]))
1565 after_end_comment = False
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001566
Tom Rini3c5f4152019-09-20 17:42:09 -04001567 def write_min_config(self, filename,
1568 header="# Generated by Kconfiglib (https://github.com/ulfalizer/Kconfiglib)\n"):
1569 """
1570 Writes out a "minimal" configuration file, omitting symbols whose value
1571 matches their default value. The format matches the one produced by
1572 'make savedefconfig'.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001573
Tom Rini3c5f4152019-09-20 17:42:09 -04001574 The resulting configuration file is incomplete, but a complete
1575 configuration can be derived from it by loading it. Minimal
1576 configuration files can serve as a more manageable configuration format
1577 compared to a "full" .config file, especially when configurations files
1578 are merged or edited by hand.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001579
Tom Rini3c5f4152019-09-20 17:42:09 -04001580 See the Kconfig.__init__() docstring for raised exceptions
1581 (OSError/IOError). KconfigError is never raised here.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001582
Tom Rini3c5f4152019-09-20 17:42:09 -04001583 filename:
1584 Self-explanatory.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001585
Tom Rini3c5f4152019-09-20 17:42:09 -04001586 header (default: "# Generated by Kconfiglib (https://github.com/ulfalizer/Kconfiglib)\n"):
1587 Text that will be inserted verbatim at the beginning of the file. You
1588 would usually want each line to start with '#' to make it a comment,
1589 and include a final terminating newline.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001590
Tom Rini3c5f4152019-09-20 17:42:09 -04001591 Returns a string with a message saying which file got saved. This is
1592 meant to reduce boilerplate in tools, which can do e.g.
1593 print(kconf.write_min_config()).
1594 """
1595 contents = self._min_config_contents(header)
1596 if self._contents_eq(filename, contents):
1597 return "No change to '{}'".format(filename)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001598
Tom Rini3c5f4152019-09-20 17:42:09 -04001599 with self._open(filename, "w") as f:
1600 f.write(contents)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001601
Tom Rini3c5f4152019-09-20 17:42:09 -04001602 return "Minimal configuration saved to '{}'".format(filename)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001603
Tom Rini3c5f4152019-09-20 17:42:09 -04001604 def _min_config_contents(self, header):
1605 # write_min_config() helper. Returns the contents to write as a string,
1606 # with 'header' at the beginning.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001607
Tom Rini3c5f4152019-09-20 17:42:09 -04001608 chunks = [header]
1609 add = chunks.append
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001610
Tom Rini3c5f4152019-09-20 17:42:09 -04001611 for sym in self.unique_defined_syms:
1612 # Skip symbols that cannot be changed. Only check
1613 # non-choice symbols, as selects don't affect choice
1614 # symbols.
1615 if not sym.choice and \
1616 sym.visibility <= expr_value(sym.rev_dep):
1617 continue
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001618
Tom Rini3c5f4152019-09-20 17:42:09 -04001619 # Skip symbols whose value matches their default
1620 if sym.str_value == sym._str_default():
1621 continue
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001622
Tom Rini3c5f4152019-09-20 17:42:09 -04001623 # Skip symbols that would be selected by default in a
1624 # choice, unless the choice is optional or the symbol type
1625 # isn't bool (it might be possible to set the choice mode
1626 # to n or the symbol to m in those cases).
1627 if sym.choice and \
1628 not sym.choice.is_optional and \
1629 sym.choice._selection_from_defaults() is sym and \
1630 sym.orig_type is BOOL and \
1631 sym.tri_value == 2:
1632 continue
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001633
Tom Rini3c5f4152019-09-20 17:42:09 -04001634 add(sym.config_string)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001635
Tom Rini3c5f4152019-09-20 17:42:09 -04001636 return "".join(chunks)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001637
Tom Rini3c5f4152019-09-20 17:42:09 -04001638 def sync_deps(self, path):
1639 """
1640 Creates or updates a directory structure that can be used to avoid
1641 doing a full rebuild whenever the configuration is changed, mirroring
1642 include/config/ in the kernel.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001643
Tom Rini3c5f4152019-09-20 17:42:09 -04001644 This function is intended to be called during each build, before
1645 compiling source files that depend on configuration symbols.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001646
Tom Rini3c5f4152019-09-20 17:42:09 -04001647 See the Kconfig.__init__() docstring for raised exceptions
1648 (OSError/IOError). KconfigError is never raised here.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001649
Tom Rini3c5f4152019-09-20 17:42:09 -04001650 path:
1651 Path to directory
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001652
Tom Rini3c5f4152019-09-20 17:42:09 -04001653 sync_deps(path) does the following:
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001654
Tom Rini3c5f4152019-09-20 17:42:09 -04001655 1. If the directory <path> does not exist, it is created.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001656
Tom Rini3c5f4152019-09-20 17:42:09 -04001657 2. If <path>/auto.conf exists, old symbol values are loaded from it,
1658 which are then compared against the current symbol values. If a
1659 symbol has changed value (would generate different output in
1660 autoconf.h compared to before), the change is signaled by
1661 touch'ing a file corresponding to the symbol.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001662
Tom Rini3c5f4152019-09-20 17:42:09 -04001663 The first time sync_deps() is run on a directory, <path>/auto.conf
1664 won't exist, and no old symbol values will be available. This
1665 logically has the same effect as updating the entire
1666 configuration.
Ulf Magnusson1682e052017-09-19 12:52:55 +02001667
Tom Rini3c5f4152019-09-20 17:42:09 -04001668 The path to a symbol's file is calculated from the symbol's name
1669 by replacing all '_' with '/' and appending '.h'. For example, the
1670 symbol FOO_BAR_BAZ gets the file <path>/foo/bar/baz.h, and FOO
1671 gets the file <path>/foo.h.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001672
Tom Rini3c5f4152019-09-20 17:42:09 -04001673 This scheme matches the C tools. The point is to avoid having a
1674 single directory with a huge number of files, which the underlying
1675 filesystem might not handle well.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001676
Tom Rini3c5f4152019-09-20 17:42:09 -04001677 3. A new auto.conf with the current symbol values is written, to keep
1678 track of them for the next build.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001679
Tom Rini3c5f4152019-09-20 17:42:09 -04001680 If auto.conf exists and its contents is identical to what would
1681 get written out, it is left untouched. This avoids updating file
1682 metadata like the modification time and possibly triggering
1683 redundant work in build tools.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001684
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001685
Tom Rini3c5f4152019-09-20 17:42:09 -04001686 The last piece of the puzzle is knowing what symbols each source file
1687 depends on. Knowing that, dependencies can be added from source files
1688 to the files corresponding to the symbols they depends on. The source
1689 file will then get recompiled (only) when the symbol value changes
1690 (provided sync_deps() is run first during each build).
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001691
Tom Rini3c5f4152019-09-20 17:42:09 -04001692 The tool in the kernel that extracts symbol dependencies from source
1693 files is scripts/basic/fixdep.c. Missing symbol files also correspond
1694 to "not changed", which fixdep deals with by using the $(wildcard) Make
1695 function when adding symbol prerequisites to source files.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001696
Tom Rini3c5f4152019-09-20 17:42:09 -04001697 In case you need a different scheme for your project, the sync_deps()
1698 implementation can be used as a template.
1699 """
1700 if not exists(path):
1701 os.mkdir(path, 0o755)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001702
Tom Rini3c5f4152019-09-20 17:42:09 -04001703 # Load old values from auto.conf, if any
1704 self._load_old_vals(path)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001705
Tom Rini3c5f4152019-09-20 17:42:09 -04001706 for sym in self.unique_defined_syms:
1707 # _write_to_conf is determined when the value is calculated. This
1708 # is a hidden function call due to property magic.
1709 #
1710 # Note: In client code, you can check if sym.config_string is empty
1711 # instead, to avoid accessing the internal _write_to_conf variable
1712 # (though it's likely to keep working).
1713 val = sym.str_value
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001714
Tom Rini3c5f4152019-09-20 17:42:09 -04001715 # n tristate values do not get written to auto.conf and autoconf.h,
1716 # making a missing symbol logically equivalent to n
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001717
Tom Rini3c5f4152019-09-20 17:42:09 -04001718 if sym._write_to_conf:
1719 if sym._old_val is None and \
1720 sym.orig_type in _BOOL_TRISTATE and \
1721 val == "n":
1722 # No old value (the symbol was missing or n), new value n.
1723 # No change.
1724 continue
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001725
Tom Rini3c5f4152019-09-20 17:42:09 -04001726 if val == sym._old_val:
1727 # New value matches old. No change.
1728 continue
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001729
Tom Rini3c5f4152019-09-20 17:42:09 -04001730 elif sym._old_val is None:
1731 # The symbol wouldn't appear in autoconf.h (because
1732 # _write_to_conf is false), and it wouldn't have appeared in
1733 # autoconf.h previously either (because it didn't appear in
1734 # auto.conf). No change.
1735 continue
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001736
Tom Rini3c5f4152019-09-20 17:42:09 -04001737 # 'sym' has a new value. Flag it.
1738 _touch_dep_file(path, sym.name)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001739
Tom Rini3c5f4152019-09-20 17:42:09 -04001740 # Remember the current values as the "new old" values.
1741 #
1742 # This call could go anywhere after the call to _load_old_vals(), but
1743 # putting it last means _sync_deps() can be safely rerun if it fails
1744 # before this point.
1745 self._write_old_vals(path)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001746
Tom Rini3c5f4152019-09-20 17:42:09 -04001747 def _load_old_vals(self, path):
1748 # Loads old symbol values from auto.conf into a dedicated
1749 # Symbol._old_val field. Mirrors load_config().
1750 #
1751 # The extra field could be avoided with some trickery involving dumping
1752 # symbol values and restoring them later, but this is simpler and
1753 # faster. The C tools also use a dedicated field for this purpose.
Ulf Magnusson1e642d72015-08-13 19:55:40 +02001754
Tom Rini3c5f4152019-09-20 17:42:09 -04001755 for sym in self.unique_defined_syms:
1756 sym._old_val = None
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001757
Tom Rini3c5f4152019-09-20 17:42:09 -04001758 try:
1759 auto_conf = self._open(join(path, "auto.conf"), "r")
1760 except EnvironmentError as e:
1761 if e.errno == errno.ENOENT:
1762 # No old values
1763 return
1764 raise
Masahiro Yamada48386dd2015-05-27 11:39:22 +09001765
Tom Rini3c5f4152019-09-20 17:42:09 -04001766 with auto_conf as f:
1767 for line in f:
1768 match = self._set_match(line)
1769 if not match:
1770 # We only expect CONFIG_FOO=... (and possibly a header
1771 # comment) in auto.conf
1772 continue
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001773
Tom Rini3c5f4152019-09-20 17:42:09 -04001774 name, val = match.groups()
1775 if name in self.syms:
1776 sym = self.syms[name]
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001777
Tom Rini3c5f4152019-09-20 17:42:09 -04001778 if sym.orig_type is STRING:
1779 match = _conf_string_match(val)
1780 if not match:
1781 continue
1782 val = unescape(match.group(1))
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001783
Tom Rini3c5f4152019-09-20 17:42:09 -04001784 self.syms[name]._old_val = val
1785 else:
1786 # Flag that the symbol no longer exists, in
1787 # case something still depends on it
1788 _touch_dep_file(path, name)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001789
Tom Rini3c5f4152019-09-20 17:42:09 -04001790 def _write_old_vals(self, path):
1791 # Helper for writing auto.conf. Basically just a simplified
1792 # write_config() that doesn't write any comments (including
1793 # '# CONFIG_FOO is not set' comments). The format matches the C
1794 # implementation, though the ordering is arbitrary there (depends on
1795 # the hash table implementation).
1796 #
1797 # A separate helper function is neater than complicating write_config()
1798 # by passing a flag to it, plus we only need to look at symbols here.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001799
Tom Rini3c5f4152019-09-20 17:42:09 -04001800 self._write_if_changed(
1801 os.path.join(path, "auto.conf"),
1802 self._old_vals_contents())
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001803
Tom Rini3c5f4152019-09-20 17:42:09 -04001804 def _old_vals_contents(self):
1805 # _write_old_vals() helper. Returns the contents to write as a string.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001806
Tom Rini3c5f4152019-09-20 17:42:09 -04001807 # Temporary list instead of generator makes this a bit faster
1808 return "".join([
1809 sym.config_string for sym in self.unique_defined_syms
1810 if not (sym.orig_type in _BOOL_TRISTATE and not sym.tri_value)
1811 ])
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001812
Tom Rini3c5f4152019-09-20 17:42:09 -04001813 def node_iter(self, unique_syms=False):
1814 """
1815 Returns a generator for iterating through all MenuNode's in the Kconfig
1816 tree. The iteration is done in Kconfig definition order (each node is
1817 visited before its children, and the children of a node are visited
1818 before the next node).
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001819
Tom Rini3c5f4152019-09-20 17:42:09 -04001820 The Kconfig.top_node menu node is skipped. It contains an implicit menu
1821 that holds the top-level items.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001822
Tom Rini3c5f4152019-09-20 17:42:09 -04001823 As an example, the following code will produce a list equal to
1824 Kconfig.defined_syms:
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001825
Tom Rini3c5f4152019-09-20 17:42:09 -04001826 defined_syms = [node.item for node in kconf.node_iter()
1827 if isinstance(node.item, Symbol)]
Masahiro Yamadac908bc82014-09-01 19:57:37 +09001828
Tom Rini3c5f4152019-09-20 17:42:09 -04001829 unique_syms (default: False):
1830 If True, only the first MenuNode will be included for symbols defined
1831 in multiple locations.
Ulf Magnusson1e642d72015-08-13 19:55:40 +02001832
Tom Rini3c5f4152019-09-20 17:42:09 -04001833 Using kconf.node_iter(True) in the example above would give a list
1834 equal to unique_defined_syms.
1835 """
1836 if unique_syms:
1837 for sym in self.unique_defined_syms:
1838 sym._visited = False
1839
1840 node = self.top_node
1841 while 1:
1842 # Jump to the next node with an iterative tree walk
1843 if node.list:
1844 node = node.list
1845 elif node.next:
1846 node = node.next
1847 else:
1848 while node.parent:
1849 node = node.parent
1850 if node.next:
1851 node = node.next
1852 break
1853 else:
1854 # No more nodes
1855 return
1856
1857 if unique_syms and node.item.__class__ is Symbol:
1858 if node.item._visited:
1859 continue
1860 node.item._visited = True
1861
1862 yield node
1863
1864 def eval_string(self, s):
1865 """
1866 Returns the tristate value of the expression 's', represented as 0, 1,
1867 and 2 for n, m, and y, respectively. Raises KconfigError on syntax
1868 errors. Warns if undefined symbols are referenced.
1869
1870 As an example, if FOO and BAR are tristate symbols at least one of
1871 which has the value y, then eval_string("y && (FOO || BAR)") returns
1872 2 (y).
1873
1874 To get the string value of non-bool/tristate symbols, use
1875 Symbol.str_value. eval_string() always returns a tristate value, and
1876 all non-bool/tristate symbols have the tristate value 0 (n).
1877
1878 The expression parsing is consistent with how parsing works for
1879 conditional ('if ...') expressions in the configuration, and matches
1880 the C implementation. m is rewritten to 'm && MODULES', so
1881 eval_string("m") will return 0 (n) unless modules are enabled.
1882 """
1883 # The parser is optimized to be fast when parsing Kconfig files (where
1884 # an expression can never appear at the beginning of a line). We have
1885 # to monkey-patch things a bit here to reuse it.
1886
1887 self.filename = None
1888
1889 self._tokens = self._tokenize("if " + s)
1890 # Strip "if " to avoid giving confusing error messages
1891 self._line = s
1892 self._tokens_i = 1 # Skip the 'if' token
1893
1894 return expr_value(self._expect_expr_and_eol())
1895
1896 def unset_values(self):
1897 """
1898 Removes any user values from all symbols, as if Kconfig.load_config()
1899 or Symbol.set_value() had never been called.
1900 """
1901 self._warn_assign_no_prompt = False
1902 try:
1903 # set_value() already rejects undefined symbols, and they don't
1904 # need to be invalidated (because their value never changes), so we
1905 # can just iterate over defined symbols
1906 for sym in self.unique_defined_syms:
1907 sym.unset_value()
1908
1909 for choice in self.unique_choices:
1910 choice.unset_value()
1911 finally:
1912 self._warn_assign_no_prompt = True
1913
1914 def enable_warnings(self):
1915 """
1916 Do 'Kconfig.warn = True' instead. Maintained for backwards
1917 compatibility.
1918 """
1919 self.warn = True
1920
1921 def disable_warnings(self):
1922 """
1923 Do 'Kconfig.warn = False' instead. Maintained for backwards
1924 compatibility.
1925 """
1926 self.warn = False
1927
1928 def enable_stderr_warnings(self):
1929 """
1930 Do 'Kconfig.warn_to_stderr = True' instead. Maintained for backwards
1931 compatibility.
1932 """
1933 self.warn_to_stderr = True
1934
1935 def disable_stderr_warnings(self):
1936 """
1937 Do 'Kconfig.warn_to_stderr = False' instead. Maintained for backwards
1938 compatibility.
1939 """
1940 self.warn_to_stderr = False
1941
1942 def enable_undef_warnings(self):
1943 """
1944 Do 'Kconfig.warn_assign_undef = True' instead. Maintained for backwards
1945 compatibility.
1946 """
1947 self.warn_assign_undef = True
1948
1949 def disable_undef_warnings(self):
1950 """
1951 Do 'Kconfig.warn_assign_undef = False' instead. Maintained for
1952 backwards compatibility.
1953 """
1954 self.warn_assign_undef = False
1955
1956 def enable_override_warnings(self):
1957 """
1958 Do 'Kconfig.warn_assign_override = True' instead. Maintained for
1959 backwards compatibility.
1960 """
1961 self.warn_assign_override = True
1962
1963 def disable_override_warnings(self):
1964 """
1965 Do 'Kconfig.warn_assign_override = False' instead. Maintained for
1966 backwards compatibility.
1967 """
1968 self.warn_assign_override = False
1969
1970 def enable_redun_warnings(self):
1971 """
1972 Do 'Kconfig.warn_assign_redun = True' instead. Maintained for backwards
1973 compatibility.
1974 """
1975 self.warn_assign_redun = True
1976
1977 def disable_redun_warnings(self):
1978 """
1979 Do 'Kconfig.warn_assign_redun = False' instead. Maintained for
1980 backwards compatibility.
1981 """
1982 self.warn_assign_redun = False
1983
1984 def __repr__(self):
1985 """
1986 Returns a string with information about the Kconfig object when it is
1987 evaluated on e.g. the interactive Python prompt.
1988 """
1989 def status(flag):
1990 return "enabled" if flag else "disabled"
1991
1992 return "<{}>".format(", ".join((
1993 "configuration with {} symbols".format(len(self.syms)),
1994 'main menu prompt "{}"'.format(self.mainmenu_text),
1995 "srctree is current directory" if not self.srctree else
1996 'srctree "{}"'.format(self.srctree),
1997 'config symbol prefix "{}"'.format(self.config_prefix),
1998 "warnings " + status(self.warn),
1999 "printing of warnings to stderr " + status(self.warn_to_stderr),
2000 "undef. symbol assignment warnings " +
2001 status(self.warn_assign_undef),
2002 "overriding symbol assignment warnings " +
2003 status(self.warn_assign_override),
2004 "redundant symbol assignment warnings " +
2005 status(self.warn_assign_redun)
2006 )))
2007
2008 #
2009 # Private methods
2010 #
2011
2012
2013 #
2014 # File reading
2015 #
2016
2017 def _open_config(self, filename):
2018 # Opens a .config file. First tries to open 'filename', then
2019 # '$srctree/filename' if $srctree was set when the configuration was
2020 # loaded.
2021
2022 try:
2023 return self._open(filename, "r")
2024 except EnvironmentError as e:
2025 # This will try opening the same file twice if $srctree is unset,
2026 # but it's not a big deal
2027 try:
2028 return self._open(join(self.srctree, filename), "r")
2029 except EnvironmentError as e2:
2030 # This is needed for Python 3, because e2 is deleted after
2031 # the try block:
2032 #
2033 # https://docs.python.org/3/reference/compound_stmts.html#the-try-statement
2034 e = e2
2035
2036 raise _KconfigIOError(
2037 e, "Could not open '{}' ({}: {}). Check that the $srctree "
2038 "environment variable ({}) is set correctly."
2039 .format(filename, errno.errorcode[e.errno], e.strerror,
2040 "set to '{}'".format(self.srctree) if self.srctree
2041 else "unset or blank"))
2042
2043 def _enter_file(self, filename):
2044 # Jumps to the beginning of a sourced Kconfig file, saving the previous
2045 # position and file object.
2046 #
2047 # filename:
2048 # Absolute path to file
2049
2050 # Path relative to $srctree, stored in e.g. self.filename (which makes
2051 # it indirectly show up in MenuNode.filename). Equals 'filename' for
2052 # absolute paths passed to 'source'.
2053 if filename.startswith(self._srctree_prefix):
2054 # Relative path (or a redundant absolute path to within $srctree,
2055 # but it's probably fine to reduce those too)
2056 rel_filename = filename[len(self._srctree_prefix):]
2057 else:
2058 # Absolute path
2059 rel_filename = filename
2060
2061 self.kconfig_filenames.append(rel_filename)
2062
2063 # The parent Kconfig files are represented as a list of
2064 # (<include path>, <Python 'file' object for Kconfig file>) tuples.
2065 #
2066 # <include path> is immutable and holds a *tuple* of
2067 # (<filename>, <linenr>) tuples, giving the locations of the 'source'
2068 # statements in the parent Kconfig files. The current include path is
2069 # also available in Kconfig._include_path.
2070 #
2071 # The point of this redundant setup is to allow Kconfig._include_path
2072 # to be assigned directly to MenuNode.include_path without having to
2073 # copy it, sharing it wherever possible.
2074
2075 # Save include path and 'file' object (via its 'readline' function)
2076 # before entering the file
2077 self._filestack.append((self._include_path, self._readline))
2078
2079 # _include_path is a tuple, so this rebinds the variable instead of
2080 # doing in-place modification
2081 self._include_path += ((self.filename, self.linenr),)
2082
2083 # Check for recursive 'source'
2084 for name, _ in self._include_path:
2085 if name == rel_filename:
2086 raise KconfigError(
2087 "\n{}:{}: recursive 'source' of '{}' detected. Check that "
2088 "environment variables are set correctly.\n"
2089 "Include path:\n{}"
2090 .format(self.filename, self.linenr, rel_filename,
2091 "\n".join("{}:{}".format(name, linenr)
2092 for name, linenr in self._include_path)))
2093
2094 try:
2095 self._readline = self._open(filename, "r").readline
2096 except EnvironmentError as e:
2097 # We already know that the file exists
2098 raise _KconfigIOError(
2099 e, "{}:{}: Could not open '{}' (in '{}') ({}: {})"
2100 .format(self.filename, self.linenr, filename,
2101 self._line.strip(),
2102 errno.errorcode[e.errno], e.strerror))
2103
2104 self.filename = rel_filename
2105 self.linenr = 0
2106
2107 def _leave_file(self):
2108 # Returns from a Kconfig file to the file that sourced it. See
2109 # _enter_file().
2110
2111 # Restore location from parent Kconfig file
2112 self.filename, self.linenr = self._include_path[-1]
2113 # Restore include path and 'file' object
2114 self._readline.__self__.close() # __self__ fetches the 'file' object
2115 self._include_path, self._readline = self._filestack.pop()
2116
2117 def _next_line(self):
2118 # Fetches and tokenizes the next line from the current Kconfig file.
2119 # Returns False at EOF and True otherwise.
2120
2121 # We might already have tokens from parsing a line and discovering that
2122 # it's part of a different construct
2123 if self._reuse_tokens:
2124 self._reuse_tokens = False
2125 # self._tokens_i is known to be 1 here, because _parse_properties()
2126 # leaves it like that when it can't recognize a line (or parses
2127 # a help text)
2128 return True
2129
2130 # readline() returns '' over and over at EOF, which we rely on for help
2131 # texts at the end of files (see _line_after_help())
2132 line = self._readline()
2133 if not line:
2134 return False
2135 self.linenr += 1
2136
2137 # Handle line joining
2138 while line.endswith("\\\n"):
2139 line = line[:-2] + self._readline()
2140 self.linenr += 1
2141
2142 self._tokens = self._tokenize(line)
2143 # Initialize to 1 instead of 0 to factor out code from _parse_block()
2144 # and _parse_properties(). They immediately fetch self._tokens[0].
2145 self._tokens_i = 1
2146
2147 return True
2148
2149 def _line_after_help(self, line):
2150 # Tokenizes a line after a help text. This case is special in that the
2151 # line has already been fetched (to discover that it isn't part of the
2152 # help text).
2153 #
2154 # An earlier version used a _saved_line variable instead that was
2155 # checked in _next_line(). This special-casing gets rid of it and makes
2156 # _reuse_tokens alone sufficient to handle unget.
2157
2158 # Handle line joining
2159 while line.endswith("\\\n"):
2160 line = line[:-2] + self._readline()
2161 self.linenr += 1
2162
2163 self._tokens = self._tokenize(line)
2164 self._reuse_tokens = True
2165
2166 def _write_if_changed(self, filename, contents):
2167 # Writes 'contents' into 'filename', but only if it differs from the
2168 # current contents of the file.
2169 #
2170 # Another variant would be write a temporary file on the same
2171 # filesystem, compare the files, and rename() the temporary file if it
2172 # differs, but it breaks stuff like write_config("/dev/null"), which is
2173 # used out there to force evaluation-related warnings to be generated.
2174 # This simple version is pretty failsafe and portable.
2175
2176 if not self._contents_eq(filename, contents):
2177 with self._open(filename, "w") as f:
2178 f.write(contents)
2179
2180 def _contents_eq(self, filename, contents):
2181 # Returns True if the contents of 'filename' is 'contents' (a string),
2182 # and False otherwise (including if 'filename' can't be opened/read)
2183
2184 try:
2185 with self._open(filename, "r") as f:
2186 # Robust re. things like encoding and line endings (mmap()
2187 # trickery isn't)
2188 return f.read(len(contents) + 1) == contents
2189 except EnvironmentError:
2190 # If the error here would prevent writing the file as well, we'll
2191 # notice it later
2192 return False
2193
2194 #
2195 # Tokenization
2196 #
2197
2198 def _lookup_sym(self, name):
2199 # Fetches the symbol 'name' from the symbol table, creating and
2200 # registering it if it does not exist. If '_parsing_kconfigs' is False,
2201 # it means we're in eval_string(), and new symbols won't be registered.
2202
2203 if name in self.syms:
2204 return self.syms[name]
2205
2206 sym = Symbol()
2207 sym.kconfig = self
2208 sym.name = name
2209 sym.is_constant = False
2210 sym.rev_dep = sym.weak_rev_dep = sym.direct_dep = self.n
2211
2212 if self._parsing_kconfigs:
2213 self.syms[name] = sym
2214 else:
2215 self._warn("no symbol {} in configuration".format(name))
2216
2217 return sym
2218
2219 def _lookup_const_sym(self, name):
2220 # Like _lookup_sym(), for constant (quoted) symbols
2221
2222 if name in self.const_syms:
2223 return self.const_syms[name]
2224
2225 sym = Symbol()
2226 sym.kconfig = self
2227 sym.name = name
2228 sym.is_constant = True
2229 sym.rev_dep = sym.weak_rev_dep = sym.direct_dep = self.n
2230
2231 if self._parsing_kconfigs:
2232 self.const_syms[name] = sym
2233
2234 return sym
2235
2236 def _tokenize(self, s):
2237 # Parses 's', returning a None-terminated list of tokens. Registers any
2238 # new symbols encountered with _lookup(_const)_sym().
2239 #
2240 # Tries to be reasonably speedy by processing chunks of text via
2241 # regexes and string operations where possible. This is the biggest
2242 # hotspot during parsing.
2243 #
2244 # It might be possible to rewrite this to 'yield' tokens instead,
2245 # working across multiple lines. Lookback and compatibility with old
2246 # janky versions of the C tools complicate things though.
2247
2248 self._line = s # Used for error reporting
2249
2250 # Initial token on the line
2251 match = _command_match(s)
2252 if not match:
2253 if s.isspace() or s.lstrip().startswith("#"):
2254 return (None,)
2255 self._parse_error("unknown token at start of line")
2256
2257 # Tricky implementation detail: While parsing a token, 'token' refers
2258 # to the previous token. See _STRING_LEX for why this is needed.
2259 token = _get_keyword(match.group(1))
2260 if not token:
2261 # Backwards compatibility with old versions of the C tools, which
2262 # (accidentally) accepted stuff like "--help--" and "-help---".
2263 # This was fixed in the C tools by commit c2264564 ("kconfig: warn
2264 # of unhandled characters in Kconfig commands"), committed in July
2265 # 2015, but it seems people still run Kconfiglib on older kernels.
2266 if s.strip(" \t\n-") == "help":
2267 return (_T_HELP, None)
2268
2269 # If the first token is not a keyword (and not a weird help token),
2270 # we have a preprocessor variable assignment (or a bare macro on a
2271 # line)
2272 self._parse_assignment(s)
2273 return (None,)
2274
2275 tokens = [token]
2276 # The current index in the string being tokenized
2277 i = match.end()
2278
2279 # Main tokenization loop (for tokens past the first one)
2280 while i < len(s):
2281 # Test for an identifier/keyword first. This is the most common
2282 # case.
2283 match = _id_keyword_match(s, i)
2284 if match:
2285 # We have an identifier or keyword
2286
2287 # Check what it is. lookup_sym() will take care of allocating
2288 # new symbols for us the first time we see them. Note that
2289 # 'token' still refers to the previous token.
2290
2291 name = match.group(1)
2292 keyword = _get_keyword(name)
2293 if keyword:
2294 # It's a keyword
2295 token = keyword
2296 # Jump past it
2297 i = match.end()
2298
2299 elif token not in _STRING_LEX:
2300 # It's a non-const symbol, except we translate n, m, and y
2301 # into the corresponding constant symbols, like the C
2302 # implementation
2303
2304 if "$" in name:
2305 # Macro expansion within symbol name
2306 name, s, i = self._expand_name(s, i)
2307 else:
2308 i = match.end()
2309
2310 token = self.const_syms[name] if name in STR_TO_TRI else \
2311 self._lookup_sym(name)
2312
2313 else:
2314 # It's a case of missing quotes. For example, the
2315 # following is accepted:
2316 #
2317 # menu unquoted_title
2318 #
2319 # config A
2320 # tristate unquoted_prompt
2321 #
2322 # endmenu
2323 #
2324 # Named choices ('choice FOO') also end up here.
2325
2326 if token is not _T_CHOICE:
2327 self._warn("style: quotes recommended around '{}' in '{}'"
2328 .format(name, self._line.strip()),
2329 self.filename, self.linenr)
2330
2331 token = name
2332 i = match.end()
2333
2334 else:
2335 # Neither a keyword nor a non-const symbol
2336
2337 # We always strip whitespace after tokens, so it is safe to
2338 # assume that s[i] is the start of a token here.
2339 c = s[i]
2340
2341 if c in "\"'":
2342 if "$" not in s and "\\" not in s:
2343 # Fast path for lines without $ and \. Find the
2344 # matching quote.
2345 end_i = s.find(c, i + 1) + 1
2346 if not end_i:
2347 self._parse_error("unterminated string")
2348 val = s[i + 1:end_i - 1]
2349 i = end_i
2350 else:
2351 # Slow path
2352 s, end_i = self._expand_str(s, i)
2353
2354 # os.path.expandvars() and the $UNAME_RELEASE replace()
2355 # is a backwards compatibility hack, which should be
2356 # reasonably safe as expandvars() leaves references to
2357 # undefined env. vars. as is.
2358 #
2359 # The preprocessor functionality changed how
2360 # environment variables are referenced, to $(FOO).
2361 val = expandvars(s[i + 1:end_i - 1]
2362 .replace("$UNAME_RELEASE",
2363 _UNAME_RELEASE))
2364
2365 i = end_i
2366
2367 # This is the only place where we don't survive with a
2368 # single token of lookback: 'option env="FOO"' does not
2369 # refer to a constant symbol named "FOO".
2370 token = \
2371 val if token in _STRING_LEX or tokens[0] is _T_OPTION \
2372 else self._lookup_const_sym(val)
2373
2374 elif s.startswith("&&", i):
2375 token = _T_AND
2376 i += 2
2377
2378 elif s.startswith("||", i):
2379 token = _T_OR
2380 i += 2
2381
2382 elif c == "=":
2383 token = _T_EQUAL
2384 i += 1
2385
2386 elif s.startswith("!=", i):
2387 token = _T_UNEQUAL
2388 i += 2
2389
2390 elif c == "!":
2391 token = _T_NOT
2392 i += 1
2393
2394 elif c == "(":
2395 token = _T_OPEN_PAREN
2396 i += 1
2397
2398 elif c == ")":
2399 token = _T_CLOSE_PAREN
2400 i += 1
2401
2402 elif c == "#":
2403 break
2404
2405
2406 # Very rare
2407
2408 elif s.startswith("<=", i):
2409 token = _T_LESS_EQUAL
2410 i += 2
2411
2412 elif c == "<":
2413 token = _T_LESS
2414 i += 1
2415
2416 elif s.startswith(">=", i):
2417 token = _T_GREATER_EQUAL
2418 i += 2
2419
2420 elif c == ">":
2421 token = _T_GREATER
2422 i += 1
2423
2424
2425 else:
2426 self._parse_error("unknown tokens in line")
2427
2428
2429 # Skip trailing whitespace
2430 while i < len(s) and s[i].isspace():
2431 i += 1
2432
2433
2434 # Add the token
2435 tokens.append(token)
2436
2437 # None-terminating the token list makes token fetching simpler/faster
2438 tokens.append(None)
2439
2440 return tokens
2441
2442 # Helpers for syntax checking and token fetching. See the
2443 # 'Intro to expressions' section for what a constant symbol is.
2444 #
2445 # More of these could be added, but the single-use cases are inlined as an
2446 # optimization.
2447
2448 def _expect_sym(self):
2449 token = self._tokens[self._tokens_i]
2450 self._tokens_i += 1
2451
2452 if token.__class__ is not Symbol:
2453 self._parse_error("expected symbol")
2454
2455 return token
2456
2457 def _expect_nonconst_sym(self):
2458 # Used for 'select' and 'imply' only. We know the token indices.
2459
2460 token = self._tokens[1]
2461 self._tokens_i = 2
2462
2463 if token.__class__ is not Symbol or token.is_constant:
2464 self._parse_error("expected nonconstant symbol")
2465
2466 return token
2467
2468 def _expect_str_and_eol(self):
2469 token = self._tokens[self._tokens_i]
2470 self._tokens_i += 1
2471
2472 if token.__class__ is not str:
2473 self._parse_error("expected string")
2474
2475 if self._tokens[self._tokens_i] is not None:
2476 self._trailing_tokens_error()
2477
2478 return token
2479
2480 def _expect_expr_and_eol(self):
2481 expr = self._parse_expr(True)
2482
2483 if self._tokens[self._tokens_i] is not None:
2484 self._trailing_tokens_error()
2485
2486 return expr
2487
2488 def _check_token(self, token):
2489 # If the next token is 'token', removes it and returns True
2490
2491 if self._tokens[self._tokens_i] is token:
2492 self._tokens_i += 1
2493 return True
2494 return False
2495
2496 #
2497 # Preprocessor logic
2498 #
2499
2500 def _parse_assignment(self, s):
2501 # Parses a preprocessor variable assignment, registering the variable
2502 # if it doesn't already exist. Also takes care of bare macros on lines
2503 # (which are allowed, and can be useful for their side effects).
2504
2505 # Expand any macros in the left-hand side of the assignment (the
2506 # variable name)
2507 s = s.lstrip()
2508 i = 0
2509 while 1:
2510 i = _assignment_lhs_fragment_match(s, i).end()
2511 if s.startswith("$(", i):
2512 s, i = self._expand_macro(s, i, ())
2513 else:
2514 break
2515
2516 if s.isspace():
2517 # We also accept a bare macro on a line (e.g.
2518 # $(warning-if,$(foo),ops)), provided it expands to a blank string
2519 return
2520
2521 # Assigned variable
2522 name = s[:i]
2523
2524
2525 # Extract assignment operator (=, :=, or +=) and value
2526 rhs_match = _assignment_rhs_match(s, i)
2527 if not rhs_match:
2528 self._parse_error("syntax error")
2529
2530 op, val = rhs_match.groups()
2531
2532
2533 if name in self.variables:
2534 # Already seen variable
2535 var = self.variables[name]
2536 else:
2537 # New variable
2538 var = Variable()
2539 var.kconfig = self
2540 var.name = name
2541 var._n_expansions = 0
2542 self.variables[name] = var
2543
2544 # += acts like = on undefined variables (defines a recursive
2545 # variable)
2546 if op == "+=":
2547 op = "="
2548
2549 if op == "=":
2550 var.is_recursive = True
2551 var.value = val
2552 elif op == ":=":
2553 var.is_recursive = False
2554 var.value = self._expand_whole(val, ())
2555 else: # op == "+="
2556 # += does immediate expansion if the variable was last set
2557 # with :=
2558 var.value += " " + (val if var.is_recursive else
2559 self._expand_whole(val, ()))
2560
2561 def _expand_whole(self, s, args):
2562 # Expands preprocessor macros in all of 's'. Used whenever we don't
2563 # have to worry about delimiters. See _expand_macro() re. the 'args'
2564 # parameter.
2565 #
2566 # Returns the expanded string.
2567
2568 i = 0
2569 while 1:
2570 i = s.find("$(", i)
2571 if i == -1:
2572 break
2573 s, i = self._expand_macro(s, i, args)
2574 return s
2575
2576 def _expand_name(self, s, i):
2577 # Expands a symbol name starting at index 'i' in 's'.
2578 #
2579 # Returns the expanded name, the expanded 's' (including the part
2580 # before the name), and the index of the first character in the next
2581 # token after the name.
2582
2583 s, end_i = self._expand_name_iter(s, i)
2584 name = s[i:end_i]
2585 # isspace() is False for empty strings
2586 if not name.strip():
2587 # Avoid creating a Kconfig symbol with a blank name. It's almost
2588 # guaranteed to be an error.
2589 self._parse_error("macro expanded to blank string")
2590
2591 # Skip trailing whitespace
2592 while end_i < len(s) and s[end_i].isspace():
2593 end_i += 1
2594
2595 return name, s, end_i
2596
2597 def _expand_name_iter(self, s, i):
2598 # Expands a symbol name starting at index 'i' in 's'.
2599 #
2600 # Returns the expanded 's' (including the part before the name) and the
2601 # index of the first character after the expanded name in 's'.
2602
2603 while 1:
2604 match = _name_special_search(s, i)
2605
2606 if match.group() == "$(":
2607 s, i = self._expand_macro(s, match.start(), ())
2608 else:
2609 return (s, match.start())
2610
2611 def _expand_str(self, s, i):
2612 # Expands a quoted string starting at index 'i' in 's'. Handles both
2613 # backslash escapes and macro expansion.
2614 #
2615 # Returns the expanded 's' (including the part before the string) and
2616 # the index of the first character after the expanded string in 's'.
2617
2618 quote = s[i]
2619 i += 1 # Skip over initial "/'
2620 while 1:
2621 match = _string_special_search(s, i)
2622 if not match:
2623 self._parse_error("unterminated string")
2624
2625
2626 if match.group() == quote:
2627 # Found the end of the string
2628 return (s, match.end())
2629
2630 elif match.group() == "\\":
2631 # Replace '\x' with 'x'. 'i' ends up pointing to the character
2632 # after 'x', which allows macros to be canceled with '\$(foo)'.
2633 i = match.end()
2634 s = s[:match.start()] + s[i:]
2635
2636 elif match.group() == "$(":
2637 # A macro call within the string
2638 s, i = self._expand_macro(s, match.start(), ())
2639
2640 else:
2641 # A ' quote within " quotes or vice versa
2642 i += 1
2643
2644 def _expand_macro(self, s, i, args):
2645 # Expands a macro starting at index 'i' in 's'. If this macro resulted
2646 # from the expansion of another macro, 'args' holds the arguments
2647 # passed to that macro.
2648 #
2649 # Returns the expanded 's' (including the part before the macro) and
2650 # the index of the first character after the expanded macro in 's'.
2651
2652 start = i
2653 i += 2 # Skip over "$("
2654
2655 # Start of current macro argument
2656 arg_start = i
2657
2658 # Arguments of this macro call
2659 new_args = []
2660
2661 while 1:
2662 match = _macro_special_search(s, i)
2663 if not match:
2664 self._parse_error("missing end parenthesis in macro expansion")
2665
2666
2667 if match.group() == ")":
2668 # Found the end of the macro
2669
2670 new_args.append(s[arg_start:match.start()])
2671
2672 prefix = s[:start]
2673
2674 # $(1) is replaced by the first argument to the function, etc.,
2675 # provided at least that many arguments were passed
2676
2677 try:
2678 # Does the macro look like an integer, with a corresponding
2679 # argument? If so, expand it to the value of the argument.
2680 prefix += args[int(new_args[0])]
2681 except (ValueError, IndexError):
2682 # Regular variables are just functions without arguments,
2683 # and also go through the function value path
2684 prefix += self._fn_val(new_args)
2685
2686 return (prefix + s[match.end():],
2687 len(prefix))
2688
2689 elif match.group() == ",":
2690 # Found the end of a macro argument
2691 new_args.append(s[arg_start:match.start()])
2692 arg_start = i = match.end()
2693
2694 else: # match.group() == "$("
2695 # A nested macro call within the macro
2696 s, i = self._expand_macro(s, match.start(), args)
2697
2698 def _fn_val(self, args):
2699 # Returns the result of calling the function args[0] with the arguments
2700 # args[1..len(args)-1]. Plain variables are treated as functions
2701 # without arguments.
2702
2703 fn = args[0]
2704
2705 if fn in self.variables:
2706 var = self.variables[fn]
2707
2708 if len(args) == 1:
2709 # Plain variable
2710 if var._n_expansions:
2711 self._parse_error("Preprocessor variable {} recursively "
2712 "references itself".format(var.name))
2713 elif var._n_expansions > 100:
2714 # Allow functions to call themselves, but guess that functions
2715 # that are overly recursive are stuck
2716 self._parse_error("Preprocessor function {} seems stuck "
2717 "in infinite recursion".format(var.name))
2718
2719 var._n_expansions += 1
2720 res = self._expand_whole(self.variables[fn].value, args)
2721 var._n_expansions -= 1
2722 return res
2723
2724 if fn in self._functions:
2725 # Built-in or user-defined function
2726
2727 py_fn, min_arg, max_arg = self._functions[fn]
2728
2729 if len(args) - 1 < min_arg or \
2730 (max_arg is not None and len(args) - 1 > max_arg):
2731
2732 if min_arg == max_arg:
2733 expected_args = min_arg
2734 elif max_arg is None:
2735 expected_args = "{} or more".format(min_arg)
2736 else:
2737 expected_args = "{}-{}".format(min_arg, max_arg)
2738
2739 raise KconfigError("{}:{}: bad number of arguments in call "
2740 "to {}, expected {}, got {}"
2741 .format(self.filename, self.linenr, fn,
2742 expected_args, len(args) - 1))
2743
2744 return py_fn(self, *args)
2745
2746 # Environment variables are tried last
2747 if fn in os.environ:
2748 self.env_vars.add(fn)
2749 return os.environ[fn]
2750
2751 return ""
2752
2753 #
2754 # Parsing
2755 #
2756
2757 def _make_and(self, e1, e2):
2758 # Constructs an AND (&&) expression. Performs trivial simplification.
2759
2760 if e1 is self.y:
2761 return e2
2762
2763 if e2 is self.y:
2764 return e1
2765
2766 if e1 is self.n or e2 is self.n:
2767 return self.n
2768
2769 return (AND, e1, e2)
2770
2771 def _make_or(self, e1, e2):
2772 # Constructs an OR (||) expression. Performs trivial simplification.
2773
2774 if e1 is self.n:
2775 return e2
2776
2777 if e2 is self.n:
2778 return e1
2779
2780 if e1 is self.y or e2 is self.y:
2781 return self.y
2782
2783 return (OR, e1, e2)
2784
2785 def _parse_block(self, end_token, parent, prev):
2786 # Parses a block, which is the contents of either a file or an if,
2787 # menu, or choice statement.
2788 #
2789 # end_token:
2790 # The token that ends the block, e.g. _T_ENDIF ("endif") for ifs.
2791 # None for files.
2792 #
2793 # parent:
2794 # The parent menu node, corresponding to a menu, Choice, or 'if'.
2795 # 'if's are flattened after parsing.
2796 #
2797 # prev:
2798 # The previous menu node. New nodes will be added after this one (by
2799 # modifying their 'next' pointer).
2800 #
2801 # 'prev' is reused to parse a list of child menu nodes (for a menu or
2802 # Choice): After parsing the children, the 'next' pointer is assigned
2803 # to the 'list' pointer to "tilt up" the children above the node.
2804 #
2805 # Returns the final menu node in the block (or 'prev' if the block is
2806 # empty). This allows chaining.
2807
2808 while self._next_line():
2809 t0 = self._tokens[0]
2810
2811 if t0 is _T_CONFIG or t0 is _T_MENUCONFIG:
2812 # The tokenizer allocates Symbol objects for us
2813 sym = self._tokens[1]
2814
2815 if sym.__class__ is not Symbol or sym.is_constant:
2816 self._parse_error("missing or bad symbol name")
2817
2818 if self._tokens[2] is not None:
2819 self._trailing_tokens_error()
2820
2821 self.defined_syms.append(sym)
2822
2823 node = MenuNode()
2824 node.kconfig = self
2825 node.item = sym
2826 node.is_menuconfig = (t0 is _T_MENUCONFIG)
2827 node.prompt = node.help = node.list = None
2828 node.parent = parent
2829 node.filename = self.filename
2830 node.linenr = self.linenr
2831 node.include_path = self._include_path
2832
2833 sym.nodes.append(node)
2834
2835 self._parse_properties(node)
2836
2837 if node.is_menuconfig and not node.prompt:
2838 self._warn("the menuconfig symbol {} has no prompt"
2839 .format(_name_and_loc(sym)))
2840
2841 # Equivalent to
2842 #
2843 # prev.next = node
2844 # prev = node
2845 #
2846 # due to tricky Python semantics. The order matters.
2847 prev.next = prev = node
2848
2849 elif t0 is None:
2850 # Blank line
2851 continue
2852
2853 elif t0 in _SOURCE_TOKENS:
2854 pattern = self._expect_str_and_eol()
2855
2856 if t0 in _REL_SOURCE_TOKENS:
2857 # Relative source
2858 pattern = join(dirname(self.filename), pattern)
2859
2860 # - glob() doesn't support globbing relative to a directory, so
2861 # we need to prepend $srctree to 'pattern'. Use join()
2862 # instead of '+' so that an absolute path in 'pattern' is
2863 # preserved.
2864 #
2865 # - Sort the glob results to ensure a consistent ordering of
2866 # Kconfig symbols, which indirectly ensures a consistent
2867 # ordering in e.g. .config files
2868 filenames = sorted(iglob(join(self._srctree_prefix, pattern)))
2869
2870 if not filenames and t0 in _OBL_SOURCE_TOKENS:
2871 raise KconfigError(
2872 "{}:{}: '{}' not found (in '{}'). Check that "
2873 "environment variables are set correctly (e.g. "
2874 "$srctree, which is {}). Also note that unset "
2875 "environment variables expand to the empty string."
2876 .format(self.filename, self.linenr, pattern,
2877 self._line.strip(),
2878 "set to '{}'".format(self.srctree)
2879 if self.srctree else "unset or blank"))
2880
2881 for filename in filenames:
2882 self._enter_file(filename)
2883 prev = self._parse_block(None, parent, prev)
2884 self._leave_file()
2885
2886 elif t0 is end_token:
2887 # Reached the end of the block. Terminate the final node and
2888 # return it.
2889
2890 if self._tokens[1] is not None:
2891 self._trailing_tokens_error()
2892
2893 prev.next = None
2894 return prev
2895
2896 elif t0 is _T_IF:
2897 node = MenuNode()
2898 node.item = node.prompt = None
2899 node.parent = parent
2900 node.dep = self._expect_expr_and_eol()
2901
2902 self._parse_block(_T_ENDIF, node, node)
2903 node.list = node.next
2904
2905 prev.next = prev = node
2906
2907 elif t0 is _T_MENU:
2908 node = MenuNode()
2909 node.kconfig = self
2910 node.item = t0 # _T_MENU == MENU
2911 node.is_menuconfig = True
2912 node.prompt = (self._expect_str_and_eol(), self.y)
2913 node.visibility = self.y
2914 node.parent = parent
2915 node.filename = self.filename
2916 node.linenr = self.linenr
2917 node.include_path = self._include_path
2918
2919 self.menus.append(node)
2920
2921 self._parse_properties(node)
2922 self._parse_block(_T_ENDMENU, node, node)
2923 node.list = node.next
2924
2925 prev.next = prev = node
2926
2927 elif t0 is _T_COMMENT:
2928 node = MenuNode()
2929 node.kconfig = self
2930 node.item = t0 # _T_COMMENT == COMMENT
2931 node.is_menuconfig = False
2932 node.prompt = (self._expect_str_and_eol(), self.y)
2933 node.list = None
2934 node.parent = parent
2935 node.filename = self.filename
2936 node.linenr = self.linenr
2937 node.include_path = self._include_path
2938
2939 self.comments.append(node)
2940
2941 self._parse_properties(node)
2942
2943 prev.next = prev = node
2944
2945 elif t0 is _T_CHOICE:
2946 if self._tokens[1] is None:
2947 choice = Choice()
2948 choice.direct_dep = self.n
2949 else:
2950 # Named choice
2951 name = self._expect_str_and_eol()
2952 choice = self.named_choices.get(name)
2953 if not choice:
2954 choice = Choice()
2955 choice.name = name
2956 choice.direct_dep = self.n
2957 self.named_choices[name] = choice
2958
2959 self.choices.append(choice)
2960
2961 node = MenuNode()
2962 node.kconfig = choice.kconfig = self
2963 node.item = choice
2964 node.is_menuconfig = True
2965 node.prompt = node.help = None
2966 node.parent = parent
2967 node.filename = self.filename
2968 node.linenr = self.linenr
2969 node.include_path = self._include_path
2970
2971 choice.nodes.append(node)
2972
2973 self._parse_properties(node)
2974 self._parse_block(_T_ENDCHOICE, node, node)
2975 node.list = node.next
2976
2977 prev.next = prev = node
2978
2979 elif t0 is _T_MAINMENU:
2980 self.top_node.prompt = (self._expect_str_and_eol(), self.y)
2981
2982 else:
2983 # A valid endchoice/endif/endmenu is caught by the 'end_token'
2984 # check above
2985 self._parse_error(
2986 "no corresponding 'choice'" if t0 is _T_ENDCHOICE else
2987 "no corresponding 'if'" if t0 is _T_ENDIF else
2988 "no corresponding 'menu'" if t0 is _T_ENDMENU else
2989 "unrecognized construct")
2990
2991 # End of file reached. Terminate the final node and return it.
2992
2993 if end_token:
2994 raise KconfigError(
2995 "expected '{}' at end of '{}'"
2996 .format("endchoice" if end_token is _T_ENDCHOICE else
2997 "endif" if end_token is _T_ENDIF else
2998 "endmenu",
2999 self.filename))
3000
3001 prev.next = None
3002 return prev
3003
3004 def _parse_cond(self):
3005 # Parses an optional 'if <expr>' construct and returns the parsed
3006 # <expr>, or self.y if the next token is not _T_IF
3007
3008 expr = self._parse_expr(True) if self._check_token(_T_IF) else self.y
3009
3010 if self._tokens[self._tokens_i] is not None:
3011 self._trailing_tokens_error()
3012
3013 return expr
3014
3015 def _parse_properties(self, node):
3016 # Parses and adds properties to the MenuNode 'node' (type, 'prompt',
3017 # 'default's, etc.) Properties are later copied up to symbols and
3018 # choices in a separate pass after parsing, in e.g.
3019 # _add_props_to_sym().
3020 #
3021 # An older version of this code added properties directly to symbols
3022 # and choices instead of to their menu nodes (and handled dependency
3023 # propagation simultaneously), but that loses information on where a
3024 # property is added when a symbol or choice is defined in multiple
3025 # locations. Some Kconfig configuration systems rely heavily on such
3026 # symbols, and better docs can be generated by keeping track of where
3027 # properties are added.
3028 #
3029 # node:
3030 # The menu node we're parsing properties on
3031
3032 # Dependencies from 'depends on'. Will get propagated to the properties
3033 # below.
3034 node.dep = self.y
3035
3036 while self._next_line():
3037 t0 = self._tokens[0]
3038
3039 if t0 in _TYPE_TOKENS:
3040 # Relies on '_T_BOOL is BOOL', etc., to save a conversion
3041 self._set_type(node, t0)
3042 if self._tokens[1] is not None:
3043 self._parse_prompt(node)
3044
3045 elif t0 is _T_DEPENDS:
3046 if not self._check_token(_T_ON):
3047 self._parse_error("expected 'on' after 'depends'")
3048
3049 node.dep = self._make_and(node.dep,
3050 self._expect_expr_and_eol())
3051
3052 elif t0 is _T_HELP:
3053 self._parse_help(node)
3054
3055 elif t0 is _T_SELECT:
3056 if node.item.__class__ is not Symbol:
3057 self._parse_error("only symbols can select")
3058
3059 node.selects.append((self._expect_nonconst_sym(),
3060 self._parse_cond()))
3061
3062 elif t0 is None:
3063 # Blank line
3064 continue
3065
3066 elif t0 is _T_DEFAULT:
3067 node.defaults.append((self._parse_expr(False),
3068 self._parse_cond()))
3069
3070 elif t0 in _DEF_TOKEN_TO_TYPE:
3071 self._set_type(node, _DEF_TOKEN_TO_TYPE[t0])
3072 node.defaults.append((self._parse_expr(False),
3073 self._parse_cond()))
3074
3075 elif t0 is _T_PROMPT:
3076 self._parse_prompt(node)
3077
3078 elif t0 is _T_RANGE:
3079 node.ranges.append((self._expect_sym(), self._expect_sym(),
3080 self._parse_cond()))
3081
3082 elif t0 is _T_IMPLY:
3083 if node.item.__class__ is not Symbol:
3084 self._parse_error("only symbols can imply")
3085
3086 node.implies.append((self._expect_nonconst_sym(),
3087 self._parse_cond()))
3088
3089 elif t0 is _T_VISIBLE:
3090 if not self._check_token(_T_IF):
3091 self._parse_error("expected 'if' after 'visible'")
3092
3093 node.visibility = self._make_and(node.visibility,
3094 self._expect_expr_and_eol())
3095
3096 elif t0 is _T_OPTION:
3097 if self._check_token(_T_ENV):
3098 if not self._check_token(_T_EQUAL):
3099 self._parse_error("expected '=' after 'env'")
3100
3101 env_var = self._expect_str_and_eol()
3102 node.item.env_var = env_var
3103
3104 if env_var in os.environ:
3105 node.defaults.append(
3106 (self._lookup_const_sym(os.environ[env_var]),
3107 self.y))
3108 else:
3109 self._warn("{1} has 'option env=\"{0}\"', "
3110 "but the environment variable {0} is not "
3111 "set".format(node.item.name, env_var),
3112 self.filename, self.linenr)
3113
3114 if env_var != node.item.name:
3115 self._warn("Kconfiglib expands environment variables "
3116 "in strings directly, meaning you do not "
3117 "need 'option env=...' \"bounce\" symbols. "
3118 "For compatibility with the C tools, "
3119 "rename {} to {} (so that the symbol name "
3120 "matches the environment variable name)."
3121 .format(node.item.name, env_var),
3122 self.filename, self.linenr)
3123
3124 elif self._check_token(_T_DEFCONFIG_LIST):
3125 if not self.defconfig_list:
3126 self.defconfig_list = node.item
3127 else:
3128 self._warn("'option defconfig_list' set on multiple "
3129 "symbols ({0} and {1}). Only {0} will be "
3130 "used.".format(self.defconfig_list.name,
3131 node.item.name),
3132 self.filename, self.linenr)
3133
3134 elif self._check_token(_T_MODULES):
3135 # To reduce warning spam, only warn if 'option modules' is
3136 # set on some symbol that isn't MODULES, which should be
3137 # safe. I haven't run into any projects that make use
3138 # modules besides the kernel yet, and there it's likely to
3139 # keep being called "MODULES".
3140 if node.item is not self.modules:
3141 self._warn("the 'modules' option is not supported. "
3142 "Let me know if this is a problem for you, "
3143 "as it wouldn't be that hard to implement. "
3144 "Note that modules are supported -- "
3145 "Kconfiglib just assumes the symbol name "
3146 "MODULES, like older versions of the C "
3147 "implementation did when 'option modules' "
3148 "wasn't used.",
3149 self.filename, self.linenr)
3150
3151 elif self._check_token(_T_ALLNOCONFIG_Y):
3152 if node.item.__class__ is not Symbol:
3153 self._parse_error("the 'allnoconfig_y' option is only "
3154 "valid for symbols")
3155
3156 node.item.is_allnoconfig_y = True
3157
3158 else:
3159 self._parse_error("unrecognized option")
3160
3161 elif t0 is _T_OPTIONAL:
3162 if node.item.__class__ is not Choice:
3163 self._parse_error('"optional" is only valid for choices')
3164
3165 node.item.is_optional = True
3166
3167 else:
3168 # Reuse the tokens for the non-property line later
3169 self._reuse_tokens = True
3170 return
3171
3172 def _set_type(self, node, new_type):
3173 # UNKNOWN is falsy
3174 if node.item.orig_type and node.item.orig_type is not new_type:
3175 self._warn("{} defined with multiple types, {} will be used"
3176 .format(_name_and_loc(node.item),
3177 TYPE_TO_STR[new_type]))
3178
3179 node.item.orig_type = new_type
3180
3181 def _parse_prompt(self, node):
3182 # 'prompt' properties override each other within a single definition of
3183 # a symbol, but additional prompts can be added by defining the symbol
3184 # multiple times
3185
3186 if node.prompt:
3187 self._warn(_name_and_loc(node.item) +
3188 " defined with multiple prompts in single location")
3189
3190 prompt = self._tokens[1]
3191 self._tokens_i = 2
3192
3193 if prompt.__class__ is not str:
3194 self._parse_error("expected prompt string")
3195
3196 if prompt != prompt.strip():
3197 self._warn(_name_and_loc(node.item) +
3198 " has leading or trailing whitespace in its prompt")
3199
3200 # This avoid issues for e.g. reStructuredText documentation, where
3201 # '*prompt *' is invalid
3202 prompt = prompt.strip()
3203
3204 node.prompt = (prompt, self._parse_cond())
3205
3206 def _parse_help(self, node):
3207 if node.help is not None:
3208 self._warn(_name_and_loc(node.item) + " defined with more than "
3209 "one help text -- only the last one will be used")
3210
3211 # Micro-optimization. This code is pretty hot.
3212 readline = self._readline
3213
3214 # Find first non-blank (not all-space) line and get its
3215 # indentation
3216
3217 while 1:
3218 line = readline()
3219 self.linenr += 1
3220 if not line:
3221 self._empty_help(node, line)
3222 return
3223 if not line.isspace():
3224 break
3225
3226 len_ = len # Micro-optimization
3227
3228 # Use a separate 'expline' variable here and below to avoid stomping on
3229 # any tabs people might've put deliberately into the first line after
3230 # the help text
3231 expline = line.expandtabs()
3232 indent = len_(expline) - len_(expline.lstrip())
3233 if not indent:
3234 self._empty_help(node, line)
3235 return
3236
3237 # The help text goes on till the first non-blank line with less indent
3238 # than the first line
3239
3240 # Add the first line
3241 lines = [expline[indent:]]
3242 add_line = lines.append # Micro-optimization
3243
3244 while 1:
3245 line = readline()
3246 if line.isspace():
3247 # No need to preserve the exact whitespace in these
3248 add_line("\n")
3249 elif not line:
3250 # End of file
3251 break
3252 else:
3253 expline = line.expandtabs()
3254 if len_(expline) - len_(expline.lstrip()) < indent:
3255 break
3256 add_line(expline[indent:])
3257
3258 self.linenr += len_(lines)
3259 node.help = "".join(lines).rstrip()
3260 if line:
3261 self._line_after_help(line)
3262
3263 def _empty_help(self, node, line):
3264 self._warn(_name_and_loc(node.item) +
3265 " has 'help' but empty help text")
3266 node.help = ""
3267 if line:
3268 self._line_after_help(line)
3269
3270 def _parse_expr(self, transform_m):
3271 # Parses an expression from the tokens in Kconfig._tokens using a
3272 # simple top-down approach. See the module docstring for the expression
3273 # format.
3274 #
3275 # transform_m:
3276 # True if m should be rewritten to m && MODULES. See the
3277 # Kconfig.eval_string() documentation.
3278
3279 # Grammar:
3280 #
3281 # expr: and_expr ['||' expr]
3282 # and_expr: factor ['&&' and_expr]
3283 # factor: <symbol> ['='/'!='/'<'/... <symbol>]
3284 # '!' factor
3285 # '(' expr ')'
3286 #
3287 # It helps to think of the 'expr: and_expr' case as a single-operand OR
3288 # (no ||), and of the 'and_expr: factor' case as a single-operand AND
3289 # (no &&). Parsing code is always a bit tricky.
3290
3291 # Mind dump: parse_factor() and two nested loops for OR and AND would
3292 # work as well. The straightforward implementation there gives a
3293 # (op, (op, (op, A, B), C), D) parse for A op B op C op D. Representing
3294 # expressions as (op, [list of operands]) instead goes nicely with that
3295 # version, but is wasteful for short expressions and complicates
3296 # expression evaluation and other code that works on expressions (more
3297 # complicated code likely offsets any performance gain from less
3298 # recursion too). If we also try to optimize the list representation by
3299 # merging lists when possible (e.g. when ANDing two AND expressions),
3300 # we end up allocating a ton of lists instead of reusing expressions,
3301 # which is bad.
3302
3303 and_expr = self._parse_and_expr(transform_m)
3304
3305 # Return 'and_expr' directly if we have a "single-operand" OR.
3306 # Otherwise, parse the expression on the right and make an OR node.
3307 # This turns A || B || C || D into (OR, A, (OR, B, (OR, C, D))).
3308 return and_expr if not self._check_token(_T_OR) else \
3309 (OR, and_expr, self._parse_expr(transform_m))
3310
3311 def _parse_and_expr(self, transform_m):
3312 factor = self._parse_factor(transform_m)
3313
3314 # Return 'factor' directly if we have a "single-operand" AND.
3315 # Otherwise, parse the right operand and make an AND node. This turns
3316 # A && B && C && D into (AND, A, (AND, B, (AND, C, D))).
3317 return factor if not self._check_token(_T_AND) else \
3318 (AND, factor, self._parse_and_expr(transform_m))
3319
3320 def _parse_factor(self, transform_m):
3321 token = self._tokens[self._tokens_i]
3322 self._tokens_i += 1
3323
3324 if token.__class__ is Symbol:
3325 # Plain symbol or relation
3326
3327 if self._tokens[self._tokens_i] not in _RELATIONS:
3328 # Plain symbol
3329
3330 # For conditional expressions ('depends on <expr>',
3331 # '... if <expr>', etc.), m is rewritten to m && MODULES.
3332 if transform_m and token is self.m:
3333 return (AND, self.m, self.modules)
3334
3335 return token
3336
3337 # Relation
3338 #
3339 # _T_EQUAL, _T_UNEQUAL, etc., deliberately have the same values as
3340 # EQUAL, UNEQUAL, etc., so we can just use the token directly
3341 self._tokens_i += 1
3342 return (self._tokens[self._tokens_i - 1], token,
3343 self._expect_sym())
3344
3345 if token is _T_NOT:
3346 # token == _T_NOT == NOT
3347 return (token, self._parse_factor(transform_m))
3348
3349 if token is _T_OPEN_PAREN:
3350 expr_parse = self._parse_expr(transform_m)
3351 if self._check_token(_T_CLOSE_PAREN):
3352 return expr_parse
3353
3354 self._parse_error("malformed expression")
3355
3356 #
3357 # Caching and invalidation
3358 #
3359
3360 def _build_dep(self):
3361 # Populates the Symbol/Choice._dependents sets, which contain all other
3362 # items (symbols and choices) that immediately depend on the item in
3363 # the sense that changing the value of the item might affect the value
3364 # of the dependent items. This is used for caching/invalidation.
3365 #
3366 # The calculated sets might be larger than necessary as we don't do any
3367 # complex analysis of the expressions.
3368
3369 make_depend_on = _make_depend_on # Micro-optimization
3370
3371 # Only calculate _dependents for defined symbols. Constant and
3372 # undefined symbols could theoretically be selected/implied, but it
3373 # wouldn't change their value, so it's not a true dependency.
3374 for sym in self.unique_defined_syms:
3375 # Symbols depend on the following:
3376
3377 # The prompt conditions
3378 for node in sym.nodes:
3379 if node.prompt:
3380 make_depend_on(sym, node.prompt[1])
3381
3382 # The default values and their conditions
3383 for value, cond in sym.defaults:
3384 make_depend_on(sym, value)
3385 make_depend_on(sym, cond)
3386
3387 # The reverse and weak reverse dependencies
3388 make_depend_on(sym, sym.rev_dep)
3389 make_depend_on(sym, sym.weak_rev_dep)
3390
3391 # The ranges along with their conditions
3392 for low, high, cond in sym.ranges:
3393 make_depend_on(sym, low)
3394 make_depend_on(sym, high)
3395 make_depend_on(sym, cond)
3396
3397 # The direct dependencies. This is usually redundant, as the direct
3398 # dependencies get propagated to properties, but it's needed to get
3399 # invalidation solid for 'imply', which only checks the direct
3400 # dependencies (even if there are no properties to propagate it
3401 # to).
3402 make_depend_on(sym, sym.direct_dep)
3403
3404 # In addition to the above, choice symbols depend on the choice
3405 # they're in, but that's handled automatically since the Choice is
3406 # propagated to the conditions of the properties before
3407 # _build_dep() runs.
3408
3409 for choice in self.unique_choices:
3410 # Choices depend on the following:
3411
3412 # The prompt conditions
3413 for node in choice.nodes:
3414 if node.prompt:
3415 make_depend_on(choice, node.prompt[1])
3416
3417 # The default symbol conditions
3418 for _, cond in choice.defaults:
3419 make_depend_on(choice, cond)
3420
3421 def _add_choice_deps(self):
3422 # Choices also depend on the choice symbols themselves, because the
3423 # y-mode selection of the choice might change if a choice symbol's
3424 # visibility changes.
3425 #
3426 # We add these dependencies separately after dependency loop detection.
3427 # The invalidation algorithm can handle the resulting
3428 # <choice symbol> <-> <choice> dependency loops, but they make loop
3429 # detection awkward.
3430
3431 for choice in self.unique_choices:
3432 for sym in choice.syms:
3433 sym._dependents.add(choice)
3434
3435 def _invalidate_all(self):
3436 # Undefined symbols never change value and don't need to be
3437 # invalidated, so we can just iterate over defined symbols.
3438 # Invalidating constant symbols would break things horribly.
3439 for sym in self.unique_defined_syms:
3440 sym._invalidate()
3441
3442 for choice in self.unique_choices:
3443 choice._invalidate()
3444
3445 #
3446 # Post-parsing menu tree processing, including dependency propagation and
3447 # implicit submenu creation
3448 #
3449
3450 def _finalize_node(self, node, visible_if):
3451 # Finalizes a menu node and its children:
3452 #
3453 # - Copies properties from menu nodes up to their contained
3454 # symbols/choices
3455 #
3456 # - Propagates dependencies from parent to child nodes
3457 #
3458 # - Creates implicit menus (see kconfig-language.txt)
3459 #
3460 # - Removes 'if' nodes
3461 #
3462 # - Sets 'choice' types and registers choice symbols
3463 #
3464 # menu_finalize() in the C implementation is similar.
3465 #
3466 # node:
3467 # The menu node to finalize. This node and its children will have
3468 # been finalized when the function returns, and any implicit menus
3469 # will have been created.
3470 #
3471 # visible_if:
3472 # Dependencies from 'visible if' on parent menus. These are added to
3473 # the prompts of symbols and choices.
3474
3475 if node.item.__class__ is Symbol:
3476 # Copy defaults, ranges, selects, and implies to the Symbol
3477 self._add_props_to_sym(node)
3478
3479 # Find any items that should go in an implicit menu rooted at the
3480 # symbol
3481 cur = node
3482 while cur.next and _auto_menu_dep(node, cur.next):
3483 # This makes implicit submenu creation work recursively, with
3484 # implicit menus inside implicit menus
3485 self._finalize_node(cur.next, visible_if)
3486 cur = cur.next
3487 cur.parent = node
3488
3489 if cur is not node:
3490 # Found symbols that should go in an implicit submenu. Tilt
3491 # them up above us.
3492 node.list = node.next
3493 node.next = cur.next
3494 cur.next = None
3495
3496 elif node.list:
3497 # The menu node is a choice, menu, or if. Finalize each child node.
3498
3499 if node.item is MENU:
3500 visible_if = self._make_and(visible_if, node.visibility)
3501
3502 # Propagate the menu node's dependencies to each child menu node.
3503 #
3504 # This needs to go before the recursive _finalize_node() call so
3505 # that implicit submenu creation can look ahead at dependencies.
3506 self._propagate_deps(node, visible_if)
3507
3508 # Finalize the children
3509 cur = node.list
3510 while cur:
3511 self._finalize_node(cur, visible_if)
3512 cur = cur.next
3513
3514 if node.list:
3515 # node's children have been individually finalized. Do final steps
3516 # to finalize this "level" in the menu tree.
3517 _flatten(node.list)
3518 _remove_ifs(node)
3519
3520 # Empty choices (node.list None) are possible, so this needs to go
3521 # outside
3522 if node.item.__class__ is Choice:
3523 # Add the node's non-node-specific properties to the choice, like
3524 # _add_props_to_sym() does
3525 choice = node.item
3526 choice.direct_dep = self._make_or(choice.direct_dep, node.dep)
3527 choice.defaults += node.defaults
3528
3529 _finalize_choice(node)
3530
3531 def _propagate_deps(self, node, visible_if):
3532 # Propagates 'node's dependencies to its child menu nodes
3533
3534 # If the parent node holds a Choice, we use the Choice itself as the
3535 # parent dependency. This makes sense as the value (mode) of the choice
3536 # limits the visibility of the contained choice symbols. The C
3537 # implementation works the same way.
3538 #
3539 # Due to the similar interface, Choice works as a drop-in replacement
3540 # for Symbol here.
3541 basedep = node.item if node.item.__class__ is Choice else node.dep
3542
3543 cur = node.list
3544 while cur:
3545 dep = cur.dep = self._make_and(cur.dep, basedep)
3546
3547 if cur.item.__class__ in _SYMBOL_CHOICE:
3548 # Propagate 'visible if' and dependencies to the prompt
3549 if cur.prompt:
3550 cur.prompt = (cur.prompt[0],
3551 self._make_and(
3552 cur.prompt[1],
3553 self._make_and(visible_if, dep)))
3554
3555 # Propagate dependencies to defaults
3556 if cur.defaults:
3557 cur.defaults = [(default, self._make_and(cond, dep))
3558 for default, cond in cur.defaults]
3559
3560 # Propagate dependencies to ranges
3561 if cur.ranges:
3562 cur.ranges = [(low, high, self._make_and(cond, dep))
3563 for low, high, cond in cur.ranges]
3564
3565 # Propagate dependencies to selects
3566 if cur.selects:
3567 cur.selects = [(target, self._make_and(cond, dep))
3568 for target, cond in cur.selects]
3569
3570 # Propagate dependencies to implies
3571 if cur.implies:
3572 cur.implies = [(target, self._make_and(cond, dep))
3573 for target, cond in cur.implies]
3574
3575 elif cur.prompt: # Not a symbol/choice
3576 # Propagate dependencies to the prompt. 'visible if' is only
3577 # propagated to symbols/choices.
3578 cur.prompt = (cur.prompt[0],
3579 self._make_and(cur.prompt[1], dep))
3580
3581 cur = cur.next
3582
3583 def _add_props_to_sym(self, node):
3584 # Copies properties from the menu node 'node' up to its contained
3585 # symbol, and adds (weak) reverse dependencies to selected/implied
3586 # symbols.
3587 #
3588 # This can't be rolled into _propagate_deps(), because that function
3589 # traverses the menu tree roughly breadth-first, meaning properties on
3590 # symbols defined in multiple locations could end up in the wrong
3591 # order.
3592
3593 sym = node.item
3594
3595 # See the Symbol class docstring
3596 sym.direct_dep = self._make_or(sym.direct_dep, node.dep)
3597
3598 sym.defaults += node.defaults
3599 sym.ranges += node.ranges
3600 sym.selects += node.selects
3601 sym.implies += node.implies
3602
3603 # Modify the reverse dependencies of the selected symbol
3604 for target, cond in node.selects:
3605 target.rev_dep = self._make_or(
3606 target.rev_dep,
3607 self._make_and(sym, cond))
3608
3609 # Modify the weak reverse dependencies of the implied
3610 # symbol
3611 for target, cond in node.implies:
3612 target.weak_rev_dep = self._make_or(
3613 target.weak_rev_dep,
3614 self._make_and(sym, cond))
3615
3616 #
3617 # Misc.
3618 #
3619
3620 def _check_sym_sanity(self):
3621 # Checks various symbol properties that are handiest to check after
3622 # parsing. Only generates errors and warnings.
3623
3624 def num_ok(sym, type_):
3625 # Returns True if the (possibly constant) symbol 'sym' is valid as a value
3626 # for a symbol of type type_ (INT or HEX)
3627
3628 # 'not sym.nodes' implies a constant or undefined symbol, e.g. a plain
3629 # "123"
3630 if not sym.nodes:
3631 return _is_base_n(sym.name, _TYPE_TO_BASE[type_])
3632
3633 return sym.orig_type is type_
3634
3635 for sym in self.unique_defined_syms:
3636 if sym.orig_type in _BOOL_TRISTATE:
3637 # A helper function could be factored out here, but keep it
3638 # speedy/straightforward
3639
3640 for target_sym, _ in sym.selects:
3641 if target_sym.orig_type not in _BOOL_TRISTATE_UNKNOWN:
3642 self._warn("{} selects the {} symbol {}, which is not "
3643 "bool or tristate"
3644 .format(_name_and_loc(sym),
3645 TYPE_TO_STR[target_sym.orig_type],
3646 _name_and_loc(target_sym)))
3647
3648 for target_sym, _ in sym.implies:
3649 if target_sym.orig_type not in _BOOL_TRISTATE_UNKNOWN:
3650 self._warn("{} implies the {} symbol {}, which is not "
3651 "bool or tristate"
3652 .format(_name_and_loc(sym),
3653 TYPE_TO_STR[target_sym.orig_type],
3654 _name_and_loc(target_sym)))
3655
3656 elif sym.orig_type: # STRING/INT/HEX
3657 for default, _ in sym.defaults:
3658 if default.__class__ is not Symbol:
3659 raise KconfigError(
3660 "the {} symbol {} has a malformed default {} -- expected "
3661 "a single symbol"
3662 .format(TYPE_TO_STR[sym.orig_type], _name_and_loc(sym),
3663 expr_str(default)))
3664
3665 if sym.orig_type is STRING:
3666 if not default.is_constant and not default.nodes and \
3667 not default.name.isupper():
3668 # 'default foo' on a string symbol could be either a symbol
3669 # reference or someone leaving out the quotes. Guess that
3670 # the quotes were left out if 'foo' isn't all-uppercase
3671 # (and no symbol named 'foo' exists).
3672 self._warn("style: quotes recommended around "
3673 "default value for string symbol "
3674 + _name_and_loc(sym))
3675
3676 elif not num_ok(default, sym.orig_type): # INT/HEX
3677 self._warn("the {0} symbol {1} has a non-{0} default {2}"
3678 .format(TYPE_TO_STR[sym.orig_type],
3679 _name_and_loc(sym),
3680 _name_and_loc(default)))
3681
3682 if sym.selects or sym.implies:
3683 self._warn("the {} symbol {} has selects or implies"
3684 .format(TYPE_TO_STR[sym.orig_type],
3685 _name_and_loc(sym)))
3686
3687 else: # UNKNOWN
3688 self._warn("{} defined without a type"
3689 .format(_name_and_loc(sym)))
3690
3691
3692 if sym.ranges:
3693 if sym.orig_type not in _INT_HEX:
3694 self._warn(
3695 "the {} symbol {} has ranges, but is not int or hex"
3696 .format(TYPE_TO_STR[sym.orig_type],
3697 _name_and_loc(sym)))
3698 else:
3699 for low, high, _ in sym.ranges:
3700 if not num_ok(low, sym.orig_type) or \
3701 not num_ok(high, sym.orig_type):
3702
3703 self._warn("the {0} symbol {1} has a non-{0} "
3704 "range [{2}, {3}]"
3705 .format(TYPE_TO_STR[sym.orig_type],
3706 _name_and_loc(sym),
3707 _name_and_loc(low),
3708 _name_and_loc(high)))
3709
3710 def _check_choice_sanity(self):
3711 # Checks various choice properties that are handiest to check after
3712 # parsing. Only generates errors and warnings.
3713
3714 def warn_select_imply(sym, expr, expr_type):
3715 msg = "the choice symbol {} is {} by the following symbols, but " \
3716 "select/imply has no effect on choice symbols" \
3717 .format(_name_and_loc(sym), expr_type)
3718
3719 # si = select/imply
3720 for si in split_expr(expr, OR):
3721 msg += "\n - " + _name_and_loc(split_expr(si, AND)[0])
3722
3723 self._warn(msg)
3724
3725 for choice in self.unique_choices:
3726 if choice.orig_type not in _BOOL_TRISTATE:
3727 self._warn("{} defined with type {}"
3728 .format(_name_and_loc(choice),
3729 TYPE_TO_STR[choice.orig_type]))
3730
3731 for node in choice.nodes:
3732 if node.prompt:
3733 break
3734 else:
3735 self._warn(_name_and_loc(choice) + " defined without a prompt")
3736
3737 for default, _ in choice.defaults:
3738 if default.__class__ is not Symbol:
3739 raise KconfigError(
3740 "{} has a malformed default {}"
3741 .format(_name_and_loc(choice), expr_str(default)))
3742
3743 if default.choice is not choice:
3744 self._warn("the default selection {} of {} is not "
3745 "contained in the choice"
3746 .format(_name_and_loc(default),
3747 _name_and_loc(choice)))
3748
3749 for sym in choice.syms:
3750 if sym.defaults:
3751 self._warn("default on the choice symbol {} will have "
3752 "no effect, as defaults do not affect choice "
3753 "symbols".format(_name_and_loc(sym)))
3754
3755 if sym.rev_dep is not sym.kconfig.n:
3756 warn_select_imply(sym, sym.rev_dep, "selected")
3757
3758 if sym.weak_rev_dep is not sym.kconfig.n:
3759 warn_select_imply(sym, sym.weak_rev_dep, "implied")
3760
3761 for node in sym.nodes:
3762 if node.parent.item is choice:
3763 if not node.prompt:
3764 self._warn("the choice symbol {} has no prompt"
3765 .format(_name_and_loc(sym)))
3766
3767 elif node.prompt:
3768 self._warn("the choice symbol {} is defined with a "
3769 "prompt outside the choice"
3770 .format(_name_and_loc(sym)))
3771
3772 def _parse_error(self, msg):
3773 raise KconfigError("{}couldn't parse '{}': {}".format(
3774 "" if self.filename is None else
3775 "{}:{}: ".format(self.filename, self.linenr),
3776 self._line.strip(), msg))
3777
3778 def _trailing_tokens_error(self):
3779 self._parse_error("extra tokens at end of line")
3780
3781 def _open(self, filename, mode):
3782 # open() wrapper:
3783 #
3784 # - Enable universal newlines mode on Python 2 to ease
3785 # interoperability between Linux and Windows. It's already the
3786 # default on Python 3.
3787 #
3788 # The "U" flag would currently work for both Python 2 and 3, but it's
3789 # deprecated on Python 3, so play it future-safe.
3790 #
3791 # io.open() defaults to universal newlines on Python 2 (and is an
3792 # alias for open() on Python 3), but it returns 'unicode' strings and
3793 # slows things down:
3794 #
3795 # Parsing x86 Kconfigs on Python 2
3796 #
3797 # with open(..., "rU"):
3798 #
3799 # real 0m0.930s
3800 # user 0m0.905s
3801 # sys 0m0.025s
3802 #
3803 # with io.open():
3804 #
3805 # real 0m1.069s
3806 # user 0m1.040s
3807 # sys 0m0.029s
3808 #
3809 # There's no appreciable performance difference between "r" and
3810 # "rU" for parsing performance on Python 2.
3811 #
3812 # - For Python 3, force the encoding. Forcing the encoding on Python 2
3813 # turns strings into Unicode strings, which gets messy. Python 2
3814 # doesn't decode regular strings anyway.
3815 return open(filename, "rU" if mode == "r" else mode) if _IS_PY2 else \
3816 open(filename, mode, encoding=self._encoding)
3817
3818 def _check_undef_syms(self):
3819 # Prints warnings for all references to undefined symbols within the
3820 # Kconfig files
3821
3822 def is_num(s):
3823 # Returns True if the string 's' looks like a number.
3824 #
3825 # Internally, all operands in Kconfig are symbols, only undefined symbols
3826 # (which numbers usually are) get their name as their value.
3827 #
3828 # Only hex numbers that start with 0x/0X are classified as numbers.
3829 # Otherwise, symbols whose names happen to contain only the letters A-F
3830 # would trigger false positives.
3831
3832 try:
3833 int(s)
3834 except ValueError:
3835 if not s.startswith(("0x", "0X")):
3836 return False
3837
3838 try:
3839 int(s, 16)
3840 except ValueError:
3841 return False
3842
3843 return True
3844
3845 for sym in (self.syms.viewvalues if _IS_PY2 else self.syms.values)():
3846 # - sym.nodes empty means the symbol is undefined (has no
3847 # definition locations)
3848 #
3849 # - Due to Kconfig internals, numbers show up as undefined Kconfig
3850 # symbols, but shouldn't be flagged
3851 #
3852 # - The MODULES symbol always exists
3853 if not sym.nodes and not is_num(sym.name) and \
3854 sym.name != "MODULES":
3855
3856 msg = "undefined symbol {}:".format(sym.name)
3857 for node in self.node_iter():
3858 if sym in node.referenced:
3859 msg += "\n\n- Referenced at {}:{}:\n\n{}" \
3860 .format(node.filename, node.linenr, node)
3861 self._warn(msg)
3862
3863 def _warn(self, msg, filename=None, linenr=None):
3864 # For printing general warnings
3865
3866 if not self.warn:
3867 return
3868
3869 msg = "warning: " + msg
3870 if filename is not None:
3871 msg = "{}:{}: {}".format(filename, linenr, msg)
3872
3873 self.warnings.append(msg)
3874 if self.warn_to_stderr:
3875 sys.stderr.write(msg + "\n")
3876
3877
3878class Symbol(object):
3879 """
3880 Represents a configuration symbol:
3881
3882 (menu)config FOO
3883 ...
3884
3885 The following attributes are available. They should be viewed as read-only,
3886 and some are implemented through @property magic (but are still efficient
3887 to access due to internal caching).
3888
3889 Note: Prompts, help texts, and locations are stored in the Symbol's
3890 MenuNode(s) rather than in the Symbol itself. Check the MenuNode class and
3891 the Symbol.nodes attribute. This organization matches the C tools.
3892
3893 name:
3894 The name of the symbol, e.g. "FOO" for 'config FOO'.
3895
3896 type:
3897 The type of the symbol. One of BOOL, TRISTATE, STRING, INT, HEX, UNKNOWN.
3898 UNKNOWN is for undefined symbols, (non-special) constant symbols, and
3899 symbols defined without a type.
3900
3901 When running without modules (MODULES having the value n), TRISTATE
3902 symbols magically change type to BOOL. This also happens for symbols
3903 within choices in "y" mode. This matches the C tools, and makes sense for
3904 menuconfig-like functionality.
3905
3906 orig_type:
3907 The type as given in the Kconfig file, without any magic applied. Used
3908 when printing the symbol.
3909
3910 str_value:
3911 The value of the symbol as a string. Gives the value for string/int/hex
3912 symbols. For bool/tristate symbols, gives "n", "m", or "y".
3913
3914 This is the symbol value that's used in relational expressions
3915 (A = B, A != B, etc.)
3916
3917 Gotcha: For int/hex symbols, the exact format of the value must often be
3918 preserved (e.g., when writing a .config file), hence why you can't get it
3919 directly as an int. Do int(int_sym.str_value) or
3920 int(hex_sym.str_value, 16) to get the integer value.
3921
3922 tri_value:
3923 The tristate value of the symbol as an integer. One of 0, 1, 2,
3924 representing n, m, y. Always 0 (n) for non-bool/tristate symbols.
3925
3926 This is the symbol value that's used outside of relation expressions
3927 (A, !A, A && B, A || B).
3928
3929 assignable:
3930 A tuple containing the tristate user values that can currently be
3931 assigned to the symbol (that would be respected), ordered from lowest (0,
3932 representing n) to highest (2, representing y). This corresponds to the
3933 selections available in the menuconfig interface. The set of assignable
3934 values is calculated from the symbol's visibility and selects/implies.
3935
3936 Returns the empty set for non-bool/tristate symbols and for symbols with
3937 visibility n. The other possible values are (0, 2), (0, 1, 2), (1, 2),
3938 (1,), and (2,). A (1,) or (2,) result means the symbol is visible but
3939 "locked" to m or y through a select, perhaps in combination with the
3940 visibility. menuconfig represents this as -M- and -*-, respectively.
3941
3942 For string/hex/int symbols, check if Symbol.visibility is non-0 (non-n)
3943 instead to determine if the value can be changed.
3944
3945 Some handy 'assignable' idioms:
3946
3947 # Is 'sym' an assignable (visible) bool/tristate symbol?
3948 if sym.assignable:
3949 # What's the highest value it can be assigned? [-1] in Python
3950 # gives the last element.
3951 sym_high = sym.assignable[-1]
3952
3953 # The lowest?
3954 sym_low = sym.assignable[0]
3955
3956 # Can the symbol be set to at least m?
3957 if sym.assignable[-1] >= 1:
3958 ...
3959
3960 # Can the symbol be set to m?
3961 if 1 in sym.assignable:
3962 ...
3963
3964 visibility:
3965 The visibility of the symbol. One of 0, 1, 2, representing n, m, y. See
3966 the module documentation for an overview of symbol values and visibility.
3967
3968 user_value:
3969 The user value of the symbol. None if no user value has been assigned
3970 (via Kconfig.load_config() or Symbol.set_value()).
3971
3972 Holds 0, 1, or 2 for bool/tristate symbols, and a string for the other
3973 symbol types.
3974
3975 WARNING: Do not assign directly to this. It will break things. Use
3976 Symbol.set_value().
3977
3978 config_string:
3979 The .config assignment string that would get written out for the symbol
3980 by Kconfig.write_config(). Returns the empty string if no .config
3981 assignment would get written out.
3982
3983 In general, visible symbols, symbols with (active) defaults, and selected
3984 symbols get written out. This includes all non-n-valued bool/tristate
3985 symbols, and all visible string/int/hex symbols.
3986
3987 Symbols with the (no longer needed) 'option env=...' option generate no
3988 configuration output, and neither does the special
3989 'option defconfig_list' symbol.
3990
3991 Tip: This field is useful when generating custom configuration output,
3992 even for non-.config-like formats. To write just the symbols that would
3993 get written out to .config files, do this:
3994
3995 if sym.config_string:
3996 *Write symbol, e.g. by looking sym.str_value*
3997
3998 This is a superset of the symbols written out by write_autoconf().
3999 That function skips all n-valued symbols.
4000
4001 There usually won't be any great harm in just writing all symbols either,
4002 though you might get some special symbols and possibly some "redundant"
4003 n-valued symbol entries in there.
4004
4005 nodes:
4006 A list of MenuNodes for this symbol. Will contain a single MenuNode for
4007 most symbols. Undefined and constant symbols have an empty nodes list.
4008 Symbols defined in multiple locations get one node for each location.
4009
4010 choice:
4011 Holds the parent Choice for choice symbols, and None for non-choice
4012 symbols. Doubles as a flag for whether a symbol is a choice symbol.
4013
4014 defaults:
4015 List of (default, cond) tuples for the symbol's 'default' properties. For
4016 example, 'default A && B if C || D' is represented as
4017 ((AND, A, B), (OR, C, D)). If no condition was given, 'cond' is
4018 self.kconfig.y.
4019
4020 Note that 'depends on' and parent dependencies are propagated to
4021 'default' conditions.
4022
4023 selects:
4024 List of (symbol, cond) tuples for the symbol's 'select' properties. For
4025 example, 'select A if B && C' is represented as (A, (AND, B, C)). If no
4026 condition was given, 'cond' is self.kconfig.y.
4027
4028 Note that 'depends on' and parent dependencies are propagated to 'select'
4029 conditions.
4030
4031 implies:
4032 Like 'selects', for imply.
4033
4034 ranges:
4035 List of (low, high, cond) tuples for the symbol's 'range' properties. For
4036 example, 'range 1 2 if A' is represented as (1, 2, A). If there is no
4037 condition, 'cond' is self.kconfig.y.
4038
4039 Note that 'depends on' and parent dependencies are propagated to 'range'
4040 conditions.
4041
4042 Gotcha: 1 and 2 above will be represented as (undefined) Symbols rather
4043 than plain integers. Undefined symbols get their name as their string
4044 value, so this works out. The C tools work the same way.
4045
4046 orig_defaults:
4047 orig_selects:
4048 orig_implies:
4049 orig_ranges:
4050 See the corresponding attributes on the MenuNode class.
4051
4052 rev_dep:
4053 Reverse dependency expression from other symbols selecting this symbol.
4054 Multiple selections get ORed together. A condition on a select is ANDed
4055 with the selecting symbol.
4056
4057 For example, if A has 'select FOO' and B has 'select FOO if C', then
4058 FOO's rev_dep will be (OR, A, (AND, B, C)).
4059
4060 weak_rev_dep:
4061 Like rev_dep, for imply.
4062
4063 direct_dep:
4064 The direct ('depends on') dependencies for the symbol, or self.kconfig.y
4065 if there are no direct dependencies.
4066
4067 This attribute includes any dependencies from surrounding menus and ifs.
4068 Those get propagated to the direct dependencies, and the resulting direct
4069 dependencies in turn get propagated to the conditions of all properties.
4070
4071 If the symbol is defined in multiple locations, the dependencies from the
4072 different locations get ORed together.
4073
4074 referenced:
4075 A set() with all symbols and choices referenced in the properties and
4076 property conditions of the symbol.
4077
4078 Also includes dependencies from surrounding menus and ifs, because those
4079 get propagated to the symbol (see the 'Intro to symbol values' section in
4080 the module docstring).
4081
4082 Choices appear in the dependencies of choice symbols.
4083
4084 For the following definitions, only B and not C appears in A's
4085 'referenced'. To get transitive references, you'll have to recursively
4086 expand 'references' until no new items appear.
4087
4088 config A
4089 bool
4090 depends on B
4091
4092 config B
4093 bool
4094 depends on C
4095
4096 config C
4097 bool
4098
4099 See the Symbol.direct_dep attribute if you're only interested in the
4100 direct dependencies of the symbol (its 'depends on'). You can extract the
4101 symbols in it with the global expr_items() function.
4102
4103 env_var:
4104 If the Symbol has an 'option env="FOO"' option, this contains the name
4105 ("FOO") of the environment variable. None for symbols without no
4106 'option env'.
4107
4108 'option env="FOO"' acts like a 'default' property whose value is the
4109 value of $FOO.
4110
4111 Symbols with 'option env' are never written out to .config files, even if
4112 they are visible. env_var corresponds to a flag called SYMBOL_AUTO in the
4113 C implementation.
4114
4115 is_allnoconfig_y:
4116 True if the symbol has 'option allnoconfig_y' set on it. This has no
4117 effect internally (except when printing symbols), but can be checked by
4118 scripts.
4119
4120 is_constant:
4121 True if the symbol is a constant (quoted) symbol.
4122
4123 kconfig:
4124 The Kconfig instance this symbol is from.
4125 """
4126 __slots__ = (
4127 "_cached_assignable",
4128 "_cached_str_val",
4129 "_cached_tri_val",
4130 "_cached_vis",
4131 "_dependents",
4132 "_old_val",
4133 "_visited",
4134 "_was_set",
4135 "_write_to_conf",
4136 "choice",
4137 "defaults",
4138 "direct_dep",
4139 "env_var",
4140 "implies",
4141 "is_allnoconfig_y",
4142 "is_constant",
4143 "kconfig",
4144 "name",
4145 "nodes",
4146 "orig_type",
4147 "ranges",
4148 "rev_dep",
4149 "selects",
4150 "user_value",
4151 "weak_rev_dep",
4152 )
4153
4154 #
4155 # Public interface
4156 #
4157
4158 @property
4159 def type(self):
4160 """
4161 See the class documentation.
4162 """
4163 if self.orig_type is TRISTATE and \
4164 (self.choice and self.choice.tri_value == 2 or
4165 not self.kconfig.modules.tri_value):
4166
4167 return BOOL
4168
4169 return self.orig_type
4170
4171 @property
4172 def str_value(self):
4173 """
4174 See the class documentation.
4175 """
4176 if self._cached_str_val is not None:
4177 return self._cached_str_val
4178
4179 if self.orig_type in _BOOL_TRISTATE:
4180 # Also calculates the visibility, so invalidation safe
4181 self._cached_str_val = TRI_TO_STR[self.tri_value]
4182 return self._cached_str_val
4183
4184 # As a quirk of Kconfig, undefined symbols get their name as their
4185 # string value. This is why things like "FOO = bar" work for seeing if
4186 # FOO has the value "bar".
4187 if not self.orig_type: # UNKNOWN
4188 self._cached_str_val = self.name
4189 return self.name
4190
4191 val = ""
4192 # Warning: See Symbol._rec_invalidate(), and note that this is a hidden
4193 # function call (property magic)
4194 vis = self.visibility
4195
4196 self._write_to_conf = (vis != 0)
4197
4198 if self.orig_type in _INT_HEX:
4199 # The C implementation checks the user value against the range in a
4200 # separate code path (post-processing after loading a .config).
4201 # Checking all values here instead makes more sense for us. It
4202 # requires that we check for a range first.
4203
4204 base = _TYPE_TO_BASE[self.orig_type]
4205
4206 # Check if a range is in effect
4207 for low_expr, high_expr, cond in self.ranges:
4208 if expr_value(cond):
4209 has_active_range = True
4210
4211 # The zeros are from the C implementation running strtoll()
4212 # on empty strings
4213 low = int(low_expr.str_value, base) if \
4214 _is_base_n(low_expr.str_value, base) else 0
4215 high = int(high_expr.str_value, base) if \
4216 _is_base_n(high_expr.str_value, base) else 0
4217
4218 break
4219 else:
4220 has_active_range = False
4221
4222 # Defaults are used if the symbol is invisible, lacks a user value,
4223 # or has an out-of-range user value
4224 use_defaults = True
4225
4226 if vis and self.user_value:
4227 user_val = int(self.user_value, base)
4228 if has_active_range and not low <= user_val <= high:
4229 num2str = str if base == 10 else hex
4230 self.kconfig._warn(
4231 "user value {} on the {} symbol {} ignored due to "
4232 "being outside the active range ([{}, {}]) -- falling "
4233 "back on defaults"
4234 .format(num2str(user_val), TYPE_TO_STR[self.orig_type],
4235 _name_and_loc(self),
4236 num2str(low), num2str(high)))
4237 else:
4238 # If the user value is well-formed and satisfies range
4239 # contraints, it is stored in exactly the same form as
4240 # specified in the assignment (with or without "0x", etc.)
4241 val = self.user_value
4242 use_defaults = False
4243
4244 if use_defaults:
4245 # No user value or invalid user value. Look at defaults.
4246
4247 # Used to implement the warning below
4248 has_default = False
4249
4250 for sym, cond in self.defaults:
4251 if expr_value(cond):
4252 has_default = self._write_to_conf = True
4253
4254 val = sym.str_value
4255
4256 if _is_base_n(val, base):
4257 val_num = int(val, base)
4258 else:
4259 val_num = 0 # strtoll() on empty string
4260
4261 break
4262 else:
4263 val_num = 0 # strtoll() on empty string
4264
4265 # This clamping procedure runs even if there's no default
4266 if has_active_range:
4267 clamp = None
4268 if val_num < low:
4269 clamp = low
4270 elif val_num > high:
4271 clamp = high
4272
4273 if clamp is not None:
4274 # The value is rewritten to a standard form if it is
4275 # clamped
4276 val = str(clamp) \
4277 if self.orig_type is INT else \
4278 hex(clamp)
4279
4280 if has_default:
4281 num2str = str if base == 10 else hex
4282 self.kconfig._warn(
4283 "default value {} on {} clamped to {} due to "
4284 "being outside the active range ([{}, {}])"
4285 .format(val_num, _name_and_loc(self),
4286 num2str(clamp), num2str(low),
4287 num2str(high)))
4288
4289 elif self.orig_type is STRING:
4290 if vis and self.user_value is not None:
4291 # If the symbol is visible and has a user value, use that
4292 val = self.user_value
4293 else:
4294 # Otherwise, look at defaults
4295 for sym, cond in self.defaults:
4296 if expr_value(cond):
4297 val = sym.str_value
4298 self._write_to_conf = True
4299 break
4300
4301 # env_var corresponds to SYMBOL_AUTO in the C implementation, and is
4302 # also set on the defconfig_list symbol there. Test for the
4303 # defconfig_list symbol explicitly instead here, to avoid a nonsensical
4304 # env_var setting and the defconfig_list symbol being printed
4305 # incorrectly. This code is pretty cold anyway.
4306 if self.env_var is not None or self is self.kconfig.defconfig_list:
4307 self._write_to_conf = False
4308
4309 self._cached_str_val = val
4310 return val
4311
4312 @property
4313 def tri_value(self):
4314 """
4315 See the class documentation.
4316 """
4317 if self._cached_tri_val is not None:
4318 return self._cached_tri_val
4319
4320 if self.orig_type not in _BOOL_TRISTATE:
4321 if self.orig_type: # != UNKNOWN
4322 # Would take some work to give the location here
4323 self.kconfig._warn(
4324 "The {} symbol {} is being evaluated in a logical context "
4325 "somewhere. It will always evaluate to n."
4326 .format(TYPE_TO_STR[self.orig_type], _name_and_loc(self)))
4327
4328 self._cached_tri_val = 0
4329 return 0
4330
4331 # Warning: See Symbol._rec_invalidate(), and note that this is a hidden
4332 # function call (property magic)
4333 vis = self.visibility
4334 self._write_to_conf = (vis != 0)
4335
4336 val = 0
4337
4338 if not self.choice:
4339 # Non-choice symbol
4340
4341 if vis and self.user_value is not None:
4342 # If the symbol is visible and has a user value, use that
4343 val = min(self.user_value, vis)
4344
4345 else:
4346 # Otherwise, look at defaults and weak reverse dependencies
4347 # (implies)
4348
4349 for default, cond in self.defaults:
4350 dep_val = expr_value(cond)
4351 if dep_val:
4352 val = min(expr_value(default), dep_val)
4353 if val:
4354 self._write_to_conf = True
4355 break
4356
4357 # Weak reverse dependencies are only considered if our
4358 # direct dependencies are met
4359 dep_val = expr_value(self.weak_rev_dep)
4360 if dep_val and expr_value(self.direct_dep):
4361 val = max(dep_val, val)
4362 self._write_to_conf = True
4363
4364 # Reverse (select-related) dependencies take precedence
4365 dep_val = expr_value(self.rev_dep)
4366 if dep_val:
4367 if expr_value(self.direct_dep) < dep_val:
4368 self._warn_select_unsatisfied_deps()
4369
4370 val = max(dep_val, val)
4371 self._write_to_conf = True
4372
4373 # m is promoted to y for (1) bool symbols and (2) symbols with a
4374 # weak_rev_dep (from imply) of y
4375 if val == 1 and \
4376 (self.type is BOOL or expr_value(self.weak_rev_dep) == 2):
4377 val = 2
4378
4379 elif vis == 2:
4380 # Visible choice symbol in y-mode choice. The choice mode limits
4381 # the visibility of choice symbols, so it's sufficient to just
4382 # check the visibility of the choice symbols themselves.
4383 val = 2 if self.choice.selection is self else 0
4384
4385 elif vis and self.user_value:
4386 # Visible choice symbol in m-mode choice, with set non-0 user value
4387 val = 1
4388
4389 self._cached_tri_val = val
4390 return val
4391
4392 @property
4393 def assignable(self):
4394 """
4395 See the class documentation.
4396 """
4397 if self._cached_assignable is None:
4398 self._cached_assignable = self._assignable()
4399 return self._cached_assignable
4400
4401 @property
4402 def visibility(self):
4403 """
4404 See the class documentation.
4405 """
4406 if self._cached_vis is None:
4407 self._cached_vis = _visibility(self)
4408 return self._cached_vis
4409
4410 @property
4411 def config_string(self):
4412 """
4413 See the class documentation.
4414 """
4415 # _write_to_conf is determined when the value is calculated. This is a
4416 # hidden function call due to property magic.
4417 val = self.str_value
4418 if not self._write_to_conf:
4419 return ""
4420
4421 if self.orig_type in _BOOL_TRISTATE:
4422 return "{}{}={}\n" \
4423 .format(self.kconfig.config_prefix, self.name, val) \
4424 if val != "n" else \
4425 "# {}{} is not set\n" \
4426 .format(self.kconfig.config_prefix, self.name)
4427
4428 if self.orig_type in _INT_HEX:
4429 return "{}{}={}\n" \
4430 .format(self.kconfig.config_prefix, self.name, val)
4431
4432 # sym.orig_type is STRING
4433 return '{}{}="{}"\n' \
4434 .format(self.kconfig.config_prefix, self.name, escape(val))
4435
4436 def set_value(self, value):
4437 """
4438 Sets the user value of the symbol.
4439
4440 Equal in effect to assigning the value to the symbol within a .config
4441 file. For bool and tristate symbols, use the 'assignable' attribute to
4442 check which values can currently be assigned. Setting values outside
4443 'assignable' will cause Symbol.user_value to differ from
4444 Symbol.str/tri_value (be truncated down or up).
4445
4446 Setting a choice symbol to 2 (y) sets Choice.user_selection to the
4447 choice symbol in addition to setting Symbol.user_value.
4448 Choice.user_selection is considered when the choice is in y mode (the
4449 "normal" mode).
4450
4451 Other symbols that depend (possibly indirectly) on this symbol are
4452 automatically recalculated to reflect the assigned value.
4453
4454 value:
4455 The user value to give to the symbol. For bool and tristate symbols,
4456 n/m/y can be specified either as 0/1/2 (the usual format for tristate
4457 values in Kconfiglib) or as one of the strings "n"/"m"/"y". For other
4458 symbol types, pass a string.
4459
4460 Note that the value for an int/hex symbol is passed as a string, e.g.
4461 "123" or "0x0123". The format of this string is preserved in the
4462 output.
4463
4464 Values that are invalid for the type (such as "foo" or 1 (m) for a
4465 BOOL or "0x123" for an INT) are ignored and won't be stored in
4466 Symbol.user_value. Kconfiglib will print a warning by default for
4467 invalid assignments, and set_value() will return False.
4468
4469 Returns True if the value is valid for the type of the symbol, and
4470 False otherwise. This only looks at the form of the value. For BOOL and
4471 TRISTATE symbols, check the Symbol.assignable attribute to see what
4472 values are currently in range and would actually be reflected in the
4473 value of the symbol. For other symbol types, check whether the
4474 visibility is non-n.
4475 """
4476 if self.orig_type in _BOOL_TRISTATE and value in STR_TO_TRI:
4477 value = STR_TO_TRI[value]
4478
4479 # If the new user value matches the old, nothing changes, and we can
4480 # avoid invalidating cached values.
4481 #
4482 # This optimization is skipped for choice symbols: Setting a choice
4483 # symbol's user value to y might change the state of the choice, so it
4484 # wouldn't be safe (symbol user values always match the values set in a
4485 # .config file or via set_value(), and are never implicitly updated).
4486 if value == self.user_value and not self.choice:
4487 self._was_set = True
4488 return True
4489
4490 # Check if the value is valid for our type
4491 if not (self.orig_type is BOOL and value in (2, 0) or
4492 self.orig_type is TRISTATE and value in TRI_TO_STR or
4493 value.__class__ is str and
4494 (self.orig_type is STRING or
4495 self.orig_type is INT and _is_base_n(value, 10) or
4496 self.orig_type is HEX and _is_base_n(value, 16)
4497 and int(value, 16) >= 0)):
4498
4499 # Display tristate values as n, m, y in the warning
4500 self.kconfig._warn(
4501 "the value {} is invalid for {}, which has type {} -- "
4502 "assignment ignored"
4503 .format(TRI_TO_STR[value] if value in TRI_TO_STR else
4504 "'{}'".format(value),
4505 _name_and_loc(self), TYPE_TO_STR[self.orig_type]))
4506
4507 return False
4508
4509 self.user_value = value
4510 self._was_set = True
4511
4512 if self.choice and value == 2:
4513 # Setting a choice symbol to y makes it the user selection of the
4514 # choice. Like for symbol user values, the user selection is not
4515 # guaranteed to match the actual selection of the choice, as
4516 # dependencies come into play.
4517 self.choice.user_selection = self
4518 self.choice._was_set = True
4519 self.choice._rec_invalidate()
4520 else:
4521 self._rec_invalidate_if_has_prompt()
4522
4523 return True
4524
4525 def unset_value(self):
4526 """
4527 Removes any user value from the symbol, as if the symbol had never
4528 gotten a user value via Kconfig.load_config() or Symbol.set_value().
4529 """
4530 if self.user_value is not None:
4531 self.user_value = None
4532 self._rec_invalidate_if_has_prompt()
4533
4534 @property
4535 def referenced(self):
4536 """
4537 See the class documentation.
4538 """
4539 return {item for node in self.nodes for item in node.referenced}
4540
4541 @property
4542 def orig_defaults(self):
4543 """
4544 See the class documentation.
4545 """
4546 return [d for node in self.nodes for d in node.orig_defaults]
4547
4548 @property
4549 def orig_selects(self):
4550 """
4551 See the class documentation.
4552 """
4553 return [s for node in self.nodes for s in node.orig_selects]
4554
4555 @property
4556 def orig_implies(self):
4557 """
4558 See the class documentation.
4559 """
4560 return [i for node in self.nodes for i in node.orig_implies]
4561
4562 @property
4563 def orig_ranges(self):
4564 """
4565 See the class documentation.
4566 """
4567 return [r for node in self.nodes for r in node.orig_ranges]
4568
4569 def __repr__(self):
4570 """
4571 Returns a string with information about the symbol (including its name,
4572 value, visibility, and location(s)) when it is evaluated on e.g. the
4573 interactive Python prompt.
4574 """
4575 fields = ["symbol " + self.name, TYPE_TO_STR[self.type]]
4576 add = fields.append
4577
4578 for node in self.nodes:
4579 if node.prompt:
4580 add('"{}"'.format(node.prompt[0]))
4581
4582 # Only add quotes for non-bool/tristate symbols
4583 add("value " + (self.str_value if self.orig_type in _BOOL_TRISTATE
4584 else '"{}"'.format(self.str_value)))
4585
4586 if not self.is_constant:
4587 # These aren't helpful to show for constant symbols
4588
4589 if self.user_value is not None:
4590 # Only add quotes for non-bool/tristate symbols
4591 add("user value " + (TRI_TO_STR[self.user_value]
4592 if self.orig_type in _BOOL_TRISTATE
4593 else '"{}"'.format(self.user_value)))
4594
4595 add("visibility " + TRI_TO_STR[self.visibility])
4596
4597 if self.choice:
4598 add("choice symbol")
4599
4600 if self.is_allnoconfig_y:
4601 add("allnoconfig_y")
4602
4603 if self is self.kconfig.defconfig_list:
4604 add("is the defconfig_list symbol")
4605
4606 if self.env_var is not None:
4607 add("from environment variable " + self.env_var)
4608
4609 if self is self.kconfig.modules:
4610 add("is the modules symbol")
4611
4612 add("direct deps " + TRI_TO_STR[expr_value(self.direct_dep)])
4613
4614 if self.nodes:
4615 for node in self.nodes:
4616 add("{}:{}".format(node.filename, node.linenr))
4617 else:
4618 add("constant" if self.is_constant else "undefined")
4619
4620 return "<{}>".format(", ".join(fields))
4621
4622 def __str__(self):
4623 """
4624 Returns a string representation of the symbol when it is printed.
4625 Matches the Kconfig format, with any parent dependencies propagated to
4626 the 'depends on' condition.
4627
4628 The string is constructed by joining the strings returned by
4629 MenuNode.__str__() for each of the symbol's menu nodes, so symbols
4630 defined in multiple locations will return a string with all
4631 definitions.
4632
4633 The returned string does not end in a newline. An empty string is
4634 returned for undefined and constant symbols.
4635 """
4636 return self.custom_str(standard_sc_expr_str)
4637
4638 def custom_str(self, sc_expr_str_fn):
4639 """
4640 Works like Symbol.__str__(), but allows a custom format to be used for
4641 all symbol/choice references. See expr_str().
4642 """
4643 return "\n\n".join(node.custom_str(sc_expr_str_fn)
4644 for node in self.nodes)
4645
4646 #
4647 # Private methods
4648 #
4649
4650 def __init__(self):
4651 """
4652 Symbol constructor -- not intended to be called directly by Kconfiglib
4653 clients.
4654 """
4655 # These attributes are always set on the instance from outside and
4656 # don't need defaults:
4657 # kconfig
4658 # direct_dep
4659 # is_constant
4660 # name
4661 # rev_dep
4662 # weak_rev_dep
4663
4664 # - UNKNOWN == 0
4665 # - _visited is used during tree iteration and dep. loop detection
4666 self.orig_type = self._visited = 0
4667
4668 self.nodes = []
4669
4670 self.defaults = []
4671 self.selects = []
4672 self.implies = []
4673 self.ranges = []
4674
4675 self.user_value = \
4676 self.choice = \
4677 self.env_var = \
4678 self._cached_str_val = self._cached_tri_val = self._cached_vis = \
4679 self._cached_assignable = None
4680
4681 # _write_to_conf is calculated along with the value. If True, the
4682 # Symbol gets a .config entry.
4683
4684 self.is_allnoconfig_y = \
4685 self._was_set = \
4686 self._write_to_conf = False
4687
4688 # See Kconfig._build_dep()
4689 self._dependents = set()
4690
4691 def _assignable(self):
4692 # Worker function for the 'assignable' attribute
4693
4694 if self.orig_type not in _BOOL_TRISTATE:
4695 return ()
4696
4697 # Warning: See Symbol._rec_invalidate(), and note that this is a hidden
4698 # function call (property magic)
4699 vis = self.visibility
4700 if not vis:
4701 return ()
4702
4703 rev_dep_val = expr_value(self.rev_dep)
4704
4705 if vis == 2:
4706 if self.choice:
4707 return (2,)
4708
4709 if not rev_dep_val:
4710 if self.type is BOOL or expr_value(self.weak_rev_dep) == 2:
4711 return (0, 2)
4712 return (0, 1, 2)
4713
4714 if rev_dep_val == 2:
4715 return (2,)
4716
4717 # rev_dep_val == 1
4718
4719 if self.type is BOOL or expr_value(self.weak_rev_dep) == 2:
4720 return (2,)
4721 return (1, 2)
4722
4723 # vis == 1
4724
4725 # Must be a tristate here, because bool m visibility gets promoted to y
4726
4727 if not rev_dep_val:
4728 return (0, 1) if expr_value(self.weak_rev_dep) != 2 else (0, 2)
4729
4730 if rev_dep_val == 2:
4731 return (2,)
4732
4733 # vis == rev_dep_val == 1
4734
4735 return (1,)
Masahiro Yamada48386dd2015-05-27 11:39:22 +09004736
Masahiro Yamadac908bc82014-09-01 19:57:37 +09004737 def _invalidate(self):
Tom Rini3c5f4152019-09-20 17:42:09 -04004738 # Marks the symbol as needing to be recalculated
4739
4740 self._cached_str_val = self._cached_tri_val = self._cached_vis = \
4741 self._cached_assignable = None
4742
4743 def _rec_invalidate(self):
4744 # Invalidates the symbol and all items that (possibly) depend on it
4745
4746 if self is self.kconfig.modules:
4747 # Invalidating MODULES has wide-ranging effects
4748 self.kconfig._invalidate_all()
4749 else:
4750 self._invalidate()
4751
4752 for item in self._dependents:
4753 # _cached_vis doubles as a flag that tells us whether 'item'
4754 # has cached values, because it's calculated as a side effect
4755 # of calculating all other (non-constant) cached values.
4756 #
4757 # If item._cached_vis is None, it means there can't be cached
4758 # values on other items that depend on 'item', because if there
4759 # were, some value on 'item' would have been calculated and
4760 # item._cached_vis set as a side effect. It's therefore safe to
4761 # stop the invalidation at symbols with _cached_vis None.
4762 #
4763 # This approach massively speeds up scripts that set a lot of
4764 # values, vs simply invalidating all possibly dependent symbols
4765 # (even when you already have a list of all the dependent
4766 # symbols, because some symbols get huge dependency trees).
4767 #
4768 # This gracefully handles dependency loops too, which is nice
4769 # for choices, where the choice depends on the choice symbols
4770 # and vice versa.
4771 if item._cached_vis is not None:
4772 item._rec_invalidate()
4773
4774 def _rec_invalidate_if_has_prompt(self):
4775 # Invalidates the symbol and its dependent symbols, but only if the
4776 # symbol has a prompt. User values never have an effect on promptless
4777 # symbols, so we skip invalidation for them as an optimization.
4778 #
4779 # This also prevents constant (quoted) symbols from being invalidated
4780 # if set_value() is called on them, which would make them lose their
4781 # value and break things.
4782 #
4783 # Prints a warning if the symbol has no prompt. In some contexts (e.g.
4784 # when loading a .config files) assignments to promptless symbols are
4785 # normal and expected, so the warning can be disabled.
4786
4787 for node in self.nodes:
4788 if node.prompt:
4789 self._rec_invalidate()
4790 return
4791
4792 if self.kconfig._warn_assign_no_prompt:
4793 self.kconfig._warn(_name_and_loc(self) + " has no prompt, meaning "
4794 "user values have no effect on it")
4795
4796 def _str_default(self):
4797 # write_min_config() helper function. Returns the value the symbol
4798 # would get from defaults if it didn't have a user value. Uses exactly
4799 # the same algorithm as the C implementation (though a bit cleaned up),
4800 # for compatibility.
4801
4802 if self.orig_type in _BOOL_TRISTATE:
4803 val = 0
4804
4805 # Defaults, selects, and implies do not affect choice symbols
4806 if not self.choice:
4807 for default, cond in self.defaults:
4808 cond_val = expr_value(cond)
4809 if cond_val:
4810 val = min(expr_value(default), cond_val)
4811 break
4812
4813 val = max(expr_value(self.rev_dep),
4814 expr_value(self.weak_rev_dep),
4815 val)
4816
4817 # Transpose mod to yes if type is bool (possibly due to modules
4818 # being disabled)
4819 if val == 1 and self.type is BOOL:
4820 val = 2
4821
4822 return TRI_TO_STR[val]
4823
4824 if self.orig_type: # STRING/INT/HEX
4825 for default, cond in self.defaults:
4826 if expr_value(cond):
4827 return default.str_value
4828
4829 return ""
4830
4831 def _warn_select_unsatisfied_deps(self):
4832 # Helper for printing an informative warning when a symbol with
4833 # unsatisfied direct dependencies (dependencies from 'depends on', ifs,
4834 # and menus) is selected by some other symbol. Also warn if a symbol
4835 # whose direct dependencies evaluate to m is selected to y.
4836
4837 msg = "{} has direct dependencies {} with value {}, but is " \
4838 "currently being {}-selected by the following symbols:" \
4839 .format(_name_and_loc(self), expr_str(self.direct_dep),
4840 TRI_TO_STR[expr_value(self.direct_dep)],
4841 TRI_TO_STR[expr_value(self.rev_dep)])
4842
4843 # The reverse dependencies from each select are ORed together
4844 for select in split_expr(self.rev_dep, OR):
4845 if expr_value(select) <= expr_value(self.direct_dep):
4846 # Only include selects that exceed the direct dependencies
4847 continue
4848
4849 # - 'select A if B' turns into A && B
4850 # - 'select A' just turns into A
4851 #
4852 # In both cases, we can split on AND and pick the first operand
4853 selecting_sym = split_expr(select, AND)[0]
4854
4855 msg += "\n - {}, with value {}, direct dependencies {} " \
4856 "(value: {})" \
4857 .format(_name_and_loc(selecting_sym),
4858 selecting_sym.str_value,
4859 expr_str(selecting_sym.direct_dep),
4860 TRI_TO_STR[expr_value(selecting_sym.direct_dep)])
4861
4862 if select.__class__ is tuple:
4863 msg += ", and select condition {} (value: {})" \
4864 .format(expr_str(select[2]),
4865 TRI_TO_STR[expr_value(select[2])])
4866
4867 self.kconfig._warn(msg)
4868
4869
4870class Choice(object):
4871 """
4872 Represents a choice statement:
4873
4874 choice
4875 ...
4876 endchoice
4877
4878 The following attributes are available on Choice instances. They should be
4879 treated as read-only, and some are implemented through @property magic (but
4880 are still efficient to access due to internal caching).
4881
4882 Note: Prompts, help texts, and locations are stored in the Choice's
4883 MenuNode(s) rather than in the Choice itself. Check the MenuNode class and
4884 the Choice.nodes attribute. This organization matches the C tools.
4885
4886 name:
4887 The name of the choice, e.g. "FOO" for 'choice FOO', or None if the
4888 Choice has no name.
4889
4890 type:
4891 The type of the choice. One of BOOL, TRISTATE, UNKNOWN. UNKNOWN is for
4892 choices defined without a type where none of the contained symbols have a
4893 type either (otherwise the choice inherits the type of the first symbol
4894 defined with a type).
4895
4896 When running without modules (CONFIG_MODULES=n), TRISTATE choices
4897 magically change type to BOOL. This matches the C tools, and makes sense
4898 for menuconfig-like functionality.
4899
4900 orig_type:
4901 The type as given in the Kconfig file, without any magic applied. Used
4902 when printing the choice.
4903
4904 tri_value:
4905 The tristate value (mode) of the choice. A choice can be in one of three
4906 modes:
4907
4908 0 (n) - The choice is disabled and no symbols can be selected. For
4909 visible choices, this mode is only possible for choices with
4910 the 'optional' flag set (see kconfig-language.txt).
4911
4912 1 (m) - Any number of choice symbols can be set to m, the rest will
4913 be n.
4914
4915 2 (y) - One symbol will be y, the rest n.
4916
4917 Only tristate choices can be in m mode. The visibility of the choice is
4918 an upper bound on the mode, and the mode in turn is an upper bound on the
4919 visibility of the choice symbols.
4920
4921 To change the mode, use Choice.set_value().
4922
4923 Implementation note:
4924 The C tools internally represent choices as a type of symbol, with
4925 special-casing in many code paths. This is why there is a lot of
4926 similarity to Symbol. The value (mode) of a choice is really just a
4927 normal symbol value, and an implicit reverse dependency forces its
4928 lower bound to m for visible non-optional choices (the reverse
4929 dependency is 'm && <visibility>').
4930
4931 Symbols within choices get the choice propagated as a dependency to
4932 their properties. This turns the mode of the choice into an upper bound
4933 on e.g. the visibility of choice symbols, and explains the gotcha
4934 related to printing choice symbols mentioned in the module docstring.
4935
4936 Kconfiglib uses a separate Choice class only because it makes the code
4937 and interface less confusing (especially in a user-facing interface).
4938 Corresponding attributes have the same name in the Symbol and Choice
4939 classes, for consistency and compatibility.
4940
4941 assignable:
4942 See the symbol class documentation. Gives the assignable values (modes).
4943
4944 visibility:
4945 See the Symbol class documentation. Acts on the value (mode).
4946
4947 selection:
4948 The Symbol instance of the currently selected symbol. None if the Choice
4949 is not in y mode or has no selected symbol (due to unsatisfied
4950 dependencies on choice symbols).
4951
4952 WARNING: Do not assign directly to this. It will break things. Call
4953 sym.set_value(2) on the choice symbol you want to select instead.
4954
4955 user_value:
4956 The value (mode) selected by the user through Choice.set_value(). Either
4957 0, 1, or 2, or None if the user hasn't selected a mode. See
4958 Symbol.user_value.
4959
4960 WARNING: Do not assign directly to this. It will break things. Use
4961 Choice.set_value() instead.
4962
4963 user_selection:
4964 The symbol selected by the user (by setting it to y). Ignored if the
4965 choice is not in y mode, but still remembered so that the choice "snaps
4966 back" to the user selection if the mode is changed back to y. This might
4967 differ from 'selection' due to unsatisfied dependencies.
4968
4969 WARNING: Do not assign directly to this. It will break things. Call
4970 sym.set_value(2) on the choice symbol to be selected instead.
4971
4972 syms:
4973 List of symbols contained in the choice.
4974
4975 Obscure gotcha: If a symbol depends on the previous symbol within a
4976 choice so that an implicit menu is created, it won't be a choice symbol,
4977 and won't be included in 'syms'.
4978
4979 nodes:
4980 A list of MenuNodes for this choice. In practice, the list will probably
4981 always contain a single MenuNode, but it is possible to give a choice a
4982 name and define it in multiple locations.
4983
4984 defaults:
4985 List of (symbol, cond) tuples for the choice's 'defaults' properties. For
4986 example, 'default A if B && C' is represented as (A, (AND, B, C)). If
4987 there is no condition, 'cond' is self.kconfig.y.
4988
4989 Note that 'depends on' and parent dependencies are propagated to
4990 'default' conditions.
4991
4992 orig_defaults:
4993 See the corresponding attribute on the MenuNode class.
4994
4995 direct_dep:
4996 See Symbol.direct_dep.
4997
4998 referenced:
4999 A set() with all symbols referenced in the properties and property
5000 conditions of the choice.
5001
5002 Also includes dependencies from surrounding menus and ifs, because those
5003 get propagated to the choice (see the 'Intro to symbol values' section in
5004 the module docstring).
5005
5006 is_optional:
5007 True if the choice has the 'optional' flag set on it and can be in
5008 n mode.
5009
5010 kconfig:
5011 The Kconfig instance this choice is from.
5012 """
5013 __slots__ = (
5014 "_cached_assignable",
5015 "_cached_selection",
5016 "_cached_vis",
5017 "_dependents",
5018 "_visited",
5019 "_was_set",
5020 "defaults",
5021 "direct_dep",
5022 "is_constant",
5023 "is_optional",
5024 "kconfig",
5025 "name",
5026 "nodes",
5027 "orig_type",
5028 "syms",
5029 "user_selection",
5030 "user_value",
5031 )
5032
5033 #
5034 # Public interface
5035 #
5036
5037 @property
5038 def type(self):
5039 """
5040 Returns the type of the choice. See Symbol.type.
5041 """
5042 if self.orig_type is TRISTATE and not self.kconfig.modules.tri_value:
5043 return BOOL
5044 return self.orig_type
5045
5046 @property
5047 def str_value(self):
5048 """
5049 See the class documentation.
5050 """
5051 return TRI_TO_STR[self.tri_value]
5052
5053 @property
5054 def tri_value(self):
5055 """
5056 See the class documentation.
5057 """
5058 # This emulates a reverse dependency of 'm && visibility' for
5059 # non-optional choices, which is how the C implementation does it
5060
5061 val = 0 if self.is_optional else 1
5062
5063 if self.user_value is not None:
5064 val = max(val, self.user_value)
5065
5066 # Warning: See Symbol._rec_invalidate(), and note that this is a hidden
5067 # function call (property magic)
5068 val = min(val, self.visibility)
5069
5070 # Promote m to y for boolean choices
5071 return 2 if val == 1 and self.type is BOOL else val
5072
5073 @property
5074 def assignable(self):
5075 """
5076 See the class documentation.
5077 """
5078 if self._cached_assignable is None:
5079 self._cached_assignable = self._assignable()
5080 return self._cached_assignable
5081
5082 @property
5083 def visibility(self):
5084 """
5085 See the class documentation.
5086 """
5087 if self._cached_vis is None:
5088 self._cached_vis = _visibility(self)
5089 return self._cached_vis
5090
5091 @property
5092 def selection(self):
5093 """
5094 See the class documentation.
5095 """
5096 if self._cached_selection is _NO_CACHED_SELECTION:
5097 self._cached_selection = self._selection()
5098 return self._cached_selection
5099
5100 def set_value(self, value):
5101 """
5102 Sets the user value (mode) of the choice. Like for Symbol.set_value(),
5103 the visibility might truncate the value. Choices without the 'optional'
5104 attribute (is_optional) can never be in n mode, but 0/"n" is still
5105 accepted since it's not a malformed value (though it will have no
5106 effect).
5107
5108 Returns True if the value is valid for the type of the choice, and
5109 False otherwise. This only looks at the form of the value. Check the
5110 Choice.assignable attribute to see what values are currently in range
5111 and would actually be reflected in the mode of the choice.
5112 """
5113 if value in STR_TO_TRI:
5114 value = STR_TO_TRI[value]
5115
5116 if value == self.user_value:
5117 # We know the value must be valid if it was successfully set
5118 # previously
5119 self._was_set = True
5120 return True
5121
5122 if not (self.orig_type is BOOL and value in (2, 0) or
5123 self.orig_type is TRISTATE and value in TRI_TO_STR):
5124
5125 # Display tristate values as n, m, y in the warning
5126 self.kconfig._warn(
5127 "the value {} is invalid for {}, which has type {} -- "
5128 "assignment ignored"
5129 .format(TRI_TO_STR[value] if value in TRI_TO_STR else
5130 "'{}'".format(value),
5131 _name_and_loc(self), TYPE_TO_STR[self.orig_type]))
5132
5133 return False
5134
5135 self.user_value = value
5136 self._was_set = True
5137 self._rec_invalidate()
5138
5139 return True
5140
5141 def unset_value(self):
5142 """
5143 Resets the user value (mode) and user selection of the Choice, as if
5144 the user had never touched the mode or any of the choice symbols.
5145 """
5146 if self.user_value is not None or self.user_selection:
5147 self.user_value = self.user_selection = None
5148 self._rec_invalidate()
5149
5150 @property
5151 def referenced(self):
5152 """
5153 See the class documentation.
5154 """
5155 return {item for node in self.nodes for item in node.referenced}
5156
5157 @property
5158 def orig_defaults(self):
5159 """
5160 See the class documentation.
5161 """
5162 return [d for node in self.nodes for d in node.orig_defaults]
5163
5164 def __repr__(self):
5165 """
5166 Returns a string with information about the choice when it is evaluated
5167 on e.g. the interactive Python prompt.
5168 """
5169 fields = ["choice " + self.name if self.name else "choice",
5170 TYPE_TO_STR[self.type]]
5171 add = fields.append
5172
5173 for node in self.nodes:
5174 if node.prompt:
5175 add('"{}"'.format(node.prompt[0]))
5176
5177 add("mode " + self.str_value)
5178
5179 if self.user_value is not None:
5180 add('user mode {}'.format(TRI_TO_STR[self.user_value]))
5181
5182 if self.selection:
5183 add("{} selected".format(self.selection.name))
5184
5185 if self.user_selection:
5186 user_sel_str = "{} selected by user" \
5187 .format(self.user_selection.name)
5188
5189 if self.selection is not self.user_selection:
5190 user_sel_str += " (overridden)"
5191
5192 add(user_sel_str)
5193
5194 add("visibility " + TRI_TO_STR[self.visibility])
5195
5196 if self.is_optional:
5197 add("optional")
5198
5199 for node in self.nodes:
5200 add("{}:{}".format(node.filename, node.linenr))
5201
5202 return "<{}>".format(", ".join(fields))
5203
5204 def __str__(self):
5205 """
5206 Returns a string representation of the choice when it is printed.
5207 Matches the Kconfig format (though without the contained choice
5208 symbols), with any parent dependencies propagated to the 'depends on'
5209 condition.
5210
5211 The returned string does not end in a newline.
5212
5213 See Symbol.__str__() as well.
5214 """
5215 return self.custom_str(standard_sc_expr_str)
5216
5217 def custom_str(self, sc_expr_str_fn):
5218 """
5219 Works like Choice.__str__(), but allows a custom format to be used for
5220 all symbol/choice references. See expr_str().
5221 """
5222 return "\n\n".join(node.custom_str(sc_expr_str_fn)
5223 for node in self.nodes)
5224
5225 #
5226 # Private methods
5227 #
5228
5229 def __init__(self):
5230 """
5231 Choice constructor -- not intended to be called directly by Kconfiglib
5232 clients.
5233 """
5234 # These attributes are always set on the instance from outside and
5235 # don't need defaults:
5236 # direct_dep
5237 # kconfig
5238
5239 # - UNKNOWN == 0
5240 # - _visited is used during dep. loop detection
5241 self.orig_type = self._visited = 0
5242
5243 self.nodes = []
5244
5245 self.syms = []
5246 self.defaults = []
5247
5248 self.name = \
5249 self.user_value = self.user_selection = \
5250 self._cached_vis = self._cached_assignable = None
5251
5252 self._cached_selection = _NO_CACHED_SELECTION
5253
5254 # is_constant is checked by _make_depend_on(). Just set it to avoid
5255 # having to special-case choices.
5256 self.is_constant = self.is_optional = False
5257
5258 # See Kconfig._build_dep()
5259 self._dependents = set()
5260
5261 def _assignable(self):
5262 # Worker function for the 'assignable' attribute
5263
5264 # Warning: See Symbol._rec_invalidate(), and note that this is a hidden
5265 # function call (property magic)
5266 vis = self.visibility
5267
5268 if not vis:
5269 return ()
5270
5271 if vis == 2:
5272 if not self.is_optional:
5273 return (2,) if self.type is BOOL else (1, 2)
5274 return (0, 2) if self.type is BOOL else (0, 1, 2)
5275
5276 # vis == 1
5277
5278 return (0, 1) if self.is_optional else (1,)
5279
5280 def _selection(self):
5281 # Worker function for the 'selection' attribute
5282
5283 # Warning: See Symbol._rec_invalidate(), and note that this is a hidden
5284 # function call (property magic)
5285 if self.tri_value != 2:
5286 # Not in y mode, so no selection
5287 return None
5288
5289 # Use the user selection if it's visible
5290 if self.user_selection and self.user_selection.visibility:
5291 return self.user_selection
5292
5293 # Otherwise, check if we have a default
5294 return self._selection_from_defaults()
5295
5296 def _selection_from_defaults(self):
5297 # Check if we have a default
5298 for sym, cond in self.defaults:
5299 # The default symbol must be visible too
5300 if expr_value(cond) and sym.visibility:
5301 return sym
5302
5303 # Otherwise, pick the first visible symbol, if any
5304 for sym in self.syms:
5305 if sym.visibility:
5306 return sym
5307
5308 # Couldn't find a selection
5309 return None
5310
5311 def _invalidate(self):
5312 self._cached_vis = self._cached_assignable = None
5313 self._cached_selection = _NO_CACHED_SELECTION
5314
5315 def _rec_invalidate(self):
5316 # See Symbol._rec_invalidate()
5317
5318 self._invalidate()
5319
5320 for item in self._dependents:
5321 if item._cached_vis is not None:
5322 item._rec_invalidate()
5323
5324
5325class MenuNode(object):
5326 """
5327 Represents a menu node in the configuration. This corresponds to an entry
5328 in e.g. the 'make menuconfig' interface, though non-visible choices, menus,
5329 and comments also get menu nodes. If a symbol or choice is defined in
5330 multiple locations, it gets one menu node for each location.
5331
5332 The top-level menu node, corresponding to the implicit top-level menu, is
5333 available in Kconfig.top_node.
5334
5335 The menu nodes for a Symbol or Choice can be found in the
5336 Symbol/Choice.nodes attribute. Menus and comments are represented as plain
5337 menu nodes, with their text stored in the prompt attribute (prompt[0]).
5338 This mirrors the C implementation.
5339
5340 The following attributes are available on MenuNode instances. They should
5341 be viewed as read-only.
5342
5343 item:
5344 Either a Symbol, a Choice, or one of the constants MENU and COMMENT.
5345 Menus and comments are represented as plain menu nodes. Ifs are collapsed
5346 (matching the C implementation) and do not appear in the final menu tree.
5347
5348 next:
5349 The following menu node. None if there is no following node.
5350
5351 list:
5352 The first child menu node. None if there are no children.
5353
5354 Choices and menus naturally have children, but Symbols can also have
5355 children because of menus created automatically from dependencies (see
5356 kconfig-language.txt).
5357
5358 parent:
5359 The parent menu node. None if there is no parent.
5360
5361 prompt:
5362 A (string, cond) tuple with the prompt for the menu node and its
5363 conditional expression (which is self.kconfig.y if there is no
5364 condition). None if there is no prompt.
5365
5366 For symbols and choices, the prompt is stored in the MenuNode rather than
5367 the Symbol or Choice instance. For menus and comments, the prompt holds
5368 the text.
5369
5370 defaults:
5371 The 'default' properties for this particular menu node. See
5372 symbol.defaults.
5373
5374 When evaluating defaults, you should use Symbol/Choice.defaults instead,
5375 as it include properties from all menu nodes (a symbol/choice can have
5376 multiple definition locations/menu nodes). MenuNode.defaults is meant for
5377 documentation generation.
5378
5379 selects:
5380 Like MenuNode.defaults, for selects.
5381
5382 implies:
5383 Like MenuNode.defaults, for implies.
5384
5385 ranges:
5386 Like MenuNode.defaults, for ranges.
5387
5388 orig_prompt:
5389 orig_defaults:
5390 orig_selects:
5391 orig_implies:
5392 orig_ranges:
5393 These work the like the corresponding attributes without orig_*, but omit
5394 any dependencies propagated from 'depends on' and surrounding 'if's (the
5395 direct dependencies, stored in MenuNode.dep).
5396
5397 One use for this is generating less cluttered documentation, by only
5398 showing the direct dependencies in one place.
5399
5400 help:
5401 The help text for the menu node for Symbols and Choices. None if there is
5402 no help text. Always stored in the node rather than the Symbol or Choice.
5403 It is possible to have a separate help text at each location if a symbol
5404 is defined in multiple locations.
5405
5406 Trailing whitespace (including a final newline) is stripped from the help
5407 text. This was not the case before Kconfiglib 10.21.0, where the format
5408 was undocumented.
5409
5410 dep:
5411 The direct ('depends on') dependencies for the menu node, or
5412 self.kconfig.y if there are no direct dependencies.
5413
5414 This attribute includes any dependencies from surrounding menus and ifs.
5415 Those get propagated to the direct dependencies, and the resulting direct
5416 dependencies in turn get propagated to the conditions of all properties.
5417
5418 If a symbol or choice is defined in multiple locations, only the
5419 properties defined at a particular location get the corresponding
5420 MenuNode.dep dependencies propagated to them.
5421
5422 visibility:
5423 The 'visible if' dependencies for the menu node (which must represent a
5424 menu), or self.kconfig.y if there are no 'visible if' dependencies.
5425 'visible if' dependencies are recursively propagated to the prompts of
5426 symbols and choices within the menu.
5427
5428 referenced:
5429 A set() with all symbols and choices referenced in the properties and
5430 property conditions of the menu node.
5431
5432 Also includes dependencies inherited from surrounding menus and ifs.
5433 Choices appear in the dependencies of choice symbols.
5434
5435 is_menuconfig:
5436 Set to True if the children of the menu node should be displayed in a
5437 separate menu. This is the case for the following items:
5438
5439 - Menus (node.item == MENU)
5440
5441 - Choices
5442
5443 - Symbols defined with the 'menuconfig' keyword. The children come from
5444 implicitly created submenus, and should be displayed in a separate
5445 menu rather than being indented.
5446
5447 'is_menuconfig' is just a hint on how to display the menu node. It's
5448 ignored internally by Kconfiglib, except when printing symbols.
5449
5450 filename/linenr:
5451 The location where the menu node appears. The filename is relative to
5452 $srctree (or to the current directory if $srctree isn't set), except
5453 absolute paths are used for paths outside $srctree.
5454
5455 include_path:
5456 A tuple of (filename, linenr) tuples, giving the locations of the
5457 'source' statements via which the Kconfig file containing this menu node
5458 was included. The first element is the location of the 'source' statement
5459 in the top-level Kconfig file passed to Kconfig.__init__(), etc.
5460
5461 Note that the Kconfig file of the menu node itself isn't included. Check
5462 'filename' and 'linenr' for that.
5463
5464 kconfig:
5465 The Kconfig instance the menu node is from.
5466 """
5467 __slots__ = (
5468 "dep",
5469 "filename",
5470 "help",
5471 "include_path",
5472 "is_menuconfig",
5473 "item",
5474 "kconfig",
5475 "linenr",
5476 "list",
5477 "next",
5478 "parent",
5479 "prompt",
5480 "visibility",
5481
5482 # Properties
5483 "defaults",
5484 "selects",
5485 "implies",
5486 "ranges",
5487 )
5488
5489 def __init__(self):
5490 # Properties defined on this particular menu node. A local 'depends on'
5491 # only applies to these, in case a symbol is defined in multiple
5492 # locations.
5493 self.defaults = []
5494 self.selects = []
5495 self.implies = []
5496 self.ranges = []
5497
5498 @property
5499 def orig_prompt(self):
5500 """
5501 See the class documentation.
5502 """
5503 if not self.prompt:
5504 return None
5505 return (self.prompt[0], self._strip_dep(self.prompt[1]))
5506
5507 @property
5508 def orig_defaults(self):
5509 """
5510 See the class documentation.
5511 """
5512 return [(default, self._strip_dep(cond))
5513 for default, cond in self.defaults]
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005514
Tom Rini3c5f4152019-09-20 17:42:09 -04005515 @property
5516 def orig_selects(self):
5517 """
5518 See the class documentation.
5519 """
5520 return [(select, self._strip_dep(cond))
5521 for select, cond in self.selects]
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005522
Tom Rini3c5f4152019-09-20 17:42:09 -04005523 @property
5524 def orig_implies(self):
5525 """
5526 See the class documentation.
5527 """
5528 return [(imply, self._strip_dep(cond))
5529 for imply, cond in self.implies]
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005530
Tom Rini3c5f4152019-09-20 17:42:09 -04005531 @property
5532 def orig_ranges(self):
5533 """
5534 See the class documentation.
5535 """
5536 return [(low, high, self._strip_dep(cond))
5537 for low, high, cond in self.ranges]
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005538
Tom Rini3c5f4152019-09-20 17:42:09 -04005539 @property
5540 def referenced(self):
5541 """
5542 See the class documentation.
5543 """
5544 # self.dep is included to catch dependencies from a lone 'depends on'
5545 # when there are no properties to propagate it to
5546 res = expr_items(self.dep)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005547
Tom Rini3c5f4152019-09-20 17:42:09 -04005548 if self.prompt:
5549 res |= expr_items(self.prompt[1])
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005550
Tom Rini3c5f4152019-09-20 17:42:09 -04005551 if self.item is MENU:
5552 res |= expr_items(self.visibility)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005553
Tom Rini3c5f4152019-09-20 17:42:09 -04005554 for value, cond in self.defaults:
5555 res |= expr_items(value)
5556 res |= expr_items(cond)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005557
Tom Rini3c5f4152019-09-20 17:42:09 -04005558 for value, cond in self.selects:
5559 res.add(value)
5560 res |= expr_items(cond)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005561
Tom Rini3c5f4152019-09-20 17:42:09 -04005562 for value, cond in self.implies:
5563 res.add(value)
5564 res |= expr_items(cond)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005565
Tom Rini3c5f4152019-09-20 17:42:09 -04005566 for low, high, cond in self.ranges:
5567 res.add(low)
5568 res.add(high)
5569 res |= expr_items(cond)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005570
Tom Rini3c5f4152019-09-20 17:42:09 -04005571 return res
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005572
Tom Rini3c5f4152019-09-20 17:42:09 -04005573 def __repr__(self):
5574 """
5575 Returns a string with information about the menu node when it is
5576 evaluated on e.g. the interactive Python prompt.
5577 """
5578 fields = []
5579 add = fields.append
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005580
Tom Rini3c5f4152019-09-20 17:42:09 -04005581 if self.item.__class__ is Symbol:
5582 add("menu node for symbol " + self.item.name)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005583
Tom Rini3c5f4152019-09-20 17:42:09 -04005584 elif self.item.__class__ is Choice:
5585 s = "menu node for choice"
5586 if self.item.name is not None:
5587 s += " " + self.item.name
5588 add(s)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005589
Tom Rini3c5f4152019-09-20 17:42:09 -04005590 elif self.item is MENU:
5591 add("menu node for menu")
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005592
Tom Rini3c5f4152019-09-20 17:42:09 -04005593 else: # self.item is COMMENT
5594 add("menu node for comment")
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005595
Tom Rini3c5f4152019-09-20 17:42:09 -04005596 if self.prompt:
5597 add('prompt "{}" (visibility {})'.format(
5598 self.prompt[0], TRI_TO_STR[expr_value(self.prompt[1])]))
5599
5600 if self.item.__class__ is Symbol and self.is_menuconfig:
5601 add("is menuconfig")
5602
5603 add("deps " + TRI_TO_STR[expr_value(self.dep)])
5604
5605 if self.item is MENU:
5606 add("'visible if' deps " + TRI_TO_STR[expr_value(self.visibility)])
5607
5608 if self.item.__class__ in _SYMBOL_CHOICE and self.help is not None:
5609 add("has help")
5610
5611 if self.list:
5612 add("has child")
5613
5614 if self.next:
5615 add("has next")
5616
5617 add("{}:{}".format(self.filename, self.linenr))
5618
5619 return "<{}>".format(", ".join(fields))
5620
5621 def __str__(self):
5622 """
5623 Returns a string representation of the menu node. Matches the Kconfig
5624 format, with any parent dependencies propagated to the 'depends on'
5625 condition.
5626
5627 The output could (almost) be fed back into a Kconfig parser to redefine
5628 the object associated with the menu node. See the module documentation
5629 for a gotcha related to choice symbols.
5630
5631 For symbols and choices with multiple menu nodes (multiple definition
5632 locations), properties that aren't associated with a particular menu
5633 node are shown on all menu nodes ('option env=...', 'optional' for
5634 choices, etc.).
5635
5636 The returned string does not end in a newline.
5637 """
5638 return self.custom_str(standard_sc_expr_str)
5639
5640 def custom_str(self, sc_expr_str_fn):
5641 """
5642 Works like MenuNode.__str__(), but allows a custom format to be used
5643 for all symbol/choice references. See expr_str().
5644 """
5645 return self._menu_comment_node_str(sc_expr_str_fn) \
5646 if self.item in _MENU_COMMENT else \
5647 self._sym_choice_node_str(sc_expr_str_fn)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005648
Tom Rini3c5f4152019-09-20 17:42:09 -04005649 def _menu_comment_node_str(self, sc_expr_str_fn):
5650 s = '{} "{}"'.format("menu" if self.item is MENU else "comment",
5651 self.prompt[0])
Ulf Magnusson1e642d72015-08-13 19:55:40 +02005652
Tom Rini3c5f4152019-09-20 17:42:09 -04005653 if self.dep is not self.kconfig.y:
5654 s += "\n\tdepends on {}".format(expr_str(self.dep, sc_expr_str_fn))
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005655
Tom Rini3c5f4152019-09-20 17:42:09 -04005656 if self.item is MENU and self.visibility is not self.kconfig.y:
5657 s += "\n\tvisible if {}".format(expr_str(self.visibility,
5658 sc_expr_str_fn))
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005659
Tom Rini3c5f4152019-09-20 17:42:09 -04005660 return s
5661
5662 def _sym_choice_node_str(self, sc_expr_str_fn):
5663 def indent_add(s):
5664 lines.append("\t" + s)
5665
5666 def indent_add_cond(s, cond):
5667 if cond is not self.kconfig.y:
5668 s += " if " + expr_str(cond, sc_expr_str_fn)
5669 indent_add(s)
5670
5671 sc = self.item
5672
5673 if sc.__class__ is Symbol:
5674 lines = [("menuconfig " if self.is_menuconfig else "config ")
5675 + sc.name]
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005676 else:
Tom Rini3c5f4152019-09-20 17:42:09 -04005677 lines = ["choice " + sc.name if sc.name else "choice"]
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005678
Tom Rini3c5f4152019-09-20 17:42:09 -04005679 if sc.orig_type and not self.prompt: # sc.orig_type != UNKNOWN
5680 # If there's a prompt, we'll use the '<type> "prompt"' shorthand
5681 # instead
5682 indent_add(TYPE_TO_STR[sc.orig_type])
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005683
Tom Rini3c5f4152019-09-20 17:42:09 -04005684 if self.prompt:
5685 if sc.orig_type:
5686 prefix = TYPE_TO_STR[sc.orig_type]
5687 else:
5688 # Symbol defined without a type (which generates a warning)
5689 prefix = "prompt"
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005690
Tom Rini3c5f4152019-09-20 17:42:09 -04005691 indent_add_cond(prefix + ' "{}"'.format(escape(self.prompt[0])),
5692 self.orig_prompt[1])
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005693
Tom Rini3c5f4152019-09-20 17:42:09 -04005694 if sc.__class__ is Symbol:
5695 if sc.is_allnoconfig_y:
5696 indent_add("option allnoconfig_y")
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005697
Tom Rini3c5f4152019-09-20 17:42:09 -04005698 if sc is sc.kconfig.defconfig_list:
5699 indent_add("option defconfig_list")
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005700
Tom Rini3c5f4152019-09-20 17:42:09 -04005701 if sc.env_var is not None:
5702 indent_add('option env="{}"'.format(sc.env_var))
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005703
Tom Rini3c5f4152019-09-20 17:42:09 -04005704 if sc is sc.kconfig.modules:
5705 indent_add("option modules")
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005706
Tom Rini3c5f4152019-09-20 17:42:09 -04005707 for low, high, cond in self.orig_ranges:
5708 indent_add_cond(
5709 "range {} {}".format(sc_expr_str_fn(low),
5710 sc_expr_str_fn(high)),
5711 cond)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005712
Tom Rini3c5f4152019-09-20 17:42:09 -04005713 for default, cond in self.orig_defaults:
5714 indent_add_cond("default " + expr_str(default, sc_expr_str_fn),
5715 cond)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005716
Tom Rini3c5f4152019-09-20 17:42:09 -04005717 if sc.__class__ is Choice and sc.is_optional:
5718 indent_add("optional")
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005719
Tom Rini3c5f4152019-09-20 17:42:09 -04005720 if sc.__class__ is Symbol:
5721 for select, cond in self.orig_selects:
5722 indent_add_cond("select " + sc_expr_str_fn(select), cond)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005723
Tom Rini3c5f4152019-09-20 17:42:09 -04005724 for imply, cond in self.orig_implies:
5725 indent_add_cond("imply " + sc_expr_str_fn(imply), cond)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005726
Tom Rini3c5f4152019-09-20 17:42:09 -04005727 if self.dep is not sc.kconfig.y:
5728 indent_add("depends on " + expr_str(self.dep, sc_expr_str_fn))
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005729
Tom Rini3c5f4152019-09-20 17:42:09 -04005730 if self.help is not None:
5731 indent_add("help")
5732 for line in self.help.splitlines():
5733 indent_add(" " + line)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005734
Tom Rini3c5f4152019-09-20 17:42:09 -04005735 return "\n".join(lines)
Ulf Magnusson1e642d72015-08-13 19:55:40 +02005736
Tom Rini3c5f4152019-09-20 17:42:09 -04005737 def _strip_dep(self, expr):
5738 # Helper function for removing MenuNode.dep from 'expr'. Uses two
5739 # pieces of internal knowledge: (1) Expressions are reused rather than
5740 # copied, and (2) the direct dependencies always appear at the end.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005741
Tom Rini3c5f4152019-09-20 17:42:09 -04005742 # ... if dep -> ... if y
5743 if self.dep is expr:
5744 return self.kconfig.y
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005745
Tom Rini3c5f4152019-09-20 17:42:09 -04005746 # (AND, X, dep) -> X
5747 if expr.__class__ is tuple and expr[0] is AND and expr[2] is self.dep:
5748 return expr[1]
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005749
Tom Rini3c5f4152019-09-20 17:42:09 -04005750 return expr
5751
5752
5753class Variable(object):
5754 """
5755 Represents a preprocessor variable/function.
5756
5757 The following attributes are available:
5758
5759 name:
5760 The name of the variable.
5761
5762 value:
5763 The unexpanded value of the variable.
5764
5765 expanded_value:
5766 The expanded value of the variable. For simple variables (those defined
5767 with :=), this will equal 'value'. Accessing this property will raise a
5768 KconfigError if the expansion seems to be stuck in a loop.
5769
5770 Accessing this field is the same as calling expanded_value_w_args() with
5771 no arguments. I hadn't considered function arguments when adding it. It
5772 is retained for backwards compatibility though.
5773
5774 is_recursive:
5775 True if the variable is recursive (defined with =).
5776 """
5777 __slots__ = (
5778 "_n_expansions",
5779 "is_recursive",
5780 "kconfig",
5781 "name",
5782 "value",
5783 )
5784
5785 @property
5786 def expanded_value(self):
5787 """
5788 See the class documentation.
5789 """
5790 return self.expanded_value_w_args()
5791
5792 def expanded_value_w_args(self, *args):
5793 """
5794 Returns the expanded value of the variable/function. Any arguments
5795 passed will be substituted for $(1), $(2), etc.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005796
Tom Rini3c5f4152019-09-20 17:42:09 -04005797 Raises a KconfigError if the expansion seems to be stuck in a loop.
5798 """
5799 return self.kconfig._fn_val((self.name,) + args)
5800
5801 def __repr__(self):
5802 return "<variable {}, {}, value '{}'>" \
5803 .format(self.name,
5804 "recursive" if self.is_recursive else "immediate",
5805 self.value)
5806
5807
5808class KconfigError(Exception):
5809 """
5810 Exception raised for Kconfig-related errors.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005811
Tom Rini3c5f4152019-09-20 17:42:09 -04005812 KconfigError and KconfigSyntaxError are the same class. The
5813 KconfigSyntaxError alias is only maintained for backwards compatibility.
5814 """
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005815
Tom Rini3c5f4152019-09-20 17:42:09 -04005816KconfigSyntaxError = KconfigError # Backwards compatibility
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005817
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005818
Tom Rini3c5f4152019-09-20 17:42:09 -04005819class InternalError(Exception):
5820 "Never raised. Kept around for backwards compatibility."
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005821
Tom Rini3c5f4152019-09-20 17:42:09 -04005822
5823# Workaround:
5824#
5825# If 'errno' and 'strerror' are set on IOError, then __str__() always returns
5826# "[Errno <errno>] <strerror>", ignoring any custom message passed to the
5827# constructor. By defining our own subclass, we can use a custom message while
5828# also providing 'errno', 'strerror', and 'filename' to scripts.
5829class _KconfigIOError(IOError):
5830 def __init__(self, ioerror, msg):
5831 self.msg = msg
5832 super(_KconfigIOError, self).__init__(
5833 ioerror.errno, ioerror.strerror, ioerror.filename)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005834
5835 def __str__(self):
Tom Rini3c5f4152019-09-20 17:42:09 -04005836 return self.msg
5837
5838
5839#
5840# Public functions
5841#
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005842
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005843
Tom Rini3c5f4152019-09-20 17:42:09 -04005844def expr_value(expr):
5845 """
5846 Evaluates the expression 'expr' to a tristate value. Returns 0 (n), 1 (m),
5847 or 2 (y).
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005848
Tom Rini3c5f4152019-09-20 17:42:09 -04005849 'expr' must be an already-parsed expression from a Symbol, Choice, or
5850 MenuNode property. To evaluate an expression represented as a string, use
5851 Kconfig.eval_string().
5852
5853 Passing subexpressions of expressions to this function works as expected.
5854 """
5855 if expr.__class__ is not tuple:
5856 return expr.tri_value
5857
5858 if expr[0] is AND:
5859 v1 = expr_value(expr[1])
5860 # Short-circuit the n case as an optimization (~5% faster
5861 # allnoconfig.py and allyesconfig.py, as of writing)
5862 return 0 if not v1 else min(v1, expr_value(expr[2]))
5863
5864 if expr[0] is OR:
5865 v1 = expr_value(expr[1])
5866 # Short-circuit the y case as an optimization
5867 return 2 if v1 == 2 else max(v1, expr_value(expr[2]))
5868
5869 if expr[0] is NOT:
5870 return 2 - expr_value(expr[1])
5871
5872 # Relation
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005873 #
Tom Rini3c5f4152019-09-20 17:42:09 -04005874 # Implements <, <=, >, >= comparisons as well. These were added to
5875 # kconfig in 31847b67 (kconfig: allow use of relations other than
5876 # (in)equality).
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005877
Tom Rini3c5f4152019-09-20 17:42:09 -04005878 rel, v1, v2 = expr
5879
5880 # If both operands are strings...
5881 if v1.orig_type is STRING and v2.orig_type is STRING:
5882 # ...then compare them lexicographically
5883 comp = _strcmp(v1.str_value, v2.str_value)
5884 else:
5885 # Otherwise, try to compare them as numbers
5886 try:
5887 comp = _sym_to_num(v1) - _sym_to_num(v2)
5888 except ValueError:
5889 # Fall back on a lexicographic comparison if the operands don't
5890 # parse as numbers
5891 comp = _strcmp(v1.str_value, v2.str_value)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005892
Tom Rini3c5f4152019-09-20 17:42:09 -04005893 return 2*(comp == 0 if rel is EQUAL else
5894 comp != 0 if rel is UNEQUAL else
5895 comp < 0 if rel is LESS else
5896 comp <= 0 if rel is LESS_EQUAL else
5897 comp > 0 if rel is GREATER else
5898 comp >= 0)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005899
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005900
Tom Rini3c5f4152019-09-20 17:42:09 -04005901def standard_sc_expr_str(sc):
5902 """
5903 Standard symbol/choice printing function. Uses plain Kconfig syntax, and
5904 displays choices as <choice> (or <choice NAME>, for named choices).
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005905
Tom Rini3c5f4152019-09-20 17:42:09 -04005906 See expr_str().
5907 """
5908 if sc.__class__ is Symbol:
5909 if sc.is_constant and sc.name not in STR_TO_TRI:
5910 return '"{}"'.format(escape(sc.name))
5911 return sc.name
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005912
Tom Rini3c5f4152019-09-20 17:42:09 -04005913 return "<choice {}>".format(sc.name) if sc.name else "<choice>"
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005914
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005915
Tom Rini3c5f4152019-09-20 17:42:09 -04005916def expr_str(expr, sc_expr_str_fn=standard_sc_expr_str):
5917 """
5918 Returns the string representation of the expression 'expr', as in a Kconfig
5919 file.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005920
Tom Rini3c5f4152019-09-20 17:42:09 -04005921 Passing subexpressions of expressions to this function works as expected.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005922
Tom Rini3c5f4152019-09-20 17:42:09 -04005923 sc_expr_str_fn (default: standard_sc_expr_str):
5924 This function is called for every symbol/choice (hence "sc") appearing in
5925 the expression, with the symbol/choice as the argument. It is expected to
5926 return a string to be used for the symbol/choice.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005927
Tom Rini3c5f4152019-09-20 17:42:09 -04005928 This can be used e.g. to turn symbols/choices into links when generating
5929 documentation, or for printing the value of each symbol/choice after it.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005930
Tom Rini3c5f4152019-09-20 17:42:09 -04005931 Note that quoted values are represented as constants symbols
5932 (Symbol.is_constant == True).
5933 """
5934 if expr.__class__ is not tuple:
5935 return sc_expr_str_fn(expr)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005936
Tom Rini3c5f4152019-09-20 17:42:09 -04005937 if expr[0] is AND:
5938 return "{} && {}".format(_parenthesize(expr[1], OR, sc_expr_str_fn),
5939 _parenthesize(expr[2], OR, sc_expr_str_fn))
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005940
Tom Rini3c5f4152019-09-20 17:42:09 -04005941 if expr[0] is OR:
5942 # This turns A && B || C && D into "(A && B) || (C && D)", which is
5943 # redundant, but more readable
5944 return "{} || {}".format(_parenthesize(expr[1], AND, sc_expr_str_fn),
5945 _parenthesize(expr[2], AND, sc_expr_str_fn))
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005946
Tom Rini3c5f4152019-09-20 17:42:09 -04005947 if expr[0] is NOT:
5948 if expr[1].__class__ is tuple:
5949 return "!({})".format(expr_str(expr[1], sc_expr_str_fn))
5950 return "!" + sc_expr_str_fn(expr[1]) # Symbol
5951
5952 # Relation
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005953 #
Tom Rini3c5f4152019-09-20 17:42:09 -04005954 # Relation operands are always symbols (quoted strings are constant
5955 # symbols)
5956 return "{} {} {}".format(sc_expr_str_fn(expr[1]), REL_TO_STR[expr[0]],
5957 sc_expr_str_fn(expr[2]))
5958
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005959
Tom Rini3c5f4152019-09-20 17:42:09 -04005960def expr_items(expr):
5961 """
5962 Returns a set() of all items (symbols and choices) that appear in the
5963 expression 'expr'.
5964
5965 Passing subexpressions of expressions to this function works as expected.
5966 """
5967 res = set()
Ulf Magnusson1e642d72015-08-13 19:55:40 +02005968
Tom Rini3c5f4152019-09-20 17:42:09 -04005969 def rec(subexpr):
5970 if subexpr.__class__ is tuple:
5971 # AND, OR, NOT, or relation
Ulf Magnusson1e642d72015-08-13 19:55:40 +02005972
Tom Rini3c5f4152019-09-20 17:42:09 -04005973 rec(subexpr[1])
Ulf Magnusson1e642d72015-08-13 19:55:40 +02005974
Tom Rini3c5f4152019-09-20 17:42:09 -04005975 # NOTs only have a single operand
5976 if subexpr[0] is not NOT:
5977 rec(subexpr[2])
Ulf Magnusson1e642d72015-08-13 19:55:40 +02005978
Tom Rini3c5f4152019-09-20 17:42:09 -04005979 else:
5980 # Symbol or choice
5981 res.add(subexpr)
Ulf Magnusson1e642d72015-08-13 19:55:40 +02005982
Tom Rini3c5f4152019-09-20 17:42:09 -04005983 rec(expr)
5984 return res
Ulf Magnusson1e642d72015-08-13 19:55:40 +02005985
Ulf Magnusson1e642d72015-08-13 19:55:40 +02005986
Tom Rini3c5f4152019-09-20 17:42:09 -04005987def split_expr(expr, op):
5988 """
5989 Returns a list containing the top-level AND or OR operands in the
5990 expression 'expr', in the same (left-to-right) order as they appear in
5991 the expression.
Ulf Magnusson1e642d72015-08-13 19:55:40 +02005992
Tom Rini3c5f4152019-09-20 17:42:09 -04005993 This can be handy e.g. for splitting (weak) reverse dependencies
5994 from 'select' and 'imply' into individual selects/implies.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005995
Tom Rini3c5f4152019-09-20 17:42:09 -04005996 op:
5997 Either AND to get AND operands, or OR to get OR operands.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09005998
Tom Rini3c5f4152019-09-20 17:42:09 -04005999 (Having this as an operand might be more future-safe than having two
6000 hardcoded functions.)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006001
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006002
Tom Rini3c5f4152019-09-20 17:42:09 -04006003 Pseudo-code examples:
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006004
Tom Rini3c5f4152019-09-20 17:42:09 -04006005 split_expr( A , OR ) -> [A]
6006 split_expr( A && B , OR ) -> [A && B]
6007 split_expr( A || B , OR ) -> [A, B]
6008 split_expr( A || B , AND ) -> [A || B]
6009 split_expr( A || B || (C && D) , OR ) -> [A, B, C && D]
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006010
Tom Rini3c5f4152019-09-20 17:42:09 -04006011 # Second || is not at the top level
6012 split_expr( A || (B && (C || D)) , OR ) -> [A, B && (C || D)]
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006013
Tom Rini3c5f4152019-09-20 17:42:09 -04006014 # Parentheses don't matter as long as we stay at the top level (don't
6015 # encounter any non-'op' nodes)
6016 split_expr( (A || B) || C , OR ) -> [A, B, C]
6017 split_expr( A || (B || C) , OR ) -> [A, B, C]
6018 """
6019 res = []
6020
6021 def rec(subexpr):
6022 if subexpr.__class__ is tuple and subexpr[0] is op:
6023 rec(subexpr[1])
6024 rec(subexpr[2])
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006025 else:
Tom Rini3c5f4152019-09-20 17:42:09 -04006026 res.append(subexpr)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006027
Tom Rini3c5f4152019-09-20 17:42:09 -04006028 rec(expr)
6029 return res
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006030
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006031
Tom Rini3c5f4152019-09-20 17:42:09 -04006032def escape(s):
6033 r"""
6034 Escapes the string 's' in the same fashion as is done for display in
6035 Kconfig format and when writing strings to a .config file. " and \ are
6036 replaced by \" and \\, respectively.
6037 """
6038 # \ must be escaped before " to avoid double escaping
6039 return s.replace("\\", r"\\").replace('"', r'\"')
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006040
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006041
Tom Rini3c5f4152019-09-20 17:42:09 -04006042def unescape(s):
6043 r"""
6044 Unescapes the string 's'. \ followed by any character is replaced with just
6045 that character. Used internally when reading .config files.
6046 """
6047 return _unescape_sub(r"\1", s)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006048
Tom Rini3c5f4152019-09-20 17:42:09 -04006049# unescape() helper
6050_unescape_sub = re.compile(r"\\(.)").sub
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006051
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006052
Tom Rini3c5f4152019-09-20 17:42:09 -04006053def standard_kconfig():
6054 """
6055 Helper for tools. Loads the top-level Kconfig specified as the first
6056 command-line argument, or "Kconfig" if there are no command-line arguments.
6057 Returns the Kconfig instance.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006058
Tom Rini3c5f4152019-09-20 17:42:09 -04006059 Exits with sys.exit() (which raises a SystemExit exception) and prints a
6060 usage note to stderr if more than one command-line argument is passed.
6061 """
6062 if len(sys.argv) > 2:
6063 sys.exit("usage: {} [Kconfig]".format(sys.argv[0]))
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006064
Tom Rini3c5f4152019-09-20 17:42:09 -04006065 # Only show backtraces for unexpected exceptions
6066 try:
6067 return Kconfig("Kconfig" if len(sys.argv) < 2 else sys.argv[1])
6068 except (EnvironmentError, KconfigError) as e:
6069 # Some long exception messages have extra newlines for better
6070 # formatting when reported as an unhandled exception. Strip them here.
6071 sys.exit(str(e).strip())
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006072
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006073
Tom Rini3c5f4152019-09-20 17:42:09 -04006074def standard_config_filename():
6075 """
6076 Helper for tools. Returns the value of KCONFIG_CONFIG (which specifies the
6077 .config file to load/save) if it is set, and ".config" otherwise.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006078
Tom Rini3c5f4152019-09-20 17:42:09 -04006079 Calling load_config() with filename=None might give the behavior you want,
6080 without having to use this function.
6081 """
6082 return os.getenv("KCONFIG_CONFIG", ".config")
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006083
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006084
Tom Rini3c5f4152019-09-20 17:42:09 -04006085def load_allconfig(kconf, filename):
6086 """
6087 Helper for all*config. Loads (merges) the configuration file specified by
6088 KCONFIG_ALLCONFIG, if any. See Documentation/kbuild/kconfig.txt in the
6089 Linux kernel.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006090
Tom Rini3c5f4152019-09-20 17:42:09 -04006091 Disables warnings for duplicated assignments within configuration files for
6092 the duration of the call (kconf.warn_assign_override/warn_assign_redun = False),
6093 and restores the previous warning settings at the end. The
6094 KCONFIG_ALLCONFIG configuration file is expected to override symbols.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006095
Tom Rini3c5f4152019-09-20 17:42:09 -04006096 Exits with sys.exit() (which raises a SystemExit exception) and prints an
6097 error to stderr if KCONFIG_ALLCONFIG is set but the configuration file
6098 can't be opened.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006099
Tom Rini3c5f4152019-09-20 17:42:09 -04006100 kconf:
6101 Kconfig instance to load the configuration in.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006102
Tom Rini3c5f4152019-09-20 17:42:09 -04006103 filename:
6104 Command-specific configuration filename - "allyes.config",
6105 "allno.config", etc.
6106 """
6107 allconfig = os.getenv("KCONFIG_ALLCONFIG")
6108 if allconfig is None:
6109 return
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006110
Tom Rini3c5f4152019-09-20 17:42:09 -04006111 def std_msg(e):
6112 # "Upcasts" a _KconfigIOError to an IOError, removing the custom
6113 # __str__() message. The standard message is better here.
6114 #
6115 # This might also convert an OSError to an IOError in obscure cases,
6116 # but it's probably not a big deal. The distinction is shaky (see
6117 # PEP-3151).
6118 return IOError(e.errno, e.strerror, e.filename)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006119
Tom Rini3c5f4152019-09-20 17:42:09 -04006120 old_warn_assign_override = kconf.warn_assign_override
6121 old_warn_assign_redun = kconf.warn_assign_redun
6122 kconf.warn_assign_override = kconf.warn_assign_redun = False
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006123
Tom Rini3c5f4152019-09-20 17:42:09 -04006124 if allconfig in ("", "1"):
6125 try:
6126 print(kconf.load_config(filename, False))
6127 except EnvironmentError as e1:
6128 try:
6129 print(kconf.load_config("all.config", False))
6130 except EnvironmentError as e2:
6131 sys.exit("error: KCONFIG_ALLCONFIG is set, but neither {} "
6132 "nor all.config could be opened: {}, {}"
6133 .format(filename, std_msg(e1), std_msg(e2)))
6134 else:
6135 try:
6136 print(kconf.load_config(allconfig, False))
6137 except EnvironmentError as e:
6138 sys.exit("error: KCONFIG_ALLCONFIG is set to '{}', which "
6139 "could not be opened: {}"
6140 .format(allconfig, std_msg(e)))
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006141
Tom Rini3c5f4152019-09-20 17:42:09 -04006142 kconf.warn_assign_override = old_warn_assign_override
6143 kconf.warn_assign_redun = old_warn_assign_redun
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006144
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006145
Tom Rini3c5f4152019-09-20 17:42:09 -04006146#
6147# Internal functions
6148#
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006149
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006150
Tom Rini3c5f4152019-09-20 17:42:09 -04006151def _visibility(sc):
6152 # Symbols and Choices have a "visibility" that acts as an upper bound on
6153 # the values a user can set for them, corresponding to the visibility in
6154 # e.g. 'make menuconfig'. This function calculates the visibility for the
6155 # Symbol or Choice 'sc' -- the logic is nearly identical.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006156
Tom Rini3c5f4152019-09-20 17:42:09 -04006157 vis = 0
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006158
Tom Rini3c5f4152019-09-20 17:42:09 -04006159 for node in sc.nodes:
6160 if node.prompt:
6161 vis = max(vis, expr_value(node.prompt[1]))
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006162
Tom Rini3c5f4152019-09-20 17:42:09 -04006163 if sc.__class__ is Symbol and sc.choice:
6164 if sc.choice.orig_type is TRISTATE and \
6165 sc.orig_type is not TRISTATE and sc.choice.tri_value != 2:
6166 # Non-tristate choice symbols are only visible in y mode
6167 return 0
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006168
Tom Rini3c5f4152019-09-20 17:42:09 -04006169 if sc.orig_type is TRISTATE and vis == 1 and sc.choice.tri_value == 2:
6170 # Choice symbols with m visibility are not visible in y mode
6171 return 0
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006172
Tom Rini3c5f4152019-09-20 17:42:09 -04006173 # Promote m to y if we're dealing with a non-tristate (possibly due to
6174 # modules being disabled)
6175 if vis == 1 and sc.type is not TRISTATE:
6176 return 2
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006177
Tom Rini3c5f4152019-09-20 17:42:09 -04006178 return vis
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006179
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006180
Tom Rini3c5f4152019-09-20 17:42:09 -04006181def _make_depend_on(sc, expr):
6182 # Adds 'sc' (symbol or choice) as a "dependee" to all symbols in 'expr'.
6183 # Constant symbols in 'expr' are skipped as they can never change value
6184 # anyway.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006185
Tom Rini3c5f4152019-09-20 17:42:09 -04006186 if expr.__class__ is tuple:
6187 # AND, OR, NOT, or relation
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006188
Tom Rini3c5f4152019-09-20 17:42:09 -04006189 _make_depend_on(sc, expr[1])
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006190
Tom Rini3c5f4152019-09-20 17:42:09 -04006191 # NOTs only have a single operand
6192 if expr[0] is not NOT:
6193 _make_depend_on(sc, expr[2])
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006194
Tom Rini3c5f4152019-09-20 17:42:09 -04006195 elif not expr.is_constant:
6196 # Non-constant symbol, or choice
6197 expr._dependents.add(sc)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006198
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006199
Tom Rini3c5f4152019-09-20 17:42:09 -04006200def _parenthesize(expr, type_, sc_expr_str_fn):
6201 # expr_str() helper. Adds parentheses around expressions of type 'type_'.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006202
Tom Rini3c5f4152019-09-20 17:42:09 -04006203 if expr.__class__ is tuple and expr[0] is type_:
6204 return "({})".format(expr_str(expr, sc_expr_str_fn))
6205 return expr_str(expr, sc_expr_str_fn)
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006206
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006207
Tom Rini3c5f4152019-09-20 17:42:09 -04006208def _ordered_unique(lst):
6209 # Returns 'lst' with any duplicates removed, preserving order. This hacky
6210 # version seems to be a common idiom. It relies on short-circuit evaluation
6211 # and set.add() returning None, which is falsy.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006212
Tom Rini3c5f4152019-09-20 17:42:09 -04006213 seen = set()
6214 seen_add = seen.add
6215 return [x for x in lst if x not in seen and not seen_add(x)]
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006216
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006217
Tom Rini3c5f4152019-09-20 17:42:09 -04006218def _is_base_n(s, n):
6219 try:
6220 int(s, n)
6221 return True
6222 except ValueError:
6223 return False
6224
6225
6226def _strcmp(s1, s2):
6227 # strcmp()-alike that returns -1, 0, or 1
6228
6229 return (s1 > s2) - (s1 < s2)
6230
6231
6232def _sym_to_num(sym):
6233 # expr_value() helper for converting a symbol to a number. Raises
6234 # ValueError for symbols that can't be converted.
6235
6236 # For BOOL and TRISTATE, n/m/y count as 0/1/2. This mirrors 9059a3493ef
6237 # ("kconfig: fix relational operators for bool and tristate symbols") in
6238 # the C implementation.
6239 return sym.tri_value if sym.orig_type in _BOOL_TRISTATE else \
6240 int(sym.str_value, _TYPE_TO_BASE[sym.orig_type])
6241
6242
6243def _touch_dep_file(path, sym_name):
6244 # If sym_name is MY_SYM_NAME, touches my/sym/name.h. See the sync_deps()
6245 # docstring.
6246
6247 sym_path = path + os.sep + sym_name.lower().replace("_", os.sep) + ".h"
6248 sym_path_dir = dirname(sym_path)
6249 if not exists(sym_path_dir):
6250 os.makedirs(sym_path_dir, 0o755)
6251
6252 # A kind of truncating touch, mirroring the C tools
6253 os.close(os.open(
6254 sym_path, os.O_WRONLY | os.O_CREAT | os.O_TRUNC, 0o644))
6255
6256
6257def _save_old(path):
6258 # See write_config()
6259
6260 def copy(src, dst):
6261 # Import as needed, to save some startup time
6262 import shutil
6263 shutil.copyfile(src, dst)
6264
6265 if islink(path):
6266 # Preserve symlinks
6267 copy_fn = copy
6268 elif hasattr(os, "replace"):
6269 # Python 3 (3.3+) only. Best choice when available, because it
6270 # removes <filename>.old on both *nix and Windows.
6271 copy_fn = os.replace
6272 elif os.name == "posix":
6273 # Removes <filename>.old on POSIX systems
6274 copy_fn = os.rename
6275 else:
6276 # Fall back on copying
6277 copy_fn = copy
6278
6279 try:
6280 copy_fn(path, path + ".old")
6281 except Exception:
6282 # Ignore errors from 'path' missing as well as other errors.
6283 # <filename>.old file is usually more of a nice-to-have, and not worth
6284 # erroring out over e.g. if <filename>.old happens to be a directory or
6285 # <filename> is something like /dev/null.
6286 pass
6287
6288
6289def _name_and_loc(sc):
6290 # Helper for giving the symbol/choice name and location(s) in e.g. warnings
6291
6292 # Reuse the expression format. That way choices show up as
6293 # '<choice (name, if any)>'
6294 name = standard_sc_expr_str(sc)
6295
6296 if not sc.nodes:
6297 return name + " (undefined)"
6298
6299 return "{} (defined at {})".format(
6300 name,
6301 ", ".join("{}:{}".format(node.filename, node.linenr)
6302 for node in sc.nodes))
6303
6304
6305# Menu manipulation
6306
6307
6308def _expr_depends_on(expr, sym):
6309 # Reimplementation of expr_depends_symbol() from mconf.c. Used to determine
6310 # if a submenu should be implicitly created. This also influences which
6311 # items inside choice statements are considered choice items.
6312
6313 if expr.__class__ is not tuple:
6314 return expr is sym
6315
6316 if expr[0] in _EQUAL_UNEQUAL:
6317 # Check for one of the following:
6318 # sym = m/y, m/y = sym, sym != n, n != sym
6319
6320 left, right = expr[1:]
6321
6322 if right is sym:
6323 left, right = right, left
6324 elif left is not sym:
6325 return False
6326
6327 return (expr[0] is EQUAL and right is sym.kconfig.m or
6328 right is sym.kconfig.y) or \
6329 (expr[0] is UNEQUAL and right is sym.kconfig.n)
6330
6331 return expr[0] is AND and \
6332 (_expr_depends_on(expr[1], sym) or
6333 _expr_depends_on(expr[2], sym))
6334
6335
6336def _auto_menu_dep(node1, node2):
6337 # Returns True if node2 has an "automatic menu dependency" on node1. If
6338 # node2 has a prompt, we check its condition. Otherwise, we look directly
6339 # at node2.dep.
6340
6341 return _expr_depends_on(node2.prompt[1] if node2.prompt else node2.dep,
6342 node1.item)
6343
6344
6345def _flatten(node):
6346 # "Flattens" menu nodes without prompts (e.g. 'if' nodes and non-visible
6347 # symbols with children from automatic menu creation) so that their
6348 # children appear after them instead. This gives a clean menu structure
6349 # with no unexpected "jumps" in the indentation.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006350 #
Tom Rini3c5f4152019-09-20 17:42:09 -04006351 # Do not flatten promptless choices (which can appear "legitimately" if a
6352 # named choice is defined in multiple locations to add on symbols). It
6353 # looks confusing, and the menuconfig already shows all choice symbols if
6354 # you enter the choice at some location with a prompt.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006355
Tom Rini3c5f4152019-09-20 17:42:09 -04006356 while node:
6357 if node.list and not node.prompt and \
6358 node.item.__class__ is not Choice:
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006359
Tom Rini3c5f4152019-09-20 17:42:09 -04006360 last_node = node.list
6361 while 1:
6362 last_node.parent = node.parent
6363 if not last_node.next:
6364 break
6365 last_node = last_node.next
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006366
Tom Rini3c5f4152019-09-20 17:42:09 -04006367 last_node.next = node.next
6368 node.next = node.list
6369 node.list = None
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006370
Tom Rini3c5f4152019-09-20 17:42:09 -04006371 node = node.next
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006372
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006373
Tom Rini3c5f4152019-09-20 17:42:09 -04006374def _remove_ifs(node):
6375 # Removes 'if' nodes (which can be recognized by MenuNode.item being None),
6376 # which are assumed to already have been flattened. The C implementation
6377 # doesn't bother to do this, but we expose the menu tree directly, and it
6378 # makes it nicer to work with.
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006379
Tom Rini3c5f4152019-09-20 17:42:09 -04006380 cur = node.list
6381 while cur and not cur.item:
6382 cur = cur.next
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006383
Tom Rini3c5f4152019-09-20 17:42:09 -04006384 node.list = cur
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006385
Tom Rini3c5f4152019-09-20 17:42:09 -04006386 while cur:
6387 next = cur.next
6388 while next and not next.item:
6389 next = next.next
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006390
Tom Rini3c5f4152019-09-20 17:42:09 -04006391 # Equivalent to
6392 #
6393 # cur.next = next
6394 # cur = next
6395 #
6396 # due to tricky Python semantics. The order matters.
6397 cur.next = cur = next
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006398
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006399
Tom Rini3c5f4152019-09-20 17:42:09 -04006400def _finalize_choice(node):
6401 # Finalizes a choice, marking each symbol whose menu node has the choice as
6402 # the parent as a choice symbol, and automatically determining types if not
6403 # specified.
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006404
Tom Rini3c5f4152019-09-20 17:42:09 -04006405 choice = node.item
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006406
Tom Rini3c5f4152019-09-20 17:42:09 -04006407 cur = node.list
6408 while cur:
6409 if cur.item.__class__ is Symbol:
6410 cur.item.choice = choice
6411 choice.syms.append(cur.item)
6412 cur = cur.next
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006413
Tom Rini3c5f4152019-09-20 17:42:09 -04006414 # If no type is specified for the choice, its type is that of
6415 # the first choice item with a specified type
6416 if not choice.orig_type:
6417 for item in choice.syms:
6418 if item.orig_type:
6419 choice.orig_type = item.orig_type
6420 break
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006421
Tom Rini3c5f4152019-09-20 17:42:09 -04006422 # Each choice item of UNKNOWN type gets the type of the choice
6423 for sym in choice.syms:
6424 if not sym.orig_type:
6425 sym.orig_type = choice.orig_type
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006426
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006427
Tom Rini3c5f4152019-09-20 17:42:09 -04006428def _check_dep_loop_sym(sym, ignore_choice):
6429 # Detects dependency loops using depth-first search on the dependency graph
6430 # (which is calculated earlier in Kconfig._build_dep()).
6431 #
6432 # Algorithm:
6433 #
6434 # 1. Symbols/choices start out with _visited = 0, meaning unvisited.
6435 #
6436 # 2. When a symbol/choice is first visited, _visited is set to 1, meaning
6437 # "visited, potentially part of a dependency loop". The recursive
6438 # search then continues from the symbol/choice.
6439 #
6440 # 3. If we run into a symbol/choice X with _visited already set to 1,
6441 # there's a dependency loop. The loop is found on the call stack by
6442 # recording symbols while returning ("on the way back") until X is seen
6443 # again.
6444 #
6445 # 4. Once a symbol/choice and all its dependencies (or dependents in this
6446 # case) have been checked recursively without detecting any loops, its
6447 # _visited is set to 2, meaning "visited, not part of a dependency
6448 # loop".
6449 #
6450 # This saves work if we run into the symbol/choice again in later calls
6451 # to _check_dep_loop_sym(). We just return immediately.
6452 #
6453 # Choices complicate things, as every choice symbol depends on every other
6454 # choice symbol in a sense. When a choice is "entered" via a choice symbol
6455 # X, we visit all choice symbols from the choice except X, and prevent
6456 # immediately revisiting the choice with a flag (ignore_choice).
6457 #
6458 # Maybe there's a better way to handle this (different flags or the
6459 # like...)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006460
Tom Rini3c5f4152019-09-20 17:42:09 -04006461 if not sym._visited:
6462 # sym._visited == 0, unvisited
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006463
Tom Rini3c5f4152019-09-20 17:42:09 -04006464 sym._visited = 1
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006465
Tom Rini3c5f4152019-09-20 17:42:09 -04006466 for dep in sym._dependents:
6467 # Choices show up in Symbol._dependents when the choice has the
6468 # symbol in a 'prompt' or 'default' condition (e.g.
6469 # 'default ... if SYM').
6470 #
6471 # Since we aren't entering the choice via a choice symbol, all
6472 # choice symbols need to be checked, hence the None.
6473 loop = _check_dep_loop_choice(dep, None) \
6474 if dep.__class__ is Choice \
6475 else _check_dep_loop_sym(dep, False)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006476
Tom Rini3c5f4152019-09-20 17:42:09 -04006477 if loop:
6478 # Dependency loop found
6479 return _found_dep_loop(loop, sym)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006480
Tom Rini3c5f4152019-09-20 17:42:09 -04006481 if sym.choice and not ignore_choice:
6482 loop = _check_dep_loop_choice(sym.choice, sym)
6483 if loop:
6484 # Dependency loop found
6485 return _found_dep_loop(loop, sym)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006486
Tom Rini3c5f4152019-09-20 17:42:09 -04006487 # The symbol is not part of a dependency loop
6488 sym._visited = 2
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006489
Tom Rini3c5f4152019-09-20 17:42:09 -04006490 # No dependency loop found
6491 return None
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006492
Tom Rini3c5f4152019-09-20 17:42:09 -04006493 if sym._visited == 2:
6494 # The symbol was checked earlier and is already known to not be part of
6495 # a dependency loop
6496 return None
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006497
Tom Rini3c5f4152019-09-20 17:42:09 -04006498 # sym._visited == 1, found a dependency loop. Return the symbol as the
6499 # first element in it.
6500 return (sym,)
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006501
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006502
Tom Rini3c5f4152019-09-20 17:42:09 -04006503def _check_dep_loop_choice(choice, skip):
6504 if not choice._visited:
6505 # choice._visited == 0, unvisited
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006506
Tom Rini3c5f4152019-09-20 17:42:09 -04006507 choice._visited = 1
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006508
Tom Rini3c5f4152019-09-20 17:42:09 -04006509 # Check for loops involving choice symbols. If we came here via a
6510 # choice symbol, skip that one, as we'd get a false positive
6511 # '<sym FOO> -> <choice> -> <sym FOO>' loop otherwise.
6512 for sym in choice.syms:
6513 if sym is not skip:
6514 # Prevent the choice from being immediately re-entered via the
6515 # "is a choice symbol" path by passing True
6516 loop = _check_dep_loop_sym(sym, True)
6517 if loop:
6518 # Dependency loop found
6519 return _found_dep_loop(loop, choice)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006520
Tom Rini3c5f4152019-09-20 17:42:09 -04006521 # The choice is not part of a dependency loop
6522 choice._visited = 2
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006523
Tom Rini3c5f4152019-09-20 17:42:09 -04006524 # No dependency loop found
6525 return None
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006526
Tom Rini3c5f4152019-09-20 17:42:09 -04006527 if choice._visited == 2:
6528 # The choice was checked earlier and is already known to not be part of
6529 # a dependency loop
6530 return None
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006531
Tom Rini3c5f4152019-09-20 17:42:09 -04006532 # choice._visited == 1, found a dependency loop. Return the choice as the
6533 # first element in it.
6534 return (choice,)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006535
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006536
Tom Rini3c5f4152019-09-20 17:42:09 -04006537def _found_dep_loop(loop, cur):
6538 # Called "on the way back" when we know we have a loop
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006539
Tom Rini3c5f4152019-09-20 17:42:09 -04006540 # Is the symbol/choice 'cur' where the loop started?
6541 if cur is not loop[0]:
6542 # Nope, it's just a part of the loop
6543 return loop + (cur,)
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006544
Tom Rini3c5f4152019-09-20 17:42:09 -04006545 # Yep, we have the entire loop. Throw an exception that shows it.
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006546
Tom Rini3c5f4152019-09-20 17:42:09 -04006547 msg = "\nDependency loop\n" \
6548 "===============\n\n"
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006549
Tom Rini3c5f4152019-09-20 17:42:09 -04006550 for item in loop:
6551 if item is not loop[0]:
6552 msg += "...depends on "
6553 if item.__class__ is Symbol and item.choice:
6554 msg += "the choice symbol "
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006555
Tom Rini3c5f4152019-09-20 17:42:09 -04006556 msg += "{}, with definition...\n\n{}\n\n" \
6557 .format(_name_and_loc(item), item)
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006558
Tom Rini3c5f4152019-09-20 17:42:09 -04006559 # Small wart: Since we reuse the already calculated
6560 # Symbol/Choice._dependents sets for recursive dependency detection, we
6561 # lose information on whether a dependency came from a 'select'/'imply'
6562 # condition or e.g. a 'depends on'.
6563 #
6564 # This might cause selecting symbols to "disappear". For example,
6565 # a symbol B having 'select A if C' gives a direct dependency from A to
6566 # C, since it corresponds to a reverse dependency of B && C.
6567 #
6568 # Always print reverse dependencies for symbols that have them to make
6569 # sure information isn't lost. I wonder if there's some neat way to
6570 # improve this.
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006571
Tom Rini3c5f4152019-09-20 17:42:09 -04006572 if item.__class__ is Symbol:
6573 if item.rev_dep is not item.kconfig.n:
6574 msg += "(select-related dependencies: {})\n\n" \
6575 .format(expr_str(item.rev_dep))
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006576
Tom Rini3c5f4152019-09-20 17:42:09 -04006577 if item.weak_rev_dep is not item.kconfig.n:
6578 msg += "(imply-related dependencies: {})\n\n" \
6579 .format(expr_str(item.rev_dep))
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006580
Tom Rini3c5f4152019-09-20 17:42:09 -04006581 msg += "...depends again on {}".format(_name_and_loc(loop[0]))
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006582
Tom Rini3c5f4152019-09-20 17:42:09 -04006583 raise KconfigError(msg)
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006584
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006585
Tom Rini3c5f4152019-09-20 17:42:09 -04006586def _decoding_error(e, filename, macro_linenr=None):
6587 # Gives the filename and context for UnicodeDecodeError's, which are a pain
6588 # to debug otherwise. 'e' is the UnicodeDecodeError object.
6589 #
6590 # If the decoding error is for the output of a $(shell,...) command,
6591 # macro_linenr holds the line number where it was run (the exact line
6592 # number isn't available for decoding errors in files).
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006593
Tom Rini3c5f4152019-09-20 17:42:09 -04006594 raise KconfigError(
6595 "\n"
6596 "Malformed {} in {}\n"
6597 "Context: {}\n"
6598 "Problematic data: {}\n"
6599 "Reason: {}".format(
6600 e.encoding,
6601 "'{}'".format(filename) if macro_linenr is None else
6602 "output from macro at {}:{}".format(filename, macro_linenr),
6603 e.object[max(e.start - 40, 0):e.end + 40],
6604 e.object[e.start:e.end],
6605 e.reason))
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006606
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006607
Tom Rini3c5f4152019-09-20 17:42:09 -04006608def _warn_verbose_deprecated(fn_name):
6609 sys.stderr.write(
6610 "Deprecation warning: {0}()'s 'verbose' argument has no effect. Since "
6611 "Kconfiglib 12.0.0, the message is returned from {0}() instead, "
6612 "and is always generated. Do e.g. print(kconf.{0}()) if you want to "
6613 "want to show a message like \"Loaded configuration '.config'\" on "
6614 "stdout. The old API required ugly hacks to reuse messages in "
6615 "configuration interfaces.\n".format(fn_name))
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006616
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006617
Tom Rini3c5f4152019-09-20 17:42:09 -04006618# Predefined preprocessor functions
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006619
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006620
Tom Rini3c5f4152019-09-20 17:42:09 -04006621def _filename_fn(kconf, _):
6622 return kconf.filename
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006623
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006624
Tom Rini3c5f4152019-09-20 17:42:09 -04006625def _lineno_fn(kconf, _):
6626 return str(kconf.linenr)
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006627
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006628
Tom Rini3c5f4152019-09-20 17:42:09 -04006629def _info_fn(kconf, _, msg):
6630 print("{}:{}: {}".format(kconf.filename, kconf.linenr, msg))
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006631
Tom Rini3c5f4152019-09-20 17:42:09 -04006632 return ""
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006633
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006634
Tom Rini3c5f4152019-09-20 17:42:09 -04006635def _warning_if_fn(kconf, _, cond, msg):
6636 if cond == "y":
6637 kconf._warn(msg, kconf.filename, kconf.linenr)
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006638
Tom Rini3c5f4152019-09-20 17:42:09 -04006639 return ""
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006640
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006641
Tom Rini3c5f4152019-09-20 17:42:09 -04006642def _error_if_fn(kconf, _, cond, msg):
6643 if cond == "y":
6644 raise KconfigError("{}:{}: {}".format(
6645 kconf.filename, kconf.linenr, msg))
Ulf Magnusson1e642d72015-08-13 19:55:40 +02006646
Tom Rini3c5f4152019-09-20 17:42:09 -04006647 return ""
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006648
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006649
Tom Rini3c5f4152019-09-20 17:42:09 -04006650def _shell_fn(kconf, _, command):
6651 # Only import as needed, to save some startup time
6652 import subprocess
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006653
Tom Rini3c5f4152019-09-20 17:42:09 -04006654 stdout, stderr = subprocess.Popen(
6655 command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE
6656 ).communicate()
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006657
Tom Rini3c5f4152019-09-20 17:42:09 -04006658 if not _IS_PY2:
6659 try:
6660 stdout = stdout.decode(kconf._encoding)
6661 stderr = stderr.decode(kconf._encoding)
6662 except UnicodeDecodeError as e:
6663 _decoding_error(e, kconf.filename, kconf.linenr)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006664
Tom Rini3c5f4152019-09-20 17:42:09 -04006665 if stderr:
6666 kconf._warn("'{}' wrote to stderr: {}".format(
6667 command, "\n".join(stderr.splitlines())),
6668 kconf.filename, kconf.linenr)
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006669
Tom Rini3c5f4152019-09-20 17:42:09 -04006670 # Universal newlines with splitlines() (to prevent e.g. stray \r's in
6671 # command output on Windows), trailing newline removal, and
6672 # newline-to-space conversion.
6673 #
6674 # On Python 3 versions before 3.6, it's not possible to specify the
6675 # encoding when passing universal_newlines=True to Popen() (the 'encoding'
6676 # parameter was added in 3.6), so we do this manual version instead.
6677 return "\n".join(stdout.splitlines()).rstrip("\n").replace("\n", " ")
6678
6679#
6680# Global constants
6681#
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006682
Tom Rini3c5f4152019-09-20 17:42:09 -04006683TRI_TO_STR = {
6684 0: "n",
6685 1: "m",
6686 2: "y",
6687}
Simon Glass2b72a072017-08-04 03:30:30 -06006688
Tom Rini3c5f4152019-09-20 17:42:09 -04006689STR_TO_TRI = {
6690 "n": 0,
6691 "m": 1,
6692 "y": 2,
6693}
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006694
Tom Rini3c5f4152019-09-20 17:42:09 -04006695# Constant representing that there's no cached choice selection. This is
6696# distinct from a cached None (no selection). Any object that's not None or a
6697# Symbol will do. We test this with 'is'.
6698_NO_CACHED_SELECTION = 0
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006699
Tom Rini3c5f4152019-09-20 17:42:09 -04006700# Are we running on Python 2?
6701_IS_PY2 = sys.version_info[0] < 3
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006702
Tom Rini3c5f4152019-09-20 17:42:09 -04006703try:
6704 _UNAME_RELEASE = os.uname()[2]
6705except AttributeError:
6706 # Only import as needed, to save some startup time
6707 import platform
6708 _UNAME_RELEASE = platform.uname()[2]
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006709
Tom Rini3c5f4152019-09-20 17:42:09 -04006710# The token and type constants below are safe to test with 'is', which is a bit
6711# faster (~30% faster on my machine, and a few % faster for total parsing
6712# time), even without assuming Python's small integer optimization (which
6713# caches small integer objects). The constants end up pointing to unique
6714# integer objects, and since we consistently refer to them via the names below,
6715# we always get the same object.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006716#
Tom Rini3c5f4152019-09-20 17:42:09 -04006717# Client code should use == though.
6718
6719# Tokens, with values 1, 2, ... . Avoiding 0 simplifies some checks by making
6720# all tokens except empty strings truthy.
6721(
6722 _T_ALLNOCONFIG_Y,
6723 _T_AND,
6724 _T_BOOL,
6725 _T_CHOICE,
6726 _T_CLOSE_PAREN,
6727 _T_COMMENT,
6728 _T_CONFIG,
6729 _T_DEFAULT,
6730 _T_DEFCONFIG_LIST,
6731 _T_DEF_BOOL,
6732 _T_DEF_HEX,
6733 _T_DEF_INT,
6734 _T_DEF_STRING,
6735 _T_DEF_TRISTATE,
6736 _T_DEPENDS,
6737 _T_ENDCHOICE,
6738 _T_ENDIF,
6739 _T_ENDMENU,
6740 _T_ENV,
6741 _T_EQUAL,
6742 _T_GREATER,
6743 _T_GREATER_EQUAL,
6744 _T_HELP,
6745 _T_HEX,
6746 _T_IF,
6747 _T_IMPLY,
6748 _T_INT,
6749 _T_LESS,
6750 _T_LESS_EQUAL,
6751 _T_MAINMENU,
6752 _T_MENU,
6753 _T_MENUCONFIG,
6754 _T_MODULES,
6755 _T_NOT,
6756 _T_ON,
6757 _T_OPEN_PAREN,
6758 _T_OPTION,
6759 _T_OPTIONAL,
6760 _T_OR,
6761 _T_ORSOURCE,
6762 _T_OSOURCE,
6763 _T_PROMPT,
6764 _T_RANGE,
6765 _T_RSOURCE,
6766 _T_SELECT,
6767 _T_SOURCE,
6768 _T_STRING,
6769 _T_TRISTATE,
6770 _T_UNEQUAL,
6771 _T_VISIBLE,
6772) = range(1, 51)
6773
6774# Keyword to token map, with the get() method assigned directly as a small
6775# optimization
6776_get_keyword = {
6777 "---help---": _T_HELP,
6778 "allnoconfig_y": _T_ALLNOCONFIG_Y,
6779 "bool": _T_BOOL,
6780 "boolean": _T_BOOL,
6781 "choice": _T_CHOICE,
6782 "comment": _T_COMMENT,
6783 "config": _T_CONFIG,
6784 "def_bool": _T_DEF_BOOL,
6785 "def_hex": _T_DEF_HEX,
6786 "def_int": _T_DEF_INT,
6787 "def_string": _T_DEF_STRING,
6788 "def_tristate": _T_DEF_TRISTATE,
6789 "default": _T_DEFAULT,
6790 "defconfig_list": _T_DEFCONFIG_LIST,
6791 "depends": _T_DEPENDS,
6792 "endchoice": _T_ENDCHOICE,
6793 "endif": _T_ENDIF,
6794 "endmenu": _T_ENDMENU,
6795 "env": _T_ENV,
6796 "grsource": _T_ORSOURCE, # Backwards compatibility
6797 "gsource": _T_OSOURCE, # Backwards compatibility
6798 "help": _T_HELP,
6799 "hex": _T_HEX,
6800 "if": _T_IF,
6801 "imply": _T_IMPLY,
6802 "int": _T_INT,
6803 "mainmenu": _T_MAINMENU,
6804 "menu": _T_MENU,
6805 "menuconfig": _T_MENUCONFIG,
6806 "modules": _T_MODULES,
6807 "on": _T_ON,
6808 "option": _T_OPTION,
6809 "optional": _T_OPTIONAL,
6810 "orsource": _T_ORSOURCE,
6811 "osource": _T_OSOURCE,
6812 "prompt": _T_PROMPT,
6813 "range": _T_RANGE,
6814 "rsource": _T_RSOURCE,
6815 "select": _T_SELECT,
6816 "source": _T_SOURCE,
6817 "string": _T_STRING,
6818 "tristate": _T_TRISTATE,
6819 "visible": _T_VISIBLE,
6820}.get
6821
6822# The constants below match the value of the corresponding tokens to remove the
6823# need for conversion
6824
6825# Node types
6826MENU = _T_MENU
6827COMMENT = _T_COMMENT
6828
6829# Expression types
6830AND = _T_AND
6831OR = _T_OR
6832NOT = _T_NOT
6833EQUAL = _T_EQUAL
6834UNEQUAL = _T_UNEQUAL
6835LESS = _T_LESS
6836LESS_EQUAL = _T_LESS_EQUAL
6837GREATER = _T_GREATER
6838GREATER_EQUAL = _T_GREATER_EQUAL
6839
6840REL_TO_STR = {
6841 EQUAL: "=",
6842 UNEQUAL: "!=",
6843 LESS: "<",
6844 LESS_EQUAL: "<=",
6845 GREATER: ">",
6846 GREATER_EQUAL: ">=",
6847}
6848
6849# Symbol/choice types. UNKNOWN is 0 (falsy) to simplify some checks.
6850# Client code shouldn't rely on it though, as it was non-zero in
6851# older versions.
6852UNKNOWN = 0
6853BOOL = _T_BOOL
6854TRISTATE = _T_TRISTATE
6855STRING = _T_STRING
6856INT = _T_INT
6857HEX = _T_HEX
6858
6859TYPE_TO_STR = {
6860 UNKNOWN: "unknown",
6861 BOOL: "bool",
6862 TRISTATE: "tristate",
6863 STRING: "string",
6864 INT: "int",
6865 HEX: "hex",
6866}
6867
6868# Used in comparisons. 0 means the base is inferred from the format of the
6869# string.
6870_TYPE_TO_BASE = {
6871 HEX: 16,
6872 INT: 10,
6873 STRING: 0,
6874 UNKNOWN: 0,
6875}
6876
6877# def_bool -> BOOL, etc.
6878_DEF_TOKEN_TO_TYPE = {
6879 _T_DEF_BOOL: BOOL,
6880 _T_DEF_HEX: HEX,
6881 _T_DEF_INT: INT,
6882 _T_DEF_STRING: STRING,
6883 _T_DEF_TRISTATE: TRISTATE,
6884}
6885
6886# Tokens after which strings are expected. This is used to tell strings from
6887# constant symbol references during tokenization, both of which are enclosed in
6888# quotes.
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006889#
Tom Rini3c5f4152019-09-20 17:42:09 -04006890# Identifier-like lexemes ("missing quotes") are also treated as strings after
6891# these tokens. _T_CHOICE is included to avoid symbols being registered for
6892# named choices.
6893_STRING_LEX = frozenset({
6894 _T_BOOL,
6895 _T_CHOICE,
6896 _T_COMMENT,
6897 _T_HEX,
6898 _T_INT,
6899 _T_MAINMENU,
6900 _T_MENU,
6901 _T_ORSOURCE,
6902 _T_OSOURCE,
6903 _T_PROMPT,
6904 _T_RSOURCE,
6905 _T_SOURCE,
6906 _T_STRING,
6907 _T_TRISTATE,
6908})
6909
6910# Various sets for quick membership tests. Gives a single global lookup and
6911# avoids creating temporary dicts/tuples.
6912
6913_TYPE_TOKENS = frozenset({
6914 _T_BOOL,
6915 _T_TRISTATE,
6916 _T_INT,
6917 _T_HEX,
6918 _T_STRING,
6919})
6920
6921_SOURCE_TOKENS = frozenset({
6922 _T_SOURCE,
6923 _T_RSOURCE,
6924 _T_OSOURCE,
6925 _T_ORSOURCE,
6926})
6927
6928_REL_SOURCE_TOKENS = frozenset({
6929 _T_RSOURCE,
6930 _T_ORSOURCE,
6931})
6932
6933# Obligatory (non-optional) sources
6934_OBL_SOURCE_TOKENS = frozenset({
6935 _T_SOURCE,
6936 _T_RSOURCE,
6937})
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006938
Tom Rini3c5f4152019-09-20 17:42:09 -04006939_BOOL_TRISTATE = frozenset({
6940 BOOL,
6941 TRISTATE,
6942})
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006943
Tom Rini3c5f4152019-09-20 17:42:09 -04006944_BOOL_TRISTATE_UNKNOWN = frozenset({
6945 BOOL,
6946 TRISTATE,
6947 UNKNOWN,
6948})
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006949
Tom Rini3c5f4152019-09-20 17:42:09 -04006950_INT_HEX = frozenset({
6951 INT,
6952 HEX,
6953})
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006954
Tom Rini3c5f4152019-09-20 17:42:09 -04006955_SYMBOL_CHOICE = frozenset({
6956 Symbol,
6957 Choice,
6958})
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006959
Tom Rini3c5f4152019-09-20 17:42:09 -04006960_MENU_COMMENT = frozenset({
6961 MENU,
6962 COMMENT,
6963})
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006964
Tom Rini3c5f4152019-09-20 17:42:09 -04006965_EQUAL_UNEQUAL = frozenset({
6966 EQUAL,
6967 UNEQUAL,
6968})
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006969
Tom Rini3c5f4152019-09-20 17:42:09 -04006970_RELATIONS = frozenset({
6971 EQUAL,
6972 UNEQUAL,
6973 LESS,
6974 LESS_EQUAL,
6975 GREATER,
6976 GREATER_EQUAL,
6977})
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006978
Tom Rini3c5f4152019-09-20 17:42:09 -04006979# Helper functions for getting compiled regular expressions, with the needed
6980# matching function returned directly as a small optimization.
6981#
6982# Use ASCII regex matching on Python 3. It's already the default on Python 2.
6983
6984
6985def _re_match(regex):
6986 return re.compile(regex, 0 if _IS_PY2 else re.ASCII).match
6987
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006988
Tom Rini3c5f4152019-09-20 17:42:09 -04006989def _re_search(regex):
6990 return re.compile(regex, 0 if _IS_PY2 else re.ASCII).search
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006991
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006992
Tom Rini3c5f4152019-09-20 17:42:09 -04006993# Various regular expressions used during parsing
Masahiro Yamadac908bc82014-09-01 19:57:37 +09006994
Tom Rini3c5f4152019-09-20 17:42:09 -04006995# The initial token on a line. Also eats leading and trailing whitespace, so
6996# that we can jump straight to the next token (or to the end of the line if
6997# there is only one token).
6998#
6999# This regex will also fail to match for empty lines and comment lines.
7000#
7001# '$' is included to detect preprocessor variable assignments with macro
7002# expansions in the left-hand side.
7003_command_match = _re_match(r"\s*([A-Za-z0-9_$-]+)\s*")
7004
7005# An identifier/keyword after the first token. Also eats trailing whitespace.
7006# '$' is included to detect identifiers containing macro expansions.
7007_id_keyword_match = _re_match(r"([A-Za-z0-9_$/.-]+)\s*")
7008
7009# A fragment in the left-hand side of a preprocessor variable assignment. These
7010# are the portions between macro expansions ($(foo)). Macros are supported in
7011# the LHS (variable name).
7012_assignment_lhs_fragment_match = _re_match("[A-Za-z0-9_-]*")
Ulf Magnusson1e642d72015-08-13 19:55:40 +02007013
Tom Rini3c5f4152019-09-20 17:42:09 -04007014# The assignment operator and value (right-hand side) in a preprocessor
7015# variable assignment
7016_assignment_rhs_match = _re_match(r"\s*(=|:=|\+=)\s*(.*)")
Masahiro Yamadac908bc82014-09-01 19:57:37 +09007017
Tom Rini3c5f4152019-09-20 17:42:09 -04007018# Special characters/strings while expanding a macro (')', ',', and '$(')
7019_macro_special_search = _re_search(r"\)|,|\$\(")
Masahiro Yamadac908bc82014-09-01 19:57:37 +09007020
Tom Rini3c5f4152019-09-20 17:42:09 -04007021# Special characters/strings while expanding a string (quotes, '\', and '$(')
7022_string_special_search = _re_search(r'"|\'|\\|\$\(')
Masahiro Yamadac908bc82014-09-01 19:57:37 +09007023
Tom Rini3c5f4152019-09-20 17:42:09 -04007024# Special characters/strings while expanding a symbol name. Also includes
7025# end-of-line, in case the macro is the last thing on the line.
7026_name_special_search = _re_search(r'[^A-Za-z0-9_$/.-]|\$\(|$')
Masahiro Yamadac908bc82014-09-01 19:57:37 +09007027
Tom Rini3c5f4152019-09-20 17:42:09 -04007028# A valid right-hand side for an assignment to a string symbol in a .config
7029# file, including escaped characters. Extracts the contents.
7030_conf_string_match = _re_match(r'"((?:[^\\"]|\\.)*)"')