101 lines
3.4 KiB
Python
101 lines
3.4 KiB
Python
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
|