2007-11-10 07:15:15 -08:00
|
|
|
#! /usr/bin/env python
|
|
|
|
# encoding: utf-8
|
2007-12-03 00:05:53 -08:00
|
|
|
# Thomas Nagy, 2005-2008
|
2007-11-10 07:15:15 -08:00
|
|
|
|
|
|
|
"""
|
|
|
|
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.
|
|
|
|
|
2007-12-03 00:05:53 -08:00
|
|
|
THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
|
2007-11-10 07:15:15 -08:00
|
|
|
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.
|
|
|
|
"""
|
|
|
|
|
|
|
|
import os, sys
|
|
|
|
if 'PSYCOWAF' in os.environ:
|
2007-12-03 00:05:53 -08:00
|
|
|
try: import psyco; psyco.full()
|
|
|
|
except: pass
|
2007-11-10 07:15:15 -08:00
|
|
|
|
2007-12-03 00:05:53 -08:00
|
|
|
VERSION="1.3.0"
|
2007-11-10 07:15:15 -08:00
|
|
|
REVISION="x"
|
|
|
|
INSTALL="x"
|
2007-12-03 00:05:53 -08:00
|
|
|
cwd=os.getcwd()
|
|
|
|
j=os.path.join
|
2007-11-10 07:15:15 -08:00
|
|
|
|
2007-12-03 00:05:53 -08:00
|
|
|
def decode(s):
|
2007-11-10 07:15:15 -08:00
|
|
|
out=[]
|
|
|
|
app=out.append
|
2007-12-03 00:05:53 -08:00
|
|
|
s='!!!!!'.join(s.split('z'))
|
|
|
|
d=divmod
|
|
|
|
p1,p2=d(len(s),5)
|
2007-11-10 07:15:15 -08:00
|
|
|
stop=5*p1
|
|
|
|
p3,p4=s[0:stop],s[stop:]
|
2007-12-03 00:05:53 -08:00
|
|
|
|
|
|
|
def u(v, o):
|
|
|
|
return ord(v[o])-33
|
2007-11-10 07:15:15 -08:00
|
|
|
for i in range(p1):
|
2007-12-03 00:05:53 -08:00
|
|
|
o=i*5
|
|
|
|
x=52200625L*u(p3,o)+614125*u(p3,o+1)+7225*u(p3,o+2)+85*u(p3,o+3)+u(p3,o+4)
|
|
|
|
x,p=d(x,256)
|
|
|
|
x,o=d(x,256)
|
|
|
|
m,n=d(x,256)
|
2007-11-10 07:15:15 -08:00
|
|
|
app(chr(m)+chr(n)+chr(o)+chr(p))
|
|
|
|
if p2:
|
|
|
|
while len(p4)<5: p4=p4+'!'
|
2007-12-03 00:05:53 -08:00
|
|
|
x=52200625L*u(p4,0)+614125*u(p4,1)+7225*u(p4,2)+85*u(p4,3)+u(p4,4)
|
|
|
|
x,p=d(x,256)
|
|
|
|
x,o=d(x,256)
|
|
|
|
m,n=d(x,256)
|
|
|
|
app(chr(m))
|
|
|
|
if p2>2:app(chr(n))
|
|
|
|
if p2>3:app(chr(o))
|
2007-11-10 07:15:15 -08:00
|
|
|
return ''.join(out)
|
|
|
|
|
2007-12-03 00:05:53 -08:00
|
|
|
def err(m):
|
|
|
|
print m; sys.exit(1)
|
2007-11-10 07:15:15 -08:00
|
|
|
|
2007-12-03 00:05:53 -08:00
|
|
|
def unpack_wafdir(dir):
|
|
|
|
f=open(sys.argv[0],'rb')
|
|
|
|
c="Error: corrupted (%d)"
|
2007-11-10 07:15:15 -08:00
|
|
|
while 1:
|
2007-12-03 00:05:53 -08:00
|
|
|
line=f.readline()
|
|
|
|
if not line: err("\033[91mError: waf-light must be run from a folder containing wafadmin\033[0m")
|
|
|
|
if line=='#==>\n':
|
|
|
|
txt=f.readline()
|
|
|
|
if not txt: err(c%1)
|
|
|
|
if f.readline()!='#<==\n': err(c%2)
|
2007-11-10 07:15:15 -08:00
|
|
|
break
|
2007-12-03 00:05:53 -08:00
|
|
|
if not txt: err(c%3)
|
|
|
|
txt=decode(txt[1:])
|
2007-11-10 07:15:15 -08:00
|
|
|
|
2007-12-03 00:05:53 -08:00
|
|
|
import shutil, tarfile
|
|
|
|
try: shutil.rmtree(dir)
|
2007-11-10 07:15:15 -08:00
|
|
|
except OSError: pass
|
2007-12-03 00:05:53 -08:00
|
|
|
try: os.makedirs(dir)
|
|
|
|
except OSError: err("Error: could not unpack waf-local into %s\
|
|
|
|
Install waf system-wide or move waf into a writeable directory"%dir)
|
|
|
|
|
|
|
|
os.chdir(dir)
|
|
|
|
tmp='t.tbz2'
|
|
|
|
f=open(tmp,'wb')
|
|
|
|
f.write(txt)
|
|
|
|
f.close()
|
|
|
|
|
|
|
|
t=tarfile.open(tmp)
|
|
|
|
for x in t: t.extract(x)
|
|
|
|
t.close()
|
|
|
|
|
|
|
|
os.chmod('wafadmin',0755)#TODO
|
|
|
|
os.chmod('wafadmin%sTools'%os.sep,0755)
|
|
|
|
os.unlink(tmp)
|
2007-11-10 07:15:15 -08:00
|
|
|
os.chdir(cwd)
|
|
|
|
|
2007-12-03 00:05:53 -08:00
|
|
|
def test(dir):
|
|
|
|
try: os.stat(j(dir,'wafadmin')); return os.path.abspath(dir)
|
|
|
|
except OSError: pass
|
2007-11-10 07:15:15 -08:00
|
|
|
|
2007-12-03 00:05:53 -08:00
|
|
|
def find_lib():
|
|
|
|
name=sys.argv[0]
|
|
|
|
base=os.path.dirname(os.path.abspath(name))
|
2007-11-10 07:15:15 -08:00
|
|
|
|
2007-12-03 00:05:53 -08:00
|
|
|
#devs use $WAFDIR
|
|
|
|
w=test(os.environ.get('WAFDIR',''))
|
|
|
|
if w:return w
|
2007-11-10 07:15:15 -08:00
|
|
|
|
2007-12-03 00:05:53 -08:00
|
|
|
#waf-light
|
|
|
|
if name=='waf-light':
|
|
|
|
w=test(base)
|
|
|
|
if w:return w
|
|
|
|
err("\033[91mwaf-light in use, wafadmin not found -> export WAFDIR=/folder\033[0m")
|
2007-11-10 07:15:15 -08:00
|
|
|
|
2007-12-03 00:05:53 -08:00
|
|
|
dir="/lib/waf-%s-%s/" % (VERSION, REVISION)
|
|
|
|
for i in [INSTALL,'/usr','/usr/local','/opt']:
|
|
|
|
w=test(i+dir)
|
|
|
|
if w:return w
|
2007-11-10 07:15:15 -08:00
|
|
|
|
2007-12-03 00:05:53 -08:00
|
|
|
#waf-local
|
|
|
|
if sys.platform=='win32': s='waf-%s-%s'
|
2007-11-10 07:15:15 -08:00
|
|
|
else: s='.waf-%s-%s'
|
2007-12-03 00:05:53 -08:00
|
|
|
dir=j(base,s%(VERSION,REVISION))
|
|
|
|
w=test(dir)
|
|
|
|
if w:return w
|
2007-11-10 07:15:15 -08:00
|
|
|
|
2007-12-03 00:05:53 -08:00
|
|
|
#unpack
|
|
|
|
unpack_wafdir(dir)
|
|
|
|
return dir
|
2007-11-10 07:15:15 -08:00
|
|
|
|
2007-12-03 00:05:53 -08:00
|
|
|
wafdir=find_lib()
|
|
|
|
if "-vv" in sys.argv: print "wafdir is %s"%wafdir
|
2007-11-10 07:15:15 -08:00
|
|
|
|
2007-12-03 00:05:53 -08:00
|
|
|
w=j(wafdir,'wafadmin')
|
|
|
|
t=j(w,'Tools')
|
|
|
|
sys.path=[w, t]+sys.path
|
2007-11-10 07:15:15 -08:00
|
|
|
|
2007-12-03 00:05:53 -08:00
|
|
|
import Params, Scripting
|
|
|
|
Params.g_tooldir=[t]
|
|
|
|
Params.g_cwd_launch=cwd
|
2007-11-10 07:15:15 -08:00
|
|
|
|
2007-12-03 00:05:53 -08:00
|
|
|
if Params.g_version!=VERSION:
|
|
|
|
err('Version mismatch: waf %s <> wafadmin %s (wafdir %s)'%(VERSION,Params.g_version,wafdir))
|
|
|
|
Scripting.prepare()
|
2007-11-10 07:15:15 -08:00
|
|
|
|