diff --git a/ChangeLog b/ChangeLog index 6d803267..a4e84f5e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +Fri Feb 22 23:44:57 CET 2002 Daniel Veillard + + * python/README python/generator.py python/libxml.c python/setup.py: + added the 'usual' setup.py to allow building a libxml2-python + module based on the same code. The initialization is however + different the 2 .so files fo libxml2 and libxslt are identical and + they entry point initialize both libraries. this is done to avoid + some possible nasty problem since the Python don't merge the maps + of all shared modules. + Wed Feb 20 23:16:08 CET 2002 Daniel Veillard * parser.c: fixed a push/encoding bug reported by Michael diff --git a/python/README b/python/README new file mode 100644 index 00000000..b46eee40 --- /dev/null +++ b/python/README @@ -0,0 +1,34 @@ + Module libxml2-python + ===================== + +This is the libxml2 python module, providing access to the +libxml2 and libxslt (if available) libraries. For general +informationss on those XML and XSLT libraries check their +web pages at : + http://xmlsoft.org/ + and + http://xmlsoft.org/XSLT/ + +The latest version of the sources for this module and the +associated libraries can be found at: + ftp://xmlsoft.org/ + +Binaries packages of the libxml2 and libxslt libraries can +be found either on the FTP site for Linux, from external +sources linked from the web pages, or as part of your set of +packages provided with your operating system. + +NOTE: +this module distribution is not the primary distribution +of the libxml2 and libxslt Python binding code, but as +the Python way of packaging those for non-Linux systems. +The main sources are the libxml2 and libxslt tar.gz found on +the site. One side effect is that the official RPM packages for +those modules are not generated from the libxml2-python +distributions but as part of the normal RPM packaging of +those two libraries. +The RPM packages can be found at: + http://rpmfind.net/linux/rpm2html/search.php?query=libxml2-python + http://rpmfind.net/linux/rpm2html/search.php?query=libxslt-python + +Daniel Veillard diff --git a/python/generator.py b/python/generator.py index 09009a2c..7a575c57 100755 --- a/python/generator.py +++ b/python/generator.py @@ -5,6 +5,7 @@ functions = {} +import sys import string ####################################################################### @@ -408,65 +409,78 @@ def print_function_wrapper(name, output, export, include): output.write("}\n\n") return 1 -try: - f = open("../doc/libxml2-api.xml") - data = f.read() - (parser, target) = getparser() - parser.feed(data) - parser.close() -except IOError, msg: - print file, ":", msg +def buildStubs(): + global py_types + global py_return_types + global unknown_types -n = len(functions.keys()) -print "Found %d functions in libxml2-api.xml" % (n) + try: + f = open("libxml2-api.xml") + data = f.read() + (parser, target) = getparser() + parser.feed(data) + parser.close() + except IOError, msg: + try: + f = open("../doc/libxml2-api.xml") + data = f.read() + (parser, target) = getparser() + parser.feed(data) + parser.close() + except IOError, msg: + print file, ":", msg + sys.exit(1) -py_types['pythonObject'] = ('O', "pythonObject", "pythonObject", "pythonObject") -try: - f = open("libxml2-python-api.xml") - data = f.read() - (parser, target) = getparser() - parser.feed(data) - parser.close() -except IOError, msg: - print file, ":", msg + n = len(functions.keys()) + print "Found %d functions in libxml2-api.xml" % (n) + + py_types['pythonObject'] = ('O', "pythonObject", "pythonObject", "pythonObject") + try: + f = open("libxml2-python-api.xml") + data = f.read() + (parser, target) = getparser() + parser.feed(data) + parser.close() + except IOError, msg: + print file, ":", msg -print "Found %d functions in libxml2-python-api.xml" % ( - len(functions.keys()) - n) -nb_wrap = 0 -failed = 0 -skipped = 0 + print "Found %d functions in libxml2-python-api.xml" % ( + len(functions.keys()) - n) + nb_wrap = 0 + failed = 0 + skipped = 0 -include = open("libxml2-py.h", "w") -include.write("/* Generated */\n\n") -export = open("libxml2-export.c", "w") -export.write("/* Generated */\n\n") -wrapper = open("libxml2-py.c", "w") -wrapper.write("/* Generated */\n\n") -wrapper.write("#include \n") -wrapper.write("#include \n") -wrapper.write("#include \"libxml_wrap.h\"\n") -wrapper.write("#include \"libxml2-py.h\"\n\n") -for function in functions.keys(): - ret = print_function_wrapper(function, wrapper, export, include) - if ret < 0: - failed = failed + 1 - del functions[function] - if ret == 0: - skipped = skipped + 1 - del functions[function] - if ret == 1: - nb_wrap = nb_wrap + 1 -include.close() -export.close() -wrapper.close() + include = open("libxml2-py.h", "w") + include.write("/* Generated */\n\n") + export = open("libxml2-export.c", "w") + export.write("/* Generated */\n\n") + wrapper = open("libxml2-py.c", "w") + wrapper.write("/* Generated */\n\n") + wrapper.write("#include \n") + wrapper.write("#include \n") + wrapper.write("#include \"libxml_wrap.h\"\n") + wrapper.write("#include \"libxml2-py.h\"\n\n") + for function in functions.keys(): + ret = print_function_wrapper(function, wrapper, export, include) + if ret < 0: + failed = failed + 1 + del functions[function] + if ret == 0: + skipped = skipped + 1 + del functions[function] + if ret == 1: + nb_wrap = nb_wrap + 1 + include.close() + export.close() + wrapper.close() -print "Generated %d wrapper functions, %d failed, %d skipped\n" % (nb_wrap, - failed, skipped); -print "Missing type converters: " -for type in unknown_types.keys(): - print "%s:%d " % (type, len(unknown_types[type])), -print + print "Generated %d wrapper functions, %d failed, %d skipped\n" % (nb_wrap, + failed, skipped); + print "Missing type converters: " + for type in unknown_types.keys(): + print "%s:%d " % (type, len(unknown_types[type])), + print ####################################################################### # @@ -531,36 +545,8 @@ classes_destructors = { function_classes = {} function_classes["None"] = [] -for type in classes_type.keys(): - function_classes[classes_type[type][2]] = [] - -# -# Build the list of C types to look for ordered to start with primary classes -# -ctypes = [] -classes_list = [] -ctypes_processed = {} -classes_processed = {} -for classe in primary_classes: - classes_list.append(classe) - classes_processed[classe] = () - for type in classes_type.keys(): - tinfo = classes_type[type] - if tinfo[2] == classe: - ctypes.append(type) - ctypes_processed[type] = () -for type in classes_type.keys(): - if ctypes_processed.has_key(type): - continue - tinfo = classes_type[type] - if not classes_processed.has_key(tinfo[2]): - classes_list.append(tinfo[2]) - classes_processed[tinfo[2]] = () - - ctypes.append(type) - ctypes_processed[type] = () -def nameFixup(function, classe, type, file): +def nameFixup(name, classe, type, file): listname = classe + "List" ll = len(listname) l = len(classe) @@ -613,49 +599,6 @@ def nameFixup(function, classe, type, file): func = "UTF8" + func[4:] return func -for name in functions.keys(): - found = 0; - (desc, ret, args, file) = functions[name] - for type in ctypes: - classe = classes_type[type][2] - - if name[0:3] == "xml" and len(args) >= 1 and args[0][1] == type: - found = 1 - func = nameFixup(name, classe, type, file) - info = (0, func, name, ret, args, file) - function_classes[classe].append(info) - elif name[0:3] == "xml" and len(args) >= 2 and args[1][1] == type: - found = 1 - func = nameFixup(name, classe, type, file) - info = (1, func, name, ret, args, file) - function_classes[classe].append(info) - elif name[0:4] == "html" and len(args) >= 1 and args[0][1] == type: - found = 1 - func = nameFixup(name, classe, type, file) - info = (0, func, name, ret, args, file) - function_classes[classe].append(info) - elif name[0:4] == "html" and len(args) >= 2 and args[1][1] == type: - found = 1 - func = nameFixup(name, classe, type, file) - info = (1, func, name, ret, args, file) - function_classes[classe].append(info) - if found == 1: - break - if found == 1: - continue - if name[0:8] == "xmlXPath": - continue - if name[0:6] == "xmlStr": - continue - if name[0:10] == "xmlCharStr": - continue - func = nameFixup(name, "None", file, file) - info = (0, func, name, ret, args, file) - function_classes['None'].append(info) - -classes = open("libxml2class.py", "w") -txt = open("libxml2class.txt", "w") -txt.write(" Generated Classes for libxml2-python\n\n") def functionCompare(info1, info2): (index1, func1, name1, ret1, args1, file1) = info1 @@ -695,157 +638,253 @@ def writeDoc(name, args, indent, output): output.write(val); output.write('"""\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) - oldfile = "" - for info in flist: - (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: - classes.write(", ") - classes.write("%s" % arg[0]) - n = n + 1 - classes.write("):\n") - writeDoc(name, args, ' ', classes); +def buildWrappers(): + global ctypes + global py_types + global py_return_types + global unknown_types + global functions + global function_classes + global classes_type + global classes_list + global converter_type + global primary_classes + global converter_type + global classes_ancestor + global converter_type + global primary_classes + global classes_ancestor + global classes_destructors - for arg in args: - if classes_type.has_key(arg[1]): - classes.write(" if %s == None: %s__o = None\n" % - (arg[0], arg[0])) - classes.write(" else: %s__o = %s%s\n" % - (arg[0], arg[0], classes_type[arg[1]][0])) - if ret[0] != "void": - classes.write(" ret = "); - else: - classes.write(" "); - classes.write("libxml2mod.%s(" % name) - n = 0 - for arg in args: - if n != 0: - classes.write(", "); - classes.write("%s" % arg[0]) - if classes_type.has_key(arg[1]): - classes.write("__o"); - n = n + 1 - classes.write(")\n"); - if ret[0] != "void": - if classes_type.has_key(ret[0]): - classes.write(" if ret == None: return None\n"); - classes.write(" return "); - classes.write(classes_type[ret[0]][1] % ("ret")); - classes.write("\n"); - else: - classes.write(" return ret\n"); - classes.write("\n"); + for type in classes_type.keys(): + function_classes[classes_type[type][2]] = [] -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") - classes.write(" self._o = None\n") - classes.write(" %s.__init__(self, _obj=_obj)\n\n" % ( - classes_ancestor[classname])) - if classes_ancestor[classname] == "xmlCore" or \ - classes_ancestor[classname] == "xmlNode": - classes.write(" def __repr__(self):\n") - format = "%s:%%s" % (classname) - classes.write(" return \"%s\" %% (self.name)\n\n" % ( - format)) - else: - txt.write("Class %s()\n" % (classname)) - classes.write("class %s:\n" % (classname)) - classes.write(" def __init__(self, _obj=None):\n") - classes.write(" if _obj != None:self._o = _obj;return\n") - classes.write(" self._o = None\n\n"); - if classes_destructors.has_key(classname): - classes.write(" def __del__(self):\n") - classes.write(" if self._o != None:\n") - classes.write(" libxml2mod.%s(self._o)\n" % - classes_destructors[classname]); - classes.write(" self._o = None\n\n"); - flist = function_classes[classname] - flist.sort(functionCompare) - oldfile = "" - for info in flist: - (index, func, name, ret, args, file) = info - 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: - classes.write(", %s" % arg[0]) - n = n + 1 - classes.write("):\n") - writeDoc(name, args, ' ', classes); - n = 0 - for arg in args: - if classes_type.has_key(arg[1]): - if n != index: - classes.write(" if %s == None: %s__o = None\n" % - (arg[0], arg[0])) - classes.write(" else: %s__o = %s%s\n" % - (arg[0], arg[0], classes_type[arg[1]][0])) - n = n + 1 - if ret[0] != "void": - classes.write(" ret = "); - else: - classes.write(" "); - classes.write("libxml2mod.%s(" % name) - n = 0 - for arg in args: - if n != 0: - classes.write(", "); - if n != index: - classes.write("%s" % arg[0]) - if classes_type.has_key(arg[1]): - classes.write("__o"); - else: - classes.write("self"); - if classes_type.has_key(arg[1]): - classes.write(classes_type[arg[1]][0]) - n = n + 1 - classes.write(")\n"); - if ret[0] != "void": - if classes_type.has_key(ret[0]): - classes.write(" if ret == None: return None\n"); - classes.write(" return "); - classes.write(classes_type[ret[0]][1] % ("ret")); - classes.write("\n"); - elif converter_type.has_key(ret[0]): - classes.write(" if ret == None: return None\n"); - classes.write(" return "); - classes.write(converter_type[ret[0]] % ("ret")); - classes.write("\n"); - else: - classes.write(" return ret\n"); - classes.write("\n"); + # + # Build the list of C types to look for ordered to start + # with primary classes + # + ctypes = [] + classes_list = [] + ctypes_processed = {} + classes_processed = {} + for classe in primary_classes: + classes_list.append(classe) + classes_processed[classe] = () + for type in classes_type.keys(): + tinfo = classes_type[type] + if tinfo[2] == classe: + ctypes.append(type) + ctypes_processed[type] = () + for type in classes_type.keys(): + if ctypes_processed.has_key(type): + continue + tinfo = classes_type[type] + if not classes_processed.has_key(tinfo[2]): + classes_list.append(tinfo[2]) + classes_processed[tinfo[2]] = () + + ctypes.append(type) + ctypes_processed[type] = () -txt.close() -classes.close() + for name in functions.keys(): + found = 0; + (desc, ret, args, file) = functions[name] + for type in ctypes: + classe = classes_type[type][2] + + if name[0:3] == "xml" and len(args) >= 1 and args[0][1] == type: + found = 1 + func = nameFixup(name, classe, type, file) + info = (0, func, name, ret, args, file) + function_classes[classe].append(info) + elif name[0:3] == "xml" and len(args) >= 2 and args[1][1] == type: + found = 1 + func = nameFixup(name, classe, type, file) + info = (1, func, name, ret, args, file) + function_classes[classe].append(info) + elif name[0:4] == "html" and len(args) >= 1 and args[0][1] == type: + found = 1 + func = nameFixup(name, classe, type, file) + info = (0, func, name, ret, args, file) + function_classes[classe].append(info) + elif name[0:4] == "html" and len(args) >= 2 and args[1][1] == type: + found = 1 + func = nameFixup(name, classe, type, file) + info = (1, func, name, ret, args, file) + function_classes[classe].append(info) + if found == 1: + break + if found == 1: + continue + if name[0:8] == "xmlXPath": + continue + if name[0:6] == "xmlStr": + continue + if name[0:10] == "xmlCharStr": + continue + func = nameFixup(name, "None", file, file) + info = (0, func, name, ret, args, file) + function_classes['None'].append(info) + + classes = open("libxml2class.py", "w") + txt = open("libxml2class.txt", "w") + txt.write(" Generated Classes for libxml2-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) + oldfile = "" + for info in flist: + (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: + classes.write(", ") + classes.write("%s" % arg[0]) + n = n + 1 + classes.write("):\n") + writeDoc(name, args, ' ', classes); + + for arg in args: + if classes_type.has_key(arg[1]): + classes.write(" if %s == None: %s__o = None\n" % + (arg[0], arg[0])) + classes.write(" else: %s__o = %s%s\n" % + (arg[0], arg[0], classes_type[arg[1]][0])) + if ret[0] != "void": + classes.write(" ret = "); + else: + classes.write(" "); + classes.write("libxml2mod.%s(" % name) + n = 0 + for arg in args: + if n != 0: + classes.write(", "); + classes.write("%s" % arg[0]) + if classes_type.has_key(arg[1]): + classes.write("__o"); + n = n + 1 + classes.write(")\n"); + if ret[0] != "void": + if classes_type.has_key(ret[0]): + classes.write(" if ret == None: return None\n"); + classes.write(" return "); + classes.write(classes_type[ret[0]][1] % ("ret")); + classes.write("\n"); + else: + classes.write(" return ret\n"); + 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") + classes.write(" self._o = None\n") + classes.write(" %s.__init__(self, _obj=_obj)\n\n" % ( + classes_ancestor[classname])) + if classes_ancestor[classname] == "xmlCore" or \ + classes_ancestor[classname] == "xmlNode": + classes.write(" def __repr__(self):\n") + format = "%s:%%s" % (classname) + classes.write(" return \"%s\" %% (self.name)\n\n" % ( + format)) + else: + txt.write("Class %s()\n" % (classname)) + classes.write("class %s:\n" % (classname)) + classes.write(" def __init__(self, _obj=None):\n") + classes.write(" if _obj != None:self._o = _obj;return\n") + classes.write(" self._o = None\n\n"); + if classes_destructors.has_key(classname): + classes.write(" def __del__(self):\n") + classes.write(" if self._o != None:\n") + classes.write(" libxml2mod.%s(self._o)\n" % + classes_destructors[classname]); + classes.write(" self._o = None\n\n"); + flist = function_classes[classname] + flist.sort(functionCompare) + oldfile = "" + for info in flist: + (index, func, name, ret, args, file) = info + 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: + classes.write(", %s" % arg[0]) + n = n + 1 + classes.write("):\n") + writeDoc(name, args, ' ', classes); + n = 0 + for arg in args: + if classes_type.has_key(arg[1]): + if n != index: + classes.write(" if %s == None: %s__o = None\n" % + (arg[0], arg[0])) + classes.write(" else: %s__o = %s%s\n" % + (arg[0], arg[0], classes_type[arg[1]][0])) + n = n + 1 + if ret[0] != "void": + classes.write(" ret = "); + else: + classes.write(" "); + classes.write("libxml2mod.%s(" % name) + n = 0 + for arg in args: + if n != 0: + classes.write(", "); + if n != index: + classes.write("%s" % arg[0]) + if classes_type.has_key(arg[1]): + classes.write("__o"); + else: + classes.write("self"); + if classes_type.has_key(arg[1]): + classes.write(classes_type[arg[1]][0]) + n = n + 1 + classes.write(")\n"); + if ret[0] != "void": + if classes_type.has_key(ret[0]): + classes.write(" if ret == None: return None\n"); + classes.write(" return "); + classes.write(classes_type[ret[0]][1] % ("ret")); + classes.write("\n"); + elif converter_type.has_key(ret[0]): + classes.write(" if ret == None: return None\n"); + classes.write(" return "); + classes.write(converter_type[ret[0]] % ("ret")); + classes.write("\n"); + else: + classes.write(" return ret\n"); + classes.write("\n"); + + txt.close() + classes.close() + + +buildStubs() +buildWrappers() diff --git a/python/libxml.c b/python/libxml.c index 1a212791..e6a9eb81 100644 --- a/python/libxml.c +++ b/python/libxml.c @@ -4,6 +4,9 @@ * entry points where an automatically generated stub is either * unpractical or would not match cleanly the Python model. * + * If compiled with MERGED_MODULES, the entry point will be used to + * initialize both the libxml2 and the libxslt wrappers + * * See Copyright for the status of this software. * * daniel@veillard.com @@ -1418,9 +1421,16 @@ static PyMethodDef libxmlMethods[] = { { NULL } }; +#ifdef MERGED_MODULES +extern void initlibxml2mod(void); +#endif + void initlibxml2mod(void) { PyObject *m; m = Py_InitModule("libxml2mod", libxmlMethods); libxml_xmlErrorInitialize(); +#ifdef MERGED_MODULES + initlibxsltmod(); +#endif } diff --git a/python/setup.py b/python/setup.py new file mode 100755 index 00000000..57a890a2 --- /dev/null +++ b/python/setup.py @@ -0,0 +1,120 @@ +#!/usr/bin/python -u +# +# Setup script for libxml2 and libxslt if found +# +import sys, os +from distutils.core import setup, Extension + + +def missing(file): + if os.access(file, os.R_OK) == 0: + return 1 + return 0 + +xml_files = ["libxml2-api.xml", "libxml2-python-api.xml", + "libxml.c", "libxml.py", "libxml_wrap.h", "types.c", + "xmlgenerator.py", "README", "TODO"] + +xslt_files = ["libxslt-api.xml", "libxslt-python-api.xml", + "libxslt.c", "libxsl.py", "libxslt_wrap.h", + "xsltgenerator.py"] + +if missing("libxml2-py.c") or missing("libxml2.py"): + try: + try: + import xmlgenerator + except: + import generator + except: + print "failed to find and generate stubs for libxml2, aborting ..." + print sys.exc_type, sys.exc_value + sys.exit(1) + + head = open("libxml.py", "r") + generated = open("libxml2class.py", "r") + result = open("libxml2.py", "w") + for line in head.readlines(): + result.write(line) + for line in generated.readlines(): + result.write(line) + head.close() + generated.close() + result.close() + +with_xslt=0 +if missing("libxslt-py.c") or missing("libxslt.py"): + if missing("xsltgenerator.py") or missing("libxslt-api.xml"): + print "libxslt stub generator not found, libxslt not built" + else: + try: + import xsltgenerator + except: + print "failed to generate stubs for libxslt, aborting ..." + print sys.exc_type, sys.exc_value + else: + head = open("libxsl.py", "r") + generated = open("libxsltclass.py", "r") + result = open("libxslt.py", "w") + for line in head.readlines(): + result.write(line) + for line in generated.readlines(): + result.write(line) + head.close() + generated.close() + result.close() + with_xslt=1 +else: + with_xslt=1 + + +descr = "libxml2 package" +modules = [ 'libxml2' ] +c_files = ['libxml2-py.c', 'libxml.c', 'types.c' ] +includes= ["/usr/include/libxml2"] +libs = ["xml2", "m", "z"] +macros = [] +if with_xslt == 1: + descr = "libxml2 and libxslt package" + # + # We are gonna build 2 identical shared libs with merge initializing + # both libxml2mod and libxsltmod + # + c_files = c_files + ['libxslt-py.c', 'libxslt.c'] + libs.insert(0, 'xslt') + includes.append("/usr/include/libxslt") + modules.append('libxslt') + macros.append(('MERGED_MODULES', '1')) + + +extens=[Extension('libxml2mod', c_files, include_dirs=includes, + libraries=libs, define_macros=macros)] +if with_xslt == 1: + extens.append(Extension('libxsltmod', c_files, include_dirs=includes, + libraries=libs)) + +if missing("MANIFEST"): + global xml_files + + manifest = open("MANIFEST", "w") + manifest.write("setup.py\n") + for file in xml_files: + manifest.write(file + "\n") + if with_xslt == 1: + for file in xslt_files: + manifest.write(file + "\n") + manifest.close() + +setup (name = "libxml2-python", + version = "2.4.16", + description = descr, + author = "Daniel Veillard", + author_email = "veillard@redhat.com", + url = "http://xmlsoft.org/python.html", + licence="MIT Licence", + + py_modules=modules, + ext_modules=extens, + ) + +sys.exit(0) +