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