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 out = [] 22f5723ab6SGerd Hoffmann for item in shlex.split(command): 23f5723ab6SGerd Hoffmann if skip: 24f5723ab6SGerd Hoffmann skip = False 25f5723ab6SGerd Hoffmann continue 26f5723ab6SGerd Hoffmann if item == '-MF' or item == '-MQ' or item == '-o': 27f5723ab6SGerd Hoffmann skip = True 28f5723ab6SGerd Hoffmann continue 29f5723ab6SGerd Hoffmann if item == '-c': 30f5723ab6SGerd Hoffmann skip = True 31f5723ab6SGerd Hoffmann continue 32f5723ab6SGerd Hoffmann out.append(item) 33f5723ab6SGerd Hoffmann out.append('-DQEMU_MODINFO') 34f5723ab6SGerd Hoffmann out.append('-E') 35f5723ab6SGerd Hoffmann out.append(src) 36f5723ab6SGerd Hoffmann return out 37f5723ab6SGerd Hoffmann 38f5723ab6SGerd Hoffmanndef main(args): 39f5723ab6SGerd Hoffmann target = '' 40f5723ab6SGerd Hoffmann if args[0] == '--target': 41f5723ab6SGerd Hoffmann args.pop(0) 42f5723ab6SGerd Hoffmann target = args.pop(0) 43f5723ab6SGerd Hoffmann print("MODINFO_DEBUG target %s" % target) 44f5723ab6SGerd Hoffmann arch = target[:-8] # cut '-softmmu' 45f5723ab6SGerd Hoffmann print("MODINFO_START arch \"%s\" MODINFO_END" % arch) 46f5723ab6SGerd Hoffmann with open('compile_commands.json') as f: 47f5723ab6SGerd Hoffmann compile_commands = json.load(f) 48f5723ab6SGerd Hoffmann for src in args: 49*20f19713SMarc-André Lureau if not src.endswith('.c'): 50*20f19713SMarc-André Lureau print("MODINFO_DEBUG skip %s" % src) 51*20f19713SMarc-André Lureau continue 52f5723ab6SGerd Hoffmann print("MODINFO_DEBUG src %s" % src) 53f5723ab6SGerd Hoffmann command = find_command(src, target, compile_commands) 54f5723ab6SGerd Hoffmann cmdline = process_command(src, command) 55f5723ab6SGerd Hoffmann print("MODINFO_DEBUG cmd", cmdline) 56f5723ab6SGerd Hoffmann result = subprocess.run(cmdline, stdout = subprocess.PIPE, 57f5723ab6SGerd Hoffmann universal_newlines = True) 58f5723ab6SGerd Hoffmann if result.returncode != 0: 59f5723ab6SGerd Hoffmann sys.exit(result.returncode) 60f5723ab6SGerd Hoffmann for line in result.stdout.split('\n'): 61f5723ab6SGerd Hoffmann if line.find('MODINFO') != -1: 62f5723ab6SGerd Hoffmann print(line) 63f5723ab6SGerd Hoffmann 64f5723ab6SGerd Hoffmannif __name__ == "__main__": 65f5723ab6SGerd Hoffmann main(sys.argv[1:]) 66