From 106cad66199aced3f7ae0e943ed7e740179c51eb Mon Sep 17 00:00:00 2001 From: "William M. Brack" Date: Thu, 23 Dec 2004 15:56:12 +0000 Subject: [PATCH] enhanced for enabling build in a different directory. Added (optional) * Makefile.am, gentest.py: enhanced for enabling build in a different directory. Added (optional) param to gentest.py to specify the source directory (bug #155468) * doc/Makefile.am: changed destination of NEWS from (top_srcdir) to (top_builddir) (bug #155468) * python/Makefile.am, python/generator.py: enhanced for enabling build in a different directory(bug #155468). Added (optional) param to generator.py to specify the source directory. Added a new table of functions which have possible "foreign" encodings (e.g. UTF16), and code to use python 't' format instead of 'z' format (mostly solving bug #152286, but still need to populate the table). --- ChangeLog | 15 +++++++++++++++ Makefile.am | 3 ++- doc/Makefile.am | 6 +++--- gentest.py | 22 ++++++++++++++++++---- python/Makefile.am | 19 ++++++++++--------- python/generator.py | 25 ++++++++++++++++++++++--- 6 files changed, 70 insertions(+), 20 deletions(-) diff --git a/ChangeLog b/ChangeLog index bf571fdb..4cdf7a2e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +Thu Dec 23 23:44:08 HKT 2004 William Brack + + * Makefile.am, gentest.py: enhanced for enabling build in + a different directory. Added (optional) param to gentest.py + to specify the source directory (bug #155468) + * doc/Makefile.am: changed destination of NEWS from (top_srcdir) + to (top_builddir) (bug #155468) + * python/Makefile.am, python/generator.py: enhanced for enabling + build in a different directory(bug #155468). Added (optional) + param to generator.py to specify the source directory. Added + a new table of functions which have possible "foreign" encodings + (e.g. UTF16), and code to use python 't' format instead of + 'z' format (mostly solving bug #152286, but still need to + populate the table). + Tue Dec 21 08:10:44 MST 2004 John Fleck * doc/site.xsl, doc/xml.html, plus rebuilt all the html pages diff --git a/Makefile.am b/Makefile.am index c8ba4f20..08a052ef 100644 --- a/Makefile.am +++ b/Makefile.am @@ -114,7 +114,8 @@ testReader_DEPENDENCIES = $(DEPS) testReader_LDADD= $(LDADDS) testapi.c: gentest.py doc/libxml2-api.xml - -@(if [ "$(PYTHON)" != "" ] ; then $(PYTHON) $(srcdir)/gentest.py ; fi ) + -@(if [ "$(PYTHON)" != "" ] ; then \ + $(PYTHON) $(srcdir)/gentest.py $(srcdir) ; fi ) testapi_SOURCES=testapi.c testapi_LDFLAGS = diff --git a/doc/Makefile.am b/doc/Makefile.am index 459872ec..1bdcb792 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -26,7 +26,7 @@ EXTRA_DIST=xmlcatalog_man.xml tutorial/*.html tutorial/*.c tutorial/*.pdf \ man_MANS = xmllint.1 xmlcatalog.1 -all: web $(top_srcdir)/NEWS libxml2.xsa $(man_MANS) +all: web $(top_builddir)/NEWS libxml2.xsa $(man_MANS) api: libxml2-api.xml libxml2-refs.xml $(APIPAGES) $(srcdir)/html/index.html $(WIN32_DIR)/libxml2.def.src ../elfgcchack.h @@ -49,9 +49,9 @@ $(PAGES): xml.html site.xsl echo "Validating the HTML Web pages" ; \ $(XMLLINT) --nonet --valid --noout $(PAGES) ; fi ); -$(top_srcdir)/NEWS: $(top_srcdir)/doc/news.xsl $(top_srcdir)/doc/news.html +$(top_builddir)/NEWS: $(top_srcdir)/doc/news.xsl $(top_srcdir)/doc/news.html -@(if [ -x $(XSLTPROC) ] ; then \ - $(XSLTPROC) --nonet $(top_srcdir)/doc/news.xsl $(top_srcdir)/doc/news.html > $(top_srcdir)/NEWS ; fi ); + $(XSLTPROC) --nonet $(top_srcdir)/doc/news.xsl $(top_srcdir)/doc/news.html > $(top_builddir)/NEWS ; fi ); libxml2.xsa: $(top_srcdir)/doc/xsa.xsl $(top_srcdir)/doc/news.html -@(if [ -x $(XSLTPROC) ] ; then \ diff --git a/gentest.py b/gentest.py index fb37eda4..38630afe 100755 --- a/gentest.py +++ b/gentest.py @@ -11,6 +11,11 @@ except: print "libxml2 python bindings not available, skipping testapi.c generation" sys.exit(0) +if len(sys.argv) > 1: + srcPref = sys.argv[1] + '/' +else: + srcPref = '' + # # Modules we want to skip in API test # @@ -425,17 +430,26 @@ def is_known_return_type(name): # Copy the beginning of the C test program result # -input = open("testapi.c", "r") +try: + input = open("testapi.c", "r") +except: + input = open(srcPref + "testapi.c", "r") test = open('testapi.c.new', 'w') def compare_and_save(): global test test.close() - input = open("testapi.c", "r").read() + try: + input = open("testapi.c", "r").read() + except: + input = '' test = open('testapi.c.new', "r").read() if input != test: - os.system("rm testapi.c ; mv testapi.c.new testapi.c") + try: + os.system("rm testapi.c; mv testapi.c.new testapi.c") + except: + os.system("mv testapi.c.new testapi.c") print("Updated testapi.c") else: print("Generated testapi.c is identical") @@ -467,7 +481,7 @@ test.write("/* CUT HERE: everything below that line is generated */\n") # # Open the input API description # -doc = libxml2.readFile('doc/libxml2-api.xml', None, 0) +doc = libxml2.readFile(srcPref + 'doc/libxml2-api.xml', None, 0) if doc == None: print "Failed to load doc/libxml2-api.xml" sys.exit(1) diff --git a/python/Makefile.am b/python/Makefile.am index fa133104..c37c0c29 100644 --- a/python/Makefile.am +++ b/python/Makefile.am @@ -6,7 +6,8 @@ SUBDIRS= . tests INCLUDES = \ -I$(PYTHON_INCLUDES) \ -I$(top_srcdir)/include \ - -I$(top_builddir)/include + -I$(top_builddir)/include \ + -I$(top_builddir)/$(subdir) DOCS_DIR = $(datadir)/doc/libxml2-python-$(LIBXML_VERSION) # libxml2class.txt is generated @@ -37,8 +38,8 @@ python_LTLIBRARIES = libxml2mod.la libxml2mod_la_SOURCES = libxml.c types.c libxml2-py.c libxml2mod_la_LIBADD = $(mylibs) @CYGWIN_EXTRA_PYTHON_LIBADD@ -libxml2.py: $(srcdir)/libxml.py $(srcdir)/libxml2class.py - cat $(srcdir)/libxml.py $(srcdir)/libxml2class.py > libxml2.py +libxml2.py: $(srcdir)/libxml.py libxml2class.py + cat $(srcdir)/libxml.py libxml2class.py > libxml2.py install-data-local: $(mkinstalldirs) $(DESTDIR)$(pythondir) @@ -50,18 +51,18 @@ install-data-local: GENERATE = generator.py API_DESC = $(top_srcdir)/doc/libxml2-api.xml $(srcdir)/libxml2-python-api.xml -GENERATED= $(srcdir)/libxml2class.py \ - $(srcdir)/libxml2-export.c \ - $(srcdir)/libxml2class.txt \ - $(srcdir)/libxml2-py.c \ - $(srcdir)/libxml2-py.h +GENERATED= libxml2class.py \ + libxml2-export.c \ + libxml2class.txt \ + libxml2-py.c \ + libxml2-py.h CLEANFILES= $(GENERATED) gen_prog libxml2.py $(GENERATED): gen_prog gen_prog: $(srcdir)/$(GENERATE) $(API_DESC) - cd $(srcdir) && $(PYTHON) $(GENERATE) + $(PYTHON) $(srcdir)/$(GENERATE) $(srcdir) touch gen_prog $(libxml2mod_la_OBJECTS): $(GENERATED) diff --git a/python/generator.py b/python/generator.py index 6f5ee09b..cd72ce9c 100755 --- a/python/generator.py +++ b/python/generator.py @@ -9,6 +9,11 @@ enums = {} # { enumType: { enumConstant: enumValue } } import sys import string +if len(sys.argv) > 1: + srcPref = sys.argv[1] + '/' +else: + srcPref = '' + ####################################################################### # # That part if purely the API acquisition phase from the @@ -294,6 +299,10 @@ py_return_types = { unknown_types = {} +foreign_encoding_args = ( + 'xmlCreateMemoryParserCtxt', +) + ####################################################################### # # This part writes the C <-> Python stubs libxml2-py.[ch] and @@ -382,6 +391,7 @@ def print_function_wrapper(name, output, export, include): c_args="" c_return="" c_convert="" + num_bufs=0 for arg in args: # This should be correct if arg[1][0:6] == "const ": @@ -389,6 +399,11 @@ def print_function_wrapper(name, output, export, include): c_args = c_args + " %s %s;\n" % (arg[1], arg[0]) if py_types.has_key(arg[1]): (f, t, n, c) = py_types[arg[1]] + if name == 'xmlCreateMemoryParserCtxt': + print "processing special case" + if (f == 'z') and (name in foreign_encoding_args): + f = 't#' + print "changed 'f'" if f != None: format = format + f if t != None: @@ -399,6 +414,10 @@ def print_function_wrapper(name, output, export, include): arg[1], t, arg[0]); else: format_args = format_args + ", &%s" % (arg[0]) + if f == 't#': + format_args = format_args + ", &py_buffsize%d" % num_bufs + c_args = c_args + " int py_buffsize%d;\n" % num_bufs + num_bufs = num_bufs + 1 if c_call != "": c_call = c_call + ", "; c_call = c_call + "%s" % (arg[0]) @@ -570,14 +589,14 @@ def buildStubs(): global unknown_types try: - f = open("libxml2-api.xml") + f = open(srcPref + "libxml2-api.xml") data = f.read() (parser, target) = getparser() parser.feed(data) parser.close() except IOError, msg: try: - f = open("../doc/libxml2-api.xml") + f = open(srcPref + "../doc/libxml2-api.xml") data = f.read() (parser, target) = getparser() parser.feed(data) @@ -591,7 +610,7 @@ def buildStubs(): py_types['pythonObject'] = ('O', "pythonObject", "pythonObject", "pythonObject") try: - f = open("libxml2-python-api.xml") + f = open(srcPref + "libxml2-python-api.xml") data = f.read() (parser, target) = getparser() parser.feed(data)