git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3931 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			789 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			789 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/env python
 | 
						|
#----------------------------------------------------------------------------
 | 
						|
# Name:         build.py
 | 
						|
# Purpose:	This script is used to build wxPython.  It reads a build
 | 
						|
#               configuration file in the requested project directory and
 | 
						|
#               based on the contents of the file can build Makefiles for
 | 
						|
#               unix or win32, and can execute make with various options
 | 
						|
#               potentially automating the entire build/install/clean process
 | 
						|
#               from a single command.
 | 
						|
#
 | 
						|
# Author:       Robin Dunn
 | 
						|
#
 | 
						|
# Created:      18-Aug-1999
 | 
						|
# RCS-ID:       $Id$
 | 
						|
# Copyright:    (c) 1999 by Total Control Software
 | 
						|
# Licence:      wxWindows license
 | 
						|
#----------------------------------------------------------------------------
 | 
						|
"""
 | 
						|
build.py
 | 
						|
 | 
						|
    This script is used to build wxPython.  It reads a build configuration
 | 
						|
    file in the requested project directory and based on the contents of
 | 
						|
    the file can build Makefiles for unix or win32, and can execute make
 | 
						|
    with various options potentially automating the entire
 | 
						|
    build/install/clean process from a single command.
 | 
						|
 | 
						|
    The default action is to build the Makefile and exit.
 | 
						|
 | 
						|
Options
 | 
						|
    -C dir        CD to dir before doing anything
 | 
						|
    -B file       Use file as the build configuration (default ./build.cfg)
 | 
						|
    -M file       Use file as the name of the makefile to create
 | 
						|
                  (default Makefile)
 | 
						|
 | 
						|
    -b            Build the module (runs make)
 | 
						|
    -i            Install the module (runs make install)
 | 
						|
    -c            Cleanup (runs make clean)
 | 
						|
    -u            Uninstall (runs make uninstall)
 | 
						|
 | 
						|
    -h            Show help and exit
 | 
						|
 | 
						|
 | 
						|
Configuration Files
 | 
						|
 | 
						|
    The build configuration file lists targets, source files and options
 | 
						|
    for the the build process.  The contents of the build.cfg are used to
 | 
						|
    dynamically generate the Makefile.
 | 
						|
 | 
						|
    To prevent you from getting screwed when the default build.cfg is
 | 
						|
    updated, you can override the values in build.cfg by putting your
 | 
						|
    custom definitions in a file named build.local.  You can also place a
 | 
						|
    build.local file in the parent directory, or even in the grandparent
 | 
						|
    directory for project-wide overrides.  Finally, command-line arguments
 | 
						|
    of the form NAME=VALUE can also be used to override simple configuration
 | 
						|
    values.  The order of evaluation is:
 | 
						|
 | 
						|
        0. comman-line flags (-M, -b, etc.)
 | 
						|
        1. ./build.cfg
 | 
						|
        2. ../../build.local   (if present)
 | 
						|
        3. ../build.local      (if present)
 | 
						|
        4. ./build.local       (if present)
 | 
						|
        5. command-line NAME=VALUEs
 | 
						|
 | 
						|
    The config files are actually just Python files that get exec'ed in a
 | 
						|
    separate namespace which is then used later as a configuration object.
 | 
						|
    This keeps the build script simple in that it doesn't have to parse
 | 
						|
    anything, and the config files can be much more than just names and
 | 
						|
    values as pretty much any python code can be executed.  The global
 | 
						|
    variables set in the config namespace are what are used later as
 | 
						|
    configuation values.
 | 
						|
 | 
						|
 | 
						|
Configuration Options
 | 
						|
 | 
						|
    The following variables can be set in the config files.  Only a few are
 | 
						|
    required, the rest will either have suitable defaults or will be
 | 
						|
    calculated from your current Python runtime environment.
 | 
						|
 | 
						|
    MODULE           The name of the extension module to produce
 | 
						|
    SWIGFILES        A list of files that should be run through SWIG
 | 
						|
    SWIGFLAGS        Flags for SWIG
 | 
						|
    SOURCES          Other C/C++ sources that should be part of the module
 | 
						|
    PYFILES          Other Python files that should be installed with the module
 | 
						|
    CFLAGS           Flags to be used by the compiler
 | 
						|
    LFLAGS           Flags to be used at the link step
 | 
						|
    LIBS             Libraries to be linked with
 | 
						|
 | 
						|
    OTHERCFLAGS      Extra flags to append to CFLAGS
 | 
						|
    OTHERLFLAGS      Extra flags to append to LFLAGS
 | 
						|
    OTHERSWIGFLAGS   Extra flags to append to SWIGFLAGS
 | 
						|
    OTHERLIBS        Other libraries to be linked with, in addition to LIBS
 | 
						|
    OTHERTARGETS     Other targets to be placed on the default rule line
 | 
						|
    OTHERINSTALLTARGETS
 | 
						|
                     Other targets to be placed on the install rule line
 | 
						|
    OTHERRULES       This text is placed at the end of the makefile and
 | 
						|
                     will typically be used for adding rules and such
 | 
						|
    DEFAULTRULE      Text to be used for the default rule in the makefile
 | 
						|
 | 
						|
    TARGETDIR        Destination for the install step
 | 
						|
 | 
						|
    MAKE             The make program to use
 | 
						|
    MAKEFILE         The name of the makefile
 | 
						|
 | 
						|
    runBuild         Setting this to 1 is eqivalent to the -b flag
 | 
						|
    runInstall       Setting this to 1 is eqivalent to the -i flag
 | 
						|
    runClean         Setting this to 1 is eqivalent to the -c flag
 | 
						|
    runUninstall     Setting this to 1 is eqivalent to the -u flag
 | 
						|
 | 
						|
    PYVERSION        Version number of Python used in pathnames
 | 
						|
    PYPREFIX         The root of the Python install
 | 
						|
    EXECPREFIX       The root of the Python install for binary files
 | 
						|
    PYTHONLIB        The Python link library
 | 
						|
 | 
						|
"""
 | 
						|
 | 
						|
