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