waf 4.09 KB
Newer Older
nedko's avatar
nedko committed
1
#!/usr/bin/env python
Adrian Knoth's avatar
Adrian Knoth committed
2
# encoding: ISO8859-1
3
# Thomas Nagy, 2005-2015
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

"""
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:

1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.

3. The name of the author may not be used to endorse or promote products
   derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
"""

33
import os, sys, inspect
34

35
36
37
38
39
40
41
VERSION="1.8.9"
REVISION="x"
GIT="x"
INSTALL="x"
C1='x'
C2='x'
C3='x'
42
43
44
cwd = os.getcwd()
join = os.path.join

45
46
if sys.hexversion<0x206000f:
	raise ImportError('Python >= 2.6 is required to create the waf file')
Adrian Knoth's avatar
Adrian Knoth committed
47
48
49
50
51
52
53
54
55

WAF='waf'
def b(x):
	return x
if sys.hexversion>0x300000f:
	WAF='waf3'
	def b(x):
		return x.encode()

56
def err(m):
Adrian Knoth's avatar
Adrian Knoth committed
57
	print(('\033[91mError: %s\033[0m' % m))
58
59
	sys.exit(1)

60
61
def unpack_wafdir(dir, src):
	f = open(src,'rb')
Adrian Knoth's avatar
Adrian Knoth committed
62
	c = 'corrupt archive (%d)'
63
64
	while 1:
		line = f.readline()
Adrian Knoth's avatar
Adrian Knoth committed
65
66
		if not line: err('run waf-light from a folder containing waflib')
		if line == b('#==>\n'):
67
68
			txt = f.readline()
			if not txt: err(c % 1)
Adrian Knoth's avatar
Adrian Knoth committed
69
			if f.readline() != b('#<==\n'): err(c % 2)
70
71
			break
	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
75
76

	import shutil, tarfile
	try: shutil.rmtree(dir)
	except OSError: pass
Adrian Knoth's avatar
Adrian Knoth committed
77
	try:
78
		for x in ('Tools', 'extras'):
Adrian Knoth's avatar
Adrian Knoth committed
79
80
			os.makedirs(join(dir, 'waflib', x))
	except OSError:
81
		err("Cannot unpack waf lib into %s\nMove waf in a writable directory" % dir)
82
83

	os.chdir(dir)
Adrian Knoth's avatar
Adrian Knoth committed
84
	tmp = 't.bz2'
85
	t = open(tmp,'wb')
86
87
	try: t.write(txt)
	finally: t.close()
88

Adrian Knoth's avatar
Adrian Knoth committed
89
90
91
92
93
94
95
96
97
98
99
100
101
	try:
		t = tarfile.open(tmp)
	except:
		try:
			os.system('bunzip2 t.bz2')
			t = tarfile.open('t')
			tmp = 't'
		except:
			os.chdir(cwd)
			try: shutil.rmtree(dir)
			except OSError: pass
			err("Waf cannot be unpacked, check that bzip2 support is present")

102
103
104
105
	try:
		for x in t: t.extract(x)
	finally:
		t.close()
106

107
	for x in ('Tools', 'extras'):
Adrian Knoth's avatar
Adrian Knoth committed
108
109
110
111
112
113
		os.chmod(join('waflib',x), 493)

	if sys.hexversion<0x300000f:
		sys.path = [join(dir, 'waflib')] + sys.path
		import fixpy2
		fixpy2.fixdir(dir)
114

115
	os.remove(tmp)
116
117
	os.chdir(cwd)

Adrian Knoth's avatar
Adrian Knoth committed
118
119
120
121
122
123
124
125
	try: dir = unicode(dir, 'mbcs')
	except: pass
	try:
		from ctypes import windll
		windll.kernel32.SetFileAttributesW(dir, 2)
	except:
		pass

126
def test(dir):
Adrian Knoth's avatar
Adrian Knoth committed
127
128
129
130
131
	try:
		os.stat(join(dir, 'waflib'))
		return os.path.abspath(dir)
	except OSError:
		pass
132
133

def find_lib():
134
135
	src = os.path.abspath(inspect.getfile(inspect.getmodule(err)))
	base, name = os.path.split(src)
136
137
138
139
140
141
142
143
144

	#devs use $WAFDIR
	w=test(os.environ.get('WAFDIR', ''))
	if w: return w

	#waf-light
	if name.endswith('waf-light'):
		w = test(base)
		if w: return w
Adrian Knoth's avatar
Adrian Knoth committed
145
		err('waf-light requires waflib -> export WAFDIR=/folder')
146

Adrian Knoth's avatar
Adrian Knoth committed
147
	dirname = '%s-%s-%s' % (WAF, VERSION, REVISION)
148
	for i in (INSTALL,'/usr','/usr/local','/opt'):
Adrian Knoth's avatar
Adrian Knoth committed
149
		w = test(i + '/lib/' + dirname)
150
151
152
		if w: return w

	#waf-local
Adrian Knoth's avatar
Adrian Knoth committed
153
	dir = join(base, (sys.platform != 'win32' and '.' or '') + dirname)
154
155
156
157
	w = test(dir)
	if w: return w

	#unpack
158
	unpack_wafdir(dir, src)
159
160
161
	return dir

wafdir = find_lib()
Adrian Knoth's avatar
Adrian Knoth committed
162
sys.path.insert(0, wafdir)
163

Adrian Knoth's avatar
Adrian Knoth committed
164
if __name__ == '__main__':
165
	#import waflib.extras.compat15#PRELUDE
Adrian Knoth's avatar
Adrian Knoth committed
166
167
	from waflib import Scripting
	Scripting.waf_entry_point(cwd, VERSION, wafdir)
168