1#!/usr/bin/env python3
2# encoding: latin-1
3# Thomas Nagy, 2005-2018
4#
5"""
6Redistribution and use in source and binary forms, with or without
7modification, are permitted provided that the following conditions
8are met:
9
101. Redistributions of source code must retain the above copyright
11   notice, this list of conditions and the following disclaimer.
12
132. Redistributions in binary form must reproduce the above copyright
14   notice, this list of conditions and the following disclaimer in the
15   documentation and/or other materials provided with the distribution.
16
173. The name of the author may not be used to endorse or promote products
18   derived from this software without specific prior written permission.
19
20THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
21IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
22WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
24INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
25(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
26SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
28STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
29IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30POSSIBILITY OF SUCH DAMAGE.
31"""
32
33import os, sys, inspect
34
35VERSION="2.0.18"
36REVISION="x"
37GIT="x"
38INSTALL="x"
39C1='x'
40C2='x'
41C3='x'
42cwd = os.getcwd()
43join = os.path.join
44
45if sys.hexversion<0x206000f:
46	raise ImportError('Python >= 2.6 is required to create the waf file')
47
48WAF='waf'
49def b(x):
50	return x
51if sys.hexversion>0x300000f:
52	WAF='waf3'
53	def b(x):
54		return x.encode()
55
56def err(m):
57	print(('\033[91mError: %s\033[0m' % m))
58	sys.exit(1)
59
60def unpack_wafdir(dir, src):
61	f = open(src,'rb')
62	c = 'corrupt archive (%d)'
63	while 1:
64		line = f.readline()
65		if not line: err('run waf-light from a folder containing waflib')
66		if line == b('#==>\n'):
67			txt = f.readline()
68			if not txt: err(c % 1)
69			if f.readline() != b('#<==\n'): err(c % 2)
70			break
71	if not txt: err(c % 3)
72	txt = txt[1:-1].replace(b(C1), b('\n')).replace(b(C2), b('\r')).replace(b(C3), b('\x00'))
73
74	import shutil, tarfile
75	try: shutil.rmtree(dir)
76	except OSError: pass
77	try:
78		for x in ('Tools', 'extras'):
79			os.makedirs(join(dir, 'waflib', x))
80	except OSError:
81		err("Cannot unpack waf lib into %s\nMove waf in a writable directory" % dir)
82
83	os.chdir(dir)
84	tmp = 't.bz2'
85	t = open(tmp,'wb')
86	try: t.write(txt)
87	finally: t.close()
88
89	try:
90		t = tarfile.open(tmp)
91	except:
92		try:
93			os.system('bunzip2 t.bz2')
94			t = tarfile.open('t')
95			tmp = 't'
96		except:
97			os.chdir(cwd)
98			try: shutil.rmtree(dir)
99			except OSError: pass
100			err("Waf cannot be unpacked, check that bzip2 support is present")
101
102	try:
103		for x in t: t.extract(x)
104	finally:
105		t.close()
106
107	for x in ('Tools', 'extras'):
108		os.chmod(join('waflib',x), 493)
109
110	if sys.hexversion<0x300000f:
111		sys.path = [join(dir, 'waflib')] + sys.path
112		import fixpy2
113		fixpy2.fixdir(dir)
114
115	os.remove(tmp)
116	os.chdir(cwd)
117
118	try: dir = unicode(dir, 'mbcs')
119	except: pass
120	try:
121		from ctypes import windll
122		windll.kernel32.SetFileAttributesW(dir, 2)
123	except:
124		pass
125
126def test(dir):
127	try:
128		os.stat(join(dir, 'waflib'))
129		return os.path.abspath(dir)
130	except OSError:
131		pass
132
133def find_lib():
134	path = '../../third_party/waf'
135	paths = [path, path+'/waflib']
136	return [os.path.abspath(os.path.join(os.path.dirname(__file__), x)) for x in paths]
137
138wafdir = find_lib()
139for p in wafdir:
140	sys.path.insert(0, p)
141
142if __name__ == '__main__':
143	#import extras.compat15#PRELUDE
144	import sys
145
146	from waflib.Tools import ccroot, c, ar, compiler_c, gcc
147	sys.modules['cc'] = c
148	sys.modules['ccroot'] = ccroot
149	sys.modules['ar'] = ar
150	sys.modules['compiler_cc'] = compiler_c
151	sys.modules['gcc'] = gcc
152
153	from waflib import Options
154	Options.lockfile = os.environ.get('WAFLOCK', '.lock-wscript')
155	if os.path.isfile(Options.lockfile) and os.stat(Options.lockfile).st_size == 0:
156		os.environ['NOCLIMB'] = "1"
157	# there is a single top-level, but libraries must build independently
158	os.environ['NO_LOCK_IN_TOP'] = "1"
159
160	from waflib import Task
161	class o(object):
162		display = None
163	Task.classes['cc_link'] = o
164
165	from waflib import Scripting
166	Scripting.waf_entry_point(cwd, VERSION, wafdir[0])
167
168