X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d1b3d685a7bb2d1ce607779b6bfcf8ad4c043d68..c655dbdd8987b4d64b453bbbd8938d813387dd93:/wxPython/config.py diff --git a/wxPython/config.py b/wxPython/config.py index b9ebe12e74..2232b65deb 100644 --- a/wxPython/config.py +++ b/wxPython/config.py @@ -37,10 +37,10 @@ import distutils.command.clean #---------------------------------------------------------------------- VER_MAJOR = 2 # The first three must match wxWidgets -VER_MINOR = 5 -VER_RELEASE = 4 +VER_MINOR = 9 +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 = "" # release flags, such as prerelease or RC num, etc. DESCRIPTION = "Cross platform GUI toolkit for Python" AUTHOR = "Robin Dunn" @@ -55,8 +55,8 @@ LONG_DESCRIPTION = """\ 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 = """\ @@ -79,14 +79,13 @@ Topic :: Software Development :: User Interfaces # Config values below this point can be reset on the setup.py command line. BUILD_GLCANVAS = 1 # If true, build the contrib/glcanvas extension module -BUILD_OGL = 1 # If true, build the contrib/ogl extension module +BUILD_OGL = 0 # If true, build the contrib/ogl extension module BUILD_STC = 1 # If true, build the contrib/stc extension module BUILD_GIZMOS = 1 # Build a module for the gizmos contrib library BUILD_DLLWIDGET = 0# Build a module that enables unknown wx widgets # to be loaded from a DLL and to be used from Python. # Internet Explorer wrapper (experimental) -BUILD_IEWIN = (os.name == 'nt') BUILD_ACTIVEX = (os.name == 'nt') # new version of IEWIN and more @@ -99,14 +98,14 @@ USE_SWIG = 0 # Should we actually execute SWIG, or just use the SWIG = "swig" # The swig executable to use. -BUILD_RENAMERS = 1 # Should we build the renamer modules too? +BUILD_RENAMERS = 0 # Should we build the renamer modules too? FULL_DOCS = 0 # Some docstrings are split into a basic docstring and a # details string. Setting this flag to 1 will # cause the two strings to be combined and output # as the full docstring. -UNICODE = 0 # This will pass the 'wxUSE_UNICODE' flag to SWIG and +UNICODE = 1 # This will pass the 'wxUSE_UNICODE' flag to SWIG and # will ensure that the right headers are found and the # right libs are linked. @@ -129,7 +128,7 @@ INSTALL_MULTIVERSION = 1 # Install the packages such that multiple versions # 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 @@ -138,8 +137,14 @@ 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 @@ -147,6 +152,15 @@ 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. +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 @@ -163,7 +177,7 @@ CONTRIBS_INC = "" # A dir to add as an -I flag when compiling the contribs # Some MSW build settings -MONOLITHIC = 1 # The core wxWidgets lib can be built as either a +MONOLITHIC = 0 # The core wxWidgets lib can be built as either a # single monolithic DLL or as a collection of DLLs. # This flag controls which set of libs will be used # on Windows. (For other platforms it is automatic @@ -233,17 +247,19 @@ if sys.platform[:6] == "darwin": 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_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: @@ -253,8 +269,9 @@ for flag in ['BUILD_GLCANVAS', 'BUILD_OGL', 'BUILD_STC', 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', + 'VER_FLAGS', ]: for x in range(len(sys.argv)): if sys.argv[x].find(option) == 0: @@ -266,44 +283,13 @@ for option in ['WX_CONFIG', 'WXDLLVER', 'BUILD_BASE', 'WXPORT', 'SWIG', sys.argv = filter(None, sys.argv) -#---------------------------------------------------------------------- -# build options file -#---------------------------------------------------------------------- - -build_options_template = """ -UNICODE=%d -UNDEF_NDEBUG=%d -INSTALL_MULTIVERSION=%d -FLAVOUR="%s" -EP_ADD_OPTS=%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) - -try: - from build_options import * -except: - build_options_file = os.path.join(os.path.dirname(__file__), "build_options.py") - if not os.path.exists(build_options_file): - try: - myfile = open(build_options_file, "w") - myfile.write(build_options_template) - myfile.close() - except: - print "WARNING: Unable to create build_options.py." - - #---------------------------------------------------------------------- # some helper functions #---------------------------------------------------------------------- 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. @@ -332,7 +318,7 @@ def Verify_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 + # TODO: execute WX_CONFIG --list and verify a matching config is found def run_swig(files, dir, gendir, package, USE_SWIG, force, swig_args, @@ -342,11 +328,6 @@ def run_swig(files, dir, gendir, package, USE_SWIG, force, swig_args, if USE_SWIG and not os.path.exists(os.path.join(dir, gendir)): os.mkdir(os.path.join(dir, gendir)) - if USE_SWIG and not os.path.exists(os.path.join("docs", "xml-raw")): - if not os.path.exists("docs"): - os.mkdir("docs") - os.mkdir(os.path.join("docs", "xml-raw")) - sources = [] if add_under: pre = '_' @@ -357,7 +338,6 @@ def run_swig(files, dir, gendir, package, USE_SWIG, force, swig_args, i_file = os.path.join(dir, file) py_file = os.path.join(dir, gendir, pre+basefile+'.py') cpp_file = os.path.join(dir, gendir, pre+basefile+'_wrap.cpp') - xml_file = os.path.join("docs", "xml-raw", basefile+pre+'_swig.xml') if add_under: interface = ['-interface', '_'+basefile+'_'] @@ -378,7 +358,7 @@ 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('\\')) @@ -401,7 +381,7 @@ def run_swig(files, dir, gendir, package, USE_SWIG, force, swig_args, # Then run swig for real cmd = [ swig_cmd ] + swig_args + interface + \ - ['-I'+dir, '-o', cpp_file, '-xmlout', xml_file, i_file] + ['-I'+dir, '-o', cpp_file, i_file] msg(' '.join(cmd)) spawn(cmd) @@ -413,6 +393,18 @@ def run_swig(files, dir, gendir, package, USE_SWIG, force, swig_args, 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): @@ -510,6 +502,7 @@ def build_locale_dir(destdir, verbose=1): moFiles = glob.glob(opj(WXDIR, 'locale', '*.mo')) for src in moFiles: lang = os.path.splitext(os.path.basename(src))[0] + #dest = opj(destdir, lang) dest = opj(destdir, lang, 'LC_MESSAGES') mkpath(dest, verbose=verbose) copy_file(src, opj(dest, 'wxstd.mo'), update=1, verbose=verbose) @@ -559,6 +552,19 @@ def makeLibName(name): return [libname] +def findLib(name, libdirs): + name = makeLibName(name)[0] + if os.name == 'posix': + dirs = libdirs + ['/usr/lib', '/usr/local/lib'] + name = 'lib'+name + else: + dirs = libdirs[:] + for d in dirs: + p = os.path.join(d, name) + if glob.glob(p+'*') != []: + return True + return False + def adjustCFLAGS(cflags, defines, includes): '''Extract the raw -I, -D, and -U flags and put them into @@ -581,7 +587,7 @@ def adjustCFLAGS(cflags, defines, includes): -def adjustLFLAGS(lfags, libdirs, libs): +def adjustLFLAGS(lflags, libdirs, libs): '''Extract the -L and -l flags and put them in libdirs and libs as needed''' newLFLAGS = [] for flag in lflags: @@ -592,7 +598,11 @@ def adjustLFLAGS(lfags, libdirs, libs): else: newLFLAGS.append(flag) - return newLFLAGS + # remove any flags for universal binaries, we'll get those from + # distutils instead + return [flag for flag in newLFLAGS + if flag not in ['-isysroot', '-arch', 'ppc', 'i386'] and + not flag.startswith('/Developer') ] @@ -602,11 +612,13 @@ def getExtraPath(shortVer=True, addOpts=False): if shortVer: # short version, just Major.Minor ep = "wx-%d.%d" % (VER_MAJOR, VER_MINOR) - + # plus release if minor is odd if VER_MINOR % 2 == 1: ep += ".%d" % VER_RELEASE + ##ep = "wx-%d.%d.%d" % (VER_MAJOR, VER_MINOR, VER_RELEASE) + else: # long version, full version ep = "wx-%d.%d.%d.%d" % (VER_MAJOR, VER_MINOR, VER_RELEASE, VER_SUBREL) @@ -630,7 +642,6 @@ if CORE_ONLY: BUILD_STC = 0 BUILD_GIZMOS = 0 BUILD_DLLWIDGET = 0 - BUILD_IEWIN = 0 BUILD_ACTIVEX = 0 if debug: @@ -665,7 +676,7 @@ if os.name == 'nt': WXDIR = '..' # assumes in CVS tree WXPLAT = '__WXMSW__' GENDIR = 'msw' - + includes = ['include', 'src', opj(WXDIR, 'lib', 'vc_dll', 'msw' + libFlag()), opj(WXDIR, 'include'), @@ -678,7 +689,8 @@ if os.name == 'nt': (WXPLAT, None), ('WXUSINGDLL', '1'), - ('SWIG_TYPE_TABLE', '_wxPython_table'), + ('SWIG_TYPE_TABLE', WXPYTHON_TYPE_TABLE), + ('SWIG_PYTHON_OUTPUT_TUPLE', None), ('WXP_USE_THREAD', '1'), ] @@ -691,6 +703,9 @@ if os.name == 'nt': 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('') @@ -701,7 +716,6 @@ if os.name == 'nt': makeLibName('core')[0], makeLibName('adv')[0], makeLibName('html')[0], - makeLibName('xrc')[0], ] libs = libs + ['kernel32', 'user32', 'gdi32', 'comdlg32', @@ -732,8 +746,8 @@ if os.name == 'nt': 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: @@ -748,6 +762,7 @@ elif os.name == 'posix': # 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]) @@ -760,6 +775,7 @@ elif os.name == 'posix': cflags.append('-O3') lflags = os.popen(WX_CONFIG + ' --libs', 'r').read()[:-1] + MONOLITHIC = (lflags.find("_xrc") == -1) lflags = lflags.split() WXBASENAME = os.popen(WX_CONFIG + ' --basename').read()[:-1] @@ -814,16 +830,49 @@ else: raise 'Sorry, platform not supported...' +#---------------------------------------------------------------------- +# 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, + EP_FULL_VER, SYS_WX_CONFIG, WXPORT, MONOLITHIC, FINAL, HYBRID) + +try: + from build_options import * +except: + build_options_file = os.path.join(os.path.dirname(__file__), "build_options.py") + if not os.path.exists(build_options_file): + try: + myfile = open(build_options_file, "w") + myfile.write(build_options_template) + myfile.close() + except: + print "WARNING: Unable to create build_options.py." + + #---------------------------------------------------------------------- # post platform setup checks and tweaks, create the full version string #---------------------------------------------------------------------- if UNICODE: BUILD_BASE = BUILD_BASE + '.unicode' - ##VER_FLAGS += 'u' if os.path.exists('DAILY_BUILD'): - VER_FLAGS += '.' + open('DAILY_BUILD').read().strip() VERSION = "%s.%s.%s.%s%s" % (VER_MAJOR, VER_MINOR, VER_RELEASE, @@ -839,7 +888,7 @@ VERSION = "%s.%s.%s.%s%s" % (VER_MAJOR, VER_MINOR, VER_RELEASE, # 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: @@ -851,15 +900,22 @@ i_files_includes = [ '-I' + opj(WXPY_SRC, 'src'), 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') @@ -883,9 +939,7 @@ depends = [ #'include/wx/wxPython/wxPython.h', # BuildRenamers #################################### -import pprint -import xml.sax - +import pprint, shutil try: import libxml2 FOUND_LIBXML2 = True @@ -971,11 +1025,14 @@ class BuildRenamers: # 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) @@ -1005,7 +1062,6 @@ class BuildRenamers: # do a depth first iteration over what's left for node in topnode: doRename = False - doPtr = False addWX = False revOnly = False @@ -1014,7 +1070,6 @@ class BuildRenamers: 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 @@ -1072,8 +1127,6 @@ class BuildRenamers: 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)) #---------------------------------------------------------------------------