83 lines
3.9 KiB
Python
83 lines
3.9 KiB
Python
#! /usr/bin/env python
|
|
# encoding: utf-8
|
|
|
|
import Task,Utils
|
|
from TaskGen import taskgen,before,after,feature
|
|
def add_marshal_file(self,filename,prefix):
|
|
if not hasattr(self,'marshal_list'):
|
|
self.marshal_list=[]
|
|
self.meths.append('process_marshal')
|
|
self.marshal_list.append((filename,prefix))
|
|
def process_marshal(self):
|
|
for f,prefix in getattr(self,'marshal_list',[]):
|
|
node=self.path.find_resource(f)
|
|
if not node:
|
|
raise Utils.WafError('file not found %r'%f)
|
|
h_node=node.change_ext('.h')
|
|
c_node=node.change_ext('.c')
|
|
task=self.create_task('glib_genmarshal',node,[h_node,c_node])
|
|
task.env.GLIB_GENMARSHAL_PREFIX=prefix
|
|
self.allnodes.append(c_node)
|
|
def genmarshal_func(self):
|
|
bld=self.inputs[0].__class__.bld
|
|
get=self.env.get_flat
|
|
cmd1="%s %s --prefix=%s --header > %s"%(get('GLIB_GENMARSHAL'),self.inputs[0].srcpath(self.env),get('GLIB_GENMARSHAL_PREFIX'),self.outputs[0].abspath(self.env))
|
|
ret=bld.exec_command(cmd1)
|
|
if ret:return ret
|
|
f=open(self.outputs[1].abspath(self.env),'wb')
|
|
c='''#include "%s"\n'''%self.outputs[0].name
|
|
f.write(c)
|
|
f.close()
|
|
cmd2="%s %s --prefix=%s --body >> %s"%(get('GLIB_GENMARSHAL'),self.inputs[0].srcpath(self.env),get('GLIB_GENMARSHAL_PREFIX'),self.outputs[1].abspath(self.env))
|
|
ret=Utils.exec_command(cmd2)
|
|
if ret:return ret
|
|
def add_enums_from_template(self,source='',target='',template='',comments=''):
|
|
if not hasattr(self,'enums_list'):
|
|
self.enums_list=[]
|
|
self.meths.append('process_enums')
|
|
self.enums_list.append({'source':source,'target':target,'template':template,'file-head':'','file-prod':'','file-tail':'','enum-prod':'','value-head':'','value-prod':'','value-tail':'','comments':comments})
|
|
def add_enums(self,source='',target='',file_head='',file_prod='',file_tail='',enum_prod='',value_head='',value_prod='',value_tail='',comments=''):
|
|
if not hasattr(self,'enums_list'):
|
|
self.enums_list=[]
|
|
self.meths.append('process_enums')
|
|
self.enums_list.append({'source':source,'template':'','target':target,'file-head':file_head,'file-prod':file_prod,'file-tail':file_tail,'enum-prod':enum_prod,'value-head':value_head,'value-prod':value_prod,'value-tail':value_tail,'comments':comments})
|
|
def process_enums(self):
|
|
for enum in getattr(self,'enums_list',[]):
|
|
task=self.create_task('glib_mkenums')
|
|
env=task.env
|
|
inputs=[]
|
|
source_list=self.to_list(enum['source'])
|
|
if not source_list:
|
|
raise Utils.WafError('missing source '+str(enum))
|
|
source_list=[self.path.find_resource(k)for k in source_list]
|
|
inputs+=source_list
|
|
env['GLIB_MKENUMS_SOURCE']=[k.srcpath(env)for k in source_list]
|
|
if not enum['target']:
|
|
raise Utils.WafError('missing target '+str(enum))
|
|
tgt_node=self.path.find_or_declare(enum['target'])
|
|
if tgt_node.name.endswith('.c'):
|
|
self.allnodes.append(tgt_node)
|
|
env['GLIB_MKENUMS_TARGET']=tgt_node.abspath(env)
|
|
options=[]
|
|
if enum['template']:
|
|
template_node=self.path.find_resource(enum['template'])
|
|
options.append('--template %s'%(template_node.abspath(env)))
|
|
inputs.append(template_node)
|
|
params={'file-head':'--fhead','file-prod':'--fprod','file-tail':'--ftail','enum-prod':'--eprod','value-head':'--vhead','value-prod':'--vprod','value-tail':'--vtail','comments':'--comments'}
|
|
for param,option in params.iteritems():
|
|
if enum[param]:
|
|
options.append('%s %r'%(option,enum[param]))
|
|
env['GLIB_MKENUMS_OPTIONS']=' '.join(options)
|
|
task.set_inputs(inputs)
|
|
task.set_outputs(tgt_node)
|
|
Task.task_type_from_func('glib_genmarshal',func=genmarshal_func,vars=['GLIB_GENMARSHAL_PREFIX','GLIB_GENMARSHAL'],color='BLUE',before='cc cxx')
|
|
Task.simple_task_type('glib_mkenums','${GLIB_MKENUMS} ${GLIB_MKENUMS_OPTIONS} ${GLIB_MKENUMS_SOURCE} > ${GLIB_MKENUMS_TARGET}',color='PINK',before='cc cxx')
|
|
def detect(conf):
|
|
glib_genmarshal=conf.find_program('glib-genmarshal',var='GLIB_GENMARSHAL')
|
|
mk_enums_tool=conf.find_program('glib-mkenums',var='GLIB_MKENUMS')
|
|
|
|
taskgen(add_marshal_file)
|
|
before('apply_core')(process_marshal)
|
|
taskgen(add_enums_from_template)
|
|
taskgen(add_enums)
|
|
before('apply_core')(process_enums)
|