Files
Julien Olivain fa98239074 utils/check-symbols: allow BR2_BROKEN to be unused
Commit [1] introduced the BR2_BROKEN hidden symbol. The intent of
this symbol is to temporarily mark a configuration known to be broken.
This commit was added to fix an undefined usage of the symbol, in a
previous commit [2].

With this somewhat special symbol, it is also perfectly normal to
have no use of it.

Running the command "utils/check-symbols" in a state there is no usage
of the BR2_BROKEN, the script fails with output:

    Config.in:15: BR2_BROKEN defined but not referenced

This commit adds an exception for this symbol, allowing it to be
unused in the whole Buildroot tree.

Fixes:
https://gitlab.com/buildroot.org/buildroot/-/jobs/8925433382

[1] 2ddc5808cd
[2] 11a8cdd2bb

Signed-off-by: Julien Olivain <ju.o@free.fr>
Signed-off-by: Romain Naour <romain.naour@smile.fr>
2025-02-05 11:01:05 +01:00

208 lines
8.0 KiB
Python

import re
import checksymbolslib.br as br
choice = 'part of a choice'
definition = 'definition'
helper = 'possible config helper'
legacy_definition = 'legacy definition'
legacy_note = 'legacy note'
legacy_usage = 'legacy usage'
select = 'selected'
usage = 'normal usage'
usage_in_legacy = 'usage inside legacy'
virtual = 'virtual'
class DB:
def __init__(self):
self.all_symbols = {}
def __str__(self):
return str(self.all_symbols)
def add_symbol_entry(self, symbol, filename, lineno, entry_type):
if symbol not in self.all_symbols:
self.all_symbols[symbol] = {}
if entry_type not in self.all_symbols[symbol]:
self.all_symbols[symbol][entry_type] = {}
if filename not in self.all_symbols[symbol][entry_type]:
self.all_symbols[symbol][entry_type][filename] = []
self.all_symbols[symbol][entry_type][filename].append(lineno)
def add_symbol_choice(self, symbol, filename, lineno):
self.add_symbol_entry(symbol, filename, lineno, choice)
def add_symbol_definition(self, symbol, filename, lineno):
self.add_symbol_entry(symbol, filename, lineno, definition)
def add_symbol_helper(self, symbol, filename, lineno):
self.add_symbol_entry(symbol, filename, lineno, helper)
def add_symbol_legacy_definition(self, symbol, filename, lineno):
self.add_symbol_entry(symbol, filename, lineno, legacy_definition)
def add_symbol_legacy_note(self, symbol, filename, lineno):
self.add_symbol_entry(symbol, filename, lineno, legacy_note)
def add_symbol_legacy_usage(self, symbol, filename, lineno):
self.add_symbol_entry(symbol, filename, lineno, legacy_usage)
def add_symbol_select(self, symbol, filename, lineno):
self.add_symbol_entry(symbol, filename, lineno, select)
def add_symbol_usage(self, symbol, filename, lineno):
self.add_symbol_entry(symbol, filename, lineno, usage)
def add_symbol_usage_in_legacy(self, symbol, filename, lineno):
self.add_symbol_entry(symbol, filename, lineno, usage_in_legacy)
def add_symbol_virtual(self, symbol, filename, lineno):
self.add_symbol_entry(symbol, filename, lineno, virtual)
def get_symbols_with_pattern(self, pattern):
re_pattern = re.compile(r'{}'.format(pattern))
found_symbols = {}
for symbol, entries in self.all_symbols.items():
if not re_pattern.search(symbol):
continue
found_symbols[symbol] = entries
return found_symbols
def get_warnings_for_choices_selected(self):
warnings = []
for symbol, entries in self.all_symbols.items():
if choice not in entries:
continue
if select not in entries:
continue
all_items = []
all_items += entries.get(select, {}).items()
for filename, linenos in all_items:
for lineno in linenos:
msg = '{} is part of a "choice" and should not be "select"ed'.format(symbol)
warnings.append((filename, lineno, msg))
return warnings
def get_warnings_for_legacy_symbols_being_used(self):
warnings = []
for symbol, entries in self.all_symbols.items():
if legacy_definition not in entries:
continue
if usage not in entries:
continue
all_items = []
all_items += entries.get(usage, {}).items()
for filename, linenos in all_items:
for lineno in linenos:
msg = '{} is a legacy symbol and should not be referenced'.format(symbol)
warnings.append((filename, lineno, msg))
return warnings
def get_warnings_for_legacy_symbols_being_defined(self):
warnings = []
for symbol, entries in self.all_symbols.items():
if legacy_definition not in entries:
continue
if definition not in entries:
continue
all_items = []
all_items += entries.get(definition, {}).items()
for filename, linenos in all_items:
for lineno in linenos:
msg = '{} is a legacy symbol and should not be redefined'.format(symbol)
warnings.append((filename, lineno, msg))
return warnings
def get_warnings_for_symbols_without_definition(self):
warnings = []
for symbol, entries in self.all_symbols.items():
if definition in entries:
continue
if legacy_definition in entries:
continue
if br.re_host_symbol.search(symbol):
continue
if br.is_an_optional_symbol_for_a_roofts(symbol):
continue
if symbol in br.symbols_defined_only_at_command_line:
continue
if symbol in br.symbols_defined_only_when_using_br2_external:
continue
if symbol in br.symbols_defined_only_for_barebox_variant:
continue
if symbol in br.symbols_not_defined_for_fake_virtual_packages:
continue
if virtual in entries:
continue
all_items = []
all_items += entries.get(usage, {}).items()
all_items += entries.get(legacy_usage, {}).items()
all_items += entries.get(usage_in_legacy, {}).items()
for filename, linenos in all_items:
for lineno in linenos:
msg = '{} referenced but not defined'.format(symbol)
warnings.append((filename, lineno, msg))
return warnings
def get_warnings_for_symbols_without_usage(self):
warnings = []
for symbol, entries in self.all_symbols.items():
if usage in entries:
continue
if usage_in_legacy in entries:
continue
if legacy_usage in entries:
continue
if symbol in br.symbols_possibly_unused:
continue
if symbol in br.symbols_used_only_in_source_code:
continue
if symbol in br.symbols_used_only_for_host_variant:
continue
if helper in entries:
continue
if choice in entries:
continue
all_items = []
all_items += entries.get(definition, {}).items()
all_items += entries.get(legacy_definition, {}).items()
for filename, linenos in all_items:
for lineno in linenos:
msg = '{} defined but not referenced'.format(symbol)
warnings.append((filename, lineno, msg))
return warnings
def get_warnings_for_symbols_with_legacy_note_and_no_comment_on_usage(self):
warnings = []
for symbol, entries in self.all_symbols.items():
if legacy_note not in entries:
continue
if legacy_usage in entries:
continue
all_items = []
all_items += entries.get(usage, {}).items()
for filename, linenos in all_items:
for lineno in linenos:
msg = '{} missing "# legacy"'.format(symbol)
warnings.append((filename, lineno, msg))
return warnings
def get_warnings_for_symbols_with_legacy_note_and_no_usage(self):
warnings = []
for symbol, entries in self.all_symbols.items():
if legacy_note not in entries:
continue
if legacy_usage in entries:
continue
if usage in entries:
continue
all_items = []
all_items += entries.get(legacy_note, {}).items()
for filename, linenos in all_items:
for lineno in linenos:
msg = '{} not referenced but has a comment stating it is'.format(symbol)
warnings.append((filename, lineno, msg))
return warnings