1f5723ab6SGerd Hoffmann#!/usr/bin/env python3 2f5723ab6SGerd Hoffmann# -*- coding: utf-8 -*- 3f5723ab6SGerd Hoffmann 4f5723ab6SGerd Hoffmannimport os 5f5723ab6SGerd Hoffmannimport sys 6f5723ab6SGerd Hoffmannimport json 7f5723ab6SGerd Hoffmannimport shlex 8f5723ab6SGerd Hoffmannimport subprocess 9f5723ab6SGerd Hoffmann 10f5723ab6SGerd Hoffmanndef find_command(src, target, compile_commands): 11f5723ab6SGerd Hoffmann for command in compile_commands: 12f5723ab6SGerd Hoffmann if command['file'] != src: 13f5723ab6SGerd Hoffmann continue 14f5723ab6SGerd Hoffmann if target != '' and command['command'].find(target) == -1: 15f5723ab6SGerd Hoffmann continue 16f5723ab6SGerd Hoffmann return command['command'] 17f5723ab6SGerd Hoffmann return 'false' 18f5723ab6SGerd Hoffmann 19f5723ab6SGerd Hoffmanndef process_command(src, command): 20f5723ab6SGerd Hoffmann skip = False 21f5723ab6SGerd Hoffmann arg = False 22f5723ab6SGerd Hoffmann out = [] 23f5723ab6SGerd Hoffmann for item in shlex.split(command): 24f5723ab6SGerd Hoffmann if arg: 25f5723ab6SGerd Hoffmann out.append(x) 26f5723ab6SGerd Hoffmann arg = False 27f5723ab6SGerd Hoffmann continue 28f5723ab6SGerd Hoffmann if skip: 29f5723ab6SGerd Hoffmann skip = False 30f5723ab6SGerd Hoffmann continue 31f5723ab6SGerd Hoffmann if item == '-MF' or item == '-MQ' or item == '-o': 32f5723ab6SGerd Hoffmann skip = True 33f5723ab6SGerd Hoffmann continue 34f5723ab6SGerd Hoffmann if item == '-c': 35f5723ab6SGerd Hoffmann skip = True 36f5723ab6SGerd Hoffmann continue 37f5723ab6SGerd Hoffmann out.append(item) 38f5723ab6SGerd Hoffmann out.append('-DQEMU_MODINFO') 39f5723ab6SGerd Hoffmann out.append('-E') 40f5723ab6SGerd Hoffmann out.append(src) 41f5723ab6SGerd Hoffmann return out 42f5723ab6SGerd Hoffmann 43f5723ab6SGerd Hoffmanndef main(args): 44f5723ab6SGerd Hoffmann target = '' 45f5723ab6SGerd Hoffmann if args[0] == '--target': 46f5723ab6SGerd Hoffmann args.pop(0) 47f5723ab6SGerd Hoffmann target = args.pop(0) 48f5723ab6SGerd Hoffmann print("MODINFO_DEBUG target %s" % target) 49f5723ab6SGerd Hoffmann arch = target[:-8] # cut '-softmmu' 50f5723ab6SGerd Hoffmann print("MODINFO_START arch \"%s\" MODINFO_END" % arch) 51f5723ab6SGerd Hoffmann with open('compile_commands.json') as f: 52f5723ab6SGerd Hoffmann compile_commands = json.load(f) 53f5723ab6SGerd Hoffmann for src in args: 54*20f19713SMarc-André Lureau if not src.endswith('.c'): 55*20f19713SMarc-André Lureau print("MODINFO_DEBUG skip %s" % src) 56*20f19713SMarc-André Lureau continue 57f5723ab6SGerd Hoffmann print("MODINFO_DEBUG src %s" % src) 58f5723ab6SGerd Hoffmann command = find_command(src, target, compile_commands) 59f5723ab6SGerd Hoffmann cmdline = process_command(src, command) 60f5723ab6SGerd Hoffmann print("MODINFO_DEBUG cmd", cmdline) 61f5723ab6SGerd Hoffmann result = subprocess.run(cmdline, stdout = subprocess.PIPE, 62f5723ab6SGerd Hoffmann universal_newlines = True) 63f5723ab6SGerd Hoffmann if result.returncode != 0: 64f5723ab6SGerd Hoffmann sys.exit(result.returncode) 65f5723ab6SGerd Hoffmann for line in result.stdout.split('\n'): 66f5723ab6SGerd Hoffmann if line.find('MODINFO') != -1: 67f5723ab6SGerd Hoffmann print(line) 68f5723ab6SGerd Hoffmann 69f5723ab6SGerd Hoffmannif __name__ == "__main__": 70f5723ab6SGerd Hoffmann main(sys.argv[1:]) 71