Include waf as an extracted source directory, rather than as a one-in-a-file script.
[ira/wip.git] / buildtools / wafadmin / Tools / glib2.py
diff --git a/buildtools/wafadmin/Tools/glib2.py b/buildtools/wafadmin/Tools/glib2.py
new file mode 100644 (file)
index 0000000..042d612
--- /dev/null
@@ -0,0 +1,164 @@
+#! /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')
+