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