#! /usr/bin/env python # encoding: utf-8 # Thomas Nagy, 2006-2008 (ita) "GLib2 support" import Task, Utils from TaskGen import taskgen, before, after, feature # # glib-genmarshal # @taskgen 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)) @before('apply_core') 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 #print self.outputs[1].abspath(self.env) 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 # # glib-mkenums # @taskgen 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}) @taskgen 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}) @before('apply_core') def process_enums(self): for enum in getattr(self, 'enums_list', []): task = self.create_task('glib_mkenums') env = task.env inputs = [] # process the source 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] # find the target 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, if provided 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) # update the task instance 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')