import sys, os, string, getopt
 | 
						|
 | 
						|
#----------------------------------------------------------------------------
 | 
						|
# This is really the wxPython version number, and will be placed in the
 | 
						|
# Makefiles for use with the distribution related targets.
 | 
						|
 | 
						|
__version__ = '2.1.5'
 | 
						|
 | 
						|
#----------------------------------------------------------------------------
 | 
						|
 | 
						|
def main(args):
 | 
						|
    try:
 | 
						|
        opts, args = getopt.getopt(args[1:], 'C:B:M:bicu')
 | 
						|
    except getopt.error:
 | 
						|
        usage()
 | 
						|
        sys.exit(1)
 | 
						|
 | 
						|
    if not os.environ.has_key('WXWIN'):
 | 
						|
        print "WARNING: WXWIN is not set in the environment.  WXDIR may not\n"\
 | 
						|
              "         be set properly in the makefile, you will have to \n"\
 | 
						|
              "         set the environment variable or override in build.local."
 | 
						|
 | 
						|
    bldCfg       = 'build.cfg'
 | 
						|
    bldCfgLocal  = 'build.local'
 | 
						|
    MAKEFILE     = 'Makefile'
 | 
						|
    runBuild     = 0
 | 
						|
    runInstall   = 0
 | 
						|
    runClean     = 0
 | 
						|
    runUninstall = 0
 | 
						|
 | 
						|
    for flag, value in opts:
 | 
						|
        if   flag == '-C':   os.chdir(value)
 | 
						|
        elif flag == '-B':   bldCfgFile = value
 | 
						|
        elif flag == '-M':   makefile = value
 | 
						|
        elif flag == '-b':   runBuild = 1
 | 
						|
        elif flag == '-c':   runClean = 1
 | 
						|
        elif flag == '-i':   runInstall = 1
 | 
						|
        elif flag == '-u':   runUninstall = 1
 | 
						|
 | 
						|
        elif flag == '-h':   usage(); sys.exit(1)
 | 
						|
        else:  usage(); sys.exit(1)
 | 
						|
 | 
						|
    config = BuildConfig(bldCfg = bldCfg,
 | 
						|
                         bldCfgLocal = bldCfgLocal,
 | 
						|
                         MAKEFILE = MAKEFILE,
 | 
						|
                         runBuild = runBuild,
 | 
						|
                         runInstall =  runInstall,
 | 
						|
                         runClean = runClean,
 | 
						|
                         runUninstall = runUninstall)
 | 
						|
 | 
						|
    err = 0
 | 
						|
    if config.readConfigFiles(args):
 | 
						|
        config.doFixups()
 | 
						|
        config.makeMakefile()
 | 
						|
 | 
						|
        if config.runBuild:
 | 
						|
            cmd = "%s -f %s" % (config.MAKE, config.MAKEFILE)
 | 
						|
            print "Running:", cmd
 | 
						|
            err = os.system(cmd)
 | 
						|
 | 
						|
        if not err and config.runInstall:
 | 
						|
            cmd = "%s -f %s install" % (config.MAKE, config.MAKEFILE)
 | 
						|
            print "Running:", cmd
 | 
						|
            err = os.system(cmd)
 | 
						|
 | 
						|
 | 
						|
        if not err and config.runClean:
 | 
						|
            cmd = "%s -f %s clean" % (config.MAKE, config.MAKEFILE)
 | 
						|
            print "Running:", cmd
 | 
						|
            err = os.system(cmd)
 | 
						|
 | 
						|
        if not err and config.runUninstall:
 | 
						|
            cmd = "%s -f %s uninstall" % (config.MAKE, config.MAKEFILE)
 | 
						|
            print "Running:", cmd
 | 
						|
            err = os.system(cmd)
 | 
						|
 | 
						|
    return err
 | 
						|
 | 
						|
 | 
						|
#----------------------------------------------------------------------------
 | 
						|
 | 
						|
def usage():
 | 
						|
    print __doc__
 | 
						|
 | 
						|
#----------------------------------------------------------------------------
 | 
						|
 | 
						|
