summaryrefslogtreecommitdiff
path: root/kconfiglib.py
AgeCommit message (Collapse)Author
2018-03-11Add minimal configuration file generation supportUlf Magnusson
Works like 'make savedefconfig' in the C tools. Call it write_min_config() rather than write_defconfig() to be a bit more explicit. Add a test similar to test_defconfig that compares Kconfiglib minimal configuration output against the C implementation, for all defconfig files. Disable the tests for now. The C tools have a bug that causes an incorrect configuration to be generated for tristate choices in some cases. They will be re-enabled once those are fixed.
2018-03-11Properly remember y user values for choice symbolsUlf Magnusson
Commit e8b4ecb ("Don't special-case user_value for choice symbols set to y") was meant to make user_value reflect an y value assigned to a choice symbol, but didn't get it right for load_config() with replace=True: The user value was set at first, but was then unset again due to a misplaced '_was_set = True' assignment. This commit makes y choice symbol user values always be remembered. The correctness of generated files was not affected, since the user selection of a choice is actually remembered as Choice.user_selection. The previous commit just turned into a no-op for load_config() with replace=True.
2018-03-05Use comments instead of docstrings for internal functionsUlf Magnusson
The original idea was that it might be handy to look up docstrings for internal functions from the Python prompt (or an IDE) while figuring out the code. Not sure it's that useful in practice though. Comments shorten the code a bit, and might make it clearer at a glance that the function is internal.
2018-03-05Move 'val' initialization a bit later in tri_value()Ulf Magnusson
Makes it harder to miss.
2018-03-05Remove _get_* prefix from internal worker functionsUlf Magnusson
The _get_* prefixes don't improve readability and are inconsistent: All other getters are simply named after the thing they fetch. Leftover from Kconfiglib 1.
2018-03-05Fix defconfig_list-related comment typoUlf Magnusson
s/the defconfig_list/the defconfig_list symbol/
2018-03-05Do not write the defconfig_list symbol to .configUlf Magnusson
Mirrors the following change to the C tools, now in linux-next: commit c21a6e352766005d42c1ccae32b31e0438903eb9 Author: Masahiro Yamada <yamada.masahiro@socionext.com> Date: Sat Feb 17 03:38:32 2018 +0900 kconfig: set SYMBOL_AUTO to the symbol marked with defconfig_list The 'defconfig_list' is a weird attribute. If the '.config' is missing, conf_read_simple() iterates over all visible defaults, then it uses the first one for which fopen() succeeds. config DEFCONFIG_LIST string depends on !UML option defconfig_list default "/lib/modules/$UNAME_RELEASE/.config" default "/etc/kernel-config" default "/boot/config-$UNAME_RELEASE" default "$ARCH_DEFCONFIG" default "arch/$ARCH/defconfig" However, like other symbols, the first visible default is always written out to the .config file. This might be different from what has been actually used. For example, on my machine, the third one "/boot/config-$UNAME_RELEASE" is opened, like follows: $ rm .config $ make oldconfig 2>/dev/null scripts/kconfig/conf --oldconfig Kconfig # # using defaults found in /boot/config-4.4.0-112-generic # * * Restart config... * * * IRQ subsystem * Expose irq internals in debugfs (GENERIC_IRQ_DEBUGFS) [N/y/?] (NEW) However, the resulted .config file contains the first one since it is visible: $ grep CONFIG_DEFCONFIG_LIST .config CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" In order to stop confusing people, prevent this CONFIG option from being written to the .config file. Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
2018-03-05Simplify sync_deps() value testsUlf Magnusson
Use the result from the initial str_value call in more places. Also add a comment to make it clear how _write_to_conf is calculated, mirroring the ones in write_config() and write_autoconf().
2018-03-03_write_old_vals() consistency nitUlf Magnusson
2018-03-03Simplify initial auto.conf setupUlf Magnusson
Instead of creating an empty initial auto.conf and immediately loading it, look for a missing auto.conf in _load_old_vals() and treat that the same as an empty auto.conf (by returning after clearing the old values). The initial auto.conf will then be written as normal by _write_old_vals(). Also flesh out the sync_deps() docstring a bit: - Make it clear that sync_deps() should be run at each build - Be more explicit about what it means for a symbol to have changed (different output in autoconf.h)
2018-03-03Accept existing directory with no auto.conf in sync_deps()Ulf Magnusson
An initial empty auto.conf will be created, just as when sync_deps() creates the directory. This is more flexible. There's no good reason to require the directory to be created by sync_deps().
2018-03-01Simplify _parse_factor() error handlingUlf Magnusson
"malformed expression" should be clear enough for a missing end parenthesis too. Expressions are generally short.
2018-03-01Give .config location in invalid bool/tristate value warningUlf Magnusson
Oversight
2018-03-01Make expression type constants equal their corresponding tokensUlf Magnusson
This gets rid of _TOKEN_TO_REL and removes the conversion in _parse_factor(). It's pretty easy to understand too. Having e.g. just EQUAL and no _T_EQUAL would be too confusing, so keep the separate names still. Piggyback small _REL_TO_STR and _T_OPEN_PAREN code nits.
2018-03-01Only write '# CONFIG_FOO is not set' for visible symbolsUlf Magnusson
This mirrors a change I made to the C tools, which is now in linux-next: https://www.spinics.net/lists/linux-kbuild/msg17074.html. Add a note to the README to make it clear that the test suite now needs to be run against recent kernels in order to pass. Copy-pasted commit message from the C tools commit below: === Background === - Visible n-valued bool/tristate symbols generate a '# CONFIG_FOO is not set' line in the .config file. The idea is to remember the user selection without having to set a Makefile variable. Having n correspond to the variable being undefined in the Makefiles makes for easy CONFIG_* tests. - Invisible n-valued bool/tristate symbols normally do not generate a '# CONFIG_FOO is not set' line, because user values from .config files have no effect on invisible symbols anyway. Currently, there is one exception to this rule: Any bool/tristate symbol that gets the value n through a 'default' property generates a '# CONFIG_FOO is not set' line, even if the symbol is invisible. Note that this only applies to explicitly given defaults, and not when the symbol implicitly defaults to n (like bool/tristate symbols without 'default' properties do). This is inconsistent, and seems redundant: - As mentioned, the '# CONFIG_FOO is not set' won't affect the symbol once the .config is read back in. - Even if the symbol is invisible at first but becomes visible later, there shouldn't be any harm in recalculating the default value rather than viewing the '# CONFIG_FOO is not set' as a previous user value of n. === Changes === Change sym_calc_value() to only set SYMBOL_WRITE (write to .config) for non-n-valued 'default' properties. Note that SYMBOL_WRITE is always set for visible symbols regardless of whether they have 'default' properties or not, so this change only affects invisible symbols. This reduces the size of the x86 .config on my system by about 1% (due to removed '# CONFIG_FOO is not set' entries). One side effect of (and the main motivation for) this change is making the following two definitions behave exactly the same: config FOO bool config FOO bool default n With this change, neither of these will generate a '# CONFIG_FOO is not set' line (assuming FOO isn't selected/implied). That might make it clearer to people that a bare 'default n' is redundant. This change only affects generated .config files and not autoconf.h: autoconf.h only includes #defines for non-n bool/tristate symbols. === Testing === The following testing was done with the x86 Kconfigs: - .config files generated before and after the change were compared to verify that the only difference is some '# CONFIG_FOO is not set' entries disappearing. A couple of these were inspected manually, and most turned out to be from redundant 'default n/def_bool n' properties. - The generated include/generated/autoconf.h was compared before and after the change and verified to be identical. - As a sanity check, the same modification was done to Kconfiglib. The Kconfiglib test suite was then run to check for any mismatches against the output of the C implementation.
2018-02-28More sync_deps() docstring nitsUlf Magnusson
2018-02-28sync_deps() docstring nitUlf Magnusson
2018-02-28Rename _sync_sym_files() to _sync_deps()Ulf Magnusson
Forgot to rename the helper as well after renaming sync_sym_files() to sync_deps().
2018-02-28Add support for incremental buildsUlf Magnusson
Implement a scheme from the C tools where symbols get corresponding files that are touch'ed whenever the symbol's value changes. This can be used to add e.g. Makefile dependencies between source files and particular symbols. See the docstring of the new sync_deps() function for more information. Piggyback a small sanity check for write_autoconf().
2018-02-28Remove small write_{config,autoconf}() optimizationsUlf Magnusson
They're really minor, and copying them around when new output functions are added gets a bit silly. These functions are used as a reference too, so maximum readability helps.
2018-02-28Return "" for unwritten symbols in Symbol.config_stringUlf Magnusson
The previous return value was None. Returning "" makes write_config() neater and feels a bit more Pythonic. It might simplify the implementation of some planned features as well. This is a small API break, so the major version will be bumped to 4 in the next release. Only code that explicitly tests Symbol.config_string against None will be affected: 'if sym.config_string is None:' will break, but not 'if not sym.config_string:'.
2018-02-27Move sym._written setting earlierUlf Magnusson
Makes the logic a bit clearer, and might save some branching.
2018-02-27Implement 'rsource' statement ('source' with relative path)Roman
The 'rsource' statement works like 'source', but looks relative to the Kconfig file that has the 'rsource' rather than relative to the base Kconfig file. Using 'rsource' makes it possible to move subtrees with Kconfig files around without breaking references to other Kconfig files. So far, this is a Kconfiglib-exclusive feature.
2018-02-25Clarify the purpose of _STRING_LEXUlf Magnusson
The main purpose of _STRING_LEX is being able to tell strings from constant symbol references during tokenization. The old comment was implying that its only purpose is handling the "missing quotes" in e.g. source foo/Kconfig Update the comment to make _STRING_LEX clearer.
2018-02-16Include direct deps. in Symbol/Choice.__str__()Ulf Magnusson
Direct dependencies are significant for 'imply' even if the symbol has no properties, so they need to be included to get semantically equivalent output. Making the direct dependencies clear is helpful in general too, even if you can usually infer them from the properties they get propagated to.
2018-02-09Simplify visibility check in Choice._get_selection()Ulf Magnusson
The visibility of a symbol in an y-mode choice can only be n or y, so it's sufficient to check that it's not n (0).
2018-02-08Give hint about recognizing undefined symbolsUlf Magnusson
2018-02-08Fix typo in module docstringUlf Magnusson
It's the top-level Kconfig file that source's depending on $SRCARCH, not the top-level Makefile.
2018-02-08_parse_expr() docstring nitUlf Magnusson
2018-02-08Don't special-case user_value for choice symbols set to yUlf Magnusson
Previously, setting a choice symbol to y would only update user_selection on the parent choice and not the symbol's own user_value. Now both are updated. The point of the old behavior was to remember the m mode selections of a choice when it was switched back and forth between m and y mode, which was a feature I thought the C implementation had. On closer inspection, the C implementation never had that feature, though it might appear like it if you only make "lucky" changes (if you never select any symbols in y mode that were n in m mode). The new behavior is simpler and easier to understand: Symbol.user_value now always matches the value assigned in a .config file or via set_value(), provided the value was well-formed. This might avoid some special-casing in scripts too. The loss in usability is pretty minimal.
2018-02-07Allow "n"/"m"/"y" as aliases for 0/1/2 in set_value()Ulf Magnusson
More experience working with the API convinced me that it's worth it. Gets rid of ugly conversions in the menuconfig.py and oldconfig.py examples, and streamlines some things internally as well. Include two other small fixes as well: - Make warnings generated by Choice.set_value() match those generated by Symbol.set_value(). - Get rid of the input stripping in menuconfig.py. It's not like the interface is usable as-is anyway, and it just complicates the example.
2018-01-30Warn if choice symbol has prompt outside choiceUlf Magnusson
Defining a choice symbol in multiple places to add some properties to it outside the choice seems to actually be done deliberately by MIPS, but it's almost guaranteed to be an error if the definition(s) outside the choice have a prompt (and so can be changed by the user there), so warn for that.
2018-01-29Warn if a choice symbol has defaultsUlf Magnusson
Never has en affect.
2018-01-29Warn if menuconfig statement has no promptUlf Magnusson
Mirrors a warning in the C implementation.
2018-01-29Warn if help text is emptyUlf Magnusson
Personal pet peeve. Should add a warning to the C implementation too.
2018-01-29Refactor _check_sym_sanity()Ulf Magnusson
Arrange by type, which works pretty neatly except for the pesky ranges check. This also makes us do less work in the common BOOL/TRISTATE case. Get rid of _check_select_imply_sanity().
2018-01-29Move sym.ranges check to end of _check_sym_sanity()Ulf Magnusson
More important stuff up front.
2018-01-29Warn if a symbol/choice has multiple promptsUlf Magnusson
In a single location. Having multiple definitions with different prompts is okay.
2018-01-29Sanity-check range valuesUlf Magnusson
Must have a form compatible with the int/hex, like for defaults. Also refactor a bit and use a single _int_hex_value_is_sane() helper. Less duplication.
2018-01-29Improve int/hex sanity checkingUlf Magnusson
If a non-constant default is given, we can still check that it has the right type. Break out two int/hex value sanity checking functions.
2018-01-28Warn if a symbol is defined with multiple typesUlf Magnusson
2018-01-28Remove redundant is_constant checkUlf Magnusson
Constant as well as undefined symbols lack menu nodes, so it's sufficient to check 'nodes'.
2018-01-28Add some warnings related to selects and impliesUlf Magnusson
Only bool and tristate symbols can select and be selected. Also add docstrings to the sanity checking functions.
2018-01-28Warn if there's more than one help textUlf Magnusson
Mirrors a warning I added to the C implementation.
2018-01-28Add more choice type and prompt sanity checksUlf Magnusson
- Choices should have type bool or tristate - Choice values should have a prompt Also fix indentation mess-up.
2018-01-28Refactor post-parsing sanity checkingUlf Magnusson
Have separate functions for checking symbols and choices instead of mixing them up. Easier to read, and avoids some isinstance() checks. Add some comments too.
2018-01-28Error out for malformed hex/int/string defaultsUlf Magnusson
Instead of failing in more cryptic ways later. Also use 'orig_type' instead of 'type' for the UNKNOWN check. Oversight.
2018-01-28Add some post-parsing warningsUlf Magnusson
These are easiest to check after parsing, since a symbol/choice can be defined in multiple locations: - Warn if a symbol or choice defined without a type. Also warn for choice value symbols defined without a type, even if they automatically get their type from the choice. This feature isn't well-known and probably not used deliberately. - Warn if a choice is defined without a prompt - Warn of a choice default symbol is not contained in the choice Also move _name_and_loc_str() from the symbol class to the global scope and generalize it to be able to handle choices.
2018-01-28Give symbol definition location(s) in warningsUlf Magnusson
Helpful
2018-01-28Flag constant symbols where they're not allowedUlf Magnusson
Might break U-Boot if they ever upgrade Kconfiglib, because they have a 'select y' in there (which the C tools don't flag since they only look for quotes), but it's a one-line fix.