summaryrefslogtreecommitdiff
path: root/kconfiglib.py
AgeCommit message (Collapse)Author
2018-05-30Add tool helper for loading/saving .config filesUlf Magnusson
Removes repeated KCONFIG_CONFIG boilerplate. Also make allyesconfig use KCONFIG_CONFIG when writing (oversight), and document the sys.exit() behavior for standard_kconfig().
2018-05-30Add tool helper for selecting the top-level KconfigUlf Magnusson
standard_kconfig() gets the top-level Kconfig file from the first command-line argument, defaulting to "Kconfig". This removes some boilerplate from tools.
2018-05-27Provide lists with all menus and commentsUlf Magnusson
Handy e.g. when implementing advanced search features.
2018-05-27Make Kconfig._choices publicUlf Magnusson
Useful in various places outside the library, e.g. in the upcoming packaged allyesconfig implementation, and when generating documentation.
2018-05-27Get rid of the predefined UNAME_RELEASE symbolUlf Magnusson
Commit cbf32e2 ("Expand environment variables in strings directly") added direct expansion of environment variables is strings, with commit b9384a1 ("Restore compatibility with $UNAME_RELEASE") adding a hack to restore compatibility with the predefined $UNAME_RELEASE symbol, used by DEFCONFIG_LIST in the Linux kernel. With the compatibility hack in place, there's no longer any need to define UNAME_RELEASE as a proper symbol. Remove it.
2018-05-27Simplify unquoted string default checkUlf Magnusson
D'oh
2018-05-26Micro-optimize _parse_help() loopUlf Magnusson
Shaves ~6% off the _parse_help() runtime for the x86 Kconfigs in cProfile.
2018-05-25Style nitUlf Magnusson
2018-05-25Warn if quotes are omitted around string defaultsUlf Magnusson
This takes some heuristics, as it's indistinguishable from a reference to an undefined symbol. Guess that the quotes are missing if the 'default' value isn't all-uppercase.
2018-05-19Warn for incompatible uses of 'option env=...'Ulf Magnusson
Since commit cbf32e2 ("Expand environment variables in strings directly"), Kconfiglib expands environment variables directly in strings instead of using the 'option env=...' mechanism (this is planned for the C tools too). This new behavior is backwards-compatible as long as all 'option env=...' symbols have the same name as the environment variables they reference. Warn if 'option env="FOO"' appears on a symbol that isn't named FOO, to point out compatibility issues and help with debugging.
2018-05-19Micro-optimize help text parsing some moreUlf Magnusson
This code is surprisingly hot.
2018-05-18Get rid of _dedent_rstrip()Ulf Magnusson
Only a single caller left now, in a hot loop.
2018-05-18Warn if prompt contains leading or trailing whitespaceUlf Magnusson
Also strip the prompt in that case. Leading/trailing whitespace in prompts leads to ugly workarounds in e.g. reStructuredText documentation, where '*prompt *' is invalid.
2018-05-18Restore compatibility with $UNAME_RELEASEUlf Magnusson
UNAME_RELEASE is expanded in one of the 'default's of the DEFCONFIG_LIST symbol in the Linux kernel. This broke after "$FOO" was changed to directly expand to the value of the environment variable FOO, rather than to the value of the symbol FOO. Restore compatibility with a small wrapper.
2018-05-18Refactor help text parsing loopUlf Magnusson
This is less twisty, and generates slightly smaller bytecode. Probably doesn't help to special-case the first line.
2018-05-17Move help text parsing into a separate functionUlf Magnusson
More readable.
2018-05-17Remove SRCARCH-related gotcha from module docstringUlf Magnusson
Now that environment variables are expanded directly with os.path.expandvars(), "$SRCARCH" will be kept as is if SRCARCH isn't set. arch/$SRCARCH/Kconfig won't exist, unlike arch//Kconfig.
2018-05-17Factor out adding of promptsUlf Magnusson
Get rid of some code duplication.
2018-05-17Factor out symbol type settingUlf Magnusson
Get rid of some code duplication.
2018-05-17Conditional reversal nitUlf Magnusson
2018-05-16Record which MenuNode has each propertyUlf Magnusson
This allows accurate documentation to be generated for symbols and choices defined in multiple locations. There are now MenuNode.defaults, MenuNode.selects, etc., lists that mirror the corresponding Symbol/Choice lists. Symbol/Choice.__str__() now correctly show property locations as well, by simply concatenating the strings returned by MenuNode.__str__() for each node. _parse_properties() was modified to add all properties directly to the menu node instead of adding them to the contained symbol or choice. The properties are then copied up to symbols and choices in _finalize_tree(). Dependency propagation is handled at the same time. As a side effect, this cleans up the code a bit and de-bloats _parse_properties(). Update the menuconfig implementation to use the new functionality. It now lists the menu nodes for symbols and choices with the correct properties for each node (previously, all defaults, selects, implies, and ranges appeared on the first definition).
2018-05-16Expand environment variables in strings directlyUlf Magnusson
Make "$FOO" directly reference the environment variable $FOO in e.g. 'source' statements, instead of the symbol FOO. Use os.path.expandvars() to expand strings (which preserves "$FOO" as-is if no environment variable FOO exists). This gets rid of the 'option env' "bounce" symbols, which are mostly just spam and are buggy in the C tools (dependencies aren't always respected, due to parsing and evaluation getting mixed up). The same change will probably appear soon in the C tools as well. Keep accepting 'option env' to preserve some backwards compatibility, but ignore it when expanding strings. For compatibility with the C tools, bounce symbols will need to be named the same as the environment variables they reference (which is the case for the Linux kernel). This is a compatibility break, so the major version will be bumped to 6 at the next release. The main motivation for adding this now is to allow recording properties on each MenuNode in a clean way. 'option env' symbols interact badly with delayed dependency propagation. Side note: I have a feeling that recording environment variable values might be redundant to trigger rebuilds if sync_deps() is run at each compile. It should detect all changes to symbol values due to environment variables changing value.
2018-05-01Force encoding to UTF-8 by default on Python 3Ulf Magnusson
Enough people have run into exceptions due to running in the C locale that it seems worthwhile. Add a new 'encoding' parameter to Kconfig.__init__() that specifies the encoding to use and make it default to "utf-8". Passing None gives the old behavior of using the encoding specified in the environment. Related PEP: https://www.python.org/dev/peps/pep-0538/
2018-05-01Make warnings available in a listUlf Magnusson
Also make printing of warnings to stderr optional. It's on by default, since it's almost always what you want. This makes printing and processing of warnings more flexible, compared to always printing warnings to stderr as soon as they're generated. It was inspired by wanting to promote certain warnings to errors in Zephyr, which previously required capturing stderr.
2018-05-01Make disable_warnings() disable all warningsUlf Magnusson
...including the optional ones. Previously, those were independent. This is more intuitive, and it seems unlikely that you'd want some of the optional warnings printed without having general warnings printed. This is a small API behavior change, so the major version will be bumped to 5 at the next release. Programs that enabled optional warnings without enabling general warnings will be affected. This means that all warnings now go through the same code path, which will come in handy for later changes (making the warnings available in a list, though with stderr printing still enabled by default). Add some more documentation for the Kconfig.__init__() 'warn' parameter and the enable_redun_warnings() function as well, and clean up the variable naming a bit.
2018-04-25Give filename and context for UnicodeDecodeErrorUlf Magnusson
These errors are a pain to debug otherwise, and might look like Kconfiglib brokenness. Another option would be ignore decoding errors, or do the 'surrogateescape' thing on reading and writing, but keep it simple for now. Pointing out the problem might be more helpful.
2018-04-25Print a warning for malformed .config linesUlf Magnusson
Flag lines matching neither 'CONFIG_FOO=...' nor '# CONFIG_FOO is not set' that aren't blank or comments.
2018-04-19Add Choice.direct_dep fieldUlf Magnusson
Same as Symbol.direct_dep (OR of node dependencies from all definition locations). It's handy to have available when generating information about choices.
2018-04-11Add helper for splitting expressionsUlf Magnusson
I've had to implement the logic for walking reverse dependencies (from select) a couple of times now, and it's always a bit tricky to get right. Reduce code duplication and simplify things by adding a helper function split_expr() that splits an expression into a list of either its AND or OR operands. A nice side effect is that e.g. the warning generated for selecting a symbol with unsatisfied direct dependencies now lists the selecting symbols in the order that they appear in the Kconfig files. split_expr() might be helpful for splitting other types of expressions as well, e.g. to put operands on separate lines when generating documentation.
2018-04-06Move sanity checking to after _finalize_tree()Ulf Magnusson
Previously, the warnings warning: FOO (defined at Kconfig:1, Kconfig:6) defined with type unknown warning: the default selection BAR (defined at Kconfig:9) of FOO (defined at Kconfig:1, Kconfig:6) is not contained in the choice were printed for this (obscure, but okay) pair of definitions: choice FOO default BAR endchoice choice FOO prompt "foo" config BAR bool "bar" endchoice The problem is that BAR is not known to be a choice symbol by the time the first choice definition is encountered in _finalize_tree(), since that's determined only when the second definition is encountered (it needs to happen there, because implicit submenus can influence whether a symbol is a choice symbol or not, and implicit submenus are determined in _finalize_tree()). Fix it by moving the sanity checks out of _finalize_tree() and into a separate pass over all symbols and choices that runs after _finalize_tree(). That might avoid other gotchas too.
2018-04-05Set is_menuconfig True on the top menuUlf Magnusson
Oversight
2018-04-04Code consistency nitUlf Magnusson
'is_menuconfig' is set after 'item' in the other cases.
2018-04-04Generalize is_menuconfig to non-symbol itemsUlf Magnusson
Extending the scope of is_menuconfig so that it's True for all items whose children should be displayed in a separate menu turns out to be handy when implementing menuconfig-like functionality. Keep the old name for backwards compatibility. It's good enough.
2018-03-28Parenthesize && expressions within || expressionsUlf Magnusson
This is redundant from an evaluation perspective, as && has higher precedence than ||, but is easier to read. A && B || C && D is now rendered as "(A && B) || (C && D)".
2018-03-26Use expr_str() to print selected/implied symbolsUlf Magnusson
This is redundant on its own, as only a single symbol can be selected/implied, meaning just .name will work fine too. It means that all symbols appearing in the __str__() representation of symbols and choices are now printed via expr_str() though, which might come in handy soon.
2018-03-26Refactor expr_str() casesUlf Magnusson
- Detect Symbol directly instead of as (not tuple) + (not choice) - Test explicitly for a tuple (non-Symbol) in NOT - Add some tests to get better coverage for NOT and parentheses
2018-03-24Warn if a choice symbol is selected or impliedUlf Magnusson
This has no effect. Model the warning on the one for selecting a symbol with unsatisfied dependencies. This is a Kconfiglib-exclusive warning so far.
2018-03-24_check_choice_sanity() style nitUlf Magnusson
2018-03-24Rename _name_and_loc_str() to _name_and_loc()Ulf Magnusson
Bit shorter, still clear in context.
2018-03-24Refactor _warn_select_unsatisfied_deps()Ulf Magnusson
Simplify the looping and remove some comments that aren't super helpful. Also put " - " at the beginning of the lines listing the selecting symbols. Bit more readable.
2018-03-24Remove redundant int/hex user value 'is None' checkUlf Magnusson
A valid int/hex user value can never be an empty string, so they test can be simplified.
2018-03-23Warn if user (.config) value is outside of 'range'Ulf Magnusson
Example warning: warning: user value 0x100 on the hex symbol HEX (defined at Kconfig:18) ignored due to being outside the active range ([0x13, 0x73]) -- falling back on defaults This is a Kconfiglib-exclusive warning. It might be tricky to implement in the C tools, due to weird two-phase handling of int/hex symbols. There is unfortunately no easy way to map the warning back to a .config line, as the active 'range' can't be known in general until the entire configuration has been read (consider 'range 0 10 if FOO' for example). Instead, the warning is generated when the symbol value is calculated.
2018-03-22Remove redundant int/hex user value validity checkUlf Magnusson
set_value() already rejects invalid int/hex values, so there's no need to check the value in str_value().
2018-03-20Use iglob() rather than glob()Ulf Magnusson
No need to create a list. glob() just does list(iglob()) internally as well.
2018-03-20Get rid of local 'prompt' variableUlf Magnusson
There's no need to handle prompts like defaults, selects, etc. in _parse_properties(), because prompts belong to menu nodes, which means only local dependencies will be propagated anyway. Makes the code a bit less twisty.
2018-03-20Add parent deps to the right in _T_IFUlf Magnusson
Consistent with how dependencies are propagated elsewhere. Get rid of the 'parent_dep' variable too.
2018-03-20_parse_properties() nitUlf Magnusson
2018-03-20Clean up some parent dependency conditionalsUlf Magnusson
2018-03-20Reorder _parse_block() parametersUlf Magnusson
Bit more readable to have the parent node and the previous node next to each other. Also rename 'prev_node' to just 'prev', to be consistent with 'parent'. There's fewer parameters than in the past now, making it pretty easy to follow anyway. Remove some inline parameter-related comments too.
2018-03-19Clean up _int_hex_value_is_sane()Ulf Magnusson
- Restructure the test. - Call the function _int_hex_ok() instead. Bit less spammy. Also add a doc-comment to explain it.