summaryrefslogtreecommitdiffstats
path: root/third_party/waf/waflib/extras/haxe.py
blob: cb3ba6a949c94fb3475851d191dae7fc0ea0c9af (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
126
127
128
129
130
131
import os, re
from waflib import Utils, Task, Errors
from waflib.TaskGen import extension, taskgen_method, feature
from waflib.Configure import conf

@conf
def libname_haxe(self, libname):
	return libname

@conf
def check_lib_haxe(self, libname, uselib_store=None):
	haxe_libs = [node.name for node in self.root.find_node('haxe_libraries').ant_glob()]
	changed = False
	self.start_msg('Checking for library %s' % libname)
	if libname + '.hxml' in haxe_libs:
		self.end_msg('yes')
	else:
		changed = True
		try:
			cmd = self.env.LIX + ['+lib', libname]
			res = self.cmd_and_log(cmd)
			if (res):
				raise Errors.WafError(res)
			else:
				self.end_msg('downloaded', color = 'YELLOW')
		except Errors.WafError as e:
			self.end_msg('no', color = 'RED')
			self.fatal('Getting %s has failed' % libname)

	postfix = uselib_store if uselib_store else libname.upper()
	self.env['LIB_' + postfix] += [self.libname_haxe(libname)]
	return changed

@conf
def check_libs_haxe(self, libnames, uselib_store=None):
	changed = False
	for libname in Utils.to_list(libnames):
		if self.check_lib_haxe(libname, uselib_store):
			changed = True
	return changed

@conf
def ensure_lix_pkg(self, *k, **kw):
	if kw.get('compiler') == 'hx':
		if isinstance(kw.get('libs'), list) and len(kw.get('libs')):
			changed = self.check_libs_haxe(kw.get('libs'), kw.get('uselib_store'))
			if changed:
				try:
					cmd = self.env.LIX + ['download']
					res = self.cmd_and_log(cmd)
					if (res):
						raise Errors.WafError(res)
				except Errors.WafError as e:
					self.fatal('lix download has failed')
		else:
			self.check_lib_haxe(kw.get('lib'), kw.get('uselib_store'))

@conf
def haxe(bld, *k, **kw):
	task_gen = bld(*k, **kw)

class haxe(Task.Task):
	vars = ['HAXE', 'HAXE_VERSION', 'HAXEFLAGS']
	ext_out = ['.hl', '.c', '.h']

	def run(self):
		cmd = self.env.HAXE + self.env.HAXEFLAGS
		return self.exec_command(cmd, stdout = open(os.devnull, 'w'))

@taskgen_method
def init_haxe_task(self, node):
	def addflags(flags):
		self.env.append_value('HAXEFLAGS', flags)

	if node.suffix() == '.hxml':
		addflags(self.path.abspath() + '/' + node.name)
	else:
		addflags(['-main', node.name])
	addflags(['-hl', self.path.get_bld().make_node(self.target).abspath()])
	addflags(['-cp', self.path.abspath()])
	addflags(['-D', 'resourcesPath=%s' % getattr(self, 'res', '')])
	if hasattr(self, 'use'):
		for dep in self.use:
			if self.env['LIB_' + dep]:
				for lib in self.env['LIB_' + dep]: addflags(['-lib', lib])

@extension('.hx', '.hxml')
def haxe_file(self, node):
	if len(self.source) > 1:
		self.bld.fatal('Use separate task generators for multiple files')

	try:
		haxetask = self.haxetask
	except AttributeError:
		haxetask = self.haxetask = self.create_task('haxe')
		self.init_haxe_task(node)

	haxetask.inputs.append(node)
	haxetask.outputs.append(self.path.get_bld().make_node(self.target))

@conf
def find_haxe(self, min_version):
	npx = self.env.NPX = self.find_program('npx')
	self.env.LIX = npx + ['lix']
	npx_haxe = self.env.HAXE = npx + ['haxe']
	try:
		output = self.cmd_and_log(npx_haxe + ['-version'])
	except Errors.WafError:
		haxe_version = None
	else:
		ver = re.search(r'\d+.\d+.\d+', output).group().split('.')
		haxe_version = tuple([int(x) for x in ver])

	self.msg('Checking for haxe version',
	         haxe_version, haxe_version and haxe_version >= min_version)
	if npx_haxe and haxe_version < min_version:
		self.fatal('haxe version %r is too old, need >= %r' % (haxe_version, min_version))

	self.env.HAXE_VERSION = haxe_version
	return npx_haxe

@conf
def check_haxe(self, min_version=(4,1,4)):
	if self.env.HAXE_MINVER:
		min_version = self.env.HAXE_MINVER
	find_haxe(self, min_version)

def configure(self):
	self.env.HAXEFLAGS = []
	self.check_haxe()
	self.add_os_flags('HAXEFLAGS', dup = False)