#----------------------------------------------------------------------
VER_MAJOR = 2 # The first three must match wxWidgets
-VER_MINOR = 6
+VER_MINOR = 7
VER_RELEASE = 0
VER_SUBREL = 0 # wxPython release num for x.y.z release of wxWidgets
-VER_FLAGS = "pre" # release flags, such as prerelease num, unicode, etc.
+VER_FLAGS = "pre" # release flags, such as prerelease or RC num, etc.
DESCRIPTION = "Cross platform GUI toolkit for Python"
AUTHOR = "Robin Dunn"
wxPython is a GUI toolkit for Python that is a wrapper around the
wxWidgets C++ GUI library. wxPython provides a large variety of
window types and controls, all implemented with a native look and
-feel (by using the native widgets) on the platforms it is supported
-on.
+feel (by using the native widgets) on the platforms upon which it is
+supported.
"""
CLASSIFIERS = """\
# to be loaded from a DLL and to be used from Python.
# Internet Explorer wrapper (experimental)
-BUILD_IEWIN = 0 #(os.name == 'nt')
BUILD_ACTIVEX = (os.name == 'nt') # new version of IEWIN and more
# created that adds that dir to the sys.path. In
# addition, a wxselect.py module will be installed
# to site-pacakges that will allow applications to
- # choose a specific version if more than one are
+ # choose a specific version if more than one is
# installed.
FLAVOUR = "" # Optional flavour string to be appended to VERSION
EP_ADD_OPTS = 1 # When doing MULTIVERSION installs the wx port and
# ansi/unicode settings can optionally be added to the
# subdir path used in site-packages
-
-
+
+EP_FULL_VER = 0 # When doing MULTIVERSION installs the default is to
+ # put only 2 or 3 (depending on stable/unstable) of
+ # the version compnonents into the "extra path"
+ # subdir of site-packages. Setting this option to
+ # 1 will cause the full 4 components of the version
+ # number to be used instead.
+
WX_CONFIG = None # Usually you shouldn't need to touch this, but you can set
# it to pass an alternate version of wx-config or alternate
# flags, eg. as required by the .deb in-tree build. By
# version, port, etc. and it will be looked for on the
# default $PATH.
+SYS_WX_CONFIG = None # When installing an in tree build, setup.py uses wx-config
+ # for two different purposes. First, to determine the prefix
+ # where files will be installed, and secondly, to initialise
+ # build_options.py with the correct options for it.
+ # WX_CONFIG is used for the first task. SYS_WX_CONFIG may
+ # be set independently, to the value that should appear in
+ # build_options.py, if it is different to that. The default
+ # is to use the value of WX_CONFIG.
+
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
if os.name == 'nt':
WXPORT = 'msw'
+WXPYTHON_TYPE_TABLE = '_wxPython_table'
#----------------------------------------------------------------------
# Check for build flags on the command line
#----------------------------------------------------------------------
# Boolean (int) flags
-for flag in ['BUILD_GLCANVAS', 'BUILD_OGL', 'BUILD_STC',
- 'BUILD_GIZMOS', 'BUILD_DLLWIDGET', 'BUILD_IEWIN', 'BUILD_ACTIVEX',
+for flag in [ 'BUILD_ACTIVEX', 'BUILD_ANIMATE', 'BUILD_DLLWIDGET',
+ 'BUILD_GIZMOS', 'BUILD_GLCANVAS',
+ 'BUILD_OGL', 'BUILD_STC',
'CORE_ONLY', 'PREP_ONLY', 'USE_SWIG', 'UNICODE',
'UNDEF_NDEBUG', 'NO_SCRIPTS', 'NO_HEADERS', 'BUILD_RENAMERS',
- 'FULL_DOCS', 'INSTALL_MULTIVERSION', 'EP_ADD_OPTS',
+ 'FULL_DOCS', 'INSTALL_MULTIVERSION', 'EP_ADD_OPTS', 'EP_FULL_VER',
'MONOLITHIC', 'FINAL', 'HYBRID', ]:
for x in range(len(sys.argv)):
if sys.argv[x].find(flag) == 0:
sys.argv[x] = ''
# String options
-for option in ['WX_CONFIG', 'WXDLLVER', 'BUILD_BASE', 'WXPORT', 'SWIG',
- 'CONTRIBS_INC', 'WXPY_SRC', 'FLAVOUR',
+for option in ['WX_CONFIG', 'SYS_WX_CONFIG', 'WXDLLVER', 'BUILD_BASE',
+ 'WXPORT', 'SWIG', 'CONTRIBS_INC', 'WXPY_SRC', 'FLAVOUR',
]:
for x in range(len(sys.argv)):
if sys.argv[x].find(option) == 0:
# build options file
#----------------------------------------------------------------------
+if SYS_WX_CONFIG is None:
+ SYS_WX_CONFIG = WX_CONFIG
+
build_options_template = """
UNICODE=%d
UNDEF_NDEBUG=%d
INSTALL_MULTIVERSION=%d
FLAVOUR="%s"
EP_ADD_OPTS=%d
+EP_FULL_VER=%d
WX_CONFIG="%s"
WXPORT="%s"
MONOLITHIC=%d
FINAL=%d
HYBRID=%d
""" % (UNICODE, UNDEF_NDEBUG, INSTALL_MULTIVERSION, FLAVOUR, EP_ADD_OPTS,
- WX_CONFIG, WXPORT, MONOLITHIC, FINAL, HYBRID)
+ EP_FULL_VER, SYS_WX_CONFIG, WXPORT, MONOLITHIC, FINAL, HYBRID)
try:
from build_options import *
def Verify_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
+ is not set then determines 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.
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
+ # TODO: execute WX_CONFIG --list and verify a matching config is found
def run_swig(files, dir, gendir, package, USE_SWIG, force, swig_args,
pass
if force or newer(i_file, py_file) or newer(i_file, cpp_file):
- ## we need forward slashes here even on win32
+ ## we need forward slashes here, even on win32
#cpp_file = opj(cpp_file) #'/'.join(cpp_file.split('\\'))
#i_file = opj(i_file) #'/'.join(i_file.split('\\'))
return sources
+def swig_version():
+ # It may come on either stdout or stderr, depending on the
+ # version, so read both.
+ i, o, e = os.popen3(SWIG + ' -version', 't')
+ stext = o.read() + e.read()
+ import re
+ match = re.search(r'[0-9]+\.[0-9]+\.[0-9]+$', stext, re.MULTILINE)
+ if not match:
+ raise 'NotFound'
+ SVER = match.group(0)
+ return SVER
+
# Specializations of some distutils command classes
class wx_smart_install_data(distutils.command.install_data.install_data):
BUILD_STC = 0
BUILD_GIZMOS = 0
BUILD_DLLWIDGET = 0
- BUILD_IEWIN = 0
BUILD_ACTIVEX = 0
+ BUILD_ANIMATE = 0
if debug:
FINAL = 0
WXDIR = '..' # assumes in CVS tree
WXPLAT = '__WXMSW__'
GENDIR = 'msw'
-
+
includes = ['include', 'src',
opj(WXDIR, 'lib', 'vc_dll', 'msw' + libFlag()),
opj(WXDIR, 'include'),
(WXPLAT, None),
('WXUSINGDLL', '1'),
- ('SWIG_TYPE_TABLE', '_wxPython_table'),
+ ('SWIG_TYPE_TABLE', WXPYTHON_TYPE_TABLE),
+ ('SWIG_PYTHON_OUTPUT_TUPLE', None),
('WXP_USE_THREAD', '1'),
]
if not FINAL or HYBRID:
defines.append( ('__WXDEBUG__', None) )
+ if UNICODE:
+ defines.append( ('wxUSE_UNICODE', 1) )
+
libdirs = [ opj(WXDIR, 'lib', 'vc_dll') ]
if MONOLITHIC:
libs = makeLibName('')
elif os.name == 'posix':
WXDIR = '..'
includes = ['include', 'src']
- defines = [('SWIG_TYPE_TABLE', 'wxPython_type_table'),
- ('HAVE_CONFIG_H', None),
+ defines = [('SWIG_TYPE_TABLE', WXPYTHON_TYPE_TABLE),
+ ('SWIG_PYTHON_OUTPUT_TUPLE', None),
('WXP_USE_THREAD', '1'),
]
if UNDEF_NDEBUG:
# uncomment this block to add the right flags to the link step and build
# again.
## if os.uname()[0] == 'SunOS':
+ ## import commands
## libs.append('gcc')
## libdirs.append(commands.getoutput("gcc -print-search-dirs | grep '^install' | awk '{print $2}'")[:-1])
# dirs as includes so we don't have to guess which is correct.
wxfilesdir = ""
-i_subdir = opj("include", "wx", "wxPython", "i_files")
+i_subdir = opj("include", getExtraPath(), "wx", "wxPython", "i_files")
if os.name != "nt":
wxfilesdir = opj(WXPREFIX, i_subdir)
else:
swig_cmd = SWIG
swig_force = force
swig_args = ['-c++',
- '-Wall',
- '-nodefault',
-
+ #'-Wall',
'-python',
- '-keyword',
'-new_repr',
'-modern',
'-D'+WXPLAT,
] + i_files_includes
+
+if USE_SWIG:
+ SVER = swig_version()
+ if int(SVER[-2:]) >= 29:
+ swig_args += [ '-fastdispatch',
+ '-fvirtual',
+ '-fastinit',
+ '-fastunpack',
+ #'-outputtuple', Currently setting this with a -D define above
+ ]
if UNICODE:
swig_args.append('-DwxUSE_UNICODE')
# BuildRenamers
####################################
-import pprint
+import pprint, shutil
try:
import libxml2
FOUND_LIBXML2 = True
# blow away the old one if they are different.
for dest, temp in [(swigDest, swigDestTemp),
(pyDest, pyDestTemp)]:
+ # NOTE: we don't use shutil.move() because it was introduced
+ # in Python 2.3. Eventually we can switch to it when people
+ # stop building using 2.2.
if not os.path.exists(dest):
- os.rename(temp, dest)
+ shutil.copyfile(temp, dest)
elif open(dest).read() != open(temp).read():
os.unlink(dest)
- os.rename(temp, dest)
+ shutil.copyfile(temp, dest)
else:
print dest + " not changed."
os.unlink(temp)
# do a depth first iteration over what's left
for node in topnode:
doRename = False
- doPtr = False
addWX = False
revOnly = False
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
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))
#---------------------------------------------------------------------------