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:
12
ChangeLog
12
ChangeLog
@ -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
|
||||||
|
@ -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()
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user