| #!/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:]) |