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