makefile.py 3.4 KB

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