|  | #!/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, enabled): | 
|  | 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; | 
|  | elif kind == 'kconfig': | 
|  | # don't add a module which dependency is not enabled | 
|  | # in kconfig | 
|  | if data.strip() not in enabled: | 
|  | print("    /* module {} isn't enabled in Kconfig. */" | 
|  | .format(data.strip())) | 
|  | print("/* },{ */") | 
|  | return None | 
|  | 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 {dep.strip('" ') for dep in 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): | 
|  | if len(args) < 3 or args[0] != '--devices': | 
|  | print('Expected: modinfo-generate.py --devices ' | 
|  | 'config-device.mak [modinfo files]', file=sys.stderr) | 
|  | exit(1) | 
|  |  | 
|  | # get all devices enabled in kconfig, from *-config-device.mak | 
|  | enabled = set() | 
|  | with open(args[1]) as file: | 
|  | for line in file.readlines(): | 
|  | config = line.split('=') | 
|  | if config[1].rstrip() == 'y': | 
|  | enabled.add(config[0][7:]) # remove CONFIG_ | 
|  |  | 
|  | deps = set() | 
|  | modules = set() | 
|  | print_pre() | 
|  | for modinfo in args[2:]: | 
|  | with open(modinfo) as f: | 
|  | lines = f.readlines() | 
|  | print("    /* %s */" % modinfo) | 
|  | (basename, _) = os.path.splitext(modinfo) | 
|  | moddeps = generate(basename, lines, enabled) | 
|  | if moddeps is not None: | 
|  | modules.add(basename) | 
|  | deps.update(moddeps) | 
|  | print_post() | 
|  |  | 
|  | error = False | 
|  | for dep in deps.difference(modules): | 
|  | print("Dependency {} cannot be satisfied".format(dep), | 
|  | file=sys.stderr) | 
|  | error = True | 
|  |  | 
|  | if error: | 
|  | exit(1) | 
|  |  | 
|  | if __name__ == "__main__": | 
|  | main(sys.argv[1:]) |