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