xemu/scripts/modules/module_block.py
Marc Mari 0c0c1fd973 blockdev: Add dynamic generation of module_block.h
To simplify the addition of new block modules, add a script that generates
module_block.h automatically from the modules' source code.

This script assumes that the QEMU coding style rules are followed.

Signed-off-by: Marc Marí <markmb@redhat.com>
Signed-off-by: Colin Lord <clord@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Message-id: 1471008424-16465-3-git-send-email-clord@redhat.com
Reviewed-by: Max Reitz <mreitz@redhat.com>
Signed-off-by: Max Reitz <mreitz@redhat.com>
2016-09-20 22:10:58 +02:00

109 lines
2.9 KiB
Python

#!/usr/bin/python
#
# Module information generator
#
# Copyright Red Hat, Inc. 2015 - 2016
#
# Authors:
# Marc Mari <markmb@redhat.com>
#
# This work is licensed under the terms of the GNU GPL, version 2.
# See the COPYING file in the top-level directory.
from __future__ import print_function
import sys
import os
def get_string_struct(line):
data = line.split()
# data[0] -> struct element name
# data[1] -> =
# data[2] -> value
return data[2].replace('"', '')[:-1]
def add_module(fheader, library, format_name, protocol_name):
lines = []
lines.append('.library_name = "' + library + '",')
if format_name != "":
lines.append('.format_name = "' + format_name + '",')
if protocol_name != "":
lines.append('.protocol_name = "' + protocol_name + '",')
text = '\n '.join(lines)
fheader.write('\n {\n ' + text + '\n },')
def process_file(fheader, filename):
# This parser assumes the coding style rules are being followed
with open(filename, "r") as cfile:
found_something = False
found_start = False
library, _ = os.path.splitext(os.path.basename(filename))
for line in cfile:
if found_start:
line = line.replace('\n', '')
if line.find(".format_name") != -1:
format_name = get_string_struct(line)
elif line.find(".protocol_name") != -1:
protocol_name = get_string_struct(line)
elif line == "};":
add_module(fheader, library, format_name, protocol_name)
found_start = False
elif line.find("static BlockDriver") != -1:
found_something = True
found_start = True
format_name = ""
protocol_name = ""
if not found_something:
print("No BlockDriver struct found in " + filename + ". \
Is this really a module?", file=sys.stderr)
sys.exit(1)
def print_top(fheader):
fheader.write('''/* AUTOMATICALLY GENERATED, DO NOT MODIFY */
/*
* QEMU Block Module Infrastructure
*
* Authors:
* Marc Mari <markmb@redhat.com>
*/
''')
fheader.write('''#ifndef QEMU_MODULE_BLOCK_H
#define QEMU_MODULE_BLOCK_H
#include "qemu-common.h"
static const struct {
const char *format_name;
const char *protocol_name;
const char *library_name;
} block_driver_modules[] = {''')
def print_bottom(fheader):
fheader.write('''
};
#endif
''')
# First argument: output file
# All other arguments: modules source files (.c)
output_file = sys.argv[1]
with open(output_file, 'w') as fheader:
print_top(fheader)
for filename in sys.argv[2:]:
if os.path.isfile(filename):
process_file(fheader, filename)
else:
print("File " + filename + " does not exist.", file=sys.stderr)
sys.exit(1)
print_bottom(fheader)
sys.exit(0)