modinfo-generate.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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. else:
  48. print("unknown:", kind)
  49. exit(1)
  50. print(" .name = \"%s\"," % name)
  51. if arch != "":
  52. print(" .arch = %s," % arch)
  53. print_array("objs", objs)
  54. print_array("deps", deps)
  55. print_array("opts", opts)
  56. print("},{");
  57. return deps
  58. def print_pre():
  59. print("/* generated by scripts/modinfo-generate.py */")
  60. print("#include \"qemu/osdep.h\"")
  61. print("#include \"qemu/module.h\"")
  62. print("const QemuModinfo qemu_modinfo[] = {{")
  63. def print_post():
  64. print(" /* end of list */")
  65. print("}};")
  66. def main(args):
  67. deps = {}
  68. print_pre()
  69. for modinfo in args:
  70. with open(modinfo) as f:
  71. lines = f.readlines()
  72. print(" /* %s */" % modinfo)
  73. (basename, ext) = os.path.splitext(modinfo)
  74. deps[basename] = generate(basename, lines)
  75. print_post()
  76. flattened_deps = {flat.strip('" ') for dep in deps.values() for flat in dep}
  77. error = False
  78. for dep in flattened_deps:
  79. if dep not in deps.keys():
  80. print("Dependency {} cannot be satisfied".format(dep),
  81. file=sys.stderr)
  82. error = True
  83. if error:
  84. exit(1)
  85. if __name__ == "__main__":
  86. main(sys.argv[1:])