def swapslash(st):
 | 
						|
    if sys.platform != 'win32':
 | 
						|
        st = string.join(string.split(st, '\\'), '/')
 | 
						|
    return st
 | 
						|
 | 
						|
#----------------------------------------------------------------------------
 | 
						|
 | 
						|
def splitlines(st):
 | 
						|
    return string.join(string.split(string.strip(st), ' '), ' \\\n\t')
 | 
						|
 | 
						|
#----------------------------------------------------------------------------
 | 
						|
 | 
						|
class BuildConfig:
 | 
						|
    def __init__(self, **kw):
 | 
						|
        self.__dict__.update(kw)
 | 
						|
        self.setDefaults()
 | 
						|
 | 
						|
    #------------------------------------------------------------
 | 
						|
    def setDefaults(self):
 | 
						|
        self.VERSION = __version__
 | 
						|
        self.MODULE = ''
 | 
						|
        self.SWIGFILES = []
 | 
						|
        self.SWIGFLAGS = '-c++ -shadow -python -keyword -dnone -I$(WXPSRCDIR)'
 | 
						|
        self.SOURCES = []
 | 
						|
        self.PYFILES = []
 | 
						|
        self.LFLAGS = ''
 | 
						|
        self.OTHERCFLAGS = ''
 | 
						|
        self.OTHERLFLAGS = ''
 | 
						|
        self.OTHERSWIGFLAGS = ''
 | 
						|
        self.OTHERLIBS = ''
 | 
						|
        self.OTHERTARGETS = ''
 | 
						|
        self.OTHERINSTALLTARGETS = ''
 | 
						|
        self.OTHERUNINSTALLTARGETS = ''
 | 
						|
        self.OTHERRULES = ''
 | 
						|
        self.DEFAULTRULE = 'default: $(GENCODEDIR) $(TARGET)'
 | 
						|
        self.PYVERSION = sys.version[:3]
 | 
						|
        self.PYPREFIX  = sys.prefix
 | 
						|
        self.EXECPREFIX = sys.exec_prefix
 | 
						|
        self.WXDIR = '$(WXWIN)'
 | 
						|
        self.FINAL = '0'
 | 
						|
        self.WXP_USE_THREAD = '1'
 | 
						|
        self.WXUSINGDLL = '1'
 | 
						|
        self.OTHERDEP = ''
 | 
						|
        self.WXPSRCDIR = '$(WXDIR)/utils/wxPython/src'
 | 
						|
        self.SWIGDEPS = ''
 | 
						|
        self.OTHERDEPS = ''
 | 
						|
 | 
						|
 | 
						|
        if sys.platform == 'win32':
 | 
						|
            self.MAKE = 'nmake'
 | 
						|
            self.PYTHONLIB = '$(PYPREFIX)\\libs\\python15.lib'
 | 
						|
            self.TARGETDIR = '$(PYPREFIX)\\wxPython'
 | 
						|
            self.LIBS = '$(PYTHONLIB) $(WXPSRCDIR)\wxc.lib'
 | 
						|
            self.GENCODEDIR = 'msw'
 | 
						|
            self.SWIGTOOLKITFLAG = '-D__WXMSW__'
 | 
						|
            self.OBJEXT = '.obj'
 | 
						|
            self.TARGET = '$(MODULE).pyd'
 | 
						|
            self.CFLAGS = '-I$(PYPREFIX)\include -I$(WXPSRCDIR) -I. /Fp$(MODULE).pch /YXhelpers.h -DSWIG_GLOBAL -DHAVE_CONFIG_H $(THREAD) '
 | 
						|
            self.LFLAGS = '$(DEBUGLFLAGS) /DLL /subsystem:windows,3.50 /machine:I386 /nologo'
 | 
						|
            self.RESFILE = ''
 | 
						|
            self.RESRULE = ''
 | 
						|
            self.OVERRIDEFLAGS = '/GX-'
 | 
						|
            self.RMCMD  = '-erase '
 | 
						|
            self.WXPSRCDIR = os.path.normpath(self.WXPSRCDIR)
 | 
						|
            self.CRTFLAG = ''
 | 
						|
 | 
						|
 | 
						|
        else:
 | 
						|
            self.MAKE      = 'make'
 | 
						|
            self.PYLIB     = '$(EXECPREFIX)/lib/python$(PYVERSION)'
 | 
						|
            self.LIBPL     = '$(PYLIB)/config'
 | 
						|
            self.PYTHONLIB = '$(LIBPL)/libpython$(PYVERSION).a'
 | 
						|
            self.TARGETDIR = '$(EXECPREFIX)/lib/python$(PYVERSION)/site-packages/wxPython'
 | 
						|
            self.TARGET = '$(MODULE)module$(SO)'
 | 
						|
            self.OBJEXT = '.o'
 | 
						|
            self.HELPERLIB = 'wxPyHelpers'
 | 
						|
            self.HELPERLIBDIR = '/usr/local/lib'
 | 
						|
            self.CFLAGS = '-DSWIG_GLOBAL -DHAVE_CONFIG_H $(THREAD) -I. '\
 | 
						|
                          '`wx-config --cflags` -I$(PYINCLUDE) -I$(EXECINCLUDE) '\
 | 
						|
                          '-I$(WXPSRCDIR)'
 | 
						|
            self.LFLAGS = '-L$(WXPSRCDIR) `wx-config --libs`'
 | 
						|
            self.LIBS   = '-l$(HELPERLIB)'
 | 
						|
            self.RMCMD  = '-rm -f '
 | 
						|
 | 
						|
            # **** What to do when I start supporting Motif, etc.???
 | 
						|
            self.GENCODEDIR = 'gtk'
 | 
						|
            self.SWIGTOOLKITFLAG = '-D__WXGTK__'
 | 
						|
 | 
						|
            # Extract a few things from Python's Makefile...
 | 
						|
            try:
 | 
						|
                filename = os.path.join(self.EXECPREFIX,
 | 
						|
                                        'lib/python'+self.PYVERSION,
 | 
						|
                                        'config/Makefile')
 | 
						|
                mfText = string.split(open(filename, 'r').read(), '\n')
 | 
						|
            except IOError:
 | 
						|
                raise SystemExit, "Python development files not found"
 | 
						|
 | 
						|
            self.CCC = self.findMFValue(mfText, 'CCC')
 | 
						|
            self.CC = self.findMFValue(mfText, 'CC')
 | 
						|
            self.OPT = self.findMFValue(mfText, 'OPT')
 | 
						|
            self.SO = self.findMFValue(mfText, 'SO')
 | 
						|
            self.LDSHARED = self.findMFValue(mfText, 'LDSHARED')
 | 
						|
            self.CCSHARED = self.findMFValue(mfText, 'CCSHARED')
 | 
						|
            #self.LINKFORSHARED = self.findMFValue(mfText, 'LINKFORSHARED')
 | 
						|
            #self. = self.findMFValue(mfText, '')
 | 
						|
            #self. = self.findMFValue(mfText, '')
 | 
						|
 | 
						|
 | 
						|
            # The majority of cases will require LDSHARED to be
 | 
						|
            # modified to use the C++ driver instead of the C driver
 | 
						|
            # for linking.  We'll try to do it here and if we goof up
 | 
						|
            # then the user can correct it in their build.local file.
 | 
						|
            self.LDSHARED = string.join(['$(CCC)'] +
 | 
						|
                                        string.split(self.LDSHARED, ' ')[1:],
 | 
						|
                                        ' ')
 | 
						|
 | 
						|
 | 
						|
    #------------------------------------------------------------
 | 
						|
    def doFixups(self):
 | 
						|
        # This is called after the config files have been evaluated
 | 
						|
        # so we can do some sanity checking...
 | 
						|
        if sys.platform != 'win32':
 | 
						|
	    if not self.CCC:
 | 
						|
		print "Warning: C++ compiler not specified (CCC). Assuming c++"
 | 
						|
		self.CCC = 'c++'
 | 
						|
	    if not self.CC:
 | 
						|
		print "Warning: C compiler not specified (CC). Assuming cc"
 | 
						|
		self.CC = 'cc'
 | 
						|
 | 
						|
    #------------------------------------------------------------
 | 
						|
    def findMFValue(self, mfText, st):
 | 
						|
        # Find line begining with st= and return the value
 | 
						|
        # Regex would probably be to cooler way to do this, but
 | 
						|
        # I think this is the most understandable.
 | 
						|
        for line in mfText:
 | 
						|
            if string.find(line, st+'=') == 0:
 | 
						|
                st = string.strip(line[len(st)+1:])
 | 
						|
                return st
 | 
						|
        return None
 | 
						|
 | 
						|
    #------------------------------------------------------------
 | 
						|
    def makeMakefile(self):
 | 
						|
 | 
						|
        # make a list of object file names
 | 
						|
        objects = ""
 | 
						|
        for name in self.SWIGFILES:
 | 
						|
            objects = objects + os.path.splitext(name)[0] + self.OBJEXT + ' '
 | 
						|
        for name in self.SOURCES:
 | 
						|
	    obj = os.path.basename(name)
 | 
						|
            objects = objects + os.path.splitext(obj)[0] + self.OBJEXT + ' '
 | 
						|
        self.OBJECTS = splitlines(objects)
 | 
						|
 | 
						|
 | 
						|
        # now build the text for the dependencies
 | 
						|
        depends = ""
 | 
						|
        for name in self.SWIGFILES:
 | 
						|
            rootname = os.path.splitext(name)[0]
 | 
						|
            text = '$(GENCODEDIR)/%s.cpp $(GENCODEDIR)/%s.py : %s.i %s\n' \
 | 
						|
                   '$(TARGETDIR)\\%s.py : $(GENCODEDIR)\\%s.py\n' % \
 | 
						|
                   (rootname, rootname, rootname, self.SWIGDEPS, rootname, rootname)
 | 
						|
            depends = depends + text
 | 
						|
            if self.OTHERDEPS:
 | 
						|
                text = '%s%s : %s\n' % \
 | 
						|
                       (os.path.splitext(name)[0], self.OBJEXT, self.OTHERDEPS)
 | 
						|
                depends = depends + text
 | 
						|
        for name in self.PYFILES:
 | 
						|
            text = '$(TARGETDIR)\\%s.py : %s.py\n' % \
 | 
						|
                   tuple([os.path.splitext(name)[0]] * 2)
 | 
						|
            depends = depends + text
 | 
						|
        if self.OTHERDEPS:
 | 
						|
            for name in self.SOURCES:
 | 
						|
                name = os.path.basename(name)
 | 
						|
                text = '%s%s : %s\n' % \
 | 
						|
                       (os.path.splitext(name)[0], self.OBJEXT, self.OTHERDEPS)
 | 
						|
                depends = depends + text
 | 
						|
 | 
						|
        self.DEPENDS = swapslash(depends)
 | 
						|
 | 
						|
 | 
						|
        # and the list of .py files
 | 
						|
        pymodules = ""
 | 
						|
        for name in self.SWIGFILES:
 | 
						|
            pymodules = pymodules + '$(TARGETDIR)\\%s.py ' % os.path.splitext(name)[0]
 | 
						|
        for name in self.PYFILES:
 | 
						|
            pymodules = pymodules + '$(TARGETDIR)\\%s.py ' % os.path.splitext(name)[0]
 | 
						|
        self.PYMODULES = splitlines(swapslash(pymodules))
 | 
						|
 | 
						|
 | 
						|
        # now make a list of the python files that would need uninstalled
 | 
						|
        pycleanup = ""
 | 
						|
        for name in self.SWIGFILES:
 | 
						|
            pycleanup = pycleanup + self.makeCleanupList(name)
 | 
						|
        for name in self.PYFILES:
 | 
						|
            pycleanup = pycleanup + self.makeCleanupList(name)
 | 
						|
        self.PYCLEANUP = swapslash(pycleanup)
 | 
						|
 | 
						|
 | 
						|
        # finally, build the makefile
 | 
						|
        if sys.platform == 'win32':
 | 
						|
            if self.RESFILE:
 | 
						|
                self.RESFILE = '$(MODULE).res'
 | 
						|
                self.RESRULE = '$(MODULE).res : $(MODULE).rc $(WXDIR)\\include\\wx\\msw\\wx.rc\n\t'\
 | 
						|
                               '$(rc) -r /i$(WXDIR)\\include -fo$@ $(MODULE).rc'
 | 
						|
            text = win32Template % self.__dict__
 | 
						|
        else:
 | 
						|
            text = unixTemplate % self.__dict__
 | 
						|
        f = open(self.MAKEFILE, 'w')
 | 
						|
        f.write(text)
 | 
						|
        f.close()
 | 
						|
 | 
						|
        print "Makefile created: ", self.MAKEFILE
 | 
						|
 | 
						|
 | 
						|
 | 
						|
    #------------------------------------------------------------
 | 
						|
    def makeCleanupList(self, name):
 | 
						|
        st = ""
 | 
						|
        st = st + '\t%s$(TARGETDIR)\\%s.py\n' % (self.RMCMD, os.path.splitext(name)[0])
 | 
						|
        st = st + '\t%s$(TARGETDIR)\\%s.pyc\n' % (self.RMCMD, os.path.splitext(name)[0])
 | 
						|
        st = st + '\t%s$(TARGETDIR)\\%s.pyo\n' % (self.RMCMD, os.path.splitext(name)[0])
 | 
						|
        return st
 | 
						|
 | 
						|
 | 
						|
    #------------------------------------------------------------
 | 
						|
    def readConfigFiles(self, args):
 | 
						|
        return self.processFile(self.bldCfg, 1) and \
 | 
						|
               self.processFile(os.path.join('../..', self.bldCfgLocal)) and \
 | 
						|
               self.processFile(os.path.join('..', self.bldCfgLocal)) and \
 | 
						|
               self.processFile(os.path.join('.', self.bldCfgLocal)) and \
 | 
						|
               self.processArgs(args)
 | 
						|
 | 
						|
    #------------------------------------------------------------
 | 
						|
    def processFile(self, filename, required=0):
 | 
						|
        try:
 | 
						|
            text = open(filename, 'r').read()
 | 
						|
        except IOError:
 | 
						|
            if required:
 | 
						|
                print "Unable to open %s" % filename
 | 
						|
                return 0
 | 
						|
            else:
 | 
						|
                return 1
 | 
						|
 | 
						|
        try:
 | 
						|
            exec(text, self.__dict__)
 | 
						|
        except:
 | 
						|
            print "Error evaluating %s" % filename
 | 
						|
            import traceback
 | 
						|
            traceback.print_exc()
 | 
						|
            return 0
 | 
						|
        return 1
 | 
						|
 | 
						|
 | 
						|
    #------------------------------------------------------------
 | 
						|
    def processArgs(self, args):
 | 
						|
        try:
 | 
						|
            for st in args:
 | 
						|
                pair = string.split(st, '=')
 | 
						|
                name = pair[0]
 | 
						|
                value = pair[1]
 | 
						|
                self.__dict__[name] = value
 | 
						|
        except:
 | 
						|
            print "Error parsing command-line: %s" % st
 | 
						|
            return 0
 | 
						|
 | 
						|
        return 1
 | 
						|
 | 
						|
 | 
						|
    #------------------------------------------------------------
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
#----------------------------------------------------------------------------
 | 
						|
