| #!/usr/bin/env python3 |
| # -*- coding: utf-8 -*- |
| |
| import os |
| import sys |
| |
| def print_array(name, values): |
| if len(values) == 0: |
| return |
| list = ", ".join(values) |
| print(" .%s = ((const char*[]){ %s, NULL })," % (name, list)) |
| |
| def parse_line(line): |
| kind = "" |
| data = "" |
| get_kind = False |
| get_data = False |
| for item in line.split(): |
| if item == "MODINFO_START": |
| get_kind = True |
| continue |
| if item.startswith("MODINFO_END"): |
| get_data = False |
| continue |
| if get_kind: |
| kind = item |
| get_kind = False |
| get_data = True |
| continue |
| if get_data: |
| data += " " + item |
| continue |
| return (kind, data) |
| |
| def generate(name, lines): |
| arch = "" |
| objs = [] |
| deps = [] |
| opts = [] |
| for line in lines: |
| if line.find("MODINFO_START") != -1: |
| (kind, data) = parse_line(line) |
| if kind == 'obj': |
| objs.append(data) |
| elif kind == 'dep': |
| deps.append(data) |
| elif kind == 'opts': |
| opts.append(data) |
| elif kind == 'arch': |
| arch = data; |
| else: |
| print("unknown:", kind) |
| exit(1) |
| |
| print(" .name = \"%s\"," % name) |
| if arch != "": |
| print(" .arch = %s," % arch) |
| print_array("objs", objs) |
| print_array("deps", deps) |
| print_array("opts", opts) |
| print("},{"); |
| return deps |
| |
| def print_pre(): |
| print("/* generated by scripts/modinfo-generate.py */") |
| print("#include \"qemu/osdep.h\"") |
| print("#include \"qemu/module.h\"") |
| print("const QemuModinfo qemu_modinfo[] = {{") |
| |
| def print_post(): |
| print(" /* end of list */") |
| print("}};") |
| |
| def main(args): |
| deps = {} |
| print_pre() |
| for modinfo in args: |
| with open(modinfo) as f: |
| lines = f.readlines() |
| print(" /* %s */" % modinfo) |
| (basename, ext) = os.path.splitext(modinfo) |
| deps[basename] = generate(basename, lines) |
| print_post() |
| |
| flattened_deps = {flat.strip('" ') for dep in deps.values() for flat in dep} |
| error = False |
| for dep in flattened_deps: |
| if dep not in deps.keys(): |
| print("Dependency {} cannot be satisfied".format(dep), |
| file=sys.stderr) |
| error = True |
| |
| if error: |
| exit(1) |
| |
| if __name__ == "__main__": |
| main(sys.argv[1:]) |