qemu/scripts/modinfo-generate.py
Jose R. Ziviani 24ce7aa77d modules: introduces module_kconfig directive
module_kconfig is a new directive that should be used with module_obj
whenever that module depends on the Kconfig to be enabled.

When the module is enabled in Kconfig we are sure that its dependencies
will be enabled as well, thus the module will be loaded without any
problem.

The correct way to use module_kconfig is by passing the Kconfig option
to module_kconfig (or the *config-devices.mak without CONFIG_).

Signed-off-by: Jose R. Ziviani <jziviani@suse.de>
Signed-off-by: Dario Faggioli <dfaggioli@suse.com>
Message-Id: <165369002370.5857.12150544416563557322.stgit@work>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-06 09:26:53 +02:00

99 lines
2.5 KiB
Python
Executable file

#!/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;
elif kind == 'kconfig':
pass # ignore
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:])