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 any pretty much any python code can be executed. The global
+ 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.
runUninstall = runUninstall)
if config.readConfigFiles(args):
+ config.doFixups()
config.makeMakefile()
err = 0
#----------------------------------------------------------------------------
-def strippath(st):
- # remove any leading paths, retrieve only file name. Used while
- # parsing the SOURCES file list, so that object files are local,
- # while source may be anywere)
- if sys.platform == 'win32':
- sep = '\\'
- else:
- sep = '/'
- return string.split(st,sep)[-1]
-
-#----------------------------------------------------------------------------
-
class BuildConfig:
def __init__(self, **kw):
self.__dict__.update(kw)
self.VERSION = __version__
self.MODULE = ''
self.SWIGFILES = []
- self.SWIGFLAGS = '-c++ -shadow -python -dnone -I$(WXPSRCDIR)'
+ self.SWIGFLAGS = '-c++ -shadow -python -keyword -dnone -I$(WXPSRCDIR)'
self.SOURCES = []
self.PYFILES = []
self.LFLAGS = ''
self.OTHERLIBS = ''
self.OTHERTARGETS = ''
self.OTHERINSTALLTARGETS = ''
+ self.OTHERUNINSTALLTARGETS = ''
self.OTHERRULES = ''
self.DEFAULTRULE = 'default: $(GENCODEDIR) $(TARGET)'
self.PYVERSION = sys.version[:3]
self.WXUSINGDLL = '1'
self.OTHERDEP = ''
self.WXPSRCDIR = '$(WXDIR)/utils/wxPython/src'
+ self.SWIGDEPS = ''
+ self.OTHERDEPS = ''
if sys.platform == 'win32':
self.RESFILE = ''
self.RESRULE = ''
self.OVERRIDEFLAGS = '/GX-'
+ self.RMCMD = '-erase '
+ self.WXPSRCDIR = os.path.normpath(self.WXPSRCDIR)
+
else:
self.MAKE = 'make'
'-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.???
+ # **** What to do when I start supporting Motif, etc.???
self.GENCODEDIR = 'gtk'
self.SWIGTOOLKITFLAG = '-D__WXGTK__'
raise SystemExit, "Python development files not found"
self.CCC = self.findMFValue(mfText, 'CCC')
- if not self.CCC:
- print "Warning: C++ compiler not specified (CCC). Assuming c++"
- self.CCC = 'c++'
self.CC = self.findMFValue(mfText, 'CC')
- if not self.CC:
- print "Warning: C compiler not specified (CCC). Assuming cc"
- self.CC = 'cc'
self.OPT = self.findMFValue(mfText, 'OPT')
self.SO = self.findMFValue(mfText, 'SO')
self.LDSHARED = self.findMFValue(mfText, 'LDSHARED')
' ')
+ #------------------------------------------------------------
+ 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
for name in self.SWIGFILES:
objects = objects + os.path.splitext(name)[0] + self.OBJEXT + ' '
for name in self.SOURCES:
- obj = strippath(name)
+ 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:
- text = '$(GENCODEDIR)/%s.cpp $(GENCODEDIR)/%s.py : %s.i\n' \
+ rootname = os.path.splitext(name)[0]
+ text = '$(GENCODEDIR)/%s.cpp $(GENCODEDIR)/%s.py : %s.i %s\n' \
'$(TARGETDIR)\\%s.py : $(GENCODEDIR)\\%s.py\n' % \
- tuple([os.path.splitext(name)[0]] * 5)
+ (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)
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':
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 \
+#----------------------------------------------------------------------------
#----------------------------------------------------------------------------
#----------------------------------------------------------------------------
VERSION = %(VERSION)s
MODULE = %(MODULE)s
SWIGFLAGS = %(SWIGFLAGS)s %(SWIGTOOLKITFLAG)s %(OTHERSWIGFLAGS)s
-CFLAGS = %(CFLAGS)s %(OTHERCFLAGS)s
-LFLAGS = %(LFLAGS)s %(OTHERLFLAGS)s
+CFLAGS = %(CFLAGS)s
+LFLAGS = %(LFLAGS)s
PYVERSION = %(PYVERSION)s
PYPREFIX = %(PYPREFIX)s
EXECPREFIX = %(EXECPREFIX)s
NOPCH=1
-OVERRIDEFLAGS=%(OVERRIDEFLAGS)s %(OTHERCFLAGS)s
-EXTRAFLAGS = %(CFLAGS)s
+OVERRIDEFLAGS=%(OVERRIDEFLAGS)s
+EXTRAFLAGS = $(CFLAGS) %(OTHERCFLAGS)s
LFLAGS = %(LFLAGS)s %(OTHERLFLAGS)s
EXTRALIBS = %(LIBS)s %(OTHERLIBS)s
-erase $(TARGET)
-uninstall:
+uninstall: %(OTHERUNINSTALLTARGETS)s
-erase $(TARGETDIR)\\$(TARGET)
- -erase $(PYMODULES)
+%(PYCLEANUP)s
+
#----------------------------------------------------------------------
# implicit rule for compiling .cpp and .c files
#----------------------------------------------------------------------
+showflags:
+ @echo CPPFLAGS:
+ @echo $(CPPFLAGS)
+ @echo LFLAGS:
+ @echo $(LFLAGS)
+
+
%(OTHERRULES)s
'''
VERSION = %(VERSION)s
MODULE = %(MODULE)s
SWIGFLAGS = %(SWIGFLAGS)s %(SWIGTOOLKITFLAG)s %(OTHERSWIGFLAGS)s
-CFLAGS = %(CFLAGS)s %(OTHERCFLAGS)s
+CFLAGS = %(CFLAGS)s $(OPT) %(OTHERCFLAGS)s
LFLAGS = %(LFLAGS)s %(OTHERLFLAGS)s
LIBS = %(LIBS)s %(OTHERLIBS)s
PYVERSION = %(PYVERSION)s
install: $(TARGETDIR) $(TARGETDIR)/$(TARGET) pycfiles %(OTHERINSTALLTARGETS)s
clean:
- -rm -f *.o *.so *~
+ -rm -f *.o *$(SO) *~
-rm -f $(TARGET)
-uninstall:
+uninstall: %(OTHERUNINSTALLTARGETS)s
-rm -f $(TARGETDIR)/$(TARGET)
- -rm -f $(PYMODULES)
+%(PYCLEANUP)s
#----------------------------------------------------------------------