| #!/usr/bin/env python3 | 
 | # -*- coding: utf-8 -*- | 
 |  | 
 | import os | 
 | import sys | 
 | import json | 
 | import shlex | 
 | import subprocess | 
 |  | 
 | def find_command(src, target, compile_commands): | 
 |     for command in compile_commands: | 
 |         if command['file'] != src: | 
 |             continue | 
 |         if target != '' and command['command'].find(target) == -1: | 
 |             continue | 
 |         return command['command'] | 
 |     return 'false' | 
 |  | 
 | def process_command(src, command): | 
 |     skip = False | 
 |     out = [] | 
 |     for item in shlex.split(command): | 
 |         if skip: | 
 |             skip = False | 
 |             continue | 
 |         if item == '-MF' or item == '-MQ' or item == '-o': | 
 |             skip = True | 
 |             continue | 
 |         if item == '-c': | 
 |             skip = True | 
 |             continue | 
 |         out.append(item) | 
 |     out.append('-DQEMU_MODINFO') | 
 |     out.append('-E') | 
 |     out.append(src) | 
 |     return out | 
 |  | 
 | def main(args): | 
 |     target = '' | 
 |     if args[0] == '--target': | 
 |         args.pop(0) | 
 |         target = args.pop(0) | 
 |         print("MODINFO_DEBUG target %s" % target) | 
 |         arch = target[:-8] # cut '-softmmu' | 
 |         print("MODINFO_START arch \"%s\" MODINFO_END" % arch) | 
 |     with open('compile_commands.json') as f: | 
 |         compile_commands = json.load(f) | 
 |     for src in args: | 
 |         if not src.endswith('.c'): | 
 |             print("MODINFO_DEBUG skip %s" % src) | 
 |             continue | 
 |         print("MODINFO_DEBUG src %s" % src) | 
 |         command = find_command(src, target, compile_commands) | 
 |         cmdline = process_command(src, command) | 
 |         print("MODINFO_DEBUG cmd", cmdline) | 
 |         result = subprocess.run(cmdline, stdout = subprocess.PIPE, | 
 |                                 universal_newlines = True) | 
 |         if result.returncode != 0: | 
 |             sys.exit(result.returncode) | 
 |         for line in result.stdout.split('\n'): | 
 |             if line.find('MODINFO') != -1: | 
 |                 print(line) | 
 |  | 
 | if __name__ == "__main__": | 
 |     main(sys.argv[1:]) |