zephyr/scripts/kconfig/kconfig.py
Ulf Magnusson e3892d9351 scripts: kconfig: Give symbol locations in warnings
Warnings from Kconfiglib itself always give symbol locations, but the
custom value mismatch warning in kconfig.py doesn't. Make it print the
symbol location(s) too. This is helpful when debugging.

Before:

    warning: UART_QMSI_0_HW_FC was assigned the value "y" but got the
    value "n" -- check dependencies

After:

    warning: UART_QMSI_0_HW_FC (defined at
    .../drivers/serial/Kconfig.qmsi:35,
    .../arch/x86/soc/intel_quark/quark_se/Kconfig.defconfig.series:194)
    was assigned the value "y" but got the value "n" -- check
    dependencies

Signed-off-by: Ulf Magnusson <ulfalizer@gmail.com>
2018-03-26 10:03:57 +02:00

63 lines
2.1 KiB
Python
Executable File

#!/usr/bin/env python3
# Modified from: https://github.com/ulfalizer/Kconfiglib/blob/master/examples/merge_config.py
from kconfiglib import Kconfig, Symbol, BOOL, STRING, TRISTATE, TRI_TO_STR
import sys
if len(sys.argv) < 5:
print('usage: {} Kconfig dotconfig autoconf conf1 [conf2 ...]'
.format(sys.argv[0]))
sys.exit(1)
print("Parsing Kconfig tree in {}".format(sys.argv[1]))
kconf = Kconfig(sys.argv[1])
# Enable warnings for assignments to undefined symbols
kconf.enable_undef_warnings()
# (This script uses alldefconfig as the base. Other starting states could be
# set up here as well. The approach in examples/allnoconfig_simpler.py could
# provide an allnoconfig starting state for example.)
print("Using {} as base".format(sys.argv[4]))
for config in sys.argv[5:]:
print("Merging {}".format(config))
# Create a merged configuration by loading the fragments with replace=False
for config in sys.argv[4:]:
kconf.load_config(config, replace=False)
# Write the merged configuration
kconf.write_config(sys.argv[2])
# Output autoconf
kconf.write_autoconf(sys.argv[3])
# Print warnings for symbols whose actual value doesn't match the assigned
# value
def name_and_loc(sym):
# Helper for printing symbol names and Kconfig file location(s) in warnings
if not sym.nodes:
return sym.name + " (undefined)"
return "{} (defined at {})".format(
sym.name,
", ".join("{}:{}".format(node.filename, node.linenr)
for node in sym.nodes))
for sym in kconf.defined_syms:
# Was the symbol assigned to?
#print('name: {} value: {}'.format(sym.name, sym.str_value))
if sym.user_value is not None:
# Tristate values are represented as 0, 1, 2. Having them as
# "n", "m", "y" is more convenient here, so convert.
if sym.type in (BOOL, TRISTATE):
user_value = TRI_TO_STR[sym.user_value]
else:
user_value = sym.user_value
if user_value != sym.str_value:
print('warning: {} was assigned the value "{}" but got the '
'value "{}" -- check dependencies'
.format(name_and_loc(sym), user_value, sym.str_value))