Prepare v2022.04-rc4
[platform/kernel/u-boot.git] / tools / buildman / kconfiglib.py
1 # Copyright (c) 2011-2019, Ulf Magnusson
2 # SPDX-License-Identifier: ISC
3
4 """
5 Overview
6 ========
7
8 Kconfiglib is a Python 2/3 library for scripting and extracting information
9 from Kconfig (https://www.kernel.org/doc/Documentation/kbuild/kconfig-language.txt)
10 configuration systems.
11
12 See the homepage at https://github.com/ulfalizer/Kconfiglib for a longer
13 overview.
14
15 Since Kconfiglib 12.0.0, the library version is available in
16 kconfiglib.VERSION, which is a (<major>, <minor>, <patch>) tuple, e.g.
17 (12, 0, 0).
18
19
20 Using Kconfiglib on the Linux kernel with the Makefile targets
21 ==============================================================
22
23 For the Linux kernel, a handy interface is provided by the
24 scripts/kconfig/Makefile patch, which can be applied with either 'git am' or
25 the 'patch' utility:
26
27   $ 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
29
30 Warning: Not passing -p1 to patch will cause the wrong file to be patched.
31
32 Please tell me if the patch does not apply. It should be trivial to apply
33 manually, as it's just a block of text that needs to be inserted near the other
34 *conf: targets in scripts/kconfig/Makefile.
35
36 Look further down for a motivation for the Makefile patch and for instructions
37 on how you can use Kconfiglib without it.
38
39 If you do not wish to install Kconfiglib via pip, the Makefile patch is set up
40 so that you can also just clone Kconfiglib into the kernel root:
41
42   $ git clone git://github.com/ulfalizer/Kconfiglib.git
43   $ git am Kconfiglib/makefile.patch  (or 'patch -p1 < Kconfiglib/makefile.patch')
44
45 Warning: The directory name Kconfiglib/ is significant in this case, because
46 it's added to PYTHONPATH by the new targets in makefile.patch.
47
48 The targets added by the Makefile patch are described in the following
49 sections.
50
51
52 make kmenuconfig
53 ----------------
54
55 This target runs the curses menuconfig interface with Python 3. As of
56 Kconfiglib 12.2.0, both Python 2 and Python 3 are supported (previously, only
57 Python 3 was supported, so this was a backport).
58
59
60 make guiconfig
61 --------------
62
63 This target runs the Tkinter menuconfig interface. Both Python 2 and Python 3
64 are supported. To change the Python interpreter used, pass
65 PYTHONCMD=<executable> to 'make'. The default is 'python'.
66
67
68 make [ARCH=<arch>] iscriptconfig
69 --------------------------------
70
71 This target gives an interactive Python prompt where a Kconfig instance has
72 been preloaded and is available in 'kconf'. To change the Python interpreter
73 used, pass PYTHONCMD=<executable> to 'make'. The default is 'python'.
74
75 To get a feel for the API, try evaluating and printing the symbols in
76 kconf.defined_syms, and explore the MenuNode menu tree starting at
77 kconf.top_node by following 'next' and 'list' pointers.
78
79 The item contained in a menu node is found in MenuNode.item (note that this can
80 be one of the constants kconfiglib.MENU and kconfiglib.COMMENT), and all
81 symbols and choices have a 'nodes' attribute containing their menu nodes
82 (usually only one). Printing a menu node will print its item, in Kconfig
83 format.
84
85 If you want to look up a symbol by name, use the kconf.syms dictionary.
86
87
88 make scriptconfig SCRIPT=<script> [SCRIPT_ARG=<arg>]
89 ----------------------------------------------------
90
91 This target runs the Python script given by the SCRIPT parameter on the
92 configuration. 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
94 argument, if given.
95
96 See the examples/ subdirectory for example scripts.
97
98
99 make dumpvarsconfig
100 -------------------
101
102 This target prints a list of all environment variables referenced from the
103 Kconfig files, together with their values. See the
104 Kconfiglib/examples/dumpvars.py script.
105
106 Only environment variables that are referenced via the Kconfig preprocessor
107 $(FOO) syntax are included. The preprocessor was added in Linux 4.18.
108
109
110 Using Kconfiglib without the Makefile targets
111 =============================================
112
113 The make targets are only needed to pick up environment variables exported from
114 the Kbuild makefiles and referenced inside Kconfig files, via e.g.
115 'source "arch/$(SRCARCH)/Kconfig" and commands run via '$(shell,...)'.
116
117 These variables are referenced as of writing (Linux 4.18), together with sample
118 values:
119
120   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)
128
129 Older kernels only reference ARCH, SRCARCH, and KERNELVERSION.
130
131 If your kernel is recent enough (4.18+), you can get a list of referenced
132 environment variables via 'make dumpvarsconfig' (see above). Note that this
133 command is added by the Makefile patch.
134
135 To run Kconfiglib without the Makefile patch, set the environment variables
136 manually:
137
138   $ srctree=. ARCH=x86 SRCARCH=x86 KERNELVERSION=`make kernelversion` ... python(3)
139   >>> import kconfiglib
140   >>> kconf = kconfiglib.Kconfig()  # filename defaults to "Kconfig"
141
142 Search the top-level Makefile for "Additional ARCH settings" to see other
143 possibilities for ARCH and SRCARCH.
144
145
146 Intro to symbol values
147 ======================
148
149 Kconfiglib has the same assignment semantics as the C implementation.
150
151 Any symbol can be assigned a value by the user (via Kconfig.load_config() or
152 Symbol.set_value()), but this user value is only respected if the symbol is
153 visible, which corresponds to it (currently) being visible in the menuconfig
154 interface.
155
156 For symbols with prompts, the visibility of the symbol is determined by the
157 condition on the prompt. Symbols without prompts are never visible, so setting
158 a user value on them is pointless. A warning will be printed by default if
159 Symbol.set_value() is called on a promptless symbol. Assignments to promptless
160 symbols are normal within a .config file, so no similar warning will be printed
161 by load_config().
162
163 Dependencies from parents and 'if'/'depends on' are propagated to properties,
164 including prompts, so these two configurations are logically equivalent:
165
166 (1)
167
168   menu "menu"
169       depends on A
170
171   if B
172
173   config FOO
174       tristate "foo" if D
175       default y
176       depends on C
177
178   endif
179
180   endmenu
181
182 (2)
183
184   menu "menu"
185       depends on A
186
187   config FOO
188       tristate "foo" if A && B && C && D
189       default y if A && B && C
190
191   endmenu
192
193 In this example, A && B && C && D (the prompt condition) needs to be non-n for
194 FOO to be visible (assignable). If its value is m, the symbol can only be
195 assigned the value m: The visibility sets an upper bound on the value that can
196 be assigned by the user, and any higher user value will be truncated down.
197
198 'default' properties are independent of the visibility, though a 'default' will
199 often 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
201 value.
202
203 Symbols with no user value (or that have a user value but are not visible) and
204 no (active) 'default' default to n for bool/tristate symbols, and to the empty
205 string for other symbol types.
206
207 'select' works similarly to symbol visibility, but sets a lower bound on the
208 value of the symbol. The lower bound is determined by the value of the
209 select*ing* symbol. 'select' does not respect visibility, so non-visible
210 symbols can be forced to a particular (minimum) value by a select as well.
211
212 For non-bool/tristate symbols, it only matters whether the visibility is n or
213 non-n: m visibility acts the same as y visibility.
214
215 Conditions on 'default' and 'select' work in mostly intuitive ways. If the
216 condition 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
218 down to m.
219
220 When writing a configuration with Kconfig.write_config(), only symbols that are
221 visible, have an (active) default, or are selected will get written out (note
222 that this includes all symbols that would accept user values). Kconfiglib
223 matches the .config format produced by the C implementations down to the
224 character. This eases testing.
225
226 For a visible bool/tristate symbol FOO with value n, this line is written to
227 .config:
228
229     # CONFIG_FOO is not set
230
231 The point is to remember the user n selection (which might differ from the
232 default value the symbol would get), while at the same sticking to the rule
233 that undefined corresponds to n (.config uses Makefile format, making the line
234 above a comment). When the .config file is read back in, this line will be
235 treated the same as the following assignment:
236
237     CONFIG_FOO=n
238
239 In Kconfiglib, the set of (currently) assignable values for a bool/tristate
240 symbol appear in Symbol.assignable. For other symbol types, just check if
241 sym.visibility is non-0 (non-n) to see whether the user value will have an
242 effect.
243
244
245 Intro to the menu tree
246 ======================
247
248 The menu structure, as seen in e.g. menuconfig, is represented by a tree of
249 MenuNode objects. The top node of the configuration corresponds to an implicit
250 top-level menu, the title of which is shown at the top in the standard
251 menuconfig interface. (The title is also available in Kconfig.mainmenu_text in
252 Kconfiglib.)
253
254 The top node is found in Kconfig.top_node. From there, you can visit child menu
255 nodes by following the 'list' pointer, and any following menu nodes by
256 following the 'next' pointer. Usually, a non-None 'list' pointer indicates a
257 menu or Choice, but menu nodes for symbols can sometimes have a non-None 'list'
258 pointer too due to submenus created implicitly from dependencies.
259
260 MenuNode.item is either a Symbol or a Choice object, or one of the constants
261 MENU and COMMENT. The prompt of the menu node can be found in MenuNode.prompt,
262 which also holds the title for menus and comments. For Symbol and Choice,
263 MenuNode.help holds the help text (if any, otherwise None).
264
265 Most symbols will only have a single menu node. A symbol defined in multiple
266 locations will have one menu node for each location. The list of menu nodes for
267 a Symbol or Choice can be found in the Symbol/Choice.nodes attribute.
268
269 Note that prompts and help texts for symbols and choices are stored in their
270 menu node(s) rather than in the Symbol or Choice objects themselves. This makes
271 it possible to define a symbol in multiple locations with a different prompt or
272 help text in each location. To get the help text or prompt for a symbol with a
273 single menu node, do sym.nodes[0].help and sym.nodes[0].prompt, respectively.
274 The prompt is a (text, condition) tuple, where condition determines the
275 visibility (see 'Intro to expressions' below).
276
277 This organization mirrors the C implementation. MenuNode is called
278 'struct menu' there, but I thought "menu" was a confusing name.
279
280 It is possible to give a Choice a name and define it in multiple locations,
281 hence why Choice.nodes is also a list.
282
283 As a convenience, the properties added at a particular definition location are
284 available on the MenuNode itself, in e.g. MenuNode.defaults. This is helpful
285 when generating documentation, so that symbols/choices defined in multiple
286 locations can be shown with the correct properties at each location.
287
288
289 Intro to expressions
290 ====================
291
292 Expressions can be evaluated with the expr_value() function and printed with
293 the expr_str() function (these are used internally as well). Evaluating an
294 expression always yields a tristate value, where n, m, and y are represented as
295 0, 1, and 2, respectively.
296
297 The following table should help you figure out how expressions are represented.
298 A, B, C, ... are symbols (Symbol instances), NOT is the kconfiglib.NOT
299 constant, etc.
300
301 Expression            Representation
302 ----------            --------------
303 A                     A
304 "A"                   A (constant symbol)
305 !A                    (NOT, A)
306 A && B                (AND, A, B)
307 A && B && C           (AND, A, (AND, B, C))
308 A || B                (OR, A, B)
309 A || (B && C && D)    (OR, A, (AND, B, (AND, C, D)))
310 A = B                 (EQUAL, A, B)
311 A != "foo"            (UNEQUAL, A, foo (constant symbol))
312 A && B = C && D       (AND, A, (AND, (EQUAL, B, C), D))
313 n                     Kconfig.n (constant symbol)
314 m                     Kconfig.m (constant symbol)
315 y                     Kconfig.y (constant symbol)
316 "y"                   Kconfig.y (constant symbol)
317
318 Strings like "foo" in 'default "foo"' or 'depends on SYM = "foo"' are
319 represented as constant symbols, so the only values that appear in expressions
320 are symbols***. This mirrors the C implementation.
321
322 ***For choice symbols, the parent Choice will appear in expressions as well,
323 but it's usually invisible as the value interfaces of Symbol and Choice are
324 identical. This mirrors the C implementation and makes different choice modes
325 "just work".
326
327 Manual evaluation examples:
328
329   - The value of A && B is min(A.tri_value, B.tri_value)
330
331   - The value of A || B is max(A.tri_value, B.tri_value)
332
333   - The value of !A is 2 - A.tri_value
334
335   - 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.
337
338     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.
341
342 n/m/y are automatically converted to the corresponding constant symbols
343 "n"/"m"/"y" (Kconfig.n/m/y) during parsing.
344
345 Kconfig.const_syms is a dictionary like Kconfig.syms but for constant symbols.
346
347 If 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__()
349 functions just avoid printing 'if y' conditions to give cleaner output.
350
351
352 Kconfig extensions
353 ==================
354
355 Kconfiglib includes a couple of Kconfig extensions:
356
357 'source' with relative path
358 ---------------------------
359
360 The 'rsource' statement sources Kconfig files with a path relative to directory
361 of the Kconfig file containing the 'rsource' statement, instead of relative to
362 the project root.
363
364 Consider following directory tree:
365
366   Project
367   +--Kconfig
368   |
369   +--src
370      +--Kconfig
371      |
372      +--SubSystem1
373         +--Kconfig
374         |
375         +--ModuleA
376            +--Kconfig
377
378 In this example, assume that src/SubSystem1/Kconfig wants to source
379 src/SubSystem1/ModuleA/Kconfig.
380
381 With 'source', this statement would be used:
382
383   source "src/SubSystem1/ModuleA/Kconfig"
384
385 With 'rsource', this turns into
386
387   rsource "ModuleA/Kconfig"
388
389 If an absolute path is given to 'rsource', it acts the same as 'source'.
390
391 'rsource' can be used to create "position-independent" Kconfig trees that can
392 be moved around freely.
393
394
395 Globbing 'source'
396 -----------------
397
398 'source' and 'rsource' accept glob patterns, sourcing all matching Kconfig
399 files. They require at least one matching file, raising a KconfigError
400 otherwise.
401
402 For example, the following statement might source sub1/foofoofoo and
403 sub2/foobarfoo:
404
405   source "sub[12]/foo*foo"
406
407 The glob patterns accepted are the same as for the standard glob.glob()
408 function.
409
410 Two additional statements are provided for cases where it's acceptable for a
411 pattern to match no files: 'osource' and 'orsource' (the o is for "optional").
412
413 For example, the following statements will be no-ops if neither "foo" nor any
414 files matching "bar*" exist:
415
416   osource "foo"
417   osource "bar*"
418
419 'orsource' does a relative optional source.
420
421 'source' and 'osource' are analogous to 'include' and '-include' in Make.
422
423
424 Generalized def_* keywords
425 --------------------------
426
427 def_int, def_hex, and def_string are available in addition to def_bool and
428 def_tristate, allowing int, hex, and string symbols to be given a type and a
429 default at the same time.
430
431
432 Extra optional warnings
433 -----------------------
434
435 Some optional warnings can be controlled via environment variables:
436
437   - 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.
441
442     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.
446
447     KCONFIG_STRICT is an older alias for this environment variable, supported
448     for backwards compatibility.
449
450   - 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.
453
454     This warning can also be enabled/disabled via the Kconfig.warn_assign_undef
455     variable.
456
457
458 Preprocessor user functions defined in Python
459 ---------------------------------------------
460
461 Preprocessor functions can be defined in Python, which makes it simple to
462 integrate information from existing Python tools into Kconfig (e.g. to have
463 Kconfig symbols depend on hardware information stored in some other format).
464
465 Putting a Python module named kconfigfunctions(.py) anywhere in sys.path will
466 cause it to be imported by Kconfiglib (in Kconfig.__init__()). Note that
467 sys.path can be customized via PYTHONPATH, and includes the directory of the
468 module being run by default, as well as installation directories.
469
470 If the KCONFIG_FUNCTIONS environment variable is set, it gives a different
471 module name to use instead of 'kconfigfunctions'.
472
473 The imported module is expected to define a global dictionary named 'functions'
474 that maps function names to Python functions, as follows:
475
476   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       ...
489
490   def my_other_fn(kconf, name, arg_1, arg_2, ...):
491       ...
492
493   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   }
498
499   ...
500
501 <min.args> and <max.args> are the minimum and maximum number of arguments
502 expected 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
504 an invalid number of arguments will generate a KconfigError exception.
505
506 Functions can access the current parsing location as kconf.filename/linenr.
507 Accessing other fields of the Kconfig object is not safe. See the warning
508 below.
509
510 Keep in mind that for a variable defined like 'foo = $(fn)', 'fn' will be
511 called only when 'foo' is expanded. If 'fn' uses the parsing location and the
512 intent is to use the location of the assignment, you want 'foo := $(fn)'
513 instead, which calls the function immediately.
514
515 Once defined, user functions can be called from Kconfig in the same way as
516 other preprocessor functions:
517
518     config FOO
519         ...
520         depends on $(my-fn,arg1,arg2)
521
522 If my_fn() returns "n", this will result in
523
524     config FOO
525         ...
526         depends on n
527
528 Warning
529 *******
530
531 User-defined preprocessor functions are called as they're encountered at parse
532 time, before all Kconfig files have been processed, and before the menu tree
533 has been finalized. There are no guarantees that accessing Kconfig symbols or
534 the menu tree via the 'kconf' parameter will work, and it could potentially
535 lead to a crash.
536
537 Preferably, user-defined functions should be stateless.
538
539
540 Feedback
541 ========
542
543 Send bug reports, suggestions, and questions to ulfalizer a.t Google's email
544 service, or open a ticket on the GitHub page.
545 """
546 import errno
547 import importlib
548 import os
549 import re
550 import sys
551
552 # Get rid of some attribute lookups. These are obvious in context.
553 from glob import iglob
554 from os.path import dirname, exists, expandvars, islink, join, realpath
555
556
557 VERSION = (14, 1, 0)
558
559
560 # File layout:
561 #
562 # Public classes
563 # Public functions
564 # Internal functions
565 # Global constants
566
567 # Line length: 79 columns
568
569
570 #
571 # Public classes
572 #
573
574
575 class 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.
581
582     The following attributes are available. They should be treated as
583     read-only, and some are implemented through @property magic.
584
585     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.
589
590       Undefined symbols can be recognized by Symbol.nodes being empty -- see
591       the 'Intro to the menu tree' section in the module docstring.
592
593     const_syms:
594       A dictionary like 'syms' for constant (quoted) symbols
595
596     named_choices:
597       A dictionary like 'syms' for named choices (choice FOO)
598
599     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.
603
604       Note: You probably want to use 'unique_defined_syms' instead. This
605       attribute is mostly maintained for backwards compatibility.
606
607     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.
611
612       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).
616
617     choices:
618       A list with all choices, in the same order as they appear in the Kconfig
619       files.
620
621       Note: You probably want to use 'unique_choices' instead. This attribute
622       is mostly maintained for backwards compatibility.
623
624     unique_choices:
625       Analogous to 'unique_defined_syms', for choices. Named choices can have
626       multiple definition locations.
627
628     menus:
629       A list with all menus, in the same order as they appear in the Kconfig
630       files
631
632     comments:
633       A list with all comments, in the same order as they appear in the Kconfig
634       files
635
636     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.
641
642       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.
645
646       Note that Kconfig.sync_deps() already indirectly catches any file
647       modifications that change configuration output.
648
649     env_vars:
650       A set() with the names of all environment variables referenced in the
651       Kconfig files.
652
653       Only environment variables referenced with the preprocessor $(FOO) syntax
654       will be registered. The older $FOO syntax is only supported for backwards
655       compatibility.
656
657       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).
660
661       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.
664
665       The note from the 'kconfig_filenames' documentation applies here too.
666
667     n/m/y:
668       The predefined constant symbols n/m/y. Also available in const_syms.
669
670     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.
675
676       'modules' is never None. If the MODULES symbol is not explicitly defined,
677       its tri_value will be 0 (n), as expected.
678
679       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').
683
684     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.
688
689     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.
695
696       '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.
699
700       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.
704
705     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.
708
709     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).
712
713     variables:
714       A dictionary with all preprocessor variables, indexed by name. See the
715       Variable class.
716
717     warn:
718       Set this variable to True/False to enable/disable warnings. See
719       Kconfig.__init__().
720
721       When 'warn' is False, the values of the other warning-related variables
722       are ignored.
723
724       This variable as well as the other warn* variables can be read to check
725       the current warning settings.
726
727     warn_to_stderr:
728       Set this variable to True/False to enable/disable warnings on stderr. See
729       Kconfig.__init__().
730
731     warn_assign_undef:
732       Set this variable to True to generate warnings for assignments to
733       undefined symbols in configuration files.
734
735       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.
738
739     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).
744
745       This variable is True by default. Disabling it might be useful when
746       merging configurations.
747
748     warn_assign_redun:
749       Like warn_assign_override, but for multiple assignments setting a symbol
750       to the same value.
751
752       This variable is True by default. Disabling it might be useful when
753       merging configurations.
754
755     warnings:
756       A list of strings containing all warnings that have been generated, for
757       cases where more flexibility is needed.
758
759       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.
762
763       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.
766
767     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.
772
773       See Kconfig.load_config() as well.
774
775     srctree:
776       The value the $srctree environment variable had when the Kconfig instance
777       was created, 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 "./".
780
781       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.
786
787       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.
790
791     config_prefix:
792       The value the CONFIG_ environment variable had when the Kconfig instance
793       was created, or "CONFIG_" if CONFIG_ wasn't set. This is the prefix used
794       (and expected) on symbol names in .config files and C headers. Used in
795       the same way in the C tools.
796
797     config_header:
798       The value the KCONFIG_CONFIG_HEADER environment variable had when the
799       Kconfig instance was created, or the empty string if
800       KCONFIG_CONFIG_HEADER wasn't set. This string is inserted verbatim at the
801       beginning of configuration files. See write_config().
802
803     header_header:
804       The value the KCONFIG_AUTOHEADER_HEADER environment variable had when the
805       Kconfig instance was created, or the empty string if
806       KCONFIG_AUTOHEADER_HEADER wasn't set. This string is inserted verbatim at
807       the beginning of header files. See write_autoconf().
808
809     filename/linenr:
810       The current parsing location, for use in Python preprocessor functions.
811       See the module docstring.
812     """
813     __slots__ = (
814         "_encoding",
815         "_functions",
816         "_set_match",
817         "_srctree_prefix",
818         "_unset_match",
819         "_warn_assign_no_prompt",
820         "choices",
821         "comments",
822         "config_header",
823         "config_prefix",
824         "const_syms",
825         "defconfig_list",
826         "defined_syms",
827         "env_vars",
828         "header_header",
829         "kconfig_filenames",
830         "m",
831         "menus",
832         "missing_syms",
833         "modules",
834         "n",
835         "named_choices",
836         "srctree",
837         "syms",
838         "top_node",
839         "unique_choices",
840         "unique_defined_syms",
841         "variables",
842         "warn",
843         "warn_assign_override",
844         "warn_assign_redun",
845         "warn_assign_undef",
846         "warn_to_stderr",
847         "warnings",
848         "y",
849
850         # Parsing-related
851         "_parsing_kconfigs",
852         "_readline",
853         "filename",
854         "linenr",
855         "_include_path",
856         "_filestack",
857         "_line",
858         "_tokens",
859         "_tokens_i",
860         "_reuse_tokens",
861     )
862
863     #
864     # Public interface
865     #
866
867     def __init__(self, filename="Kconfig", warn=True, warn_to_stderr=True,
868                  encoding="utf-8", suppress_traceback=False):
869         """
870         Creates a new Kconfig object by parsing Kconfig files.
871         Note that Kconfig files are not the same as .config files (which store
872         configuration symbol values).
873
874         See the module docstring for some environment variables that influence
875         default warning settings (KCONFIG_WARN_UNDEF and
876         KCONFIG_WARN_UNDEF_ASSIGN).
877
878         Raises KconfigError on syntax/semantic errors, and OSError or (possibly
879         a subclass of) IOError on IO errors ('errno', 'strerror', and
880         'filename' are available). Note that IOError is an alias for OSError on
881         Python 3, so it's enough to catch OSError there. If you need Python 2/3
882         compatibility, it's easiest to catch EnvironmentError, which is a
883         common base class of OSError/IOError on Python 2 and an alias for
884         OSError on Python 3.
885
886         filename (default: "Kconfig"):
887           The Kconfig file to load. For the Linux kernel, you'll want "Kconfig"
888           from the top-level directory, as environment variables will make sure
889           the right Kconfig is included from there (arch/$SRCARCH/Kconfig as of
890           writing).
891
892           If $srctree is set, 'filename' will be looked up relative to it.
893           $srctree is also used to look up source'd files within Kconfig files.
894           See the class documentation.
895
896           If you are using Kconfiglib via 'make scriptconfig', the filename of
897           the base base Kconfig file will be in sys.argv[1]. It's currently
898           always "Kconfig" in practice.
899
900         warn (default: True):
901           True if warnings related to this configuration should be generated.
902           This can be changed later by setting Kconfig.warn to True/False. It
903           is provided as a constructor argument since warnings might be
904           generated during parsing.
905
906           See the other Kconfig.warn_* variables as well, which enable or
907           suppress certain warnings when warnings are enabled.
908
909           All generated warnings are added to the Kconfig.warnings list. See
910           the class documentation.
911
912         warn_to_stderr (default: True):
913           True if warnings should be printed to stderr in addition to being
914           added to Kconfig.warnings.
915
916           This can be changed later by setting Kconfig.warn_to_stderr to
917           True/False.
918
919         encoding (default: "utf-8"):
920           The encoding to use when reading and writing files, and when decoding
921           output from commands run via $(shell). If None, the encoding
922           specified in the current locale will be used.
923
924           The "utf-8" default avoids exceptions on systems that are configured
925           to use the C locale, which implies an ASCII encoding.
926
927           This parameter has no effect on Python 2, due to implementation
928           issues (regular strings turning into Unicode strings, which are
929           distinct in Python 2). Python 2 doesn't decode regular strings
930           anyway.
931
932           Related PEP: https://www.python.org/dev/peps/pep-0538/
933
934         suppress_traceback (default: False):
935           Helper for tools. When True, any EnvironmentError or KconfigError
936           generated during parsing is caught, the exception message is printed
937           to stderr together with the command name, and sys.exit(1) is called
938           (which generates SystemExit).
939
940           This hides the Python traceback for "expected" errors like syntax
941           errors in Kconfig files.
942
943           Other exceptions besides EnvironmentError and KconfigError are still
944           propagated when suppress_traceback is True.
945         """
946         try:
947             self._init(filename, warn, warn_to_stderr, encoding)
948         except (EnvironmentError, KconfigError) as e:
949             if suppress_traceback:
950                 cmd = sys.argv[0]  # Empty string if missing
951                 if cmd:
952                     cmd += ": "
953                 # Some long exception messages have extra newlines for better
954                 # formatting when reported as an unhandled exception. Strip
955                 # them here.
956                 sys.exit(cmd + str(e).strip())
957             raise
958
959     def _init(self, filename, warn, warn_to_stderr, encoding):
960         # See __init__()
961
962         self._encoding = encoding
963
964         self.srctree = os.getenv("srctree", "")
965         # A prefix we can reliably strip from glob() results to get a filename
966         # relative to $srctree. relpath() can cause issues for symlinks,
967         # because it assumes symlink/../foo is the same as foo/.
968         self._srctree_prefix = realpath(self.srctree) + os.sep
969
970         self.warn = warn
971         self.warn_to_stderr = warn_to_stderr
972         self.warn_assign_undef = os.getenv("KCONFIG_WARN_UNDEF_ASSIGN") == "y"
973         self.warn_assign_override = True
974         self.warn_assign_redun = True
975         self._warn_assign_no_prompt = True
976
977         self.warnings = []
978
979         self.config_prefix = os.getenv("CONFIG_", "CONFIG_")
980         # Regular expressions for parsing .config files
981         self._set_match = _re_match(self.config_prefix + r"([^=]+)=(.*)")
982         self._unset_match = _re_match(r"# {}([^ ]+) is not set".format(
983             self.config_prefix))
984
985         self.config_header = os.getenv("KCONFIG_CONFIG_HEADER", "")
986         self.header_header = os.getenv("KCONFIG_AUTOHEADER_HEADER", "")
987
988         self.syms = {}
989         self.const_syms = {}
990         self.defined_syms = []
991         self.missing_syms = []
992         self.named_choices = {}
993         self.choices = []
994         self.menus = []
995         self.comments = []
996
997         for nmy in "n", "m", "y":
998             sym = Symbol()
999             sym.kconfig = self
1000             sym.name = nmy
1001             sym.is_constant = True
1002             sym.orig_type = TRISTATE
1003             sym._cached_tri_val = STR_TO_TRI[nmy]
1004
1005             self.const_syms[nmy] = sym
1006
1007         self.n = self.const_syms["n"]
1008         self.m = self.const_syms["m"]
1009         self.y = self.const_syms["y"]
1010
1011         # Make n/m/y well-formed symbols
1012         for nmy in "n", "m", "y":
1013             sym = self.const_syms[nmy]
1014             sym.rev_dep = sym.weak_rev_dep = sym.direct_dep = self.n
1015
1016         # Maps preprocessor variables names to Variable instances
1017         self.variables = {}
1018
1019         # Predefined preprocessor functions, with min/max number of arguments
1020         self._functions = {
1021             "info":       (_info_fn,       1, 1),
1022             "error-if":   (_error_if_fn,   2, 2),
1023             "filename":   (_filename_fn,   0, 0),
1024             "lineno":     (_lineno_fn,     0, 0),
1025             "shell":      (_shell_fn,      1, 1),
1026             "warning-if": (_warning_if_fn, 2, 2),
1027         }
1028
1029         # Add any user-defined preprocessor functions
1030         try:
1031             self._functions.update(
1032                 importlib.import_module(
1033                     os.getenv("KCONFIG_FUNCTIONS", "kconfigfunctions")
1034                 ).functions)
1035         except ImportError:
1036             pass
1037
1038         # This determines whether previously unseen symbols are registered.
1039         # They shouldn't be if we parse expressions after parsing, as part of
1040         # Kconfig.eval_string().
1041         self._parsing_kconfigs = True
1042
1043         self.modules = self._lookup_sym("MODULES")
1044         self.defconfig_list = None
1045
1046         self.top_node = MenuNode()
1047         self.top_node.kconfig = self
1048         self.top_node.item = MENU
1049         self.top_node.is_menuconfig = True
1050         self.top_node.visibility = self.y
1051         self.top_node.prompt = ("Main menu", self.y)
1052         self.top_node.parent = None
1053         self.top_node.dep = self.y
1054         self.top_node.filename = filename
1055         self.top_node.linenr = 1
1056         self.top_node.include_path = ()
1057
1058         # Parse the Kconfig files
1059
1060         # Not used internally. Provided as a convenience.
1061         self.kconfig_filenames = [filename]
1062         self.env_vars = set()
1063
1064         # Keeps track of the location in the parent Kconfig files. Kconfig
1065         # files usually source other Kconfig files. See _enter_file().
1066         self._filestack = []
1067         self._include_path = ()
1068
1069         # The current parsing location
1070         self.filename = filename
1071         self.linenr = 0
1072
1073         # Used to avoid retokenizing lines when we discover that they're not
1074         # part of the construct currently being parsed. This is kinda like an
1075         # unget operation.
1076         self._reuse_tokens = False
1077
1078         # Open the top-level Kconfig file. Store the readline() method directly
1079         # as a small optimization.
1080         self._readline = self._open(join(self.srctree, filename), "r").readline
1081
1082         try:
1083             # Parse the Kconfig files. Returns the last node, which we
1084             # terminate with '.next = None'.
1085             self._parse_block(None, self.top_node, self.top_node).next = None
1086             self.top_node.list = self.top_node.next
1087             self.top_node.next = None
1088         except UnicodeDecodeError as e:
1089             _decoding_error(e, self.filename)
1090
1091         # Close the top-level Kconfig file. __self__ fetches the 'file' object
1092         # for the method.
1093         self._readline.__self__.close()
1094
1095         self._parsing_kconfigs = False
1096
1097         # Do various menu tree post-processing
1098         self._finalize_node(self.top_node, self.y)
1099
1100         self.unique_defined_syms = _ordered_unique(self.defined_syms)
1101         self.unique_choices = _ordered_unique(self.choices)
1102
1103         # Do sanity checks. Some of these depend on everything being finalized.
1104         self._check_sym_sanity()
1105         self._check_choice_sanity()
1106
1107         # KCONFIG_STRICT is an older alias for KCONFIG_WARN_UNDEF, supported
1108         # for backwards compatibility
1109         if os.getenv("KCONFIG_WARN_UNDEF") == "y" or \
1110            os.getenv("KCONFIG_STRICT") == "y":
1111
1112             self._check_undef_syms()
1113
1114         # Build Symbol._dependents for all symbols and choices
1115         self._build_dep()
1116
1117         # Check for dependency loops
1118         check_dep_loop_sym = _check_dep_loop_sym  # Micro-optimization
1119         for sym in self.unique_defined_syms:
1120             check_dep_loop_sym(sym, False)
1121
1122         # Add extra dependencies from choices to choice symbols that get
1123         # awkward during dependency loop detection
1124         self._add_choice_deps()
1125
1126     @property
1127     def mainmenu_text(self):
1128         """
1129         See the class documentation.
1130         """
1131         return self.top_node.prompt[0]
1132
1133     @property
1134     def defconfig_filename(self):
1135         """
1136         See the class documentation.
1137         """
1138         if self.defconfig_list:
1139             for filename, cond in self.defconfig_list.defaults:
1140                 if expr_value(cond):
1141                     try:
1142                         with self._open_config(filename.str_value) as f:
1143                             return f.name
1144                     except EnvironmentError:
1145                         continue
1146
1147         return None
1148
1149     def load_config(self, filename=None, replace=True, verbose=None):
1150         """
1151         Loads symbol values from a file in the .config format. Equivalent to
1152         calling Symbol.set_value() to set each of the values.
1153
1154         "# CONFIG_FOO is not set" within a .config file sets the user value of
1155         FOO to n. The C tools work the same way.
1156
1157         For each symbol, the Symbol.user_value attribute holds the value the
1158         symbol was assigned in the .config file (if any). The user value might
1159         differ from Symbol.str/tri_value if there are unsatisfied dependencies.
1160
1161         Calling this function also updates the Kconfig.missing_syms attribute
1162         with a list of all assignments to undefined symbols within the
1163         configuration file. Kconfig.missing_syms is cleared if 'replace' is
1164         True, and appended to otherwise. See the documentation for
1165         Kconfig.missing_syms as well.
1166
1167         See the Kconfig.__init__() docstring for raised exceptions
1168         (OSError/IOError). KconfigError is never raised here.
1169
1170         filename (default: None):
1171           Path to load configuration from (a string). Respects $srctree if set
1172           (see the class documentation).
1173
1174           If 'filename' is None (the default), the configuration file to load
1175           (if any) is calculated automatically, giving the behavior you'd
1176           usually want:
1177
1178             1. If the KCONFIG_CONFIG environment variable is set, it gives the
1179                path to the configuration file to load. Otherwise, ".config" is
1180                used. See standard_config_filename().
1181
1182             2. If the path from (1.) doesn't exist, the configuration file
1183                given by kconf.defconfig_filename is loaded instead, which is
1184                derived from the 'option defconfig_list' symbol.
1185
1186             3. If (1.) and (2.) fail to find a configuration file to load, no
1187                configuration file is loaded, and symbols retain their current
1188                values (e.g., their default values). This is not an error.
1189
1190            See the return value as well.
1191
1192         replace (default: True):
1193           If True, all existing user values will be cleared before loading the
1194           .config. Pass False to merge configurations.
1195
1196         verbose (default: None):
1197           Limited backwards compatibility to prevent crashes. A warning is
1198           printed if anything but None is passed.
1199
1200           Prior to Kconfiglib 12.0.0, this option enabled printing of messages
1201           to stdout when 'filename' was None. A message is (always) returned
1202           now instead, which is more flexible.
1203
1204           Will probably be removed in some future version.
1205
1206         Returns a string with a message saying which file got loaded (or
1207         possibly that no file got loaded, when 'filename' is None). This is
1208         meant to reduce boilerplate in tools, which can do e.g.
1209         print(kconf.load_config()). The returned message distinguishes between
1210         loading (replace == True) and merging (replace == False).
1211         """
1212         if verbose is not None:
1213             _warn_verbose_deprecated("load_config")
1214
1215         msg = None
1216         if filename is None:
1217             filename = standard_config_filename()
1218             if not exists(filename) and \
1219                not exists(join(self.srctree, filename)):
1220                 defconfig = self.defconfig_filename
1221                 if defconfig is None:
1222                     return "Using default symbol values (no '{}')" \
1223                            .format(filename)
1224
1225                 msg = " default configuration '{}' (no '{}')" \
1226                       .format(defconfig, filename)
1227                 filename = defconfig
1228
1229         if not msg:
1230             msg = " configuration '{}'".format(filename)
1231
1232         # Disable the warning about assigning to symbols without prompts. This
1233         # is normal and expected within a .config file.
1234         self._warn_assign_no_prompt = False
1235
1236         # This stub only exists to make sure _warn_assign_no_prompt gets
1237         # reenabled
1238         try:
1239             self._load_config(filename, replace)
1240         except UnicodeDecodeError as e:
1241             _decoding_error(e, filename)
1242         finally:
1243             self._warn_assign_no_prompt = True
1244
1245         return ("Loaded" if replace else "Merged") + msg
1246
1247     def _load_config(self, filename, replace):
1248         with self._open_config(filename) as f:
1249             if replace:
1250                 self.missing_syms = []
1251
1252                 # If we're replacing the configuration, keep track of which
1253                 # symbols and choices got set so that we can unset the rest
1254                 # later. This avoids invalidating everything and is faster.
1255                 # Another benefit is that invalidation must be rock solid for
1256                 # it to work, making it a good test.
1257
1258                 for sym in self.unique_defined_syms:
1259                     sym._was_set = False
1260
1261                 for choice in self.unique_choices:
1262                     choice._was_set = False
1263
1264             # Small optimizations
1265             set_match = self._set_match
1266             unset_match = self._unset_match
1267             get_sym = self.syms.get
1268
1269             for linenr, line in enumerate(f, 1):
1270                 # The C tools ignore trailing whitespace
1271                 line = line.rstrip()
1272
1273                 match = set_match(line)
1274                 if match:
1275                     name, val = match.groups()
1276                     sym = get_sym(name)
1277                     if not sym or not sym.nodes:
1278                         self._undef_assign(name, val, filename, linenr)
1279                         continue
1280
1281                     if sym.orig_type in _BOOL_TRISTATE:
1282                         # The C implementation only checks the first character
1283                         # to the right of '=', for whatever reason
1284                         if not (sym.orig_type is BOOL
1285                                 and val.startswith(("y", "n")) or
1286                                 sym.orig_type is TRISTATE
1287                                 and val.startswith(("y", "m", "n"))):
1288                             self._warn("'{}' is not a valid value for the {} "
1289                                        "symbol {}. Assignment ignored."
1290                                        .format(val, TYPE_TO_STR[sym.orig_type],
1291                                                sym.name_and_loc),
1292                                        filename, linenr)
1293                             continue
1294
1295                         val = val[0]
1296
1297                         if sym.choice and val != "n":
1298                             # During .config loading, we infer the mode of the
1299                             # choice from the kind of values that are assigned
1300                             # to the choice symbols
1301
1302                             prev_mode = sym.choice.user_value
1303                             if prev_mode is not None and \
1304                                TRI_TO_STR[prev_mode] != val:
1305
1306                                 self._warn("both m and y assigned to symbols "
1307                                            "within the same choice",
1308                                            filename, linenr)
1309
1310                             # Set the choice's mode
1311                             sym.choice.set_value(val)
1312
1313                     elif sym.orig_type is STRING:
1314                         match = _conf_string_match(val)
1315                         if not match:
1316                             self._warn("malformed string literal in "
1317                                        "assignment to {}. Assignment ignored."
1318                                        .format(sym.name_and_loc),
1319                                        filename, linenr)
1320                             continue
1321
1322                         val = unescape(match.group(1))
1323
1324                 else:
1325                     match = unset_match(line)
1326                     if not match:
1327                         # Print a warning for lines that match neither
1328                         # set_match() nor unset_match() and that are not blank
1329                         # lines or comments. 'line' has already been
1330                         # rstrip()'d, so blank lines show up as "" here.
1331                         if line and not line.lstrip().startswith("#"):
1332                             self._warn("ignoring malformed line '{}'"
1333                                        .format(line),
1334                                        filename, linenr)
1335
1336                         continue
1337
1338                     name = match.group(1)
1339                     sym = get_sym(name)
1340                     if not sym or not sym.nodes:
1341                         self._undef_assign(name, "n", filename, linenr)
1342                         continue
1343
1344                     if sym.orig_type not in _BOOL_TRISTATE:
1345                         continue
1346
1347                     val = "n"
1348
1349                 # Done parsing the assignment. Set the value.
1350
1351                 if sym._was_set:
1352                     self._assigned_twice(sym, val, filename, linenr)
1353
1354                 sym.set_value(val)
1355
1356         if replace:
1357             # If we're replacing the configuration, unset the symbols that
1358             # didn't get set
1359
1360             for sym in self.unique_defined_syms:
1361                 if not sym._was_set:
1362                     sym.unset_value()
1363
1364             for choice in self.unique_choices:
1365                 if not choice._was_set:
1366                     choice.unset_value()
1367
1368     def _undef_assign(self, name, val, filename, linenr):
1369         # Called for assignments to undefined symbols during .config loading
1370
1371         self.missing_syms.append((name, val))
1372         if self.warn_assign_undef:
1373             self._warn(
1374                 "attempt to assign the value '{}' to the undefined symbol {}"
1375                 .format(val, name), filename, linenr)
1376
1377     def _assigned_twice(self, sym, new_val, filename, linenr):
1378         # Called when a symbol is assigned more than once in a .config file
1379
1380         # Use strings for bool/tristate user values in the warning
1381         if sym.orig_type in _BOOL_TRISTATE:
1382             user_val = TRI_TO_STR[sym.user_value]
1383         else:
1384             user_val = sym.user_value
1385
1386         msg = '{} set more than once. Old value "{}", new value "{}".'.format(
1387             sym.name_and_loc, user_val, new_val)
1388
1389         if user_val == new_val:
1390             if self.warn_assign_redun:
1391                 self._warn(msg, filename, linenr)
1392         elif self.warn_assign_override:
1393             self._warn(msg, filename, linenr)
1394
1395     def load_allconfig(self, filename):
1396         """
1397         Helper for all*config. Loads (merges) the configuration file specified
1398         by KCONFIG_ALLCONFIG, if any. See Documentation/kbuild/kconfig.txt in
1399         the Linux kernel.
1400
1401         Disables warnings for duplicated assignments within configuration files
1402         for the duration of the call
1403         (kconf.warn_assign_override/warn_assign_redun = False), and restores
1404         the previous warning settings at the end. The KCONFIG_ALLCONFIG
1405         configuration file is expected to override symbols.
1406
1407         Exits with sys.exit() (which raises a SystemExit exception) and prints
1408         an error to stderr if KCONFIG_ALLCONFIG is set but the configuration
1409         file can't be opened.
1410
1411         filename:
1412           Command-specific configuration filename - "allyes.config",
1413           "allno.config", etc.
1414         """
1415         load_allconfig(self, filename)
1416
1417     def write_autoconf(self, filename=None, header=None):
1418         r"""
1419         Writes out symbol values as a C header file, matching the format used
1420         by include/generated/autoconf.h in the kernel.
1421
1422         The ordering of the #defines matches the one generated by
1423         write_config(). The order in the C implementation depends on the hash
1424         table implementation as of writing, and so won't match.
1425
1426         If 'filename' exists and its contents is identical to what would get
1427         written out, it is left untouched. This avoids updating file metadata
1428         like the modification time and possibly triggering redundant work in
1429         build tools.
1430
1431         filename (default: None):
1432           Path to write header to.
1433
1434           If None (the default), the path in the environment variable
1435           KCONFIG_AUTOHEADER is used if set, and "include/generated/autoconf.h"
1436           otherwise. This is compatible with the C tools.
1437
1438         header (default: None):
1439           Text inserted verbatim at the beginning of the file. You would
1440           usually want it enclosed in '/* */' to make it a C comment, and
1441           include a trailing newline.
1442
1443           If None (the default), the value of the environment variable
1444           KCONFIG_AUTOHEADER_HEADER had when the Kconfig instance was created
1445           will be used if it was set, and no header otherwise. See the
1446           Kconfig.header_header attribute.
1447
1448         Returns a string with a message saying that the header got saved, or
1449         that there were no changes to it. This is meant to reduce boilerplate
1450         in tools, which can do e.g. print(kconf.write_autoconf()).
1451         """
1452         if filename is None:
1453             filename = os.getenv("KCONFIG_AUTOHEADER",
1454                                  "include/generated/autoconf.h")
1455
1456         if self._write_if_changed(filename, self._autoconf_contents(header)):
1457             return "Kconfig header saved to '{}'".format(filename)
1458         return "No change to Kconfig header in '{}'".format(filename)
1459
1460     def _autoconf_contents(self, header):
1461         # write_autoconf() helper. Returns the contents to write as a string,
1462         # with 'header' or KCONFIG_AUTOHEADER_HEADER at the beginning.
1463
1464         if header is None:
1465             header = self.header_header
1466
1467         chunks = [header]  # "".join()ed later
1468         add = chunks.append
1469
1470         for sym in self.unique_defined_syms:
1471             # _write_to_conf is determined when the value is calculated. This
1472             # is a hidden function call due to property magic.
1473             #
1474             # Note: In client code, you can check if sym.config_string is empty
1475             # instead, to avoid accessing the internal _write_to_conf variable
1476             # (though it's likely to keep working).
1477             val = sym.str_value
1478             if not sym._write_to_conf:
1479                 continue
1480
1481             if sym.orig_type in _BOOL_TRISTATE:
1482                 if val == "y":
1483                     add("#define {}{} 1\n"
1484                         .format(self.config_prefix, sym.name))
1485                 elif val == "m":
1486                     add("#define {}{}_MODULE 1\n"
1487                         .format(self.config_prefix, sym.name))
1488
1489             elif sym.orig_type is STRING:
1490                 add('#define {}{} "{}"\n'
1491                     .format(self.config_prefix, sym.name, escape(val)))
1492
1493             else:  # sym.orig_type in _INT_HEX:
1494                 if sym.orig_type is HEX and \
1495                    not val.startswith(("0x", "0X")):
1496                     val = "0x" + val
1497
1498                 add("#define {}{} {}\n"
1499                     .format(self.config_prefix, sym.name, val))
1500
1501         return "".join(chunks)
1502
1503     def write_config(self, filename=None, header=None, save_old=True,
1504                      verbose=None):
1505         r"""
1506         Writes out symbol values in the .config format. The format matches the
1507         C implementation, including ordering.
1508
1509         Symbols appear in the same order in generated .config files as they do
1510         in the Kconfig files. For symbols defined in multiple locations, a
1511         single assignment is written out corresponding to the first location
1512         where the symbol is defined.
1513
1514         See the 'Intro to symbol values' section in the module docstring to
1515         understand which symbols get written out.
1516
1517         If 'filename' exists and its contents is identical to what would get
1518         written out, it is left untouched. This avoids updating file metadata
1519         like the modification time and possibly triggering redundant work in
1520         build tools.
1521
1522         See the Kconfig.__init__() docstring for raised exceptions
1523         (OSError/IOError). KconfigError is never raised here.
1524
1525         filename (default: None):
1526           Path to write configuration to (a string).
1527
1528           If None (the default), the path in the environment variable
1529           KCONFIG_CONFIG is used if set, and ".config" otherwise. See
1530           standard_config_filename().
1531
1532         header (default: None):
1533           Text inserted verbatim at the beginning of the file. You would
1534           usually want each line to start with '#' to make it a comment, and
1535           include a trailing newline.
1536
1537           if None (the default), the value of the environment variable
1538           KCONFIG_CONFIG_HEADER had when the Kconfig instance was created will
1539           be used if it was set, and no header otherwise. See the
1540           Kconfig.config_header attribute.
1541
1542         save_old (default: True):
1543           If True and <filename> already exists, a copy of it will be saved to
1544           <filename>.old in the same directory before the new configuration is
1545           written.
1546
1547           Errors are silently ignored if <filename>.old cannot be written (e.g.
1548           due to being a directory, or <filename> being something like
1549           /dev/null).
1550
1551         verbose (default: None):
1552           Limited backwards compatibility to prevent crashes. A warning is
1553           printed if anything but None is passed.
1554
1555           Prior to Kconfiglib 12.0.0, this option enabled printing of messages
1556           to stdout when 'filename' was None. A message is (always) returned
1557           now instead, which is more flexible.
1558
1559           Will probably be removed in some future version.
1560
1561         Returns a string with a message saying which file got saved. This is
1562         meant to reduce boilerplate in tools, which can do e.g.
1563         print(kconf.write_config()).
1564         """
1565         if verbose is not None:
1566             _warn_verbose_deprecated("write_config")
1567
1568         if filename is None:
1569             filename = standard_config_filename()
1570
1571         contents = self._config_contents(header)
1572         if self._contents_eq(filename, contents):
1573             return "No change to configuration in '{}'".format(filename)
1574
1575         if save_old:
1576             _save_old(filename)
1577
1578         with self._open(filename, "w") as f:
1579             f.write(contents)
1580
1581         return "Configuration saved to '{}'".format(filename)
1582
1583     def _config_contents(self, header):
1584         # write_config() helper. Returns the contents to write as a string,
1585         # with 'header' or KCONFIG_CONFIG_HEADER at the beginning.
1586         #
1587         # More memory friendly would be to 'yield' the strings and
1588         # "".join(_config_contents()), but it was a bit slower on my system.
1589
1590         # node_iter() was used here before commit 3aea9f7 ("Add '# end of
1591         # <menu>' after menus in .config"). Those comments get tricky to
1592         # implement with it.
1593
1594         for sym in self.unique_defined_syms:
1595             sym._visited = False
1596
1597         if header is None:
1598             header = self.config_header
1599
1600         chunks = [header]  # "".join()ed later
1601         add = chunks.append
1602
1603         # Did we just print an '# end of ...' comment?
1604         after_end_comment = False
1605
1606         node = self.top_node
1607         while 1:
1608             # Jump to the next node with an iterative tree walk
1609             if node.list:
1610                 node = node.list
1611             elif node.next:
1612                 node = node.next
1613             else:
1614                 while node.parent:
1615                     node = node.parent
1616
1617                     # Add a comment when leaving visible menus
1618                     if node.item is MENU and expr_value(node.dep) and \
1619                        expr_value(node.visibility) and \
1620                        node is not self.top_node:
1621                         add("# end of {}\n".format(node.prompt[0]))
1622                         after_end_comment = True
1623
1624                     if node.next:
1625                         node = node.next
1626                         break
1627                 else:
1628                     # No more nodes
1629                     return "".join(chunks)
1630
1631             # Generate configuration output for the node
1632
1633             item = node.item
1634
1635             if item.__class__ is Symbol:
1636                 if item._visited:
1637                     continue
1638                 item._visited = True
1639
1640                 conf_string = item.config_string
1641                 if not conf_string:
1642                     continue
1643
1644                 if after_end_comment:
1645                     # Add a blank line before the first symbol printed after an
1646                     # '# end of ...' comment
1647                     after_end_comment = False
1648                     add("\n")
1649                 add(conf_string)
1650
1651             elif expr_value(node.dep) and \
1652                  ((item is MENU and expr_value(node.visibility)) or
1653                   item is COMMENT):
1654
1655                 add("\n#\n# {}\n#\n".format(node.prompt[0]))
1656                 after_end_comment = False
1657
1658     def write_min_config(self, filename, header=None):
1659         """
1660         Writes out a "minimal" configuration file, omitting symbols whose value
1661         matches their default value. The format matches the one produced by
1662         'make savedefconfig'.
1663
1664         The resulting configuration file is incomplete, but a complete
1665         configuration can be derived from it by loading it. Minimal
1666         configuration files can serve as a more manageable configuration format
1667         compared to a "full" .config file, especially when configurations files
1668         are merged or edited by hand.
1669
1670         See the Kconfig.__init__() docstring for raised exceptions
1671         (OSError/IOError). KconfigError is never raised here.
1672
1673         filename:
1674           Path to write minimal configuration to.
1675
1676         header (default: None):
1677           Text inserted verbatim at the beginning of the file. You would
1678           usually want each line to start with '#' to make it a comment, and
1679           include a final terminating newline.
1680
1681           if None (the default), the value of the environment variable
1682           KCONFIG_CONFIG_HEADER had when the Kconfig instance was created will
1683           be used if it was set, and no header otherwise. See the
1684           Kconfig.config_header attribute.
1685
1686         Returns a string with a message saying the minimal configuration got
1687         saved, or that there were no changes to it. This is meant to reduce
1688         boilerplate in tools, which can do e.g.
1689         print(kconf.write_min_config()).
1690         """
1691         if self._write_if_changed(filename, self._min_config_contents(header)):
1692             return "Minimal configuration saved to '{}'".format(filename)
1693         return "No change to minimal configuration in '{}'".format(filename)
1694
1695     def _min_config_contents(self, header):
1696         # write_min_config() helper. Returns the contents to write as a string,
1697         # with 'header' or KCONFIG_CONFIG_HEADER at the beginning.
1698
1699         if header is None:
1700             header = self.config_header
1701
1702         chunks = [header]  # "".join()ed later
1703         add = chunks.append
1704
1705         for sym in self.unique_defined_syms:
1706             # Skip symbols that cannot be changed. Only check
1707             # non-choice symbols, as selects don't affect choice
1708             # symbols.
1709             if not sym.choice and \
1710                sym.visibility <= expr_value(sym.rev_dep):
1711                 continue
1712
1713             # Skip symbols whose value matches their default
1714             if sym.str_value == sym._str_default():
1715                 continue
1716
1717             # Skip symbols that would be selected by default in a
1718             # choice, unless the choice is optional or the symbol type
1719             # isn't bool (it might be possible to set the choice mode
1720             # to n or the symbol to m in those cases).
1721             if sym.choice and \
1722                not sym.choice.is_optional and \
1723                sym.choice._selection_from_defaults() is sym and \
1724                sym.orig_type is BOOL and \
1725                sym.tri_value == 2:
1726                 continue
1727
1728             add(sym.config_string)
1729
1730         return "".join(chunks)
1731
1732     def sync_deps(self, path):
1733         """
1734         Creates or updates a directory structure that can be used to avoid
1735         doing a full rebuild whenever the configuration is changed, mirroring
1736         include/config/ in the kernel.
1737
1738         This function is intended to be called during each build, before
1739         compiling source files that depend on configuration symbols.
1740
1741         See the Kconfig.__init__() docstring for raised exceptions
1742         (OSError/IOError). KconfigError is never raised here.
1743
1744         path:
1745           Path to directory
1746
1747         sync_deps(path) does the following:
1748
1749           1. If the directory <path> does not exist, it is created.
1750
1751           2. If <path>/auto.conf exists, old symbol values are loaded from it,
1752              which are then compared against the current symbol values. If a
1753              symbol has changed value (would generate different output in
1754              autoconf.h compared to before), the change is signaled by
1755              touch'ing a file corresponding to the symbol.
1756
1757              The first time sync_deps() is run on a directory, <path>/auto.conf
1758              won't exist, and no old symbol values will be available. This
1759              logically has the same effect as updating the entire
1760              configuration.
1761
1762              The path to a symbol's file is calculated from the symbol's name
1763              by replacing all '_' with '/' and appending '.h'. For example, the
1764              symbol FOO_BAR_BAZ gets the file <path>/foo/bar/baz.h, and FOO
1765              gets the file <path>/foo.h.
1766
1767              This scheme matches the C tools. The point is to avoid having a
1768              single directory with a huge number of files, which the underlying
1769              filesystem might not handle well.
1770
1771           3. A new auto.conf with the current symbol values is written, to keep
1772              track of them for the next build.
1773
1774              If auto.conf exists and its contents is identical to what would
1775              get written out, it is left untouched. This avoids updating file
1776              metadata like the modification time and possibly triggering
1777              redundant work in build tools.
1778
1779
1780         The last piece of the puzzle is knowing what symbols each source file
1781         depends on. Knowing that, dependencies can be added from source files
1782         to the files corresponding to the symbols they depends on. The source
1783         file will then get recompiled (only) when the symbol value changes
1784         (provided sync_deps() is run first during each build).
1785
1786         The tool in the kernel that extracts symbol dependencies from source
1787         files is scripts/basic/fixdep.c. Missing symbol files also correspond
1788         to "not changed", which fixdep deals with by using the $(wildcard) Make
1789         function when adding symbol prerequisites to source files.
1790
1791         In case you need a different scheme for your project, the sync_deps()
1792         implementation can be used as a template.
1793         """
1794         if not exists(path):
1795             os.mkdir(path, 0o755)
1796
1797         # Load old values from auto.conf, if any
1798         self._load_old_vals(path)
1799
1800         for sym in self.unique_defined_syms:
1801             # _write_to_conf is determined when the value is calculated. This
1802             # is a hidden function call due to property magic.
1803             #
1804             # Note: In client code, you can check if sym.config_string is empty
1805             # instead, to avoid accessing the internal _write_to_conf variable
1806             # (though it's likely to keep working).
1807             val = sym.str_value
1808
1809             # n tristate values do not get written to auto.conf and autoconf.h,
1810             # making a missing symbol logically equivalent to n
1811
1812             if sym._write_to_conf:
1813                 if sym._old_val is None and \
1814                    sym.orig_type in _BOOL_TRISTATE and \
1815                    val == "n":
1816                     # No old value (the symbol was missing or n), new value n.
1817                     # No change.
1818                     continue
1819
1820                 if val == sym._old_val:
1821                     # New value matches old. No change.
1822                     continue
1823
1824             elif sym._old_val is None:
1825                 # The symbol wouldn't appear in autoconf.h (because
1826                 # _write_to_conf is false), and it wouldn't have appeared in
1827                 # autoconf.h previously either (because it didn't appear in
1828                 # auto.conf). No change.
1829                 continue
1830
1831             # 'sym' has a new value. Flag it.
1832             _touch_dep_file(path, sym.name)
1833
1834         # Remember the current values as the "new old" values.
1835         #
1836         # This call could go anywhere after the call to _load_old_vals(), but
1837         # putting it last means _sync_deps() can be safely rerun if it fails
1838         # before this point.
1839         self._write_old_vals(path)
1840
1841     def _load_old_vals(self, path):
1842         # Loads old symbol values from auto.conf into a dedicated
1843         # Symbol._old_val field. Mirrors load_config().
1844         #
1845         # The extra field could be avoided with some trickery involving dumping
1846         # symbol values and restoring them later, but this is simpler and
1847         # faster. The C tools also use a dedicated field for this purpose.
1848
1849         for sym in self.unique_defined_syms:
1850             sym._old_val = None
1851
1852         try:
1853             auto_conf = self._open(join(path, "auto.conf"), "r")
1854         except EnvironmentError as e:
1855             if e.errno == errno.ENOENT:
1856                 # No old values
1857                 return
1858             raise
1859
1860         with auto_conf as f:
1861             for line in f:
1862                 match = self._set_match(line)
1863                 if not match:
1864                     # We only expect CONFIG_FOO=... (and possibly a header
1865                     # comment) in auto.conf
1866                     continue
1867
1868                 name, val = match.groups()
1869                 if name in self.syms:
1870                     sym = self.syms[name]
1871
1872                     if sym.orig_type is STRING:
1873                         match = _conf_string_match(val)
1874                         if not match:
1875                             continue
1876                         val = unescape(match.group(1))
1877
1878                     self.syms[name]._old_val = val
1879                 else:
1880                     # Flag that the symbol no longer exists, in
1881                     # case something still depends on it
1882                     _touch_dep_file(path, name)
1883
1884     def _write_old_vals(self, path):
1885         # Helper for writing auto.conf. Basically just a simplified
1886         # write_config() that doesn't write any comments (including
1887         # '# CONFIG_FOO is not set' comments). The format matches the C
1888         # implementation, though the ordering is arbitrary there (depends on
1889         # the hash table implementation).
1890         #
1891         # A separate helper function is neater than complicating write_config()
1892         # by passing a flag to it, plus we only need to look at symbols here.
1893
1894         self._write_if_changed(
1895             os.path.join(path, "auto.conf"),
1896             self._old_vals_contents())
1897
1898     def _old_vals_contents(self):
1899         # _write_old_vals() helper. Returns the contents to write as a string.
1900
1901         # Temporary list instead of generator makes this a bit faster
1902         return "".join([
1903             sym.config_string for sym in self.unique_defined_syms
1904                 if not (sym.orig_type in _BOOL_TRISTATE and not sym.tri_value)
1905         ])
1906
1907     def node_iter(self, unique_syms=False):
1908         """
1909         Returns a generator for iterating through all MenuNode's in the Kconfig
1910         tree. The iteration is done in Kconfig definition order (each node is
1911         visited before its children, and the children of a node are visited
1912         before the next node).
1913
1914         The Kconfig.top_node menu node is skipped. It contains an implicit menu
1915         that holds the top-level items.
1916
1917         As an example, the following code will produce a list equal to
1918         Kconfig.defined_syms:
1919
1920           defined_syms = [node.item for node in kconf.node_iter()
1921                           if isinstance(node.item, Symbol)]
1922
1923         unique_syms (default: False):
1924           If True, only the first MenuNode will be included for symbols defined
1925           in multiple locations.
1926
1927           Using kconf.node_iter(True) in the example above would give a list
1928           equal to unique_defined_syms.
1929         """
1930         if unique_syms:
1931             for sym in self.unique_defined_syms:
1932                 sym._visited = False
1933
1934         node = self.top_node
1935         while 1:
1936             # Jump to the next node with an iterative tree walk
1937             if node.list:
1938                 node = node.list
1939             elif node.next:
1940                 node = node.next
1941             else:
1942                 while node.parent:
1943                     node = node.parent
1944                     if node.next:
1945                         node = node.next
1946                         break
1947                 else:
1948                     # No more nodes
1949                     return
1950
1951             if unique_syms and node.item.__class__ is Symbol:
1952                 if node.item._visited:
1953                     continue
1954                 node.item._visited = True
1955
1956             yield node
1957
1958     def eval_string(self, s):
1959         """
1960         Returns the tristate value of the expression 's', represented as 0, 1,
1961         and 2 for n, m, and y, respectively. Raises KconfigError on syntax
1962         errors. Warns if undefined symbols are referenced.
1963
1964         As an example, if FOO and BAR are tristate symbols at least one of
1965         which has the value y, then eval_string("y && (FOO || BAR)") returns
1966         2 (y).
1967
1968         To get the string value of non-bool/tristate symbols, use
1969         Symbol.str_value. eval_string() always returns a tristate value, and
1970         all non-bool/tristate symbols have the tristate value 0 (n).
1971
1972         The expression parsing is consistent with how parsing works for
1973         conditional ('if ...') expressions in the configuration, and matches
1974         the C implementation. m is rewritten to 'm && MODULES', so
1975         eval_string("m") will return 0 (n) unless modules are enabled.
1976         """
1977         # The parser is optimized to be fast when parsing Kconfig files (where
1978         # an expression can never appear at the beginning of a line). We have
1979         # to monkey-patch things a bit here to reuse it.
1980
1981         self.filename = None
1982
1983         self._tokens = self._tokenize("if " + s)
1984         # Strip "if " to avoid giving confusing error messages
1985         self._line = s
1986         self._tokens_i = 1  # Skip the 'if' token
1987
1988         return expr_value(self._expect_expr_and_eol())
1989
1990     def unset_values(self):
1991         """
1992         Removes any user values from all symbols, as if Kconfig.load_config()
1993         or Symbol.set_value() had never been called.
1994         """
1995         self._warn_assign_no_prompt = False
1996         try:
1997             # set_value() already rejects undefined symbols, and they don't
1998             # need to be invalidated (because their value never changes), so we
1999             # can just iterate over defined symbols
2000             for sym in self.unique_defined_syms:
2001                 sym.unset_value()
2002
2003             for choice in self.unique_choices:
2004                 choice.unset_value()
2005         finally:
2006             self._warn_assign_no_prompt = True
2007
2008     def enable_warnings(self):
2009         """
2010         Do 'Kconfig.warn = True' instead. Maintained for backwards
2011         compatibility.
2012         """
2013         self.warn = True
2014
2015     def disable_warnings(self):
2016         """
2017         Do 'Kconfig.warn = False' instead. Maintained for backwards
2018         compatibility.
2019         """
2020         self.warn = False
2021
2022     def enable_stderr_warnings(self):
2023         """
2024         Do 'Kconfig.warn_to_stderr = True' instead. Maintained for backwards
2025         compatibility.
2026         """
2027         self.warn_to_stderr = True
2028
2029     def disable_stderr_warnings(self):
2030         """
2031         Do 'Kconfig.warn_to_stderr = False' instead. Maintained for backwards
2032         compatibility.
2033         """
2034         self.warn_to_stderr = False
2035
2036     def enable_undef_warnings(self):
2037         """
2038         Do 'Kconfig.warn_assign_undef = True' instead. Maintained for backwards
2039         compatibility.
2040         """
2041         self.warn_assign_undef = True
2042
2043     def disable_undef_warnings(self):
2044         """
2045         Do 'Kconfig.warn_assign_undef = False' instead. Maintained for
2046         backwards compatibility.
2047         """
2048         self.warn_assign_undef = False
2049
2050     def enable_override_warnings(self):
2051         """
2052         Do 'Kconfig.warn_assign_override = True' instead. Maintained for
2053         backwards compatibility.
2054         """
2055         self.warn_assign_override = True
2056
2057     def disable_override_warnings(self):
2058         """
2059         Do 'Kconfig.warn_assign_override = False' instead. Maintained for
2060         backwards compatibility.
2061         """
2062         self.warn_assign_override = False
2063
2064     def enable_redun_warnings(self):
2065         """
2066         Do 'Kconfig.warn_assign_redun = True' instead. Maintained for backwards
2067         compatibility.
2068         """
2069         self.warn_assign_redun = True
2070
2071     def disable_redun_warnings(self):
2072         """
2073         Do 'Kconfig.warn_assign_redun = False' instead. Maintained for
2074         backwards compatibility.
2075         """
2076         self.warn_assign_redun = False
2077
2078     def __repr__(self):
2079         """
2080         Returns a string with information about the Kconfig object when it is
2081         evaluated on e.g. the interactive Python prompt.
2082         """
2083         def status(flag):
2084             return "enabled" if flag else "disabled"
2085
2086         return "<{}>".format(", ".join((
2087             "configuration with {} symbols".format(len(self.syms)),
2088             'main menu prompt "{}"'.format(self.mainmenu_text),
2089             "srctree is current directory" if not self.srctree else
2090                 'srctree "{}"'.format(self.srctree),
2091             'config symbol prefix "{}"'.format(self.config_prefix),
2092             "warnings " + status(self.warn),
2093             "printing of warnings to stderr " + status(self.warn_to_stderr),
2094             "undef. symbol assignment warnings " +
2095                 status(self.warn_assign_undef),
2096             "overriding symbol assignment warnings " +
2097                 status(self.warn_assign_override),
2098             "redundant symbol assignment warnings " +
2099                 status(self.warn_assign_redun)
2100         )))
2101
2102     #
2103     # Private methods
2104     #
2105
2106
2107     #
2108     # File reading
2109     #
2110
2111     def _open_config(self, filename):
2112         # Opens a .config file. First tries to open 'filename', then
2113         # '$srctree/filename' if $srctree was set when the configuration was
2114         # loaded.
2115
2116         try:
2117             return self._open(filename, "r")
2118         except EnvironmentError as e:
2119             # This will try opening the same file twice if $srctree is unset,
2120             # but it's not a big deal
2121             try:
2122                 return self._open(join(self.srctree, filename), "r")
2123             except EnvironmentError as e2:
2124                 # This is needed for Python 3, because e2 is deleted after
2125                 # the try block:
2126                 #
2127                 # https://docs.python.org/3/reference/compound_stmts.html#the-try-statement
2128                 e = e2
2129
2130             raise _KconfigIOError(
2131                 e, "Could not open '{}' ({}: {}). Check that the $srctree "
2132                    "environment variable ({}) is set correctly."
2133                    .format(filename, errno.errorcode[e.errno], e.strerror,
2134                            "set to '{}'".format(self.srctree) if self.srctree
2135                                else "unset or blank"))
2136
2137     def _enter_file(self, filename):
2138         # Jumps to the beginning of a sourced Kconfig file, saving the previous
2139         # position and file object.
2140         #
2141         # filename:
2142         #   Absolute path to file
2143
2144         # Path relative to $srctree, stored in e.g. self.filename (which makes
2145         # it indirectly show up in MenuNode.filename). Equals 'filename' for
2146         # absolute paths passed to 'source'.
2147         if filename.startswith(self._srctree_prefix):
2148             # Relative path (or a redundant absolute path to within $srctree,
2149             # but it's probably fine to reduce those too)
2150             rel_filename = filename[len(self._srctree_prefix):]
2151         else:
2152             # Absolute path
2153             rel_filename = filename
2154
2155         self.kconfig_filenames.append(rel_filename)
2156
2157         # The parent Kconfig files are represented as a list of
2158         # (<include path>, <Python 'file' object for Kconfig file>) tuples.
2159         #
2160         # <include path> is immutable and holds a *tuple* of
2161         # (<filename>, <linenr>) tuples, giving the locations of the 'source'
2162         # statements in the parent Kconfig files. The current include path is
2163         # also available in Kconfig._include_path.
2164         #
2165         # The point of this redundant setup is to allow Kconfig._include_path
2166         # to be assigned directly to MenuNode.include_path without having to
2167         # copy it, sharing it wherever possible.
2168
2169         # Save include path and 'file' object (via its 'readline' function)
2170         # before entering the file
2171         self._filestack.append((self._include_path, self._readline))
2172
2173         # _include_path is a tuple, so this rebinds the variable instead of
2174         # doing in-place modification
2175         self._include_path += ((self.filename, self.linenr),)
2176
2177         # Check for recursive 'source'
2178         for name, _ in self._include_path:
2179             if name == rel_filename:
2180                 raise KconfigError(
2181                     "\n{}:{}: recursive 'source' of '{}' detected. Check that "
2182                     "environment variables are set correctly.\n"
2183                     "Include path:\n{}"
2184                     .format(self.filename, self.linenr, rel_filename,
2185                             "\n".join("{}:{}".format(name, linenr)
2186                                       for name, linenr in self._include_path)))
2187
2188         try:
2189             self._readline = self._open(filename, "r").readline
2190         except EnvironmentError as e:
2191             # We already know that the file exists
2192             raise _KconfigIOError(
2193                 e, "{}:{}: Could not open '{}' (in '{}') ({}: {})"
2194                    .format(self.filename, self.linenr, filename,
2195                            self._line.strip(),
2196                            errno.errorcode[e.errno], e.strerror))
2197
2198         self.filename = rel_filename
2199         self.linenr = 0
2200
2201     def _leave_file(self):
2202         # Returns from a Kconfig file to the file that sourced it. See
2203         # _enter_file().
2204
2205         # Restore location from parent Kconfig file
2206         self.filename, self.linenr = self._include_path[-1]
2207         # Restore include path and 'file' object
2208         self._readline.__self__.close()  # __self__ fetches the 'file' object
2209         self._include_path, self._readline = self._filestack.pop()
2210
2211     def _next_line(self):
2212         # Fetches and tokenizes the next line from the current Kconfig file.
2213         # Returns False at EOF and True otherwise.
2214
2215         # We might already have tokens from parsing a line and discovering that
2216         # it's part of a different construct
2217         if self._reuse_tokens:
2218             self._reuse_tokens = False
2219             # self._tokens_i is known to be 1 here, because _parse_props()
2220             # leaves it like that when it can't recognize a line (or parses a
2221             # help text)
2222             return True
2223
2224         # readline() returns '' over and over at EOF, which we rely on for help
2225         # texts at the end of files (see _line_after_help())
2226         line = self._readline()
2227         if not line:
2228             return False
2229         self.linenr += 1
2230
2231         # Handle line joining
2232         while line.endswith("\\\n"):
2233             line = line[:-2] + self._readline()
2234             self.linenr += 1
2235
2236         self._tokens = self._tokenize(line)
2237         # Initialize to 1 instead of 0 to factor out code from _parse_block()
2238         # and _parse_props(). They immediately fetch self._tokens[0].
2239         self._tokens_i = 1
2240
2241         return True
2242
2243     def _line_after_help(self, line):
2244         # Tokenizes a line after a help text. This case is special in that the
2245         # line has already been fetched (to discover that it isn't part of the
2246         # help text).
2247         #
2248         # An earlier version used a _saved_line variable instead that was
2249         # checked in _next_line(). This special-casing gets rid of it and makes
2250         # _reuse_tokens alone sufficient to handle unget.
2251
2252         # Handle line joining
2253         while line.endswith("\\\n"):
2254             line = line[:-2] + self._readline()
2255             self.linenr += 1
2256
2257         self._tokens = self._tokenize(line)
2258         self._reuse_tokens = True
2259
2260     def _write_if_changed(self, filename, contents):
2261         # Writes 'contents' into 'filename', but only if it differs from the
2262         # current contents of the file.
2263         #
2264         # Another variant would be write a temporary file on the same
2265         # filesystem, compare the files, and rename() the temporary file if it
2266         # differs, but it breaks stuff like write_config("/dev/null"), which is
2267         # used out there to force evaluation-related warnings to be generated.
2268         # This simple version is pretty failsafe and portable.
2269         #
2270         # Returns True if the file has changed and is updated, and False
2271         # otherwise.
2272
2273         if self._contents_eq(filename, contents):
2274             return False
2275         with self._open(filename, "w") as f:
2276             f.write(contents)
2277         return True
2278
2279     def _contents_eq(self, filename, contents):
2280         # Returns True if the contents of 'filename' is 'contents' (a string),
2281         # and False otherwise (including if 'filename' can't be opened/read)
2282
2283         try:
2284             with self._open(filename, "r") as f:
2285                 # Robust re. things like encoding and line endings (mmap()
2286                 # trickery isn't)
2287                 return f.read(len(contents) + 1) == contents
2288         except EnvironmentError:
2289             # If the error here would prevent writing the file as well, we'll
2290             # notice it later
2291             return False
2292
2293     #
2294     # Tokenization
2295     #
2296
2297     def _lookup_sym(self, name):
2298         # Fetches the symbol 'name' from the symbol table, creating and
2299         # registering it if it does not exist. If '_parsing_kconfigs' is False,
2300         # it means we're in eval_string(), and new symbols won't be registered.
2301
2302         if name in self.syms:
2303             return self.syms[name]
2304
2305         sym = Symbol()
2306         sym.kconfig = self
2307         sym.name = name
2308         sym.is_constant = False
2309         sym.rev_dep = sym.weak_rev_dep = sym.direct_dep = self.n
2310
2311         if self._parsing_kconfigs:
2312             self.syms[name] = sym
2313         else:
2314             self._warn("no symbol {} in configuration".format(name))
2315
2316         return sym
2317
2318     def _lookup_const_sym(self, name):
2319         # Like _lookup_sym(), for constant (quoted) symbols
2320
2321         if name in self.const_syms:
2322             return self.const_syms[name]
2323
2324         sym = Symbol()
2325         sym.kconfig = self
2326         sym.name = name
2327         sym.is_constant = True
2328         sym.rev_dep = sym.weak_rev_dep = sym.direct_dep = self.n
2329
2330         if self._parsing_kconfigs:
2331             self.const_syms[name] = sym
2332
2333         return sym
2334
2335     def _tokenize(self, s):
2336         # Parses 's', returning a None-terminated list of tokens. Registers any
2337         # new symbols encountered with _lookup(_const)_sym().
2338         #
2339         # Tries to be reasonably speedy by processing chunks of text via
2340         # regexes and string operations where possible. This is the biggest
2341         # hotspot during parsing.
2342         #
2343         # It might be possible to rewrite this to 'yield' tokens instead,
2344         # working across multiple lines. Lookback and compatibility with old
2345         # janky versions of the C tools complicate things though.
2346
2347         self._line = s  # Used for error reporting
2348
2349         # Initial token on the line
2350         match = _command_match(s)
2351         if not match:
2352             if s.isspace() or s.lstrip().startswith("#"):
2353                 return (None,)
2354             self._parse_error("unknown token at start of line")
2355
2356         # Tricky implementation detail: While parsing a token, 'token' refers
2357         # to the previous token. See _STRING_LEX for why this is needed.
2358         token = _get_keyword(match.group(1))
2359         if not token:
2360             # Backwards compatibility with old versions of the C tools, which
2361             # (accidentally) accepted stuff like "--help--" and "-help---".
2362             # This was fixed in the C tools by commit c2264564 ("kconfig: warn
2363             # of unhandled characters in Kconfig commands"), committed in July
2364             # 2015, but it seems people still run Kconfiglib on older kernels.
2365             if s.strip(" \t\n-") == "help":
2366                 return (_T_HELP, None)
2367
2368             # If the first token is not a keyword (and not a weird help token),
2369             # we have a preprocessor variable assignment (or a bare macro on a
2370             # line)
2371             self._parse_assignment(s)
2372             return (None,)
2373
2374         tokens = [token]
2375         # The current index in the string being tokenized
2376         i = match.end()
2377
2378         # Main tokenization loop (for tokens past the first one)
2379         while i < len(s):
2380             # Test for an identifier/keyword first. This is the most common
2381             # case.
2382             match = _id_keyword_match(s, i)
2383             if match:
2384                 # We have an identifier or keyword
2385
2386                 # Check what it is. lookup_sym() will take care of allocating
2387                 # new symbols for us the first time we see them. Note that
2388                 # 'token' still refers to the previous token.
2389
2390                 name = match.group(1)
2391                 keyword = _get_keyword(name)
2392                 if keyword:
2393                     # It's a keyword
2394                     token = keyword
2395                     # Jump past it
2396                     i = match.end()
2397
2398                 elif token not in _STRING_LEX:
2399                     # It's a non-const symbol, except we translate n, m, and y
2400                     # into the corresponding constant symbols, like the C
2401                     # implementation
2402
2403                     if "$" in name:
2404                         # Macro expansion within symbol name
2405                         name, s, i = self._expand_name(s, i)
2406                     else:
2407                         i = match.end()
2408
2409                     token = self.const_syms[name] if name in STR_TO_TRI else \
2410                         self._lookup_sym(name)
2411
2412                 else:
2413                     # It's a case of missing quotes. For example, the
2414                     # following is accepted:
2415                     #
2416                     #   menu unquoted_title
2417                     #
2418                     #   config A
2419                     #       tristate unquoted_prompt
2420                     #
2421                     #   endmenu
2422                     #
2423                     # Named choices ('choice FOO') also end up here.
2424
2425                     if token is not _T_CHOICE:
2426                         self._warn("style: quotes recommended around '{}' in '{}'"
2427                                    .format(name, self._line.strip()),
2428                                    self.filename, self.linenr)
2429
2430                     token = name
2431                     i = match.end()
2432
2433             else:
2434                 # Neither a keyword nor a non-const symbol
2435
2436                 # We always strip whitespace after tokens, so it is safe to
2437                 # assume that s[i] is the start of a token here.
2438                 c = s[i]
2439
2440                 if c in "\"'":
2441                     if "$" not in s and "\\" not in s:
2442                         # Fast path for lines without $ and \. Find the
2443                         # matching quote.
2444                         end_i = s.find(c, i + 1) + 1
2445                         if not end_i:
2446                             self._parse_error("unterminated string")
2447                         val = s[i + 1:end_i - 1]
2448                         i = end_i
2449                     else:
2450                         # Slow path
2451                         s, end_i = self._expand_str(s, i)
2452
2453                         # os.path.expandvars() and the $UNAME_RELEASE replace()
2454                         # is a backwards compatibility hack, which should be
2455                         # reasonably safe as expandvars() leaves references to
2456                         # undefined env. vars. as is.
2457                         #
2458                         # The preprocessor functionality changed how
2459                         # environment variables are referenced, to $(FOO).
2460                         val = expandvars(s[i + 1:end_i - 1]
2461                                          .replace("$UNAME_RELEASE",
2462                                                   _UNAME_RELEASE))
2463
2464                         i = end_i
2465
2466                     # This is the only place where we don't survive with a
2467                     # single token of lookback: 'option env="FOO"' does not
2468                     # refer to a constant symbol named "FOO".
2469                     token = \
2470                         val if token in _STRING_LEX or tokens[0] is _T_OPTION \
2471                         else self._lookup_const_sym(val)
2472
2473                 elif s.startswith("&&", i):
2474                     token = _T_AND
2475                     i += 2
2476
2477                 elif s.startswith("||", i):
2478                     token = _T_OR
2479                     i += 2
2480
2481                 elif c == "=":
2482                     token = _T_EQUAL
2483                     i += 1
2484
2485                 elif s.startswith("!=", i):
2486                     token = _T_UNEQUAL
2487                     i += 2
2488
2489                 elif c == "!":
2490                     token = _T_NOT
2491                     i += 1
2492
2493                 elif c == "(":
2494                     token = _T_OPEN_PAREN
2495                     i += 1
2496
2497                 elif c == ")":
2498                     token = _T_CLOSE_PAREN
2499                     i += 1
2500
2501                 elif c == "#":
2502                     break
2503
2504
2505                 # Very rare
2506
2507                 elif s.startswith("<=", i):
2508                     token = _T_LESS_EQUAL
2509                     i += 2
2510
2511                 elif c == "<":
2512                     token = _T_LESS
2513                     i += 1
2514
2515                 elif s.startswith(">=", i):
2516                     token = _T_GREATER_EQUAL
2517                     i += 2
2518
2519                 elif c == ">":
2520                     token = _T_GREATER
2521                     i += 1
2522
2523
2524                 else:
2525                     self._parse_error("unknown tokens in line")
2526
2527
2528                 # Skip trailing whitespace
2529                 while i < len(s) and s[i].isspace():
2530                     i += 1
2531
2532
2533             # Add the token
2534             tokens.append(token)
2535
2536         # None-terminating the token list makes token fetching simpler/faster
2537         tokens.append(None)
2538
2539         return tokens
2540
2541     # Helpers for syntax checking and token fetching. See the
2542     # 'Intro to expressions' section for what a constant symbol is.
2543     #
2544     # More of these could be added, but the single-use cases are inlined as an
2545     # optimization.
2546
2547     def _expect_sym(self):
2548         token = self._tokens[self._tokens_i]
2549         self._tokens_i += 1
2550
2551         if token.__class__ is not Symbol:
2552             self._parse_error("expected symbol")
2553
2554         return token
2555
2556     def _expect_nonconst_sym(self):
2557         # Used for 'select' and 'imply' only. We know the token indices.
2558
2559         token = self._tokens[1]
2560         self._tokens_i = 2
2561
2562         if token.__class__ is not Symbol or token.is_constant:
2563             self._parse_error("expected nonconstant symbol")
2564
2565         return token
2566
2567     def _expect_str_and_eol(self):
2568         token = self._tokens[self._tokens_i]
2569         self._tokens_i += 1
2570
2571         if token.__class__ is not str:
2572             self._parse_error("expected string")
2573
2574         if self._tokens[self._tokens_i] is not None:
2575             self._trailing_tokens_error()
2576
2577         return token
2578
2579     def _expect_expr_and_eol(self):
2580         expr = self._parse_expr(True)
2581
2582         if self._tokens[self._tokens_i] is not None:
2583             self._trailing_tokens_error()
2584
2585         return expr
2586
2587     def _check_token(self, token):
2588         # If the next token is 'token', removes it and returns True
2589
2590         if self._tokens[self._tokens_i] is token:
2591             self._tokens_i += 1
2592             return True
2593         return False
2594
2595     #
2596     # Preprocessor logic
2597     #
2598
2599     def _parse_assignment(self, s):
2600         # Parses a preprocessor variable assignment, registering the variable
2601         # if it doesn't already exist. Also takes care of bare macros on lines
2602         # (which are allowed, and can be useful for their side effects).
2603
2604         # Expand any macros in the left-hand side of the assignment (the
2605         # variable name)
2606         s = s.lstrip()
2607         i = 0
2608         while 1:
2609             i = _assignment_lhs_fragment_match(s, i).end()
2610             if s.startswith("$(", i):
2611                 s, i = self._expand_macro(s, i, ())
2612             else:
2613                 break
2614
2615         if s.isspace():
2616             # We also accept a bare macro on a line (e.g.
2617             # $(warning-if,$(foo),ops)), provided it expands to a blank string
2618             return
2619
2620         # Assigned variable
2621         name = s[:i]
2622
2623
2624         # Extract assignment operator (=, :=, or +=) and value
2625         rhs_match = _assignment_rhs_match(s, i)
2626         if not rhs_match:
2627             self._parse_error("syntax error")
2628
2629         op, val = rhs_match.groups()
2630
2631
2632         if name in self.variables:
2633             # Already seen variable
2634             var = self.variables[name]
2635         else:
2636             # New variable
2637             var = Variable()
2638             var.kconfig = self
2639             var.name = name
2640             var._n_expansions = 0
2641             self.variables[name] = var
2642
2643             # += acts like = on undefined variables (defines a recursive
2644             # variable)
2645             if op == "+=":
2646                 op = "="
2647
2648         if op == "=":
2649             var.is_recursive = True
2650             var.value = val
2651         elif op == ":=":
2652             var.is_recursive = False
2653             var.value = self._expand_whole(val, ())
2654         else:  # op == "+="
2655             # += does immediate expansion if the variable was last set
2656             # with :=
2657             var.value += " " + (val if var.is_recursive else
2658                                 self._expand_whole(val, ()))
2659
2660     def _expand_whole(self, s, args):
2661         # Expands preprocessor macros in all of 's'. Used whenever we don't
2662         # have to worry about delimiters. See _expand_macro() re. the 'args'
2663         # parameter.
2664         #
2665         # Returns the expanded string.
2666
2667         i = 0
2668         while 1:
2669             i = s.find("$(", i)
2670             if i == -1:
2671                 break
2672             s, i = self._expand_macro(s, i, args)
2673         return s
2674
2675     def _expand_name(self, s, i):
2676         # Expands a symbol name starting at index 'i' in 's'.
2677         #
2678         # Returns the expanded name, the expanded 's' (including the part
2679         # before the name), and the index of the first character in the next
2680         # token after the name.
2681
2682         s, end_i = self._expand_name_iter(s, i)
2683         name = s[i:end_i]
2684         # isspace() is False for empty strings
2685         if not name.strip():
2686             # Avoid creating a Kconfig symbol with a blank name. It's almost
2687             # guaranteed to be an error.
2688             self._parse_error("macro expanded to blank string")
2689
2690         # Skip trailing whitespace
2691         while end_i < len(s) and s[end_i].isspace():
2692             end_i += 1
2693
2694         return name, s, end_i
2695
2696     def _expand_name_iter(self, s, i):
2697         # Expands a symbol name starting at index 'i' in 's'.
2698         #
2699         # Returns the expanded 's' (including the part before the name) and the
2700         # index of the first character after the expanded name in 's'.
2701
2702         while 1:
2703             match = _name_special_search(s, i)
2704
2705             if match.group() != "$(":
2706                 return (s, match.start())
2707             s, i = self._expand_macro(s, match.start(), ())
2708
2709     def _expand_str(self, s, i):
2710         # Expands a quoted string starting at index 'i' in 's'. Handles both
2711         # backslash escapes and macro expansion.
2712         #
2713         # Returns the expanded 's' (including the part before the string) and
2714         # the index of the first character after the expanded string in 's'.
2715
2716         quote = s[i]
2717         i += 1  # Skip over initial "/'
2718         while 1:
2719             match = _string_special_search(s, i)
2720             if not match:
2721                 self._parse_error("unterminated string")
2722
2723
2724             if match.group() == quote:
2725                 # Found the end of the string
2726                 return (s, match.end())
2727
2728             elif match.group() == "\\":
2729                 # Replace '\x' with 'x'. 'i' ends up pointing to the character
2730                 # after 'x', which allows macros to be canceled with '\$(foo)'.
2731                 i = match.end()
2732                 s = s[:match.start()] + s[i:]
2733
2734             elif match.group() == "$(":
2735                 # A macro call within the string
2736                 s, i = self._expand_macro(s, match.start(), ())
2737
2738             else:
2739                 # A ' quote within " quotes or vice versa
2740                 i += 1
2741
2742     def _expand_macro(self, s, i, args):
2743         # Expands a macro starting at index 'i' in 's'. If this macro resulted
2744         # from the expansion of another macro, 'args' holds the arguments
2745         # passed to that macro.
2746         #
2747         # Returns the expanded 's' (including the part before the macro) and
2748         # the index of the first character after the expanded macro in 's'.
2749
2750         res = s[:i]
2751         i += 2  # Skip over "$("
2752
2753         arg_start = i  # Start of current macro argument
2754         new_args = []  # Arguments of this macro call
2755         nesting = 0  # Current parentheses nesting level
2756
2757         while 1:
2758             match = _macro_special_search(s, i)
2759             if not match:
2760                 self._parse_error("missing end parenthesis in macro expansion")
2761
2762
2763             if match.group() == "(":
2764                 nesting += 1
2765                 i = match.end()
2766
2767             elif match.group() == ")":
2768                 if nesting:
2769                     nesting -= 1
2770                     i = match.end()
2771                     continue
2772
2773                 # Found the end of the macro
2774
2775                 new_args.append(s[arg_start:match.start()])
2776
2777                 # $(1) is replaced by the first argument to the function, etc.,
2778                 # provided at least that many arguments were passed
2779
2780                 try:
2781                     # Does the macro look like an integer, with a corresponding
2782                     # argument? If so, expand it to the value of the argument.
2783                     res += args[int(new_args[0])]
2784                 except (ValueError, IndexError):
2785                     # Regular variables are just functions without arguments,
2786                     # and also go through the function value path
2787                     res += self._fn_val(new_args)
2788
2789                 return (res + s[match.end():], len(res))
2790
2791             elif match.group() == ",":
2792                 i = match.end()
2793                 if nesting:
2794                     continue
2795
2796                 # Found the end of a macro argument
2797                 new_args.append(s[arg_start:match.start()])
2798                 arg_start = i
2799
2800             else:  # match.group() == "$("
2801                 # A nested macro call within the macro
2802                 s, i = self._expand_macro(s, match.start(), args)
2803
2804     def _fn_val(self, args):
2805         # Returns the result of calling the function args[0] with the arguments
2806         # args[1..len(args)-1]. Plain variables are treated as functions
2807         # without arguments.
2808
2809         fn = args[0]
2810
2811         if fn in self.variables:
2812             var = self.variables[fn]
2813
2814             if len(args) == 1:
2815                 # Plain variable
2816                 if var._n_expansions:
2817                     self._parse_error("Preprocessor variable {} recursively "
2818                                       "references itself".format(var.name))
2819             elif var._n_expansions > 100:
2820                 # Allow functions to call themselves, but guess that functions
2821                 # that are overly recursive are stuck
2822                 self._parse_error("Preprocessor function {} seems stuck "
2823                                   "in infinite recursion".format(var.name))
2824
2825             var._n_expansions += 1
2826             res = self._expand_whole(self.variables[fn].value, args)
2827             var._n_expansions -= 1
2828             return res
2829
2830         if fn in self._functions:
2831             # Built-in or user-defined function
2832
2833             py_fn, min_arg, max_arg = self._functions[fn]
2834
2835             if len(args) - 1 < min_arg or \
2836                (max_arg is not None and len(args) - 1 > max_arg):
2837
2838                 if min_arg == max_arg:
2839                     expected_args = min_arg
2840                 elif max_arg is None:
2841                     expected_args = "{} or more".format(min_arg)
2842                 else:
2843                     expected_args = "{}-{}".format(min_arg, max_arg)
2844
2845                 raise KconfigError("{}:{}: bad number of arguments in call "
2846                                    "to {}, expected {}, got {}"
2847                                    .format(self.filename, self.linenr, fn,
2848                                            expected_args, len(args) - 1))
2849
2850             return py_fn(self, *args)
2851
2852         # Environment variables are tried last
2853         if fn in os.environ:
2854             self.env_vars.add(fn)
2855             return os.environ[fn]
2856
2857         return ""
2858
2859     #
2860     # Parsing
2861     #
2862
2863     def _make_and(self, e1, e2):
2864         # Constructs an AND (&&) expression. Performs trivial simplification.
2865
2866         if e1 is self.y:
2867             return e2
2868
2869         if e2 is self.y:
2870             return e1
2871
2872         if e1 is self.n or e2 is self.n:
2873             return self.n
2874
2875         return (AND, e1, e2)
2876
2877     def _make_or(self, e1, e2):
2878         # Constructs an OR (||) expression. Performs trivial simplification.
2879
2880         if e1 is self.n:
2881             return e2
2882
2883         if e2 is self.n:
2884             return e1
2885
2886         if e1 is self.y or e2 is self.y:
2887             return self.y
2888
2889         return (OR, e1, e2)
2890
2891     def _parse_block(self, end_token, parent, prev):
2892         # Parses a block, which is the contents of either a file or an if,
2893         # menu, or choice statement.
2894         #
2895         # end_token:
2896         #   The token that ends the block, e.g. _T_ENDIF ("endif") for ifs.
2897         #   None for files.
2898         #
2899         # parent:
2900         #   The parent menu node, corresponding to a menu, Choice, or 'if'.
2901         #   'if's are flattened after parsing.
2902         #
2903         # prev:
2904         #   The previous menu node. New nodes will be added after this one (by
2905         #   modifying 'next' pointers).
2906         #
2907         #   'prev' is reused to parse a list of child menu nodes (for a menu or
2908         #   Choice): After parsing the children, the 'next' pointer is assigned
2909         #   to the 'list' pointer to "tilt up" the children above the node.
2910         #
2911         # Returns the final menu node in the block (or 'prev' if the block is
2912         # empty). This allows chaining.
2913
2914         while self._next_line():
2915             t0 = self._tokens[0]
2916
2917             if t0 is _T_CONFIG or t0 is _T_MENUCONFIG:
2918                 # The tokenizer allocates Symbol objects for us
2919                 sym = self._tokens[1]
2920
2921                 if sym.__class__ is not Symbol or sym.is_constant:
2922                     self._parse_error("missing or bad symbol name")
2923
2924                 if self._tokens[2] is not None:
2925                     self._trailing_tokens_error()
2926
2927                 self.defined_syms.append(sym)
2928
2929                 node = MenuNode()
2930                 node.kconfig = self
2931                 node.item = sym
2932                 node.is_menuconfig = (t0 is _T_MENUCONFIG)
2933                 node.prompt = node.help = 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                 sym.nodes.append(node)
2940
2941                 self._parse_props(node)
2942
2943                 if node.is_menuconfig and not node.prompt:
2944                     self._warn("the menuconfig symbol {} has no prompt"
2945                                .format(sym.name_and_loc))
2946
2947                 # Equivalent to
2948                 #
2949                 #   prev.next = node
2950                 #   prev = node
2951                 #
2952                 # due to tricky Python semantics. The order matters.
2953                 prev.next = prev = node
2954
2955             elif t0 is None:
2956                 # Blank line
2957                 continue
2958
2959             elif t0 in _SOURCE_TOKENS:
2960                 pattern = self._expect_str_and_eol()
2961
2962                 if t0 in _REL_SOURCE_TOKENS:
2963                     # Relative source
2964                     pattern = join(dirname(self.filename), pattern)
2965
2966                 # - glob() doesn't support globbing relative to a directory, so
2967                 #   we need to prepend $srctree to 'pattern'. Use join()
2968                 #   instead of '+' so that an absolute path in 'pattern' is
2969                 #   preserved.
2970                 #
2971                 # - Sort the glob results to ensure a consistent ordering of
2972                 #   Kconfig symbols, which indirectly ensures a consistent
2973                 #   ordering in e.g. .config files
2974                 filenames = sorted(iglob(join(self._srctree_prefix, pattern)))
2975
2976                 if not filenames and t0 in _OBL_SOURCE_TOKENS:
2977                     raise KconfigError(
2978                         "{}:{}: '{}' not found (in '{}'). Check that "
2979                         "environment variables are set correctly (e.g. "
2980                         "$srctree, which is {}). Also note that unset "
2981                         "environment variables expand to the empty string."
2982                         .format(self.filename, self.linenr, pattern,
2983                                 self._line.strip(),
2984                                 "set to '{}'".format(self.srctree)
2985                                     if self.srctree else "unset or blank"))
2986
2987                 for filename in filenames:
2988                     self._enter_file(filename)
2989                     prev = self._parse_block(None, parent, prev)
2990                     self._leave_file()
2991
2992             elif t0 is end_token:
2993                 # Reached the end of the block. Terminate the final node and
2994                 # return it.
2995
2996                 if self._tokens[1] is not None:
2997                     self._trailing_tokens_error()
2998
2999                 prev.next = None
3000                 return prev
3001
3002             elif t0 is _T_IF:
3003                 node = MenuNode()
3004                 node.item = node.prompt = None
3005                 node.parent = parent
3006                 node.dep = self._expect_expr_and_eol()
3007
3008                 self._parse_block(_T_ENDIF, node, node)
3009                 node.list = node.next
3010
3011                 prev.next = prev = node
3012
3013             elif t0 is _T_MENU:
3014                 node = MenuNode()
3015                 node.kconfig = self
3016                 node.item = t0  # _T_MENU == MENU
3017                 node.is_menuconfig = True
3018                 node.prompt = (self._expect_str_and_eol(), self.y)
3019                 node.visibility = self.y
3020                 node.parent = parent
3021                 node.filename = self.filename
3022                 node.linenr = self.linenr
3023                 node.include_path = self._include_path
3024
3025                 self.menus.append(node)
3026
3027                 self._parse_props(node)
3028                 self._parse_block(_T_ENDMENU, node, node)
3029                 node.list = node.next
3030
3031                 prev.next = prev = node
3032
3033             elif t0 is _T_COMMENT:
3034                 node = MenuNode()
3035                 node.kconfig = self
3036                 node.item = t0  # _T_COMMENT == COMMENT
3037                 node.is_menuconfig = False
3038                 node.prompt = (self._expect_str_and_eol(), self.y)
3039                 node.list = None
3040                 node.parent = parent
3041                 node.filename = self.filename
3042                 node.linenr = self.linenr
3043                 node.include_path = self._include_path
3044
3045                 self.comments.append(node)
3046
3047                 self._parse_props(node)
3048
3049                 prev.next = prev = node
3050
3051             elif t0 is _T_CHOICE:
3052                 if self._tokens[1] is None:
3053                     choice = Choice()
3054                     choice.direct_dep = self.n
3055                 else:
3056                     # Named choice
3057                     name = self._expect_str_and_eol()
3058                     choice = self.named_choices.get(name)
3059                     if not choice:
3060                         choice = Choice()
3061                         choice.name = name
3062                         choice.direct_dep = self.n
3063                         self.named_choices[name] = choice
3064
3065                 self.choices.append(choice)
3066
3067                 node = MenuNode()
3068                 node.kconfig = choice.kconfig = self
3069                 node.item = choice
3070                 node.is_menuconfig = True
3071                 node.prompt = node.help = None
3072                 node.parent = parent
3073                 node.filename = self.filename
3074                 node.linenr = self.linenr
3075                 node.include_path = self._include_path
3076
3077                 choice.nodes.append(node)
3078
3079                 self._parse_props(node)
3080                 self._parse_block(_T_ENDCHOICE, node, node)
3081                 node.list = node.next
3082
3083                 prev.next = prev = node
3084
3085             elif t0 is _T_MAINMENU:
3086                 self.top_node.prompt = (self._expect_str_and_eol(), self.y)
3087
3088             else:
3089                 # A valid endchoice/endif/endmenu is caught by the 'end_token'
3090                 # check above
3091                 self._parse_error(
3092                     "no corresponding 'choice'" if t0 is _T_ENDCHOICE else
3093                     "no corresponding 'if'"     if t0 is _T_ENDIF else
3094                     "no corresponding 'menu'"   if t0 is _T_ENDMENU else
3095                     "unrecognized construct")
3096
3097         # End of file reached. Return the last node.
3098
3099         if end_token:
3100             raise KconfigError(
3101                 "error: expected '{}' at end of '{}'"
3102                 .format("endchoice" if end_token is _T_ENDCHOICE else
3103                         "endif"     if end_token is _T_ENDIF else
3104                         "endmenu",
3105                         self.filename))
3106
3107         return prev
3108
3109     def _parse_cond(self):
3110         # Parses an optional 'if <expr>' construct and returns the parsed
3111         # <expr>, or self.y if the next token is not _T_IF
3112
3113         expr = self._parse_expr(True) if self._check_token(_T_IF) else self.y
3114
3115         if self._tokens[self._tokens_i] is not None:
3116             self._trailing_tokens_error()
3117
3118         return expr
3119
3120     def _parse_props(self, node):
3121         # Parses and adds properties to the MenuNode 'node' (type, 'prompt',
3122         # 'default's, etc.) Properties are later copied up to symbols and
3123         # choices in a separate pass after parsing, in e.g.
3124         # _add_props_to_sym().
3125         #
3126         # An older version of this code added properties directly to symbols
3127         # and choices instead of to their menu nodes (and handled dependency
3128         # propagation simultaneously), but that loses information on where a
3129         # property is added when a symbol or choice is defined in multiple
3130         # locations. Some Kconfig configuration systems rely heavily on such
3131         # symbols, and better docs can be generated by keeping track of where
3132         # properties are added.
3133         #
3134         # node:
3135         #   The menu node we're parsing properties on
3136
3137         # Dependencies from 'depends on'. Will get propagated to the properties
3138         # below.
3139         node.dep = self.y
3140
3141         while self._next_line():
3142             t0 = self._tokens[0]
3143
3144             if t0 in _TYPE_TOKENS:
3145                 # Relies on '_T_BOOL is BOOL', etc., to save a conversion
3146                 self._set_type(node.item, t0)
3147                 if self._tokens[1] is not None:
3148                     self._parse_prompt(node)
3149
3150             elif t0 is _T_DEPENDS:
3151                 if not self._check_token(_T_ON):
3152                     self._parse_error("expected 'on' after 'depends'")
3153
3154                 node.dep = self._make_and(node.dep,
3155                                           self._expect_expr_and_eol())
3156
3157             elif t0 is _T_HELP:
3158                 self._parse_help(node)
3159
3160             elif t0 is _T_SELECT:
3161                 if node.item.__class__ is not Symbol:
3162                     self._parse_error("only symbols can select")
3163
3164                 node.selects.append((self._expect_nonconst_sym(),
3165                                      self._parse_cond()))
3166
3167             elif t0 is None:
3168                 # Blank line
3169                 continue
3170
3171             elif t0 is _T_DEFAULT:
3172                 node.defaults.append((self._parse_expr(False),
3173                                       self._parse_cond()))
3174
3175             elif t0 in _DEF_TOKEN_TO_TYPE:
3176                 self._set_type(node.item, _DEF_TOKEN_TO_TYPE[t0])
3177                 node.defaults.append((self._parse_expr(False),
3178                                       self._parse_cond()))
3179
3180             elif t0 is _T_PROMPT:
3181                 self._parse_prompt(node)
3182
3183             elif t0 is _T_RANGE:
3184                 node.ranges.append((self._expect_sym(), self._expect_sym(),
3185                                     self._parse_cond()))
3186
3187             elif t0 is _T_IMPLY:
3188                 if node.item.__class__ is not Symbol:
3189                     self._parse_error("only symbols can imply")
3190
3191                 node.implies.append((self._expect_nonconst_sym(),
3192                                      self._parse_cond()))
3193
3194             elif t0 is _T_VISIBLE:
3195                 if not self._check_token(_T_IF):
3196                     self._parse_error("expected 'if' after 'visible'")
3197
3198                 node.visibility = self._make_and(node.visibility,
3199                                                  self._expect_expr_and_eol())
3200
3201             elif t0 is _T_OPTION:
3202                 if self._check_token(_T_ENV):
3203                     if not self._check_token(_T_EQUAL):
3204                         self._parse_error("expected '=' after 'env'")
3205
3206                     env_var = self._expect_str_and_eol()
3207                     node.item.env_var = env_var
3208
3209                     if env_var in os.environ:
3210                         node.defaults.append(
3211                             (self._lookup_const_sym(os.environ[env_var]),
3212                              self.y))
3213                     else:
3214                         self._warn("{1} has 'option env=\"{0}\"', "
3215                                    "but the environment variable {0} is not "
3216                                    "set".format(node.item.name, env_var),
3217                                    self.filename, self.linenr)
3218
3219                     if env_var != node.item.name:
3220                         self._warn("Kconfiglib expands environment variables "
3221                                    "in strings directly, meaning you do not "
3222                                    "need 'option env=...' \"bounce\" symbols. "
3223                                    "For compatibility with the C tools, "
3224                                    "rename {} to {} (so that the symbol name "
3225                                    "matches the environment variable name)."
3226                                    .format(node.item.name, env_var),
3227                                    self.filename, self.linenr)
3228
3229                 elif self._check_token(_T_DEFCONFIG_LIST):
3230                     if not self.defconfig_list:
3231                         self.defconfig_list = node.item
3232                     else:
3233                         self._warn("'option defconfig_list' set on multiple "
3234                                    "symbols ({0} and {1}). Only {0} will be "
3235                                    "used.".format(self.defconfig_list.name,
3236                                                   node.item.name),
3237                                    self.filename, self.linenr)
3238
3239                 elif self._check_token(_T_MODULES):
3240                     # To reduce warning spam, only warn if 'option modules' is
3241                     # set on some symbol that isn't MODULES, which should be
3242                     # safe. I haven't run into any projects that make use
3243                     # modules besides the kernel yet, and there it's likely to
3244                     # keep being called "MODULES".
3245                     if node.item is not self.modules:
3246                         self._warn("the 'modules' option is not supported. "
3247                                    "Let me know if this is a problem for you, "
3248                                    "as it wouldn't be that hard to implement. "
3249                                    "Note that modules are supported -- "
3250                                    "Kconfiglib just assumes the symbol name "
3251                                    "MODULES, like older versions of the C "
3252                                    "implementation did when 'option modules' "
3253                                    "wasn't used.",
3254                                    self.filename, self.linenr)
3255
3256                 elif self._check_token(_T_ALLNOCONFIG_Y):
3257                     if node.item.__class__ is not Symbol:
3258                         self._parse_error("the 'allnoconfig_y' option is only "
3259                                           "valid for symbols")
3260
3261                     node.item.is_allnoconfig_y = True
3262
3263                 else:
3264                     self._parse_error("unrecognized option")
3265
3266             elif t0 is _T_OPTIONAL:
3267                 if node.item.__class__ is not Choice:
3268                     self._parse_error('"optional" is only valid for choices')
3269
3270                 node.item.is_optional = True
3271
3272             else:
3273                 # Reuse the tokens for the non-property line later
3274                 self._reuse_tokens = True
3275                 return
3276
3277     def _set_type(self, sc, new_type):
3278         # Sets the type of 'sc' (symbol or choice) to 'new_type'
3279
3280         # UNKNOWN is falsy
3281         if sc.orig_type and sc.orig_type is not new_type:
3282             self._warn("{} defined with multiple types, {} will be used"
3283                        .format(sc.name_and_loc, TYPE_TO_STR[new_type]))
3284
3285         sc.orig_type = new_type
3286
3287     def _parse_prompt(self, node):
3288         # 'prompt' properties override each other within a single definition of
3289         # a symbol, but additional prompts can be added by defining the symbol
3290         # multiple times
3291
3292         if node.prompt:
3293             self._warn(node.item.name_and_loc +
3294                        " defined with multiple prompts in single location")
3295
3296         prompt = self._tokens[1]
3297         self._tokens_i = 2
3298
3299         if prompt.__class__ is not str:
3300             self._parse_error("expected prompt string")
3301
3302         if prompt != prompt.strip():
3303             self._warn(node.item.name_and_loc +
3304                        " has leading or trailing whitespace in its prompt")
3305
3306             # This avoid issues for e.g. reStructuredText documentation, where
3307             # '*prompt *' is invalid
3308             prompt = prompt.strip()
3309
3310         node.prompt = (prompt, self._parse_cond())
3311
3312     def _parse_help(self, node):
3313         if node.help is not None:
3314             self._warn(node.item.name_and_loc + " defined with more than "
3315                        "one help text -- only the last one will be used")
3316
3317         # Micro-optimization. This code is pretty hot.
3318         readline = self._readline
3319
3320         # Find first non-blank (not all-space) line and get its
3321         # indentation
3322
3323         while 1:
3324             line = readline()
3325             self.linenr += 1
3326             if not line:
3327                 self._empty_help(node, line)
3328                 return
3329             if not line.isspace():
3330                 break
3331
3332         len_ = len  # Micro-optimization
3333
3334         # Use a separate 'expline' variable here and below to avoid stomping on
3335         # any tabs people might've put deliberately into the first line after
3336         # the help text
3337         expline = line.expandtabs()
3338         indent = len_(expline) - len_(expline.lstrip())
3339         if not indent:
3340             self._empty_help(node, line)
3341             return
3342
3343         # The help text goes on till the first non-blank line with less indent
3344         # than the first line
3345
3346         # Add the first line
3347         lines = [expline[indent:]]
3348         add_line = lines.append  # Micro-optimization
3349
3350         while 1:
3351             line = readline()
3352             if line.isspace():
3353                 # No need to preserve the exact whitespace in these
3354                 add_line("\n")
3355             elif not line:
3356                 # End of file
3357                 break
3358             else:
3359                 expline = line.expandtabs()
3360                 if len_(expline) - len_(expline.lstrip()) < indent:
3361                     break
3362                 add_line(expline[indent:])
3363
3364         self.linenr += len_(lines)
3365         node.help = "".join(lines).rstrip()
3366         if line:
3367             self._line_after_help(line)
3368
3369     def _empty_help(self, node, line):
3370         self._warn(node.item.name_and_loc +
3371                    " has 'help' but empty help text")
3372         node.help = ""
3373         if line:
3374             self._line_after_help(line)
3375
3376     def _parse_expr(self, transform_m):
3377         # Parses an expression from the tokens in Kconfig._tokens using a
3378         # simple top-down approach. See the module docstring for the expression
3379         # format.
3380         #
3381         # transform_m:
3382         #   True if m should be rewritten to m && MODULES. See the
3383         #   Kconfig.eval_string() documentation.
3384
3385         # Grammar:
3386         #
3387         #   expr:     and_expr ['||' expr]
3388         #   and_expr: factor ['&&' and_expr]
3389         #   factor:   <symbol> ['='/'!='/'<'/... <symbol>]
3390         #             '!' factor
3391         #             '(' expr ')'
3392         #
3393         # It helps to think of the 'expr: and_expr' case as a single-operand OR
3394         # (no ||), and of the 'and_expr: factor' case as a single-operand AND
3395         # (no &&). Parsing code is always a bit tricky.
3396
3397         # Mind dump: parse_factor() and two nested loops for OR and AND would
3398         # work as well. The straightforward implementation there gives a
3399         # (op, (op, (op, A, B), C), D) parse for A op B op C op D. Representing
3400         # expressions as (op, [list of operands]) instead goes nicely with that
3401         # version, but is wasteful for short expressions and complicates
3402         # expression evaluation and other code that works on expressions (more
3403         # complicated code likely offsets any performance gain from less
3404         # recursion too). If we also try to optimize the list representation by
3405         # merging lists when possible (e.g. when ANDing two AND expressions),
3406         # we end up allocating a ton of lists instead of reusing expressions,
3407         # which is bad.
3408
3409         and_expr = self._parse_and_expr(transform_m)
3410
3411         # Return 'and_expr' directly if we have a "single-operand" OR.
3412         # Otherwise, parse the expression on the right and make an OR node.
3413         # This turns A || B || C || D into (OR, A, (OR, B, (OR, C, D))).
3414         return and_expr if not self._check_token(_T_OR) else \
3415             (OR, and_expr, self._parse_expr(transform_m))
3416
3417     def _parse_and_expr(self, transform_m):
3418         factor = self._parse_factor(transform_m)
3419
3420         # Return 'factor' directly if we have a "single-operand" AND.
3421         # Otherwise, parse the right operand and make an AND node. This turns
3422         # A && B && C && D into (AND, A, (AND, B, (AND, C, D))).
3423         return factor if not self._check_token(_T_AND) else \
3424             (AND, factor, self._parse_and_expr(transform_m))
3425
3426     def _parse_factor(self, transform_m):
3427         token = self._tokens[self._tokens_i]
3428         self._tokens_i += 1
3429
3430         if token.__class__ is Symbol:
3431             # Plain symbol or relation
3432
3433             if self._tokens[self._tokens_i] not in _RELATIONS:
3434                 # Plain symbol
3435
3436                 # For conditional expressions ('depends on <expr>',
3437                 # '... if <expr>', etc.), m is rewritten to m && MODULES.
3438                 if transform_m and token is self.m:
3439                     return (AND, self.m, self.modules)
3440
3441                 return token
3442
3443             # Relation
3444             #
3445             # _T_EQUAL, _T_UNEQUAL, etc., deliberately have the same values as
3446             # EQUAL, UNEQUAL, etc., so we can just use the token directly
3447             self._tokens_i += 1
3448             return (self._tokens[self._tokens_i - 1], token,
3449                     self._expect_sym())
3450
3451         if token is _T_NOT:
3452             # token == _T_NOT == NOT
3453             return (token, self._parse_factor(transform_m))
3454
3455         if token is _T_OPEN_PAREN:
3456             expr_parse = self._parse_expr(transform_m)
3457             if self._check_token(_T_CLOSE_PAREN):
3458                 return expr_parse
3459
3460         self._parse_error("malformed expression")
3461
3462     #
3463     # Caching and invalidation
3464     #
3465
3466     def _build_dep(self):
3467         # Populates the Symbol/Choice._dependents sets, which contain all other
3468         # items (symbols and choices) that immediately depend on the item in
3469         # the sense that changing the value of the item might affect the value
3470         # of the dependent items. This is used for caching/invalidation.
3471         #
3472         # The calculated sets might be larger than necessary as we don't do any
3473         # complex analysis of the expressions.
3474
3475         depend_on = _depend_on  # Micro-optimization
3476
3477         # Only calculate _dependents for defined symbols. Constant and
3478         # undefined symbols could theoretically be selected/implied, but it
3479         # wouldn't change their value, so it's not a true dependency.
3480         for sym in self.unique_defined_syms:
3481             # Symbols depend on the following:
3482
3483             # The prompt conditions
3484             for node in sym.nodes:
3485                 if node.prompt:
3486                     depend_on(sym, node.prompt[1])
3487
3488             # The default values and their conditions
3489             for value, cond in sym.defaults:
3490                 depend_on(sym, value)
3491                 depend_on(sym, cond)
3492
3493             # The reverse and weak reverse dependencies
3494             depend_on(sym, sym.rev_dep)
3495             depend_on(sym, sym.weak_rev_dep)
3496
3497             # The ranges along with their conditions
3498             for low, high, cond in sym.ranges:
3499                 depend_on(sym, low)
3500                 depend_on(sym, high)
3501                 depend_on(sym, cond)
3502
3503             # The direct dependencies. This is usually redundant, as the direct
3504             # dependencies get propagated to properties, but it's needed to get
3505             # invalidation solid for 'imply', which only checks the direct
3506             # dependencies (even if there are no properties to propagate it
3507             # to).
3508             depend_on(sym, sym.direct_dep)
3509
3510             # In addition to the above, choice symbols depend on the choice
3511             # they're in, but that's handled automatically since the Choice is
3512             # propagated to the conditions of the properties before
3513             # _build_dep() runs.
3514
3515         for choice in self.unique_choices:
3516             # Choices depend on the following:
3517
3518             # The prompt conditions
3519             for node in choice.nodes:
3520                 if node.prompt:
3521                     depend_on(choice, node.prompt[1])
3522
3523             # The default symbol conditions
3524             for _, cond in choice.defaults:
3525                 depend_on(choice, cond)
3526
3527     def _add_choice_deps(self):
3528         # Choices also depend on the choice symbols themselves, because the
3529         # y-mode selection of the choice might change if a choice symbol's
3530         # visibility changes.
3531         #
3532         # We add these dependencies separately after dependency loop detection.
3533         # The invalidation algorithm can handle the resulting
3534         # <choice symbol> <-> <choice> dependency loops, but they make loop
3535         # detection awkward.
3536
3537         for choice in self.unique_choices:
3538             for sym in choice.syms:
3539                 sym._dependents.add(choice)
3540
3541     def _invalidate_all(self):
3542         # Undefined symbols never change value and don't need to be
3543         # invalidated, so we can just iterate over defined symbols.
3544         # Invalidating constant symbols would break things horribly.
3545         for sym in self.unique_defined_syms:
3546             sym._invalidate()
3547
3548         for choice in self.unique_choices:
3549             choice._invalidate()
3550
3551     #
3552     # Post-parsing menu tree processing, including dependency propagation and
3553     # implicit submenu creation
3554     #
3555
3556     def _finalize_node(self, node, visible_if):
3557         # Finalizes a menu node and its children:
3558         #
3559         #  - Copies properties from menu nodes up to their contained
3560         #    symbols/choices
3561         #
3562         #  - Propagates dependencies from parent to child nodes
3563         #
3564         #  - Creates implicit menus (see kconfig-language.txt)
3565         #
3566         #  - Removes 'if' nodes
3567         #
3568         #  - Sets 'choice' types and registers choice symbols
3569         #
3570         # menu_finalize() in the C implementation is similar.
3571         #
3572         # node:
3573         #   The menu node to finalize. This node and its children will have
3574         #   been finalized when the function returns, and any implicit menus
3575         #   will have been created.
3576         #
3577         # visible_if:
3578         #   Dependencies from 'visible if' on parent menus. These are added to
3579         #   the prompts of symbols and choices.
3580
3581         if node.item.__class__ is Symbol:
3582             # Copy defaults, ranges, selects, and implies to the Symbol
3583             self._add_props_to_sym(node)
3584
3585             # Find any items that should go in an implicit menu rooted at the
3586             # symbol
3587             cur = node
3588             while cur.next and _auto_menu_dep(node, cur.next):
3589                 # This makes implicit submenu creation work recursively, with
3590                 # implicit menus inside implicit menus
3591                 self._finalize_node(cur.next, visible_if)
3592                 cur = cur.next
3593                 cur.parent = node
3594
3595             if cur is not node:
3596                 # Found symbols that should go in an implicit submenu. Tilt
3597                 # them up above us.
3598                 node.list = node.next
3599                 node.next = cur.next
3600                 cur.next = None
3601
3602         elif node.list:
3603             # The menu node is a choice, menu, or if. Finalize each child node.
3604
3605             if node.item is MENU:
3606                 visible_if = self._make_and(visible_if, node.visibility)
3607
3608             # Propagate the menu node's dependencies to each child menu node.
3609             #
3610             # This needs to go before the recursive _finalize_node() call so
3611             # that implicit submenu creation can look ahead at dependencies.
3612             self._propagate_deps(node, visible_if)
3613
3614             # Finalize the children
3615             cur = node.list
3616             while cur:
3617                 self._finalize_node(cur, visible_if)
3618                 cur = cur.next
3619
3620         if node.list:
3621             # node's children have been individually finalized. Do final steps
3622             # to finalize this "level" in the menu tree.
3623             _flatten(node.list)
3624             _remove_ifs(node)
3625
3626         # Empty choices (node.list None) are possible, so this needs to go
3627         # outside
3628         if node.item.__class__ is Choice:
3629             # Add the node's non-node-specific properties to the choice, like
3630             # _add_props_to_sym() does
3631             choice = node.item
3632             choice.direct_dep = self._make_or(choice.direct_dep, node.dep)
3633             choice.defaults += node.defaults
3634
3635             _finalize_choice(node)
3636
3637     def _propagate_deps(self, node, visible_if):
3638         # Propagates 'node's dependencies to its child menu nodes
3639
3640         # If the parent node holds a Choice, we use the Choice itself as the
3641         # parent dependency. This makes sense as the value (mode) of the choice
3642         # limits the visibility of the contained choice symbols. The C
3643         # implementation works the same way.
3644         #
3645         # Due to the similar interface, Choice works as a drop-in replacement
3646         # for Symbol here.
3647         basedep = node.item if node.item.__class__ is Choice else node.dep
3648
3649         cur = node.list
3650         while cur:
3651             dep = cur.dep = self._make_and(cur.dep, basedep)
3652
3653             if cur.item.__class__ in _SYMBOL_CHOICE:
3654                 # Propagate 'visible if' and dependencies to the prompt
3655                 if cur.prompt:
3656                     cur.prompt = (cur.prompt[0],
3657                                   self._make_and(
3658                                       cur.prompt[1],
3659                                       self._make_and(visible_if, dep)))
3660
3661                 # Propagate dependencies to defaults
3662                 if cur.defaults:
3663                     cur.defaults = [(default, self._make_and(cond, dep))
3664                                     for default, cond in cur.defaults]
3665
3666                 # Propagate dependencies to ranges
3667                 if cur.ranges:
3668                     cur.ranges = [(low, high, self._make_and(cond, dep))
3669                                   for low, high, cond in cur.ranges]
3670
3671                 # Propagate dependencies to selects
3672                 if cur.selects:
3673                     cur.selects = [(target, self._make_and(cond, dep))
3674                                    for target, cond in cur.selects]
3675
3676                 # Propagate dependencies to implies
3677                 if cur.implies:
3678                     cur.implies = [(target, self._make_and(cond, dep))
3679                                    for target, cond in cur.implies]
3680
3681             elif cur.prompt:  # Not a symbol/choice
3682                 # Propagate dependencies to the prompt. 'visible if' is only
3683                 # propagated to symbols/choices.
3684                 cur.prompt = (cur.prompt[0],
3685                               self._make_and(cur.prompt[1], dep))
3686
3687             cur = cur.next
3688
3689     def _add_props_to_sym(self, node):
3690         # Copies properties from the menu node 'node' up to its contained
3691         # symbol, and adds (weak) reverse dependencies to selected/implied
3692         # symbols.
3693         #
3694         # This can't be rolled into _propagate_deps(), because that function
3695         # traverses the menu tree roughly breadth-first, meaning properties on
3696         # symbols defined in multiple locations could end up in the wrong
3697         # order.
3698
3699         sym = node.item
3700
3701         # See the Symbol class docstring
3702         sym.direct_dep = self._make_or(sym.direct_dep, node.dep)
3703
3704         sym.defaults += node.defaults
3705         sym.ranges += node.ranges
3706         sym.selects += node.selects
3707         sym.implies += node.implies
3708
3709         # Modify the reverse dependencies of the selected symbol
3710         for target, cond in node.selects:
3711             target.rev_dep = self._make_or(
3712                 target.rev_dep,
3713                 self._make_and(sym, cond))
3714
3715         # Modify the weak reverse dependencies of the implied
3716         # symbol
3717         for target, cond in node.implies:
3718             target.weak_rev_dep = self._make_or(
3719                 target.weak_rev_dep,
3720                 self._make_and(sym, cond))
3721
3722     #
3723     # Misc.
3724     #
3725
3726     def _check_sym_sanity(self):
3727         # Checks various symbol properties that are handiest to check after
3728         # parsing. Only generates errors and warnings.
3729
3730         def num_ok(sym, type_):
3731             # Returns True if the (possibly constant) symbol 'sym' is valid as a value
3732             # for a symbol of type type_ (INT or HEX)
3733
3734             # 'not sym.nodes' implies a constant or undefined symbol, e.g. a plain
3735             # "123"
3736             if not sym.nodes:
3737                 return _is_base_n(sym.name, _TYPE_TO_BASE[type_])
3738
3739             return sym.orig_type is type_
3740
3741         for sym in self.unique_defined_syms:
3742             if sym.orig_type in _BOOL_TRISTATE:
3743                 # A helper function could be factored out here, but keep it
3744                 # speedy/straightforward
3745
3746                 for target_sym, _ in sym.selects:
3747                     if target_sym.orig_type not in _BOOL_TRISTATE_UNKNOWN:
3748                         self._warn("{} selects the {} symbol {}, which is not "
3749                                    "bool or tristate"
3750                                    .format(sym.name_and_loc,
3751                                            TYPE_TO_STR[target_sym.orig_type],
3752                                            target_sym.name_and_loc))
3753
3754                 for target_sym, _ in sym.implies:
3755                     if target_sym.orig_type not in _BOOL_TRISTATE_UNKNOWN:
3756                         self._warn("{} implies the {} symbol {}, which is not "
3757                                    "bool or tristate"
3758                                    .format(sym.name_and_loc,
3759                                            TYPE_TO_STR[target_sym.orig_type],
3760                                            target_sym.name_and_loc))
3761
3762             elif sym.orig_type:  # STRING/INT/HEX
3763                 for default, _ in sym.defaults:
3764                     if default.__class__ is not Symbol:
3765                         raise KconfigError(
3766                             "the {} symbol {} has a malformed default {} -- "
3767                             "expected a single symbol"
3768                             .format(TYPE_TO_STR[sym.orig_type],
3769                                     sym.name_and_loc, expr_str(default)))
3770
3771                     if sym.orig_type is STRING:
3772                         if not default.is_constant and not default.nodes and \
3773                            not default.name.isupper():
3774                             # 'default foo' on a string symbol could be either a symbol
3775                             # reference or someone leaving out the quotes. Guess that
3776                             # the quotes were left out if 'foo' isn't all-uppercase
3777                             # (and no symbol named 'foo' exists).
3778                             self._warn("style: quotes recommended around "
3779                                        "default value for string symbol "
3780                                        + sym.name_and_loc)
3781
3782                     elif not num_ok(default, sym.orig_type):  # INT/HEX
3783                         self._warn("the {0} symbol {1} has a non-{0} default {2}"
3784                                    .format(TYPE_TO_STR[sym.orig_type],
3785                                            sym.name_and_loc,
3786                                            default.name_and_loc))
3787
3788                 if sym.selects or sym.implies:
3789                     self._warn("the {} symbol {} has selects or implies"
3790                                .format(TYPE_TO_STR[sym.orig_type],
3791                                        sym.name_and_loc))
3792
3793             else:  # UNKNOWN
3794                 self._warn("{} defined without a type"
3795                            .format(sym.name_and_loc))
3796
3797
3798             if sym.ranges:
3799                 if sym.orig_type not in _INT_HEX:
3800                     self._warn(
3801                         "the {} symbol {} has ranges, but is not int or hex"
3802                         .format(TYPE_TO_STR[sym.orig_type],
3803                                 sym.name_and_loc))
3804                 else:
3805                     for low, high, _ in sym.ranges:
3806                         if not num_ok(low, sym.orig_type) or \
3807                            not num_ok(high, sym.orig_type):
3808
3809                             self._warn("the {0} symbol {1} has a non-{0} "
3810                                        "range [{2}, {3}]"
3811                                        .format(TYPE_TO_STR[sym.orig_type],
3812                                                sym.name_and_loc,
3813                                                low.name_and_loc,
3814                                                high.name_and_loc))
3815
3816     def _check_choice_sanity(self):
3817         # Checks various choice properties that are handiest to check after
3818         # parsing. Only generates errors and warnings.
3819
3820         def warn_select_imply(sym, expr, expr_type):
3821             msg = "the choice symbol {} is {} by the following symbols, but " \
3822                   "select/imply has no effect on choice symbols" \
3823                   .format(sym.name_and_loc, expr_type)
3824
3825             # si = select/imply
3826             for si in split_expr(expr, OR):
3827                 msg += "\n - " + split_expr(si, AND)[0].name_and_loc
3828
3829             self._warn(msg)
3830
3831         for choice in self.unique_choices:
3832             if choice.orig_type not in _BOOL_TRISTATE:
3833                 self._warn("{} defined with type {}"
3834                            .format(choice.name_and_loc,
3835                                    TYPE_TO_STR[choice.orig_type]))
3836
3837             for node in choice.nodes:
3838                 if node.prompt:
3839                     break
3840             else:
3841                 self._warn(choice.name_and_loc + " defined without a prompt")
3842
3843             for default, _ in choice.defaults:
3844                 if default.__class__ is not Symbol:
3845                     raise KconfigError(
3846                         "{} has a malformed default {}"
3847                         .format(choice.name_and_loc, expr_str(default)))
3848
3849                 if default.choice is not choice:
3850                     self._warn("the default selection {} of {} is not "
3851                                "contained in the choice"
3852                                .format(default.name_and_loc,
3853                                        choice.name_and_loc))
3854
3855             for sym in choice.syms:
3856                 if sym.defaults:
3857                     self._warn("default on the choice symbol {} will have "
3858                                "no effect, as defaults do not affect choice "
3859                                "symbols".format(sym.name_and_loc))
3860
3861                 if sym.rev_dep is not sym.kconfig.n:
3862                     warn_select_imply(sym, sym.rev_dep, "selected")
3863
3864                 if sym.weak_rev_dep is not sym.kconfig.n:
3865                     warn_select_imply(sym, sym.weak_rev_dep, "implied")
3866
3867                 for node in sym.nodes:
3868                     if node.parent.item is choice:
3869                         if not node.prompt:
3870                             self._warn("the choice symbol {} has no prompt"
3871                                        .format(sym.name_and_loc))
3872
3873                     elif node.prompt:
3874                         self._warn("the choice symbol {} is defined with a "
3875                                    "prompt outside the choice"
3876                                    .format(sym.name_and_loc))
3877
3878     def _parse_error(self, msg):
3879         raise KconfigError("{}error: couldn't parse '{}': {}".format(
3880             "" if self.filename is None else
3881                 "{}:{}: ".format(self.filename, self.linenr),
3882             self._line.strip(), msg))
3883
3884     def _trailing_tokens_error(self):
3885         self._parse_error("extra tokens at end of line")
3886
3887     def _open(self, filename, mode):
3888         # open() wrapper:
3889         #
3890         # - Enable universal newlines mode on Python 2 to ease
3891         #   interoperability between Linux and Windows. It's already the
3892         #   default on Python 3.
3893         #
3894         #   The "U" flag would currently work for both Python 2 and 3, but it's
3895         #   deprecated on Python 3, so play it future-safe.
3896         #
3897         #   io.open() defaults to universal newlines on Python 2 (and is an
3898         #   alias for open() on Python 3), but it returns 'unicode' strings and
3899         #   slows things down:
3900         #
3901         #     Parsing x86 Kconfigs on Python 2
3902         #
3903         #     with open(..., "rU"):
3904         #
3905         #       real  0m0.930s
3906         #       user  0m0.905s
3907         #       sys   0m0.025s
3908         #
3909         #     with io.open():
3910         #
3911         #       real  0m1.069s
3912         #       user  0m1.040s
3913         #       sys   0m0.029s
3914         #
3915         #   There's no appreciable performance difference between "r" and
3916         #   "rU" for parsing performance on Python 2.
3917         #
3918         # - For Python 3, force the encoding. Forcing the encoding on Python 2
3919         #   turns strings into Unicode strings, which gets messy. Python 2
3920         #   doesn't decode regular strings anyway.
3921         return open(filename, "rU" if mode == "r" else mode) if _IS_PY2 else \
3922                open(filename, mode, encoding=self._encoding)
3923
3924     def _check_undef_syms(self):
3925         # Prints warnings for all references to undefined symbols within the
3926         # Kconfig files
3927
3928         def is_num(s):
3929             # Returns True if the string 's' looks like a number.
3930             #
3931             # Internally, all operands in Kconfig are symbols, only undefined symbols
3932             # (which numbers usually are) get their name as their value.
3933             #
3934             # Only hex numbers that start with 0x/0X are classified as numbers.
3935             # Otherwise, symbols whose names happen to contain only the letters A-F
3936             # would trigger false positives.
3937
3938             try:
3939                 int(s)
3940             except ValueError:
3941                 if not s.startswith(("0x", "0X")):
3942                     return False
3943
3944                 try:
3945                     int(s, 16)
3946                 except ValueError:
3947                     return False
3948
3949             return True
3950
3951         for sym in (self.syms.viewvalues if _IS_PY2 else self.syms.values)():
3952             # - sym.nodes empty means the symbol is undefined (has no
3953             #   definition locations)
3954             #
3955             # - Due to Kconfig internals, numbers show up as undefined Kconfig
3956             #   symbols, but shouldn't be flagged
3957             #
3958             # - The MODULES symbol always exists
3959             if not sym.nodes and not is_num(sym.name) and \
3960                sym.name != "MODULES":
3961
3962                 msg = "undefined symbol {}:".format(sym.name)
3963                 for node in self.node_iter():
3964                     if sym in node.referenced:
3965                         msg += "\n\n- Referenced at {}:{}:\n\n{}" \
3966                                .format(node.filename, node.linenr, node)
3967                 self._warn(msg)
3968
3969     def _warn(self, msg, filename=None, linenr=None):
3970         # For printing general warnings
3971
3972         if not self.warn:
3973             return
3974
3975         msg = "warning: " + msg
3976         if filename is not None:
3977             msg = "{}:{}: {}".format(filename, linenr, msg)
3978
3979         self.warnings.append(msg)
3980         if self.warn_to_stderr:
3981             sys.stderr.write(msg + "\n")
3982
3983
3984 class Symbol(object):
3985     """
3986     Represents a configuration symbol:
3987
3988       (menu)config FOO
3989           ...
3990
3991     The following attributes are available. They should be viewed as read-only,
3992     and some are implemented through @property magic (but are still efficient
3993     to access due to internal caching).
3994
3995     Note: Prompts, help texts, and locations are stored in the Symbol's
3996     MenuNode(s) rather than in the Symbol itself. Check the MenuNode class and
3997     the Symbol.nodes attribute. This organization matches the C tools.
3998
3999     name:
4000       The name of the symbol, e.g. "FOO" for 'config FOO'.
4001
4002     type:
4003       The type of the symbol. One of BOOL, TRISTATE, STRING, INT, HEX, UNKNOWN.
4004       UNKNOWN is for undefined symbols, (non-special) constant symbols, and
4005       symbols defined without a type.
4006
4007       When running without modules (MODULES having the value n), TRISTATE
4008       symbols magically change type to BOOL. This also happens for symbols
4009       within choices in "y" mode. This matches the C tools, and makes sense for
4010       menuconfig-like functionality.
4011
4012     orig_type:
4013       The type as given in the Kconfig file, without any magic applied. Used
4014       when printing the symbol.
4015
4016     tri_value:
4017       The tristate value of the symbol as an integer. One of 0, 1, 2,
4018       representing n, m, y. Always 0 (n) for non-bool/tristate symbols.
4019
4020       This is the symbol value that's used outside of relation expressions
4021       (A, !A, A && B, A || B).
4022
4023     str_value:
4024       The value of the symbol as a string. Gives the value for string/int/hex
4025       symbols. For bool/tristate symbols, gives "n", "m", or "y".
4026
4027       This is the symbol value that's used in relational expressions
4028       (A = B, A != B, etc.)
4029
4030       Gotcha: For int/hex symbols, the exact format of the value is often
4031       preserved (e.g. when writing a .config file), hence why you can't get it
4032       directly as an int. Do int(int_sym.str_value) or
4033       int(hex_sym.str_value, 16) to get the integer value.
4034
4035     user_value:
4036       The user value of the symbol. None if no user value has been assigned
4037       (via Kconfig.load_config() or Symbol.set_value()).
4038
4039       Holds 0, 1, or 2 for bool/tristate symbols, and a string for the other
4040       symbol types.
4041
4042       WARNING: Do not assign directly to this. It will break things. Use
4043       Symbol.set_value().
4044
4045     assignable:
4046       A tuple containing the tristate user values that can currently be
4047       assigned to the symbol (that would be respected), ordered from lowest (0,
4048       representing n) to highest (2, representing y). This corresponds to the
4049       selections available in the menuconfig interface. The set of assignable
4050       values is calculated from the symbol's visibility and selects/implies.
4051
4052       Returns the empty set for non-bool/tristate symbols and for symbols with
4053       visibility n. The other possible values are (0, 2), (0, 1, 2), (1, 2),
4054       (1,), and (2,). A (1,) or (2,) result means the symbol is visible but
4055       "locked" to m or y through a select, perhaps in combination with the
4056       visibility. menuconfig represents this as -M- and -*-, respectively.
4057
4058       For string/hex/int symbols, check if Symbol.visibility is non-0 (non-n)
4059       instead to determine if the value can be changed.
4060
4061       Some handy 'assignable' idioms:
4062
4063         # Is 'sym' an assignable (visible) bool/tristate symbol?
4064         if sym.assignable:
4065             # What's the highest value it can be assigned? [-1] in Python
4066             # gives the last element.
4067             sym_high = sym.assignable[-1]
4068
4069             # The lowest?
4070             sym_low = sym.assignable[0]
4071
4072             # Can the symbol be set to at least m?
4073             if sym.assignable[-1] >= 1:
4074                 ...
4075
4076         # Can the symbol be set to m?
4077         if 1 in sym.assignable:
4078             ...
4079
4080     visibility:
4081       The visibility of the symbol. One of 0, 1, 2, representing n, m, y. See
4082       the module documentation for an overview of symbol values and visibility.
4083
4084     config_string:
4085       The .config assignment string that would get written out for the symbol
4086       by Kconfig.write_config(). Returns the empty string if no .config
4087       assignment would get written out.
4088
4089       In general, visible symbols, symbols with (active) defaults, and selected
4090       symbols get written out. This includes all non-n-valued bool/tristate
4091       symbols, and all visible string/int/hex symbols.
4092
4093       Symbols with the (no longer needed) 'option env=...' option generate no
4094       configuration output, and neither does the special
4095       'option defconfig_list' symbol.
4096
4097       Tip: This field is useful when generating custom configuration output,
4098       even for non-.config-like formats. To write just the symbols that would
4099       get written out to .config files, do this:
4100
4101         if sym.config_string:
4102             *Write symbol, e.g. by looking sym.str_value*
4103
4104       This is a superset of the symbols written out by write_autoconf().
4105       That function skips all n-valued symbols.
4106
4107       There usually won't be any great harm in just writing all symbols either,
4108       though you might get some special symbols and possibly some "redundant"
4109       n-valued symbol entries in there.
4110
4111     name_and_loc:
4112       Holds a string like
4113
4114         "MY_SYMBOL (defined at foo/Kconfig:12, bar/Kconfig:14)"
4115
4116       , giving the name of the symbol and its definition location(s).
4117
4118       If the symbol is undefined, the location is given as "(undefined)".
4119
4120     nodes:
4121       A list of MenuNodes for this symbol. Will contain a single MenuNode for
4122       most symbols. Undefined and constant symbols have an empty nodes list.
4123       Symbols defined in multiple locations get one node for each location.
4124
4125     choice:
4126       Holds the parent Choice for choice symbols, and None for non-choice
4127       symbols. Doubles as a flag for whether a symbol is a choice symbol.
4128
4129     defaults:
4130       List of (default, cond) tuples for the symbol's 'default' properties. For
4131       example, 'default A && B if C || D' is represented as
4132       ((AND, A, B), (OR, C, D)). If no condition was given, 'cond' is
4133       self.kconfig.y.
4134
4135       Note that 'depends on' and parent dependencies are propagated to
4136       'default' conditions.
4137
4138     selects:
4139       List of (symbol, cond) tuples for the symbol's 'select' properties. For
4140       example, 'select A if B && C' is represented as (A, (AND, B, C)). If no
4141       condition was given, 'cond' is self.kconfig.y.
4142
4143       Note that 'depends on' and parent dependencies are propagated to 'select'
4144       conditions.
4145
4146     implies:
4147       Like 'selects', for imply.
4148
4149     ranges:
4150       List of (low, high, cond) tuples for the symbol's 'range' properties. For
4151       example, 'range 1 2 if A' is represented as (1, 2, A). If there is no
4152       condition, 'cond' is self.kconfig.y.
4153
4154       Note that 'depends on' and parent dependencies are propagated to 'range'
4155       conditions.
4156
4157       Gotcha: 1 and 2 above will be represented as (undefined) Symbols rather
4158       than plain integers. Undefined symbols get their name as their string
4159       value, so this works out. The C tools work the same way.
4160
4161     orig_defaults:
4162     orig_selects:
4163     orig_implies:
4164     orig_ranges:
4165       See the corresponding attributes on the MenuNode class.
4166
4167     rev_dep:
4168       Reverse dependency expression from other symbols selecting this symbol.
4169       Multiple selections get ORed together. A condition on a select is ANDed
4170       with the selecting symbol.
4171
4172       For example, if A has 'select FOO' and B has 'select FOO if C', then
4173       FOO's rev_dep will be (OR, A, (AND, B, C)).
4174
4175     weak_rev_dep:
4176       Like rev_dep, for imply.
4177
4178     direct_dep:
4179       The direct ('depends on') dependencies for the symbol, or self.kconfig.y
4180       if there are no direct dependencies.
4181
4182       This attribute includes any dependencies from surrounding menus and ifs.
4183       Those get propagated to the direct dependencies, and the resulting direct
4184       dependencies in turn get propagated to the conditions of all properties.
4185
4186       If the symbol is defined in multiple locations, the dependencies from the
4187       different locations get ORed together.
4188
4189     referenced:
4190       A set() with all symbols and choices referenced in the properties and
4191       property conditions of the symbol.
4192
4193       Also includes dependencies from surrounding menus and ifs, because those
4194       get propagated to the symbol (see the 'Intro to symbol values' section in
4195       the module docstring).
4196
4197       Choices appear in the dependencies of choice symbols.
4198
4199       For the following definitions, only B and not C appears in A's
4200       'referenced'. To get transitive references, you'll have to recursively
4201       expand 'references' until no new items appear.
4202
4203         config A
4204                 bool
4205                 depends on B
4206
4207         config B
4208                 bool
4209                 depends on C
4210
4211         config C
4212                 bool
4213
4214       See the Symbol.direct_dep attribute if you're only interested in the
4215       direct dependencies of the symbol (its 'depends on'). You can extract the
4216       symbols in it with the global expr_items() function.
4217
4218     env_var:
4219       If the Symbol has an 'option env="FOO"' option, this contains the name
4220       ("FOO") of the environment variable. None for symbols without no
4221       'option env'.
4222
4223       'option env="FOO"' acts like a 'default' property whose value is the
4224       value of $FOO.
4225
4226       Symbols with 'option env' are never written out to .config files, even if
4227       they are visible. env_var corresponds to a flag called SYMBOL_AUTO in the
4228       C implementation.
4229
4230     is_allnoconfig_y:
4231       True if the symbol has 'option allnoconfig_y' set on it. This has no
4232       effect internally (except when printing symbols), but can be checked by
4233       scripts.
4234
4235     is_constant:
4236       True if the symbol is a constant (quoted) symbol.
4237
4238     kconfig:
4239       The Kconfig instance this symbol is from.
4240     """
4241     __slots__ = (
4242         "_cached_assignable",
4243         "_cached_str_val",
4244         "_cached_tri_val",
4245         "_cached_vis",
4246         "_dependents",
4247         "_old_val",
4248         "_visited",
4249         "_was_set",
4250         "_write_to_conf",
4251         "choice",
4252         "defaults",
4253         "direct_dep",
4254         "env_var",
4255         "implies",
4256         "is_allnoconfig_y",
4257         "is_constant",
4258         "kconfig",
4259         "name",
4260         "nodes",
4261         "orig_type",
4262         "ranges",
4263         "rev_dep",
4264         "selects",
4265         "user_value",
4266         "weak_rev_dep",
4267     )
4268
4269     #
4270     # Public interface
4271     #
4272
4273     @property
4274     def type(self):
4275         """
4276         See the class documentation.
4277         """
4278         if self.orig_type is TRISTATE and \
4279            (self.choice and self.choice.tri_value == 2 or
4280             not self.kconfig.modules.tri_value):
4281
4282             return BOOL
4283
4284         return self.orig_type
4285
4286     @property
4287     def str_value(self):
4288         """
4289         See the class documentation.
4290         """
4291         if self._cached_str_val is not None:
4292             return self._cached_str_val
4293
4294         if self.orig_type in _BOOL_TRISTATE:
4295             # Also calculates the visibility, so invalidation safe
4296             self._cached_str_val = TRI_TO_STR[self.tri_value]
4297             return self._cached_str_val
4298
4299         # As a quirk of Kconfig, undefined symbols get their name as their
4300         # string value. This is why things like "FOO = bar" work for seeing if
4301         # FOO has the value "bar".
4302         if not self.orig_type:  # UNKNOWN
4303             self._cached_str_val = self.name
4304             return self.name
4305
4306         val = ""
4307         # Warning: See Symbol._rec_invalidate(), and note that this is a hidden
4308         # function call (property magic)
4309         vis = self.visibility
4310
4311         self._write_to_conf = (vis != 0)
4312
4313         if self.orig_type in _INT_HEX:
4314             # The C implementation checks the user value against the range in a
4315             # separate code path (post-processing after loading a .config).
4316             # Checking all values here instead makes more sense for us. It
4317             # requires that we check for a range first.
4318
4319             base = _TYPE_TO_BASE[self.orig_type]
4320
4321             # Check if a range is in effect
4322             for low_expr, high_expr, cond in self.ranges:
4323                 if expr_value(cond):
4324                     has_active_range = True
4325
4326                     # The zeros are from the C implementation running strtoll()
4327                     # on empty strings
4328                     low = int(low_expr.str_value, base) if \
4329                       _is_base_n(low_expr.str_value, base) else 0
4330                     high = int(high_expr.str_value, base) if \
4331                       _is_base_n(high_expr.str_value, base) else 0
4332
4333                     break
4334             else:
4335                 has_active_range = False
4336
4337             # Defaults are used if the symbol is invisible, lacks a user value,
4338             # or has an out-of-range user value
4339             use_defaults = True
4340
4341             if vis and self.user_value:
4342                 user_val = int(self.user_value, base)
4343                 if has_active_range and not low <= user_val <= high:
4344                     num2str = str if base == 10 else hex
4345                     self.kconfig._warn(
4346                         "user value {} on the {} symbol {} ignored due to "
4347                         "being outside the active range ([{}, {}]) -- falling "
4348                         "back on defaults"
4349                         .format(num2str(user_val), TYPE_TO_STR[self.orig_type],
4350                                 self.name_and_loc,
4351                                 num2str(low), num2str(high)))
4352                 else:
4353                     # If the user value is well-formed and satisfies range
4354                     # contraints, it is stored in exactly the same form as
4355                     # specified in the assignment (with or without "0x", etc.)
4356                     val = self.user_value
4357                     use_defaults = False
4358
4359             if use_defaults:
4360                 # No user value or invalid user value. Look at defaults.
4361
4362                 # Used to implement the warning below
4363                 has_default = False
4364
4365                 for sym, cond in self.defaults:
4366                     if expr_value(cond):
4367                         has_default = self._write_to_conf = True
4368
4369                         val = sym.str_value
4370
4371                         if _is_base_n(val, base):
4372                             val_num = int(val, base)
4373                         else:
4374                             val_num = 0  # strtoll() on empty string
4375
4376                         break
4377                 else:
4378                     val_num = 0  # strtoll() on empty string
4379
4380                 # This clamping procedure runs even if there's no default
4381                 if has_active_range:
4382                     clamp = None
4383                     if val_num < low:
4384                         clamp = low
4385                     elif val_num > high:
4386                         clamp = high
4387
4388                     if clamp is not None:
4389                         # The value is rewritten to a standard form if it is
4390                         # clamped
4391                         val = str(clamp) \
4392                               if self.orig_type is INT else \
4393                               hex(clamp)
4394
4395                         if has_default:
4396                             num2str = str if base == 10 else hex
4397                             self.kconfig._warn(
4398                                 "default value {} on {} clamped to {} due to "
4399                                 "being outside the active range ([{}, {}])"
4400                                 .format(val_num, self.name_and_loc,
4401                                         num2str(clamp), num2str(low),
4402                                         num2str(high)))
4403
4404         elif self.orig_type is STRING:
4405             if vis and self.user_value is not None:
4406                 # If the symbol is visible and has a user value, use that
4407                 val = self.user_value
4408             else:
4409                 # Otherwise, look at defaults
4410                 for sym, cond in self.defaults:
4411                     if expr_value(cond):
4412                         val = sym.str_value
4413                         self._write_to_conf = True
4414                         break
4415
4416         # env_var corresponds to SYMBOL_AUTO in the C implementation, and is
4417         # also set on the defconfig_list symbol there. Test for the
4418         # defconfig_list symbol explicitly instead here, to avoid a nonsensical
4419         # env_var setting and the defconfig_list symbol being printed
4420         # incorrectly. This code is pretty cold anyway.
4421         if self.env_var is not None or self is self.kconfig.defconfig_list:
4422             self._write_to_conf = False
4423
4424         self._cached_str_val = val
4425         return val
4426
4427     @property
4428     def tri_value(self):
4429         """
4430         See the class documentation.
4431         """
4432         if self._cached_tri_val is not None:
4433             return self._cached_tri_val
4434
4435         if self.orig_type not in _BOOL_TRISTATE:
4436             if self.orig_type:  # != UNKNOWN
4437                 # Would take some work to give the location here
4438                 self.kconfig._warn(
4439                     "The {} symbol {} is being evaluated in a logical context "
4440                     "somewhere. It will always evaluate to n."
4441                     .format(TYPE_TO_STR[self.orig_type], self.name_and_loc))
4442
4443             self._cached_tri_val = 0
4444             return 0
4445
4446         # Warning: See Symbol._rec_invalidate(), and note that this is a hidden
4447         # function call (property magic)
4448         vis = self.visibility
4449         self._write_to_conf = (vis != 0)
4450
4451         val = 0
4452
4453         if not self.choice:
4454             # Non-choice symbol
4455
4456             if vis and self.user_value is not None:
4457                 # If the symbol is visible and has a user value, use that
4458                 val = min(self.user_value, vis)
4459
4460             else:
4461                 # Otherwise, look at defaults and weak reverse dependencies
4462                 # (implies)
4463
4464                 for default, cond in self.defaults:
4465                     dep_val = expr_value(cond)
4466                     if dep_val:
4467                         val = min(expr_value(default), dep_val)
4468                         if val:
4469                             self._write_to_conf = True
4470                         break
4471
4472                 # Weak reverse dependencies are only considered if our
4473                 # direct dependencies are met
4474                 dep_val = expr_value(self.weak_rev_dep)
4475                 if dep_val and expr_value(self.direct_dep):
4476                     val = max(dep_val, val)
4477                     self._write_to_conf = True
4478
4479             # Reverse (select-related) dependencies take precedence
4480             dep_val = expr_value(self.rev_dep)
4481             if dep_val:
4482                 if expr_value(self.direct_dep) < dep_val:
4483                     self._warn_select_unsatisfied_deps()
4484
4485                 val = max(dep_val, val)
4486                 self._write_to_conf = True
4487
4488             # m is promoted to y for (1) bool symbols and (2) symbols with a
4489             # weak_rev_dep (from imply) of y
4490             if val == 1 and \
4491                (self.type is BOOL or expr_value(self.weak_rev_dep) == 2):
4492                 val = 2
4493
4494         elif vis == 2:
4495             # Visible choice symbol in y-mode choice. The choice mode limits
4496             # the visibility of choice symbols, so it's sufficient to just
4497             # check the visibility of the choice symbols themselves.
4498             val = 2 if self.choice.selection is self else 0
4499
4500         elif vis and self.user_value:
4501             # Visible choice symbol in m-mode choice, with set non-0 user value
4502             val = 1
4503
4504         self._cached_tri_val = val
4505         return val
4506
4507     @property
4508     def assignable(self):
4509         """
4510         See the class documentation.
4511         """
4512         if self._cached_assignable is None:
4513             self._cached_assignable = self._assignable()
4514         return self._cached_assignable
4515
4516     @property
4517     def visibility(self):
4518         """
4519         See the class documentation.
4520         """
4521         if self._cached_vis is None:
4522             self._cached_vis = _visibility(self)
4523         return self._cached_vis
4524
4525     @property
4526     def config_string(self):
4527         """
4528         See the class documentation.
4529         """
4530         # _write_to_conf is determined when the value is calculated. This is a
4531         # hidden function call due to property magic.
4532         val = self.str_value
4533         if not self._write_to_conf:
4534             return ""
4535
4536         if self.orig_type in _BOOL_TRISTATE:
4537             return "{}{}={}\n" \
4538                    .format(self.kconfig.config_prefix, self.name, val) \
4539                    if val != "n" else \
4540                    "# {}{} is not set\n" \
4541                    .format(self.kconfig.config_prefix, self.name)
4542
4543         if self.orig_type in _INT_HEX:
4544             return "{}{}={}\n" \
4545                    .format(self.kconfig.config_prefix, self.name, val)
4546
4547         # sym.orig_type is STRING
4548         return '{}{}="{}"\n' \
4549                .format(self.kconfig.config_prefix, self.name, escape(val))
4550
4551     @property
4552     def name_and_loc(self):
4553         """
4554         See the class documentation.
4555         """
4556         return self.name + " " + _locs(self)
4557
4558     def set_value(self, value):
4559         """
4560         Sets the user value of the symbol.
4561
4562         Equal in effect to assigning the value to the symbol within a .config
4563         file. For bool and tristate symbols, use the 'assignable' attribute to
4564         check which values can currently be assigned. Setting values outside
4565         'assignable' will cause Symbol.user_value to differ from
4566         Symbol.str/tri_value (be truncated down or up).
4567
4568         Setting a choice symbol to 2 (y) sets Choice.user_selection to the
4569         choice symbol in addition to setting Symbol.user_value.
4570         Choice.user_selection is considered when the choice is in y mode (the
4571         "normal" mode).
4572
4573         Other symbols that depend (possibly indirectly) on this symbol are
4574         automatically recalculated to reflect the assigned value.
4575
4576         value:
4577           The user value to give to the symbol. For bool and tristate symbols,
4578           n/m/y can be specified either as 0/1/2 (the usual format for tristate
4579           values in Kconfiglib) or as one of the strings "n", "m", or "y". For
4580           other symbol types, pass a string.
4581
4582           Note that the value for an int/hex symbol is passed as a string, e.g.
4583           "123" or "0x0123". The format of this string is preserved in the
4584           output.
4585
4586           Values that are invalid for the type (such as "foo" or 1 (m) for a
4587           BOOL or "0x123" for an INT) are ignored and won't be stored in
4588           Symbol.user_value. Kconfiglib will print a warning by default for
4589           invalid assignments, and set_value() will return False.
4590
4591         Returns True if the value is valid for the type of the symbol, and
4592         False otherwise. This only looks at the form of the value. For BOOL and
4593         TRISTATE symbols, check the Symbol.assignable attribute to see what
4594         values are currently in range and would actually be reflected in the
4595         value of the symbol. For other symbol types, check whether the
4596         visibility is non-n.
4597         """
4598         if self.orig_type in _BOOL_TRISTATE and value in STR_TO_TRI:
4599             value = STR_TO_TRI[value]
4600
4601         # If the new user value matches the old, nothing changes, and we can
4602         # avoid invalidating cached values.
4603         #
4604         # This optimization is skipped for choice symbols: Setting a choice
4605         # symbol's user value to y might change the state of the choice, so it
4606         # wouldn't be safe (symbol user values always match the values set in a
4607         # .config file or via set_value(), and are never implicitly updated).
4608         if value == self.user_value and not self.choice:
4609             self._was_set = True
4610             return True
4611
4612         # Check if the value is valid for our type
4613         if not (self.orig_type is BOOL     and value in (2, 0)     or
4614                 self.orig_type is TRISTATE and value in TRI_TO_STR or
4615                 value.__class__ is str and
4616                 (self.orig_type is STRING                        or
4617                  self.orig_type is INT and _is_base_n(value, 10) or
4618                  self.orig_type is HEX and _is_base_n(value, 16)
4619                                        and int(value, 16) >= 0)):
4620
4621             # Display tristate values as n, m, y in the warning
4622             self.kconfig._warn(
4623                 "the value {} is invalid for {}, which has type {} -- "
4624                 "assignment ignored"
4625                 .format(TRI_TO_STR[value] if value in TRI_TO_STR else
4626                             "'{}'".format(value),
4627                         self.name_and_loc, TYPE_TO_STR[self.orig_type]))
4628
4629             return False
4630
4631         self.user_value = value
4632         self._was_set = True
4633
4634         if self.choice and value == 2:
4635             # Setting a choice symbol to y makes it the user selection of the
4636             # choice. Like for symbol user values, the user selection is not
4637             # guaranteed to match the actual selection of the choice, as
4638             # dependencies come into play.
4639             self.choice.user_selection = self
4640             self.choice._was_set = True
4641             self.choice._rec_invalidate()
4642         else:
4643             self._rec_invalidate_if_has_prompt()
4644
4645         return True
4646
4647     def unset_value(self):
4648         """
4649         Removes any user value from the symbol, as if the symbol had never
4650         gotten a user value via Kconfig.load_config() or Symbol.set_value().
4651         """
4652         if self.user_value is not None:
4653             self.user_value = None
4654             self._rec_invalidate_if_has_prompt()
4655
4656     @property
4657     def referenced(self):
4658         """
4659         See the class documentation.
4660         """
4661         return {item for node in self.nodes for item in node.referenced}
4662
4663     @property
4664     def orig_defaults(self):
4665         """
4666         See the class documentation.
4667         """
4668         return [d for node in self.nodes for d in node.orig_defaults]
4669
4670     @property
4671     def orig_selects(self):
4672         """
4673         See the class documentation.
4674         """
4675         return [s for node in self.nodes for s in node.orig_selects]
4676
4677     @property
4678     def orig_implies(self):
4679         """
4680         See the class documentation.
4681         """
4682         return [i for node in self.nodes for i in node.orig_implies]
4683
4684     @property
4685     def orig_ranges(self):
4686         """
4687         See the class documentation.
4688         """
4689         return [r for node in self.nodes for r in node.orig_ranges]
4690
4691     def __repr__(self):
4692         """
4693         Returns a string with information about the symbol (including its name,
4694         value, visibility, and location(s)) when it is evaluated on e.g. the
4695         interactive Python prompt.
4696         """
4697         fields = ["symbol " + self.name, TYPE_TO_STR[self.type]]
4698         add = fields.append
4699
4700         for node in self.nodes:
4701             if node.prompt:
4702                 add('"{}"'.format(node.prompt[0]))
4703
4704         # Only add quotes for non-bool/tristate symbols
4705         add("value " + (self.str_value if self.orig_type in _BOOL_TRISTATE
4706                         else '"{}"'.format(self.str_value)))
4707
4708         if not self.is_constant:
4709             # These aren't helpful to show for constant symbols
4710
4711             if self.user_value is not None:
4712                 # Only add quotes for non-bool/tristate symbols
4713                 add("user value " + (TRI_TO_STR[self.user_value]
4714                                      if self.orig_type in _BOOL_TRISTATE
4715                                      else '"{}"'.format(self.user_value)))
4716
4717             add("visibility " + TRI_TO_STR[self.visibility])
4718
4719             if self.choice:
4720                 add("choice symbol")
4721
4722             if self.is_allnoconfig_y:
4723                 add("allnoconfig_y")
4724
4725             if self is self.kconfig.defconfig_list:
4726                 add("is the defconfig_list symbol")
4727
4728             if self.env_var is not None:
4729                 add("from environment variable " + self.env_var)
4730
4731             if self is self.kconfig.modules:
4732                 add("is the modules symbol")
4733
4734             add("direct deps " + TRI_TO_STR[expr_value(self.direct_dep)])
4735
4736         if self.nodes:
4737             for node in self.nodes:
4738                 add("{}:{}".format(node.filename, node.linenr))
4739         else:
4740             add("constant" if self.is_constant else "undefined")
4741
4742         return "<{}>".format(", ".join(fields))
4743
4744     def __str__(self):
4745         """
4746         Returns a string representation of the symbol when it is printed.
4747         Matches the Kconfig format, with any parent dependencies propagated to
4748         the 'depends on' condition.
4749
4750         The string is constructed by joining the strings returned by
4751         MenuNode.__str__() for each of the symbol's menu nodes, so symbols
4752         defined in multiple locations will return a string with all
4753         definitions.
4754
4755         The returned string does not end in a newline. An empty string is
4756         returned for undefined and constant symbols.
4757         """
4758         return self.custom_str(standard_sc_expr_str)
4759
4760     def custom_str(self, sc_expr_str_fn):
4761         """
4762         Works like Symbol.__str__(), but allows a custom format to be used for
4763         all symbol/choice references. See expr_str().
4764         """
4765         return "\n\n".join(node.custom_str(sc_expr_str_fn)
4766                            for node in self.nodes)
4767
4768     #
4769     # Private methods
4770     #
4771
4772     def __init__(self):
4773         """
4774         Symbol constructor -- not intended to be called directly by Kconfiglib
4775         clients.
4776         """
4777         # These attributes are always set on the instance from outside and
4778         # don't need defaults:
4779         #   kconfig
4780         #   direct_dep
4781         #   is_constant
4782         #   name
4783         #   rev_dep
4784         #   weak_rev_dep
4785
4786         # - UNKNOWN == 0
4787         # - _visited is used during tree iteration and dep. loop detection
4788         self.orig_type = self._visited = 0
4789
4790         self.nodes = []
4791
4792         self.defaults = []
4793         self.selects = []
4794         self.implies = []
4795         self.ranges = []
4796
4797         self.user_value = \
4798         self.choice = \
4799         self.env_var = \
4800         self._cached_str_val = self._cached_tri_val = self._cached_vis = \
4801         self._cached_assignable = None
4802
4803         # _write_to_conf is calculated along with the value. If True, the
4804         # Symbol gets a .config entry.
4805
4806         self.is_allnoconfig_y = \
4807         self._was_set = \
4808         self._write_to_conf = False
4809
4810         # See Kconfig._build_dep()
4811         self._dependents = set()
4812
4813     def _assignable(self):
4814         # Worker function for the 'assignable' attribute
4815
4816         if self.orig_type not in _BOOL_TRISTATE:
4817             return ()
4818
4819         # Warning: See Symbol._rec_invalidate(), and note that this is a hidden
4820         # function call (property magic)
4821         vis = self.visibility
4822         if not vis:
4823             return ()
4824
4825         rev_dep_val = expr_value(self.rev_dep)
4826
4827         if vis == 2:
4828             if self.choice:
4829                 return (2,)
4830
4831             if not rev_dep_val:
4832                 if self.type is BOOL or expr_value(self.weak_rev_dep) == 2:
4833                     return (0, 2)
4834                 return (0, 1, 2)
4835
4836             if rev_dep_val == 2:
4837                 return (2,)
4838
4839             # rev_dep_val == 1
4840
4841             if self.type is BOOL or expr_value(self.weak_rev_dep) == 2:
4842                 return (2,)
4843             return (1, 2)
4844
4845         # vis == 1
4846
4847         # Must be a tristate here, because bool m visibility gets promoted to y
4848
4849         if not rev_dep_val:
4850             return (0, 1) if expr_value(self.weak_rev_dep) != 2 else (0, 2)
4851
4852         if rev_dep_val == 2:
4853             return (2,)
4854
4855         # vis == rev_dep_val == 1
4856
4857         return (1,)
4858
4859     def _invalidate(self):
4860         # Marks the symbol as needing to be recalculated
4861
4862         self._cached_str_val = self._cached_tri_val = self._cached_vis = \
4863         self._cached_assignable = None
4864
4865     def _rec_invalidate(self):
4866         # Invalidates the symbol and all items that (possibly) depend on it
4867
4868         if self is self.kconfig.modules:
4869             # Invalidating MODULES has wide-ranging effects
4870             self.kconfig._invalidate_all()
4871         else:
4872             self._invalidate()
4873
4874             for item in self._dependents:
4875                 # _cached_vis doubles as a flag that tells us whether 'item'
4876                 # has cached values, because it's calculated as a side effect
4877                 # of calculating all other (non-constant) cached values.
4878                 #
4879                 # If item._cached_vis is None, it means there can't be cached
4880                 # values on other items that depend on 'item', because if there
4881                 # were, some value on 'item' would have been calculated and
4882                 # item._cached_vis set as a side effect. It's therefore safe to
4883                 # stop the invalidation at symbols with _cached_vis None.
4884                 #
4885                 # This approach massively speeds up scripts that set a lot of
4886                 # values, vs simply invalidating all possibly dependent symbols
4887                 # (even when you already have a list of all the dependent
4888                 # symbols, because some symbols get huge dependency trees).
4889                 #
4890                 # This gracefully handles dependency loops too, which is nice
4891                 # for choices, where the choice depends on the choice symbols
4892                 # and vice versa.
4893                 if item._cached_vis is not None:
4894                     item._rec_invalidate()
4895
4896     def _rec_invalidate_if_has_prompt(self):
4897         # Invalidates the symbol and its dependent symbols, but only if the
4898         # symbol has a prompt. User values never have an effect on promptless
4899         # symbols, so we skip invalidation for them as an optimization.
4900         #
4901         # This also prevents constant (quoted) symbols from being invalidated
4902         # if set_value() is called on them, which would make them lose their
4903         # value and break things.
4904         #
4905         # Prints a warning if the symbol has no prompt. In some contexts (e.g.
4906         # when loading a .config files) assignments to promptless symbols are
4907         # normal and expected, so the warning can be disabled.
4908
4909         for node in self.nodes:
4910             if node.prompt:
4911                 self._rec_invalidate()
4912                 return
4913
4914         if self.kconfig._warn_assign_no_prompt:
4915             self.kconfig._warn(self.name_and_loc + " has no prompt, meaning "
4916                                "user values have no effect on it")
4917
4918     def _str_default(self):
4919         # write_min_config() helper function. Returns the value the symbol
4920         # would get from defaults if it didn't have a user value. Uses exactly
4921         # the same algorithm as the C implementation (though a bit cleaned up),
4922         # for compatibility.
4923
4924         if self.orig_type in _BOOL_TRISTATE:
4925             val = 0
4926
4927             # Defaults, selects, and implies do not affect choice symbols
4928             if not self.choice:
4929                 for default, cond in self.defaults:
4930                     cond_val = expr_value(cond)
4931                     if cond_val:
4932                         val = min(expr_value(default), cond_val)
4933                         break
4934
4935                 val = max(expr_value(self.rev_dep),
4936                           expr_value(self.weak_rev_dep),
4937                           val)
4938
4939                 # Transpose mod to yes if type is bool (possibly due to modules
4940                 # being disabled)
4941                 if val == 1 and self.type is BOOL:
4942                     val = 2
4943
4944             return TRI_TO_STR[val]
4945
4946         if self.orig_type:  # STRING/INT/HEX
4947             for default, cond in self.defaults:
4948                 if expr_value(cond):
4949                     return default.str_value
4950
4951         return ""
4952
4953     def _warn_select_unsatisfied_deps(self):
4954         # Helper for printing an informative warning when a symbol with
4955         # unsatisfied direct dependencies (dependencies from 'depends on', ifs,
4956         # and menus) is selected by some other symbol. Also warn if a symbol
4957         # whose direct dependencies evaluate to m is selected to y.
4958
4959         msg = "{} has direct dependencies {} with value {}, but is " \
4960               "currently being {}-selected by the following symbols:" \
4961               .format(self.name_and_loc, expr_str(self.direct_dep),
4962                       TRI_TO_STR[expr_value(self.direct_dep)],
4963                       TRI_TO_STR[expr_value(self.rev_dep)])
4964
4965         # The reverse dependencies from each select are ORed together
4966         for select in split_expr(self.rev_dep, OR):
4967             if expr_value(select) <= expr_value(self.direct_dep):
4968                 # Only include selects that exceed the direct dependencies
4969                 continue
4970
4971             # - 'select A if B' turns into A && B
4972             # - 'select A' just turns into A
4973             #
4974             # In both cases, we can split on AND and pick the first operand
4975             selecting_sym = split_expr(select, AND)[0]
4976
4977             msg += "\n - {}, with value {}, direct dependencies {} " \
4978                    "(value: {})" \
4979                    .format(selecting_sym.name_and_loc,
4980                            selecting_sym.str_value,
4981                            expr_str(selecting_sym.direct_dep),
4982                            TRI_TO_STR[expr_value(selecting_sym.direct_dep)])
4983
4984             if select.__class__ is tuple:
4985                 msg += ", and select condition {} (value: {})" \
4986                        .format(expr_str(select[2]),
4987                                TRI_TO_STR[expr_value(select[2])])
4988
4989         self.kconfig._warn(msg)
4990
4991
4992 class Choice(object):
4993     """
4994     Represents a choice statement:
4995
4996       choice
4997           ...
4998       endchoice
4999
5000     The following attributes are available on Choice instances. They should be
5001     treated as read-only, and some are implemented through @property magic (but
5002     are still efficient to access due to internal caching).
5003
5004     Note: Prompts, help texts, and locations are stored in the Choice's
5005     MenuNode(s) rather than in the Choice itself. Check the MenuNode class and
5006     the Choice.nodes attribute. This organization matches the C tools.
5007
5008     name:
5009       The name of the choice, e.g. "FOO" for 'choice FOO', or None if the
5010       Choice has no name.
5011
5012     type:
5013       The type of the choice. One of BOOL, TRISTATE, UNKNOWN. UNKNOWN is for
5014       choices defined without a type where none of the contained symbols have a
5015       type either (otherwise the choice inherits the type of the first symbol
5016       defined with a type).
5017
5018       When running without modules (CONFIG_MODULES=n), TRISTATE choices
5019       magically change type to BOOL. This matches the C tools, and makes sense
5020       for menuconfig-like functionality.
5021
5022     orig_type:
5023       The type as given in the Kconfig file, without any magic applied. Used
5024       when printing the choice.
5025
5026     tri_value:
5027       The tristate value (mode) of the choice. A choice can be in one of three
5028       modes:
5029
5030         0 (n) - The choice is disabled and no symbols can be selected. For
5031                 visible choices, this mode is only possible for choices with
5032                 the 'optional' flag set (see kconfig-language.txt).
5033
5034         1 (m) - Any number of choice symbols can be set to m, the rest will
5035                 be n.
5036
5037         2 (y) - One symbol will be y, the rest n.
5038
5039       Only tristate choices can be in m mode. The visibility of the choice is
5040       an upper bound on the mode, and the mode in turn is an upper bound on the
5041       visibility of the choice symbols.
5042
5043       To change the mode, use Choice.set_value().
5044
5045       Implementation note:
5046         The C tools internally represent choices as a type of symbol, with
5047         special-casing in many code paths. This is why there is a lot of
5048         similarity to Symbol. The value (mode) of a choice is really just a
5049         normal symbol value, and an implicit reverse dependency forces its
5050         lower bound to m for visible non-optional choices (the reverse
5051         dependency is 'm && <visibility>').
5052
5053         Symbols within choices get the choice propagated as a dependency to
5054         their properties. This turns the mode of the choice into an upper bound
5055         on e.g. the visibility of choice symbols, and explains the gotcha
5056         related to printing choice symbols mentioned in the module docstring.
5057
5058         Kconfiglib uses a separate Choice class only because it makes the code
5059         and interface less confusing (especially in a user-facing interface).
5060         Corresponding attributes have the same name in the Symbol and Choice
5061         classes, for consistency and compatibility.
5062
5063     str_value:
5064       Like choice.tri_value, but gives the value as one of the strings
5065       "n", "m", or "y"
5066
5067     user_value:
5068       The value (mode) selected by the user through Choice.set_value(). Either
5069       0, 1, or 2, or None if the user hasn't selected a mode. See
5070       Symbol.user_value.
5071
5072       WARNING: Do not assign directly to this. It will break things. Use
5073       Choice.set_value() instead.
5074
5075     assignable:
5076       See the symbol class documentation. Gives the assignable values (modes).
5077
5078     selection:
5079       The Symbol instance of the currently selected symbol. None if the Choice
5080       is not in y mode or has no selected symbol (due to unsatisfied
5081       dependencies on choice symbols).
5082
5083       WARNING: Do not assign directly to this. It will break things. Call
5084       sym.set_value(2) on the choice symbol you want to select instead.
5085
5086     user_selection:
5087       The symbol selected by the user (by setting it to y). Ignored if the
5088       choice is not in y mode, but still remembered so that the choice "snaps
5089       back" to the user selection if the mode is changed back to y. This might
5090       differ from 'selection' due to unsatisfied dependencies.
5091
5092       WARNING: Do not assign directly to this. It will break things. Call
5093       sym.set_value(2) on the choice symbol to be selected instead.
5094
5095     visibility:
5096       See the Symbol class documentation. Acts on the value (mode).
5097
5098     name_and_loc:
5099       Holds a string like
5100
5101         "<choice MY_CHOICE> (defined at foo/Kconfig:12)"
5102
5103       , giving the name of the choice and its definition location(s). If the
5104       choice has no name (isn't defined with 'choice MY_CHOICE'), then it will
5105       be shown as "<choice>" before the list of locations (always a single one
5106       in that case).
5107
5108     syms:
5109       List of symbols contained in the choice.
5110
5111       Obscure gotcha: If a symbol depends on the previous symbol within a
5112       choice so that an implicit menu is created, it won't be a choice symbol,
5113       and won't be included in 'syms'.
5114
5115     nodes:
5116       A list of MenuNodes for this choice. In practice, the list will probably
5117       always contain a single MenuNode, but it is possible to give a choice a
5118       name and define it in multiple locations.
5119
5120     defaults:
5121       List of (symbol, cond) tuples for the choice's 'defaults' properties. For
5122       example, 'default A if B && C' is represented as (A, (AND, B, C)). If
5123       there is no condition, 'cond' is self.kconfig.y.
5124
5125       Note that 'depends on' and parent dependencies are propagated to
5126       'default' conditions.
5127
5128     orig_defaults:
5129       See the corresponding attribute on the MenuNode class.
5130
5131     direct_dep:
5132       See Symbol.direct_dep.
5133
5134     referenced:
5135       A set() with all symbols referenced in the properties and property
5136       conditions of the choice.
5137
5138       Also includes dependencies from surrounding menus and ifs, because those
5139       get propagated to the choice (see the 'Intro to symbol values' section in
5140       the module docstring).
5141
5142     is_optional:
5143       True if the choice has the 'optional' flag set on it and can be in
5144       n mode.
5145
5146     kconfig:
5147       The Kconfig instance this choice is from.
5148     """
5149     __slots__ = (
5150         "_cached_assignable",
5151         "_cached_selection",
5152         "_cached_vis",
5153         "_dependents",
5154         "_visited",
5155         "_was_set",
5156         "defaults",
5157         "direct_dep",
5158         "is_constant",
5159         "is_optional",
5160         "kconfig",
5161         "name",
5162         "nodes",
5163         "orig_type",
5164         "syms",
5165         "user_selection",
5166         "user_value",
5167     )
5168
5169     #
5170     # Public interface
5171     #
5172
5173     @property
5174     def type(self):
5175         """
5176         Returns the type of the choice. See Symbol.type.
5177         """
5178         if self.orig_type is TRISTATE and not self.kconfig.modules.tri_value:
5179             return BOOL
5180         return self.orig_type
5181
5182     @property
5183     def str_value(self):
5184         """
5185         See the class documentation.
5186         """
5187         return TRI_TO_STR[self.tri_value]
5188
5189     @property
5190     def tri_value(self):
5191         """
5192         See the class documentation.
5193         """
5194         # This emulates a reverse dependency of 'm && visibility' for
5195         # non-optional choices, which is how the C implementation does it
5196
5197         val = 0 if self.is_optional else 1
5198
5199         if self.user_value is not None:
5200             val = max(val, self.user_value)
5201
5202         # Warning: See Symbol._rec_invalidate(), and note that this is a hidden
5203         # function call (property magic)
5204         val = min(val, self.visibility)
5205
5206         # Promote m to y for boolean choices
5207         return 2 if val == 1 and self.type is BOOL else val
5208
5209     @property
5210     def assignable(self):
5211         """
5212         See the class documentation.
5213         """
5214         if self._cached_assignable is None:
5215             self._cached_assignable = self._assignable()
5216         return self._cached_assignable
5217
5218     @property
5219     def visibility(self):
5220         """
5221         See the class documentation.
5222         """
5223         if self._cached_vis is None:
5224             self._cached_vis = _visibility(self)
5225         return self._cached_vis
5226
5227     @property
5228     def name_and_loc(self):
5229         """
5230         See the class documentation.
5231         """
5232         # Reuse the expression format, which is '<choice (name, if any)>'.
5233         return standard_sc_expr_str(self) + " " + _locs(self)
5234
5235     @property
5236     def selection(self):
5237         """
5238         See the class documentation.
5239         """
5240         if self._cached_selection is _NO_CACHED_SELECTION:
5241             self._cached_selection = self._selection()
5242         return self._cached_selection
5243
5244     def set_value(self, value):
5245         """
5246         Sets the user value (mode) of the choice. Like for Symbol.set_value(),
5247         the visibility might truncate the value. Choices without the 'optional'
5248         attribute (is_optional) can never be in n mode, but 0/"n" is still
5249         accepted since it's not a malformed value (though it will have no
5250         effect).
5251
5252         Returns True if the value is valid for the type of the choice, and
5253         False otherwise. This only looks at the form of the value. Check the
5254         Choice.assignable attribute to see what values are currently in range
5255         and would actually be reflected in the mode of the choice.
5256         """
5257         if value in STR_TO_TRI:
5258             value = STR_TO_TRI[value]
5259
5260         if value == self.user_value:
5261             # We know the value must be valid if it was successfully set
5262             # previously
5263             self._was_set = True
5264             return True
5265
5266         if not (self.orig_type is BOOL     and value in (2, 0) or
5267                 self.orig_type is TRISTATE and value in TRI_TO_STR):
5268
5269             # Display tristate values as n, m, y in the warning
5270             self.kconfig._warn(
5271                 "the value {} is invalid for {}, which has type {} -- "
5272                 "assignment ignored"
5273                 .format(TRI_TO_STR[value] if value in TRI_TO_STR else
5274                             "'{}'".format(value),
5275                         self.name_and_loc, TYPE_TO_STR[self.orig_type]))
5276
5277             return False
5278
5279         self.user_value = value
5280         self._was_set = True
5281         self._rec_invalidate()
5282
5283         return True
5284
5285     def unset_value(self):
5286         """
5287         Resets the user value (mode) and user selection of the Choice, as if
5288         the user had never touched the mode or any of the choice symbols.
5289         """
5290         if self.user_value is not None or self.user_selection:
5291             self.user_value = self.user_selection = None
5292             self._rec_invalidate()
5293
5294     @property
5295     def referenced(self):
5296         """
5297         See the class documentation.
5298         """
5299         return {item for node in self.nodes for item in node.referenced}
5300
5301     @property
5302     def orig_defaults(self):
5303         """
5304         See the class documentation.
5305         """
5306         return [d for node in self.nodes for d in node.orig_defaults]
5307
5308     def __repr__(self):
5309         """
5310         Returns a string with information about the choice when it is evaluated
5311         on e.g. the interactive Python prompt.
5312         """
5313         fields = ["choice " + self.name if self.name else "choice",
5314                   TYPE_TO_STR[self.type]]
5315         add = fields.append
5316
5317         for node in self.nodes:
5318             if node.prompt:
5319                 add('"{}"'.format(node.prompt[0]))
5320
5321         add("mode " + self.str_value)
5322
5323         if self.user_value is not None:
5324             add('user mode {}'.format(TRI_TO_STR[self.user_value]))
5325
5326         if self.selection:
5327             add("{} selected".format(self.selection.name))
5328
5329         if self.user_selection:
5330             user_sel_str = "{} selected by user" \
5331                            .format(self.user_selection.name)
5332
5333             if self.selection is not self.user_selection:
5334                 user_sel_str += " (overridden)"
5335
5336             add(user_sel_str)
5337
5338         add("visibility " + TRI_TO_STR[self.visibility])
5339
5340         if self.is_optional:
5341             add("optional")
5342
5343         for node in self.nodes:
5344             add("{}:{}".format(node.filename, node.linenr))
5345
5346         return "<{}>".format(", ".join(fields))
5347
5348     def __str__(self):
5349         """
5350         Returns a string representation of the choice when it is printed.
5351         Matches the Kconfig format (though without the contained choice
5352         symbols), with any parent dependencies propagated to the 'depends on'
5353         condition.
5354
5355         The returned string does not end in a newline.
5356
5357         See Symbol.__str__() as well.
5358         """
5359         return self.custom_str(standard_sc_expr_str)
5360
5361     def custom_str(self, sc_expr_str_fn):
5362         """
5363         Works like Choice.__str__(), but allows a custom format to be used for
5364         all symbol/choice references. See expr_str().
5365         """
5366         return "\n\n".join(node.custom_str(sc_expr_str_fn)
5367                            for node in self.nodes)
5368
5369     #
5370     # Private methods
5371     #
5372
5373     def __init__(self):
5374         """
5375         Choice constructor -- not intended to be called directly by Kconfiglib
5376         clients.
5377         """
5378         # These attributes are always set on the instance from outside and
5379         # don't need defaults:
5380         #   direct_dep
5381         #   kconfig
5382
5383         # - UNKNOWN == 0
5384         # - _visited is used during dep. loop detection
5385         self.orig_type = self._visited = 0
5386
5387         self.nodes = []
5388
5389         self.syms = []
5390         self.defaults = []
5391
5392         self.name = \
5393         self.user_value = self.user_selection = \
5394         self._cached_vis = self._cached_assignable = None
5395
5396         self._cached_selection = _NO_CACHED_SELECTION
5397
5398         # is_constant is checked by _depend_on(). Just set it to avoid having
5399         # to special-case choices.
5400         self.is_constant = self.is_optional = False
5401
5402         # See Kconfig._build_dep()
5403         self._dependents = set()
5404
5405     def _assignable(self):
5406         # Worker function for the 'assignable' attribute
5407
5408         # Warning: See Symbol._rec_invalidate(), and note that this is a hidden
5409         # function call (property magic)
5410         vis = self.visibility
5411
5412         if not vis:
5413             return ()
5414
5415         if vis == 2:
5416             if not self.is_optional:
5417                 return (2,) if self.type is BOOL else (1, 2)
5418             return (0, 2) if self.type is BOOL else (0, 1, 2)
5419
5420         # vis == 1
5421
5422         return (0, 1) if self.is_optional else (1,)
5423
5424     def _selection(self):
5425         # Worker function for the 'selection' attribute
5426
5427         # Warning: See Symbol._rec_invalidate(), and note that this is a hidden
5428         # function call (property magic)
5429         if self.tri_value != 2:
5430             # Not in y mode, so no selection
5431             return None
5432
5433         # Use the user selection if it's visible
5434         if self.user_selection and self.user_selection.visibility:
5435             return self.user_selection
5436
5437         # Otherwise, check if we have a default
5438         return self._selection_from_defaults()
5439
5440     def _selection_from_defaults(self):
5441         # Check if we have a default
5442         for sym, cond in self.defaults:
5443             # The default symbol must be visible too
5444             if expr_value(cond) and sym.visibility:
5445                 return sym
5446
5447         # Otherwise, pick the first visible symbol, if any
5448         for sym in self.syms:
5449             if sym.visibility:
5450                 return sym
5451
5452         # Couldn't find a selection
5453         return None
5454
5455     def _invalidate(self):
5456         self._cached_vis = self._cached_assignable = None
5457         self._cached_selection = _NO_CACHED_SELECTION
5458
5459     def _rec_invalidate(self):
5460         # See Symbol._rec_invalidate()
5461
5462         self._invalidate()
5463
5464         for item in self._dependents:
5465             if item._cached_vis is not None:
5466                 item._rec_invalidate()
5467
5468
5469 class MenuNode(object):
5470     """
5471     Represents a menu node in the configuration. This corresponds to an entry
5472     in e.g. the 'make menuconfig' interface, though non-visible choices, menus,
5473     and comments also get menu nodes. If a symbol or choice is defined in
5474     multiple locations, it gets one menu node for each location.
5475
5476     The top-level menu node, corresponding to the implicit top-level menu, is
5477     available in Kconfig.top_node.
5478
5479     The menu nodes for a Symbol or Choice can be found in the
5480     Symbol/Choice.nodes attribute. Menus and comments are represented as plain
5481     menu nodes, with their text stored in the prompt attribute (prompt[0]).
5482     This mirrors the C implementation.
5483
5484     The following attributes are available on MenuNode instances. They should
5485     be viewed as read-only.
5486
5487     item:
5488       Either a Symbol, a Choice, or one of the constants MENU and COMMENT.
5489       Menus and comments are represented as plain menu nodes. Ifs are collapsed
5490       (matching the C implementation) and do not appear in the final menu tree.
5491
5492     next:
5493       The following menu node. None if there is no following node.
5494
5495     list:
5496       The first child menu node. None if there are no children.
5497
5498       Choices and menus naturally have children, but Symbols can also have
5499       children because of menus created automatically from dependencies (see
5500       kconfig-language.txt).
5501
5502     parent:
5503       The parent menu node. None if there is no parent.
5504
5505     prompt:
5506       A (string, cond) tuple with the prompt for the menu node and its
5507       conditional expression (which is self.kconfig.y if there is no
5508       condition). None if there is no prompt.
5509
5510       For symbols and choices, the prompt is stored in the MenuNode rather than
5511       the Symbol or Choice instance. For menus and comments, the prompt holds
5512       the text.
5513
5514     defaults:
5515       The 'default' properties for this particular menu node. See
5516       symbol.defaults.
5517
5518       When evaluating defaults, you should use Symbol/Choice.defaults instead,
5519       as it include properties from all menu nodes (a symbol/choice can have
5520       multiple definition locations/menu nodes). MenuNode.defaults is meant for
5521       documentation generation.
5522
5523     selects:
5524       Like MenuNode.defaults, for selects.
5525
5526     implies:
5527       Like MenuNode.defaults, for implies.
5528
5529     ranges:
5530       Like MenuNode.defaults, for ranges.
5531
5532     orig_prompt:
5533     orig_defaults:
5534     orig_selects:
5535     orig_implies:
5536     orig_ranges:
5537       These work the like the corresponding attributes without orig_*, but omit
5538       any dependencies propagated from 'depends on' and surrounding 'if's (the
5539       direct dependencies, stored in MenuNode.dep).
5540
5541       One use for this is generating less cluttered documentation, by only
5542       showing the direct dependencies in one place.
5543
5544     help:
5545       The help text for the menu node for Symbols and Choices. None if there is
5546       no help text. Always stored in the node rather than the Symbol or Choice.
5547       It is possible to have a separate help text at each location if a symbol
5548       is defined in multiple locations.
5549
5550       Trailing whitespace (including a final newline) is stripped from the help
5551       text. This was not the case before Kconfiglib 10.21.0, where the format
5552       was undocumented.
5553
5554     dep:
5555       The direct ('depends on') dependencies for the menu node, or
5556       self.kconfig.y if there are no direct dependencies.
5557
5558       This attribute includes any dependencies from surrounding menus and ifs.
5559       Those get propagated to the direct dependencies, and the resulting direct
5560       dependencies in turn get propagated to the conditions of all properties.
5561
5562       If a symbol or choice is defined in multiple locations, only the
5563       properties defined at a particular location get the corresponding
5564       MenuNode.dep dependencies propagated to them.
5565
5566     visibility:
5567       The 'visible if' dependencies for the menu node (which must represent a
5568       menu), or self.kconfig.y if there are no 'visible if' dependencies.
5569       'visible if' dependencies are recursively propagated to the prompts of
5570       symbols and choices within the menu.
5571
5572     referenced:
5573       A set() with all symbols and choices referenced in the properties and
5574       property conditions of the menu node.
5575
5576       Also includes dependencies inherited from surrounding menus and ifs.
5577       Choices appear in the dependencies of choice symbols.
5578
5579     is_menuconfig:
5580       Set to True if the children of the menu node should be displayed in a
5581       separate menu. This is the case for the following items:
5582
5583         - Menus (node.item == MENU)
5584
5585         - Choices
5586
5587         - Symbols defined with the 'menuconfig' keyword. The children come from
5588           implicitly created submenus, and should be displayed in a separate
5589           menu rather than being indented.
5590
5591       'is_menuconfig' is just a hint on how to display the menu node. It's
5592       ignored internally by Kconfiglib, except when printing symbols.
5593
5594     filename/linenr:
5595       The location where the menu node appears. The filename is relative to
5596       $srctree (or to the current directory if $srctree isn't set), except
5597       absolute paths are used for paths outside $srctree.
5598
5599     include_path:
5600       A tuple of (filename, linenr) tuples, giving the locations of the
5601       'source' statements via which the Kconfig file containing this menu node
5602       was included. The first element is the location of the 'source' statement
5603       in the top-level Kconfig file passed to Kconfig.__init__(), etc.
5604
5605       Note that the Kconfig file of the menu node itself isn't included. Check
5606       'filename' and 'linenr' for that.
5607
5608     kconfig:
5609       The Kconfig instance the menu node is from.
5610     """
5611     __slots__ = (
5612         "dep",
5613         "filename",
5614         "help",
5615         "include_path",
5616         "is_menuconfig",
5617         "item",
5618         "kconfig",
5619         "linenr",
5620         "list",
5621         "next",
5622         "parent",
5623         "prompt",
5624         "visibility",
5625
5626         # Properties
5627         "defaults",
5628         "selects",
5629         "implies",
5630         "ranges",
5631     )
5632
5633     def __init__(self):
5634         # Properties defined on this particular menu node. A local 'depends on'
5635         # only applies to these, in case a symbol is defined in multiple
5636         # locations.
5637         self.defaults = []
5638         self.selects = []
5639         self.implies = []
5640         self.ranges = []
5641
5642     @property
5643     def orig_prompt(self):
5644         """
5645         See the class documentation.
5646         """
5647         if not self.prompt:
5648             return None
5649         return (self.prompt[0], self._strip_dep(self.prompt[1]))
5650
5651     @property
5652     def orig_defaults(self):
5653         """
5654         See the class documentation.
5655         """
5656         return [(default, self._strip_dep(cond))
5657                 for default, cond in self.defaults]
5658
5659     @property
5660     def orig_selects(self):
5661         """
5662         See the class documentation.
5663         """
5664         return [(select, self._strip_dep(cond))
5665                 for select, cond in self.selects]
5666
5667     @property
5668     def orig_implies(self):
5669         """
5670         See the class documentation.
5671         """
5672         return [(imply, self._strip_dep(cond))
5673                 for imply, cond in self.implies]
5674
5675     @property
5676     def orig_ranges(self):
5677         """
5678         See the class documentation.
5679         """
5680         return [(low, high, self._strip_dep(cond))
5681                 for low, high, cond in self.ranges]
5682
5683     @property
5684     def referenced(self):
5685         """
5686         See the class documentation.
5687         """
5688         # self.dep is included to catch dependencies from a lone 'depends on'
5689         # when there are no properties to propagate it to
5690         res = expr_items(self.dep)
5691
5692         if self.prompt:
5693             res |= expr_items(self.prompt[1])
5694
5695         if self.item is MENU:
5696             res |= expr_items(self.visibility)
5697
5698         for value, cond in self.defaults:
5699             res |= expr_items(value)
5700             res |= expr_items(cond)
5701
5702         for value, cond in self.selects:
5703             res.add(value)
5704             res |= expr_items(cond)
5705
5706         for value, cond in self.implies:
5707             res.add(value)
5708             res |= expr_items(cond)
5709
5710         for low, high, cond in self.ranges:
5711             res.add(low)
5712             res.add(high)
5713             res |= expr_items(cond)
5714
5715         return res
5716
5717     def __repr__(self):
5718         """
5719         Returns a string with information about the menu node when it is
5720         evaluated on e.g. the interactive Python prompt.
5721         """
5722         fields = []
5723         add = fields.append
5724
5725         if self.item.__class__ is Symbol:
5726             add("menu node for symbol " + self.item.name)
5727
5728         elif self.item.__class__ is Choice:
5729             s = "menu node for choice"
5730             if self.item.name is not None:
5731                 s += " " + self.item.name
5732             add(s)
5733
5734         elif self.item is MENU:
5735             add("menu node for menu")
5736
5737         else:  # self.item is COMMENT
5738             add("menu node for comment")
5739
5740         if self.prompt:
5741             add('prompt "{}" (visibility {})'.format(
5742                 self.prompt[0], TRI_TO_STR[expr_value(self.prompt[1])]))
5743
5744         if self.item.__class__ is Symbol and self.is_menuconfig:
5745             add("is menuconfig")
5746
5747         add("deps " + TRI_TO_STR[expr_value(self.dep)])
5748
5749         if self.item is MENU:
5750             add("'visible if' deps " + TRI_TO_STR[expr_value(self.visibility)])
5751
5752         if self.item.__class__ in _SYMBOL_CHOICE and self.help is not None:
5753             add("has help")
5754
5755         if self.list:
5756             add("has child")
5757
5758         if self.next:
5759             add("has next")
5760
5761         add("{}:{}".format(self.filename, self.linenr))
5762
5763         return "<{}>".format(", ".join(fields))
5764
5765     def __str__(self):
5766         """
5767         Returns a string representation of the menu node. Matches the Kconfig
5768         format, with any parent dependencies propagated to the 'depends on'
5769         condition.
5770
5771         The output could (almost) be fed back into a Kconfig parser to redefine
5772         the object associated with the menu node. See the module documentation
5773         for a gotcha related to choice symbols.
5774
5775         For symbols and choices with multiple menu nodes (multiple definition
5776         locations), properties that aren't associated with a particular menu
5777         node are shown on all menu nodes ('option env=...', 'optional' for
5778         choices, etc.).
5779
5780         The returned string does not end in a newline.
5781         """
5782         return self.custom_str(standard_sc_expr_str)
5783
5784     def custom_str(self, sc_expr_str_fn):
5785         """
5786         Works like MenuNode.__str__(), but allows a custom format to be used
5787         for all symbol/choice references. See expr_str().
5788         """
5789         return self._menu_comment_node_str(sc_expr_str_fn) \
5790                if self.item in _MENU_COMMENT else \
5791                self._sym_choice_node_str(sc_expr_str_fn)
5792
5793     def _menu_comment_node_str(self, sc_expr_str_fn):
5794         s = '{} "{}"'.format("menu" if self.item is MENU else "comment",
5795                              self.prompt[0])
5796
5797         if self.dep is not self.kconfig.y:
5798             s += "\n\tdepends on {}".format(expr_str(self.dep, sc_expr_str_fn))
5799
5800         if self.item is MENU and self.visibility is not self.kconfig.y:
5801             s += "\n\tvisible if {}".format(expr_str(self.visibility,
5802                                                      sc_expr_str_fn))
5803
5804         return s
5805
5806     def _sym_choice_node_str(self, sc_expr_str_fn):
5807         def indent_add(s):
5808             lines.append("\t" + s)
5809
5810         def indent_add_cond(s, cond):
5811             if cond is not self.kconfig.y:
5812                 s += " if " + expr_str(cond, sc_expr_str_fn)
5813             indent_add(s)
5814
5815         sc = self.item
5816
5817         if sc.__class__ is Symbol:
5818             lines = [("menuconfig " if self.is_menuconfig else "config ")
5819                      + sc.name]
5820         else:
5821             lines = ["choice " + sc.name if sc.name else "choice"]
5822
5823         if sc.orig_type and not self.prompt:  # sc.orig_type != UNKNOWN
5824             # If there's a prompt, we'll use the '<type> "prompt"' shorthand
5825             # instead
5826             indent_add(TYPE_TO_STR[sc.orig_type])
5827
5828         if self.prompt:
5829             if sc.orig_type:
5830                 prefix = TYPE_TO_STR[sc.orig_type]
5831             else:
5832                 # Symbol defined without a type (which generates a warning)
5833                 prefix = "prompt"
5834
5835             indent_add_cond(prefix + ' "{}"'.format(escape(self.prompt[0])),
5836                             self.orig_prompt[1])
5837
5838         if sc.__class__ is Symbol:
5839             if sc.is_allnoconfig_y:
5840                 indent_add("option allnoconfig_y")
5841
5842             if sc is sc.kconfig.defconfig_list:
5843                 indent_add("option defconfig_list")
5844
5845             if sc.env_var is not None:
5846                 indent_add('option env="{}"'.format(sc.env_var))
5847
5848             if sc is sc.kconfig.modules:
5849                 indent_add("option modules")
5850
5851             for low, high, cond in self.orig_ranges:
5852                 indent_add_cond(
5853                     "range {} {}".format(sc_expr_str_fn(low),
5854                                          sc_expr_str_fn(high)),
5855                     cond)
5856
5857         for default, cond in self.orig_defaults:
5858             indent_add_cond("default " + expr_str(default, sc_expr_str_fn),
5859                             cond)
5860
5861         if sc.__class__ is Choice and sc.is_optional:
5862             indent_add("optional")
5863
5864         if sc.__class__ is Symbol:
5865             for select, cond in self.orig_selects:
5866                 indent_add_cond("select " + sc_expr_str_fn(select), cond)
5867
5868             for imply, cond in self.orig_implies:
5869                 indent_add_cond("imply " + sc_expr_str_fn(imply), cond)
5870
5871         if self.dep is not sc.kconfig.y:
5872             indent_add("depends on " + expr_str(self.dep, sc_expr_str_fn))
5873
5874         if self.help is not None:
5875             indent_add("help")
5876             for line in self.help.splitlines():
5877                 indent_add("  " + line)
5878
5879         return "\n".join(lines)
5880
5881     def _strip_dep(self, expr):
5882         # Helper function for removing MenuNode.dep from 'expr'. Uses two
5883         # pieces of internal knowledge: (1) Expressions are reused rather than
5884         # copied, and (2) the direct dependencies always appear at the end.
5885
5886         # ... if dep -> ... if y
5887         if self.dep is expr:
5888             return self.kconfig.y
5889
5890         # (AND, X, dep) -> X
5891         if expr.__class__ is tuple and expr[0] is AND and expr[2] is self.dep:
5892             return expr[1]
5893
5894         return expr
5895
5896
5897 class Variable(object):
5898     """
5899     Represents a preprocessor variable/function.
5900
5901     The following attributes are available:
5902
5903     name:
5904       The name of the variable.
5905
5906     value:
5907       The unexpanded value of the variable.
5908
5909     expanded_value:
5910       The expanded value of the variable. For simple variables (those defined
5911       with :=), this will equal 'value'. Accessing this property will raise a
5912       KconfigError if the expansion seems to be stuck in a loop.
5913
5914       Accessing this field is the same as calling expanded_value_w_args() with
5915       no arguments. I hadn't considered function arguments when adding it. It
5916       is retained for backwards compatibility though.
5917
5918     is_recursive:
5919       True if the variable is recursive (defined with =).
5920     """
5921     __slots__ = (
5922         "_n_expansions",
5923         "is_recursive",
5924         "kconfig",
5925         "name",
5926         "value",
5927     )
5928
5929     @property
5930     def expanded_value(self):
5931         """
5932         See the class documentation.
5933         """
5934         return self.expanded_value_w_args()
5935
5936     def expanded_value_w_args(self, *args):
5937         """
5938         Returns the expanded value of the variable/function. Any arguments
5939         passed will be substituted for $(1), $(2), etc.
5940
5941         Raises a KconfigError if the expansion seems to be stuck in a loop.
5942         """
5943         return self.kconfig._fn_val((self.name,) + args)
5944
5945     def __repr__(self):
5946         return "<variable {}, {}, value '{}'>" \
5947                .format(self.name,
5948                        "recursive" if self.is_recursive else "immediate",
5949                        self.value)
5950
5951
5952 class KconfigError(Exception):
5953     """
5954     Exception raised for Kconfig-related errors.
5955
5956     KconfigError and KconfigSyntaxError are the same class. The
5957     KconfigSyntaxError alias is only maintained for backwards compatibility.
5958     """
5959
5960 KconfigSyntaxError = KconfigError  # Backwards compatibility
5961
5962
5963 class InternalError(Exception):
5964     "Never raised. Kept around for backwards compatibility."
5965
5966
5967 # Workaround:
5968 #
5969 # If 'errno' and 'strerror' are set on IOError, then __str__() always returns
5970 # "[Errno <errno>] <strerror>", ignoring any custom message passed to the
5971 # constructor. By defining our own subclass, we can use a custom message while
5972 # also providing 'errno', 'strerror', and 'filename' to scripts.
5973 class _KconfigIOError(IOError):
5974     def __init__(self, ioerror, msg):
5975         self.msg = msg
5976         super(_KconfigIOError, self).__init__(
5977             ioerror.errno, ioerror.strerror, ioerror.filename)
5978
5979     def __str__(self):
5980         return self.msg
5981
5982
5983 #
5984 # Public functions
5985 #
5986
5987
5988 def expr_value(expr):
5989     """
5990     Evaluates the expression 'expr' to a tristate value. Returns 0 (n), 1 (m),
5991     or 2 (y).
5992
5993     'expr' must be an already-parsed expression from a Symbol, Choice, or
5994     MenuNode property. To evaluate an expression represented as a string, use
5995     Kconfig.eval_string().
5996
5997     Passing subexpressions of expressions to this function works as expected.
5998     """
5999     if expr.__class__ is not tuple:
6000         return expr.tri_value
6001
6002     if expr[0] is AND:
6003         v1 = expr_value(expr[1])
6004         # Short-circuit the n case as an optimization (~5% faster
6005         # allnoconfig.py and allyesconfig.py, as of writing)
6006         return 0 if not v1 else min(v1, expr_value(expr[2]))
6007
6008     if expr[0] is OR:
6009         v1 = expr_value(expr[1])
6010         # Short-circuit the y case as an optimization
6011         return 2 if v1 == 2 else max(v1, expr_value(expr[2]))
6012
6013     if expr[0] is NOT:
6014         return 2 - expr_value(expr[1])
6015
6016     # Relation
6017     #
6018     # Implements <, <=, >, >= comparisons as well. These were added to
6019     # kconfig in 31847b67 (kconfig: allow use of relations other than
6020     # (in)equality).
6021
6022     rel, v1, v2 = expr
6023
6024     # If both operands are strings...
6025     if v1.orig_type is STRING and v2.orig_type is STRING:
6026         # ...then compare them lexicographically
6027         comp = _strcmp(v1.str_value, v2.str_value)
6028     else:
6029         # Otherwise, try to compare them as numbers
6030         try:
6031             comp = _sym_to_num(v1) - _sym_to_num(v2)
6032         except ValueError:
6033             # Fall back on a lexicographic comparison if the operands don't
6034             # parse as numbers
6035             comp = _strcmp(v1.str_value, v2.str_value)
6036
6037     return 2*(comp == 0 if rel is EQUAL else
6038               comp != 0 if rel is UNEQUAL else
6039               comp <  0 if rel is LESS else
6040               comp <= 0 if rel is LESS_EQUAL else
6041               comp >  0 if rel is GREATER else
6042               comp >= 0)
6043
6044
6045 def standard_sc_expr_str(sc):
6046     """
6047     Standard symbol/choice printing function. Uses plain Kconfig syntax, and
6048     displays choices as <choice> (or <choice NAME>, for named choices).
6049
6050     See expr_str().
6051     """
6052     if sc.__class__ is Symbol:
6053         if sc.is_constant and sc.name not in STR_TO_TRI:
6054             return '"{}"'.format(escape(sc.name))
6055         return sc.name
6056
6057     return "<choice {}>".format(sc.name) if sc.name else "<choice>"
6058
6059
6060 def expr_str(expr, sc_expr_str_fn=standard_sc_expr_str):
6061     """
6062     Returns the string representation of the expression 'expr', as in a Kconfig
6063     file.
6064
6065     Passing subexpressions of expressions to this function works as expected.
6066
6067     sc_expr_str_fn (default: standard_sc_expr_str):
6068       This function is called for every symbol/choice (hence "sc") appearing in
6069       the expression, with the symbol/choice as the argument. It is expected to
6070       return a string to be used for the symbol/choice.
6071
6072       This can be used e.g. to turn symbols/choices into links when generating
6073       documentation, or for printing the value of each symbol/choice after it.
6074
6075       Note that quoted values are represented as constants symbols
6076       (Symbol.is_constant == True).
6077     """
6078     if expr.__class__ is not tuple:
6079         return sc_expr_str_fn(expr)
6080
6081     if expr[0] is AND:
6082         return "{} && {}".format(_parenthesize(expr[1], OR, sc_expr_str_fn),
6083                                  _parenthesize(expr[2], OR, sc_expr_str_fn))
6084
6085     if expr[0] is OR:
6086         # This turns A && B || C && D into "(A && B) || (C && D)", which is
6087         # redundant, but more readable
6088         return "{} || {}".format(_parenthesize(expr[1], AND, sc_expr_str_fn),
6089                                  _parenthesize(expr[2], AND, sc_expr_str_fn))
6090
6091     if expr[0] is NOT:
6092         if expr[1].__class__ is tuple:
6093             return "!({})".format(expr_str(expr[1], sc_expr_str_fn))
6094         return "!" + sc_expr_str_fn(expr[1])  # Symbol
6095
6096     # Relation
6097     #
6098     # Relation operands are always symbols (quoted strings are constant
6099     # symbols)
6100     return "{} {} {}".format(sc_expr_str_fn(expr[1]), REL_TO_STR[expr[0]],
6101                              sc_expr_str_fn(expr[2]))
6102
6103
6104 def expr_items(expr):
6105     """
6106     Returns a set() of all items (symbols and choices) that appear in the
6107     expression 'expr'.
6108
6109     Passing subexpressions of expressions to this function works as expected.
6110     """
6111     res = set()
6112
6113     def rec(subexpr):
6114         if subexpr.__class__ is tuple:
6115             # AND, OR, NOT, or relation
6116
6117             rec(subexpr[1])
6118
6119             # NOTs only have a single operand
6120             if subexpr[0] is not NOT:
6121                 rec(subexpr[2])
6122
6123         else:
6124             # Symbol or choice
6125             res.add(subexpr)
6126
6127     rec(expr)
6128     return res
6129
6130
6131 def split_expr(expr, op):
6132     """
6133     Returns a list containing the top-level AND or OR operands in the
6134     expression 'expr', in the same (left-to-right) order as they appear in
6135     the expression.
6136
6137     This can be handy e.g. for splitting (weak) reverse dependencies
6138     from 'select' and 'imply' into individual selects/implies.
6139
6140     op:
6141       Either AND to get AND operands, or OR to get OR operands.
6142
6143       (Having this as an operand might be more future-safe than having two
6144       hardcoded functions.)
6145
6146
6147     Pseudo-code examples:
6148
6149       split_expr( A                    , OR  )  ->  [A]
6150       split_expr( A && B               , OR  )  ->  [A && B]
6151       split_expr( A || B               , OR  )  ->  [A, B]
6152       split_expr( A || B               , AND )  ->  [A || B]
6153       split_expr( A || B || (C && D)   , OR  )  ->  [A, B, C && D]
6154
6155       # Second || is not at the top level
6156       split_expr( A || (B && (C || D)) , OR )  ->  [A, B && (C || D)]
6157
6158       # Parentheses don't matter as long as we stay at the top level (don't
6159       # encounter any non-'op' nodes)
6160       split_expr( (A || B) || C        , OR )  ->  [A, B, C]
6161       split_expr( A || (B || C)        , OR )  ->  [A, B, C]
6162     """
6163     res = []
6164
6165     def rec(subexpr):
6166         if subexpr.__class__ is tuple and subexpr[0] is op:
6167             rec(subexpr[1])
6168             rec(subexpr[2])
6169         else:
6170             res.append(subexpr)
6171
6172     rec(expr)
6173     return res
6174
6175
6176 def escape(s):
6177     r"""
6178     Escapes the string 's' in the same fashion as is done for display in
6179     Kconfig format and when writing strings to a .config file. " and \ are
6180     replaced by \" and \\, respectively.
6181     """
6182     # \ must be escaped before " to avoid double escaping
6183     return s.replace("\\", r"\\").replace('"', r'\"')
6184
6185
6186 def unescape(s):
6187     r"""
6188     Unescapes the string 's'. \ followed by any character is replaced with just
6189     that character. Used internally when reading .config files.
6190     """
6191     return _unescape_sub(r"\1", s)
6192
6193 # unescape() helper
6194 _unescape_sub = re.compile(r"\\(.)").sub
6195
6196
6197 def standard_kconfig(description=None):
6198     """
6199     Argument parsing helper for tools that take a single optional Kconfig file
6200     argument (default: Kconfig). Returns the Kconfig instance for the parsed
6201     configuration. Uses argparse internally.
6202
6203     Exits with sys.exit() (which raises SystemExit) on errors.
6204
6205     description (default: None):
6206       The 'description' passed to argparse.ArgumentParser().
6207       argparse.RawDescriptionHelpFormatter is used, so formatting is preserved.
6208     """
6209     import argparse
6210
6211     parser = argparse.ArgumentParser(
6212         formatter_class=argparse.RawDescriptionHelpFormatter,
6213         description=description)
6214
6215     parser.add_argument(
6216         "kconfig",
6217         metavar="KCONFIG",
6218         default="Kconfig",
6219         nargs="?",
6220         help="Top-level Kconfig file (default: Kconfig)")
6221
6222     return Kconfig(parser.parse_args().kconfig, suppress_traceback=True)
6223
6224
6225 def standard_config_filename():
6226     """
6227     Helper for tools. Returns the value of KCONFIG_CONFIG (which specifies the
6228     .config file to load/save) if it is set, and ".config" otherwise.
6229
6230     Calling load_config() with filename=None might give the behavior you want,
6231     without having to use this function.
6232     """
6233     return os.getenv("KCONFIG_CONFIG", ".config")
6234
6235
6236 def load_allconfig(kconf, filename):
6237     """
6238     Use Kconfig.load_allconfig() instead, which was added in Kconfiglib 13.4.0.
6239     Supported for backwards compatibility. Might be removed at some point after
6240     a long period of deprecation warnings.
6241     """
6242     allconfig = os.getenv("KCONFIG_ALLCONFIG")
6243     if allconfig is None:
6244         return
6245
6246     def std_msg(e):
6247         # "Upcasts" a _KconfigIOError to an IOError, removing the custom
6248         # __str__() message. The standard message is better here.
6249         #
6250         # This might also convert an OSError to an IOError in obscure cases,
6251         # but it's probably not a big deal. The distinction is shaky (see
6252         # PEP-3151).
6253         return IOError(e.errno, e.strerror, e.filename)
6254
6255     old_warn_assign_override = kconf.warn_assign_override
6256     old_warn_assign_redun = kconf.warn_assign_redun
6257     kconf.warn_assign_override = kconf.warn_assign_redun = False
6258
6259     if allconfig in ("", "1"):
6260         try:
6261             print(kconf.load_config(filename, False))
6262         except EnvironmentError as e1:
6263             try:
6264                 print(kconf.load_config("all.config", False))
6265             except EnvironmentError as e2:
6266                 sys.exit("error: KCONFIG_ALLCONFIG is set, but neither {} "
6267                          "nor all.config could be opened: {}, {}"
6268                          .format(filename, std_msg(e1), std_msg(e2)))
6269     else:
6270         try:
6271             print(kconf.load_config(allconfig, False))
6272         except EnvironmentError as e:
6273             sys.exit("error: KCONFIG_ALLCONFIG is set to '{}', which "
6274                      "could not be opened: {}"
6275                      .format(allconfig, std_msg(e)))
6276
6277     kconf.warn_assign_override = old_warn_assign_override
6278     kconf.warn_assign_redun = old_warn_assign_redun
6279
6280
6281 #
6282 # Internal functions
6283 #
6284
6285
6286 def _visibility(sc):
6287     # Symbols and Choices have a "visibility" that acts as an upper bound on
6288     # the values a user can set for them, corresponding to the visibility in
6289     # e.g. 'make menuconfig'. This function calculates the visibility for the
6290     # Symbol or Choice 'sc' -- the logic is nearly identical.
6291
6292     vis = 0
6293
6294     for node in sc.nodes:
6295         if node.prompt:
6296             vis = max(vis, expr_value(node.prompt[1]))
6297
6298     if sc.__class__ is Symbol and sc.choice:
6299         if sc.choice.orig_type is TRISTATE and \
6300            sc.orig_type is not TRISTATE and sc.choice.tri_value != 2:
6301             # Non-tristate choice symbols are only visible in y mode
6302             return 0
6303
6304         if sc.orig_type is TRISTATE and vis == 1 and sc.choice.tri_value == 2:
6305             # Choice symbols with m visibility are not visible in y mode
6306             return 0
6307
6308     # Promote m to y if we're dealing with a non-tristate (possibly due to
6309     # modules being disabled)
6310     if vis == 1 and sc.type is not TRISTATE:
6311         return 2
6312
6313     return vis
6314
6315
6316 def _depend_on(sc, expr):
6317     # Adds 'sc' (symbol or choice) as a "dependee" to all symbols in 'expr'.
6318     # Constant symbols in 'expr' are skipped as they can never change value
6319     # anyway.
6320
6321     if expr.__class__ is tuple:
6322         # AND, OR, NOT, or relation
6323
6324         _depend_on(sc, expr[1])
6325
6326         # NOTs only have a single operand
6327         if expr[0] is not NOT:
6328             _depend_on(sc, expr[2])
6329
6330     elif not expr.is_constant:
6331         # Non-constant symbol, or choice
6332         expr._dependents.add(sc)
6333
6334
6335 def _parenthesize(expr, type_, sc_expr_str_fn):
6336     # expr_str() helper. Adds parentheses around expressions of type 'type_'.
6337
6338     if expr.__class__ is tuple and expr[0] is type_:
6339         return "({})".format(expr_str(expr, sc_expr_str_fn))
6340     return expr_str(expr, sc_expr_str_fn)
6341
6342
6343 def _ordered_unique(lst):
6344     # Returns 'lst' with any duplicates removed, preserving order. This hacky
6345     # version seems to be a common idiom. It relies on short-circuit evaluation
6346     # and set.add() returning None, which is falsy.
6347
6348     seen = set()
6349     seen_add = seen.add
6350     return [x for x in lst if x not in seen and not seen_add(x)]
6351
6352
6353 def _is_base_n(s, n):
6354     try:
6355         int(s, n)
6356         return True
6357     except ValueError:
6358         return False
6359
6360
6361 def _strcmp(s1, s2):
6362     # strcmp()-alike that returns -1, 0, or 1
6363
6364     return (s1 > s2) - (s1 < s2)
6365
6366
6367 def _sym_to_num(sym):
6368     # expr_value() helper for converting a symbol to a number. Raises
6369     # ValueError for symbols that can't be converted.
6370
6371     # For BOOL and TRISTATE, n/m/y count as 0/1/2. This mirrors 9059a3493ef
6372     # ("kconfig: fix relational operators for bool and tristate symbols") in
6373     # the C implementation.
6374     return sym.tri_value if sym.orig_type in _BOOL_TRISTATE else \
6375            int(sym.str_value, _TYPE_TO_BASE[sym.orig_type])
6376
6377
6378 def _touch_dep_file(path, sym_name):
6379     # If sym_name is MY_SYM_NAME, touches my/sym/name.h. See the sync_deps()
6380     # docstring.
6381
6382     sym_path = path + os.sep + sym_name.lower().replace("_", os.sep) + ".h"
6383     sym_path_dir = dirname(sym_path)
6384     if not exists(sym_path_dir):
6385         os.makedirs(sym_path_dir, 0o755)
6386
6387     # A kind of truncating touch, mirroring the C tools
6388     os.close(os.open(
6389         sym_path, os.O_WRONLY | os.O_CREAT | os.O_TRUNC, 0o644))
6390
6391
6392 def _save_old(path):
6393     # See write_config()
6394
6395     def copy(src, dst):
6396         # Import as needed, to save some startup time
6397         import shutil
6398         shutil.copyfile(src, dst)
6399
6400     if islink(path):
6401         # Preserve symlinks
6402         copy_fn = copy
6403     elif hasattr(os, "replace"):
6404         # Python 3 (3.3+) only. Best choice when available, because it
6405         # removes <filename>.old on both *nix and Windows.
6406         copy_fn = os.replace
6407     elif os.name == "posix":
6408         # Removes <filename>.old on POSIX systems
6409         copy_fn = os.rename
6410     else:
6411         # Fall back on copying
6412         copy_fn = copy
6413
6414     try:
6415         copy_fn(path, path + ".old")
6416     except Exception:
6417         # Ignore errors from 'path' missing as well as other errors.
6418         # <filename>.old file is usually more of a nice-to-have, and not worth
6419         # erroring out over e.g. if <filename>.old happens to be a directory or
6420         # <filename> is something like /dev/null.
6421         pass
6422
6423
6424 def _locs(sc):
6425     # Symbol/Choice.name_and_loc helper. Returns the "(defined at ...)" part of
6426     # the string. 'sc' is a Symbol or Choice.
6427
6428     if sc.nodes:
6429         return "(defined at {})".format(
6430             ", ".join("{0.filename}:{0.linenr}".format(node)
6431                       for node in sc.nodes))
6432
6433     return "(undefined)"
6434
6435
6436 # Menu manipulation
6437
6438
6439 def _expr_depends_on(expr, sym):
6440     # Reimplementation of expr_depends_symbol() from mconf.c. Used to determine
6441     # if a submenu should be implicitly created. This also influences which
6442     # items inside choice statements are considered choice items.
6443
6444     if expr.__class__ is not tuple:
6445         return expr is sym
6446
6447     if expr[0] in _EQUAL_UNEQUAL:
6448         # Check for one of the following:
6449         # sym = m/y, m/y = sym, sym != n, n != sym
6450
6451         left, right = expr[1:]
6452
6453         if right is sym:
6454             left, right = right, left
6455         elif left is not sym:
6456             return False
6457
6458         return (expr[0] is EQUAL and right is sym.kconfig.m or
6459                                      right is sym.kconfig.y) or \
6460                (expr[0] is UNEQUAL and right is sym.kconfig.n)
6461
6462     return expr[0] is AND and \
6463            (_expr_depends_on(expr[1], sym) or
6464             _expr_depends_on(expr[2], sym))
6465
6466
6467 def _auto_menu_dep(node1, node2):
6468     # Returns True if node2 has an "automatic menu dependency" on node1. If
6469     # node2 has a prompt, we check its condition. Otherwise, we look directly
6470     # at node2.dep.
6471
6472     return _expr_depends_on(node2.prompt[1] if node2.prompt else node2.dep,
6473                             node1.item)
6474
6475
6476 def _flatten(node):
6477     # "Flattens" menu nodes without prompts (e.g. 'if' nodes and non-visible
6478     # symbols with children from automatic menu creation) so that their
6479     # children appear after them instead. This gives a clean menu structure
6480     # with no unexpected "jumps" in the indentation.
6481     #
6482     # Do not flatten promptless choices (which can appear "legitimately" if a
6483     # named choice is defined in multiple locations to add on symbols). It
6484     # looks confusing, and the menuconfig already shows all choice symbols if
6485     # you enter the choice at some location with a prompt.
6486
6487     while node:
6488         if node.list and not node.prompt and \
6489            node.item.__class__ is not Choice:
6490
6491             last_node = node.list
6492             while 1:
6493                 last_node.parent = node.parent
6494                 if not last_node.next:
6495                     break
6496                 last_node = last_node.next
6497
6498             last_node.next = node.next
6499             node.next = node.list
6500             node.list = None
6501
6502         node = node.next
6503
6504
6505 def _remove_ifs(node):
6506     # Removes 'if' nodes (which can be recognized by MenuNode.item being None),
6507     # which are assumed to already have been flattened. The C implementation
6508     # doesn't bother to do this, but we expose the menu tree directly, and it
6509     # makes it nicer to work with.
6510
6511     cur = node.list
6512     while cur and not cur.item:
6513         cur = cur.next
6514
6515     node.list = cur
6516
6517     while cur:
6518         next = cur.next
6519         while next and not next.item:
6520             next = next.next
6521
6522         # Equivalent to
6523         #
6524         #   cur.next = next
6525         #   cur = next
6526         #
6527         # due to tricky Python semantics. The order matters.
6528         cur.next = cur = next
6529
6530
6531 def _finalize_choice(node):
6532     # Finalizes a choice, marking each symbol whose menu node has the choice as
6533     # the parent as a choice symbol, and automatically determining types if not
6534     # specified.
6535
6536     choice = node.item
6537
6538     cur = node.list
6539     while cur:
6540         if cur.item.__class__ is Symbol:
6541             cur.item.choice = choice
6542             choice.syms.append(cur.item)
6543         cur = cur.next
6544
6545     # If no type is specified for the choice, its type is that of
6546     # the first choice item with a specified type
6547     if not choice.orig_type:
6548         for item in choice.syms:
6549             if item.orig_type:
6550                 choice.orig_type = item.orig_type
6551                 break
6552
6553     # Each choice item of UNKNOWN type gets the type of the choice
6554     for sym in choice.syms:
6555         if not sym.orig_type:
6556             sym.orig_type = choice.orig_type
6557
6558
6559 def _check_dep_loop_sym(sym, ignore_choice):
6560     # Detects dependency loops using depth-first search on the dependency graph
6561     # (which is calculated earlier in Kconfig._build_dep()).
6562     #
6563     # Algorithm:
6564     #
6565     #  1. Symbols/choices start out with _visited = 0, meaning unvisited.
6566     #
6567     #  2. When a symbol/choice is first visited, _visited is set to 1, meaning
6568     #     "visited, potentially part of a dependency loop". The recursive
6569     #     search then continues from the symbol/choice.
6570     #
6571     #  3. If we run into a symbol/choice X with _visited already set to 1,
6572     #     there's a dependency loop. The loop is found on the call stack by
6573     #     recording symbols while returning ("on the way back") until X is seen
6574     #     again.
6575     #
6576     #  4. Once a symbol/choice and all its dependencies (or dependents in this
6577     #     case) have been checked recursively without detecting any loops, its
6578     #     _visited is set to 2, meaning "visited, not part of a dependency
6579     #     loop".
6580     #
6581     #     This saves work if we run into the symbol/choice again in later calls
6582     #     to _check_dep_loop_sym(). We just return immediately.
6583     #
6584     # Choices complicate things, as every choice symbol depends on every other
6585     # choice symbol in a sense. When a choice is "entered" via a choice symbol
6586     # X, we visit all choice symbols from the choice except X, and prevent
6587     # immediately revisiting the choice with a flag (ignore_choice).
6588     #
6589     # Maybe there's a better way to handle this (different flags or the
6590     # like...)
6591
6592     if not sym._visited:
6593         # sym._visited == 0, unvisited
6594
6595         sym._visited = 1
6596
6597         for dep in sym._dependents:
6598             # Choices show up in Symbol._dependents when the choice has the
6599             # symbol in a 'prompt' or 'default' condition (e.g.
6600             # 'default ... if SYM').
6601             #
6602             # Since we aren't entering the choice via a choice symbol, all
6603             # choice symbols need to be checked, hence the None.
6604             loop = _check_dep_loop_choice(dep, None) \
6605                    if dep.__class__ is Choice \
6606                    else _check_dep_loop_sym(dep, False)
6607
6608             if loop:
6609                 # Dependency loop found
6610                 return _found_dep_loop(loop, sym)
6611
6612         if sym.choice and not ignore_choice:
6613             loop = _check_dep_loop_choice(sym.choice, sym)
6614             if loop:
6615                 # Dependency loop found
6616                 return _found_dep_loop(loop, sym)
6617
6618         # The symbol is not part of a dependency loop
6619         sym._visited = 2
6620
6621         # No dependency loop found
6622         return None
6623
6624     if sym._visited == 2:
6625         # The symbol was checked earlier and is already known to not be part of
6626         # a dependency loop
6627         return None
6628
6629     # sym._visited == 1, found a dependency loop. Return the symbol as the
6630     # first element in it.
6631     return (sym,)
6632
6633
6634 def _check_dep_loop_choice(choice, skip):
6635     if not choice._visited:
6636         # choice._visited == 0, unvisited
6637
6638         choice._visited = 1
6639
6640         # Check for loops involving choice symbols. If we came here via a
6641         # choice symbol, skip that one, as we'd get a false positive
6642         # '<sym FOO> -> <choice> -> <sym FOO>' loop otherwise.
6643         for sym in choice.syms:
6644             if sym is not skip:
6645                 # Prevent the choice from being immediately re-entered via the
6646                 # "is a choice symbol" path by passing True
6647                 loop = _check_dep_loop_sym(sym, True)
6648                 if loop:
6649                     # Dependency loop found
6650                     return _found_dep_loop(loop, choice)
6651
6652         # The choice is not part of a dependency loop
6653         choice._visited = 2
6654
6655         # No dependency loop found
6656         return None
6657
6658     if choice._visited == 2:
6659         # The choice was checked earlier and is already known to not be part of
6660         # a dependency loop
6661         return None
6662
6663     # choice._visited == 1, found a dependency loop. Return the choice as the
6664     # first element in it.
6665     return (choice,)
6666
6667
6668 def _found_dep_loop(loop, cur):
6669     # Called "on the way back" when we know we have a loop
6670
6671     # Is the symbol/choice 'cur' where the loop started?
6672     if cur is not loop[0]:
6673         # Nope, it's just a part of the loop
6674         return loop + (cur,)
6675
6676     # Yep, we have the entire loop. Throw an exception that shows it.
6677
6678     msg = "\nDependency loop\n" \
6679             "===============\n\n"
6680
6681     for item in loop:
6682         if item is not loop[0]:
6683             msg += "...depends on "
6684             if item.__class__ is Symbol and item.choice:
6685                 msg += "the choice symbol "
6686
6687         msg += "{}, with definition...\n\n{}\n\n" \
6688                .format(item.name_and_loc, item)
6689
6690         # Small wart: Since we reuse the already calculated
6691         # Symbol/Choice._dependents sets for recursive dependency detection, we
6692         # lose information on whether a dependency came from a 'select'/'imply'
6693         # condition or e.g. a 'depends on'.
6694         #
6695         # This might cause selecting symbols to "disappear". For example,
6696         # a symbol B having 'select A if C' gives a direct dependency from A to
6697         # C, since it corresponds to a reverse dependency of B && C.
6698         #
6699         # Always print reverse dependencies for symbols that have them to make
6700         # sure information isn't lost. I wonder if there's some neat way to
6701         # improve this.
6702
6703         if item.__class__ is Symbol:
6704             if item.rev_dep is not item.kconfig.n:
6705                 msg += "(select-related dependencies: {})\n\n" \
6706                        .format(expr_str(item.rev_dep))
6707
6708             if item.weak_rev_dep is not item.kconfig.n:
6709                 msg += "(imply-related dependencies: {})\n\n" \
6710                        .format(expr_str(item.rev_dep))
6711
6712     msg += "...depends again on " + loop[0].name_and_loc
6713
6714     raise KconfigError(msg)
6715
6716
6717 def _decoding_error(e, filename, macro_linenr=None):
6718     # Gives the filename and context for UnicodeDecodeError's, which are a pain
6719     # to debug otherwise. 'e' is the UnicodeDecodeError object.
6720     #
6721     # If the decoding error is for the output of a $(shell,...) command,
6722     # macro_linenr holds the line number where it was run (the exact line
6723     # number isn't available for decoding errors in files).
6724
6725     raise KconfigError(
6726         "\n"
6727         "Malformed {} in {}\n"
6728         "Context: {}\n"
6729         "Problematic data: {}\n"
6730         "Reason: {}".format(
6731             e.encoding,
6732             "'{}'".format(filename) if macro_linenr is None else
6733                 "output from macro at {}:{}".format(filename, macro_linenr),
6734             e.object[max(e.start - 40, 0):e.end + 40],
6735             e.object[e.start:e.end],
6736             e.reason))
6737
6738
6739 def _warn_verbose_deprecated(fn_name):
6740     sys.stderr.write(
6741         "Deprecation warning: {0}()'s 'verbose' argument has no effect. Since "
6742         "Kconfiglib 12.0.0, the message is returned from {0}() instead, "
6743         "and is always generated. Do e.g. print(kconf.{0}()) if you want to "
6744         "want to show a message like \"Loaded configuration '.config'\" on "
6745         "stdout. The old API required ugly hacks to reuse messages in "
6746         "configuration interfaces.\n".format(fn_name))
6747
6748
6749 # Predefined preprocessor functions
6750
6751
6752 def _filename_fn(kconf, _):
6753     return kconf.filename
6754
6755
6756 def _lineno_fn(kconf, _):
6757     return str(kconf.linenr)
6758
6759
6760 def _info_fn(kconf, _, msg):
6761     print("{}:{}: {}".format(kconf.filename, kconf.linenr, msg))
6762
6763     return ""
6764
6765
6766 def _warning_if_fn(kconf, _, cond, msg):
6767     if cond == "y":
6768         kconf._warn(msg, kconf.filename, kconf.linenr)
6769
6770     return ""
6771
6772
6773 def _error_if_fn(kconf, _, cond, msg):
6774     if cond == "y":
6775         raise KconfigError("{}:{}: {}".format(
6776             kconf.filename, kconf.linenr, msg))
6777
6778     return ""
6779
6780
6781 def _shell_fn(kconf, _, command):
6782     import subprocess  # Only import as needed, to save some startup time
6783
6784     stdout, stderr = subprocess.Popen(
6785         command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE
6786     ).communicate()
6787
6788     if not _IS_PY2:
6789         try:
6790             stdout = stdout.decode(kconf._encoding)
6791             stderr = stderr.decode(kconf._encoding)
6792         except UnicodeDecodeError as e:
6793             _decoding_error(e, kconf.filename, kconf.linenr)
6794
6795     if stderr:
6796         kconf._warn("'{}' wrote to stderr: {}".format(
6797                         command, "\n".join(stderr.splitlines())),
6798                     kconf.filename, kconf.linenr)
6799
6800     # Universal newlines with splitlines() (to prevent e.g. stray \r's in
6801     # command output on Windows), trailing newline removal, and
6802     # newline-to-space conversion.
6803     #
6804     # On Python 3 versions before 3.6, it's not possible to specify the
6805     # encoding when passing universal_newlines=True to Popen() (the 'encoding'
6806     # parameter was added in 3.6), so we do this manual version instead.
6807     return "\n".join(stdout.splitlines()).rstrip("\n").replace("\n", " ")
6808
6809 #
6810 # Global constants
6811 #
6812
6813 TRI_TO_STR = {
6814     0: "n",
6815     1: "m",
6816     2: "y",
6817 }
6818
6819 STR_TO_TRI = {
6820     "n": 0,
6821     "m": 1,
6822     "y": 2,
6823 }
6824
6825 # Constant representing that there's no cached choice selection. This is
6826 # distinct from a cached None (no selection). Any object that's not None or a
6827 # Symbol will do. We test this with 'is'.
6828 _NO_CACHED_SELECTION = 0
6829
6830 # Are we running on Python 2?
6831 _IS_PY2 = sys.version_info[0] < 3
6832
6833 try:
6834     _UNAME_RELEASE = os.uname()[2]
6835 except AttributeError:
6836     # Only import as needed, to save some startup time
6837     import platform
6838     _UNAME_RELEASE = platform.uname()[2]
6839
6840 # The token and type constants below are safe to test with 'is', which is a bit
6841 # faster (~30% faster on my machine, and a few % faster for total parsing
6842 # time), even without assuming Python's small integer optimization (which
6843 # caches small integer objects). The constants end up pointing to unique
6844 # integer objects, and since we consistently refer to them via the names below,
6845 # we always get the same object.
6846 #
6847 # Client code should use == though.
6848
6849 # Tokens, with values 1, 2, ... . Avoiding 0 simplifies some checks by making
6850 # all tokens except empty strings truthy.
6851 (
6852     _T_ALLNOCONFIG_Y,
6853     _T_AND,
6854     _T_BOOL,
6855     _T_CHOICE,
6856     _T_CLOSE_PAREN,
6857     _T_COMMENT,
6858     _T_CONFIG,
6859     _T_DEFAULT,
6860     _T_DEFCONFIG_LIST,
6861     _T_DEF_BOOL,
6862     _T_DEF_HEX,
6863     _T_DEF_INT,
6864     _T_DEF_STRING,
6865     _T_DEF_TRISTATE,
6866     _T_DEPENDS,
6867     _T_ENDCHOICE,
6868     _T_ENDIF,
6869     _T_ENDMENU,
6870     _T_ENV,
6871     _T_EQUAL,
6872     _T_GREATER,
6873     _T_GREATER_EQUAL,
6874     _T_HELP,
6875     _T_HEX,
6876     _T_IF,
6877     _T_IMPLY,
6878     _T_INT,
6879     _T_LESS,
6880     _T_LESS_EQUAL,
6881     _T_MAINMENU,
6882     _T_MENU,
6883     _T_MENUCONFIG,
6884     _T_MODULES,
6885     _T_NOT,
6886     _T_ON,
6887     _T_OPEN_PAREN,
6888     _T_OPTION,
6889     _T_OPTIONAL,
6890     _T_OR,
6891     _T_ORSOURCE,
6892     _T_OSOURCE,
6893     _T_PROMPT,
6894     _T_RANGE,
6895     _T_RSOURCE,
6896     _T_SELECT,
6897     _T_SOURCE,
6898     _T_STRING,
6899     _T_TRISTATE,
6900     _T_UNEQUAL,
6901     _T_VISIBLE,
6902 ) = range(1, 51)
6903
6904 # Keyword to token map, with the get() method assigned directly as a small
6905 # optimization
6906 _get_keyword = {
6907     "---help---":     _T_HELP,
6908     "allnoconfig_y":  _T_ALLNOCONFIG_Y,
6909     "bool":           _T_BOOL,
6910     "boolean":        _T_BOOL,
6911     "choice":         _T_CHOICE,
6912     "comment":        _T_COMMENT,
6913     "config":         _T_CONFIG,
6914     "def_bool":       _T_DEF_BOOL,
6915     "def_hex":        _T_DEF_HEX,
6916     "def_int":        _T_DEF_INT,
6917     "def_string":     _T_DEF_STRING,
6918     "def_tristate":   _T_DEF_TRISTATE,
6919     "default":        _T_DEFAULT,
6920     "defconfig_list": _T_DEFCONFIG_LIST,
6921     "depends":        _T_DEPENDS,
6922     "endchoice":      _T_ENDCHOICE,
6923     "endif":          _T_ENDIF,
6924     "endmenu":        _T_ENDMENU,
6925     "env":            _T_ENV,
6926     "grsource":       _T_ORSOURCE,  # Backwards compatibility
6927     "gsource":        _T_OSOURCE,   # Backwards compatibility
6928     "help":           _T_HELP,
6929     "hex":            _T_HEX,
6930     "if":             _T_IF,
6931     "imply":          _T_IMPLY,
6932     "int":            _T_INT,
6933     "mainmenu":       _T_MAINMENU,
6934     "menu":           _T_MENU,
6935     "menuconfig":     _T_MENUCONFIG,
6936     "modules":        _T_MODULES,
6937     "on":             _T_ON,
6938     "option":         _T_OPTION,
6939     "optional":       _T_OPTIONAL,
6940     "orsource":       _T_ORSOURCE,
6941     "osource":        _T_OSOURCE,
6942     "prompt":         _T_PROMPT,
6943     "range":          _T_RANGE,
6944     "rsource":        _T_RSOURCE,
6945     "select":         _T_SELECT,
6946     "source":         _T_SOURCE,
6947     "string":         _T_STRING,
6948     "tristate":       _T_TRISTATE,
6949     "visible":        _T_VISIBLE,
6950 }.get
6951
6952 # The constants below match the value of the corresponding tokens to remove the
6953 # need for conversion
6954
6955 # Node types
6956 MENU    = _T_MENU
6957 COMMENT = _T_COMMENT
6958
6959 # Expression types
6960 AND           = _T_AND
6961 OR            = _T_OR
6962 NOT           = _T_NOT
6963 EQUAL         = _T_EQUAL
6964 UNEQUAL       = _T_UNEQUAL
6965 LESS          = _T_LESS
6966 LESS_EQUAL    = _T_LESS_EQUAL
6967 GREATER       = _T_GREATER
6968 GREATER_EQUAL = _T_GREATER_EQUAL
6969
6970 REL_TO_STR = {
6971     EQUAL:         "=",
6972     UNEQUAL:       "!=",
6973     LESS:          "<",
6974     LESS_EQUAL:    "<=",
6975     GREATER:       ">",
6976     GREATER_EQUAL: ">=",
6977 }
6978
6979 # Symbol/choice types. UNKNOWN is 0 (falsy) to simplify some checks.
6980 # Client code shouldn't rely on it though, as it was non-zero in
6981 # older versions.
6982 UNKNOWN  = 0
6983 BOOL     = _T_BOOL
6984 TRISTATE = _T_TRISTATE
6985 STRING   = _T_STRING
6986 INT      = _T_INT
6987 HEX      = _T_HEX
6988
6989 TYPE_TO_STR = {
6990     UNKNOWN:  "unknown",
6991     BOOL:     "bool",
6992     TRISTATE: "tristate",
6993     STRING:   "string",
6994     INT:      "int",
6995     HEX:      "hex",
6996 }
6997
6998 # Used in comparisons. 0 means the base is inferred from the format of the
6999 # string.
7000 _TYPE_TO_BASE = {
7001     HEX:      16,
7002     INT:      10,
7003     STRING:   0,
7004     UNKNOWN:  0,
7005 }
7006
7007 # def_bool -> BOOL, etc.
7008 _DEF_TOKEN_TO_TYPE = {
7009     _T_DEF_BOOL:     BOOL,
7010     _T_DEF_HEX:      HEX,
7011     _T_DEF_INT:      INT,
7012     _T_DEF_STRING:   STRING,
7013     _T_DEF_TRISTATE: TRISTATE,
7014 }
7015
7016 # Tokens after which strings are expected. This is used to tell strings from
7017 # constant symbol references during tokenization, both of which are enclosed in
7018 # quotes.
7019 #
7020 # Identifier-like lexemes ("missing quotes") are also treated as strings after
7021 # these tokens. _T_CHOICE is included to avoid symbols being registered for
7022 # named choices.
7023 _STRING_LEX = frozenset({
7024     _T_BOOL,
7025     _T_CHOICE,
7026     _T_COMMENT,
7027     _T_HEX,
7028     _T_INT,
7029     _T_MAINMENU,
7030     _T_MENU,
7031     _T_ORSOURCE,
7032     _T_OSOURCE,
7033     _T_PROMPT,
7034     _T_RSOURCE,
7035     _T_SOURCE,
7036     _T_STRING,
7037     _T_TRISTATE,
7038 })
7039
7040 # Various sets for quick membership tests. Gives a single global lookup and
7041 # avoids creating temporary dicts/tuples.
7042
7043 _TYPE_TOKENS = frozenset({
7044     _T_BOOL,
7045     _T_TRISTATE,
7046     _T_INT,
7047     _T_HEX,
7048     _T_STRING,
7049 })
7050
7051 _SOURCE_TOKENS = frozenset({
7052     _T_SOURCE,
7053     _T_RSOURCE,
7054     _T_OSOURCE,
7055     _T_ORSOURCE,
7056 })
7057
7058 _REL_SOURCE_TOKENS = frozenset({
7059     _T_RSOURCE,
7060     _T_ORSOURCE,
7061 })
7062
7063 # Obligatory (non-optional) sources
7064 _OBL_SOURCE_TOKENS = frozenset({
7065     _T_SOURCE,
7066     _T_RSOURCE,
7067 })
7068
7069 _BOOL_TRISTATE = frozenset({
7070     BOOL,
7071     TRISTATE,
7072 })
7073
7074 _BOOL_TRISTATE_UNKNOWN = frozenset({
7075     BOOL,
7076     TRISTATE,
7077     UNKNOWN,
7078 })
7079
7080 _INT_HEX = frozenset({
7081     INT,
7082     HEX,
7083 })
7084
7085 _SYMBOL_CHOICE = frozenset({
7086     Symbol,
7087     Choice,
7088 })
7089
7090 _MENU_COMMENT = frozenset({
7091     MENU,
7092     COMMENT,
7093 })
7094
7095 _EQUAL_UNEQUAL = frozenset({
7096     EQUAL,
7097     UNEQUAL,
7098 })
7099
7100 _RELATIONS = frozenset({
7101     EQUAL,
7102     UNEQUAL,
7103     LESS,
7104     LESS_EQUAL,
7105     GREATER,
7106     GREATER_EQUAL,
7107 })
7108
7109 # Helper functions for getting compiled regular expressions, with the needed
7110 # matching function returned directly as a small optimization.
7111 #
7112 # Use ASCII regex matching on Python 3. It's already the default on Python 2.
7113
7114
7115 def _re_match(regex):
7116     return re.compile(regex, 0 if _IS_PY2 else re.ASCII).match
7117
7118
7119 def _re_search(regex):
7120     return re.compile(regex, 0 if _IS_PY2 else re.ASCII).search
7121
7122
7123 # Various regular expressions used during parsing
7124
7125 # The initial token on a line. Also eats leading and trailing whitespace, so
7126 # that we can jump straight to the next token (or to the end of the line if
7127 # there is only one token).
7128 #
7129 # This regex will also fail to match for empty lines and comment lines.
7130 #
7131 # '$' is included to detect preprocessor variable assignments with macro
7132 # expansions in the left-hand side.
7133 _command_match = _re_match(r"\s*([A-Za-z0-9_$-]+)\s*")
7134
7135 # An identifier/keyword after the first token. Also eats trailing whitespace.
7136 # '$' is included to detect identifiers containing macro expansions.
7137 _id_keyword_match = _re_match(r"([A-Za-z0-9_$/.-]+)\s*")
7138
7139 # A fragment in the left-hand side of a preprocessor variable assignment. These
7140 # are the portions between macro expansions ($(foo)). Macros are supported in
7141 # the LHS (variable name).
7142 _assignment_lhs_fragment_match = _re_match("[A-Za-z0-9_-]*")
7143
7144 # The assignment operator and value (right-hand side) in a preprocessor
7145 # variable assignment
7146 _assignment_rhs_match = _re_match(r"\s*(=|:=|\+=)\s*(.*)")
7147
7148 # Special characters/strings while expanding a macro ('(', ')', ',', and '$(')
7149 _macro_special_search = _re_search(r"\(|\)|,|\$\(")
7150
7151 # Special characters/strings while expanding a string (quotes, '\', and '$(')
7152 _string_special_search = _re_search(r'"|\'|\\|\$\(')
7153
7154 # Special characters/strings while expanding a symbol name. Also includes
7155 # end-of-line, in case the macro is the last thing on the line.
7156 _name_special_search = _re_search(r'[^A-Za-z0-9_$/.-]|\$\(|$')
7157
7158 # A valid right-hand side for an assignment to a string symbol in a .config
7159 # file, including escaped characters. Extracts the contents.
7160 _conf_string_match = _re_match(r'"((?:[^\\"]|\\.)*)"')