 05d6814c3e
			
		
	
	
		05d6814c3e
		
	
	
	
	
		
			
			This patch changes the way modinfo is generated and built. Instead of one modinfo.c it generates one modinfo-<target>-softmmu.c per target. It aims a fine-tune control of modules by configuring Kconfig. Signed-off-by: Jose R. Ziviani <jziviani@suse.de> Signed-off-by: Dario Faggioli <dfaggioli@suse.com> Message-Id: <165369003038.5857.13084289285185196779.stgit@work> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
		
			
				
	
	
		
			121 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			3.3 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, 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:])
 |