1import checksymbolslib.br as br 2 3 4def handle_eval(db, filename, lineno, line): 5 def add_multiple_symbol_usages(package, prefixes=None, suffixes=None): 6 for prefix in prefixes or ['']: 7 for sufix in suffixes or ['']: 8 symbol = prefix + package + sufix 9 db.add_symbol_usage(symbol, filename, lineno) 10 11 package = br.get_package_from_filename(filename) 12 if '$(rootfs)' in line: 13 suffixes = [''] + br.suffixes_not_defined_for_all_rootfs_types 14 add_multiple_symbol_usages(package, prefixes=[br.rootfs_prefix], suffixes=suffixes) 15 return 16 if '$(kernel-module)' in line: 17 add_multiple_symbol_usages(package, prefixes=[br.package_prefix]) 18 return 19 if '$(barebox-package)' in line: 20 add_multiple_symbol_usages(package, prefixes=[br.boot_prefix], suffixes=br.barebox_infra_suffixes) 21 return 22 23 if '-package)' not in line: 24 return 25 if package == 'LINUX': 26 # very special case at package/pkg-generic.mk 27 add_multiple_symbol_usages('BR2_LINUX_KERNEL') 28 return 29 30 # mimic package/pkg-generic.mk and package/pkg-virtual.mk 31 if '$(virtual-' in line: 32 prefixes = ['BR2_PACKAGE_PROVIDES_', 'BR2_PACKAGE_HAS_'] 33 if filename.startswith('toolchain/'): 34 prefix = br.toolchain_prefix 35 else: 36 prefix = br.package_prefix 37 symbol = prefix + package 38 db.add_symbol_virtual(symbol, filename, lineno) 39 prefixes.append(prefix) 40 elif '$(host-virtual-' in line: 41 prefixes = ['BR2_PACKAGE_HOST_', 'BR2_PACKAGE_PROVIDES_HOST_', 'BR2_PACKAGE_HAS_HOST_'] 42 elif '$(host-' in line: 43 prefixes = ['BR2_PACKAGE_HOST_'] 44 elif filename.startswith('boot/'): 45 prefixes = [br.boot_prefix] 46 elif filename.startswith('toolchain/'): 47 prefixes = [br.toolchain_prefix] 48 elif '$(toolchain-' in line: 49 prefixes = [br.toolchain_prefix] 50 else: 51 prefixes = [br.package_prefix] 52 53 add_multiple_symbol_usages(package, prefixes=prefixes) 54 55 56def handle_definition(db, filename, lineno, line, legacy): 57 symbols = br.re_makefile_symbol_attribution.findall(line) 58 symbols += br.re_makefile_symbol_export.findall(line) 59 for symbol in symbols: 60 if legacy: 61 db.add_symbol_legacy_definition(symbol, filename, lineno) 62 else: 63 db.add_symbol_definition(symbol, filename, lineno) 64 65 66def handle_usage(db, filename, lineno, line, legacy): 67 if br.re_makefile_eval.search(line): 68 handle_eval(db, filename, lineno, line) 69 return 70 71 symbols = br.re_makefile_symbol_usage.findall(line) 72 for symbol in symbols: 73 if legacy: 74 db.add_symbol_usage_in_legacy(symbol, filename, lineno) 75 else: 76 db.add_symbol_usage(symbol, filename, lineno) 77 78 79def populate_db(db, filename, file_content): 80 legacy = filename.endswith('.legacy') 81 for lineno, raw_line in file_content: 82 line = br.re_comments.sub('', raw_line) 83 handle_definition(db, filename, lineno, line, legacy) 84 handle_usage(db, filename, lineno, line, legacy) 85 86 87def check_filename(filename): 88 if filename.endswith('.mk'): 89 return True 90 if filename.endswith('.mk.in'): 91 return True 92 if filename.startswith('arch/arch.mk.'): 93 return True 94 if filename in [ 95 'Makefile', 96 'Makefile.legacy', 97 'package/Makefile.in' 98 ]: 99 return True 100 return False 101