X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/73a223694a5ef4c6925410a87878960e9d68e899..8dca2f3d86cad6a1802905093e3f77b6c3338a74:/wxPython/config.py?ds=sidebyside diff --git a/wxPython/config.py b/wxPython/config.py index 8b8d4ce358..4eb36b1855 100644 --- a/wxPython/config.py +++ b/wxPython/config.py @@ -31,449 +31,6 @@ import distutils.command.install_data import distutils.command.install_headers import distutils.command.clean -#################################### -# BuildRenamers -#################################### - -import pprint -import xml.sax -from distutils.spawn import spawn - -try: - import libxml2 - FOUND_LIBXML2 = True -except ImportError: - FOUND_LIBXML2 = False - -#--------------------------------------------------------------------------- - - -renamerTemplateStart = """\ -// A bunch of %rename directives generated by BuildRenamers in config.py -// in order to remove the wx prefix from all global scope names. - -#ifndef BUILDING_RENAMERS - -""" - -renamerTemplateEnd = """ -#endif -""" - -wxPythonTemplateStart = """\ -## This file reverse renames symbols in the wx package to give -## them their wx prefix again, for backwards compatibility. -## -## Generated by BuildRenamers in config.py - -# This silly stuff here is so the wxPython.wx module doesn't conflict -# with the wx package. We need to import modules from the wx package -# here, then we'll put the wxPython.wx entry back in sys.modules. -import sys -_wx = None -if sys.modules.has_key('wxPython.wx'): - _wx = sys.modules['wxPython.wx'] - del sys.modules['wxPython.wx'] - -import wx.%s - -sys.modules['wxPython.wx'] = _wx -del sys, _wx - - -# Now assign all the reverse-renamed names: -""" - -wxPythonTemplateEnd = """ - -""" - - - -#--------------------------------------------------------------------------- -class BuildRenamers: - def run(self, destdir, modname, xmlfile, wxPythonDir="wxPython"): - - assert FOUND_LIBXML2, "The libxml2 module is required to use the BuildRenamers functionality." - - swigDest = os.path.join(destdir, "_"+modname+"_rename.i") - pyDest = os.path.join(wxPythonDir, modname + '.py') - - swigDestTemp = tempfile.mktemp('.tmp') - swigFile = open(swigDestTemp, "w") - swigFile.write(renamerTemplateStart) - - pyDestTemp = tempfile.mktemp('.tmp') - pyFile = open(pyDestTemp, "w") - pyFile.write(wxPythonTemplateStart % modname) - - print "Parsing XML and building renamers..." - self.processXML(xmlfile, modname, swigFile, pyFile) - - self.checkOtherNames(pyFile, modname, - os.path.join(destdir, '_'+modname+'_reverse.txt')) - pyFile.write(wxPythonTemplateEnd) - pyFile.close() - - swigFile.write(renamerTemplateEnd) - swigFile.close() - - # Compare the files just created with the existing one and - # blow away the old one if they are different. - for dest, temp in [(swigDest, swigDestTemp), - (pyDest, pyDestTemp)]: - if not os.path.exists(dest): - os.rename(temp, dest) - elif open(dest).read() != open(temp).read(): - os.unlink(dest) - os.rename(temp, dest) - else: - print dest + " not changed." - os.unlink(temp) - - #--------------------------------------------------------------------------- - - - def GetAttr(self, node, name): - path = "./attributelist/attribute[@name='%s']/@value" % name - n = node.xpathEval2(path) - if len(n): - return n[0].content - else: - return None - - - def processXML(self, xmlfile, modname, swigFile, pyFile): - - topnode = libxml2.parseFile(xmlfile).children - - # remove any import nodes as we don't need to do renamers for symbols found therein - imports = topnode.xpathEval2("*/import") - for n in imports: - n.unlinkNode() - n.freeNode() - - # do a depth first iteration over what's left - for node in topnode: - doRename = False - doPtr = False - addWX = False - revOnly = False - - - if node.name == "class": - lastClassName = name = self.GetAttr(node, "name") - lastClassSymName = sym_name = self.GetAttr(node, "sym_name") - doRename = True - doPtr = True - if sym_name != name: - name = sym_name - addWX = True - - # renamed constructors - elif node.name == "constructor": - name = self.GetAttr(node, "name") - sym_name = self.GetAttr(node, "sym_name") - if sym_name != name: - name = sym_name - addWX = True - doRename = True - - # only enumitems at the top level - elif node.name == "enumitem" and node.parent.parent.name == "include": - name = self.GetAttr(node, "name") - sym_name = self.GetAttr(node, "sym_name") - doRename = True - - - elif node.name in ["cdecl", "constant"]: - name = self.GetAttr(node, "name") - sym_name = self.GetAttr(node, "sym_name") - toplevel = node.parent.name == "include" - - # top-level functions - if toplevel and self.GetAttr(node, "view") == "globalfunctionHandler": - doRename = True - - # top-level global vars - elif toplevel and self.GetAttr(node, "feature_immutable") == "1": - doRename = True - - # static methods - elif self.GetAttr(node, "view") == "staticmemberfunctionHandler": - name = lastClassName + '_' + name - sym_name = lastClassSymName + '_' + sym_name - # only output the reverse renamer in this case - doRename = revOnly = True - - if doRename and name != sym_name: - name = sym_name - addWX = True - - - if doRename and name: - old = new = name - if old.startswith('wx') and not old.startswith('wxEVT_'): - # remove all wx prefixes except wxEVT_ and write a %rename directive for it - new = old[2:] - if not revOnly: - swigFile.write("%%rename(%s) %35s;\n" % (new, old)) - - # Write assignments to import into the old wxPython namespace - if addWX and not old.startswith('wx'): - old = 'wx'+old - pyFile.write("%s = wx.%s.%s\n" % (old, modname, new)) - if doPtr: - pyFile.write("%sPtr = wx.%s.%sPtr\n" % (old, modname, new)) - - - #--------------------------------------------------------------------------- - - def checkOtherNames(self, pyFile, moduleName, filename): - if os.path.exists(filename): - prefixes = [] - for line in file(filename): - if line.endswith('\n'): - line = line[:-1] - if line and not line.startswith('#'): - if line.endswith('*'): - prefixes.append(line[:-1]) - elif line.find('=') != -1: - pyFile.write("%s\n" % line) - else: - wxname = 'wx' + line - if line.startswith('wx') or line.startswith('WX') or line.startswith('EVT'): - wxname = line - pyFile.write("%s = wx.%s.%s\n" % (wxname, moduleName, line)) - - if prefixes: - pyFile.write( - "\n\nd = globals()\nfor k, v in wx.%s.__dict__.iteritems():" - % moduleName) - first = True - for p in prefixes: - if first: - pyFile.write("\n if ") - first = False - else: - pyFile.write("\n elif ") - pyFile.write("k.startswith('%s'):\n d[k] = v" % p) - pyFile.write("\ndel d, k, v\n\n") - - -#--------------------------------------------------------------------------- - -## interestingTypes = [ 'class', 'cdecl', 'enumitem', 'constructor', 'constant' ] -## interestingAttrs = [ 'name', 'sym_name', 'decl', 'feature_immutable', 'module', -## 'storage', 'type' ] - - -## class Element: -## def __init__(self, tagtype): -## self.tagtype = tagtype -## self.level = -1 -## self.name = None -## self.sym_name = None -## self.decl = None -## self.immutable = None -## self.klass = None -## self.module = None -## self.storage = None -## self.type = None -## self.startLine = -1 - - -## def write(self, moduleName, swigFile, pyFile): -## doRename = False -## doPtr = False -## addWX = False -## revOnly = False - -## #if self.name.find('DefaultPosition') != -1: -## # pprint.pprint(self.__dict__) - -## if self.tagtype in ['cdecl', 'constant']: -## if self.storage == 'typedef': -## pass - -## # top level functions -## elif self.level == 0 and self.decl != "": -## doRename = True - -## # top level global vars -## elif self.level == 0 and self.immutable == '1': -## doRename = True - -## # static methods -## elif self.storage == 'static': -## if not self.klass: -## pprint.pprint(self.__dict__) -## else: -## self.name = self.klass + '_' + self.name -## self.sym_name = self.sym_klass + '_' + self.sym_name -## # only output the reverse renamer in this case -## doRename = revOnly = True - - - -## if doRename and self.name != self.sym_name: -## #print "%-25s %-25s" % (self.name, self.sym_name) -## self.name = self.sym_name -## addWX = True - - -## elif self.tagtype == 'class' and self.module == moduleName: -## doRename = True -## doPtr = True -## if self.sym_name != self.klass: -## #print self.sym_name -## self.name = self.sym_name -## addWX = True - -## elif self.tagtype == 'constructor': -## #print "%-25s %-25s" % (self.name, self.sym_name) -## if self.sym_name != self.klass: -## #print self.sym_name -## self.name = self.sym_name -## addWX = True -## doRename = True - -## elif self.tagtype == 'enumitem' and self.level == 0: -## doRename = True - - -## if doRename: -## #print "%-25s %-25s" % (self.name, self.sym_name) -## old = new = self.name -## if old.startswith('wx') and not old.startswith('wxEVT_'): -## # remove all wx prefixes except wxEVT_ and write a %rename directive for it -## new = old[2:] -## if not revOnly: -## swigFile.write("%%rename(%s) %35s;\n" % (new, old)) - -## # Write assignments to import into the old wxPython namespace -## if addWX and not old.startswith('wx'): -## old = 'wx'+old -## pyFile.write("%s = wx.%s.%s\n" % (old, moduleName, new)) -## if doPtr: -## pyFile.write("%sPtr = wx.%s.%sPtr\n" % (old, moduleName, new)) - - - -## #else: -## # text = "%07d %d %10s %-35s %s\n" % ( -## # self.startLine, self.level, self.tagtype, self.name, self.decl) -## # #rejects.write(text) -## # print text, - - -## #--------------------------------------------------------------------------- - -## class ContentHandler(xml.sax.ContentHandler): -## def __init__(self, modname, swigFile, pyFile): -## xml.sax.ContentHandler.__init__(self) -## self.modname = modname -## self.swigFile = swigFile -## self.pyFile = pyFile -## self.elements = [] -## self.imports = 0 -## self.klass = None -## self.sym_klass = None - - -## def setDocumentLocator(self, locator): -## self.locator = locator - - - -## def startElement(self, name, attrs): -## if name in interestingTypes: -## # start of a new element that we are interested in -## ce = Element(name) -## ce.startLine = self.locator.getLineNumber() -## ce.level = len(self.elements) -## if name == 'constructor': -## ce.klass = self.elements[0].name -## else: -## ce.klass = self.klass -## ce.sym_klass = self.sym_klass -## self.elements.insert(0, ce) - - -## elif len(self.elements) and name == 'attribute' and attrs['name'] in interestingAttrs: -## attrName = attrs['name'] -## attrVal = attrs['value'] -## if attrName.startswith('feature_'): -## attrName = attrName.replace('feature_', '') -## ce = self.elements[0] -## if getattr(ce, attrName) is None: -## setattr(ce, attrName, attrVal) -## if ce.tagtype == 'class' and attrName == 'name' and self.klass is None: -## self.klass = attrVal -## if ce.tagtype == 'class' and attrName == 'sym_name' and self.sym_klass is None: -## self.sym_klass = attrVal - - -## ## elif len(self.elements) and name == 'attribute' and attrs['name'] == 'name': -## ## # save the elements name -## ## ce = self.elements[0] -## ## if ce.name is None: -## ## ce.name = attrs['value'] -## ## ce.nameLine = self.locator.getLineNumber() - -## ## elif len(self.elements) and name == 'attribute' and attrs['name'] == 'sym_name': -## ## # save the elements name -## ## ce = self.elements[0] -## ## if ce.sym_name is None: -## ## ce.sym_name = attrs['value'] - -## ## elif len(self.elements) and name == 'attribute' and attrs['name'] == 'decl': -## ## # save the elements decl -## ## ce = self.elements[0] -## ## ce.decl = attrs['value'] - -## ## elif len(self.elements) and name == 'attribute' and attrs['name'] == 'feature_immutable': -## ## # save the elements decl -## ## ce = self.elements[0] -## ## ce.immutable = int(attrs['value']) - -## ## elif len(self.elements) and name == 'attribute' and attrs['name'] == 'module': -## ## # save the elements decl -## ## ce = self.elements[0] -## ## ce.module = attrs['value'] - -## elif name == 'import': -## self.imports += 1 - -## ## elif len(self.elements) and name == 'attribute' and attrs['name'] == 'storage': -## ## # save the elements decl -## ## ce = self.elements[0] -## ## ce.storage = attrs['value'] - -## ## elif len(self.elements) and name == 'attribute' and attrs['name'] == 'type': -## ## # save the elements decl -## ## ce = self.elements[0] -## ## ce.type = attrs['value'] - - -## def endElement(self, name): -## if name in interestingTypes: -## # end of an element that we are interested in -## ce = self.elements.pop(0) - -## if self.imports == 0: -## # only write for items that are in this file, not imported -## ce.write(self.modname, self.swigFile, self.pyFile) - -## if name == 'import': -## self.imports -= 1 - -## if name == 'class': -## self.klass = None -## self.sym_klass = None - - -#--------------------------------------------------------------------------- #---------------------------------------------------------------------- # flags and values that affect this script #---------------------------------------------------------------------- @@ -481,7 +38,7 @@ class BuildRenamers: VER_MAJOR = 2 # The first three must match wxWidgets VER_MINOR = 5 VER_RELEASE = 2 -VER_SUBREL = 2 # wxPython release num for x.y.z release of wxWidgets +VER_SUBREL = 9 # wxPython release num for x.y.z release of wxWidgets VER_FLAGS = "p" # release flags, such as prerelease num, unicode, etc. DESCRIPTION = "Cross platform GUI toolkit for Python" @@ -572,7 +129,7 @@ WX_CONFIG = None # Usually you shouldn't need to touch this, but you can set # version, port, etc. and it will be looked for on the # default $PATH. -WXPORT = 'gtk' # On Linux/Unix there are several ports of wxWidgets available. +WXPORT = 'gtk2' # On Linux/Unix there are several ports of wxWidgets available. # Setting this value lets you select which will be used for # the wxPython build. Possibilites are 'gtk', 'gtk2' and # 'x11'. Curently only gtk and gtk2 works. @@ -689,42 +246,36 @@ sys.argv = filter(None, sys.argv) #---------------------------------------------------------------------- def Verify_WX_CONFIG(): - """ Called below for the builds that need wx-config, - if WX_CONFIG is not set then tries to select the specific - wx*-config script based on build options. If not found - then it defaults to 'wx-config'. + """ Called below for the builds that need wx-config, if WX_CONFIG + is not set then determins the flags needed based on build + options and searches for wx-config on the PATH. """ # if WX_CONFIG hasn't been set to an explicit value then construct one. global WX_CONFIG if WX_CONFIG is None: - if debug: # TODO: Fix this. wxPython's --debug shouldn't be tied to wxWidgets... - df = 'd' - else: - df = '' - if UNICODE: - uf = 'u' - else: - uf = '' - ver2 = "%s.%s" % (VER_MAJOR, VER_MINOR) + WX_CONFIG='wx-config' port = WXPORT if port == "x11": port = "x11univ" - WX_CONFIG = 'wx%s%s%s-%s-config' % (port, uf, df, ver2) + flags = ' --toolkit=%s' % port + flags += ' --unicode=%s' % (UNICODE and 'yes' or 'no') + flags += ' --version=%s.%s' % (VER_MAJOR, VER_MINOR) searchpath = os.environ["PATH"] for p in searchpath.split(':'): - fp = os.path.join(p, WX_CONFIG) + fp = os.path.join(p, 'wx-config') if os.path.exists(fp) and os.access(fp, os.X_OK): # success msg("Found wx-config: " + fp) - WX_CONFIG = fp + msg(" Using flags: " + flags) + WX_CONFIG = fp + flags break else: - msg("WX_CONFIG not specified and %s not found on $PATH " - "defaulting to \"wx-config\"" % WX_CONFIG) - WX_CONFIG = 'wx-config' - + msg("ERROR: WX_CONFIG not specified and wx-config not found on the $PATH") + # should we exit? + # TODO: exeucte WX_CONFIG --list and verify a matching config is found + def run_swig(files, dir, gendir, package, USE_SWIG, force, swig_args, swig_deps=[], add_under=False): @@ -871,7 +422,10 @@ class wx_install_headers(distutils.command.install_headers.install_headers): if root is None or WXPREFIX.startswith(root): root = '' for header, location in headers: - install_dir = os.path.normpath(root + WXPREFIX + location) + install_dir = os.path.normpath(root + + WXPREFIX + + '/include/wx-%d.%d/wx' % (VER_MAJOR, VER_MINOR) + + location) self.mkpath(install_dir) (out, _) = self.copy_file(header, install_dir) self.outfiles.append(out) @@ -1200,8 +754,10 @@ if FULL_DOCS: swig_deps = [ opj(WXPY_SRC, 'src/my_typemaps.i'), + opj(WXPY_SRC, 'src/my_fragments.i'), opj(WXPY_SRC, 'src/common.swg'), opj(WXPY_SRC, 'src/pyrun.swg'), + opj(WXPY_SRC, 'src/python.swg'), ] depends = [ #'include/wx/wxPython/wxPython.h', @@ -1210,3 +766,237 @@ depends = [ #'include/wx/wxPython/wxPython.h', ] #---------------------------------------------------------------------- + +#################################### +# BuildRenamers +#################################### + +import pprint +import xml.sax + +try: + import libxml2 + FOUND_LIBXML2 = True +except ImportError: + FOUND_LIBXML2 = False + +#--------------------------------------------------------------------------- + + +renamerTemplateStart = """\ +// A bunch of %rename directives generated by BuildRenamers in config.py +// in order to remove the wx prefix from all global scope names. + +#ifndef BUILDING_RENAMERS + +""" + +renamerTemplateEnd = """ +#endif +""" + +wxPythonTemplateStart = """\ +## This file reverse renames symbols in the wx package to give +## them their wx prefix again, for backwards compatibility. +## +## Generated by BuildRenamers in config.py + +# This silly stuff here is so the wxPython.wx module doesn't conflict +# with the wx package. We need to import modules from the wx package +# here, then we'll put the wxPython.wx entry back in sys.modules. +import sys +_wx = None +if sys.modules.has_key('wxPython.wx'): + _wx = sys.modules['wxPython.wx'] + del sys.modules['wxPython.wx'] + +import wx.%s + +sys.modules['wxPython.wx'] = _wx +del sys, _wx + + +# Now assign all the reverse-renamed names: +""" + +wxPythonTemplateEnd = """ + +""" + + + +#--------------------------------------------------------------------------- +class BuildRenamers: + def run(self, destdir, modname, xmlfile, wxPythonDir="wxPython"): + + assert FOUND_LIBXML2, "The libxml2 module is required to use the BuildRenamers functionality." + + if not os.path.exists(wxPythonDir): + os.mkdir(wxPythonDir) + + swigDest = os.path.join(destdir, "_"+modname+"_rename.i") + pyDest = os.path.join(wxPythonDir, modname + '.py') + + swigDestTemp = tempfile.mktemp('.tmp') + swigFile = open(swigDestTemp, "w") + swigFile.write(renamerTemplateStart) + + pyDestTemp = tempfile.mktemp('.tmp') + pyFile = open(pyDestTemp, "w") + pyFile.write(wxPythonTemplateStart % modname) + + print "Parsing XML and building renamers..." + self.processXML(xmlfile, modname, swigFile, pyFile) + + self.checkOtherNames(pyFile, modname, + os.path.join(destdir, '_'+modname+'_reverse.txt')) + pyFile.write(wxPythonTemplateEnd) + pyFile.close() + + swigFile.write(renamerTemplateEnd) + swigFile.close() + + # Compare the files just created with the existing one and + # blow away the old one if they are different. + for dest, temp in [(swigDest, swigDestTemp), + (pyDest, pyDestTemp)]: + if not os.path.exists(dest): + os.rename(temp, dest) + elif open(dest).read() != open(temp).read(): + os.unlink(dest) + os.rename(temp, dest) + else: + print dest + " not changed." + os.unlink(temp) + + #--------------------------------------------------------------------------- + + + def GetAttr(self, node, name): + path = "./attributelist/attribute[@name='%s']/@value" % name + n = node.xpathEval2(path) + if len(n): + return n[0].content + else: + return None + + + def processXML(self, xmlfile, modname, swigFile, pyFile): + + topnode = libxml2.parseFile(xmlfile).children + + # remove any import nodes as we don't need to do renamers for symbols found therein + imports = topnode.xpathEval2("*/import") + for n in imports: + n.unlinkNode() + n.freeNode() + + # do a depth first iteration over what's left + for node in topnode: + doRename = False + doPtr = False + addWX = False + revOnly = False + + + if node.name == "class": + lastClassName = name = self.GetAttr(node, "name") + lastClassSymName = sym_name = self.GetAttr(node, "sym_name") + doRename = True + doPtr = True + if sym_name != name: + name = sym_name + addWX = True + + # renamed constructors + elif node.name == "constructor": + name = self.GetAttr(node, "name") + sym_name = self.GetAttr(node, "sym_name") + if sym_name != name: + name = sym_name + addWX = True + doRename = True + + # only enumitems at the top level + elif node.name == "enumitem" and node.parent.parent.name == "include": + name = self.GetAttr(node, "name") + sym_name = self.GetAttr(node, "sym_name") + doRename = True + + + elif node.name in ["cdecl", "constant"]: + name = self.GetAttr(node, "name") + sym_name = self.GetAttr(node, "sym_name") + toplevel = node.parent.name == "include" + + # top-level functions + if toplevel and self.GetAttr(node, "view") == "globalfunctionHandler": + doRename = True + + # top-level global vars + elif toplevel and self.GetAttr(node, "feature_immutable") == "1": + doRename = True + + # static methods + elif self.GetAttr(node, "view") == "staticmemberfunctionHandler": + name = lastClassName + '_' + name + sym_name = lastClassSymName + '_' + sym_name + # only output the reverse renamer in this case + doRename = revOnly = True + + if doRename and name != sym_name: + name = sym_name + addWX = True + + + if doRename and name: + old = new = name + if old.startswith('wx') and not old.startswith('wxEVT_'): + # remove all wx prefixes except wxEVT_ and write a %rename directive for it + new = old[2:] + if not revOnly: + swigFile.write("%%rename(%s) %35s;\n" % (new, old)) + + # Write assignments to import into the old wxPython namespace + if addWX and not old.startswith('wx'): + old = 'wx'+old + pyFile.write("%s = wx.%s.%s\n" % (old, modname, new)) + if doPtr: + pyFile.write("%sPtr = wx.%s.%sPtr\n" % (old, modname, new)) + + + #--------------------------------------------------------------------------- + + def checkOtherNames(self, pyFile, moduleName, filename): + if os.path.exists(filename): + prefixes = [] + for line in file(filename): + if line.endswith('\n'): + line = line[:-1] + if line and not line.startswith('#'): + if line.endswith('*'): + prefixes.append(line[:-1]) + elif line.find('=') != -1: + pyFile.write("%s\n" % line) + else: + wxname = 'wx' + line + if line.startswith('wx') or line.startswith('WX') or line.startswith('EVT'): + wxname = line + pyFile.write("%s = wx.%s.%s\n" % (wxname, moduleName, line)) + + if prefixes: + pyFile.write( + "\n\nd = globals()\nfor k, v in wx.%s.__dict__.iteritems():" + % moduleName) + first = True + for p in prefixes: + if first: + pyFile.write("\n if ") + first = False + else: + pyFile.write("\n elif ") + pyFile.write("k.startswith('%s'):\n d[k] = v" % p) + pyFile.write("\ndel d, k, v\n\n") + + +#---------------------------------------------------------------------------