+#----------------------------------------------------------------------
+# some helper functions
+#----------------------------------------------------------------------
+
+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'.
+ """
+ # 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)
+ port = WXPORT
+ if port == "x11":
+ port = "x11univ"
+ WX_CONFIG = 'wx%s%s%s-%s-config' % (port, uf, df, ver2)
+
+ searchpath = os.environ["PATH"]
+ for p in searchpath.split(':'):
+ 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
+ break
+ else:
+ msg("WX_CONFIG not specified and %s not found on $PATH "
+ "defaulting to \"wx-config\"" % WX_CONFIG)
+ WX_CONFIG = 'wx-config'
+
+
+
+def run_swig(files, dir, gendir, package, USE_SWIG, force, swig_args, swig_deps=[]):
+ """Run SWIG the way I want it done"""
+
+ 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")):
+ os.mkdir(os.path.join("docs", "xml-raw"))
+
+ sources = []
+
+ for file in files:
+ basefile = os.path.splitext(file)[0]
+ i_file = os.path.join(dir, file)
+ py_file = os.path.join(dir, gendir, basefile+'.py')
+ cpp_file = os.path.join(dir, gendir, basefile+'_wrap.cpp')
+ xml_file = os.path.join("docs", "xml-raw", basefile+'_swig.xml')
+
+ sources.append(cpp_file)
+
+ if not cleaning and USE_SWIG:
+ for dep in swig_deps:
+ if newer(dep, py_file) or newer(dep, cpp_file):
+ force = 1
+ break
+
+ if force or newer(i_file, py_file) or newer(i_file, cpp_file):
+ ## 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('\\'))
+
+ if BUILD_RENAMERS:
+ #tempfile.tempdir = sourcePath
+ xmltemp = tempfile.mktemp('.xml')
+
+ # First run swig to produce the XML file, adding
+ # an extra -D that prevents the old rename
+ # directives from being used
+ cmd = [ swig_cmd ] + swig_args + \
+ [ '-DBUILDING_RENAMERS', '-xmlout', xmltemp ] + \
+ ['-I'+dir, '-o', cpp_file, i_file]
+ msg(' '.join(cmd))
+ spawn(cmd)
+
+ # Next run build_renamers to process the XML
+ cmd = [ sys.executable, '-u',
+ './distrib/build_renamers.py', dir, basefile, xmltemp]
+ msg(' '.join(cmd))
+ spawn(cmd)
+ os.remove(xmltemp)
+
+ # Then run swig for real
+ cmd = [ swig_cmd ] + swig_args + ['-I'+dir, '-o', cpp_file,
+ '-xmlout', xml_file, i_file]
+ msg(' '.join(cmd))
+ spawn(cmd)
+
+
+ # copy the generated python file to the package directory
+ copy_file(py_file, package, update=not force, verbose=0)
+ CLEANUP.append(opj(package, os.path.basename(py_file)))
+
+ return sources
+
+
+
+# Specializations of some distutils command classes
+class smart_install_data(distutils.command.install_data.install_data):
+ """need to change self.install_dir to the actual library dir"""
+ def run(self):
+ install_cmd = self.get_finalized_command('install')
+ self.install_dir = getattr(install_cmd, 'install_lib')
+ return distutils.command.install_data.install_data.run(self)
+
+
+class extra_clean(distutils.command.clean.clean):
+ """Also cleans stuff that setup.py copies itself. If the --all
+ flag was used also searches for .pyc, .pyd, .so files"""
+ def run(self):
+ from distutils import log
+ from distutils.filelist import FileList
+ global CLEANUP
+
+ distutils.command.clean.clean.run(self)
+
+ if self.all:
+ fl = FileList()
+ fl.include_pattern("*.pyc", 0)
+ fl.include_pattern("*.pyd", 0)
+ fl.include_pattern("*.so", 0)
+ CLEANUP += fl.files
+
+ for f in CLEANUP:
+ if os.path.isdir(f):
+ try:
+ if not self.dry_run and os.path.exists(f):
+ os.rmdir(f)
+ log.info("removing '%s'", f)
+ except IOError:
+ log.warning("unable to remove '%s'", f)
+
+ else:
+ try:
+ if not self.dry_run and os.path.exists(f):
+ os.remove(f)
+ log.info("removing '%s'", f)
+ except IOError:
+ log.warning("unable to remove '%s'", f)
+
+
+
+
+def build_locale_dir(destdir, verbose=1):
+ """Build a locale dir under the wxPython package for MSW"""
+ moFiles = glob.glob(opj(WXDIR, 'locale', '*.mo'))
+ for src in moFiles:
+ lang = os.path.splitext(os.path.basename(src))[0]
+ dest = opj(destdir, lang, 'LC_MESSAGES')
+ mkpath(dest, verbose=verbose)
+ copy_file(src, opj(dest, 'wxstd.mo'), update=1, verbose=verbose)
+ CLEANUP.append(opj(dest, 'wxstd.mo'))
+ CLEANUP.append(dest)
+
+
+def build_locale_list(srcdir):
+ # get a list of all files under the srcdir, to be used for install_data
+ def walk_helper(lst, dirname, files):
+ for f in files:
+ filename = opj(dirname, f)
+ if not os.path.isdir(filename):
+ lst.append( (dirname, [filename]) )
+ file_list = []
+ os.path.walk(srcdir, walk_helper, file_list)
+ return file_list
+
+
+def find_data_files(srcdir, *wildcards):
+ # get a list of all files under the srcdir matching wildcards,
+ # returned in a format to be used for install_data
+
+ def walk_helper(arg, dirname, files):
+ names = []
+ lst, wildcards = arg
+ for wc in wildcards:
+ for f in files:
+ filename = opj(dirname, f)
+ if fnmatch.fnmatch(filename, wc) and not os.path.isdir(filename):
+ names.append(filename)
+ if names:
+ lst.append( (dirname, names ) )
+
+ file_list = []
+ os.path.walk(srcdir, walk_helper, (file_list, wildcards))
+ return file_list
+
+
+def makeLibName(name):
+ if os.name == 'posix':
+ libname = '%s_%s-%s' % (WXBASENAME, name, WXRELEASE)
+ else:
+ libname = 'wxmsw%s%s_%s' % (WXDLLVER, libFlag(), name)
+
+ return [libname]
+
+
+
+def adjustCFLAGS(cflags, defines, includes):
+ '''Extrace the raw -I, -D, and -U flags and put them into
+ defines and includes as needed.'''
+ newCFLAGS = []
+ for flag in cflags:
+ if flag[:2] == '-I':
+ includes.append(flag[2:])
+ elif flag[:2] == '-D':
+ flag = flag[2:]
+ if flag.find('=') == -1:
+ defines.append( (flag, None) )
+ else:
+ defines.append( tuple(flag.split('=')) )
+ elif flag[:2] == '-U':
+ defines.append( (flag[2:], ) )
+ else:
+ newCFLAGS.append(flag)
+ return newCFLAGS
+
+
+
+def adjustLFLAGS(lfags, libdirs, libs):
+ '''Extrace the -L and -l flags and put them in libdirs and libs as needed'''
+ newLFLAGS = []
+ for flag in lflags:
+ if flag[:2] == '-L':
+ libdirs.append(flag[2:])
+ elif flag[:2] == '-l':
+ libs.append(flag[2:])
+ else:
+ newLFLAGS.append(flag)
+
+ return newLFLAGS
+
+#----------------------------------------------------------------------
+# sanity checks
+