ref: 5a2a6c66beda0cf64fb687834118e78ed268c1b6
dir: /waflib/Utils.py/
#! /usr/bin/env python # encoding: utf-8 # WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file import os,sys,errno,traceback,inspect,re,shutil,datetime,gc import subprocess try: from collections import deque except ImportError: class deque(list): def popleft(self): return self.pop(0) try: import _winreg as winreg except ImportError: try: import winreg except ImportError: winreg=None from waflib import Errors try: from collections import UserDict except ImportError: from UserDict import UserDict try: from hashlib import md5 except ImportError: try: from md5 import md5 except ImportError: pass try: import threading except ImportError: class threading(object): pass class Lock(object): def acquire(self): pass def release(self): pass threading.Lock=threading.Thread=Lock else: run_old=threading.Thread.run def run(*args,**kwargs): try: run_old(*args,**kwargs) except(KeyboardInterrupt,SystemExit): raise except Exception: sys.excepthook(*sys.exc_info()) threading.Thread.run=run SIG_NIL='iluvcuteoverload' O644=420 O755=493 rot_chr=['\\','|','/','-'] rot_idx=0 try: from collections import defaultdict except ImportError: class defaultdict(dict): def __init__(self,default_factory): super(defaultdict,self).__init__() self.default_factory=default_factory def __getitem__(self,key): try: return super(defaultdict,self).__getitem__(key) except KeyError: value=self.default_factory() self[key]=value return value is_win32=sys.platform in('win32','cli') indicator='\x1b[K%s%s%s\r' if is_win32 and'NOCOLOR'in os.environ: indicator='%s%s%s\r' def readf(fname,m='r',encoding='ISO8859-1'): if sys.hexversion>0x3000000 and not'b'in m: m+='b' f=open(fname,m) try: txt=f.read() finally: f.close() txt=txt.decode(encoding) else: f=open(fname,m) try: txt=f.read() finally: f.close() return txt def writef(fname,data,m='w',encoding='ISO8859-1'): if sys.hexversion>0x3000000 and not'b'in m: data=data.encode(encoding) m+='b' f=open(fname,m) try: f.write(data) finally: f.close() def h_file(fname): f=open(fname,'rb') m=md5() try: while fname: fname=f.read(200000) m.update(fname) finally: f.close() return m.digest() if hasattr(os,'O_NOINHERIT')and sys.hexversion<0x3040000: def readf_win32(f,m='r',encoding='ISO8859-1'): flags=os.O_NOINHERIT|os.O_RDONLY if'b'in m: flags|=os.O_BINARY if'+'in m: flags|=os.O_RDWR try: fd=os.open(f,flags) except OSError: raise IOError('Cannot read from %r'%f) if sys.hexversion>0x3000000 and not'b'in m: m+='b' f=os.fdopen(fd,m) try: txt=f.read() finally: f.close() txt=txt.decode(encoding) else: f=os.fdopen(fd,m) try: txt=f.read() finally: f.close() return txt def writef_win32(f,data,m='w',encoding='ISO8859-1'): if sys.hexversion>0x3000000 and not'b'in m: data=data.encode(encoding) m+='b' flags=os.O_CREAT|os.O_TRUNC|os.O_WRONLY|os.O_NOINHERIT if'b'in m: flags|=os.O_BINARY if'+'in m: flags|=os.O_RDWR try: fd=os.open(f,flags) except OSError: raise IOError('Cannot write to %r'%f) f=os.fdopen(fd,m) try: f.write(data) finally: f.close() def h_file_win32(fname): try: fd=os.open(fname,os.O_BINARY|os.O_RDONLY|os.O_NOINHERIT) except OSError: raise IOError('Cannot read from %r'%fname) f=os.fdopen(fd,'rb') m=md5() try: while fname: fname=f.read(200000) m.update(fname) finally: f.close() return m.digest() readf_old=readf writef_old=writef h_file_old=h_file readf=readf_win32 writef=writef_win32 h_file=h_file_win32 try: x=''.encode('hex') except LookupError: import binascii def to_hex(s): ret=binascii.hexlify(s) if not isinstance(ret,str): ret=ret.decode('utf-8') return ret else: def to_hex(s): return s.encode('hex') to_hex.__doc__=""" Return the hexadecimal representation of a string :param s: string to convert :type s: string """ listdir=os.listdir if is_win32: def listdir_win32(s): if not s: try: import ctypes except ImportError: return[x+':\\'for x in list('ABCDEFGHIJKLMNOPQRSTUVWXYZ')] else: dlen=4 maxdrives=26 buf=ctypes.create_string_buffer(maxdrives*dlen) ndrives=ctypes.windll.kernel32.GetLogicalDriveStringsA(maxdrives*dlen,ctypes.byref(buf)) return[str(buf.raw[4*i:4*i+2].decode('ascii'))for i in range(int(ndrives/dlen))] if len(s)==2 and s[1]==":": s+=os.sep if not os.path.isdir(s): e=OSError('%s is not a directory'%s) e.errno=errno.ENOENT raise e return os.listdir(s) listdir=listdir_win32 def num2ver(ver): if isinstance(ver,str): ver=tuple(ver.split('.')) if isinstance(ver,tuple): ret=0 for i in range(4): if i<len(ver): ret+=256**(3-i)*int(ver[i]) return ret return ver def ex_stack(): exc_type,exc_value,tb=sys.exc_info() exc_lines=traceback.format_exception(exc_type,exc_value,tb) return''.join(exc_lines) def to_list(sth): if isinstance(sth,str): return sth.split() else: return sth re_nl=re.compile('\r*\n',re.M) def str_to_dict(txt): tbl={} lines=re_nl.split(txt) for x in lines: x=x.strip() if not x or x.startswith('#')or x.find('=')<0: continue tmp=x.split('=') tbl[tmp[0].strip()]='='.join(tmp[1:]).strip() return tbl def split_path(path): return path.split('/') def split_path_cygwin(path): if path.startswith('//'): ret=path.split('/')[2:] ret[0]='/'+ret[0] return ret return path.split('/') re_sp=re.compile('[/\\\\]') def split_path_win32(path): if path.startswith('\\\\'): ret=re.split(re_sp,path)[2:] ret[0]='\\'+ret[0] return ret return re.split(re_sp,path) if sys.platform=='cygwin': split_path=split_path_cygwin elif is_win32: split_path=split_path_win32 split_path.__doc__=""" Split a path by / or \\. This function is not like os.path.split :type path: string :param path: path to split :return: list of strings """ def check_dir(path): if not os.path.isdir(path): try: os.makedirs(path) except OSError ,e: if not os.path.isdir(path): raise Errors.WafError('Cannot create the folder %r'%path,ex=e) def def_attrs(cls,**kw): for k,v in kw.items(): if not hasattr(cls,k): setattr(cls,k,v) def quote_define_name(s): fu=re.compile("[^a-zA-Z0-9]").sub("_",s) fu=fu.upper() return fu def h_list(lst): m=md5() m.update(str(lst)) return m.digest() def h_fun(fun): try: return fun.code except AttributeError: try: h=inspect.getsource(fun) except IOError: h="nocode" try: fun.code=h except AttributeError: pass return h reg_subst=re.compile(r"(\\\\)|(\$\$)|\$\{([^}]+)\}") def subst_vars(expr,params): def repl_var(m): if m.group(1): return'\\' if m.group(2): return'$' try: return params.get_flat(m.group(3)) except AttributeError: return params[m.group(3)] return reg_subst.sub(repl_var,expr) def destos_to_binfmt(key): if key=='darwin': return'mac-o' elif key in('win32','cygwin','uwin','msys'): return'pe' return'elf' def unversioned_sys_platform(): s=sys.platform if s=='java': from java.lang import System s=System.getProperty('os.name') if s=='Mac OS X': return'darwin' elif s.startswith('Windows '): return'win32' elif s=='OS/2': return'os2' elif s=='HP-UX': return'hpux' elif s in('SunOS','Solaris'): return'sunos' else:s=s.lower() if s=='powerpc': return'darwin' if s=='win32'or s.endswith('os2')and s!='sunos2':return s return re.split('\d+$',s)[0] def nada(*k,**kw): pass class Timer(object): def __init__(self): self.start_time=datetime.datetime.utcnow() def __str__(self): delta=datetime.datetime.utcnow()-self.start_time days=int(delta.days) hours=delta.seconds//3600 minutes=(delta.seconds-hours*3600)//60 seconds=delta.seconds-hours*3600-minutes*60+float(delta.microseconds)/1000/1000 result='' if days: result+='%dd'%days if days or hours: result+='%dh'%hours if days or hours or minutes: result+='%dm'%minutes return'%s%.3fs'%(result,seconds) if is_win32: old=shutil.copy2 def copy2(src,dst): old(src,dst) shutil.copystat(src,dst) setattr(shutil,'copy2',copy2) if os.name=='java': try: gc.disable() gc.enable() except NotImplementedError: gc.disable=gc.enable def read_la_file(path): sp=re.compile(r'^([^=]+)=\'(.*)\'$') dc={} for line in readf(path).splitlines(): try: _,left,right,_=sp.split(line.strip()) dc[left]=right except ValueError: pass return dc def nogc(fun): def f(*k,**kw): try: gc.disable() ret=fun(*k,**kw) finally: gc.enable() return ret f.__doc__=fun.__doc__ return f def run_once(fun): cache={} def wrap(k): try: return cache[k] except KeyError: ret=fun(k) cache[k]=ret return ret wrap.__cache__=cache return wrap def get_registry_app_path(key,filename): if not winreg: return None try: result=winreg.QueryValue(key,"Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\%s.exe"%filename[0]) except WindowsError: pass else: if os.path.isfile(result): return result