sys.exit(f'[!] ERROR: invalid GCC_VERSION and CLANG_VERSION: {gcc_version} {clang_version}')
-def print_unknown_options(checklist, parsed_options):
+def print_unknown_options(checklist, parsed_options, opt_type):
known_options = []
for o1 in checklist:
for option, value in parsed_options.items():
if option not in known_options:
- print(f'[?] No check for option {option} ({value})')
+ print(f'[?] No check for {opt_type} option {option} ({value})')
def print_checklist(mode, checklist, with_results):
print(f'[+] Config check is finished: \'OK\' - {ok_count}{ok_suppressed} / \'FAIL\' - {fail_count}{fail_suppressed}')
-def parse_kconfig_file(mode, parsed_options, fname):
+def parse_kconfig_file(_mode, parsed_options, fname):
with _open(fname, 'rt', encoding='utf-8') as f:
opt_is_on = re.compile(r"CONFIG_[a-zA-Z0-9_]+=.+$")
opt_is_off = re.compile(r"# CONFIG_[a-zA-Z0-9_]+ is not set$")
mmap_rnd_bits_max = parsed_kconfig_options.get('CONFIG_ARCH_MMAP_RND_BITS_MAX', None)
if mmap_rnd_bits_max:
override_expected_value(config_checklist, 'CONFIG_ARCH_MMAP_RND_BITS', mmap_rnd_bits_max)
+ else:
+ # remove the CONFIG_ARCH_MMAP_RND_BITS check to avoid false results
+ print('[-] Can\'t check CONFIG_ARCH_MMAP_RND_BITS without CONFIG_ARCH_MMAP_RND_BITS_MAX')
+ config_checklist[:] = [o for o in config_checklist if o.name != 'CONFIG_ARCH_MMAP_RND_BITS']
# now everything is ready, perform the checks
perform_checks(config_checklist)
if mode == 'verbose':
# print the parsed options without the checks (for debugging)
- all_parsed_options = parsed_kconfig_options # assignment does not copy
+ print_unknown_options(config_checklist, parsed_kconfig_options, 'kconfig')
if args.cmdline:
- all_parsed_options.update(parsed_cmdline_options)
+ print_unknown_options(config_checklist, parsed_cmdline_options, 'cmdline')
if args.sysctl:
- all_parsed_options.update(parsed_sysctl_options)
- print_unknown_options(config_checklist, all_parsed_options)
+ print_unknown_options(config_checklist, parsed_sysctl_options, 'sysctl')
# finally print the results
print_checklist(mode, config_checklist, True)
if mode == 'verbose':
# print the parsed options without the checks (for debugging)
- print_unknown_options(config_checklist, parsed_sysctl_options)
+ print_unknown_options(config_checklist, parsed_sysctl_options, 'sysctl')
# finally print the results
print_checklist(mode, config_checklist, True)
for opt in config_checklist:
if opt.name == 'CONFIG_ARCH_MMAP_RND_BITS':
continue # don't add CONFIG_ARCH_MMAP_RND_BITS because its value needs refinement
+ if opt.expected == 'is not off':
+ continue # don't add Kconfig options without explicitly recommended values
if opt.expected == 'is not set':
print(f'# {opt.name} is not set')
else: