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