#----------------------------------------------------------------------------
 | 
						|
#----------------------------------------------------------------------------
 | 
						|
 | 
						|
win32Template = '''
 | 
						|
#----------------------------------------------------------------------
 | 
						|
# This makefile was autogenerated from build.py.  Your changes will be
 | 
						|
# lost if the generator is run again.  You have been warned.
 | 
						|
#----------------------------------------------------------------------
 | 
						|
 | 
						|
WXDIR = %(WXDIR)s
 | 
						|
VERSION = %(VERSION)s
 | 
						|
MODULE = %(MODULE)s
 | 
						|
SWIGFLAGS = %(SWIGFLAGS)s %(SWIGTOOLKITFLAG)s %(OTHERSWIGFLAGS)s
 | 
						|
CFLAGS = %(CFLAGS)s
 | 
						|
LFLAGS = %(LFLAGS)s
 | 
						|
PYVERSION = %(PYVERSION)s
 | 
						|
PYPREFIX = %(PYPREFIX)s
 | 
						|
EXECPREFIX = %(EXECPREFIX)s
 | 
						|
PYTHONLIB = %(PYTHONLIB)s
 | 
						|
FINAL = %(FINAL)s
 | 
						|
WXP_USE_THREAD = %(WXP_USE_THREAD)s
 | 
						|
WXUSINGDLL = %(WXUSINGDLL)s
 | 
						|
GENCODEDIR = %(GENCODEDIR)s
 | 
						|
RESFILE = %(RESFILE)s
 | 
						|
WXPSRCDIR = %(WXPSRCDIR)s
 | 
						|
 | 
						|
 | 
						|
TARGETDIR = %(TARGETDIR)s
 | 
						|
 | 
						|
OBJECTS = %(OBJECTS)s
 | 
						|
PYMODULES = %(PYMODULES)s
 | 
						|
TARGET = %(TARGET)s
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
!if "$(FINAL)" == "0"
 | 
						|
DEBUGLFLAGS = /DEBUG /INCREMENTAL:YES
 | 
						|
!else
 | 
						|
DEBUGLFLAGS = /INCREMENTAL:NO
 | 
						|
!endif
 | 
						|
!if "$(WXP_USE_THREAD)" == "1"
 | 
						|
THREAD=-DWXP_USE_THREAD=1
 | 
						|
!endif
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
NOPCH=1
 | 
						|
OVERRIDEFLAGS=%(OVERRIDEFLAGS)s
 | 
						|
EXTRAFLAGS = $(CFLAGS) %(OTHERCFLAGS)s
 | 
						|
 | 
						|
LFLAGS = %(LFLAGS)s %(OTHERLFLAGS)s
 | 
						|
EXTRALIBS = %(LIBS)s %(OTHERLIBS)s
 | 
						|
 | 
						|
CRTFLAG=%(CRTFLAG)s
 | 
						|
 | 
						|
#----------------------------------------------------------------------
 | 
						|
 | 
						|
!include $(WXDIR)\\src\\makevc.env
 | 
						|
 | 
						|
#----------------------------------------------------------------------
 | 
						|
 | 
						|
%(DEFAULTRULE)s %(OTHERTARGETS)s
 | 
						|
 | 
						|
 | 
						|
 | 
						|
install: $(TARGETDIR) $(TARGETDIR)\\$(TARGET) pycfiles %(OTHERINSTALLTARGETS)s
 | 
						|
 | 
						|
clean:
 | 
						|
	-erase *.obj
 | 
						|
	-erase *.exe
 | 
						|
	-erase *.res
 | 
						|
	-erase *.map
 | 
						|
	-erase *.sbr
 | 
						|
	-erase *.pdb
 | 
						|
	-erase *.pch
 | 
						|
	-erase $(MODULE).exp
 | 
						|
	-erase $(MODULE).lib
 | 
						|
	-erase $(MODULE).ilk
 | 
						|
	-erase $(TARGET)
 | 
						|
 | 
						|
 | 
						|
uninstall: %(OTHERUNINSTALLTARGETS)s
 | 
						|
	-erase $(TARGETDIR)\\$(TARGET)
 | 
						|
%(PYCLEANUP)s
 | 
						|
 | 
						|
 | 
						|
#----------------------------------------------------------------------
 | 
						|
# implicit rule for compiling .cpp and .c files
 | 
						|
{}.cpp{}.obj:
 | 
						|
	$(cc) @<<
 | 
						|
$(CPPFLAGS) /c /Tp $<
 | 
						|
<<
 | 
						|
 | 
						|
{$(GENCODEDIR)}.cpp{}.obj:
 | 
						|
	$(cc) @<<
 | 
						|
$(CPPFLAGS) /c /Tp $<
 | 
						|
<<
 | 
						|
 | 
						|
{}.c{}.obj:
 | 
						|
	$(cc) @<<
 | 
						|
$(CPPFLAGS) /c $<
 | 
						|
<<
 | 
						|
 | 
						|
.SUFFIXES : .i .py
 | 
						|
 | 
						|
# Implicit rules to run SWIG
 | 
						|
{}.i{$(GENCODEDIR)}.cpp:
 | 
						|
	swig $(SWIGFLAGS) -c -o $@ $<
 | 
						|
 | 
						|
{}.i{$(GENCODEDIR)}.py:
 | 
						|
        swig $(SWIGFLAGS) -c -o $(GENCODEDIR)\\tmp_wrap.cpp $<
 | 
						|
        -erase $(GENCODEDIR)\\tmp_wrap.cpp
 | 
						|
 | 
						|
 | 
						|
{$(GENCODEDIR)}.py{$(TARGETDIR)}.py:
 | 
						|
	copy $< $@
 | 
						|
 | 
						|
{}.py{$(TARGETDIR)}.py:
 | 
						|
	copy $< $@
 | 
						|
 | 
						|
#----------------------------------------------------------------------
 | 
						|
 | 
						|
$(TARGET) : $(DUMMYOBJ) $(WXLIB) $(OBJECTS) $(RESFILE)
 | 
						|
	$(link) @<<
 | 
						|
/out:$@
 | 
						|
$(LFLAGS) /def:$(MODULE).def /implib:./$(MODULE).lib
 | 
						|
$(DUMMYOBJ) $(OBJECTS) $(RESFILE)
 | 
						|
$(LIBS)
 | 
						|
<<
 | 
						|
 | 
						|
 | 
						|
%(RESRULE)s
 | 
						|
 | 
						|
 | 
						|
$(TARGETDIR)\\$(TARGET) : $(TARGET)
 | 
						|
	copy $(TARGET) $@
 | 
						|
 | 
						|
 | 
						|
pycfiles : $(PYMODULES)
 | 
						|
	$(EXECPREFIX)\\python $(PYPREFIX)\\Lib\\compileall.py -l $(TARGETDIR)
 | 
						|
	$(EXECPREFIX)\\python -O $(PYPREFIX)\Lib\\compileall.py -l $(TARGETDIR)
 | 
						|
 | 
						|
 | 
						|
$(TARGETDIR) :
 | 
						|
	mkdir $(TARGETDIR)
 | 
						|
 | 
						|
$(GENCODEDIR):
 | 
						|
	mkdir $(GENCODEDIR)
 | 
						|
 | 
						|
#----------------------------------------------------------------------
 | 
						|
 | 
						|
%(DEPENDS)s
 | 
						|
 | 
						|
#----------------------------------------------------------------------
 | 
						|
 | 
						|
showflags:
 | 
						|
	@echo CPPFLAGS:
 | 
						|
	@echo $(CPPFLAGS)
 | 
						|
	@echo LFLAGS:
 | 
						|
	@echo $(LFLAGS)
 | 
						|
 | 
						|
 | 
						|
 | 
						|
%(OTHERRULES)s
 | 
						|
'''
 | 
						|
 | 
						|
