summaryrefslogtreecommitdiffstats
path: root/scripts/modinfo-collect.py
blob: 61b90688c6dc983a21fb3b9043883c5f7c598e4c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#!/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
    arg = False
    out = []
    for item in shlex.split(command):
        if arg:
            out.append(x)
            arg = False
            continue
        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:])