Some scripts are invoked via the first "python3" binary in the PATH, because they are executable and their shebang line is "#! /usr/bin/env python3". To enforce usage of $(PYTHON), make them nonexecutable. Scripts invoked via meson need nothing else, and meson-buildoptions.py is already using $(PYTHON). For probe-gdb-support.py however the invocation in the configure script has to be adjusted. Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
		
			
				
	
	
		
			121 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
#!/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:])
 |