modinfo-generate.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import os
  4. import sys
  5. def print_array(name, values):
  6. if len(values) == 0:
  7. return
  8. list = ", ".join(values)
  9. print(" .%s = ((const char*[]){ %s, NULL })," % (name, list))
  10. def parse_line(line):
  11. kind = ""
  12. data = ""
  13. get_kind = False
  14. get_data = False
  15. for item in line.split():
  16. if item == "MODINFO_START":
  17. get_kind = True
  18. continue
  19. if item.startswith("MODINFO_END"):
  20. get_data = False
  21. continue
  22. if get_kind:
  23. kind = item
  24. get_kind = False
  25. get_data = True
  26. continue
  27. if get_data:
  28. data += " " + item
  29. continue
  30. return (kind, data)
  31. def generate(name, lines):
  32. arch = ""
  33. objs = []
  34. deps = []
  35. opts = []
  36. for line in lines:
  37. if line.find("MODINFO_START") != -1:
  38. (kind, data) = parse_line(line)
  39. if kind == 'obj':
  40. objs.append(data)
  41. elif kind == 'dep':
  42. deps.append(data)
  43. elif kind == 'opts':
  44. opts.append(data)
  45. elif kind == 'arch':
  46. arch = data;
  47. elif kind == 'kconfig':
  48. pass # ignore
  49. else:
  50. print("unknown:", kind)
  51. exit(1)
  52. print(" .name = \"%s\"," % name)
  53. if arch != "":
  54. print(" .arch = %s," % arch)
  55. print_array("objs", objs)
  56. print_array("deps", deps)
  57. print_array("opts", opts)
  58. print("},{");
  59. return deps
  60. def print_pre():
  61. print("/* generated by scripts/modinfo-generate.py */")
  62. print("#include \"qemu/osdep.h\"")
  63. print("#include \"qemu/module.h\"")
  64. print("const QemuModinfo qemu_modinfo[] = {{")
  65. def print_post():
  66. print(" /* end of list */")
  67. print("}};")
  68. def main(args):
  69. deps = {}
  70. print_pre()
  71. for modinfo in args:
  72. with open(modinfo) as f:
  73. lines = f.readlines()
  74. print(" /* %s */" % modinfo)
  75. (basename, ext) = os.path.splitext(modinfo)
  76. deps[basename] = generate(basename, lines)
  77. print_post()
  78. flattened_deps = {flat.strip('" ') for dep in deps.values() for flat in dep}
  79. error = False
  80. for dep in flattened_deps:
  81. if dep not in deps.keys():
  82. print("Dependency {} cannot be satisfied".format(dep),
  83. file=sys.stderr)
  84. error = True
  85. if error:
  86. exit(1)
  87. if __name__ == "__main__":
  88. main(sys.argv[1:])