1#!/usr/bin/env python
2# encoding: utf-8
3# John O'Meara, 2006
4# Thomas Nagy 2009-2018 (ita)
5
6"""
7The **bison** program is a code generator which creates C or C++ files.
8The generated files are compiled into object files.
9"""
10
11from waflib import Task
12from waflib.TaskGen import extension
13
14class bison(Task.Task):
15	"""Compiles bison files"""
16	color   = 'BLUE'
17	run_str = '${BISON} ${BISONFLAGS} ${SRC[0].abspath()} -o ${TGT[0].name}'
18	ext_out = ['.h'] # just to make sure
19
20@extension('.y', '.yc', '.yy')
21def big_bison(self, node):
22	"""
23	Creates a bison task, which must be executed from the directory of the output file.
24	"""
25	has_h = '-d' in self.env.BISONFLAGS
26
27	outs = []
28	if node.name.endswith('.yc'):
29		outs.append(node.change_ext('.tab.cc'))
30		if has_h:
31			outs.append(node.change_ext('.tab.hh'))
32	else:
33		outs.append(node.change_ext('.tab.c'))
34		if has_h:
35			outs.append(node.change_ext('.tab.h'))
36
37	tsk = self.create_task('bison', node, outs)
38	tsk.cwd = node.parent.get_bld()
39
40	# and the c/cxx file must be compiled too
41	self.source.append(outs[0])
42
43def configure(conf):
44	"""
45	Detects the *bison* program
46	"""
47	conf.find_program('bison', var='BISON')
48	conf.env.BISONFLAGS = ['-d']
49
50