| import checksymbolslib.br as br |
| |
| |
| def handle_eval(db, filename, lineno, line): |
| def add_multiple_symbol_usages(package, prefixes=None, suffixes=None): |
| for prefix in prefixes or ['']: |
| for sufix in suffixes or ['']: |
| symbol = prefix + package + sufix |
| db.add_symbol_usage(symbol, filename, lineno) |
| |
| package = br.get_package_from_filename(filename) |
| if '$(rootfs)' in line: |
| suffixes = [''] + br.suffixes_not_defined_for_all_rootfs_types |
| add_multiple_symbol_usages(package, prefixes=[br.rootfs_prefix], suffixes=suffixes) |
| return |
| if '$(kernel-module)' in line: |
| add_multiple_symbol_usages(package, prefixes=[br.package_prefix]) |
| return |
| if '$(barebox-package)' in line: |
| add_multiple_symbol_usages(package, prefixes=[br.boot_prefix], suffixes=br.barebox_infra_suffixes) |
| return |
| |
| if '-package)' not in line: |
| return |
| if package == 'LINUX': |
| # very special case at package/pkg-generic.mk |
| add_multiple_symbol_usages('BR2_LINUX_KERNEL') |
| return |
| |
| # mimic package/pkg-generic.mk and package/pkg-virtual.mk |
| if '$(virtual-' in line: |
| prefixes = ['BR2_PACKAGE_PROVIDES_', 'BR2_PACKAGE_HAS_'] |
| if filename.startswith('toolchain/'): |
| prefix = br.toolchain_prefix |
| else: |
| prefix = br.package_prefix |
| symbol = prefix + package |
| db.add_symbol_virtual(symbol, filename, lineno) |
| prefixes.append(prefix) |
| elif '$(host-virtual-' in line: |
| prefixes = ['BR2_PACKAGE_HOST_', 'BR2_PACKAGE_PROVIDES_HOST_', 'BR2_PACKAGE_HAS_HOST_'] |
| elif '$(host-' in line: |
| prefixes = ['BR2_PACKAGE_HOST_'] |
| elif filename.startswith('boot/'): |
| prefixes = [br.boot_prefix] |
| elif filename.startswith('toolchain/'): |
| prefixes = [br.toolchain_prefix] |
| elif '$(toolchain-' in line: |
| prefixes = [br.toolchain_prefix] |
| else: |
| prefixes = [br.package_prefix] |
| |
| add_multiple_symbol_usages(package, prefixes=prefixes) |
| |
| |
| def handle_definition(db, filename, lineno, line, legacy): |
| symbols = br.re_makefile_symbol_attribution.findall(line) |
| symbols += br.re_makefile_symbol_export.findall(line) |
| for symbol in symbols: |
| if legacy: |
| db.add_symbol_legacy_definition(symbol, filename, lineno) |
| else: |
| db.add_symbol_definition(symbol, filename, lineno) |
| |
| |
| def handle_usage(db, filename, lineno, line, legacy): |
| if br.re_makefile_eval.search(line): |
| handle_eval(db, filename, lineno, line) |
| return |
| |
| symbols = br.re_makefile_symbol_usage.findall(line) |
| for symbol in symbols: |
| if legacy: |
| db.add_symbol_usage_in_legacy(symbol, filename, lineno) |
| else: |
| db.add_symbol_usage(symbol, filename, lineno) |
| |
| |
| def populate_db(db, filename, file_content): |
| legacy = filename.endswith('.legacy') |
| for lineno, raw_line in file_content: |
| line = br.re_comments.sub('', raw_line) |
| handle_definition(db, filename, lineno, line, legacy) |
| handle_usage(db, filename, lineno, line, legacy) |
| |
| |
| def check_filename(filename): |
| if filename.endswith('.mk'): |
| return True |
| if filename.endswith('.mk.in'): |
| return True |
| if filename.startswith('arch/arch.mk.'): |
| return True |
| if filename in [ |
| 'Makefile', |
| 'Makefile.legacy', |
| 'package/Makefile.in' |
| ]: |
| return True |
| return False |