summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel P. Berrange <berrange@redhat.com>2009-09-16 14:03:53 +0100
committerDaniel P. Berrange <berrange@redhat.com>2009-09-21 14:41:46 +0100
commita9ea906035bcf5cbe95db64f51ed2ff7cec2b503 (patch)
tree0f55b2a22a6e4b44ec5c41b267839f82757090af
parenta5bab7085e42d87561c817f91c26def384611f2e (diff)
downloadlibvirt-python-split-a9ea906035bcf5cbe95db64f51ed2ff7cec2b503.tar.gz
libvirt-python-split-a9ea906035bcf5cbe95db64f51ed2ff7cec2b503.tar.xz
libvirt-python-split-a9ea906035bcf5cbe95db64f51ed2ff7cec2b503.zip
Re-arrange python generator to make it clear what's auto-generated
* README: New file describing what each file is used for * livvirt-override.c, libvirt-override.py, libvirt-override-api.xml, libvirt-override-virConnect.py: Manually written code overriding the generator * typewrappers.c, typewrappers.h: Data type wrappers * generator.py: Automatically pre-prend contents of libvirt-override.py to generated libvirt.py. Output into libvirt.py directly instead of libvirtclass.py. Don't generate libvirtclass.txt at all. Write C files into libvirt.c/.h directly * Makefile.am: Remove rule for creating libvirt.py from libvirt-override.py and libvirtclass.py, since generator.py does it directly
-rw-r--r--.gitignore6
-rw-r--r--Makefile.am36
-rw-r--r--README27
-rwxr-xr-xgenerator.py64
-rw-r--r--libvirt-override-api.xml (renamed from libvirt-python-api.xml)0
-rw-r--r--libvirt-override-virConnect.py (renamed from virConnect.py)0
-rw-r--r--libvirt-override.c (renamed from libvir.c)4
-rw-r--r--libvirt-override.py (renamed from libvir.py)12
-rw-r--r--typewrappers.c (renamed from types.c)2
-rw-r--r--typewrappers.h (renamed from libvirt_wrap.h)0
10 files changed, 80 insertions, 71 deletions
diff --git a/.gitignore b/.gitignore
index db6c706..c191f74 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,9 +7,7 @@ Makefile.in
*.loT
libvirt.py
libvirt-export.c
-libvirtclass.txt
-libvirt-py.[ch]
-libvirtclass.py
-gen_prog
+libvirt.c
+libvirt.h
*.pyc
generated.stamp
diff --git a/Makefile.am b/Makefile.am
index a7c342e..95ae84d 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -13,16 +13,15 @@ DOCS_DIR = $(datadir)/doc/libvirt-python-$(LIBVIRT_VERSION)
DOCS = ${srcdir}/TODO
-CLASSES_EXTRA = virConnect.py
-
-EXTRA_DIST = \
- libvir.c \
- types.c \
- generator.py \
- libvirt_wrap.h \
- libvirt.py \
- libvir.py \
- libvirt-python-api.xml \
+CLASSES_EXTRA = libvirt-override-virConnect.py
+
+EXTRA_DIST = \
+ generator.py \
+ typewrappers.c \
+ typewrappers.h \
+ libvirt-override.c \
+ libvirt-override.py \
+ libvirt-override-api.xml \
$(CLASSES_EXTRA) \
$(DOCS)
@@ -33,7 +32,7 @@ all-local: libvirt.py
python_LTLIBRARIES = libvirtmod.la
-libvirtmod_la_SOURCES = libvir.c types.c libvirt-py.c libvirt-py.h
+libvirtmod_la_SOURCES = libvirt-override.c typewrappers.c libvirt.c libvirt.h
# Python <= 2.4 header files contain a redundant decl, hence we
# need extra flags here
libvirtmod_la_CFLAGS = @WARN_PYTHON_CFLAGS@
@@ -44,12 +43,11 @@ libvirtmod_la_LIBADD = $(mylibs) \
@CYGWIN_EXTRA_LIBADD@ @CYGWIN_EXTRA_PYTHON_LIBADD@
GENERATE = generator.py
-API_DESC = $(top_srcdir)/docs/libvirt-api.xml $(srcdir)/libvirt-python-api.xml
+API_DESC = $(top_srcdir)/docs/libvirt-api.xml $(srcdir)/libvirt-override-api.xml
GENERATED= libvirt-export.c \
- libvirtclass.txt \
- libvirt-py.c \
- libvirt-py.h \
- libvirtclass.py
+ libvirt.c \
+ libvirt.h \
+ libvirt.py
generated.stamp: $(srcdir)/$(GENERATE) $(API_DESC)
$(PYTHON) $(srcdir)/$(GENERATE) $(srcdir)
@@ -57,10 +55,6 @@ generated.stamp: $(srcdir)/$(GENERATE) $(API_DESC)
$(GENERATED): generated.stamp
-libvirt.py: $(srcdir)/libvir.py $(GENERATED) $(CLASSES_EXTRA)
- cat $(srcdir)/libvir.py libvirtclass.py > $@-t
- mv $@-t $@
-
$(libvirtmod_la_OBJECTS): $(GENERATED)
install-data-local:
@@ -73,7 +67,7 @@ install-data-local:
uninstall-local:
rm -f $(DESTDIR)$(pythondir)/libvirt.py
-CLEANFILES= $(GENERATED) generated.stamp libvirt.py
+CLEANFILES= $(GENERATED) generated.stamp
else
all:
diff --git a/README b/README
new file mode 100644
index 0000000..02d4cc4
--- /dev/null
+++ b/README
@@ -0,0 +1,27 @@
+ libvirt Python Bindings README
+ ==============================
+
+Most of the libvirt python binding code is automatically generated
+using the script generator.py, and the API description from
+docs/libvirt-api.xml
+
+
+Manually written files:
+
+ - libvirt-override.c: methods where the C binding needs to be hand crafted
+ - libvirt-override.py: global methods where the C and python bindings have different args
+ - libvirt-override-api.xml: methods where the auto-extracted API docs are not
+ suitable for python auto-generator. Overriding this if the method is going
+ into libvirt-override.c, but we still want auto-generated libvirt-override.py
+ - libvirt-override-virConnect.py: virConnect class methods
+ - typewrappers.h,.c: Python object wrappers for each libvirt C object
+
+
+Auto-generated files:
+
+ - libvirt.py: The main python binding. Comprises auto-generated code, along
+ with contents from libvirt-override.py and libvirt-override-virConnect.py
+ - libvirt.c, libvirt.h: The C glue layer for the python binding. Comprises
+ auto-generated code, along with libvirt-override.c
+ - libvirt-export.c: List of auto-generated C methods, included into
+ the libvirt-override.c method table
diff --git a/generator.py b/generator.py
index ad9c544..c34cb34 100755
--- a/generator.py
+++ b/generator.py
@@ -287,8 +287,8 @@ foreign_encoding_args = (
#######################################################################
#
-# This part writes the C <-> Python stubs libvirt2-py.[ch] and
-# the table libxml2-export.c to add when registrering the Python module
+# This part writes the C <-> Python stubs libvirt.[ch] and
+# the table libvirt-export.c to add when registrering the Python module
#
#######################################################################
@@ -555,7 +555,7 @@ def buildStubs():
py_types['pythonObject'] = ('O', "pythonObject", "pythonObject", "pythonObject")
try:
- f = open(os.path.join(srcPref,"libvirt-python-api.xml"))
+ f = open(os.path.join(srcPref,"libvirt-override-api.xml"))
data = f.read()
(parser, target) = getparser()
parser.feed(data)
@@ -564,22 +564,22 @@ def buildStubs():
print file, ":", msg
- print "Found %d functions in libvirt-python-api.xml" % (
+ print "Found %d functions in libvirt-override-api.xml" % (
len(functions.keys()) - n)
nb_wrap = 0
failed = 0
skipped = 0
- include = open("libvirt-py.h", "w")
+ include = open("libvirt.h", "w")
include.write("/* Generated */\n\n")
export = open("libvirt-export.c", "w")
export.write("/* Generated */\n\n")
- wrapper = open("libvirt-py.c", "w")
+ wrapper = open("libvirt.c", "w")
wrapper.write("/* Generated */\n\n")
wrapper.write("#include <Python.h>\n")
wrapper.write("#include <libvirt/libvirt.h>\n")
- wrapper.write("#include \"libvirt_wrap.h\"\n")
- wrapper.write("#include \"libvirt-py.h\"\n\n")
+ wrapper.write("#include \"typewrappers.h\"\n")
+ wrapper.write("#include \"libvirt.h\"\n\n")
for function in functions.keys():
ret = print_function_wrapper(function, wrapper, export, include)
if ret < 0:
@@ -931,12 +931,30 @@ def buildWrappers():
info = (0, func, name, ret, args, file)
function_classes['None'].append(info)
- classes = open("libvirtclass.py", "w")
+ classes = open("libvirt.py", "w")
+
+ extra = open(os.path.join(srcPref,"libvirt-override.py"), "r")
+ classes.write("#!/usr/bin/python -i\n")
+ classes.write("#\n")
+ classes.write("# WARNING WARNING WARNING WARNING\n")
+ classes.write("#\n")
+ classes.write("# This file is automatically written by generator.py. Any changes\n")
+ classes.write("# made here will be lost.\n")
+ classes.write("#\n")
+ classes.write("# To change the manually written methods edit libvirt-override.py\n")
+ classes.write("# To change the automatically written methods edit generator.py\n")
+ classes.write("#\n")
+ classes.write("# WARNING WARNING WARNING WARNING\n")
+ classes.write("#\n")
+ classes.writelines(extra.readlines())
+ classes.write("#\n")
+ classes.write("# WARNING WARNING WARNING WARNING\n")
+ classes.write("#\n")
+ classes.write("# Automatically written part of python bindings for libvirt\n")
+ classes.write("#\n")
+ classes.write("# WARNING WARNING WARNING WARNING\n")
+ extra.close()
- txt = open("libvirtclass.txt", "w")
- txt.write(" Generated Classes for libvir-python\n\n")
-
- txt.write("#\n# Global functions of the module\n#\n\n")
if function_classes.has_key("None"):
flist = function_classes["None"]
flist.sort(functionCompare)
@@ -945,10 +963,8 @@ def buildWrappers():
(index, func, name, ret, args, file) = info
if file != oldfile:
classes.write("#\n# Functions from module %s\n#\n\n" % file)
- txt.write("\n# functions from module %s\n" % file)
oldfile = file
classes.write("def %s(" % func)
- txt.write("%s()\n" % func);
n = 0
for arg in args:
if n != 0:
@@ -1025,14 +1041,11 @@ def buildWrappers():
classes.write("\n");
- txt.write("\n\n#\n# Set of classes of the module\n#\n\n")
for classname in classes_list:
if classname == "None":
pass
else:
if classes_ancestor.has_key(classname):
- txt.write("\n\nClass %s(%s)\n" % (classname,
- classes_ancestor[classname]))
classes.write("class %s(%s):\n" % (classname,
classes_ancestor[classname]))
classes.write(" def __init__(self, _obj=None):\n")
@@ -1044,7 +1057,6 @@ def buildWrappers():
classes.write(" %s.__init__(self, _obj=_obj)\n\n" % (
classes_ancestor[classname]))
else:
- txt.write("Class %s()\n" % (classname))
classes.write("class %s:\n" % (classname))
if classname in [ "virDomain", "virNetwork", "virInterface", "virStoragePool", "virStorageVol", "virNodeDevice", "virSecret" ]:
classes.write(" def __init__(self, conn, _obj=None):\n")
@@ -1084,16 +1096,13 @@ def buildWrappers():
if file != oldfile:
if file == "python_accessor":
classes.write(" # accessors for %s\n" % (classname))
- txt.write(" # accessors\n")
else:
classes.write(" #\n")
classes.write(" # %s functions from module %s\n" % (
classname, file))
- txt.write("\n # functions from module %s\n" % file)
classes.write(" #\n\n")
oldfile = file
classes.write(" def %s(self" % func)
- txt.write(" %s()\n" % func);
n = 0
for arg in args:
if n != index:
@@ -1316,7 +1325,7 @@ def buildWrappers():
classes.write("\n");
# Append "<classname>.py" to class def, iff it exists
try:
- extra = open(classname + ".py", "r")
+ extra = open(os.path.join(srcPref,"libvirt-override-" + classname + ".py"), "r")
classes.write (" #\n")
classes.write (" # %s methods from %s.py (hand coded)\n" % (classname,classname))
classes.write (" #\n")
@@ -1336,15 +1345,6 @@ def buildWrappers():
classes.write("%s = %s\n" % (name,value))
classes.write("\n");
- if len(functions_skipped) != 0:
- txt.write("\nFunctions skipped:\n")
- for function in functions_skipped:
- txt.write(" %s\n" % function)
- if len(functions_failed) != 0:
- txt.write("\nFunctions failed:\n")
- for function in functions_failed:
- txt.write(" %s\n" % function)
- txt.close()
classes.close()
if buildStubs() < 0:
diff --git a/libvirt-python-api.xml b/libvirt-override-api.xml
index 148b89b..148b89b 100644
--- a/libvirt-python-api.xml
+++ b/libvirt-override-api.xml
diff --git a/virConnect.py b/libvirt-override-virConnect.py
index 1fdf548..1fdf548 100644
--- a/virConnect.py
+++ b/libvirt-override-virConnect.py
diff --git a/libvir.c b/libvirt-override.c
index d4f1eb2..5d24fd2 100644
--- a/libvir.c
+++ b/libvirt-override.c
@@ -19,8 +19,8 @@
#include <Python.h>
#include "libvirt/libvirt.h"
#include "libvirt/virterror.h"
-#include "libvirt_wrap.h"
-#include "libvirt-py.h"
+#include "typewrappers.h"
+#include "libvirt.h"
#ifndef __CYGWIN__
extern void initlibvirtmod(void);
diff --git a/libvir.py b/libvirt-override.py
index 3cda8dc..92c6e03 100644
--- a/libvir.py
+++ b/libvirt-override.py
@@ -1,8 +1,5 @@
-#!/usr/bin/python -u
#
-# Those are the autogenerated Python bindings for libvirt.
-# Check python/generator.py in the source distribution of libvir
-# to find out more about the generation process
+# Manually written part of python bindings for libvirt
#
# On cygwin, the DLL is called cygvirtmod.dll
@@ -145,10 +142,3 @@ def eventInvokeTimeoutCallback (timer, callback, opaque):
libvirtmod.virEventInvokeTimeoutCallback(timer, callback, opaque);
-
-# WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
-#
-# Everything before this line comes from libvir.py
-# Everything after this line is automatically generated
-#
-# WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
diff --git a/types.c b/typewrappers.c
index c445f5f..0d8ac97 100644
--- a/types.c
+++ b/typewrappers.c
@@ -14,7 +14,7 @@
* which has over 180 autoconf-style HAVE_* definitions. Shame on them. */
#undef HAVE_PTHREAD_H
-#include "libvirt_wrap.h"
+#include "typewrappers.h"
PyObject *
libvirt_intWrap(int val)
diff --git a/libvirt_wrap.h b/typewrappers.h
index 99d5805..99d5805 100644
--- a/libvirt_wrap.h
+++ b/typewrappers.h