mirror of
https://github.com/cookiengineer/audacity
synced 2025-05-05 22:28:57 +02:00
121 lines
3.5 KiB
Python
121 lines
3.5 KiB
Python
#! /usr/bin/env python
|
|
# encoding: utf-8
|
|
# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
|
|
|
|
import re
|
|
from waflib import Task,Utils,Logs
|
|
from waflib.TaskGen import extension,feature,after_method
|
|
from waflib.Configure import conf
|
|
from waflib.Tools import c_preproc
|
|
SWIG_EXTS=['.swig','.i']
|
|
re_module=re.compile('%module(?:\s*\(.*\))?\s+(.+)',re.M)
|
|
re_1=re.compile(r'^%module.*?\s+([\w]+)\s*?$',re.M)
|
|
re_2=re.compile('%include "(.*)"',re.M)
|
|
re_3=re.compile('#include "(.*)"',re.M)
|
|
class swig(Task.Task):
|
|
color='BLUE'
|
|
run_str='${SWIG} ${SWIGFLAGS} ${SWIGPATH_ST:INCPATHS} ${SWIGDEF_ST:DEFINES} ${SRC}'
|
|
ext_out=['.h']
|
|
vars=['SWIG_VERSION','SWIGDEPS']
|
|
def runnable_status(self):
|
|
for t in self.run_after:
|
|
if not t.hasrun:
|
|
return Task.ASK_LATER
|
|
if not getattr(self,'init_outputs',None):
|
|
self.init_outputs=True
|
|
if not getattr(self,'module',None):
|
|
txt=self.inputs[0].read()
|
|
m=re_module.search(txt)
|
|
if not m:
|
|
raise ValueError("could not find the swig module name")
|
|
self.module=m.group(1)
|
|
swig_c(self)
|
|
for x in self.env['SWIGFLAGS']:
|
|
x=x[1:]
|
|
try:
|
|
fun=swig_langs[x]
|
|
except KeyError:
|
|
pass
|
|
else:
|
|
fun(self)
|
|
return super(swig,self).runnable_status()
|
|
def scan(self):
|
|
env=self.env
|
|
lst_src=[]
|
|
seen=[]
|
|
to_see=[self.inputs[0]]
|
|
while to_see:
|
|
node=to_see.pop(0)
|
|
if node in seen:
|
|
continue
|
|
seen.append(node)
|
|
lst_src.append(node)
|
|
code=node.read()
|
|
code=c_preproc.re_nl.sub('',code)
|
|
code=c_preproc.re_cpp.sub(c_preproc.repl,code)
|
|
names=re_2.findall(code)+re_3.findall(code)
|
|
for n in names:
|
|
for d in self.generator.includes_nodes+[node.parent]:
|
|
u=d.find_resource(n)
|
|
if u:
|
|
to_see.append(u)
|
|
break
|
|
else:
|
|
Logs.warn('could not find %r'%n)
|
|
return(lst_src,[])
|
|
swig_langs={}
|
|
def swigf(fun):
|
|
swig_langs[fun.__name__.replace('swig_','')]=fun
|
|
swig.swigf=swigf
|
|
def swig_c(self):
|
|
ext='.swigwrap_%d.c'%self.generator.idx
|
|
flags=self.env['SWIGFLAGS']
|
|
if'-c++'in flags:
|
|
ext+='xx'
|
|
out_node=self.inputs[0].parent.find_or_declare(self.module+ext)
|
|
if'-c++'in flags:
|
|
c_tsk=self.generator.cxx_hook(out_node)
|
|
else:
|
|
c_tsk=self.generator.c_hook(out_node)
|
|
c_tsk.set_run_after(self)
|
|
ge=self.generator.bld.producer
|
|
ge.outstanding.insert(0,c_tsk)
|
|
ge.total+=1
|
|
try:
|
|
ltask=self.generator.link_task
|
|
except AttributeError:
|
|
pass
|
|
else:
|
|
ltask.set_run_after(c_tsk)
|
|
ltask.inputs.append(c_tsk.outputs[0])
|
|
self.outputs.append(out_node)
|
|
if not'-o'in self.env['SWIGFLAGS']:
|
|
self.env.append_value('SWIGFLAGS',['-o',self.outputs[0].abspath()])
|
|
@swigf
|
|
def swig_python(tsk):
|
|
tsk.set_outputs(tsk.inputs[0].parent.find_or_declare(tsk.module+'.py'))
|
|
@swigf
|
|
def swig_ocaml(tsk):
|
|
tsk.set_outputs(tsk.inputs[0].parent.find_or_declare(tsk.module+'.ml'))
|
|
tsk.set_outputs(tsk.inputs[0].parent.find_or_declare(tsk.module+'.mli'))
|
|
@extension(*SWIG_EXTS)
|
|
def i_file(self,node):
|
|
tsk=self.create_task('swig')
|
|
tsk.set_inputs(node)
|
|
tsk.module=getattr(self,'swig_module',None)
|
|
flags=self.to_list(getattr(self,'swig_flags',[]))
|
|
tsk.env.append_value('SWIGFLAGS',flags)
|
|
@conf
|
|
def check_swig_version(self):
|
|
reg_swig=re.compile(r'SWIG Version\s(.*)',re.M)
|
|
swig_out=self.cmd_and_log('%s -version'%self.env['SWIG'])
|
|
swigver=tuple([int(s)for s in reg_swig.findall(swig_out)[0].split('.')])
|
|
self.env['SWIG_VERSION']=swigver
|
|
msg='Checking for swig version'
|
|
self.msg(msg,'.'.join(map(str,swigver)))
|
|
return swigver
|
|
def configure(conf):
|
|
swig=conf.find_program('swig',var='SWIG')
|
|
conf.env.SWIGPATH_ST='-I%s'
|
|
conf.env.SWIGDEF_ST='-D%s'
|