Re: [PATCH 2/3] checkkconfigsymbols.py: Fix Kconfig parsing to find 'if' lines
From: Ariel Marcovitch
Date: Sun Aug 29 2021 - 09:18:06 EST
Hello again!
On 24/08/2021 16:30, Masahiro Yamada wrote:
> On Mon, Aug 23, 2021 at 4:22 AM Ariel Marcovitch
> <arielmarcovitch@xxxxxxxxx> wrote:
>>
>> When parsing Kconfig files to find symbol definitions and references,
>> lines after a 'help' line are skipped until a new config definition
>> starts.
>>
>> However, it is quite common to define a config and then make some other
>> configs depend on it by adding an 'if' line. This kind of kconfig
>> statement usually appears after a config definition which might contain
>> a 'help' section. The 'if' line is skipped in parse_kconfig_file()
>> because it is not a config definition.
>>
>> This means that symbols referenced in this kind of statements are
>> ignored by this function and thus are not considered undefined
>> references in case the symbol is not defined.
>>
>> The REGEX_KCONFIG_STMT regex can't be used because the other types of
>> statements can't break help lines.
>>
>> Define a new regex for matching 'if' statements and stop the 'help'
>> skipping in case it is encountered.
>>
>> Signed-off-by: Ariel Marcovitch <arielmarcovitch@xxxxxxxxx>
>> ---
>> scripts/checkkconfigsymbols.py | 8 +++++++-
>> 1 file changed, 7 insertions(+), 1 deletion(-)
>>
>> diff --git a/scripts/checkkconfigsymbols.py
b/scripts/checkkconfigsymbols.py
>> index b9b0f15e5880..875e9a2c14b2 100755
>> --- a/scripts/checkkconfigsymbols.py
>> +++ b/scripts/checkkconfigsymbols.py
>> @@ -26,6 +26,7 @@ EXPR = r"(?:" + OPERATORS + r"|\s|" + SYMBOL + r")+"
>> DEFAULT = r"default\s+.*?(?:if\s.+){,1}"
>> STMT = r"^\s*(?:if|select|imply|depends\s+on|(?:" + DEFAULT +
r"))\s+" + EXPR
>> SOURCE_SYMBOL = r"(?:\W|\b)+[D]{,1}CONFIG_(" + SYMBOL + r")"
>> +IF_LINE = r"^\s*(?:if)\s+" + EXPR
>
>
> Why is it enclosed by "(?: )" ?
>
> "(?:if)" seems to the same as "if"
Oh you are absolutely right.
I just mindlessly copied the STMT regex and removed the other types :)
>
>
>
>
>
>
>>
>> # regex objects
>> REGEX_FILE_KCONFIG = re.compile(r".*Kconfig[\.\w+\-]*$")
>> @@ -35,11 +36,11 @@ REGEX_KCONFIG_DEF = re.compile(DEF)
>> REGEX_KCONFIG_EXPR = re.compile(EXPR)
>> REGEX_KCONFIG_STMT = re.compile(STMT)
>> REGEX_KCONFIG_HELP = re.compile(r"^\s+help\s*$")
>> +REGEX_KCONFIG_IF_LINE = re.compile(IF_LINE)
>> REGEX_FILTER_SYMBOLS = re.compile(r"[A-Za-z0-9]$")
>> REGEX_NUMERIC = re.compile(r"0[xX][0-9a-fA-F]+|[0-9]+")
>> REGEX_QUOTES = re.compile("(\"(.*?)\")")
>>
>> -
>> def parse_options():
>> """The user interface of this module."""
>> usage = "Run this tool to detect Kconfig symbols that are
referenced but " \
>> @@ -445,6 +446,11 @@ def parse_kconfig_file(kfile):
>> line = line.strip('\n')
>> line = line.split("#")[0] # ignore comments
>>
>> + # 'if EXPR' lines can be after help lines
>> + # The if line itself is handled later
>> + if REGEX_KCONFIG_IF_LINE.match(line):
>> + skip = False
>> +
>
>
> I do not think this is the right fix.
> There are similar patterns where
> config references are ignored.
>
> For example, FOO and BAR are ignored
> in the following cases.
>
> ex1)
>
> choice
> prompt "foo"
> default FOO
>
>
>
> ex2)
>
> menu "bar"
> depends on BAR
>
>
>
>
> The help block ends with shallower indentation.
So IIUC we need to measure the indentation when we encounter a help
statement and in the next lines look for a line with a different depth
(which is not an empty line because these are allowed).
>
>
>
>
>> if REGEX_KCONFIG_DEF.match(line):
>> symbol_def = REGEX_KCONFIG_DEF.findall(line)
>> defined.append(symbol_def[0])
>> --
>> 2.25.1
>>
>
>
> --
> Best Regards
> Masahiro Yamada
Thanks for your time!
Ariel Marcovitch