#----------------------------------------------------------------------------
 | 
						|
#----------------------------------------------------------------------------
 | 
						|
#----------------------------------------------------------------------------
 | 
						|
 | 
						|
unixTemplate = '''
 | 
						|
#----------------------------------------------------------------------
 | 
						|
# This makefile was autogenerated from build.py.  Your changes will be
 | 
						|
# lost if the generator is run again.  You have been warned.
 | 
						|
#----------------------------------------------------------------------
 | 
						|
 | 
						|
 | 
						|
 | 
						|
WXDIR = %(WXDIR)s
 | 
						|
VERSION = %(VERSION)s
 | 
						|
MODULE = %(MODULE)s
 | 
						|
SWIGFLAGS = %(SWIGFLAGS)s %(SWIGTOOLKITFLAG)s %(OTHERSWIGFLAGS)s
 | 
						|
CFLAGS = %(CFLAGS)s $(OPT) %(OTHERCFLAGS)s
 | 
						|
LFLAGS = %(LFLAGS)s %(OTHERLFLAGS)s
 | 
						|
LIBS = %(LIBS)s %(OTHERLIBS)s
 | 
						|
PYVERSION = %(PYVERSION)s
 | 
						|
PYPREFIX = %(PYPREFIX)s
 | 
						|
EXECPREFIX = %(EXECPREFIX)s
 | 
						|
PYINCLUDE = $(PYPREFIX)/include/python$(PYVERSION)
 | 
						|
EXECINCLUDE = $(EXECPREFIX)/include/python$(PYVERSION)
 | 
						|
PYLIB = %(PYLIB)s
 | 
						|
LIBPL = %(LIBPL)s
 | 
						|
PYTHONLIB = %(PYTHONLIB)s
 | 
						|
FINAL = %(FINAL)s
 | 
						|
WXP_USE_THREAD = %(WXP_USE_THREAD)s
 | 
						|
GENCODEDIR = %(GENCODEDIR)s
 | 
						|
WXPSRCDIR = %(WXPSRCDIR)s
 | 
						|
HELPERLIB = %(HELPERLIB)s
 | 
						|
HELPERLIBDIR = %(HELPERLIBDIR)s
 | 
						|
 | 
						|
TARGETDIR = %(TARGETDIR)s
 | 
						|
 | 
						|
 | 
						|
CCC = %(CCC)s
 | 
						|
CC = %(CC)s
 | 
						|
OPT = %(OPT)s
 | 
						|
SO = %(SO)s
 | 
						|
LDSHARED = %(LDSHARED)s
 | 
						|
CCSHARED = %(CCSHARED)s
 | 
						|
 | 
						|
 | 
						|
OBJECTS = %(OBJECTS)s
 | 
						|
PYMODULES = %(PYMODULES)s
 | 
						|
TARGET = %(TARGET)s
 | 
						|
 | 
						|
 | 
						|
ifeq ($(WXP_USE_THREAD), 1)
 | 
						|
THREAD=-DWXP_USE_THREAD
 | 
						|
endif
 | 
						|
 | 
						|
#----------------------------------------------------------------------
 | 
						|
 | 
						|
%(DEFAULTRULE)s %(OTHERTARGETS)s
 | 
						|
 | 
						|
install: $(TARGETDIR) $(TARGETDIR)/$(TARGET) pycfiles %(OTHERINSTALLTARGETS)s
 | 
						|
 | 
						|
clean:
 | 
						|
	-rm -f *.o *$(SO) *~
 | 
						|
	-rm -f $(TARGET)
 | 
						|
 | 
						|
uninstall: %(OTHERUNINSTALLTARGETS)s
 | 
						|
	-rm -f $(TARGETDIR)/$(TARGET)
 | 
						|
%(PYCLEANUP)s
 | 
						|
 | 
						|
 | 
						|
#----------------------------------------------------------------------
 | 
						|
 | 
						|
%%.o : %%.cpp
 | 
						|
	$(CCC) $(CCSHARED) $(CFLAGS) $(OTHERCFLAGS) -c $<
 | 
						|
 | 
						|
%%.o : $(GENCODEDIR)/%%.cpp
 | 
						|
	$(CCC) $(CCSHARED) $(CFLAGS) $(OTHERCFLAGS) -c $<
 | 
						|
 | 
						|
%%.o : %%.c
 | 
						|
	$(CC) $(CCSHARED) $(CFLAGS) $(OTHERCFLAGS) -c $<
 | 
						|
 | 
						|
%%.o : $(GENCODEDIR)/%%.c
 | 
						|
	$(CC) $(CCSHARED) $(CFLAGS) $(OTHERCFLAGS) -c $<
 | 
						|
 | 
						|
ifndef NOSWIG
 | 
						|
$(GENCODEDIR)/%%.cpp : %%.i
 | 
						|
	swig $(SWIGFLAGS) -c -o $@ $<
 | 
						|
 | 
						|
$(GENCODEDIR)/%%.py : %%.i
 | 
						|
	swig $(SWIGFLAGS) -c -o $(GENCODEDIR)/tmp_wrap.cpp $<
 | 
						|
	rm $(GENCODEDIR)/tmp_wrap.cpp
 | 
						|
endif
 | 
						|
 | 
						|
 | 
						|
$(TARGETDIR)/%% : %%
 | 
						|
	cp -f $< $@
 | 
						|
 | 
						|
$(TARGETDIR)/%% : $(GENCODEDIR)/%%
 | 
						|
	cp -f $< $@
 | 
						|
 | 
						|
#----------------------------------------------------------------------
 | 
						|
 | 
						|
%(DEPENDS)s
 | 
						|
 | 
						|
#----------------------------------------------------------------------
 | 
						|
 | 
						|
$(TARGET) : $(OBJECTS)
 | 
						|
	$(LDSHARED) $(OBJECTS) $(LFLAGS) $(LIBS) $(OTHERLIBS) -o $(TARGET)
 | 
						|
 | 
						|
 | 
						|
 | 
						|
pycfiles : $(PYMODULES)
 | 
						|
	$(EXECPREFIX)/bin/python $(PYLIB)/compileall.py -l $(TARGETDIR)
 | 
						|
	$(EXECPREFIX)/bin/python -O $(PYLIB)/compileall.py -l $(TARGETDIR)
 | 
						|
 | 
						|
 | 
						|
$(TARGETDIR) :
 | 
						|
	mkdir $(TARGETDIR)
 | 
						|
 | 
						|
$(GENCODEDIR):
 | 
						|
	mkdir $(GENCODEDIR)
 | 
						|
 | 
						|
#----------------------------------------------------------------------
 | 
						|
 | 
						|
 | 
						|
%(OTHERRULES)s
 | 
						|
 | 
						|
 | 
						|
 | 
						|
'''
 | 
						|
 | 
						|
 | 
						|
#----------------------------------------------------------------------------
 | 
						|
 | 
						|
if __name__ == '__main__':
 | 
						|
    main(sys.argv)
 | 
						|
 | 
						|
#----------------------------------------------------------------------------
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 |