1
0
mirror of https://gitlab.gnome.org/GNOME/libxslt synced 2025-07-31 02:43:06 +03:00

changes for the 'usual' setup.py to allow building a libxml2-python module

* python/generator.py python/libxslt.c: changes for 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.
* python/libxsl.py: attempt to cope with the shared library loading
  problem when both modules are not merged.
Daniel
This commit is contained in:
Daniel Veillard
2002-02-22 22:58:47 +00:00
parent ac76027718
commit bd90990db2
4 changed files with 408 additions and 303 deletions

View File

@ -1,3 +1,15 @@
Fri Feb 22 23:44:57 CET 2002 Daniel Veillard <daniel@veillard.com>
* python/generator.py python/libxslt.c: changes for 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.
* python/libxsl.py: attempt to cope with the shared library loading
problem when both modules are not merged.
Thu Feb 21 12:59:59 CET 2002 Daniel Veillard <daniel@veillard.com> Thu Feb 21 12:59:59 CET 2002 Daniel Veillard <daniel@veillard.com>
* doc/site.xml doc/xslt.html doc/python.html doc/*.html: added * doc/site.xml doc/xslt.html doc/python.html doc/*.html: added

View File

@ -413,6 +413,18 @@ def print_function_wrapper(name, output, export, include):
output.write("}\n\n") output.write("}\n\n")
return 1 return 1
def buildStubs():
global py_types
global py_return_types
global unknown_types
try:
f = open("libxslt-api.xml")
data = f.read()
(parser, target) = getparser()
parser.feed(data)
parser.close()
except IOError, msg:
try: try:
f = open("../doc/libxslt-api.xml") f = open("../doc/libxslt-api.xml")
data = f.read() data = f.read()
@ -420,12 +432,13 @@ try:
parser.feed(data) parser.feed(data)
parser.close() parser.close()
except IOError, msg: except IOError, msg:
print file, ":", msg print "../doc/libxslt-api.xml", ":", msg
n = len(functions.keys()) n = len(functions.keys())
print "Found %d functions in libxslt-api.xml" % (n) print "Found %d functions in libxslt-api.xml" % (n)
py_types['pythonObject'] = ('O', "pythonObject", "pythonObject", "pythonObject", "libxml_") py_types['pythonObject'] = ('O', "pythonObject", "pythonObject",
"pythonObject", "libxml_")
try: try:
f = open("libxslt-python-api.xml") f = open("libxslt-python-api.xml")
data = f.read() data = f.read()
@ -433,7 +446,7 @@ try:
parser.feed(data) parser.feed(data)
parser.close() parser.close()
except IOError, msg: except IOError, msg:
print file, ":", msg print "libxslt-python-api.xml", ":", msg
print "Found %d functions in libxslt-python-api.xml" % ( print "Found %d functions in libxslt-python-api.xml" % (
@ -532,38 +545,11 @@ classes_destructors = {
} }
function_classes = {} 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 = [] ctypes = []
classes_list = [] 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" listname = classe + "List"
ll = len(listname) ll = len(listname)
l = len(classe) l = len(classe)
@ -634,6 +620,92 @@ def nameFixup(function, classe, type, file):
func = "UTF8" + func[4:] func = "UTF8" + func[4:]
return func return func
def functionCompare(info1, info2):
(index1, func1, name1, ret1, args1, file1) = info1
(index2, func2, name2, ret2, args2, file2) = info2
if file1 == file2:
if func1 < func2:
return -1
if func1 > func2:
return 1
if file1 == "python_accessor":
return -1
if file2 == "python_accessor":
return 1
if file1 < file2:
return -1
if file1 > file2:
return 1
return 0
def writeDoc(name, args, indent, output):
if functions[name][0] == None or functions[name][0] == "":
return
val = functions[name][0]
val = string.replace(val, "NULL", "None");
output.write(indent)
output.write('"""')
while len(val) > 60:
str = val[0:60]
i = string.rfind(str, " ");
if i < 0:
i = 60
str = val[0:i]
val = val[i:]
output.write(str)
output.write('\n ');
output.write(indent)
output.write(val);
output.write('"""\n')
def buildWrappers():
global ctypes
global py_types
global py_return_types
global unknown_types
global functions
global function_classes
global libxml2_classes_type
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
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_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] = ()
for name in functions.keys(): for name in functions.keys():
found = 0; found = 0;
(desc, ret, args, file) = functions[name] (desc, ret, args, file) = functions[name]
@ -673,44 +745,6 @@ classes = open("libxsltclass.py", "w")
txt = open("libxsltclass.txt", "w") txt = open("libxsltclass.txt", "w")
txt.write(" Generated Classes for libxslt-python\n\n") txt.write(" Generated Classes for libxslt-python\n\n")
def functionCompare(info1, info2):
(index1, func1, name1, ret1, args1, file1) = info1
(index2, func2, name2, ret2, args2, file2) = info2
if file1 == file2:
if func1 < func2:
return -1
if func1 > func2:
return 1
if file1 == "python_accessor":
return -1
if file2 == "python_accessor":
return 1
if file1 < file2:
return -1
if file1 > file2:
return 1
return 0
def writeDoc(name, args, indent, output):
if functions[name][0] == None or functions[name][0] == "":
return
val = functions[name][0]
val = string.replace(val, "NULL", "None");
output.write(indent)
output.write('"""')
while len(val) > 60:
str = val[0:60]
i = string.rfind(str, " ");
if i < 0:
i = 60
str = val[0:i]
val = val[i:]
output.write(str)
output.write('\n ');
output.write(indent)
output.write(val);
output.write('"""\n')
txt.write("#\n# Global functions of the module\n#\n\n") txt.write("#\n# Global functions of the module\n#\n\n")
if function_classes.has_key("None"): if function_classes.has_key("None"):
flist = function_classes["None"] flist = function_classes["None"]
@ -895,3 +929,6 @@ for classname in classes_list:
txt.close() txt.close()
classes.close() classes.close()
buildStubs()
buildWrappers()

View File

@ -1,3 +1,45 @@
#
# Both libxml2mod and libxsltmod have a dependancy on libxml2.so
# and they should share the same module, try to convince the python
# loader to work in that mode if feasible
#
import sys
try:
from dl import RTLD_GLOBAL, RTLD_NOW
except ImportError:
RTLD_GLOBAL = -1
RTLD_NOW = -1
try:
import os
osname = os.uname()[0]
if osname == 'Linux':
RTLD_GLOBAL = 0x00100
RTLD_NOW = 0x00002
#
# is there a better method ?
#
else:
print "libxslt could not guess RTLD_GLOBAL and RTLD_NOW " + \
"on this platform: %s" % (osname)
except:
print "libxslt could not guess RTLD_GLOBAL and RTLD_NOW " + \
"on this platform: %s" % (osname)
if RTLD_GLOBAL != -1 and RTLD_NOW != -1:
try:
flags = sys.getdlopenflags()
sys.setdlopenflags(RTLD_GLOBAL | RTLD_NOW)
try:
import libxml2mod
import libxsltmod
import libxml2
finally:
sys.setdlopenflags(flags)
except:
import libxml2mod
import libxsltmod
import libxml2
else:
import libxml2mod import libxml2mod
import libxsltmod import libxsltmod
import libxml2 import libxml2

View File

@ -4,6 +4,9 @@
* entry points where an automatically generated stub is either * entry points where an automatically generated stub is either
* unpractical or would not match cleanly the Python model. * 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. * See Copyright for the status of this software.
* *
* daniel@veillard.com * daniel@veillard.com
@ -352,8 +355,17 @@ static PyMethodDef libxsltMethods[] = {
{ NULL } { NULL }
}; };
#ifdef MERGED_MODULES
extern void initlibxml2mod(void);
#endif
void initlibxsltmod(void) { void initlibxsltmod(void) {
PyObject *m; PyObject *m;
#ifdef MERGED_MODULES
initlibxml2mod();
#endif
m = Py_InitModule("libxsltmod", libxsltMethods); m = Py_InitModule("libxsltmod", libxsltMethods);
/* libxslt_xmlErrorInitialize(); */ /* libxslt_xmlErrorInitialize(); */
/* /*
@ -365,5 +377,7 @@ void initlibxsltmod(void) {
xmlLoadExtDtdDefaultValue = XML_DETECT_IDS | XML_COMPLETE_ATTRS; xmlLoadExtDtdDefaultValue = XML_DETECT_IDS | XML_COMPLETE_ATTRS;
/* xmlDefaultSAXHandlerInit(); */ /* xmlDefaultSAXHandlerInit(); */
xmlDefaultSAXHandler.cdataBlock = NULL; xmlDefaultSAXHandler.cdataBlock = NULL;
} }