summaryrefslogtreecommitdiff
path: root/py/waf/builder.py
blob: e1e944bf5c5eb71319a1e5797ef4483a1d277cf2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
class rtems_base(object):
	name = None

	def __init__(self, ctx):
		self.ctx = ctx

		if ctx.env.ENABLE_PTHREADS and not ctx.env.ENABLE_POSIX:
			raise ValueError("ENABLE_POSIX required for ENABLE_PTHREADS")

		self.ctx(
			name = "auto_%s_objects" % self.name,
			use  = []
		)


	def _get_id(self, name):
		name_id = "auto_%s" % name

		try:
			counter = self.ctx.counter
		except AttributeError:
			counter = self.ctx.counter = {}

		if name_id not in counter:
			counter[name_id] = 0
			return "%s_0" % name_id
		else:
			counter[name_id] += 1
			return "%s_%d" % (name_id, counter[name_id])


	def _obj_add(self, name, source, **kwarg):

		if "test" in kwarg:
			if not kwarg["test"]:
				return

		if "alias" in kwarg:
			name = "%s_%s" % (name, kwarg["alias"])

		id = self._get_id(name)

		self.ctx.rtems_obj(
			id,
			source,
			**kwarg
		)

		#XXX: Is this OK?
		for g in self.ctx.groups[0]:
			if g.get_name() == "auto_%s_objects" % self.name:
				g.use.append(id)

	def start(self, source, defines=[]):
		from os.path import splitext, basename

		for s in source:
			file = splitext(basename(s))[0]
			self.ctx(
				rule     = '${CC} -DASM ${CFLAGS} ${CPPFLAGS} ${DEFINES_ST:DEFINES} ${CPPPATH_ST:INCPATHS} -c -o ${TGT} ${SRC}',
				source   = s,
				target   = "%s.o" % file,
				name     = "start_%s_o" % file,
				features = "c casm bld_include src_include",
				defines  = defines,
			)

	def source(self, source, **kwarg):
		self._obj_add(self.name, source, **kwarg)

	def debug(self, source, **kwarg):
		if self.ctx.env.ENABLE_DEBUG:
			self._obj_add("%s_debug" % self.name, source, **kwarg)

	def mp(self, source, **kwarg):
		if self.ctx.env.ENABLE_MP:
			self._obj_add("%s_mp" % self.name, source, **kwarg)

	def multilib(self, source, **kwarg):
		if self.ctx.env.ENABLE_MULTILIB:
			self._obj_add("%s_multilib" % self.name, source, **kwarg)

	def networking(self, source, **kwarg):
		if self.ctx.env.ENABLE_NETWORKING:
			self._obj_add("%s_networking" % self.name, source, **kwarg)

	def newlib(self, source, **kwarg):
		if self.ctx.env.ENABLE_NEWLIB:
			self._obj_add("%s_newlib" % self.name, source, **kwarg)

	def posix(self, source, **kwarg):
		if self.ctx.env.ENABLE_POSIX:
			self._obj_add("%s_posix" % self.name, source, **kwarg)

	def pthreads(self, source, **kwarg):
		# pthreads requires POSIX
		if self.ctx.env.ENABLE_PTHREADS and self.ctx.env.ENABLE_POSIX:
			self._obj_add("%s_pthreads" % self.name, source, **kwarg)

	def rpc(self, source, **kwarg):
		if self.ctx.env.ENABLE_RPC:
			self._obj_add("%s_rpc" % self.name, source, **kwarg)

	def serdbg(self, source, **kwarg):
		if self.ctx.env.ENABLE_SERDBG:
			self._obj_add("%s_serdbg" % self.name, source, **kwarg)

	def shell(self, source, **kwarg):
		if self.ctx.env.ENABLE_SHELL:
			self._obj_add("%s_shell" % self.name, source, **kwarg)

	def smp(self, source, **kwarg):
		if self.ctx.env.ENABLE_SMP:
			self._obj_add("%s_smp" % self.name, source, **kwarg)


class libcpu(rtems_base):
	name = "libcpu"

class libbsp(rtems_base):
	name = "libbsp"

	def fpsp(self, source, **kwarg):
		if self.ctx.env.ENABLE_FPSP:
			self._obj_add("%s_fpsp" % self.name, source, **kwarg)