qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

modinfo-collect.py (1898B)


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