All of lore.kernel.org
 help / color / mirror / Atom feed
From: Max Reitz <mreitz@redhat.com>
To: qemu-block@nongnu.org
Cc: qemu-devel@nongnu.org, Max Reitz <mreitz@redhat.com>,
	Peter Maydell <peter.maydell@linaro.org>
Subject: [Qemu-devel] [PULL 14/18] blockdev: Add dynamic generation of module_block.h
Date: Wed, 14 Sep 2016 18:40:58 +0200	[thread overview]
Message-ID: <1473871262-409-15-git-send-email-mreitz@redhat.com> (raw)
In-Reply-To: <1473871262-409-1-git-send-email-mreitz@redhat.com>

From: Marc Mari <markmb@redhat.com>

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>
---
 Makefile                        |   7 +++
 scripts/modules/module_block.py | 108 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 115 insertions(+)
 create mode 100644 scripts/modules/module_block.py

diff --git a/Makefile b/Makefile
index 50b4b3a..3d4c97e 100644
--- a/Makefile
+++ b/Makefile
@@ -76,6 +76,8 @@ GENERATED_HEADERS += trace/generated-ust-provider.h
 GENERATED_SOURCES += trace/generated-ust.c
 endif
 
+GENERATED_HEADERS += module_block.h
+
 # Don't try to regenerate Makefile or configure
 # We don't generate any of them
 Makefile: ;
@@ -353,6 +355,11 @@ ivshmem-client$(EXESUF): $(ivshmem-client-obj-y) libqemuutil.a libqemustub.a
 ivshmem-server$(EXESUF): $(ivshmem-server-obj-y) libqemuutil.a libqemustub.a
 	$(call LINK, $^)
 
+module_block.h: $(SRC_PATH)/scripts/modules/module_block.py config-host.mak
+	$(call quiet-command,$(PYTHON) $< $@ \
+	$(addprefix $(SRC_PATH)/,$(patsubst %.mo,%.c,$(block-obj-m))), \
+	"  GEN   $@")
+
 clean:
 # avoid old build problems by removing potentially incorrect old files
 	rm -f config.mak op-i386.h opc-i386.h gen-op-i386.h op-arm.h opc-arm.h gen-op-arm.h
diff --git a/scripts/modules/module_block.py b/scripts/modules/module_block.py
new file mode 100644
index 0000000..db4fb54
--- /dev/null
+++ b/scripts/modules/module_block.py
@@ -0,0 +1,108 @@
+#!/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)
-- 
2.5.5

  parent reply	other threads:[~2016-09-14 16:41 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-09-14 16:40 [Qemu-devel] [PULL 00/18] Block layer patches Max Reitz
2016-09-14 16:40 ` [Qemu-devel] [PULL 01/18] block: Hide HBitmap in block dirty bitmap interface Max Reitz
2016-09-14 16:40 ` [Qemu-devel] [PULL 02/18] HBitmap: Introduce "meta" bitmap to track bit changes Max Reitz
2016-09-14 16:40 ` [Qemu-devel] [PULL 03/18] tests: Add test code for meta bitmap Max Reitz
2016-09-14 16:40 ` [Qemu-devel] [PULL 04/18] block: Support meta dirty bitmap Max Reitz
2016-09-14 16:40 ` [Qemu-devel] [PULL 05/18] block: Add two dirty bitmap getters Max Reitz
2016-09-14 16:40 ` [Qemu-devel] [PULL 06/18] block: Assert that bdrv_release_dirty_bitmap succeeded Max Reitz
2016-09-14 16:40 ` [Qemu-devel] [PULL 07/18] hbitmap: serialization Max Reitz
2016-09-14 16:40 ` [Qemu-devel] [PULL 08/18] block: BdrvDirtyBitmap serialization interface Max Reitz
2016-09-14 16:40 ` [Qemu-devel] [PULL 09/18] tests: Add test code for hbitmap serialization Max Reitz
2016-09-14 16:40 ` [Qemu-devel] [PULL 10/18] block: More operations for meta dirty bitmap Max Reitz
2016-09-14 16:40 ` [Qemu-devel] [PULL 11/18] qemu-img: add the 'dd' subcommand Max Reitz
2016-09-14 16:40 ` [Qemu-devel] [PULL 12/18] qemu-img: add skip option to dd Max Reitz
2016-09-14 16:40 ` [Qemu-devel] [PULL 13/18] blockdev: prepare iSCSI block driver for dynamic loading Max Reitz
2016-09-14 16:40 ` Max Reitz [this message]
2016-09-14 16:40 ` [Qemu-devel] [PULL 15/18] blockdev: Add dynamic module loading for block drivers Max Reitz
2016-09-14 16:41 ` [Qemu-devel] [PULL 16/18] blockdev: Modularize nfs block driver Max Reitz
2016-09-14 16:41 ` [Qemu-devel] [PULL 17/18] commit: get the overlay node before manipulating the backing chain Max Reitz
2016-09-14 16:41 ` [Qemu-devel] [PULL 18/18] iotest 055: refactor and speed up Max Reitz
2016-09-14 20:16 ` [Qemu-devel] [PULL 00/18] Block layer patches no-reply
2016-09-15 16:10 ` Peter Maydell
2016-09-17 21:32   ` Max Reitz

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1473871262-409-15-git-send-email-mreitz@redhat.com \
    --to=mreitz@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.