]>
Commit | Line | Data |
---|---|---|
357547fa VM |
1 | #!/usr/bin/env python |
2 | # encoding: ISO8859-1 | |
3 | # Thomas Nagy, 2005-2010 | |
4 | ||
5 | """ | |
6 | Redistribution and use in source and binary forms, with or without | |
7 | modification, are permitted provided that the following conditions | |
8 | are met: | |
9 | ||
10 | 1. Redistributions of source code must retain the above copyright | |
11 | notice, this list of conditions and the following disclaimer. | |
12 | ||
13 | 2. 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 | ||
17 | 3. 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 | ||
20 | THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR | |
21 | IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |
22 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
23 | DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, | |
24 | INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |
25 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |
26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
27 | HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | |
28 | STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | |
29 | IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |
30 | POSSIBILITY OF SUCH DAMAGE. | |
31 | """ | |
32 | ||
33 | import os, sys | |
34 | ||
35 | VERSION="1.6.1" | |
b2898c45 | 36 | REVISION="5c448ec3ac6592bfade6b2f5063c1712" |
357547fa | 37 | INSTALL='' |
b2898c45 VM |
38 | C1='#.' |
39 | C2='#,' | |
357547fa VM |
40 | cwd = os.getcwd() |
41 | join = os.path.join | |
42 | ||
43 | ||
44 | WAF='waf' | |
45 | def b(x): | |
46 | return x | |
47 | if sys.hexversion>0x300000f: | |
48 | WAF='waf3' | |
49 | def b(x): | |
50 | return x.encode() | |
51 | ||
52 | def err(m): | |
53 | print(('\033[91mError: %s\033[0m' % m)) | |
54 | sys.exit(1) | |
55 | ||
56 | def unpack_wafdir(dir): | |
57 | f = open(sys.argv[0],'rb') | |
58 | c = 'corrupt archive (%d)' | |
59 | while 1: | |
60 | line = f.readline() | |
61 | if not line: err('run waf-light from a folder containing waflib') | |
62 | if line == b('#==>\n'): | |
63 | txt = f.readline() | |
64 | if not txt: err(c % 1) | |
65 | if f.readline() != b('#<==\n'): err(c % 2) | |
66 | break | |
67 | if not txt: err(c % 3) | |
68 | txt = txt[1:-1].replace(b(C1), b('\n')).replace(b(C2), b('\r')) | |
69 | ||
70 | import shutil, tarfile | |
71 | try: shutil.rmtree(dir) | |
72 | except OSError: pass | |
73 | try: | |
74 | for x in ['Tools', 'extras']: | |
75 | os.makedirs(join(dir, 'waflib', x)) | |
76 | except OSError: | |
77 | err("Cannot unpack waf lib into %s\nMove waf into a writeable directory" % dir) | |
78 | ||
79 | os.chdir(dir) | |
80 | tmp = 't.bz2' | |
81 | t = open(tmp,'wb') | |
82 | t.write(txt) | |
83 | t.close() | |
84 | ||
85 | try: | |
86 | t = tarfile.open(tmp) | |
87 | except: | |
88 | try: | |
89 | os.system('bunzip2 t.bz2') | |
90 | t = tarfile.open('t') | |
91 | tmp = 't' | |
92 | except: | |
93 | os.chdir(cwd) | |
94 | try: shutil.rmtree(dir) | |
95 | except OSError: pass | |
96 | err("Waf cannot be unpacked, check that bzip2 support is present") | |
97 | ||
98 | for x in t: t.extract(x) | |
99 | t.close() | |
100 | ||
101 | for x in ['Tools', 'extras']: | |
102 | os.chmod(join('waflib',x), 493) | |
103 | ||
104 | if sys.hexversion<0x300000f: | |
105 | sys.path = [join(dir, 'waflib')] + sys.path | |
106 | import fixpy2 | |
107 | fixpy2.fixdir(dir) | |
108 | ||
109 | os.unlink(tmp) | |
110 | os.chdir(cwd) | |
111 | ||
112 | try: dir = unicode(dir, 'mbcs') | |
113 | except: pass | |
114 | try: | |
115 | from ctypes import windll | |
116 | windll.kernel32.SetFileAttributesW(dir, 2) | |
117 | except: | |
118 | pass | |
119 | ||
120 | def test(dir): | |
121 | try: | |
122 | os.stat(join(dir, 'waflib')) | |
123 | return os.path.abspath(dir) | |
124 | except OSError: | |
125 | pass | |
126 | ||
127 | def find_lib(): | |
128 | name = sys.argv[0] | |
129 | base = os.path.dirname(os.path.abspath(name)) | |
130 | ||
131 | #devs use $WAFDIR | |
132 | w=test(os.environ.get('WAFDIR', '')) | |
133 | if w: return w | |
134 | ||
135 | #waf-light | |
136 | if name.endswith('waf-light'): | |
137 | w = test(base) | |
138 | if w: return w | |
139 | err('waf-light requires waflib -> export WAFDIR=/folder') | |
140 | ||
141 | dirname = '%s-%s-%s' % (WAF, VERSION, REVISION) | |
142 | for i in [INSTALL,'/usr','/usr/local','/opt']: | |
143 | w = test(i + '/lib/' + dirname) | |
144 | if w: return w | |
145 | ||
146 | #waf-local | |
147 | dir = join(base, (sys.platform != 'win32' and '.' or '') + dirname) | |
148 | w = test(dir) | |
149 | if w: return w | |
150 | ||
151 | #unpack | |
152 | unpack_wafdir(dir) | |
153 | return dir | |
154 | ||
155 | wafdir = find_lib() | |
156 | sys.path.insert(0, wafdir) | |
157 | ||
158 | if __name__ == '__main__': | |
159 | import waflib.extras.compat15 | |
160 | from waflib import Scripting | |
161 | Scripting.waf_entry_point(cwd, VERSION, wafdir) | |
162 | ||
163 | #==> | |
b2898c45 | 164 |