#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
import sys
import json
import shlex
import subprocess

def process_command(src, command):
    skip = False
    out = []
    for item in shlex.split(command):
        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 = json.load(f)
    compile_commands = { x['output']: x for x in compile_commands_json }

    for obj in args:
        entry = compile_commands.get(obj, None)
        if not entry:
            sys.stderr.print('modinfo: Could not find object file', obj)
            sys.exit(1)
        src = entry['file']
        if not src.endswith('.c'):
            print("MODINFO_DEBUG skip %s" % src)
            continue
        command = entry['command']
        print("MODINFO_DEBUG src %s" % src)
        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:])
