[Distutils-sig] Compilers module

Well, for those who haven't looked at interscript, here is the compilers module for comment. These modules work with gcc on my box. The idea is to _require_ the client implement these modules (providing some common implementation such as this one). That way, there is a standard _interface_ for compiling external tools and python modules, which can be used by author build software in a platform independent way. ------------ compilers.py --------------------------------------- #line 13 "compilers.ipk" import os import sys import string import interscript.compilers.cconfig class python_module: def __init__(self,**kwds): self.config = interscript.compilers.cconfig.config() self.config.append_dict(kwds) def configure(self,**kwds): self.config.append_dict(kwds) def compile(self,filename, **kwds): config = self.config.copy() config.append_dict(kwds) base = string.join(string.split(filename,'.')[:-1],'.') obj = base+'.o' cc ='gcc -g -O2 -fpic -fPIC -pedantic ' inc = '-I' + sys.prefix + '/include/python1.5 ' if sys.prefix != sys.exec_prefix: inc = inc + '-I' + sys.exec_prefix + '/include/python1.5 ' cstr = str(config)+' ' arg = cc + cstr + inc + '-c '+filename + ' -o '+ obj print 'system',repr(arg) os.system(arg) return obj def link(self,modname, filenames, **kwds): config = self.config.copy() config.append_dict(kwds) dll = modname +'.so' cc ='gcc -shared -Xlinker -export-dynamic ' cstr = str(config) + ' ' lib = '-L' + sys.exec_prefix + '/lib/python1.5 ' files = string.join(filenames) + ' ' arg = cc + cstr + lib + files + '-o ' + dll print 'system',repr(arg) os.system(arg) return dll class application: def __init__(self,**kwds): self.config = interscript.compilers.cconfig.config() self.config.append_dict(kwds) def configure(self,**kwds): self.config.append_dict(kwds) def compile(self,filename, **kwds): config = self.config.copy() config.append_dict(kwds) base = string.join(string.split(filename,'.')[:-1],'.') obj = base+'.o' cc ='gcc -g -O2 -fpic -fPIC -pedantic ' inc = '-I' + sys.prefix + '/include/python1.5 ' if sys.prefix != sys.exec_prefix: inc = inc + '-I' + sys.exec_prefix + '/include/python1.5 ' cstr = str(config)+' ' arg = cc + cstr + inc + '-c '+filename + ' -o '+ obj print 'system',repr(arg) os.system(arg) return obj def link(self,appname, filenames, **kwds): config = self.config.copy() config.append_dict(kwds) cc ='gcc ' cstr = str(config) + ' ' lib = '-L' + sys.exec_prefix + '/lib/python1.5 ' files = string.join(filenames) + ' ' arg = cc + cstr + lib + files + '-o ' + appname print 'system',repr(arg) os.system(arg) return appname ------------ cconfig.py --------- #line 188 "compilers.ipk" import os import sys import string class config: def __init__(self,**kwds): self.libdirs = [] self.incdirs = [] self.libs = [] self.macros = {} self.switches = {} self.extra = '' self.append_dict(kwds) def copy(self): c = config() c.libdirs = self.libdirs[:] c.incdirs = self.incdirs[:] c.libs = self.libs[:] c.macros = self.macros.copy() c.switches = self.switches.copy() c.extra = self.extra return c def append_kwds(self,**kwds): self.append_dict(kwds) def append_dict(self,kwds): if kwds.has_key('libdirs'): self.libdirs[-1:-1]=kwds['libdirs'] if kwds.has_key('incdirs'): self.incdirs[-1:-1]=kwds['incdirs'] if kwds.has_key('libs'): self.libs[-1:-1]=kwds['libs'] if kwds.has_key('extra'): self.extra = self.extra + ' ' + kwds['extra'] if kwds.has_key('macros'): macros = kwds['macros'] for macro in macros: self.macros[macro] = macros[macro] if kwds.has_key('switches'): switches = kwds['switches'] for switch in switches: self.switches[switch] = switches[switch] def __str__(self): s = self.extra for x in self.libdirs: s = s + ' -L' + x for x in self.incdirs : s = s + ' -I' + x for x in self.libs: s = s + ' -l' + x for x in self.macros.keys(): s = s + ' -D' + x if self.macros[x]: s = s + '=' + self.macros[x] for x in self.switches.keys(): s = s + ' -' + x + self.switches[x] return s ------------------------------------------------------- John Skaller email: skaller@maxtal.com.au http://www.maxtal.com.au/~skaller phone: 61-2-96600850 snail: 10/1 Toxteth Rd, Glebe NSW 2037, Australia
participants (1)
-
John Skaller