[SCM] mpv/master: Update 03_waf.patch to waf 1.8.1

ghedo at users.alioth.debian.org ghedo at users.alioth.debian.org
Wed Dec 3 09:55:35 UTC 2014


The following commit has been merged in the master branch:
commit da06d355269757ad23252f5a65b110503baa3751
Author: Alessandro Ghedini <alessandro at ghedini.me>
Date:   Fri Nov 28 13:26:10 2014 +0100

    Update 03_waf.patch to waf 1.8.1

diff --git a/debian/patches/03_waf.patch b/debian/patches/03_waf.patch
index 9e92e0e..b82deee 100644
--- a/debian/patches/03_waf.patch
+++ b/debian/patches/03_waf.patch
@@ -4,14 +4,14 @@ Description: Provide waf and related scripts
 Origin: vendor
 Forwarded: not-needed
 Author: Alessandro Ghedini <ghedo at debian.org>
-Last-Update: 2014-03-11
+Last-Update: 2014-11-28
 
 --- /dev/null
 +++ b/waf
-@@ -0,0 +1,164 @@
+@@ -0,0 +1,165 @@
 +#!/usr/bin/env python
 +# encoding: ISO8859-1
-+# Thomas Nagy, 2005-2012
++# Thomas Nagy, 2005-2014
 +
 +"""
 +Redistribution and use in source and binary forms, with or without
@@ -41,13 +41,14 @@ Last-Update: 2014-03-11
 +POSSIBILITY OF SUCH DAMAGE.
 +"""
 +
-+import os, sys
++import os, sys, inspect
 +
-+VERSION="1.7.15"
-+REVISION="9c6c439a6416a92b3e844736c4ef3c7b"
++VERSION="1.8.1"
++REVISION="952ba41ab329f92aa3f88c0eae7815b9"
 +INSTALL=''
-+C1='#+'
-+C2='#%'
++C1='#1'
++C2='#+'
++C3='#('
 +cwd = os.getcwd()
 +join = os.path.join
 +
@@ -64,8 +65,8 @@ Last-Update: 2014-03-11
 +	print(('\033[91mError: %s\033[0m' % m))
 +	sys.exit(1)
 +
-+def unpack_wafdir(dir):
-+	f = open(sys.argv[0],'rb')
++def unpack_wafdir(dir, src):
++	f = open(src,'rb')
 +	c = 'corrupt archive (%d)'
 +	while 1:
 +		line = f.readline()
@@ -76,13 +77,13 @@ Last-Update: 2014-03-11
 +			if f.readline() != b('#<==\n'): err(c % 2)
 +			break
 +	if not txt: err(c % 3)
-+	txt = txt[1:-1].replace(b(C1), b('\n')).replace(b(C2), b('\r'))
++	txt = txt[1:-1].replace(b(C1), b('\n')).replace(b(C2), b('\r')).replace(b(C3), b('\x00'))
 +
 +	import shutil, tarfile
 +	try: shutil.rmtree(dir)
 +	except OSError: pass
 +	try:
-+		for x in ['Tools', 'extras']:
++		for x in ('Tools', 'extras'):
 +			os.makedirs(join(dir, 'waflib', x))
 +	except OSError:
 +		err("Cannot unpack waf lib into %s\nMove waf in a writable directory" % dir)
@@ -111,7 +112,7 @@ Last-Update: 2014-03-11
 +	finally:
 +		t.close()
 +
-+	for x in ['Tools', 'extras']:
++	for x in ('Tools', 'extras'):
 +		os.chmod(join('waflib',x), 493)
 +
 +	if sys.hexversion<0x300000f:
@@ -138,8 +139,8 @@ Last-Update: 2014-03-11
 +		pass
 +
 +def find_lib():
-+	name = sys.argv[0]
-+	base = os.path.dirname(os.path.abspath(name))
++	src = os.path.abspath(inspect.getfile(inspect.getmodule(err)))
++	base, name = os.path.split(src)
 +
 +	#devs use $WAFDIR
 +	w=test(os.environ.get('WAFDIR', ''))
@@ -152,7 +153,7 @@ Last-Update: 2014-03-11
 +		err('waf-light requires waflib -> export WAFDIR=/folder')
 +
 +	dirname = '%s-%s-%s' % (WAF, VERSION, REVISION)
-+	for i in [INSTALL,'/usr','/usr/local','/opt']:
++	for i in (INSTALL,'/usr','/usr/local','/opt'):
 +		w = test(i + '/lib/' + dirname)
 +		if w: return w
 +
@@ -162,7 +163,7 @@ Last-Update: 2014-03-11
 +	if w: return w
 +
 +	#unpack
-+	unpack_wafdir(dir)
++	unpack_wafdir(dir, src)
 +	return dir
 +
 +wafdir = find_lib()
@@ -175,12 +176,12 @@ Last-Update: 2014-03-11
 +
 --- /dev/null
 +++ b/waflib/Build.py
-@@ -0,0 +1,758 @@
+@@ -0,0 +1,761 @@
 +#! /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,re,shutil
++import os,sys,errno,re,shutil,stat
 +try:
 +	import cPickle
 +except ImportError:
@@ -209,7 +210,7 @@ Last-Update: 2014-03-11
 +		self.out_dir=kw.get('out_dir',Context.out_dir)
 +		self.cache_dir=kw.get('cache_dir',None)
 +		if not self.cache_dir:
-+			self.cache_dir=self.out_dir+os.sep+CACHE_DIR
++			self.cache_dir=os.path.join(self.out_dir,CACHE_DIR)
 +		self.all_envs={}
 +		self.task_sigs={}
 +		self.node_deps={}
@@ -220,8 +221,6 @@ Last-Update: 2014-03-11
 +		self.jobs=Options.options.jobs
 +		self.targets=Options.options.targets
 +		self.keep=Options.options.keep
-+		self.cache_global=Options.cache_global
-+		self.nocache=Options.options.nocache
 +		self.progress_bar=Options.options.progress_bar
 +		self.deps_man=Utils.defaultdict(list)
 +		self.current_group=0
@@ -287,17 +286,13 @@ Last-Update: 2014-03-11
 +		self.recurse([self.run_dir])
 +		self.pre_build()
 +		self.timer=Utils.Timer()
-+		if self.progress_bar:
-+			sys.stderr.write(Logs.colors.cursor_off)
 +		try:
 +			self.compile()
 +		finally:
-+			if self.progress_bar==1:
++			if self.progress_bar==1 and sys.stderr.isatty():
 +				c=len(self.returned_tasks)or 1
-+				self.to_log(self.progress_line(c,c,Logs.colors.BLUE,Logs.colors.NORMAL))
-+				print('')
-+				sys.stdout.flush()
-+				sys.stderr.write(Logs.colors.cursor_on)
++				m=self.progress_line(c,c,Logs.colors.BLUE,Logs.colors.NORMAL)
++				Logs.info(m,extra={'stream':sys.stderr,'c1':Logs.colors.cursor_off,'c2':Logs.colors.cursor_on})
 +			Logs.info("Waf: Leaving directory `%s'"%self.variant_dir)
 +		self.post_build()
 +	def restore(self):
@@ -431,6 +426,8 @@ Last-Update: 2014-03-11
 +		except KeyError:
 +			raise Errors.WafError('Could not find a task generator for the name %r'%name)
 +	def progress_line(self,state,total,col1,col2):
++		if not sys.stderr.isatty():
++			return''
 +		n=len(str(total))
 +		Utils.rot_idx+=1
 +		ind=Utils.rot_chr[Utils.rot_idx%4]
@@ -443,7 +440,7 @@ Last-Update: 2014-03-11
 +		if cols<7:cols=7
 +		ratio=((cols*state)//total)-1
 +		bar=('='*ratio+'>').ljust(cols)
-+		msg=Utils.indicator%(left,bar,right)
++		msg=Logs.indicator%(left,bar,right)
 +		return msg
 +	def declare_chain(self,*k,**kw):
 +		return TaskGen.declare_chain(*k,**kw)
@@ -503,6 +500,7 @@ Last-Update: 2014-03-11
 +			for i in range(len(self.groups)):
 +				if id(g)==id(self.groups[i]):
 +					self.current_group=i
++					break
 +		else:
 +			self.current_group=idx
 +	def total(self):
@@ -651,16 +649,16 @@ Last-Update: 2014-03-11
 +				destfile=os.path.join(destpath,y.path_from(self.path))
 +			else:
 +				destfile=os.path.join(destpath,y.name)
-+			self.generator.bld.do_install(y.abspath(),destfile,self.chmod)
++			self.generator.bld.do_install(y.abspath(),destfile,chmod=self.chmod,tsk=self)
 +	def exec_install_as(self):
 +		destfile=self.get_install_path()
-+		self.generator.bld.do_install(self.inputs[0].abspath(),destfile,self.chmod)
++		self.generator.bld.do_install(self.inputs[0].abspath(),destfile,chmod=self.chmod,tsk=self)
 +	def exec_symlink_as(self):
 +		destfile=self.get_install_path()
 +		src=self.link
 +		if self.relative_trick:
 +			src=os.path.relpath(src,os.path.dirname(destfile))
-+		self.generator.bld.do_link(src,destfile)
++		self.generator.bld.do_link(src,destfile,tsk=self)
 +class InstallContext(BuildContext):
 +	'''installs the targets on the system'''
 +	cmd='install'
@@ -668,7 +666,12 @@ Last-Update: 2014-03-11
 +		super(InstallContext,self).__init__(**kw)
 +		self.uninstall=[]
 +		self.is_install=INSTALL
-+	def do_install(self,src,tgt,chmod=Utils.O644):
++	def copy_fun(self,src,tgt,**kw):
++		if Utils.is_win32 and len(tgt)>259 and not tgt.startswith('\\\\?\\'):
++			tgt='\\\\?\\'+tgt
++		shutil.copy2(src,tgt)
++		os.chmod(tgt,kw.get('chmod',Utils.O644))
++	def do_install(self,src,tgt,**kw):
 +		d,_=os.path.split(tgt)
 +		if not d:
 +			raise Errors.WafError('Invalid installation given %r->%r'%(src,tgt))
@@ -688,19 +691,22 @@ Last-Update: 2014-03-11
 +		if not self.progress_bar:
 +			Logs.info('+ install %s (from %s)'%(tgt,srclbl))
 +		try:
++			os.chmod(tgt,Utils.O644|stat.S_IMODE(os.stat(tgt).st_mode))
++		except(OSError,IOError):
++			pass
++		try:
 +			os.remove(tgt)
 +		except OSError:
 +			pass
 +		try:
-+			shutil.copy2(src,tgt)
-+			os.chmod(tgt,chmod)
++			self.copy_fun(src,tgt,**kw)
 +		except IOError:
 +			try:
 +				os.stat(src)
 +			except(OSError,IOError):
 +				Logs.error('File %r does not exist'%src)
 +			raise Errors.WafError('Could not install the file %r'%tgt)
-+	def do_link(self,src,tgt):
++	def do_link(self,src,tgt,**kw):
 +		d,_=os.path.split(tgt)
 +		Utils.check_dir(d)
 +		link=False
@@ -723,11 +729,12 @@ Last-Update: 2014-03-11
 +			if tsk.runnable_status()==Task.ASK_LATER:
 +				raise self.WafError('cannot post the task %r'%tsk)
 +			tsk.run()
-+	def install_files(self,dest,files,env=None,chmod=Utils.O644,relative_trick=False,cwd=None,add=True,postpone=True):
++	def install_files(self,dest,files,env=None,chmod=Utils.O644,relative_trick=False,cwd=None,add=True,postpone=True,task=None):
 +		tsk=inst(env=env or self.env)
 +		tsk.bld=self
 +		tsk.path=cwd or self.path
 +		tsk.chmod=chmod
++		tsk.task=task
 +		if isinstance(files,waflib.Node.Node):
 +			tsk.source=[files]
 +		else:
@@ -738,18 +745,19 @@ Last-Update: 2014-03-11
 +		if add:self.add_to_group(tsk)
 +		self.run_task_now(tsk,postpone)
 +		return tsk
-+	def install_as(self,dest,srcfile,env=None,chmod=Utils.O644,cwd=None,add=True,postpone=True):
++	def install_as(self,dest,srcfile,env=None,chmod=Utils.O644,cwd=None,add=True,postpone=True,task=None):
 +		tsk=inst(env=env or self.env)
 +		tsk.bld=self
 +		tsk.path=cwd or self.path
 +		tsk.chmod=chmod
 +		tsk.source=[srcfile]
++		tsk.task=task
 +		tsk.dest=dest
 +		tsk.exec_task=tsk.exec_install_as
 +		if add:self.add_to_group(tsk)
 +		self.run_task_now(tsk,postpone)
 +		return tsk
-+	def symlink_as(self,dest,src,env=None,cwd=None,add=True,postpone=True,relative_trick=False):
++	def symlink_as(self,dest,src,env=None,cwd=None,add=True,postpone=True,relative_trick=False,task=None):
 +		if Utils.is_win32:
 +			return
 +		tsk=inst(env=env or self.env)
@@ -757,6 +765,7 @@ Last-Update: 2014-03-11
 +		tsk.dest=dest
 +		tsk.path=cwd or self.path
 +		tsk.source=[]
++		tsk.task=task
 +		tsk.link=src
 +		tsk.relative_trick=relative_trick
 +		tsk.exec_task=tsk.exec_symlink_as
@@ -769,7 +778,14 @@ Last-Update: 2014-03-11
 +	def __init__(self,**kw):
 +		super(UninstallContext,self).__init__(**kw)
 +		self.is_install=UNINSTALL
-+	def do_install(self,src,tgt,chmod=Utils.O644):
++	def rm_empty_dirs(self,tgt):
++		while tgt:
++			tgt=os.path.dirname(tgt)
++			try:
++				os.rmdir(tgt)
++			except OSError:
++				break
++	def do_install(self,src,tgt,**kw):
 +		if not self.progress_bar:
 +			Logs.info('- remove %s'%tgt)
 +		self.uninstall.append(tgt)
@@ -782,25 +798,15 @@ Last-Update: 2014-03-11
 +					Logs.warn('build: some files could not be uninstalled (retry with -vv to list them)')
 +				if Logs.verbose>1:
 +					Logs.warn('Could not remove %s (error code %r)'%(e.filename,e.errno))
-+		while tgt:
-+			tgt=os.path.dirname(tgt)
-+			try:
-+				os.rmdir(tgt)
-+			except OSError:
-+				break
-+	def do_link(self,src,tgt):
++		self.rm_empty_dirs(tgt)
++	def do_link(self,src,tgt,**kw):
 +		try:
 +			if not self.progress_bar:
 +				Logs.info('- remove %s'%tgt)
 +			os.remove(tgt)
 +		except OSError:
 +			pass
-+		while tgt:
-+			tgt=os.path.dirname(tgt)
-+			try:
-+				os.rmdir(tgt)
-+			except OSError:
-+				break
++		self.rm_empty_dirs(tgt)
 +	def execute(self):
 +		try:
 +			def runnable_status(self):
@@ -932,8 +938,6 @@ Last-Update: 2014-03-11
 +			else:
 +				return pattern.match(node.abspath())
 +		return match
-+BuildContext.store=Utils.nogc(BuildContext.store)
-+BuildContext.restore=Utils.nogc(BuildContext.restore)
 --- /dev/null
 +++ b/waflib/ConfigSet.py
 @@ -0,0 +1,152 @@
@@ -1028,9 +1032,9 @@ Last-Update: 2014-03-11
 +		self.table[key]=value
 +		return value
 +	def append_value(self,var,val):
-+		current_value=self._get_list_value_for_modification(var)
 +		if isinstance(val,str):
 +			val=[val]
++		current_value=self._get_list_value_for_modification(var)
 +		current_value.extend(val)
 +	def prepend_value(self,var,val):
 +		if isinstance(val,str):
@@ -1091,19 +1095,13 @@ Last-Update: 2014-03-11
 +		self.table=self.undo_stack.pop(-1)
 --- /dev/null
 +++ b/waflib/Configure.py
-@@ -0,0 +1,317 @@
+@@ -0,0 +1,373 @@
 +#! /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,shlex,sys,time
++import os,shlex,sys,time,re,shutil
 +from waflib import ConfigSet,Utils,Options,Logs,Context,Build,Errors
-+try:
-+	from urllib import request
-+except ImportError:
-+	from urllib import urlopen
-+else:
-+	urlopen=request.urlopen
 +BREAK='break'
 +CONTINUE='continue'
 +WAF_CONFIG_LOG='config.log'
@@ -1112,37 +1110,6 @@ Last-Update: 2014-03-11
 +# waf %(wafver)s (abi %(abi)s, python %(pyver)x on %(systype)s)
 +# using %(args)s
 +#'''
-+def download_check(node):
-+	pass
-+def download_tool(tool,force=False,ctx=None):
-+	for x in Utils.to_list(Context.remote_repo):
-+		for sub in Utils.to_list(Context.remote_locs):
-+			url='/'.join((x,sub,tool+'.py'))
-+			try:
-+				web=urlopen(url)
-+				try:
-+					if web.getcode()!=200:
-+						continue
-+				except AttributeError:
-+					pass
-+			except Exception:
-+				continue
-+			else:
-+				tmp=ctx.root.make_node(os.sep.join((Context.waf_dir,'waflib','extras',tool+'.py')))
-+				tmp.write(web.read(),'wb')
-+				Logs.warn('Downloaded %s from %s'%(tool,url))
-+				download_check(tmp)
-+				try:
-+					module=Context.load_tool(tool)
-+				except Exception:
-+					Logs.warn('The tool %s from %s is unusable'%(tool,url))
-+					try:
-+						tmp.delete()
-+					except Exception:
-+						pass
-+					continue
-+				return module
-+	raise Errors.WafError('Could not load the Waf tool')
 +class ConfigurationContext(Context.Context):
 +	'''configures the project'''
 +	cmd='configure'
@@ -1190,6 +1157,7 @@ Last-Update: 2014-03-11
 +			out=getattr(Context.g_module,Context.OUT,None)
 +		if not out:
 +			out=Options.lockfile.replace('.lock-waf_%s_'%sys.platform,'').replace('.lock-waf','')
++		out=os.path.realpath(out)
 +		self.bldnode=(os.path.isabs(out)and self.root or self.path).make_node(out)
 +		self.bldnode.mkdir()
 +		if not os.path.isdir(self.bldnode.abspath()):
@@ -1233,11 +1201,11 @@ Last-Update: 2014-03-11
 +		env['files']=self.files
 +		env['environ']=dict(self.environ)
 +		if not self.env.NO_LOCK_IN_RUN:
-+			env.store(Context.run_dir+os.sep+Options.lockfile)
++			env.store(os.path.join(Context.run_dir,Options.lockfile))
 +		if not self.env.NO_LOCK_IN_TOP:
-+			env.store(Context.top_dir+os.sep+Options.lockfile)
++			env.store(os.path.join(Context.top_dir,Options.lockfile))
 +		if not self.env.NO_LOCK_IN_OUT:
-+			env.store(Context.out_dir+os.sep+Options.lockfile)
++			env.store(os.path.join(Context.out_dir,Options.lockfile))
 +	def prepare_env(self,env):
 +		if not env.PREFIX:
 +			if Options.options.prefix or Utils.is_win32:
@@ -1256,7 +1224,7 @@ Last-Update: 2014-03-11
 +		for key in self.all_envs:
 +			tmpenv=self.all_envs[key]
 +			tmpenv.store(os.path.join(self.cachedir.abspath(),key+Build.CACHE_SUFFIX))
-+	def load(self,input,tooldir=None,funs=None,download=True):
++	def load(self,input,tooldir=None,funs=None):
 +		tools=Utils.to_list(input)
 +		if tooldir:tooldir=Utils.to_list(tooldir)
 +		for tool in tools:
@@ -1267,14 +1235,9 @@ Last-Update: 2014-03-11
 +			self.tool_cache.append(mag)
 +			module=None
 +			try:
-+				module=Context.load_tool(tool,tooldir)
++				module=Context.load_tool(tool,tooldir,ctx=self)
 +			except ImportError ,e:
-+				if Options.options.download:
-+					module=download_tool(tool,ctx=self)
-+					if not module:
-+						self.fatal('Could not load the Waf tool %r or download a suitable replacement from the repository (sys.path %r)\n%s'%(tool,sys.path,e))
-+				else:
-+					self.fatal('Could not load the Waf tool %r from %r (try the --download option?):\n%s'%(tool,sys.path,e))
++				self.fatal('Could not load the Waf tool %r from %r\n%s'%(tool,sys.path,e))
 +			except Exception ,e:
 +				self.to_log('imp %r (%r & %r)'%(tool,tooldir,funs))
 +				self.to_log(Utils.ex_stack())
@@ -1337,14 +1300,14 @@ Last-Update: 2014-03-11
 +			return[cmd]
 +	return cmd
 + at conf
-+def check_waf_version(self,mini='1.6.99',maxi='1.8.0'):
-+	self.start_msg('Checking for waf version in %s-%s'%(str(mini),str(maxi)))
++def check_waf_version(self,mini='1.7.99',maxi='1.9.0',**kw):
++	self.start_msg('Checking for waf version in %s-%s'%(str(mini),str(maxi)),**kw)
 +	ver=Context.HEXVERSION
 +	if Utils.num2ver(mini)>ver:
 +		self.fatal('waf version should be at least %r (%r found)'%(Utils.num2ver(mini),ver))
 +	if Utils.num2ver(maxi)<ver:
 +		self.fatal('waf version should be at most %r (%r found)'%(Utils.num2ver(maxi),ver))
-+	self.end_msg('ok')
++	self.end_msg('ok',**kw)
 + at conf
 +def find_file(self,filename,path_list=[]):
 +	for n in Utils.to_list(filename):
@@ -1356,72 +1319,169 @@ Last-Update: 2014-03-11
 + at conf
 +def find_program(self,filename,**kw):
 +	exts=kw.get('exts',Utils.is_win32 and'.exe,.com,.bat,.cmd'or',.sh,.pl,.py')
-+	environ=kw.get('environ',os.environ)
++	environ=kw.get('environ',getattr(self,'environ',os.environ))
 +	ret=''
 +	filename=Utils.to_list(filename)
++	msg=kw.get('msg',', '.join(filename))
 +	var=kw.get('var','')
 +	if not var:
-+		var=filename[0].upper()
-+	if self.env[var]:
-+		ret=self.env[var]
-+	elif var in environ:
-+		ret=environ[var]
++		var=re.sub(r'[-.]','_',filename[0].upper())
 +	path_list=kw.get('path_list','')
-+	if not ret:
-+		if path_list:
-+			path_list=Utils.to_list(path_list)
++	if path_list:
++		path_list=Utils.to_list(path_list)
++	else:
++		path_list=environ.get('PATH','').split(os.pathsep)
++	if var in environ:
++		filename=environ[var]
++		if os.path.isfile(filename):
++			ret=[filename]
 +		else:
-+			path_list=environ.get('PATH','').split(os.pathsep)
-+		if not isinstance(filename,list):
-+			filename=[filename]
-+		for a in exts.split(','):
-+			if ret:
-+				break
-+			for b in filename:
-+				if ret:
-+					break
-+				for c in path_list:
-+					if ret:
-+						break
-+					x=os.path.expanduser(os.path.join(c,b+a))
-+					if os.path.isfile(x):
-+						ret=x
-+	if not ret and Utils.winreg:
-+		ret=Utils.get_registry_app_path(Utils.winreg.HKEY_CURRENT_USER,filename)
-+	if not ret and Utils.winreg:
-+		ret=Utils.get_registry_app_path(Utils.winreg.HKEY_LOCAL_MACHINE,filename)
-+	self.msg('Checking for program '+','.join(filename),ret or False)
-+	self.to_log('find program=%r paths=%r var=%r -> %r'%(filename,path_list,var,ret))
++			ret=self.cmd_to_list(filename)
++	elif self.env[var]:
++		ret=self.env[var]
++		ret=self.cmd_to_list(ret)
++	else:
++		if not ret:
++			ret=self.find_binary(filename,exts.split(','),path_list)
++		if not ret and Utils.winreg:
++			ret=Utils.get_registry_app_path(Utils.winreg.HKEY_CURRENT_USER,filename)
++		if not ret and Utils.winreg:
++			ret=Utils.get_registry_app_path(Utils.winreg.HKEY_LOCAL_MACHINE,filename)
++		ret=self.cmd_to_list(ret)
++	if ret:
++		if len(ret)==1:
++			retmsg=ret[0]
++		else:
++			retmsg=ret
++	else:
++		retmsg=False
++	self.msg("Checking for program '%s'"%msg,retmsg,**kw)
++	if not kw.get('quiet',None):
++		self.to_log('find program=%r paths=%r var=%r -> %r'%(filename,path_list,var,ret))
 +	if not ret:
-+		self.fatal(kw.get('errmsg','')or'Could not find the program %s'%','.join(filename))
-+	if var:
++		self.fatal(kw.get('errmsg','')or'Could not find the program %r'%filename)
++	interpreter=kw.get('interpreter',None)
++	if interpreter is None:
++		if not Utils.check_exe(ret[0],env=environ):
++			self.fatal('Program %r is not executable'%ret)
 +		self.env[var]=ret
++	else:
++		self.env[var]=self.env[interpreter]+ret
 +	return ret
 + at conf
-+def find_perl_program(self,filename,path_list=[],var=None,environ=None,exts=''):
++def find_binary(self,filenames,exts,paths):
++	for f in filenames:
++		for ext in exts:
++			exe_name=f+ext
++			if os.path.isabs(exe_name):
++				if os.path.isfile(exe_name):
++					return exe_name
++			else:
++				for path in paths:
++					x=os.path.expanduser(os.path.join(path,exe_name))
++					if os.path.isfile(x):
++						return x
++	return None
++ at conf
++def run_build(self,*k,**kw):
++	lst=[str(v)for(p,v)in kw.items()if p!='env']
++	h=Utils.h_list(lst)
++	dir=self.bldnode.abspath()+os.sep+(not Utils.is_win32 and'.'or'')+'conf_check_'+Utils.to_hex(h)
 +	try:
-+		app=self.find_program(filename,path_list=path_list,var=var,environ=environ,exts=exts)
-+	except Exception:
-+		self.find_program('perl',var='PERL')
-+		app=self.find_file(filename,os.environ['PATH'].split(os.pathsep))
-+		if not app:
++		os.makedirs(dir)
++	except OSError:
++		pass
++	try:
++		os.stat(dir)
++	except OSError:
++		self.fatal('cannot use the configuration test folder %r'%dir)
++	cachemode=getattr(Options.options,'confcache',None)
++	if cachemode==1:
++		try:
++			proj=ConfigSet.ConfigSet(os.path.join(dir,'cache_run_build'))
++		except OSError:
++			pass
++		except IOError:
++			pass
++		else:
++			ret=proj['cache_run_build']
++			if isinstance(ret,str)and ret.startswith('Test does not build'):
++				self.fatal(ret)
++			return ret
++	bdir=os.path.join(dir,'testbuild')
++	if not os.path.exists(bdir):
++		os.makedirs(bdir)
++	self.test_bld=bld=Build.BuildContext(top_dir=dir,out_dir=bdir)
++	bld.init_dirs()
++	bld.progress_bar=0
++	bld.targets='*'
++	bld.logger=self.logger
++	bld.all_envs.update(self.all_envs)
++	bld.env=kw['env']
++	bld.kw=kw
++	bld.conf=self
++	kw['build_fun'](bld)
++	ret=-1
++	try:
++		try:
++			bld.compile()
++		except Errors.WafError:
++			ret='Test does not build: %s'%Utils.ex_stack()
++			self.fatal(ret)
++		else:
++			ret=getattr(bld,'retval',0)
++	finally:
++		if cachemode==1:
++			proj=ConfigSet.ConfigSet()
++			proj['cache_run_build']=ret
++			proj.store(os.path.join(dir,'cache_run_build'))
++		else:
++			shutil.rmtree(dir)
++	return ret
++ at conf
++def ret_msg(self,msg,args):
++	if isinstance(msg,str):
++		return msg
++	return msg(args)
++ at conf
++def test(self,*k,**kw):
++	if not'env'in kw:
++		kw['env']=self.env.derive()
++	if kw.get('validate',None):
++		kw['validate'](kw)
++	self.start_msg(kw['msg'],**kw)
++	ret=None
++	try:
++		ret=self.run_build(*k,**kw)
++	except self.errors.ConfigurationError:
++		self.end_msg(kw['errmsg'],'YELLOW',**kw)
++		if Logs.verbose>1:
 +			raise
-+		if var:
-+			self.env[var]=Utils.to_list(self.env['PERL'])+[app]
-+	self.msg('Checking for %r'%filename,app)
++		else:
++			self.fatal('The configuration failed')
++	else:
++		kw['success']=ret
++	if kw.get('post_check',None):
++		ret=kw['post_check'](kw)
++	if ret:
++		self.end_msg(kw['errmsg'],'YELLOW',**kw)
++		self.fatal('The configuration failed %r'%ret)
++	else:
++		self.end_msg(self.ret_msg(kw['okmsg'],kw),**kw)
++	return ret
 --- /dev/null
 +++ b/waflib/Context.py
-@@ -0,0 +1,316 @@
+@@ -0,0 +1,360 @@
 +#! /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,imp,sys
++import os,re,imp,sys
 +from waflib import Utils,Errors,Logs
 +import waflib.Node
-+HEXVERSION=0x1070f00
-+WAFVERSION="1.7.15"
-+WAFREVISION="f63ac9793de2d4eaae884e55d4ff70a761dcbab2"
++HEXVERSION=0x1080100
++WAFVERSION="1.8.1"
++WAFREVISION="05ef26f3b875de31d3ae5c5c7a62e0eb5df88fea"
 +ABI=98
 +DBFILE='.wafpickle-%s-%d-%d'%(sys.platform,sys.hexversion,ABI)
 +APPNAME='APPNAME'
@@ -1485,6 +1545,14 @@ Last-Update: 2014-03-11
 +		self.logger=None
 +	def __hash__(self):
 +		return id(self)
++	def finalize(self):
++		try:
++			logger=self.logger
++		except AttributeError:
++			pass
++		else:
++			Logs.free_logger(logger)
++			delattr(self,'logger')
 +	def load(self,tool_list,*k,**kw):
 +		tools=Utils.to_list(tool_list)
 +		path=Utils.to_list(kw.get('tooldir',''))
@@ -1504,7 +1572,7 @@ Last-Update: 2014-03-11
 +		self.cur_script=self.stack_path.pop()
 +		if self.cur_script:
 +			self.path=self.cur_script.parent
-+	def recurse(self,dirs,name=None,mandatory=True,once=True):
++	def recurse(self,dirs,name=None,mandatory=True,once=True,encoding=None):
 +		try:
 +			cache=self.recurse_cache
 +		except AttributeError:
@@ -1519,7 +1587,7 @@ Last-Update: 2014-03-11
 +				cache[node]=True
 +				self.pre_recurse(node)
 +				try:
-+					function_code=node.read('rU')
++					function_code=node.read('rU',encoding)
 +					exec(compile(function_code,node.abspath(),'exec'),self.exec_dict)
 +				finally:
 +					self.post_recurse(node)
@@ -1530,7 +1598,7 @@ Last-Update: 2014-03-11
 +					cache[tup]=True
 +					self.pre_recurse(node)
 +					try:
-+						wscript_module=load_module(node.abspath())
++						wscript_module=load_module(node.abspath(),encoding=encoding)
 +						user_function=getattr(wscript_module,(name or self.fun),None)
 +						if not user_function:
 +							if not mandatory:
@@ -1554,6 +1622,8 @@ Last-Update: 2014-03-11
 +			kw['stdout']=subprocess.PIPE
 +		if'stderr'not in kw:
 +			kw['stderr']=subprocess.PIPE
++		if Logs.verbose and not kw['shell']and not Utils.check_exe(cmd[0]):
++			raise Errors.WafError("Program %s not found!"%cmd[0])
 +		try:
 +			if kw['stdout']or kw['stderr']:
 +				p=subprocess.Popen(cmd,**kw)
@@ -1570,14 +1640,14 @@ Last-Update: 2014-03-11
 +			if self.logger:
 +				self.logger.debug('out: %s'%out)
 +			else:
-+				sys.stdout.write(out)
++				Logs.info(out,extra={'stream':sys.stdout,'c1':''})
 +		if err:
 +			if not isinstance(err,str):
 +				err=err.decode(sys.stdout.encoding or'iso8859-1')
 +			if self.logger:
 +				self.logger.error('err: %s'%err)
 +			else:
-+				sys.stderr.write(err)
++				Logs.info(err,extra={'stream':sys.stderr,'c1':''})
 +		return ret
 +	def cmd_and_log(self,cmd,**kw):
 +		subprocess=Utils.subprocess
@@ -1593,6 +1663,8 @@ Last-Update: 2014-03-11
 +			del kw['output']
 +		else:
 +			to_ret=STDOUT
++		if Logs.verbose and not kw['shell']and not Utils.check_exe(cmd[0]):
++			raise Errors.WafError("Program %s not found!"%cmd[0])
 +		kw['stdout']=kw['stderr']=subprocess.PIPE
 +		if quiet is None:
 +			self.to_log(cmd)
@@ -1636,12 +1708,24 @@ Last-Update: 2014-03-11
 +		else:
 +			sys.stderr.write(str(msg))
 +			sys.stderr.flush()
-+	def msg(self,msg,result,color=None):
-+		self.start_msg(msg)
++	def msg(self,*k,**kw):
++		try:
++			msg=kw['msg']
++		except KeyError:
++			msg=k[0]
++		self.start_msg(msg,**kw)
++		try:
++			result=kw['result']
++		except KeyError:
++			result=k[1]
++		color=kw.get('color',None)
 +		if not isinstance(color,str):
 +			color=result and'GREEN'or'YELLOW'
-+		self.end_msg(result,color)
-+	def start_msg(self,msg):
++		self.end_msg(result,color,**kw)
++	def start_msg(self,*k,**kw):
++		if kw.get('quiet',None):
++			return
++		msg=kw.get('msg',None)or k[0]
 +		try:
 +			if self.in_msg:
 +				self.in_msg+=1
@@ -1656,10 +1740,13 @@ Last-Update: 2014-03-11
 +		for x in(self.line_just*'-',msg):
 +			self.to_log(x)
 +		Logs.pprint('NORMAL',"%s :"%msg.ljust(self.line_just),sep='')
-+	def end_msg(self,result,color=None):
++	def end_msg(self,*k,**kw):
++		if kw.get('quiet',None):
++			return
 +		self.in_msg-=1
 +		if self.in_msg:
 +			return
++		result=kw.get('result',None)or k[0]
 +		defcolor='GREEN'
 +		if result==True:
 +			msg='ok'
@@ -1669,22 +1756,46 @@ Last-Update: 2014-03-11
 +		else:
 +			msg=str(result)
 +		self.to_log(msg)
-+		Logs.pprint(color or defcolor,msg)
++		try:
++			color=kw['color']
++		except KeyError:
++			if len(k)>1 and k[1]in Logs.colors_lst:
++				color=k[1]
++			else:
++				color=defcolor
++		Logs.pprint(color,msg)
 +	def load_special_tools(self,var,ban=[]):
 +		global waf_dir
-+		lst=self.root.find_node(waf_dir).find_node('waflib/extras').ant_glob(var)
-+		for x in lst:
-+			if not x.name in ban:
-+				load_tool(x.name.replace('.py',''))
++		if os.path.isdir(waf_dir):
++			lst=self.root.find_node(waf_dir).find_node('waflib/extras').ant_glob(var)
++			for x in lst:
++				if not x.name in ban:
++					load_tool(x.name.replace('.py',''))
++		else:
++			from zipfile import PyZipFile
++			waflibs=PyZipFile(waf_dir)
++			lst=waflibs.namelist()
++			for x in lst:
++				if not re.match("waflib/extras/%s"%var.replace("*",".*"),var):
++					continue
++				f=os.path.basename(x)
++				doban=False
++				for b in ban:
++					r=b.replace("*",".*")
++					if re.match(b,f):
++						doban=True
++				if not doban:
++					f=f.replace('.py','')
++					load_tool(f)
 +cache_modules={}
-+def load_module(path):
++def load_module(path,encoding=None):
 +	try:
 +		return cache_modules[path]
 +	except KeyError:
 +		pass
 +	module=imp.new_module(WSCRIPT_FILE)
 +	try:
-+		code=Utils.readf(path,m='rU')
++		code=Utils.readf(path,m='rU',encoding=encoding)
 +	except(IOError,OSError):
 +		raise Errors.WafError('Could not read the file %r'%path)
 +	module_dir=os.path.dirname(path)
@@ -1693,11 +1804,9 @@ Last-Update: 2014-03-11
 +	sys.path.remove(module_dir)
 +	cache_modules[path]=module
 +	return module
-+def load_tool(tool,tooldir=None):
++def load_tool(tool,tooldir=None,ctx=None):
 +	if tool=='java':
 +		tool='javaw'
-+	elif tool=='compiler_cc':
-+		tool='compiler_c'
 +	else:
 +		tool=tool.replace('++','xx')
 +	if tooldir:
@@ -1712,20 +1821,15 @@ Last-Update: 2014-03-11
 +			for d in tooldir:
 +				sys.path.remove(d)
 +	else:
-+		global waf_dir
-+		try:
-+			os.stat(os.path.join(waf_dir,'waflib','extras',tool+'.py'))
-+		except OSError:
++		for x in('waflib.Tools.%s','waflib.extras.%s','waflib.%s','%s'):
 +			try:
-+				os.stat(os.path.join(waf_dir,'waflib','Tools',tool+'.py'))
-+			except OSError:
-+				d=tool
-+			else:
-+				d='waflib.Tools.%s'%tool
-+		else:
-+			d='waflib.extras.%s'%tool
-+		__import__(d)
-+		ret=sys.modules[d]
++				__import__(x%tool)
++				break
++			except ImportError:
++				x=None
++		if x is None:
++			__import__(tool)
++		ret=sys.modules[x%tool]
 +		Context.tools[tool]=ret
 +		return ret
 --- /dev/null
@@ -1770,77 +1874,43 @@ Last-Update: 2014-03-11
 +	pass
 --- /dev/null
 +++ b/waflib/Logs.py
-@@ -0,0 +1,177 @@
+@@ -0,0 +1,196 @@
 +#! /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,re,traceback,sys
-+_nocolor=os.environ.get('NOCOLOR','no')not in('no','0','false')
-+try:
-+	if not _nocolor:
-+		import waflib.ansiterm
-+except ImportError:
-+	pass
-+try:
-+	import threading
-+except ImportError:
-+	if not'JOBS'in os.environ:
-+		os.environ['JOBS']='1'
-+else:
-+	wlock=threading.Lock()
-+	class sync_stream(object):
-+		def __init__(self,stream):
-+			self.stream=stream
-+			self.encoding=self.stream.encoding
-+		def write(self,txt):
-+			try:
-+				wlock.acquire()
-+				self.stream.write(txt)
-+				self.stream.flush()
-+			finally:
-+				wlock.release()
-+		def fileno(self):
-+			return self.stream.fileno()
-+		def flush(self):
-+			self.stream.flush()
-+		def isatty(self):
-+			return self.stream.isatty()
-+	if not os.environ.get('NOSYNC',False):
-+		if id(sys.stdout)==id(sys.__stdout__):
-+			sys.stdout=sync_stream(sys.stdout)
-+			sys.stderr=sync_stream(sys.stderr)
++import os,re,traceback,sys,types
++from waflib import Utils,ansiterm
++if not os.environ.get('NOSYNC',False):
++	if sys.stdout.isatty()and id(sys.stdout)==id(sys.__stdout__):
++		sys.stdout=ansiterm.AnsiTerm(sys.stdout)
++	if sys.stderr.isatty()and id(sys.stderr)==id(sys.__stderr__):
++		sys.stderr=ansiterm.AnsiTerm(sys.stderr)
 +import logging
 +LOG_FORMAT="%(asctime)s %(c1)s%(zone)s%(c2)s %(message)s"
 +HOUR_FORMAT="%H:%M:%S"
 +zones=''
 +verbose=0
 +colors_lst={'USE':True,'BOLD':'\x1b[01;1m','RED':'\x1b[01;31m','GREEN':'\x1b[32m','YELLOW':'\x1b[33m','PINK':'\x1b[35m','BLUE':'\x1b[01;34m','CYAN':'\x1b[36m','NORMAL':'\x1b[0m','cursor_on':'\x1b[?25h','cursor_off':'\x1b[?25l',}
-+got_tty=not os.environ.get('TERM','dumb')in['dumb','emacs']
-+if got_tty:
-+	try:
-+		got_tty=sys.stderr.isatty()and sys.stdout.isatty()
-+	except AttributeError:
-+		got_tty=False
-+if(not got_tty and os.environ.get('TERM','dumb')!='msys')or _nocolor:
-+	colors_lst['USE']=False
-+def get_term_cols():
-+	return 80
-+try:
-+	import struct,fcntl,termios
-+except ImportError:
-+	pass
-+else:
-+	if got_tty:
-+		def get_term_cols_real():
-+			dummy_lines,cols=struct.unpack("HHHH",fcntl.ioctl(sys.stderr.fileno(),termios.TIOCGWINSZ,struct.pack("HHHH",0,0,0,0)))[:2]
-+			return cols
-+		try:
-+			get_term_cols_real()
-+		except Exception:
-+			pass
++indicator='\r\x1b[K%s%s%s'
++def enable_colors(use):
++	if use==1:
++		if not(sys.stderr.isatty()or sys.stdout.isatty()):
++			use=0
++		if Utils.is_win32:
++			term=os.environ.get('TERM','')
 +		else:
-+			get_term_cols=get_term_cols_real
++			term=os.environ.get('TERM','dumb')
++		if term in('dumb','emacs'):
++			use=0
++	if use>=1:
++		os.environ['TERM']='vt100'
++	colors_lst['USE']=use
++try:
++	get_term_cols=ansiterm.get_term_cols
++except AttributeError:
++	def get_term_cols():
++		return 80
 +get_term_cols.__doc__="""
 +	Get the console width in characters.
 +
@@ -1861,16 +1931,8 @@ Last-Update: 2014-03-11
 +	def __init__(self,name=None):
 +		pass
 +	def filter(self,rec):
-+		rec.c1=colors.PINK
-+		rec.c2=colors.NORMAL
 +		rec.zone=rec.module
 +		if rec.levelno>=logging.INFO:
-+			if rec.levelno>=logging.ERROR:
-+				rec.c1=colors.RED
-+			elif rec.levelno>=logging.WARNING:
-+				rec.c1=colors.YELLOW
-+			else:
-+				rec.c1=colors.GREEN
 +			return True
 +		m=re_log.match(rec.msg)
 +		if m:
@@ -1881,16 +1943,70 @@ Last-Update: 2014-03-11
 +		elif not verbose>2:
 +			return False
 +		return True
++class log_handler(logging.StreamHandler):
++	def emit(self,record):
++		try:
++			try:
++				self.stream=record.stream
++			except AttributeError:
++				if record.levelno>=logging.WARNING:
++					record.stream=self.stream=sys.stderr
++				else:
++					record.stream=self.stream=sys.stdout
++			self.emit_override(record)
++			self.flush()
++		except(KeyboardInterrupt,SystemExit):
++			raise
++		except:
++			self.handleError(record)
++	def emit_override(self,record,**kw):
++		self.terminator=getattr(record,'terminator','\n')
++		stream=self.stream
++		if hasattr(types,"UnicodeType"):
++			msg=self.formatter.format(record)
++			fs='%s'+self.terminator
++			try:
++				if(isinstance(msg,unicode)and getattr(stream,'encoding',None)):
++					fs=fs.decode(stream.encoding)
++					try:
++						stream.write(fs%msg)
++					except UnicodeEncodeError:
++						stream.write((fs%msg).encode(stream.encoding))
++				else:
++					stream.write(fs%msg)
++			except UnicodeError:
++				stream.write((fs%msg).encode("UTF-8"))
++		else:
++			logging.StreamHandler.emit(self,record)
 +class formatter(logging.Formatter):
 +	def __init__(self):
 +		logging.Formatter.__init__(self,LOG_FORMAT,HOUR_FORMAT)
 +	def format(self,rec):
-+		if rec.levelno>=logging.WARNING or rec.levelno==logging.INFO:
-+			try:
-+				msg=rec.msg.decode('utf-8')
-+			except Exception:
-+				msg=rec.msg
-+			return'%s%s%s'%(rec.c1,msg,rec.c2)
++		try:
++			msg=rec.msg.decode('utf-8')
++		except Exception:
++			msg=rec.msg
++		use=colors_lst['USE']
++		if(use==1 and rec.stream.isatty())or use==2:
++			c1=getattr(rec,'c1',None)
++			if c1 is None:
++				c1=''
++				if rec.levelno>=logging.ERROR:
++					c1=colors.RED
++				elif rec.levelno>=logging.WARNING:
++					c1=colors.YELLOW
++				elif rec.levelno>=logging.INFO:
++					c1=colors.GREEN
++			c2=getattr(rec,'c2',colors.NORMAL)
++			msg='%s%s%s'%(c1,msg,c2)
++		else:
++			msg=msg.replace('\r','\n')
++			msg=re.sub(r'\x1B\[(K|.*?(m|h|l))','',msg)
++		if rec.levelno>=logging.INFO:
++			return msg
++		rec.msg=msg
++		rec.c1=colors.PINK
++		rec.c2=colors.NORMAL
 +		return logging.Formatter.format(self,rec)
 +log=None
 +def debug(*k,**kw):
@@ -1923,7 +2039,7 @@ Last-Update: 2014-03-11
 +	log=logging.getLogger('waflib')
 +	log.handlers=[]
 +	log.filters=[]
-+	hdlr=logging.StreamHandler()
++	hdlr=log_handler()
 +	hdlr.setFormatter(formatter())
 +	log.addHandler(hdlr)
 +	log.addFilter(log_filter())
@@ -1936,7 +2052,7 @@ Last-Update: 2014-03-11
 +	logger.addHandler(hdlr)
 +	logger.setLevel(logging.DEBUG)
 +	return logger
-+def make_mem_logger(name,to_log,size=10000):
++def make_mem_logger(name,to_log,size=8192):
 +	from logging.handlers import MemoryHandler
 +	logger=logging.getLogger(name)
 +	hdlr=MemoryHandler(size,target=to_log)
@@ -1946,11 +2062,18 @@ Last-Update: 2014-03-11
 +	logger.memhandler=hdlr
 +	logger.setLevel(logging.DEBUG)
 +	return logger
-+def pprint(col,str,label='',sep='\n'):
-+	sys.stderr.write("%s%s%s %s%s"%(colors(col),str,colors.NORMAL,label,sep))
++def free_logger(logger):
++	try:
++		for x in logger.handlers:
++			x.close()
++			logger.removeHandler(x)
++	except Exception ,e:
++		pass
++def pprint(col,msg,label='',sep='\n'):
++	info("%s%s%s %s"%(colors(col),msg,colors.NORMAL,label),extra={'terminator':sep})
 --- /dev/null
 +++ b/waflib/Node.py
-@@ -0,0 +1,467 @@
+@@ -0,0 +1,468 @@
 +#! /usr/bin/env python
 +# encoding: utf-8
 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
@@ -1999,15 +2122,19 @@ Last-Update: 2014-03-11
 +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
++		if path.startswith('\\\\?'):
++			path=path[4:]
++		else:
++			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 Utils.is_win32:
 +	split_path=split_path_win32
 +class Node(object):
++	dict_class=dict
 +	__slots__=('name','sig','children','parent','cache_abspath','cache_isdir','cache_sig')
 +	def __init__(self,name,parent):
 +		self.name=name
@@ -2020,7 +2147,7 @@ Last-Update: 2014-03-11
 +		self.name=data[0]
 +		self.parent=data[1]
 +		if data[2]is not None:
-+			self.children=data[2]
++			self.children=self.dict_class(data[2])
 +		if data[3]is not None:
 +			self.sig=data[3]
 +	def __getstate__(self):
@@ -2043,13 +2170,16 @@ Last-Update: 2014-03-11
 +		os.chmod(self.abspath(),val)
 +	def delete(self):
 +		try:
-+			if hasattr(self,'children'):
-+				shutil.rmtree(self.abspath())
-+			else:
-+				os.remove(self.abspath())
-+		except OSError:
-+			pass
-+		self.evict()
++			try:
++				if hasattr(self,'children'):
++					shutil.rmtree(self.abspath())
++				else:
++					os.remove(self.abspath())
++			except OSError ,e:
++				if os.path.exists(self.abspath()):
++					raise e
++		finally:
++			self.evict()
 +	def evict(self):
 +		del self.parent.children[self.name]
 +	def suffix(self):
@@ -2083,7 +2213,7 @@ Last-Update: 2014-03-11
 +			try:
 +				self.children
 +			except AttributeError:
-+				self.children={}
++				self.children=self.dict_class()
 +		self.cache_isdir=True
 +	def find_node(self,lst):
 +		if isinstance(lst,str):
@@ -2096,7 +2226,7 @@ Last-Update: 2014-03-11
 +			try:
 +				ch=cur.children
 +			except AttributeError:
-+				cur.children={}
++				cur.children=self.dict_class()
 +			else:
 +				try:
 +					cur=cur.children[x]
@@ -2135,7 +2265,7 @@ Last-Update: 2014-03-11
 +					cur=cur.children[x]
 +					continue
 +			else:
-+				cur.children={}
++				cur.children=self.dict_class()
 +			cur=self.__class__(x,cur)
 +		return cur
 +	def search_node(self,lst):
@@ -2209,7 +2339,7 @@ Last-Update: 2014-03-11
 +		try:
 +			lst=set(self.children.keys())
 +		except AttributeError:
-+			self.children={}
++			self.children=self.dict_class()
 +		else:
 +			if remove:
 +				for x in lst-set(dircont):
@@ -2386,8 +2516,6 @@ Last-Update: 2014-03-11
 +		else:
 +			name=name[:-len(ext_in)]+ext
 +		return self.parent.find_or_declare([name])
-+	def nice_path(self,env=None):
-+		return self.path_from(self.ctx.launch_node())
 +	def bldpath(self):
 +		return self.path_from(self.ctx.bldnode)
 +	def srcpath(self):
@@ -2402,9 +2530,6 @@ Last-Update: 2014-03-11
 +		return self.srcpath()
 +	def bld_dir(self):
 +		return self.parent.bldpath()
-+	def bld_base(self):
-+		s=os.path.splitext(self.name)[0]
-+		return self.bld_dir()+os.sep+s
 +	def get_bld_sig(self):
 +		try:
 +			return self.cache_sig
@@ -2414,13 +2539,12 @@ Last-Update: 2014-03-11
 +			self.sig=Utils.h_file(self.abspath())
 +		self.cache_sig=ret=self.sig
 +		return ret
-+	search=search_node
 +pickle_lock=Utils.threading.Lock()
 +class Nod3(Node):
 +	pass
 --- /dev/null
 +++ b/waflib/Options.py
-@@ -0,0 +1,135 @@
+@@ -0,0 +1,142 @@
 +#! /usr/bin/env python
 +# encoding: utf-8
 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
@@ -2430,58 +2554,26 @@ Last-Update: 2014-03-11
 +cmds='distclean configure build install clean uninstall check dist distcheck'.split()
 +options={}
 +commands=[]
++envvars=[]
 +lockfile=os.environ.get('WAFLOCK','.lock-waf_%s_build'%sys.platform)
-+try:cache_global=os.path.abspath(os.environ['WAFCACHE'])
-+except KeyError:cache_global=''
 +platform=Utils.unversioned_sys_platform()
 +class opt_parser(optparse.OptionParser):
 +	def __init__(self,ctx):
 +		optparse.OptionParser.__init__(self,conflict_handler="resolve",version='waf %s (%s)'%(Context.WAFVERSION,Context.WAFREVISION))
 +		self.formatter.width=Logs.get_term_cols()
-+		p=self.add_option
 +		self.ctx=ctx
-+		jobs=ctx.jobs()
-+		p('-j','--jobs',dest='jobs',default=jobs,type='int',help='amount of parallel jobs (%r)'%jobs)
-+		p('-k','--keep',dest='keep',default=0,action='count',help='keep running happily even if errors are found')
-+		p('-v','--verbose',dest='verbose',default=0,action='count',help='verbosity level -v -vv or -vvv [default: 0]')
-+		p('--nocache',dest='nocache',default=False,action='store_true',help='ignore the WAFCACHE (if set)')
-+		p('--zones',dest='zones',default='',action='store',help='debugging zones (task_gen, deps, tasks, etc)')
-+		gr=optparse.OptionGroup(self,'configure options')
-+		self.add_option_group(gr)
-+		gr.add_option('-o','--out',action='store',default='',help='build dir for the project',dest='out')
-+		gr.add_option('-t','--top',action='store',default='',help='src dir for the project',dest='top')
-+		default_prefix=os.environ.get('PREFIX')
-+		if not default_prefix:
-+			if platform=='win32':
-+				d=tempfile.gettempdir()
-+				default_prefix=d[0].upper()+d[1:]
-+			else:
-+				default_prefix='/usr/local/'
-+		gr.add_option('--prefix',dest='prefix',default=default_prefix,help='installation prefix [default: %r]'%default_prefix)
-+		gr.add_option('--download',dest='download',default=False,action='store_true',help='try to download the tools if missing')
-+		gr=optparse.OptionGroup(self,'build and install options')
-+		self.add_option_group(gr)
-+		gr.add_option('-p','--progress',dest='progress_bar',default=0,action='count',help='-p: progress bar; -pp: ide output')
-+		gr.add_option('--targets',dest='targets',default='',action='store',help='task generators, e.g. "target1,target2"')
-+		gr=optparse.OptionGroup(self,'step options')
-+		self.add_option_group(gr)
-+		gr.add_option('--files',dest='files',default='',action='store',help='files to process, by regexp, e.g. "*/main.c,*/test/main.o"')
-+		default_destdir=os.environ.get('DESTDIR','')
-+		gr=optparse.OptionGroup(self,'install/uninstall options')
-+		self.add_option_group(gr)
-+		gr.add_option('--destdir',help='installation root [default: %r]'%default_destdir,default=default_destdir,dest='destdir')
-+		gr.add_option('-f','--force',dest='force',default=False,action='store_true',help='force file installation')
-+		gr.add_option('--distcheck-args',help='arguments to pass to distcheck',default=None,action='store')
++	def print_usage(self,file=None):
++		return self.print_help(file)
 +	def get_usage(self):
 +		cmds_str={}
 +		for cls in Context.classes:
-+			if not cls.cmd or cls.cmd=='options':
++			if not cls.cmd or cls.cmd=='options'or cls.cmd.startswith('_'):
 +				continue
 +			s=cls.__doc__ or''
 +			cmds_str[cls.cmd]=s
 +		if Context.g_module:
 +			for(k,v)in Context.g_module.__dict__.items():
-+				if k in['options','init','shutdown']:
++				if k in('options','init','shutdown'):
 +					continue
 +				if type(v)is type(Context.create_context):
 +					if v.__doc__ and not k.startswith('_'):
@@ -2504,14 +2596,47 @@ Last-Update: 2014-03-11
 +		super(OptionsContext,self).__init__(**kw)
 +		self.parser=opt_parser(self)
 +		self.option_groups={}
-+	def jobs(self):
-+		count=int(os.environ.get('JOBS',0))
-+		if count<1:
-+			if'NUMBER_OF_PROCESSORS'in os.environ:
-+				count=int(os.environ.get('NUMBER_OF_PROCESSORS',1))
++		jobs=self.jobs()
++		p=self.add_option
++		color=os.environ.get('NOCOLOR','')and'no'or'auto'
++		p('-c','--color',dest='colors',default=color,action='store',help='whether to use colors (yes/no/auto) [default: auto]',choices=('yes','no','auto'))
++		p('-j','--jobs',dest='jobs',default=jobs,type='int',help='amount of parallel jobs (%r)'%jobs)
++		p('-k','--keep',dest='keep',default=0,action='count',help='continue despite errors (-kk to try harder)')
++		p('-v','--verbose',dest='verbose',default=0,action='count',help='verbosity level -v -vv or -vvv [default: 0]')
++		p('--zones',dest='zones',default='',action='store',help='debugging zones (task_gen, deps, tasks, etc)')
++		gr=self.add_option_group('Configuration options')
++		self.option_groups['configure options']=gr
++		gr.add_option('-o','--out',action='store',default='',help='build dir for the project',dest='out')
++		gr.add_option('-t','--top',action='store',default='',help='src dir for the project',dest='top')
++		default_prefix=getattr(Context.g_module,'default_prefix',os.environ.get('PREFIX'))
++		if not default_prefix:
++			if platform=='win32':
++				d=tempfile.gettempdir()
++				default_prefix=d[0].upper()+d[1:]
 +			else:
-+				if hasattr(os,'sysconf_names'):
-+					if'SC_NPROCESSORS_ONLN'in os.sysconf_names:
++				default_prefix='/usr/local/'
++		gr.add_option('--prefix',dest='prefix',default=default_prefix,help='installation prefix [default: %r]'%default_prefix)
++		gr=self.add_option_group('Build and installation options')
++		self.option_groups['build and install options']=gr
++		gr.add_option('-p','--progress',dest='progress_bar',default=0,action='count',help='-p: progress bar; -pp: ide output')
++		gr.add_option('--targets',dest='targets',default='',action='store',help='task generators, e.g. "target1,target2"')
++		gr=self.add_option_group('Step options')
++		self.option_groups['step options']=gr
++		gr.add_option('--files',dest='files',default='',action='store',help='files to process, by regexp, e.g. "*/main.c,*/test/main.o"')
++		default_destdir=os.environ.get('DESTDIR','')
++		gr=self.add_option_group('Installation and uninstallation options')
++		self.option_groups['install/uninstall options']=gr
++		gr.add_option('--destdir',help='installation root [default: %r]'%default_destdir,default=default_destdir,dest='destdir')
++		gr.add_option('-f','--force',dest='force',default=False,action='store_true',help='force file installation')
++		gr.add_option('--distcheck-args',metavar='ARGS',help='arguments to pass to distcheck',default=None,action='store')
++	def jobs(self):
++		count=int(os.environ.get('JOBS',0))
++		if count<1:
++			if'NUMBER_OF_PROCESSORS'in os.environ:
++				count=int(os.environ.get('NUMBER_OF_PROCESSORS',1))
++			else:
++				if hasattr(os,'sysconf_names'):
++					if'SC_NPROCESSORS_ONLN'in os.sysconf_names:
 +						count=int(os.sysconf('SC_NPROCESSORS_ONLN'))
 +					elif'SC_NPROCESSORS_CONF'in os.sysconf_names:
 +						count=int(os.sysconf('SC_NPROCESSORS_CONF'))
@@ -2546,19 +2671,25 @@ Last-Update: 2014-03-11
 +					return group
 +			return None
 +	def parse_args(self,_args=None):
-+		global options,commands
++		global options,commands,envvars
 +		(options,leftover_args)=self.parser.parse_args(args=_args)
-+		commands=leftover_args
++		for arg in leftover_args:
++			if'='in arg:
++				envvars.append(arg)
++			else:
++				commands.append(arg)
 +		if options.destdir:
 +			options.destdir=os.path.abspath(os.path.expanduser(options.destdir))
 +		if options.verbose>=1:
 +			self.load('errcheck')
++		colors={'yes':2,'auto':1,'no':0}[options.colors]
++		Logs.enable_colors(colors)
 +	def execute(self):
 +		super(OptionsContext,self).execute()
 +		self.parse_args()
 --- /dev/null
 +++ b/waflib/Runner.py
-@@ -0,0 +1,197 @@
+@@ -0,0 +1,201 @@
 +#! /usr/bin/env python
 +# encoding: utf-8
 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
@@ -2670,10 +2801,6 @@ Last-Update: 2014-03-11
 +		self.count-=1
 +		self.dirty=True
 +		return tsk
-+	def error_handler(self,tsk):
-+		if not self.bld.keep:
-+			self.stop=True
-+		self.error.append(tsk)
 +	def add_task(self,tsk):
 +		try:
 +			self.pool
@@ -2704,6 +2831,31 @@ Last-Update: 2014-03-11
 +			for x in pool:
 +				put_pool(x)
 +			self.pool=[]
++	def skip(self,tsk):
++		tsk.hasrun=Task.SKIPPED
++	def error_handler(self,tsk):
++		if not self.bld.keep:
++			self.stop=True
++		self.error.append(tsk)
++	def task_status(self,tsk):
++		try:
++			return tsk.runnable_status()
++		except Exception:
++			self.processed+=1
++			tsk.err_msg=Utils.ex_stack()
++			if not self.stop and self.bld.keep:
++				self.skip(tsk)
++				if self.bld.keep==1:
++					if Logs.verbose>1 or not self.error:
++						self.error.append(tsk)
++					self.stop=True
++				else:
++					if Logs.verbose>1:
++						self.error.append(tsk)
++				return Task.EXCEPTION
++			tsk.hasrun=Task.EXCEPTION
++			self.error_handler(tsk)
++			return Task.EXCEPTION
 +	def start(self):
 +		self.total=self.bld.total()
 +		while not self.stop:
@@ -2719,31 +2871,8 @@ Last-Update: 2014-03-11
 +				continue
 +			if self.stop:
 +				break
-+			try:
-+				st=tsk.runnable_status()
-+			except Exception:
-+				self.processed+=1
-+				tsk.err_msg=Utils.ex_stack()
-+				if not self.stop and self.bld.keep:
-+					tsk.hasrun=Task.SKIPPED
-+					if self.bld.keep==1:
-+						if Logs.verbose>1 or not self.error:
-+							self.error.append(tsk)
-+						self.stop=True
-+					else:
-+						if Logs.verbose>1:
-+							self.error.append(tsk)
-+					continue
-+				tsk.hasrun=Task.EXCEPTION
-+				self.error_handler(tsk)
-+				continue
-+			if st==Task.ASK_LATER:
-+				self.postpone(tsk)
-+			elif st==Task.SKIP_ME:
-+				self.processed+=1
-+				tsk.hasrun=Task.SKIPPED
-+				self.add_more_tasks(tsk)
-+			else:
++			st=self.task_status(tsk)
++			if st==Task.RUN_ME:
 +				tsk.position=(self.processed,self.total)
 +				self.count+=1
 +				tsk.master=self
@@ -2752,13 +2881,19 @@ Last-Update: 2014-03-11
 +					tsk.process()
 +				else:
 +					self.add_task(tsk)
++			if st==Task.ASK_LATER:
++				self.postpone(tsk)
++			elif st==Task.SKIP_ME:
++				self.processed+=1
++				self.skip(tsk)
++				self.add_more_tasks(tsk)
 +		while self.error and self.count:
 +			self.get_out()
 +		assert(self.count==0 or self.stop)
 +		self.free_task_pool()
 --- /dev/null
 +++ b/waflib/Scripting.py
-@@ -0,0 +1,375 @@
+@@ -0,0 +1,385 @@
 +#! /usr/bin/env python
 +# encoding: utf-8
 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
@@ -2784,9 +2919,10 @@ Last-Update: 2014-03-11
 +	no_climb=os.environ.get('NOCLIMB',None)
 +	if not no_climb:
 +		for k in no_climb_commands:
-+			if k in sys.argv:
-+				no_climb=True
-+				break
++			for y in sys.argv:
++				if y.startswith(k):
++					no_climb=True
++					break
 +	cur=current_directory
 +	while cur:
 +		lst=os.listdir(cur)
@@ -2798,7 +2934,7 @@ Last-Update: 2014-03-11
 +			except Exception:
 +				pass
 +			else:
-+				for x in[env.run_dir,env.top_dir,env.out_dir]:
++				for x in(env.run_dir,env.top_dir,env.out_dir):
 +					if Utils.is_win32:
 +						if cur==x:
 +							load=True
@@ -2845,7 +2981,7 @@ Last-Update: 2014-03-11
 +		Logs.error('Waf: The folder %r is unreadable'%Context.run_dir)
 +		sys.exit(1)
 +	try:
-+		set_main_module(Context.run_dir+os.sep+Context.WSCRIPT_FILE)
++		set_main_module(os.path.join(Context.run_dir,Context.WSCRIPT_FILE))
 +	except Errors.WafError ,e:
 +		Logs.pprint('RED',e.verbose_msg)
 +		Logs.error(str(e))
@@ -2876,7 +3012,7 @@ Last-Update: 2014-03-11
 +		name=obj.__name__
 +		if not name in Context.g_module.__dict__:
 +			setattr(Context.g_module,name,obj)
-+	for k in[update,dist,distclean,distcheck,update]:
++	for k in(update,dist,distclean,distcheck,update):
 +		set_def(k)
 +	if not'init'in Context.g_module.__dict__:
 +		Context.g_module.init=Utils.nada
@@ -2886,11 +3022,13 @@ Last-Update: 2014-03-11
 +		Context.g_module.options=Utils.nada
 +def parse_options():
 +	Context.create_context('options').execute()
++	for var in Options.envvars:
++		(name,value)=var.split('=',1)
++		os.environ[name.strip()]=value
 +	if not Options.commands:
 +		Options.commands=[default_cmd]
 +	Options.commands=[x for x in Options.commands if x!='options']
 +	Logs.verbose=Options.options.verbose
-+	Logs.init_log()
 +	if Options.options.zones:
 +		Logs.zones=Options.options.zones.split(',')
 +		if not Logs.verbose:
@@ -2904,7 +3042,10 @@ Last-Update: 2014-03-11
 +	ctx.log_timer=Utils.Timer()
 +	ctx.options=Options.options
 +	ctx.cmd=cmd_name
-+	ctx.execute()
++	try:
++		ctx.execute()
++	finally:
++		ctx.finalize()
 +	return ctx
 +def run_commands():
 +	parse_options()
@@ -2923,12 +3064,12 @@ Last-Update: 2014-03-11
 +	for(root,dirs,files)in os.walk(dirname):
 +		for f in files:
 +			if _can_distclean(f):
-+				fname=root+os.sep+f
++				fname=os.path.join(root,f)
 +				try:
 +					os.remove(fname)
 +				except OSError:
 +					Logs.warn('Could not remove %r'%fname)
-+	for x in[Context.DBFILE,'config.log']:
++	for x in(Context.DBFILE,'config.log'):
 +		try:
 +			os.remove(x)
 +		except OSError:
@@ -2954,15 +3095,16 @@ Last-Update: 2014-03-11
 +					pass
 +				except OSError ,e:
 +					if e.errno!=errno.ENOENT:
-+						Logs.warn('project %r cannot be removed'%proj[Context.OUT])
++						Logs.warn('Could not remove %r'%proj['out_dir'])
 +			else:
 +				distclean_dir(proj['out_dir'])
 +			for k in(proj['out_dir'],proj['top_dir'],proj['run_dir']):
++				p=os.path.join(k,Options.lockfile)
 +				try:
-+					os.remove(os.path.join(k,Options.lockfile))
++					os.remove(p)
 +				except OSError ,e:
 +					if e.errno!=errno.ENOENT:
-+						Logs.warn('file %r cannot be removed'%f)
++						Logs.warn('Could not remove %r'%p)
 +		if not Options.commands:
 +			for x in'.waf-1. waf-1. .waf3-1. waf3-1.'.split():
 +				if f.startswith(x):
@@ -2986,7 +3128,7 @@ Last-Update: 2014-03-11
 +		node=self.base_path.make_node(arch_name)
 +		try:
 +			node.delete()
-+		except Exception:
++		except OSError:
 +			pass
 +		files=self.get_files()
 +		if self.algo.startswith('tar.'):
@@ -3051,10 +3193,11 @@ Last-Update: 2014-03-11
 +		try:
 +			return self.excl
 +		except AttributeError:
-+			self.excl=Node.exclude_regs+' **/waf-1.7.* **/.waf-1.7* **/waf3-1.7.* **/.waf3-1.7* **/*~ **/*.rej **/*.orig **/*.pyc **/*.pyo **/*.bak **/*.swp **/.lock-w*'
-+			nd=self.root.find_node(Context.out_dir)
-+			if nd:
-+				self.excl+=' '+nd.path_from(self.base_path)
++			self.excl=Node.exclude_regs+' **/waf-1.8.* **/.waf-1.8* **/waf3-1.8.* **/.waf3-1.8* **/*~ **/*.rej **/*.orig **/*.pyc **/*.pyo **/*.bak **/*.swp **/.lock-w*'
++			if Context.out_dir:
++				nd=self.root.find_node(Context.out_dir)
++				if nd:
++					self.excl+=' '+nd.path_from(self.base_path)
 +			return self.excl
 +	def get_files(self):
 +		try:
@@ -3130,18 +3273,20 @@ Last-Update: 2014-03-11
 +		if do_config:
 +			Options.commands.insert(0,self.cmd)
 +			Options.commands.insert(0,'configure')
++			if Configure.autoconfig=='clobber':
++				Options.options.__dict__=env.options
 +			return
 +		return execute_method(self)
 +	return execute
 +Build.BuildContext.execute=autoconfigure(Build.BuildContext.execute)
 --- /dev/null
 +++ b/waflib/Task.py
-@@ -0,0 +1,683 @@
+@@ -0,0 +1,652 @@
 +#! /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,shutil,re,tempfile
++import os,re,sys
 +from waflib import Utils,Logs,Errors
 +NOT_RUN=0
 +MISSING=1
@@ -3176,24 +3321,6 @@ Last-Update: 2014-03-11
 +	lst = [x for x in lst if x]
 +	return tsk.exec_command(lst, cwd=wd, env=env.env or None)
 +'''
-+def cache_outputs(cls):
-+	m1=cls.run
-+	def run(self):
-+		bld=self.generator.bld
-+		if bld.cache_global and not bld.nocache:
-+			if self.can_retrieve_cache():
-+				return 0
-+		return m1(self)
-+	cls.run=run
-+	m2=cls.post_run
-+	def post_run(self):
-+		bld=self.generator.bld
-+		ret=m2(self)
-+		if bld.cache_global and not bld.nocache:
-+			self.put_files_cache()
-+		return ret
-+	cls.post_run=post_run
-+	return cls
 +classes={}
 +class store_task_type(type):
 +	def __init__(cls,name,bases,dict):
@@ -3212,8 +3339,6 @@ Last-Update: 2014-03-11
 +				cls.vars.sort()
 +			elif getattr(cls,'run',None)and not'hcode'in cls.__dict__:
 +				cls.hcode=Utils.h_fun(cls.run)
-+			if not getattr(cls,'nocache',None):
-+				cls=cache_outputs(cls)
 +			getattr(cls,'register',classes)[name]=cls
 +evil=store_task_type('evil',(object,),{})
 +class TaskBase(evil):
@@ -3233,10 +3358,14 @@ Last-Update: 2014-03-11
 +		return'\n\t{task %r: %s %s}'%(self.__class__.__name__,id(self),str(getattr(self,'fun','')))
 +	def __str__(self):
 +		if hasattr(self,'fun'):
-+			return'executing: %s\n'%self.fun.__name__
-+		return self.__class__.__name__+'\n'
++			return self.fun.__name__
++		return self.__class__.__name__
 +	def __hash__(self):
 +		return id(self)
++	def keyword(self):
++		if hasattr(self,'fun'):
++			return'Function'
++		return'Processing'
 +	def exec_command(self,cmd,**kw):
 +		bld=self.generator.bld
 +		try:
@@ -3289,7 +3418,18 @@ Last-Update: 2014-03-11
 +	def post_run(self):
 +		pass
 +	def log_display(self,bld):
-+		bld.to_log(self.display())
++		s=self.display()
++		if s:
++			if bld.logger:
++				logger=bld.logger
++			else:
++				logger=Logs
++			if self.generator.bld.progress_bar==1:
++				c1=Logs.colors.cursor_off
++				c2=Logs.colors.cursor_on
++				logger.info(s,extra={'stream':sys.stderr,'terminator':'','c1':c1,'c2':c2})
++			else:
++				logger.info(s,extra={'terminator':'','c1':'','c2':''})
 +	def display(self):
 +		col1=Logs.colors(self.color)
 +		col2=Logs.colors.NORMAL
@@ -3317,8 +3457,11 @@ Last-Update: 2014-03-11
 +			return None
 +		total=master.total
 +		n=len(str(total))
-+		fs='[%%%dd/%%%dd] %%s%%s%%s'%(n,n)
-+		return fs%(cur(),total,col1,s,col2)
++		fs='[%%%dd/%%%dd] %%s%%s%%s%%s\n'%(n,n)
++		kw=self.keyword()
++		if kw:
++			kw+=' '
++		return fs%(cur(),total,kw,col1,s,col2)
 +	def attr(self,att,default=None):
 +		ret=getattr(self,att,self)
 +		if ret is self:return getattr(self.__class__,att,default)
@@ -3346,6 +3489,8 @@ Last-Update: 2014-03-11
 +			return'invalid status for task in %r: %r'%(name,self.hasrun)
 +	def colon(self,var1,var2):
 +		tmp=self.env[var1]
++		if not tmp:
++			return[]
 +		if isinstance(var2,str):
 +			it=self.env[var2]
 +		else:
@@ -3353,8 +3498,6 @@ Last-Update: 2014-03-11
 +		if isinstance(tmp,str):
 +			return[tmp%x for x in it]
 +		else:
-+			if Logs.verbose and not tmp and it:
-+				Logs.warn('Missing env variable %r for task %r (generator %r)'%(var1,self,self.generator))
 +			lst=[]
 +			for y in it:
 +				lst.extend(tmp)
@@ -3371,12 +3514,33 @@ Last-Update: 2014-03-11
 +		self.dep_nodes=[]
 +		self.run_after=set([])
 +	def __str__(self):
-+		env=self.env
-+		src_str=' '.join([a.nice_path()for a in self.inputs])
-+		tgt_str=' '.join([a.nice_path()for a in self.outputs])
++		name=self.__class__.__name__
++		if self.outputs:
++			if(name.endswith('lib')or name.endswith('program'))or not self.inputs:
++				node=self.outputs[0]
++				return node.path_from(node.ctx.launch_node())
++		if not(self.inputs or self.outputs):
++			return self.__class__.__name__
++		if len(self.inputs)==1:
++			node=self.inputs[0]
++			return node.path_from(node.ctx.launch_node())
++		src_str=' '.join([a.path_from(a.ctx.launch_node())for a in self.inputs])
++		tgt_str=' '.join([a.path_from(a.ctx.launch_node())for a in self.outputs])
 +		if self.outputs:sep=' -> '
 +		else:sep=''
-+		return'%s: %s%s%s\n'%(self.__class__.__name__.replace('_task',''),src_str,sep,tgt_str)
++		return'%s: %s%s%s'%(self.__class__.__name__.replace('_task',''),src_str,sep,tgt_str)
++	def keyword(self):
++		name=self.__class__.__name__
++		if name.endswith('lib')or name.endswith('program'):
++			return'Linking'
++		if len(self.inputs)==1 and len(self.outputs)==1:
++			return'Compiling'
++		if not self.inputs:
++			if self.outputs:
++				return'Creating'
++			else:
++				return'Running'
++		return'Processing'
 +	def __repr__(self):
 +		try:
 +			ins=",".join([x.name for x in self.inputs])
@@ -3558,71 +3722,20 @@ Last-Update: 2014-03-11
 +			for tsk in self.run_after:
 +				if not tsk.hasrun:
 +					raise Errors.TaskNotReady('not ready')
-+	def can_retrieve_cache(self):
-+		if not getattr(self,'outputs',None):
-+			return None
-+		sig=self.signature()
-+		ssig=Utils.to_hex(self.uid())+Utils.to_hex(sig)
-+		dname=os.path.join(self.generator.bld.cache_global,ssig)
-+		try:
-+			t1=os.stat(dname).st_mtime
-+		except OSError:
-+			return None
-+		for node in self.outputs:
-+			orig=os.path.join(dname,node.name)
-+			try:
-+				shutil.copy2(orig,node.abspath())
-+				os.utime(orig,None)
-+			except(OSError,IOError):
-+				Logs.debug('task: failed retrieving file')
-+				return None
-+		try:
-+			t2=os.stat(dname).st_mtime
-+		except OSError:
-+			return None
-+		if t1!=t2:
-+			return None
-+		for node in self.outputs:
-+			node.sig=sig
-+			if self.generator.bld.progress_bar<1:
-+				self.generator.bld.to_log('restoring from cache %r\n'%node.abspath())
-+		self.cached=True
-+		return True
-+	def put_files_cache(self):
-+		if getattr(self,'cached',None):
-+			return None
-+		if not getattr(self,'outputs',None):
-+			return None
-+		sig=self.signature()
-+		ssig=Utils.to_hex(self.uid())+Utils.to_hex(sig)
-+		dname=os.path.join(self.generator.bld.cache_global,ssig)
-+		tmpdir=tempfile.mkdtemp(prefix=self.generator.bld.cache_global+os.sep+'waf')
-+		try:
-+			shutil.rmtree(dname)
-+		except Exception:
-+			pass
++if sys.hexversion>0x3000000:
++	def uid(self):
 +		try:
-+			for node in self.outputs:
-+				dest=os.path.join(tmpdir,node.name)
-+				shutil.copy2(node.abspath(),dest)
-+		except(OSError,IOError):
-+			try:
-+				shutil.rmtree(tmpdir)
-+			except Exception:
-+				pass
-+		else:
-+			try:
-+				os.rename(tmpdir,dname)
-+			except OSError:
-+				try:
-+					shutil.rmtree(tmpdir)
-+				except Exception:
-+					pass
-+			else:
-+				try:
-+					os.chmod(dname,Utils.O755)
-+				except Exception:
-+					pass
++			return self.uid_
++		except AttributeError:
++			m=Utils.md5()
++			up=m.update
++			up(self.__class__.__name__.encode('iso8859-1'))
++			for x in self.inputs+self.outputs:
++				up(x.abspath().encode('iso8859-1'))
++			self.uid_=m.digest()
++			return self.uid_
++	uid.__doc__=Task.uid.__doc__
++	Task.uid=uid
 +def is_before(t1,t2):
 +	to_list=Utils.to_list
 +	for k in to_list(t2.ext_in):
@@ -3717,6 +3830,7 @@ Last-Update: 2014-03-11
 +	def repl(match):
 +		g=match.group
 +		if g('dollar'):return"$"
++		elif g('backslash'):return'\\'
 +		elif g('subst'):extr.append((g('var'),g('code')));return"<<|@|>>"
 +		return None
 +	line2=reg_act.sub(repl,line)
@@ -3822,7 +3936,7 @@ Last-Update: 2014-03-11
 +	return cls
 --- /dev/null
 +++ b/waflib/TaskGen.py
-@@ -0,0 +1,405 @@
+@@ -0,0 +1,407 @@
 +#! /usr/bin/env python
 +# encoding: utf-8
 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
@@ -3831,7 +3945,7 @@ Last-Update: 2014-03-11
 +from waflib import Task,Utils,Logs,Errors,ConfigSet,Node
 +feats=Utils.defaultdict(set)
 +class task_gen(object):
-+	mappings={}
++	mappings=Utils.ordered_iter_dict()
 +	prec=Utils.defaultdict(list)
 +	def __init__(self,*k,**kw):
 +		self.source=''
@@ -3861,7 +3975,7 @@ Last-Update: 2014-03-11
 +	def __repr__(self):
 +		lst=[]
 +		for x in self.__dict__.keys():
-+			if x not in['env','bld','compiled_tasks','tasks']:
++			if x not in('env','bld','compiled_tasks','tasks'):
 +				lst.append("%s=%s"%(x,repr(getattr(self,x))))
 +		return"bld(%s) in %s"%(", ".join(lst),self.path.abspath())
 +	def get_name(self):
@@ -3936,27 +4050,29 @@ Last-Update: 2014-03-11
 +		return True
 +	def get_hook(self,node):
 +		name=node.name
-+		for k in self.mappings:
-+			if name.endswith(k):
-+				return self.mappings[k]
++		if self.mappings:
++			for k in self.mappings:
++				if name.endswith(k):
++					return self.mappings[k]
 +		for k in task_gen.mappings:
 +			if name.endswith(k):
 +				return task_gen.mappings[k]
-+		raise Errors.WafError("File %r has no mapping in %r (did you forget to load a waf tool?)"%(node,task_gen.mappings.keys()))
-+	def create_task(self,name,src=None,tgt=None):
++		raise Errors.WafError("File %r has no mapping in %r (have you forgotten to load a waf tool?)"%(node,task_gen.mappings.keys()))
++	def create_task(self,name,src=None,tgt=None,**kw):
 +		task=Task.classes[name](env=self.env.derive(),generator=self)
 +		if src:
 +			task.set_inputs(src)
 +		if tgt:
 +			task.set_outputs(tgt)
++		task.__dict__.update(kw)
 +		self.tasks.append(task)
 +		return task
 +	def clone(self,env):
 +		newobj=self.bld()
 +		for x in self.__dict__:
-+			if x in['env','bld']:
++			if x in('env','bld'):
 +				continue
-+			elif x in['path','features']:
++			elif x in('path','features'):
 +				setattr(newobj,x,getattr(self,x))
 +			else:
 +				setattr(newobj,x,copy.copy(getattr(self,x)))
@@ -3978,7 +4094,7 @@ Last-Update: 2014-03-11
 +			_ext_in=ext_in[0]
 +		tsk=self.create_task(name,node)
 +		cnt=0
-+		keys=list(self.mappings.keys())+list(self.__class__.mappings.keys())
++		keys=set(self.mappings.keys())|set(self.__class__.mappings.keys())
 +		for x in ext:
 +			k=node.change_ext(x,ext_in=_ext_in)
 +			tsk.outputs.append(k)
@@ -4037,7 +4153,7 @@ Last-Update: 2014-03-11
 +	tmp=[]
 +	path=path or self.path
 +	find=path.find_resource
-+	if isinstance(lst,self.path.__class__):
++	if isinstance(lst,Node.Node):
 +		lst=[lst]
 +	for x in Utils.to_list(lst):
 +		if isinstance(x,str):
@@ -4087,7 +4203,7 @@ Last-Update: 2014-03-11
 +			Task.update_outputs(cls)
 +		if getattr(self,'always',None):
 +			Task.always_run(cls)
-+		for x in['after','before','ext_in','ext_out']:
++		for x in('after','before','ext_in','ext_out'):
 +			setattr(cls,x,getattr(self,x,[]))
 +		if getattr(self,'cache_rule','True'):
 +			cache[(name,self.rule)]=cls
@@ -4132,11 +4248,11 @@ Last-Update: 2014-03-11
 +				os.chmod(self.outputs[0].abspath(),self.generator.chmod)
 +			return None
 +		if getattr(self.generator,'fun',None):
-+			self.generator.fun(self)
++			return self.generator.fun(self)
 +		code=self.inputs[0].read(encoding=getattr(self.generator,'encoding','ISO8859-1'))
 +		if getattr(self.generator,'subst_fun',None):
 +			code=self.generator.subst_fun(self,code)
-+			if code:
++			if code is not None:
 +				self.outputs[0].write(code,encoding=getattr(self.generator,'encoding','ISO8859-1'))
 +			return
 +		code=code.replace('%','%%')
@@ -4237,7 +4353,7 @@ Last-Update: 2014-03-11
 +
 --- /dev/null
 +++ b/waflib/Tools/ar.py
-@@ -0,0 +1,11 @@
+@@ -0,0 +1,13 @@
 +#! /usr/bin/env python
 +# encoding: utf-8
 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
@@ -4248,7 +4364,9 @@ Last-Update: 2014-03-11
 +	conf.load('ar')
 +def configure(conf):
 +	conf.find_program('ar',var='AR')
-+	conf.env.ARFLAGS='rcs'
++	conf.add_os_flags('ARFLAGS')
++	if not conf.env.ARFLAGS:
++		conf.env.ARFLAGS=['rcs']
 --- /dev/null
 +++ b/waflib/Tools/asm.py
 @@ -0,0 +1,25 @@
@@ -4263,7 +4381,7 @@ Last-Update: 2014-03-11
 +from waflib.TaskGen import extension,feature
 +class asm(Task.Task):
 +	color='BLUE'
-+	run_str='${AS} ${ASFLAGS} ${ASMPATH_ST:INCPATHS} ${AS_SRC_F}${SRC} ${AS_TGT_F}${TGT}'
++	run_str='${AS} ${ASFLAGS} ${ASMPATH_ST:INCPATHS} ${DEFINES_ST:DEFINES} ${AS_SRC_F}${SRC} ${AS_TGT_F}${TGT}'
 + at extension('.s','.S','.asm','.ASM','.spp','.SPP')
 +def asm_hook(self,node):
 +	return self.create_compiled_task('asm',node)
@@ -4310,7 +4428,7 @@ Last-Update: 2014-03-11
 +	conf.env.BISONFLAGS=['-d']
 --- /dev/null
 +++ b/waflib/Tools/c.py
-@@ -0,0 +1,24 @@
+@@ -0,0 +1,26 @@
 +#! /usr/bin/env python
 +# encoding: utf-8
 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
@@ -4320,9 +4438,11 @@ Last-Update: 2014-03-11
 +from waflib.Tools.ccroot import link_task,stlink_task
 + at TaskGen.extension('.c')
 +def c_hook(self,node):
++	if not self.env.CC and self.env.CXX:
++		return self.create_compiled_task('cxx',node)
 +	return self.create_compiled_task('c',node)
 +class c(Task.Task):
-+	run_str='${CC} ${ARCH_ST:ARCH} ${CFLAGS} ${CPPFLAGS} ${FRAMEWORKPATH_ST:FRAMEWORKPATH} ${CPPPATH_ST:INCPATHS} ${DEFINES_ST:DEFINES} ${CC_SRC_F}${SRC} ${CC_TGT_F}${TGT}'
++	run_str='${CC} ${ARCH_ST:ARCH} ${CFLAGS} ${CPPFLAGS} ${FRAMEWORKPATH_ST:FRAMEWORKPATH} ${CPPPATH_ST:INCPATHS} ${DEFINES_ST:DEFINES} ${CC_SRC_F}${SRC} ${CC_TGT_F}${TGT[0].abspath()}'
 +	vars=['CCDEPS']
 +	ext_in=['.h']
 +	scan=c_preproc.scan
@@ -4369,9 +4489,9 @@ Last-Update: 2014-03-11
 +		feats.append('java')
 +	if'java'in exts:
 +		return'java'
-+	if type in['program','shlib','stlib']:
++	if type in('program','shlib','stlib'):
 +		for x in feats:
-+			if x in['cxx','d','c']:
++			if x in('cxx','d','c'):
 +				feats.append(x+type)
 +	return feats
 +def set_features(kw,_type):
@@ -4395,7 +4515,7 @@ Last-Update: 2014-03-11
 +	return bld(*k,**kw)
 --- /dev/null
 +++ b/waflib/Tools/c_config.py
-@@ -0,0 +1,746 @@
+@@ -0,0 +1,722 @@
 +#! /usr/bin/env python
 +# encoding: utf-8
 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
@@ -4441,15 +4561,19 @@ Last-Update: 2014-03-11
 +MACRO_TO_DESTOS={'__linux__':'linux','__GNU__':'gnu','__FreeBSD__':'freebsd','__NetBSD__':'netbsd','__OpenBSD__':'openbsd','__sun':'sunos','__hpux':'hpux','__sgi':'irix','_AIX':'aix','__CYGWIN__':'cygwin','__MSYS__':'msys','_UWIN':'uwin','_WIN64':'win32','_WIN32':'win32','__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__':'darwin','__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__':'darwin','__QNX__':'qnx','__native_client__':'nacl'}
 +MACRO_TO_DEST_CPU={'__x86_64__':'x86_64','__amd64__':'x86_64','__i386__':'x86','__ia64__':'ia','__mips__':'mips','__sparc__':'sparc','__alpha__':'alpha','__aarch64__':'aarch64','__thumb__':'thumb','__arm__':'arm','__hppa__':'hppa','__powerpc__':'powerpc','__ppc__':'powerpc','__convex__':'convex','__m68k__':'m68k','__s390x__':'s390x','__s390__':'s390','__sh__':'sh',}
 + at conf
-+def parse_flags(self,line,uselib_store,env=None,force_static=False):
++def parse_flags(self,line,uselib_store,env=None,force_static=False,posix=None):
 +	assert(isinstance(line,str))
 +	env=env or self.env
-+	app=env.append_value
-+	appu=env.append_unique
-+	lex=shlex.shlex(line,posix=False)
++	if posix is None:
++		posix=True
++		if'\\'in line:
++			posix=('\\ 'in line)or('\\\\'in line)
++	lex=shlex.shlex(line,posix=posix)
 +	lex.whitespace_split=True
 +	lex.commenters=''
 +	lst=list(lex)
++	app=env.append_value
++	appu=env.append_unique
 +	uselib=uselib_store
 +	while lst:
 +		x=lst.pop(0)
@@ -4458,7 +4582,7 @@ Last-Update: 2014-03-11
 +		if st=='-I'or st=='/I':
 +			if not ot:ot=lst.pop(0)
 +			appu('INCLUDES_'+uselib,[ot])
-+		elif st=='-include':
++		elif st=='-i':
 +			tmp=[x,lst.pop(0)]
 +			app('CFLAGS',tmp)
 +			app('CXXFLAGS',tmp)
@@ -4482,6 +4606,12 @@ Last-Update: 2014-03-11
 +			appu('FRAMEWORK_'+uselib,[lst.pop(0)])
 +		elif x.startswith('-F'):
 +			appu('FRAMEWORKPATH_'+uselib,[x[2:]])
++		elif x=='-Wl,-rpath':
++			app('RPATH_'+uselib,lst.pop(0))
++		elif x.startswith('-Wl,-R'):
++			app('RPATH_'+uselib,x[6:])
++		elif x.startswith('-Wl,-rpath,'):
++			app('RPATH_'+uselib,x[11:])
 +		elif x.startswith('-Wl'):
 +			app('LINKFLAGS_'+uselib,[x])
 +		elif x.startswith('-m')or x.startswith('-f')or x.startswith('-dynamic'):
@@ -4489,7 +4619,7 @@ Last-Update: 2014-03-11
 +			app('CXXFLAGS_'+uselib,[x])
 +		elif x.startswith('-bundle'):
 +			app('LINKFLAGS_'+uselib,[x])
-+		elif x.startswith('-undefined'):
++		elif x.startswith('-undefined')or x.startswith('-Xlinker'):
 +			arg=lst.pop(0)
 +			app('LINKFLAGS_'+uselib,[x,arg])
 +		elif x.startswith('-arch')or x.startswith('-isysroot'):
@@ -4500,11 +4630,6 @@ Last-Update: 2014-03-11
 +		elif x.endswith('.a')or x.endswith('.so')or x.endswith('.dylib')or x.endswith('.lib'):
 +			appu('LINKFLAGS_'+uselib,[x])
 + at conf
-+def ret_msg(self,f,kw):
-+	if isinstance(f,str):
-+		return f
-+	return f(kw)
-+ at conf
 +def validate_cfg(self,kw):
 +	if not'path'in kw:
 +		if not self.env.PKGCONFIG:
@@ -4530,14 +4655,25 @@ Last-Update: 2014-03-11
 +			if not'msg'in kw:
 +				kw['msg']='Checking for %r %s %s'%(kw['package'],cfg_ver[x],kw[y])
 +			return
++	if not'define_name'in kw:
++		pkgname=kw.get('uselib_store',kw['package'].upper())
++		kw['define_name']=self.have_define(pkgname)
++	if not'uselib_store'in kw:
++		self.undefine(kw['define_name'])
 +	if not'msg'in kw:
 +		kw['msg']='Checking for %r'%(kw['package']or kw['path'])
 + at conf
 +def exec_cfg(self,kw):
++	path=Utils.to_list(kw['path'])
 +	def define_it():
-+		self.define(self.have_define(kw.get('uselib_store',kw['package'])),1,0)
++		pkgname=kw.get('uselib_store',kw['package'].upper())
++		if kw.get('global_define'):
++			self.define(self.have_define(kw['package']),1,False)
++		else:
++			self.env.append_unique('DEFINES_%s'%pkgname,"%s=1"%self.have_define(pkgname))
++		self.env[self.have_define(pkgname)]=1
 +	if'atleast_pkgconfig_version'in kw:
-+		cmd=[kw['path'],'--atleast-pkgconfig-version=%s'%kw['atleast_pkgconfig_version']]
++		cmd=path+['--atleast-pkgconfig-version=%s'%kw['atleast_pkgconfig_version']]
 +		self.cmd_and_log(cmd)
 +		if not'okmsg'in kw:
 +			kw['okmsg']='yes'
@@ -4545,16 +4681,16 @@ Last-Update: 2014-03-11
 +	for x in cfg_ver:
 +		y=x.replace('-','_')
 +		if y in kw:
-+			self.cmd_and_log([kw['path'],'--%s=%s'%(x,kw[y]),kw['package']])
++			self.cmd_and_log(path+['--%s=%s'%(x,kw[y]),kw['package']])
 +			if not'okmsg'in kw:
 +				kw['okmsg']='yes'
 +			define_it()
 +			break
 +	if'modversion'in kw:
-+		version=self.cmd_and_log([kw['path'],'--modversion',kw['modversion']]).strip()
++		version=self.cmd_and_log(path+['--modversion',kw['modversion']]).strip()
 +		self.define('%s_VERSION'%Utils.quote_define_name(kw.get('uselib_store',kw['modversion'])),version)
 +		return version
-+	lst=[kw['path']]
++	lst=[]+path
 +	defi=kw.get('define_variable',None)
 +	if not defi:
 +		defi=self.env.PKG_CONFIG_DEFINES or{}
@@ -4582,7 +4718,7 @@ Last-Update: 2014-03-11
 +	if not'okmsg'in kw:
 +		kw['okmsg']='yes'
 +	define_it()
-+	self.parse_flags(ret,kw.get('uselib_store',kw['package'].upper()),kw.get('env',self.env),force_static=static)
++	self.parse_flags(ret,kw.get('uselib_store',kw['package'].upper()),kw.get('env',self.env),force_static=static,posix=kw.get('posix',None))
 +	return ret
 + at conf
 +def check_cfg(self,*k,**kw):
@@ -4592,24 +4728,37 @@ Last-Update: 2014-03-11
 +		kw['args']=' '.join(lst[1:])
 +	self.validate_cfg(kw)
 +	if'msg'in kw:
-+		self.start_msg(kw['msg'])
++		self.start_msg(kw['msg'],**kw)
 +	ret=None
 +	try:
 +		ret=self.exec_cfg(kw)
 +	except self.errors.WafError:
 +		if'errmsg'in kw:
-+			self.end_msg(kw['errmsg'],'YELLOW')
++			self.end_msg(kw['errmsg'],'YELLOW',**kw)
 +		if Logs.verbose>1:
 +			raise
 +		else:
 +			self.fatal('The configuration failed')
 +	else:
++		if not ret:
++			ret=True
 +		kw['success']=ret
 +		if'okmsg'in kw:
-+			self.end_msg(self.ret_msg(kw['okmsg'],kw))
++			self.end_msg(self.ret_msg(kw['okmsg'],kw),**kw)
 +	return ret
++def build_fun(bld):
++	if bld.kw['compile_filename']:
++		node=bld.srcnode.make_node(bld.kw['compile_filename'])
++		node.write(bld.kw['code'])
++	o=bld(features=bld.kw['features'],source=bld.kw['compile_filename'],target='testprog')
++	for k,v in bld.kw.items():
++		setattr(o,k,v)
++	if not bld.kw.get('quiet',None):
++		bld.conf.to_log("==>\n%s\n<=="%bld.kw['code'])
 + at conf
 +def validate_c(self,kw):
++	if not'build_fun'in kw:
++		kw['build_fun']=build_fun
 +	if not'env'in kw:
 +		kw['env']=self.env.derive()
 +	env=kw['env']
@@ -4704,7 +4853,7 @@ Last-Update: 2014-03-11
 +			kw['msg']='Checking for code snippet'
 +		if not'errmsg'in kw:
 +			kw['errmsg']='no'
-+	for(flagsname,flagstype)in[('cxxflags','compiler'),('cflags','compiler'),('linkflags','linker')]:
++	for(flagsname,flagstype)in(('cxxflags','compiler'),('cflags','compiler'),('linkflags','linker')):
 +		if flagsname in kw:
 +			if not'msg'in kw:
 +				kw['msg']='Checking for %s flags %s'%(flagstype,kw[flagsname])
@@ -4766,12 +4915,12 @@ Last-Update: 2014-03-11
 + at conf
 +def check(self,*k,**kw):
 +	self.validate_c(kw)
-+	self.start_msg(kw['msg'])
++	self.start_msg(kw['msg'],**kw)
 +	ret=None
 +	try:
-+		ret=self.run_c_code(*k,**kw)
++		ret=self.run_build(*k,**kw)
 +	except self.errors.ConfigurationError:
-+		self.end_msg(kw['errmsg'],'YELLOW')
++		self.end_msg(kw['errmsg'],'YELLOW',**kw)
 +		if Logs.verbose>1:
 +			raise
 +		else:
@@ -4780,10 +4929,10 @@ Last-Update: 2014-03-11
 +		kw['success']=ret
 +	ret=self.post_check(*k,**kw)
 +	if not ret:
-+		self.end_msg(kw['errmsg'],'YELLOW')
++		self.end_msg(kw['errmsg'],'YELLOW',**kw)
 +		self.fatal('The configuration failed %r'%ret)
 +	else:
-+		self.end_msg(self.ret_msg(kw['okmsg'],kw))
++		self.end_msg(self.ret_msg(kw['okmsg'],kw),**kw)
 +	return ret
 +class test_exec(Task.Task):
 +	color='PINK'
@@ -4806,64 +4955,6 @@ Last-Update: 2014-03-11
 + at after_method('apply_link')
 +def test_exec_fun(self):
 +	self.create_task('test_exec',self.link_task.outputs[0])
-+CACHE_RESULTS=1
-+COMPILE_ERRORS=2
-+ at conf
-+def run_c_code(self,*k,**kw):
-+	lst=[str(v)for(p,v)in kw.items()if p!='env']
-+	h=Utils.h_list(lst)
-+	dir=self.bldnode.abspath()+os.sep+(not Utils.is_win32 and'.'or'')+'conf_check_'+Utils.to_hex(h)
-+	try:
-+		os.makedirs(dir)
-+	except OSError:
-+		pass
-+	try:
-+		os.stat(dir)
-+	except OSError:
-+		self.fatal('cannot use the configuration test folder %r'%dir)
-+	cachemode=getattr(Options.options,'confcache',None)
-+	if cachemode==CACHE_RESULTS:
-+		try:
-+			proj=ConfigSet.ConfigSet(os.path.join(dir,'cache_run_c_code'))
-+		except OSError:
-+			pass
-+		else:
-+			ret=proj['cache_run_c_code']
-+			if isinstance(ret,str)and ret.startswith('Test does not build'):
-+				self.fatal(ret)
-+			return ret
-+	bdir=os.path.join(dir,'testbuild')
-+	if not os.path.exists(bdir):
-+		os.makedirs(bdir)
-+	self.test_bld=bld=Build.BuildContext(top_dir=dir,out_dir=bdir)
-+	bld.init_dirs()
-+	bld.progress_bar=0
-+	bld.targets='*'
-+	if kw['compile_filename']:
-+		node=bld.srcnode.make_node(kw['compile_filename'])
-+		node.write(kw['code'])
-+	bld.logger=self.logger
-+	bld.all_envs.update(self.all_envs)
-+	bld.env=kw['env']
-+	o=bld(features=kw['features'],source=kw['compile_filename'],target='testprog')
-+	for k,v in kw.items():
-+		setattr(o,k,v)
-+	self.to_log("==>\n%s\n<=="%kw['code'])
-+	bld.targets='*'
-+	ret=-1
-+	try:
-+		try:
-+			bld.compile()
-+		except Errors.WafError:
-+			ret='Test does not build: %s'%Utils.ex_stack()
-+			self.fatal(ret)
-+		else:
-+			ret=getattr(bld,'retval',0)
-+	finally:
-+		proj=ConfigSet.ConfigSet()
-+		proj['cache_run_c_code']=ret
-+		proj.store(os.path.join(dir,'cache_run_c_code'))
-+	return ret
 + at conf
 +def check_cxx(self,*k,**kw):
 +	kw['compiler']='cxx'
@@ -4927,9 +5018,7 @@ Last-Update: 2014-03-11
 +def have_define(self,key):
 +	return(self.env.HAVE_PAT or'HAVE_%s')%Utils.quote_define_name(key)
 + at conf
-+def write_config_header(self,configfile='',guard='',top=False,env=None,defines=True,headers=False,remove=True,define_prefix=''):
-+	if env:
-+		Logs.warn('Cannot pass env to write_config_header')
++def write_config_header(self,configfile='',guard='',top=False,defines=True,headers=False,remove=True,define_prefix=''):
 +	if not configfile:configfile=WAF_CONFIG_H
 +	waf_guard=guard or'W_%s_WAF'%Utils.quote_define_name(configfile)
 +	node=top and self.bldnode or self.path.get_bld()
@@ -4952,12 +5041,16 @@ Last-Update: 2014-03-11
 +		for x in self.env[INCKEYS]:
 +			lst.append('#include <%s>'%x)
 +	if defines:
-+		for x in self.env[DEFKEYS]:
-+			if self.is_defined(x):
-+				val=self.get_define(x)
-+				lst.append('#define %s %s'%(define_prefix+x,val))
-+			else:
-+				lst.append('/* #undef %s */'%(define_prefix+x))
++		tbl={}
++		for k in self.env['DEFINES']:
++			a,_,b=k.partition('=')
++			tbl[a]=b
++		for k in self.env[DEFKEYS]:
++			try:
++				txt='#define %s%s %s'%(define_prefix,k,tbl[k])
++			except KeyError:
++				txt='/* #undef %s%s */'%(define_prefix,k)
++			lst.append(txt)
 +	return"\n".join(lst)
 + at conf
 +def cc_add_flags(conf):
@@ -4982,7 +5075,7 @@ Last-Update: 2014-03-11
 +		conf.env.DEST_OS=Utils.unversioned_sys_platform()
 +	conf.load('cxx')
 + at conf
-+def get_cc_version(conf,cc,gcc=False,icc=False):
++def get_cc_version(conf,cc,gcc=False,icc=False,clang=False):
 +	cmd=cc+['-dM','-E','-']
 +	env=conf.env.env or None
 +	try:
@@ -5000,8 +5093,10 @@ Last-Update: 2014-03-11
 +			conf.fatal('Could not determine the compiler type')
 +	if icc and out.find('__INTEL_COMPILER')<0:
 +		conf.fatal('Not icc/icpc')
++	if clang and out.find('__clang__')<0:
++		conf.fatal('Not clang/clang++')
 +	k={}
-+	if icc or gcc:
++	if icc or gcc or clang:
 +		out=out.splitlines()
 +		for line in out:
 +			lst=shlex.split(line)
@@ -5045,7 +5140,10 @@ Last-Update: 2014-03-11
 +			if isD('__clang__'):
 +				conf.env['CC_VERSION']=(k['__clang_major__'],k['__clang_minor__'],k['__clang_patchlevel__'])
 +			else:
-+				conf.env['CC_VERSION']=(k['__GNUC__'],k['__GNUC_MINOR__'],k['__GNUC_PATCHLEVEL__'])
++				try:
++					conf.env['CC_VERSION']=(k['__GNUC__'],k['__GNUC_MINOR__'],k['__GNUC_PATCHLEVEL__'])
++				except KeyError:
++					conf.env['CC_VERSION']=(k['__GNUC__'],k['__GNUC_MINOR__'],0)
 +	return k
 + at conf
 +def get_xlc_version(conf,cc):
@@ -5106,12 +5204,10 @@ Last-Update: 2014-03-11
 +			return 1
 + at conf
 +def multicheck(self,*k,**kw):
-+	self.start_msg(kw.get('msg','Executing %d configuration tests'%len(k)))
++	self.start_msg(kw.get('msg','Executing %d configuration tests'%len(k)),**kw)
 +	class par(object):
 +		def __init__(self):
 +			self.keep=False
-+			self.cache_global=Options.cache_global
-+			self.nocache=Options.options.nocache
 +			self.returned_tasks=[]
 +			self.task_sigs={}
 +		def total(self):
@@ -5139,9 +5235,9 @@ Last-Update: 2014-03-11
 +		x.logger.memhandler.flush()
 +	for x in tasks:
 +		if x.hasrun!=Task.SUCCESS:
-+			self.end_msg(kw.get('errmsg','no'),color='YELLOW')
++			self.end_msg(kw.get('errmsg','no'),color='YELLOW',**kw)
 +			self.fatal(kw.get('fatalmsg',None)or'One of the tests has failed, see the config.log for more information')
-+	self.end_msg('ok')
++	self.end_msg('ok',**kw)
 --- /dev/null
 +++ b/waflib/Tools/c_osx.py
 @@ -0,0 +1,120 @@
@@ -5267,7 +5363,7 @@ Last-Update: 2014-03-11
 +		self.outputs[0].write(txt)
 --- /dev/null
 +++ b/waflib/Tools/c_preproc.py
-@@ -0,0 +1,607 @@
+@@ -0,0 +1,610 @@
 +#! /usr/bin/env python
 +# encoding: utf-8
 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
@@ -5285,7 +5381,7 @@ Last-Update: 2014-03-11
 +	standard_includes=[]
 +use_trigraphs=0
 +strict_quotes=0
-+g_optrans={'not':'!','and':'&&','bitand':'&','and_eq':'&=','or':'||','bitor':'|','or_eq':'|=','xor':'^','xor_eq':'^=','compl':'~',}
++g_optrans={'not':'!','not_eq':'!','and':'&&','and_eq':'&=','or':'||','or_eq':'|=','xor':'^','xor_eq':'^=','bitand':'&','bitor':'|','compl':'~',}
 +re_lines=re.compile('^[ \t]*(#|%:)[ \t]*(ifdef|ifndef|if|else|elif|endif|include|import|define|undef|pragma)[ \t]*(.*)\r*$',re.IGNORECASE|re.MULTILINE)
 +re_mac=re.compile("^[a-zA-Z_]\w*")
 +re_fun=re.compile('^[a-zA-Z_][a-zA-Z0-9_]*[(]')
@@ -5341,17 +5437,17 @@ Last-Update: 2014-03-11
 +	elif d=='*':c=a*b
 +	elif d=='/':c=a/b
 +	elif d=='^':c=a^b
-+	elif d=='|':c=a|b
-+	elif d=='||':c=int(a or b)
-+	elif d=='&':c=a&b
-+	elif d=='&&':c=int(a and b)
 +	elif d=='==':c=int(a==b)
-+	elif d=='!=':c=int(a!=b)
++	elif d=='|'or d=='bitor':c=a|b
++	elif d=='||'or d=='or':c=int(a or b)
++	elif d=='&'or d=='bitand':c=a&b
++	elif d=='&&'or d=='and':c=int(a and b)
++	elif d=='!='or d=='not_eq':c=int(a!=b)
++	elif d=='^'or d=='xor':c=int(a^b)
 +	elif d=='<=':c=int(a<=b)
 +	elif d=='<':c=int(a<b)
 +	elif d=='>':c=int(a>b)
 +	elif d=='>=':c=int(a>=b)
-+	elif d=='^':c=int(a^b)
 +	elif d=='<<':c=a<<b
 +	elif d=='>>':c=a>>b
 +	else:c=0
@@ -5651,7 +5747,8 @@ Last-Update: 2014-03-11
 +			return'"',toks[0][1]
 +	else:
 +		if toks[0][1]=='<'and toks[-1][1]=='>':
-+			return stringize(toks).lstrip('<').rstrip('>')
++			ret='<',stringize(toks).lstrip('<').rstrip('>')
++			return ret
 +	raise PreprocError("could not parse include %s."%txt)
 +def parse_char(txt):
 +	if not txt:raise PreprocError("attempted to parse a null char")
@@ -5680,7 +5777,9 @@ Last-Update: 2014-03-11
 +			v=m(name)
 +			if v:
 +				if name==IDENT:
-+					try:v=g_optrans[v];name=OP
++					try:
++						g_optrans[v];
++						name=OP
 +					except KeyError:
 +						if v.lower()=="true":
 +							v=1
@@ -6033,7 +6132,7 @@ Last-Update: 2014-03-11
 +	return tmp[0]
 --- /dev/null
 +++ b/waflib/Tools/ccroot.py
-@@ -0,0 +1,405 @@
+@@ -0,0 +1,416 @@
 +#! /usr/bin/env python
 +# encoding: utf-8
 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
@@ -6117,6 +6216,7 @@ Last-Update: 2014-03-11
 +		self.set_outputs(target)
 +class stlink_task(link_task):
 +	run_str='${AR} ${ARFLAGS} ${AR_TGT_F}${TGT} ${AR_SRC_F}${SRC}'
++	chmod=Utils.O644
 +def rm_tgt(cls):
 +	old=cls.run
 +	def wrap(self):
@@ -6147,7 +6247,7 @@ Last-Update: 2014-03-11
 +	except AttributeError:
 +		inst_to=self.link_task.__class__.inst_to
 +	if inst_to:
-+		self.install_task=self.bld.install_files(inst_to,self.link_task.outputs[:],env=self.env,chmod=self.link_task.chmod)
++		self.install_task=self.bld.install_files(inst_to,self.link_task.outputs[:],env=self.env,chmod=self.link_task.chmod,task=self.link_task)
 + at taskgen_method
 +def use_rec(self,name,**kw):
 +	if name in self.tmp_use_not or name in self.tmp_use_seen:
@@ -6175,6 +6275,8 @@ Last-Update: 2014-03-11
 +			y.tmp_use_var='STLIB'
 +	p=self.tmp_use_prec
 +	for x in self.to_list(getattr(y,'use',[])):
++		if self.env["STLIB_"+x]:
++			continue
 +		try:
 +			p[x].append(name)
 +		except KeyError:
@@ -6226,11 +6328,11 @@ Last-Update: 2014-03-11
 +		y=self.bld.get_tgen_by_name(x)
 +		var=y.tmp_use_var
 +		if var and link_task:
-+			if var=='LIB'or y.tmp_use_stlib:
++			if var=='LIB'or y.tmp_use_stlib or x in names:
 +				self.env.append_value(var,[y.target[y.target.rfind(os.sep)+1:]])
 +				self.link_task.dep_nodes.extend(y.link_task.outputs)
 +				tmp_path=y.link_task.outputs[0].parent.path_from(self.bld.bldnode)
-+				self.env.append_value(var+'PATH',[tmp_path])
++				self.env.append_unique(var+'PATH',[tmp_path])
 +		else:
 +			if y.tmp_use_objects:
 +				self.add_objects_from_tgen(y)
@@ -6241,11 +6343,11 @@ Last-Update: 2014-03-11
 +	for x in names:
 +		try:
 +			y=self.bld.get_tgen_by_name(x)
-+		except Exception:
++		except Errors.WafError:
 +			if not self.env['STLIB_'+x]and not x in self.uselib:
 +				self.uselib.append(x)
 +		else:
-+			for k in self.to_list(getattr(y,'uselib',[])):
++			for k in self.to_list(getattr(y,'use',[])):
 +				if not self.env['STLIB_'+k]and not k in self.uselib:
 +					self.uselib.append(k)
 + at taskgen_method
@@ -6274,16 +6376,17 @@ Last-Update: 2014-03-11
 +def propagate_uselib_vars(self):
 +	_vars=self.get_uselib_vars()
 +	env=self.env
-+	for x in _vars:
-+		y=x.lower()
-+		env.append_unique(x,self.to_list(getattr(self,y,[])))
-+	for x in self.features:
-+		for var in _vars:
-+			compvar='%s_%s'%(var,x)
-+			env.append_value(var,env[compvar])
-+	for x in self.to_list(getattr(self,'uselib',[])):
-+		for v in _vars:
-+			env.append_value(v,env[v+'_'+x])
++	app=env.append_value
++	feature_uselib=self.features+self.to_list(getattr(self,'uselib',[]))
++	for var in _vars:
++		y=var.lower()
++		val=getattr(self,y,[])
++		if val:
++			app(var,self.to_list(val))
++		for x in feature_uselib:
++			val=env['%s_%s'%(var,x)]
++			if val:
++				app(var,val)
 + at feature('cshlib','cxxshlib','fcshlib')
 + at after_method('apply_link')
 +def apply_implib(self):
@@ -6307,13 +6410,18 @@ Last-Update: 2014-03-11
 +			self.link_task.dep_nodes.append(node)
 +		else:
 +			self.link_task.inputs.append(node)
-+	try:
-+		inst_to=self.install_path
-+	except AttributeError:
-+		inst_to=self.link_task.__class__.inst_to
-+	if not inst_to:
-+		return
-+	self.implib_install_task=self.bld.install_as('${LIBDIR}/%s'%implib.name,implib,self.env)
++	if getattr(self,'install_task',None):
++		try:
++			inst_to=self.install_path_implib
++		except AttributeError:
++			try:
++				inst_to=self.install_path
++			except AttributeError:
++				inst_to='${IMPLIBDIR}'
++				self.install_task.dest='${BINDIR}'
++				if not self.env.IMPLIBDIR:
++					self.env.IMPLIBDIR=self.env.LIBDIR
++		self.implib_install_task=self.bld.install_files(inst_to,implib,env=self.env,chmod=self.link_task.chmod,task=self.link_task)
 +re_vnum=re.compile('^([1-9]\\d*|0)[.]([1-9]\\d*|0)[.]([1-9]\\d*|0)$')
 + at feature('cshlib','cxxshlib','dshlib','fcshlib','vnum')
 + at after_method('apply_link','propagate_uselib_vars')
@@ -6363,6 +6471,8 @@ Last-Update: 2014-03-11
 +	color='CYAN'
 +	quient=True
 +	ext_in=['.bin']
++	def keyword(self):
++		return'Symlinking'
 +	def run(self):
 +		for x in self.outputs:
 +			path=x.abspath()
@@ -6440,23 +6550,73 @@ Last-Update: 2014-03-11
 +		obj=self.path.find_resource(obj)
 +	return self(features='fake_obj',source=obj,name=obj.name)
 --- /dev/null
++++ b/waflib/Tools/clang.py
+@@ -0,0 +1,20 @@
++#! /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
++from waflib.Tools import ccroot,ar,gcc
++from waflib.Configure import conf
++ at conf
++def find_clang(conf):
++	cc=conf.find_program('clang',var='CC')
++	conf.get_cc_version(cc,clang=True)
++	conf.env.CC_NAME='clang'
++def configure(conf):
++	conf.find_clang()
++	conf.find_ar()
++	conf.gcc_common_flags()
++	conf.gcc_modifier_platform()
++	conf.cc_load_tools()
++	conf.cc_add_flags()
++	conf.link_add_flags()
+--- /dev/null
++++ b/waflib/Tools/clangxx.py
+@@ -0,0 +1,20 @@
++#! /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
++from waflib.Tools import ccroot,ar,gxx
++from waflib.Configure import conf
++ at conf
++def find_clangxx(conf):
++	cxx=conf.find_program('clang++',var='CXX')
++	conf.get_cc_version(cxx,clang=True)
++	conf.env.CXX_NAME='clang'
++def configure(conf):
++	conf.find_clangxx()
++	conf.find_ar()
++	conf.gxx_common_flags()
++	conf.gxx_modifier_platform()
++	conf.cxx_load_tools()
++	conf.cxx_add_flags()
++	conf.link_add_flags()
+--- /dev/null
 +++ b/waflib/Tools/compiler_c.py
-@@ -0,0 +1,39 @@
+@@ -0,0 +1,40 @@
 +#! /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,imp,types
++import os,sys,imp,types,re
 +from waflib.Tools import ccroot
 +from waflib import Utils,Configure
 +from waflib.Logs import debug
-+c_compiler={'win32':['msvc','gcc'],'cygwin':['gcc'],'darwin':['gcc'],'aix':['xlc','gcc'],'linux':['gcc','icc'],'sunos':['suncc','gcc'],'irix':['gcc','irixcc'],'hpux':['gcc'],'gnu':['gcc'],'java':['gcc','msvc','icc'],'default':['gcc'],}
++c_compiler={'win32':['msvc','gcc','clang'],'cygwin':['gcc'],'darwin':['clang','gcc'],'aix':['xlc','gcc','clang'],'linux':['gcc','clang','icc'],'sunos':['suncc','gcc'],'irix':['gcc','irixcc'],'hpux':['gcc'],'gnu':['gcc','clang'],'java':['gcc','msvc','clang','icc'],'default':['gcc','clang'],}
++def default_compilers():
++	build_platform=Utils.unversioned_sys_platform()
++	possible_compiler_list=c_compiler.get(build_platform,c_compiler['default'])
++	return' '.join(possible_compiler_list)
 +def configure(conf):
-+	try:test_for_compiler=conf.options.check_c_compiler
++	try:test_for_compiler=conf.options.check_c_compiler or default_compilers()
 +	except AttributeError:conf.fatal("Add options(opt): opt.load('compiler_c')")
-+	for compiler in test_for_compiler.split():
++	for compiler in re.split('[ ,]+',test_for_compiler):
 +		conf.env.stash()
-+		conf.start_msg('Checking for %r (c compiler)'%compiler)
++		conf.start_msg('Checking for %r (C compiler)'%compiler)
 +		try:
 +			conf.load(compiler)
 +		except conf.errors.ConfigurationError ,e:
@@ -6470,35 +6630,36 @@ Last-Update: 2014-03-11
 +				break
 +			conf.end_msg(False)
 +	else:
-+		conf.fatal('could not configure a c compiler!')
++		conf.fatal('could not configure a C compiler!')
 +def options(opt):
++	test_for_compiler=default_compilers()
 +	opt.load_special_tools('c_*.py',ban=['c_dumbpreproc.py'])
-+	global c_compiler
-+	build_platform=Utils.unversioned_sys_platform()
-+	possible_compiler_list=c_compiler[build_platform in c_compiler and build_platform or'default']
-+	test_for_compiler=' '.join(possible_compiler_list)
-+	cc_compiler_opts=opt.add_option_group("C Compiler Options")
-+	cc_compiler_opts.add_option('--check-c-compiler',default="%s"%test_for_compiler,help='On this platform (%s) the following C-Compiler will be checked by default: "%s"'%(build_platform,test_for_compiler),dest="check_c_compiler")
++	cc_compiler_opts=opt.add_option_group('Configuration options')
++	cc_compiler_opts.add_option('--check-c-compiler',default=None,help='list of C compilers to try [%s]'%test_for_compiler,dest="check_c_compiler")
 +	for x in test_for_compiler.split():
 +		opt.load('%s'%x)
 --- /dev/null
 +++ b/waflib/Tools/compiler_cxx.py
-@@ -0,0 +1,39 @@
+@@ -0,0 +1,40 @@
 +#! /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,imp,types
++import os,sys,imp,types,re
 +from waflib.Tools import ccroot
 +from waflib import Utils,Configure
 +from waflib.Logs import debug
-+cxx_compiler={'win32':['msvc','g++'],'cygwin':['g++'],'darwin':['g++'],'aix':['xlc++','g++'],'linux':['g++','icpc'],'sunos':['sunc++','g++'],'irix':['g++'],'hpux':['g++'],'gnu':['g++'],'java':['g++','msvc','icpc'],'default':['g++']}
++cxx_compiler={'win32':['msvc','g++','clang++'],'cygwin':['g++'],'darwin':['clang++','g++'],'aix':['xlc++','g++','clang++'],'linux':['g++','clang++','icpc'],'sunos':['sunc++','g++'],'irix':['g++'],'hpux':['g++'],'gnu':['g++','clang++'],'java':['g++','msvc','clang++','icpc'],'default':['g++','clang++']}
++def default_compilers():
++	build_platform=Utils.unversioned_sys_platform()
++	possible_compiler_list=cxx_compiler.get(build_platform,cxx_compiler['default'])
++	return' '.join(possible_compiler_list)
 +def configure(conf):
-+	try:test_for_compiler=conf.options.check_cxx_compiler
++	try:test_for_compiler=conf.options.check_cxx_compiler or default_compilers()
 +	except AttributeError:conf.fatal("Add options(opt): opt.load('compiler_cxx')")
-+	for compiler in test_for_compiler.split():
++	for compiler in re.split('[ ,]+',test_for_compiler):
 +		conf.env.stash()
-+		conf.start_msg('Checking for %r (c++ compiler)'%compiler)
++		conf.start_msg('Checking for %r (C++ compiler)'%compiler)
 +		try:
 +			conf.load(compiler)
 +		except conf.errors.ConfigurationError ,e:
@@ -6512,30 +6673,34 @@ Last-Update: 2014-03-11
 +				break
 +			conf.end_msg(False)
 +	else:
-+		conf.fatal('could not configure a c++ compiler!')
++		conf.fatal('could not configure a C++ compiler!')
 +def options(opt):
++	test_for_compiler=default_compilers()
 +	opt.load_special_tools('cxx_*.py')
-+	global cxx_compiler
-+	build_platform=Utils.unversioned_sys_platform()
-+	possible_compiler_list=cxx_compiler[build_platform in cxx_compiler and build_platform or'default']
-+	test_for_compiler=' '.join(possible_compiler_list)
-+	cxx_compiler_opts=opt.add_option_group('C++ Compiler Options')
-+	cxx_compiler_opts.add_option('--check-cxx-compiler',default="%s"%test_for_compiler,help='On this platform (%s) the following C++ Compiler will be checked by default: "%s"'%(build_platform,test_for_compiler),dest="check_cxx_compiler")
++	cxx_compiler_opts=opt.add_option_group('Configuration options')
++	cxx_compiler_opts.add_option('--check-cxx-compiler',default=None,help='list of C++ compilers to try [%s]'%test_for_compiler,dest="check_cxx_compiler")
 +	for x in test_for_compiler.split():
 +		opt.load('%s'%x)
 --- /dev/null
 +++ b/waflib/Tools/compiler_d.py
-@@ -0,0 +1,29 @@
+@@ -0,0 +1,37 @@
 +#! /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,imp,types
++import os,sys,imp,types,re
 +from waflib import Utils,Configure,Options,Logs
++d_compiler={'default':['gdc','dmd','ldc2']}
++def default_compilers():
++	build_platform=Utils.unversioned_sys_platform()
++	possible_compiler_list=d_compiler.get(build_platform,d_compiler['default'])
++	return' '.join(possible_compiler_list)
 +def configure(conf):
-+	for compiler in conf.options.dcheck.split(','):
++	try:test_for_compiler=conf.options.check_d_compiler or default_compilers()
++	except AttributeError:conf.fatal("Add options(opt): opt.load('compiler_d')")
++	for compiler in re.split('[ ,]+',test_for_compiler):
 +		conf.env.stash()
-+		conf.start_msg('Checking for %r (d compiler)'%compiler)
++		conf.start_msg('Checking for %r (D compiler)'%compiler)
 +		try:
 +			conf.load(compiler)
 +		except conf.errors.ConfigurationError ,e:
@@ -6549,34 +6714,34 @@ Last-Update: 2014-03-11
 +				break
 +			conf.end_msg(False)
 +	else:
-+		conf.fatal('no suitable d compiler was found')
++		conf.fatal('could not configure a D compiler!')
 +def options(opt):
-+	d_compiler_opts=opt.add_option_group('D Compiler Options')
-+	d_compiler_opts.add_option('--check-d-compiler',default='gdc,dmd,ldc2',action='store',help='check for the compiler [Default:gdc,dmd,ldc2]',dest='dcheck')
-+	for d_compiler in['gdc','dmd','ldc2']:
-+		opt.load('%s'%d_compiler)
++	test_for_compiler=default_compilers()
++	d_compiler_opts=opt.add_option_group('Configuration options')
++	d_compiler_opts.add_option('--check-d-compiler',default=None,help='list of D compilers to try [%s]'%test_for_compiler,dest='check_d_compiler')
++	for x in test_for_compiler.split():
++		opt.load('%s'%x)
 --- /dev/null
 +++ b/waflib/Tools/compiler_fc.py
-@@ -0,0 +1,43 @@
+@@ -0,0 +1,39 @@
 +#! /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,imp,types
++import os,sys,imp,types,re
 +from waflib import Utils,Configure,Options,Logs,Errors
 +from waflib.Tools import fc
 +fc_compiler={'win32':['gfortran','ifort'],'darwin':['gfortran','g95','ifort'],'linux':['gfortran','g95','ifort'],'java':['gfortran','g95','ifort'],'default':['gfortran'],'aix':['gfortran']}
-+def __list_possible_compiler(platform):
-+	try:
-+		return fc_compiler[platform]
-+	except KeyError:
-+		return fc_compiler["default"]
++def default_compilers():
++	build_platform=Utils.unversioned_sys_platform()
++	possible_compiler_list=fc_compiler.get(build_platform,fc_compiler['default'])
++	return' '.join(possible_compiler_list)
 +def configure(conf):
-+	try:test_for_compiler=conf.options.check_fc
++	try:test_for_compiler=conf.options.check_fortran_compiler or default_compilers()
 +	except AttributeError:conf.fatal("Add options(opt): opt.load('compiler_fc')")
-+	for compiler in test_for_compiler.split():
++	for compiler in re.split('[ ,]+',test_for_compiler):
 +		conf.env.stash()
-+		conf.start_msg('Checking for %r (fortran compiler)'%compiler)
++		conf.start_msg('Checking for %r (Fortran compiler)'%compiler)
 +		try:
 +			conf.load(compiler)
 +		except conf.errors.ConfigurationError ,e:
@@ -6590,17 +6755,14 @@ Last-Update: 2014-03-11
 +				break
 +			conf.end_msg(False)
 +	else:
-+		conf.fatal('could not configure a fortran compiler!')
++		conf.fatal('could not configure a Fortran compiler!')
 +def options(opt):
++	test_for_compiler=default_compilers()
 +	opt.load_special_tools('fc_*.py')
-+	build_platform=Utils.unversioned_sys_platform()
-+	detected_platform=Options.platform
-+	possible_compiler_list=__list_possible_compiler(detected_platform)
-+	test_for_compiler=' '.join(possible_compiler_list)
-+	fortran_compiler_opts=opt.add_option_group("Fortran Compiler Options")
-+	fortran_compiler_opts.add_option('--check-fortran-compiler',default="%s"%test_for_compiler,help='On this platform (%s) the following Fortran Compiler will be checked by default: "%s"'%(detected_platform,test_for_compiler),dest="check_fc")
-+	for compiler in test_for_compiler.split():
-+		opt.load('%s'%compiler)
++	fortran_compiler_opts=opt.add_option_group('Configuration options')
++	fortran_compiler_opts.add_option('--check-fortran-compiler',default=None,help='list of Fortran compiler to try [%s]'%test_for_compiler,dest="check_fortran_compiler")
++	for x in test_for_compiler.split():
++		opt.load('%s'%x)
 --- /dev/null
 +++ b/waflib/Tools/cs.py
 @@ -0,0 +1,132 @@
@@ -6752,7 +6914,7 @@ Last-Update: 2014-03-11
 +if not'.c'in TaskGen.task_gen.mappings:
 +	TaskGen.task_gen.mappings['.c']=TaskGen.task_gen.mappings['.cpp']
 +class cxx(Task.Task):
-+	run_str='${CXX} ${ARCH_ST:ARCH} ${CXXFLAGS} ${CPPFLAGS} ${FRAMEWORKPATH_ST:FRAMEWORKPATH} ${CPPPATH_ST:INCPATHS} ${DEFINES_ST:DEFINES} ${CXX_SRC_F}${SRC} ${CXX_TGT_F}${TGT}'
++	run_str='${CXX} ${ARCH_ST:ARCH} ${CXXFLAGS} ${CPPFLAGS} ${FRAMEWORKPATH_ST:FRAMEWORKPATH} ${CPPPATH_ST:INCPATHS} ${DEFINES_ST:DEFINES} ${CXX_SRC_F}${SRC} ${CXX_TGT_F}${TGT[0].abspath()}'
 +	vars=['CXXDEPS']
 +	ext_in=['.h']
 +	scan=c_preproc.scan
@@ -7058,9 +7220,9 @@ Last-Update: 2014-03-11
 + at conf
 +def find_dmd(conf):
 +	conf.find_program(['dmd','dmd2','ldc'],var='D')
-+	out=conf.cmd_and_log([conf.env.D,'--help'])
++	out=conf.cmd_and_log(conf.env.D+['--help'])
 +	if out.find("D Compiler v")==-1:
-+		out=conf.cmd_and_log([conf.env.D,'-version'])
++		out=conf.cmd_and_log(conf.env.D+['-version'])
 +		if out.find("based on DMD v1.")==-1:
 +			conf.fatal("detected compiler is not dmd/ldc")
 + at conf
@@ -7090,7 +7252,7 @@ Last-Update: 2014-03-11
 +def configure(conf):
 +	conf.find_dmd()
 +	if sys.platform=='win32':
-+		out=conf.cmd_and_log([conf.env.D,'--help'])
++		out=conf.cmd_and_log(conf.env.D+['--help'])
 +		if out.find("D Compiler v2.")>-1:
 +			conf.fatal('dmd2 on Windows is not supported, use gdc or ldc2 instead')
 +	conf.load('ar')
@@ -7265,7 +7427,7 @@ Last-Update: 2014-03-11
 +	pass
 --- /dev/null
 +++ b/waflib/Tools/fc.py
-@@ -0,0 +1,116 @@
+@@ -0,0 +1,114 @@
 +#! /usr/bin/env python
 +# encoding: utf-8
 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
@@ -7357,8 +7519,6 @@ Last-Update: 2014-03-11
 +class fcshlib(fcprogram):
 +	inst_to='${LIBDIR}'
 +class fcprogram_test(fcprogram):
-+	def can_retrieve_cache(self):
-+		return False
 +	def runnable_status(self):
 +		ret=super(fcprogram_test,self).runnable_status()
 +		if ret==Task.SKIP_ME:
@@ -7389,10 +7549,10 @@ Last-Update: 2014-03-11
 +# encoding: utf-8
 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
 +
-+import re,shutil,os,sys,string,shlex
++import re,os,sys,shlex
 +from waflib.Configure import conf
-+from waflib.TaskGen import feature,after_method,before_method
-+from waflib import Build,Utils
++from waflib.TaskGen import feature,before_method
++from waflib import Utils
 +FC_FRAGMENT='        program main\n        end     program main\n'
 +FC_FRAGMENT2='        PROGRAM MAIN\n        END\n'
 + at conf
@@ -7502,7 +7662,7 @@ Last-Update: 2014-03-11
 + at conf
 +def check_fortran_verbose_flag(self,*k,**kw):
 +	self.start_msg('fortran link verbose flag')
-+	for x in['-v','--verbose','-verbose','-V']:
++	for x in('-v','--verbose','-verbose','-V'):
 +		try:
 +			self.check_cc(features='fc fcprogram_test',fragment=FC_FRAGMENT2,compile_filename='test.f',linkflags=[x],mandatory=True)
 +		except self.errors.ConfigurationError:
@@ -7535,32 +7695,32 @@ Last-Update: 2014-03-11
 +	return final_flags
 +SPACE_OPTS=re.compile('^-[LRuYz]$')
 +NOSPACE_OPTS=re.compile('^-[RL]')
++def _parse_flink_token(lexer,token,tmp_flags):
++	if _match_ignore(token):
++		pass
++	elif token.startswith('-lkernel32')and sys.platform=='cygwin':
++		tmp_flags.append(token)
++	elif SPACE_OPTS.match(token):
++		t=lexer.get_token()
++		if t.startswith('P,'):
++			t=t[2:]
++		for opt in t.split(os.pathsep):
++			tmp_flags.append('-L%s'%opt)
++	elif NOSPACE_OPTS.match(token):
++		tmp_flags.append(token)
++	elif POSIX_LIB_FLAGS.match(token):
++		tmp_flags.append(token)
++	else:
++		pass
++	t=lexer.get_token()
++	return t
 +def _parse_flink_line(line,final_flags):
 +	lexer=shlex.shlex(line,posix=True)
 +	lexer.whitespace_split=True
 +	t=lexer.get_token()
 +	tmp_flags=[]
 +	while t:
-+		def parse(token):
-+			if _match_ignore(token):
-+				pass
-+			elif token.startswith('-lkernel32')and sys.platform=='cygwin':
-+				tmp_flags.append(token)
-+			elif SPACE_OPTS.match(token):
-+				t=lexer.get_token()
-+				if t.startswith('P,'):
-+					t=t[2:]
-+				for opt in t.split(os.pathsep):
-+					tmp_flags.append('-L%s'%opt)
-+			elif NOSPACE_OPTS.match(token):
-+				tmp_flags.append(token)
-+			elif POSIX_LIB_FLAGS.match(token):
-+				tmp_flags.append(token)
-+			else:
-+				pass
-+			t=lexer.get_token()
-+			return t
-+		t=parse(t)
++		t=_parse_flink_token(lexer,t,tmp_flags)
 +	final_flags.extend(tmp_flags)
 +	return final_flags
 + at conf
@@ -7627,9 +7787,9 @@ Last-Update: 2014-03-11
 +	bld(features='fc fcstlib',source='test.f',target='test')
 +	bld(features='c fcprogram',source='main.c',target='app',use='test')
 +def mangling_schemes():
-+	for u in['_','']:
-+		for du in['','_']:
-+			for c in["lower","upper"]:
++	for u in('_',''):
++		for du in('','_'):
++			for c in("lower","upper"):
 +				yield(u,du,c)
 +def mangle_name(u,du,c,name):
 +	return getattr(name,c)()+u+(name.find('_')!=-1 and du or'')
@@ -7661,7 +7821,7 @@ Last-Update: 2014-03-11
 +	self.env['fcshlib_PATTERN']=self.env['pyext_PATTERN']
 + at conf
 +def detect_openmp(self):
-+	for x in['-fopenmp','-openmp','-mp','-xopenmp','-omp','-qsmp=omp']:
++	for x in('-fopenmp','-openmp','-mp','-xopenmp','-omp','-qsmp=omp'):
 +		try:
 +			self.check_fc(msg='Checking for OpenMP flag %s'%x,fragment='program main\n  call omp_get_num_threads()\nend program main',fcflags=x,linkflags=x,uselib_store='OPENMP')
 +		except self.errors.ConfigurationError:
@@ -7774,11 +7934,11 @@ Last-Update: 2014-03-11
 +def configure(conf):
 +	conf.find_program('flex',var='FLEX')
 +	conf.env.FLEXFLAGS=['-t']
-+	if re.search(r"\\msys\\[0-9.]+\\bin\\flex.exe$",conf.env.FLEX):
++	if re.search(r"\\msys\\[0-9.]+\\bin\\flex.exe$",conf.env.FLEX[0]):
 +		conf.env.FLEX_MSYS=True
 --- /dev/null
 +++ b/waflib/Tools/g95.py
-@@ -0,0 +1,55 @@
+@@ -0,0 +1,54 @@
 +#! /usr/bin/env python
 +# encoding: utf-8
 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
@@ -7790,7 +7950,6 @@ Last-Update: 2014-03-11
 + at conf
 +def find_g95(conf):
 +	fc=conf.find_program('g95',var='FC')
-+	fc=conf.cmd_to_list(fc)
 +	conf.get_g95_version(fc)
 +	conf.env.FC_NAME='G95'
 + at conf
@@ -7856,15 +8015,15 @@ Last-Update: 2014-03-11
 +# encoding: utf-8
 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
 +
++import os,sys
++from waflib import Configure,Options,Utils
 +from waflib.Tools import ccroot,ar
 +from waflib.Configure import conf
 + at conf
 +def find_gcc(conf):
 +	cc=conf.find_program(['gcc','cc'],var='CC')
-+	cc=conf.cmd_to_list(cc)
 +	conf.get_cc_version(cc,gcc=True)
 +	conf.env.CC_NAME='gcc'
-+	conf.env.CC=cc
 + at conf
 +def gcc_common_flags(conf):
 +	v=conf.env
@@ -7963,8 +8122,8 @@ Last-Update: 2014-03-11
 + at conf
 +def find_gdc(conf):
 +	conf.find_program('gdc',var='D')
-+	out=conf.cmd_and_log([conf.env.D,'--version'])
-+	if out.find("gdc ")==-1:
++	out=conf.cmd_and_log(conf.env.D+['--version'])
++	if out.find("gdc")==-1:
 +		conf.fatal("detected compiler is not gdc")
 + at conf
 +def common_flags_gdc(conf):
@@ -7991,7 +8150,7 @@ Last-Update: 2014-03-11
 +	conf.d_platform_flags()
 --- /dev/null
 +++ b/waflib/Tools/gfortran.py
-@@ -0,0 +1,69 @@
+@@ -0,0 +1,68 @@
 +#! /usr/bin/env python
 +# encoding: utf-8
 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
@@ -8003,7 +8162,6 @@ Last-Update: 2014-03-11
 + at conf
 +def find_gfortran(conf):
 +	fc=conf.find_program(['gfortran','g77'],var='FC')
-+	fc=conf.cmd_to_list(fc)
 +	conf.get_gfortran_version(fc)
 +	conf.env.FC_NAME='GFORTRAN'
 + at conf
@@ -8063,14 +8221,15 @@ Last-Update: 2014-03-11
 +	conf.gfortran_modifier_platform()
 --- /dev/null
 +++ b/waflib/Tools/glib2.py
-@@ -0,0 +1,173 @@
+@@ -0,0 +1,234 @@
 +#! /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
-+from waflib import Task,Utils,Options,Errors,Logs
-+from waflib.TaskGen import taskgen_method,before_method,after_method,feature
++from waflib import Context,Task,Utils,Options,Errors,Logs
++from waflib.TaskGen import taskgen_method,before_method,after_method,feature,extension
++from waflib.Configure import conf
 + at taskgen_method
 +def add_marshal_file(self,filename,prefix):
 +	if not hasattr(self,'marshal_list'):
@@ -8164,14 +8323,6 @@ Last-Update: 2014-03-11
 +	if type(filename_list)!='list':
 +		filename_list=[filename_list]
 +	self.settings_enum_files=filename_list
-+def r_change_ext(self,ext):
-+	name=self.name
-+	k=name.rfind('.')
-+	if k>=0:
-+		name=name[:k]+ext
-+	else:
-+		name=name+ext
-+	return self.parent.find_or_declare([name])
 + at feature('glib2')
 +def process_settings(self):
 +	enums_tgt_node=[]
@@ -8202,7 +8353,7 @@ Last-Update: 2014-03-11
 +		source_list=enums_tgt_node+[schema_node]
 +		schema_task.set_inputs(source_list)
 +		schema_task.env['GLIB_COMPILE_SCHEMAS_OPTIONS']=[("--schema-file="+k.abspath())for k in source_list]
-+		target_node=r_change_ext(schema_node,'.xml.valid')
++		target_node=schema_node.change_ext('.xml.valid')
 +		schema_task.set_outputs(target_node)
 +		schema_task.env['GLIB_VALIDATE_SCHEMA_OUTPUT']=target_node.abspath()
 +	def compile_schemas_callback(bld):
@@ -8221,10 +8372,69 @@ Last-Update: 2014-03-11
 +class glib_validate_schema(Task.Task):
 +	run_str='rm -f ${GLIB_VALIDATE_SCHEMA_OUTPUT} && ${GLIB_COMPILE_SCHEMAS} --dry-run ${GLIB_COMPILE_SCHEMAS_OPTIONS} && touch ${GLIB_VALIDATE_SCHEMA_OUTPUT}'
 +	color='PINK'
-+def configure(conf):
++ at extension('.gresource.xml')
++def process_gresource_source(self,node):
++	if not self.env['GLIB_COMPILE_RESOURCES']:
++		raise Errors.WafError("Unable to process GResource file - glib-compile-resources was not found during configure")
++	if'gresource'in self.features:
++		return
++	h_node=node.change_ext('_xml.h')
++	c_node=node.change_ext('_xml.c')
++	self.create_task('glib_gresource_source',node,[h_node,c_node])
++	self.source.append(c_node)
++ at feature('gresource')
++def process_gresource_bundle(self):
++	for i in self.to_list(self.source):
++		node=self.path.find_resource(i)
++		task=self.create_task('glib_gresource_bundle',node,node.change_ext(''))
++		inst_to=getattr(self,'install_path',None)
++		if inst_to:
++			self.bld.install_files(inst_to,task.outputs)
++class glib_gresource_base(Task.Task):
++	color='BLUE'
++	base_cmd='${GLIB_COMPILE_RESOURCES} --sourcedir=${SRC[0].parent.srcpath()} --sourcedir=${SRC[0].bld_dir()}'
++	def scan(self):
++		bld=self.generator.bld
++		kw={}
++		try:
++			if not kw.get('cwd',None):
++				kw['cwd']=bld.cwd
++		except AttributeError:
++			bld.cwd=kw['cwd']=bld.variant_dir
++		kw['quiet']=Context.BOTH
++		cmd=Utils.subst_vars('${GLIB_COMPILE_RESOURCES} --sourcedir=%s --sourcedir=%s --generate-dependencies %s'%(self.inputs[0].parent.srcpath(),self.inputs[0].bld_dir(),self.inputs[0].bldpath()),self.env)
++		output=bld.cmd_and_log(cmd,**kw)
++		nodes=[]
++		names=[]
++		for dep in output.splitlines():
++			if dep:
++				node=bld.bldnode.find_node(dep)
++				if node:
++					nodes.append(node)
++				else:
++					names.append(dep)
++		return(nodes,names)
++class glib_gresource_source(glib_gresource_base):
++	vars=['GLIB_COMPILE_RESOURCES']
++	fun_h=Task.compile_fun_shell(glib_gresource_base.base_cmd+' --target=${TGT[0].abspath()} --generate-header ${SRC}')
++	fun_c=Task.compile_fun_shell(glib_gresource_base.base_cmd+' --target=${TGT[1].abspath()} --generate-source ${SRC}')
++	ext_out=['.h']
++	def run(self):
++		return self.fun_h[0](self)or self.fun_c[0](self)
++class glib_gresource_bundle(glib_gresource_base):
++	run_str=glib_gresource_base.base_cmd+' --target=${TGT} ${SRC}'
++	shell=True
++ at conf
++def find_glib_genmarshal(conf):
 +	conf.find_program('glib-genmarshal',var='GLIB_GENMARSHAL')
-+	conf.find_perl_program('glib-mkenums',var='GLIB_MKENUMS')
-+	conf.find_program('glib-compile-schemas',var='GLIB_COMPILE_SCHEMAS',mandatory=False)
++ at conf
++def find_glib_mkenums(conf):
++	if not conf.env.PERL:
++		conf.find_program('perl',var='PERL')
++	conf.find_program('glib-mkenums',interpreter='PERL',var='GLIB_MKENUMS')
++ at conf
++def find_glib_compile_schemas(conf):
++	conf.find_program('glib-compile-schemas',var='GLIB_COMPILE_SCHEMAS')
 +	def getstr(varname):
 +		return getattr(Options.options,varname,getattr(conf.env,varname,''))
 +	gsettingsschemadir=getstr('GSETTINGSSCHEMADIR')
@@ -8235,8 +8445,17 @@ Last-Update: 2014-03-11
 +			datadir=os.path.join(prefix,'share')
 +		gsettingsschemadir=os.path.join(datadir,'glib-2.0','schemas')
 +	conf.env['GSETTINGSSCHEMADIR']=gsettingsschemadir
++ at conf
++def find_glib_compile_resources(conf):
++	conf.find_program('glib-compile-resources',var='GLIB_COMPILE_RESOURCES')
++def configure(conf):
++	conf.find_glib_genmarshal()
++	conf.find_glib_mkenums()
++	conf.find_glib_compile_schemas(mandatory=False)
++	conf.find_glib_compile_resources(mandatory=False)
 +def options(opt):
-+	opt.add_option('--gsettingsschemadir',help='GSettings schema location [Default: ${datadir}/glib-2.0/schemas]',default='',dest='GSETTINGSSCHEMADIR')
++	gr=opt.add_option_group('Installation directories')
++	gr.add_option('--gsettingsschemadir',help='GSettings schema location [DATADIR/glib-2.0/schemas]',default='',dest='GSETTINGSSCHEMADIR')
 --- /dev/null
 +++ b/waflib/Tools/gnu_dirs.py
 @@ -0,0 +1,65 @@
@@ -8244,28 +8463,28 @@ Last-Update: 2014-03-11
 +# encoding: utf-8
 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
 +
-+import os
++import os,re
 +from waflib import Utils,Options,Context
 +_options=[x.split(', ')for x in'''
-+bindir, user executables, ${EXEC_PREFIX}/bin
-+sbindir, system admin executables, ${EXEC_PREFIX}/sbin
-+libexecdir, program executables, ${EXEC_PREFIX}/libexec
-+sysconfdir, read-only single-machine data, ${PREFIX}/etc
-+sharedstatedir, modifiable architecture-independent data, ${PREFIX}/com
-+localstatedir, modifiable single-machine data, ${PREFIX}/var
++bindir, user commands, ${EXEC_PREFIX}/bin
++sbindir, system binaries, ${EXEC_PREFIX}/sbin
++libexecdir, program-specific binaries, ${EXEC_PREFIX}/libexec
++sysconfdir, host-specific configuration, ${PREFIX}/etc
++sharedstatedir, architecture-independent variable data, ${PREFIX}/com
++localstatedir, variable data, ${PREFIX}/var
 +libdir, object code libraries, ${EXEC_PREFIX}/lib
-+includedir, C header files, ${PREFIX}/include
-+oldincludedir, C header files for non-gcc, /usr/include
-+datarootdir, read-only arch.-independent data root, ${PREFIX}/share
-+datadir, read-only architecture-independent data, ${DATAROOTDIR}
-+infodir, info documentation, ${DATAROOTDIR}/info
++includedir, header files, ${PREFIX}/include
++oldincludedir, header files for non-GCC compilers, /usr/include
++datarootdir, architecture-independent data root, ${PREFIX}/share
++datadir, architecture-independent data, ${DATAROOTDIR}
++infodir, GNU "info" documentation, ${DATAROOTDIR}/info
 +localedir, locale-dependent data, ${DATAROOTDIR}/locale
-+mandir, man documentation, ${DATAROOTDIR}/man
++mandir, manual pages, ${DATAROOTDIR}/man
 +docdir, documentation root, ${DATAROOTDIR}/doc/${PACKAGE}
-+htmldir, html documentation, ${DOCDIR}
-+dvidir, dvi documentation, ${DOCDIR}
-+pdfdir, pdf documentation, ${DOCDIR}
-+psdir, ps documentation, ${DOCDIR}
++htmldir, HTML documentation, ${DOCDIR}
++dvidir, DVI documentation, ${DOCDIR}
++pdfdir, PDF documentation, ${DOCDIR}
++psdir, PostScript documentation, ${DOCDIR}
 +'''.split('\n')if x]
 +def configure(conf):
 +	def get_param(varname,default):
@@ -8290,7 +8509,7 @@ Last-Update: 2014-03-11
 +		lst=[name for name,_,_ in _options if not env[name.upper()]]
 +		raise conf.errors.WafError('Variable substitution failure %r'%lst)
 +def options(opt):
-+	inst_dir=opt.add_option_group('Installation directories','By default, "waf install" will put the files in\
++	inst_dir=opt.add_option_group('Installation prefix','By default, "waf install" will put the files in\
 + "/usr/local/bin", "/usr/local/lib" etc. An installation prefix other\
 + than "/usr/local" can be given using "--prefix", for example "--prefix=$HOME"')
 +	for k in('--prefix','--destdir'):
@@ -8298,12 +8517,12 @@ Last-Update: 2014-03-11
 +		if option:
 +			opt.parser.remove_option(k)
 +			inst_dir.add_option(option)
-+	inst_dir.add_option('--exec-prefix',help='installation prefix [Default: ${PREFIX}]',default='',dest='EXEC_PREFIX')
-+	dirs_options=opt.add_option_group('Pre-defined installation directories','')
++	inst_dir.add_option('--exec-prefix',help='installation prefix for binaries [PREFIX]',default='',dest='EXEC_PREFIX')
++	dirs_options=opt.add_option_group('Installation directories')
 +	for name,help,default in _options:
 +		option_name='--'+name
 +		str_default=default
-+		str_help='%s [Default: %s]'%(help,str_default)
++		str_help='%s [%s]'%(help,re.sub(r'\$\{([^}]+)\}',r'\1',str_default))
 +		dirs_options.add_option(option_name,help=str_help,default='',dest=name.upper())
 --- /dev/null
 +++ b/waflib/Tools/gxx.py
@@ -8312,15 +8531,15 @@ Last-Update: 2014-03-11
 +# encoding: utf-8
 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
 +
++import os,sys
++from waflib import Configure,Options,Utils
 +from waflib.Tools import ccroot,ar
 +from waflib.Configure import conf
 + at conf
 +def find_gxx(conf):
 +	cxx=conf.find_program(['g++','c++'],var='CXX')
-+	cxx=conf.cmd_to_list(cxx)
 +	conf.get_cc_version(cxx,gcc=True)
 +	conf.env.CXX_NAME='gcc'
-+	conf.env.CXX=cxx
 + at conf
 +def gxx_common_flags(conf):
 +	v=conf.env
@@ -8408,7 +8627,7 @@ Last-Update: 2014-03-11
 +	conf.link_add_flags()
 --- /dev/null
 +++ b/waflib/Tools/icc.py
-@@ -0,0 +1,30 @@
+@@ -0,0 +1,22 @@
 +#! /usr/bin/env python
 +# encoding: utf-8
 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
@@ -8420,17 +8639,9 @@ Last-Update: 2014-03-11
 +def find_icc(conf):
 +	if sys.platform=='cygwin':
 +		conf.fatal('The Intel compiler does not work on Cygwin')
-+	v=conf.env
-+	cc=None
-+	if v['CC']:cc=v['CC']
-+	elif'CC'in conf.environ:cc=conf.environ['CC']
-+	if not cc:cc=conf.find_program('icc',var='CC')
-+	if not cc:cc=conf.find_program('ICL',var='CC')
-+	if not cc:conf.fatal('Intel C Compiler (icc) was not found')
-+	cc=conf.cmd_to_list(cc)
++	cc=conf.find_program(['icc','ICL'],var='CC')
 +	conf.get_cc_version(cc,icc=True)
-+	v['CC']=cc
-+	v['CC_NAME']='icc'
++	conf.env.CC_NAME='icc'
 +def configure(conf):
 +	conf.find_icc()
 +	conf.find_ar()
@@ -8441,7 +8652,7 @@ Last-Update: 2014-03-11
 +	conf.link_add_flags()
 --- /dev/null
 +++ b/waflib/Tools/icpc.py
-@@ -0,0 +1,29 @@
+@@ -0,0 +1,22 @@
 +#! /usr/bin/env python
 +# encoding: utf-8
 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
@@ -8453,16 +8664,9 @@ Last-Update: 2014-03-11
 +def find_icpc(conf):
 +	if sys.platform=='cygwin':
 +		conf.fatal('The Intel compiler does not work on Cygwin')
-+	v=conf.env
-+	cxx=None
-+	if v['CXX']:cxx=v['CXX']
-+	elif'CXX'in conf.environ:cxx=conf.environ['CXX']
-+	if not cxx:cxx=conf.find_program('icpc',var='CXX')
-+	if not cxx:conf.fatal('Intel C++ Compiler (icpc) was not found')
-+	cxx=conf.cmd_to_list(cxx)
++	cxx=conf.find_program('icpc',var='CXX')
 +	conf.get_cc_version(cxx,icc=True)
-+	v['CXX']=cxx
-+	v['CXX_NAME']='icc'
++	conf.env.CXX_NAME='icc'
 +def configure(conf):
 +	conf.find_icpc()
 +	conf.find_ar()
@@ -8473,7 +8677,7 @@ Last-Update: 2014-03-11
 +	conf.link_add_flags()
 --- /dev/null
 +++ b/waflib/Tools/ifort.py
-@@ -0,0 +1,49 @@
+@@ -0,0 +1,51 @@
 +#! /usr/bin/env python
 +# encoding: utf-8
 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
@@ -8485,7 +8689,6 @@ Last-Update: 2014-03-11
 + at conf
 +def find_ifort(conf):
 +	fc=conf.find_program('ifort',var='FC')
-+	fc=conf.cmd_to_list(fc)
 +	conf.get_ifort_version(fc)
 +	conf.env.FC_NAME='IFORT'
 + at conf
@@ -8505,8 +8708,11 @@ Last-Update: 2014-03-11
 +		ifort_modifier_func()
 + at conf
 +def get_ifort_version(conf,fc):
-+	version_re=re.compile(r"ifort\s*\(IFORT\)\s*(?P<major>\d*)\.(?P<minor>\d*)",re.I).search
-+	cmd=fc+['--version']
++	version_re=re.compile(r"Intel[\sa-zA-Z()0-9,-]*Version\s*(?P<major>\d*)\.(?P<minor>\d*)",re.I).search
++	if Utils.is_win32:
++		cmd=fc
++	else:
++		cmd=fc+['-logo']
 +	out,err=fc_config.getoutput(conf,cmd,stdin=False)
 +	if out:
 +		match=version_re(out)
@@ -8525,46 +8731,62 @@ Last-Update: 2014-03-11
 +	conf.ifort_modifier_platform()
 --- /dev/null
 +++ b/waflib/Tools/intltool.py
-@@ -0,0 +1,77 @@
+@@ -0,0 +1,97 @@
 +#! /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,re
-+from waflib import Configure,TaskGen,Task,Utils,Runner,Options,Build,Logs
++from waflib import Configure,Context,TaskGen,Task,Utils,Runner,Options,Build,Logs
 +import waflib.Tools.ccroot
-+from waflib.TaskGen import feature,before_method
++from waflib.TaskGen import feature,before_method,taskgen_method
 +from waflib.Logs import error
++from waflib.Configure import conf
++_style_flags={'ba':'-b','desktop':'-d','keys':'-k','quoted':'--quoted-style','quotedxml':'--quotedxml-style','rfc822deb':'-r','schemas':'-s','xml':'-x',}
++ at taskgen_method
++def ensure_localedir(self):
++	if not self.env.LOCALEDIR:
++		if self.env.DATAROOTDIR:
++			self.env.LOCALEDIR=os.path.join(self.env.DATAROOTDIR,'locale')
++		else:
++			self.env.LOCALEDIR=os.path.join(self.env.PREFIX,'share','locale')
 + at before_method('process_source')
 + at feature('intltool_in')
 +def apply_intltool_in_f(self):
 +	try:self.meths.remove('process_source')
 +	except ValueError:pass
-+	if not self.env.LOCALEDIR:
-+		self.env.LOCALEDIR=self.env.PREFIX+'/share/locale'
++	self.ensure_localedir()
++	podir=getattr(self,'podir','.')
++	podirnode=self.path.find_dir(podir)
++	if not podirnode:
++		error("could not find the podir %r"%podir)
++		return
++	cache=getattr(self,'intlcache','.intlcache')
++	self.env.INTLCACHE=[os.path.join(str(self.path.get_bld()),podir,cache)]
++	self.env.INTLPODIR=podirnode.bldpath()
++	self.env.append_value('INTLFLAGS',getattr(self,'flags',self.env.INTLFLAGS_DEFAULT))
++	if'-c'in self.env.INTLFLAGS:
++		self.bld.fatal('Redundant -c flag in intltool task %r'%self)
++	style=getattr(self,'style',None)
++	if style:
++		try:
++			style_flag=_style_flags[style]
++		except KeyError:
++			self.bld.fatal('intltool_in style "%s" is not valid'%style)
++		self.env.append_unique('INTLFLAGS',[style_flag])
 +	for i in self.to_list(self.source):
 +		node=self.path.find_resource(i)
-+		podir=getattr(self,'podir','po')
-+		podirnode=self.path.find_dir(podir)
-+		if not podirnode:
-+			error("could not find the podir %r"%podir)
-+			continue
-+		cache=getattr(self,'intlcache','.intlcache')
-+		self.env['INTLCACHE']=os.path.join(self.path.bldpath(),podir,cache)
-+		self.env['INTLPODIR']=podirnode.bldpath()
-+		self.env['INTLFLAGS']=getattr(self,'flags',['-q','-u','-c'])
 +		task=self.create_task('intltool',node,node.change_ext(''))
-+		inst=getattr(self,'install_path','${LOCALEDIR}')
++		inst=getattr(self,'install_path',None)
 +		if inst:
 +			self.bld.install_files(inst,task.outputs)
 + at feature('intltool_po')
 +def apply_intltool_po(self):
 +	try:self.meths.remove('process_source')
 +	except ValueError:pass
-+	if not self.env.LOCALEDIR:
-+		self.env.LOCALEDIR=self.env.PREFIX+'/share/locale'
-+	appname=getattr(self,'appname','set_your_app_name')
-+	podir=getattr(self,'podir','')
++	self.ensure_localedir()
++	appname=getattr(self,'appname',getattr(Context.g_module,Context.APPNAME,'set_your_app_name'))
++	podir=getattr(self,'podir','.')
 +	inst=getattr(self,'install_path','${LOCALEDIR}')
 +	linguas=self.path.find_node(os.path.join(podir,'LINGUAS'))
 +	if linguas:
@@ -8590,22 +8812,26 @@ Last-Update: 2014-03-11
 +	run_str='${MSGFMT} -o ${TGT} ${SRC}'
 +	color='BLUE'
 +class intltool(Task.Task):
-+	run_str='${INTLTOOL} ${INTLFLAGS} ${INTLCACHE} ${INTLPODIR} ${SRC} ${TGT}'
++	run_str='${INTLTOOL} ${INTLFLAGS} ${INTLCACHE_ST:INTLCACHE} ${INTLPODIR} ${SRC} ${TGT}'
 +	color='BLUE'
-+def configure(conf):
++ at conf
++def find_msgfmt(conf):
 +	conf.find_program('msgfmt',var='MSGFMT')
-+	conf.find_perl_program('intltool-merge',var='INTLTOOL')
-+	prefix=conf.env.PREFIX
-+	datadir=conf.env.DATADIR
-+	if not datadir:
-+		datadir=os.path.join(prefix,'share')
-+	conf.define('LOCALEDIR',os.path.join(datadir,'locale').replace('\\','\\\\'))
-+	conf.define('DATADIR',datadir.replace('\\','\\\\'))
++ at conf
++def find_intltool_merge(conf):
++	if not conf.env.PERL:
++		conf.find_program('perl',var='PERL')
++	conf.env.INTLCACHE_ST='--cache=%s'
++	conf.env.INTLFLAGS_DEFAULT=['-q','-u']
++	conf.find_program('intltool-merge',interpreter='PERL',var='INTLTOOL')
++def configure(conf):
++	conf.find_msgfmt()
++	conf.find_intltool_merge()
 +	if conf.env.CC or conf.env.CXX:
 +		conf.check(header_name='locale.h')
 --- /dev/null
 +++ b/waflib/Tools/irixcc.py
-@@ -0,0 +1,48 @@
+@@ -0,0 +1,47 @@
 +#! /usr/bin/env python
 +# encoding: utf-8
 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
@@ -8622,7 +8848,6 @@ Last-Update: 2014-03-11
 +	elif'CC'in conf.environ:cc=conf.environ['CC']
 +	if not cc:cc=conf.find_program('cc',var='CC')
 +	if not cc:conf.fatal('irixcc was not found')
-+	cc=conf.cmd_to_list(cc)
 +	try:
 +		conf.cmd_and_log(cc+['-version'])
 +	except Exception:
@@ -8656,7 +8881,7 @@ Last-Update: 2014-03-11
 +	conf.link_add_flags()
 --- /dev/null
 +++ b/waflib/Tools/javaw.py
-@@ -0,0 +1,309 @@
+@@ -0,0 +1,307 @@
 +#! /usr/bin/env python
 +# encoding: utf-8
 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
@@ -8816,7 +9041,6 @@ Last-Update: 2014-03-11
 +		return super(jar_create,self).runnable_status()
 +class javac(Task.Task):
 +	color='BLUE'
-+	nocache=True
 +	vars=['CLASSPATH','JAVACFLAGS','JAVAC','OUTDIR']
 +	def runnable_status(self):
 +		for t in self.run_after:
@@ -8912,7 +9136,6 @@ Last-Update: 2014-03-11
 +		self.env['JAVA_HOME']=[self.environ['JAVA_HOME']]
 +	for x in'javac java jar javadoc'.split():
 +		self.find_program(x,var=x.upper(),path_list=java_path)
-+		self.env[x.upper()]=self.cmd_to_list(self.env[x.upper()])
 +	if'CLASSPATH'in self.environ:
 +		v['CLASSPATH']=self.environ['CLASSPATH']
 +	if not v['JAR']:self.fatal('jar is required for making java packages')
@@ -8990,7 +9213,7 @@ Last-Update: 2014-03-11
 +	run_str='${MSGFMT} ${SRC} -o ${TGT}'
 +def configure(self):
 +	kdeconfig=self.find_program('kde4-config')
-+	prefix=self.cmd_and_log('%s --prefix'%kdeconfig).strip()
++	prefix=self.cmd_and_log(kdeconfig+['--prefix']).strip()
 +	fname='%s/share/apps/cmake/modules/KDELibsDependencies.cmake'%prefix
 +	try:os.stat(fname)
 +	except OSError:
@@ -9030,7 +9253,7 @@ Last-Update: 2014-03-11
 + at conf
 +def find_ldc2(conf):
 +	conf.find_program(['ldc2'],var='D')
-+	out=conf.cmd_and_log([conf.env.D,'-version'])
++	out=conf.cmd_and_log(conf.env.D+['-version'])
 +	if out.find("based on DMD v2.")==-1:
 +		conf.fatal("detected compiler is not ldc2")
 + at conf
@@ -9080,7 +9303,7 @@ Last-Update: 2014-03-11
 +	conf.find_program('luac',var='LUAC')
 --- /dev/null
 +++ b/waflib/Tools/msvc.py
-@@ -0,0 +1,749 @@
+@@ -0,0 +1,747 @@
 +#! /usr/bin/env python
 +# encoding: utf-8
 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
@@ -9142,7 +9365,11 @@ Last-Update: 2014-03-11
 + at conf
 +def get_msvc_version(conf,compiler,version,target,vcvars):
 +	debug('msvc: get_msvc_version: %r %r %r',compiler,version,target)
-+	batfile=conf.bldnode.make_node('waf-print-msvc.bat')
++	try:
++		conf.msvc_cnt+=1
++	except AttributeError:
++		conf.msvc_cnt=1
++	batfile=conf.bldnode.make_node('waf-print-msvc-%d.bat'%conf.msvc_cnt)
 +	batfile.write("""@echo off
 +set INCLUDE=
 +set LIB=
@@ -9170,7 +9397,6 @@ Last-Update: 2014-03-11
 +	env.update(PATH=path)
 +	compiler_name,linker_name,lib_name=_get_prog_names(conf,compiler)
 +	cxx=conf.find_program(compiler_name,path_list=MSVC_PATH)
-+	cxx=conf.cmd_to_list(cxx)
 +	if'CL'in env:
 +		del(env['CL'])
 +	try:
@@ -9258,7 +9484,7 @@ Last-Update: 2014-03-11
 +def gather_msvc_detected_versions():
 +	version_pattern=re.compile('^(\d\d?\.\d\d?)(Exp)?$')
 +	detected_versions=[]
-+	for vcver,vcvar in[('VCExpress','Exp'),('VisualStudio','')]:
++	for vcver,vcvar in(('VCExpress','Exp'),('VisualStudio','')):
 +		try:
 +			prefix='SOFTWARE\\Wow6432node\\Microsoft\\'+vcver
 +			all_versions=Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE,prefix)
@@ -9455,7 +9681,7 @@ Last-Update: 2014-03-11
 +					setattr(conf,compilervars_warning_attr,False)
 +					patch_url='http://software.intel.com/en-us/forums/topic/328487'
 +					compilervars_arch=os.path.join(path,'bin','compilervars_arch.bat')
-+					for vscomntool in['VS110COMNTOOLS','VS100COMNTOOLS']:
++					for vscomntool in('VS110COMNTOOLS','VS100COMNTOOLS'):
 +						if vscomntool in os.environ:
 +							vs_express_path=os.environ[vscomntool]+r'..\IDE\VSWinExpress.exe'
 +							dev_env_path=os.environ[vscomntool]+r'..\IDE\devenv.exe'
@@ -9611,7 +9837,6 @@ Last-Update: 2014-03-11
 +	if v['CXX']:cxx=v['CXX']
 +	elif'CXX'in conf.environ:cxx=conf.environ['CXX']
 +	cxx=conf.find_program(compiler_name,var='CXX',path_list=path)
-+	cxx=conf.cmd_to_list(cxx)
 +	env=dict(conf.environ)
 +	if path:env.update(PATH=';'.join(path))
 +	if not conf.cmd_and_log(cxx+['/nologo','/help'],env=env):
@@ -9701,10 +9926,8 @@ Last-Update: 2014-03-11
 +			if d[1:]=='debug':
 +				pdbnode=self.link_task.outputs[0].change_ext('.pdb')
 +				self.link_task.outputs.append(pdbnode)
-+				try:
-+					self.install_task.source.append(pdbnode)
-+				except AttributeError:
-+					pass
++				if getattr(self,'install_task',None):
++					self.pdb_install_task=self.bld.install_files(self.install_task.dest,pdbnode,env=self.env)
 +				break
 + at feature('cprogram','cshlib','cxxprogram','cxxshlib')
 + at after_method('apply_link')
@@ -9734,13 +9957,11 @@ Last-Update: 2014-03-11
 +	elif'cshlib'in self.generator.features or'cxxshlib'in self.generator.features:
 +		mode='2'
 +	debug('msvc: embedding manifest in mode %r'%mode)
-+	lst=[]
-+	lst.append(env['MT'])
++	lst=[]+mtool
 +	lst.extend(Utils.to_list(env['MTFLAGS']))
 +	lst.extend(['-manifest',manifest])
 +	lst.append('-outputresource:%s;%s'%(outfile,mode))
-+	lst=[lst]
-+	return self.exec_command(*lst)
++	return self.exec_command(lst)
 +def quote_response_command(self,flag):
 +	if flag.find(' ')>-1:
 +		for x in('/LIBPATH:','/IMPLIB:','/OUT:','/I'):
@@ -9851,7 +10072,7 @@ Last-Update: 2014-03-11
 +	conf.env.ASMPATH_ST='-I%s'+os.sep
 --- /dev/null
 +++ b/waflib/Tools/perl.py
-@@ -0,0 +1,80 @@
+@@ -0,0 +1,84 @@
 +#! /usr/bin/env python
 +# encoding: utf-8
 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
@@ -9890,7 +10111,7 @@ Last-Update: 2014-03-11
 +		self.end_msg("Perl not found",color="YELLOW")
 +		return False
 +	self.env['PERL']=perl
-+	version=self.cmd_and_log([perl,"-e",'printf \"%vd\", $^V'])
++	version=self.cmd_and_log(self.env.PERL+["-e",'printf \"%vd\", $^V'])
 +	if not version:
 +		res=False
 +		version="Unknown"
@@ -9902,7 +10123,7 @@ Last-Update: 2014-03-11
 +	return res
 + at conf
 +def check_perl_module(self,module):
-+	cmd=[self.env['PERL'],'-e','use %s'%module]
++	cmd=self.env.PERL+['-e','use %s'%module]
 +	self.start_msg('perl module %s'%module)
 +	try:
 +		r=self.cmd_and_log(cmd)
@@ -9917,30 +10138,34 @@ Last-Update: 2014-03-11
 +	perl=env.PERL
 +	if not perl:
 +		self.fatal('find perl first')
-+	def read_out(cmd):
-+		return Utils.to_list(self.cmd_and_log(perl+cmd))
-+	env['LINKFLAGS_PERLEXT']=read_out(" -MConfig -e'print $Config{lddlflags}'")
-+	env['INCLUDES_PERLEXT']=read_out(" -MConfig -e'print \"$Config{archlib}/CORE\"'")
-+	env['CFLAGS_PERLEXT']=read_out(" -MConfig -e'print \"$Config{ccflags} $Config{cccdlflags}\"'")
-+	env['XSUBPP']=read_out(" -MConfig -e'print \"$Config{privlib}/ExtUtils/xsubpp$Config{exe_ext}\"'")
-+	env['EXTUTILS_TYPEMAP']=read_out(" -MConfig -e'print \"$Config{privlib}/ExtUtils/typemap\"'")
++	def cmd_perl_config(s):
++		return perl+['-MConfig','-e','print \"%s\"'%s]
++	def cfg_str(cfg):
++		return self.cmd_and_log(cmd_perl_config(cfg))
++	def cfg_lst(cfg):
++		return Utils.to_list(cfg_str(cfg))
++	env['LINKFLAGS_PERLEXT']=cfg_lst('$Config{lddlflags}')
++	env['INCLUDES_PERLEXT']=cfg_lst('$Config{archlib}/CORE')
++	env['CFLAGS_PERLEXT']=cfg_lst('$Config{ccflags} $Config{cccdlflags}')
++	env['XSUBPP']=cfg_lst('$Config{privlib}/ExtUtils/xsubpp$Config{exe_ext}')
++	env['EXTUTILS_TYPEMAP']=cfg_lst('$Config{privlib}/ExtUtils/typemap')
 +	if not getattr(Options.options,'perlarchdir',None):
-+		env['ARCHDIR_PERL']=self.cmd_and_log(perl+" -MConfig -e'print $Config{sitearch}'")
++		env['ARCHDIR_PERL']=cfg_str('$Config{sitearch}')
 +	else:
 +		env['ARCHDIR_PERL']=getattr(Options.options,'perlarchdir')
-+	env['perlext_PATTERN']='%s.'+self.cmd_and_log(perl+" -MConfig -e'print $Config{dlext}'")
++	env['perlext_PATTERN']='%s.'+cfg_str('$Config{dlext}')
 +def options(opt):
 +	opt.add_option('--with-perl-binary',type='string',dest='perlbinary',help='Specify alternate perl binary',default=None)
 +	opt.add_option('--with-perl-archdir',type='string',dest='perlarchdir',help='Specify directory where to install arch specific files',default=None)
 --- /dev/null
 +++ b/waflib/Tools/python.py
-@@ -0,0 +1,343 @@
+@@ -0,0 +1,299 @@
 +#! /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
-+from waflib import Utils,Options,Errors,Logs
++from waflib import Utils,Options,Errors,Logs,Task,Node
 +from waflib.TaskGen import extension,before_method,after_method,feature
 +from waflib.Configure import conf
 +FRAG='''
@@ -9963,64 +10188,66 @@ Last-Update: 2014-03-11
 +'''
 +INST='''
 +import sys, py_compile
-+py_compile.compile(sys.argv[1], sys.argv[2], sys.argv[3])
++py_compile.compile(sys.argv[1], sys.argv[2], sys.argv[3], True)
 +'''
 +DISTUTILS_IMP=['from distutils.sysconfig import get_config_var, get_python_lib']
-+ at extension('.py')
-+def process_py(self,node):
-+	try:
-+		if not self.bld.is_install:
-+			return
-+	except AttributeError:
-+		return
-+	try:
-+		if not self.install_path:
-+			return
-+	except AttributeError:
-+		self.install_path='${PYTHONDIR}'
-+	def inst_py(ctx):
-+		install_from=getattr(self,'install_from',None)
-+		if install_from:
-+			install_from=self.path.find_dir(install_from)
-+		install_pyfile(self,node,install_from)
-+	self.bld.add_post_fun(inst_py)
-+def install_pyfile(self,node,install_from=None):
-+	from_node=install_from or node.parent
-+	tsk=self.bld.install_as(self.install_path+'/'+node.path_from(from_node),node,postpone=False)
-+	path=tsk.get_install_path()
-+	if self.bld.is_install<0:
-+		Logs.info("+ removing byte compiled python files")
-+		for x in'co':
-+			try:
-+				os.remove(path+x)
-+			except OSError:
-+				pass
-+	if self.bld.is_install>0:
-+		try:
-+			st1=os.stat(path)
-+		except OSError:
-+			Logs.error('The python file is missing, this should not happen')
-+		for x in['c','o']:
-+			do_inst=self.env['PY'+x.upper()]
-+			try:
-+				st2=os.stat(path+x)
-+			except OSError:
-+				pass
-+			else:
-+				if st1.st_mtime<=st2.st_mtime:
-+					do_inst=False
-+			if do_inst:
-+				lst=(x=='o')and[self.env['PYFLAGS_OPT']]or[]
-+				(a,b,c)=(path,path+x,tsk.get_install_path(destdir=False)+x)
-+				argv=self.env['PYTHON']+lst+['-c',INST,a,b,c]
-+				Logs.info('+ byte compiling %r'%(path+x))
-+				env=self.env.env or None
-+				ret=Utils.subprocess.Popen(argv,env=env).wait()
-+				if ret:
-+					raise Errors.WafError('py%s compilation failed %r'%(x,path))
++ at before_method('process_source')
 + at feature('py')
 +def feature_py(self):
-+	pass
++	self.install_path=getattr(self,'install_path','${PYTHONDIR}')
++	install_from=getattr(self,'install_from',None)
++	if install_from and not isinstance(install_from,Node.Node):
++		install_from=self.path.find_dir(install_from)
++	self.install_from=install_from
++	ver=self.env.PYTHON_VERSION
++	if not ver:
++		self.bld.fatal('Installing python files requires PYTHON_VERSION, try conf.check_python_version')
++	if int(ver.replace('.',''))>31:
++		self.install_32=True
++ at extension('.py')
++def process_py(self,node):
++	assert(node.get_bld_sig())
++	assert(getattr(self,'install_path')),'add features="py"'
++	if self.install_path:
++		if self.install_from:
++			self.bld.install_files(self.install_path,[node],cwd=self.install_from,relative_trick=True)
++		else:
++			self.bld.install_files(self.install_path,[node])
++	lst=[]
++	if self.env.PYC:
++		lst.append('pyc')
++	if self.env.PYO:
++		lst.append('pyo')
++	if self.install_path:
++		if self.install_from:
++			pyd=Utils.subst_vars("%s/%s"%(self.install_path,node.path_from(self.install_from)),self.env)
++		else:
++			pyd=Utils.subst_vars("%s/%s"%(self.install_path,node.path_from(self.path)),self.env)
++	else:
++		pyd=node.abspath()
++	for ext in lst:
++		if self.env.PYTAG:
++			name=node.name[:-3]
++			pyobj=node.parent.get_bld().make_node('__pycache__').make_node("%s.%s.%s"%(name,self.env.PYTAG,ext))
++			pyobj.parent.mkdir()
++		else:
++			pyobj=node.change_ext(".%s"%ext)
++		tsk=self.create_task(ext,node,pyobj)
++		tsk.pyd=pyd
++		if self.install_path:
++			self.bld.install_files(self.install_path,pyobj,cwd=node.parent.get_bld(),relative_trick=True)
++class pyc(Task.Task):
++	color='PINK'
++	def run(self):
++		cmd=[Utils.subst_vars('${PYTHON}',self.env),'-c',INST,self.inputs[0].abspath(),self.outputs[0].abspath(),self.pyd]
++		ret=self.generator.bld.exec_command(cmd)
++		return ret
++class pyo(Task.Task):
++	color='PINK'
++	def run(self):
++		cmd=[Utils.subst_vars('${PYTHON}',self.env),Utils.subst_vars('${PYFLAGS_OPT}',self.env),'-c',INST,self.inputs[0].abspath(),self.outputs[0].abspath(),self.pyd]
++		ret=self.generator.bld.exec_command(cmd)
++		return ret
 + at feature('pyext')
 + at before_method('propagate_uselib_vars','apply_link')
 + at after_method('apply_bundle')
@@ -10090,7 +10317,7 @@ Last-Update: 2014-03-11
 +	pybin=conf.env.PYTHON
 +	if not pybin:
 +		conf.fatal('Could not find the python executable')
-+	v='prefix SO LDFLAGS LIBDIR LIBPL INCLUDEPY Py_ENABLE_SHARED MACOSX_DEPLOYMENT_TARGET LDSHARED CFLAGS'.split()
++	v='prefix SO LDFLAGS LIBDIR LIBPL INCLUDEPY Py_ENABLE_SHARED MACOSX_DEPLOYMENT_TARGET LDSHARED CFLAGS LDVERSION'.split()
 +	try:
 +		lst=conf.get_python_variables(["get_config_var('%s') or ''"%x for x in v])
 +	except RuntimeError:
@@ -10101,79 +10328,24 @@ Last-Update: 2014-03-11
 +	x='MACOSX_DEPLOYMENT_TARGET'
 +	if dct[x]:
 +		conf.env[x]=conf.environ[x]=dct[x]
-+	env['pyext_PATTERN']='%s'+dct['SO']
-+	all_flags=dct['LDFLAGS']+' '+dct['CFLAGS']
-+	conf.parse_flags(all_flags,'PYEMBED')
-+	all_flags=dct['LDFLAGS']+' '+dct['LDSHARED']+' '+dct['CFLAGS']
-+	conf.parse_flags(all_flags,'PYEXT')
-+	result=None
-+	for name in('python'+env['PYTHON_VERSION'],'python'+env['PYTHON_VERSION']+'m','python'+env['PYTHON_VERSION'].replace('.','')):
-+		if not result and env['LIBPATH_PYEMBED']:
-+			path=env['LIBPATH_PYEMBED']
-+			conf.to_log("\n\n# Trying default LIBPATH_PYEMBED: %r\n"%path)
-+			result=conf.check(lib=name,uselib='PYEMBED',libpath=path,mandatory=False,msg='Checking for library %s in LIBPATH_PYEMBED'%name)
-+		if not result and dct['LIBDIR']:
-+			path=[dct['LIBDIR']]
-+			conf.to_log("\n\n# try again with -L$python_LIBDIR: %r\n"%path)
-+			result=conf.check(lib=name,uselib='PYEMBED',libpath=path,mandatory=False,msg='Checking for library %s in LIBDIR'%name)
-+		if not result and dct['LIBPL']:
-+			path=[dct['LIBPL']]
-+			conf.to_log("\n\n# try again with -L$python_LIBPL (some systems don't install the python library in $prefix/lib)\n")
-+			result=conf.check(lib=name,uselib='PYEMBED',libpath=path,mandatory=False,msg='Checking for library %s in python_LIBPL'%name)
-+		if not result:
-+			path=[os.path.join(dct['prefix'],"libs")]
-+			conf.to_log("\n\n# try again with -L$prefix/libs, and pythonXY name rather than pythonX.Y (win32)\n")
-+			result=conf.check(lib=name,uselib='PYEMBED',libpath=path,mandatory=False,msg='Checking for library %s in $prefix/libs'%name)
-+		if result:
-+			break
-+	if result:
-+		env['LIBPATH_PYEMBED']=path
-+		env.append_value('LIB_PYEMBED',[name])
-+	else:
-+		conf.to_log("\n\n### LIB NOT FOUND\n")
-+	if(Utils.is_win32 or sys.platform.startswith('os2')or dct['Py_ENABLE_SHARED']):
-+		env['LIBPATH_PYEXT']=env['LIBPATH_PYEMBED']
-+		env['LIB_PYEXT']=env['LIB_PYEMBED']
++	if not env.pyext_PATTERN:
++		if dct['SO']:
++			env.pyext_PATTERN='%s'+dct['SO']
++		else:
++			env.pyext_PATTERN=(conf.env.cshlib_PATTERN or conf.env.cxxshlib_PATTERN).lstrip('lib')
 +	num='.'.join(env['PYTHON_VERSION'].split('.')[:2])
-+	conf.find_program([''.join(pybin)+'-config','python%s-config'%num,'python-config-%s'%num,'python%sm-config'%num],var='PYTHON_CONFIG',mandatory=False)
-+	includes=[]
-+	if conf.env.PYTHON_CONFIG:
-+		for incstr in conf.cmd_and_log([conf.env.PYTHON_CONFIG,'--includes']).strip().split():
-+			if(incstr.startswith('-I')or incstr.startswith('/I')):
-+				incstr=incstr[2:]
-+			if incstr not in includes:
-+				includes.append(incstr)
-+		conf.to_log("Include path for Python extensions (found via python-config --includes): %r\n"%(includes,))
-+		env['INCLUDES_PYEXT']=includes
-+		env['INCLUDES_PYEMBED']=includes
-+	else:
-+		conf.to_log("Include path for Python extensions ""(found via distutils module): %r\n"%(dct['INCLUDEPY'],))
-+		env['INCLUDES_PYEXT']=[dct['INCLUDEPY']]
-+		env['INCLUDES_PYEMBED']=[dct['INCLUDEPY']]
-+	if env['CC_NAME']=='gcc':
-+		env.append_value('CFLAGS_PYEMBED',['-fno-strict-aliasing'])
-+		env.append_value('CFLAGS_PYEXT',['-fno-strict-aliasing'])
-+	if env['CXX_NAME']=='gcc':
-+		env.append_value('CXXFLAGS_PYEMBED',['-fno-strict-aliasing'])
-+		env.append_value('CXXFLAGS_PYEXT',['-fno-strict-aliasing'])
-+	if env.CC_NAME=="msvc":
-+		from distutils.msvccompiler import MSVCCompiler
-+		dist_compiler=MSVCCompiler()
-+		dist_compiler.initialize()
-+		env.append_value('CFLAGS_PYEXT',dist_compiler.compile_options)
-+		env.append_value('CXXFLAGS_PYEXT',dist_compiler.compile_options)
-+		env.append_value('LINKFLAGS_PYEXT',dist_compiler.ldflags_shared)
-+	try:
-+		conf.check(header_name='Python.h',define_name='HAVE_PYTHON_H',uselib='PYEMBED',fragment=FRAG,errmsg=':-(')
-+	except conf.errors.ConfigurationError:
-+		xx=conf.env.CXX_NAME and'cxx'or'c'
-+		flags=['--cflags','--libs','--ldflags']
-+		for f in flags:
-+			conf.check_cfg(msg='Asking python-config for pyembed %s flags'%f,path=conf.env.PYTHON_CONFIG,package='',uselib_store='PYEMBED',args=[f])
-+		conf.check(header_name='Python.h',define_name='HAVE_PYTHON_H',msg='Getting pyembed flags from python-config',fragment=FRAG,errmsg='Could not build a python embedded interpreter',features='%s %sprogram pyembed'%(xx,xx))
-+		for f in flags:
-+			conf.check_cfg(msg='Asking python-config for pyext %s flags'%f,path=conf.env.PYTHON_CONFIG,package='',uselib_store='PYEXT',args=[f])
-+		conf.check(header_name='Python.h',define_name='HAVE_PYTHON_H',msg='Getting pyext flags from python-config',features='%s %sshlib pyext'%(xx,xx),fragment=FRAG,errmsg='Could not build python extensions')
++	conf.find_program([''.join(pybin)+'-config','python%s-config'%num,'python-config-%s'%num,'python%sm-config'%num],var='PYTHON_CONFIG',msg="python-config")
++	all_flags=[['--cflags','--libs','--ldflags']]
++	if sys.hexversion<0x2060000:
++		all_flags=[[x]for x in all_flags[0]]
++	xx=conf.env.CXX_NAME and'cxx'or'c'
++	for flags in all_flags:
++		conf.check_cfg(msg='Asking python-config for pyembed %r flags'%' '.join(flags),path=conf.env.PYTHON_CONFIG,package='',uselib_store='PYEMBED',args=flags)
++	conf.check(header_name='Python.h',define_name='HAVE_PYEMBED',msg='Getting pyembed flags from python-config',fragment=FRAG,errmsg='Could not build a python embedded interpreter',features='%s %sprogram pyembed'%(xx,xx))
++	for flags in all_flags:
++		conf.check_cfg(msg='Asking python-config for pyext %r flags'%' '.join(flags),path=conf.env.PYTHON_CONFIG,package='',uselib_store='PYEXT',args=flags)
++	conf.check(header_name='Python.h',define_name='HAVE_PYEXT',msg='Getting pyext flags from python-config',features='%s %sshlib pyext'%(xx,xx),fragment=FRAG,errmsg='Could not build python extensions')
++	conf.define('HAVE_PYTHON_H',1)
 + at conf
 +def check_python_version(conf,minver=None):
 +	assert minver is None or isinstance(minver,tuple)
@@ -10189,23 +10361,27 @@ Last-Update: 2014-03-11
 +	if result:
 +		pyver='.'.join([str(x)for x in pyver_tuple[:2]])
 +		conf.env['PYTHON_VERSION']=pyver
-+		if'PYTHONDIR'in conf.environ:
++		if'PYTHONDIR'in conf.env:
++			pydir=conf.env['PYTHONDIR']
++		elif'PYTHONDIR'in conf.environ:
 +			pydir=conf.environ['PYTHONDIR']
 +		else:
 +			if Utils.is_win32:
-+				(python_LIBDEST,pydir)=conf.get_python_variables(["get_config_var('LIBDEST') or ''","get_python_lib(standard_lib=0, prefix=%r) or ''"%conf.env['PREFIX']])
++				(python_LIBDEST,pydir)=conf.get_python_variables(["get_config_var('LIBDEST') or ''","get_python_lib(standard_lib=0) or ''"])
 +			else:
 +				python_LIBDEST=None
-+				(pydir,)=conf.get_python_variables(["get_python_lib(standard_lib=0, prefix=%r) or ''"%conf.env['PREFIX']])
++				(pydir,)=conf.get_python_variables(["get_python_lib(standard_lib=0) or ''"])
 +			if python_LIBDEST is None:
 +				if conf.env['LIBDIR']:
 +					python_LIBDEST=os.path.join(conf.env['LIBDIR'],"python"+pyver)
 +				else:
 +					python_LIBDEST=os.path.join(conf.env['PREFIX'],"lib","python"+pyver)
-+		if'PYTHONARCHDIR'in conf.environ:
++		if'PYTHONARCHDIR'in conf.env:
++			pyarchdir=conf.env['PYTHONARCHDIR']
++		elif'PYTHONARCHDIR'in conf.environ:
 +			pyarchdir=conf.environ['PYTHONARCHDIR']
 +		else:
-+			(pyarchdir,)=conf.get_python_variables(["get_python_lib(plat_specific=1, standard_lib=0, prefix=%r) or ''"%conf.env['PREFIX']])
++			(pyarchdir,)=conf.get_python_variables(["get_python_lib(plat_specific=1, standard_lib=0) or ''"])
 +			if not pyarchdir:
 +				pyarchdir=pydir
 +		if hasattr(conf,'define'):
@@ -10225,13 +10401,13 @@ Last-Update: 2014-03-11
 +import %s as current_module
 +version = getattr(current_module, '__version__', None)
 +if version is not None:
-+    print(str(version))
++	print(str(version))
 +else:
-+    print('unknown version')
++	print('unknown version')
 +'''
 + at conf
 +def check_python_module(conf,module_name,condition=''):
-+	msg='Python module %s'%module_name
++	msg="Checking for python module '%s'"%module_name
 +	if condition:
 +		msg='%s (%s)'%(msg,condition)
 +	conf.start_msg(msg)
@@ -10261,26 +10437,31 @@ Last-Update: 2014-03-11
 +		else:
 +			conf.end_msg(ret)
 +def configure(conf):
-+	try:
-+		conf.find_program('python',var='PYTHON')
-+	except conf.errors.ConfigurationError:
-+		Logs.warn("could not find a python executable, setting to sys.executable '%s'"%sys.executable)
-+		conf.env.PYTHON=sys.executable
-+	if conf.env.PYTHON!=sys.executable:
-+		Logs.warn("python executable %r differs from system %r"%(conf.env.PYTHON,sys.executable))
-+	conf.env.PYTHON=conf.cmd_to_list(conf.env.PYTHON)
 +	v=conf.env
-+	v['PYCMD']='"import sys, py_compile;py_compile.compile(sys.argv[1], sys.argv[2])"'
++	v['PYTHON']=Options.options.python or os.environ.get('PYTHON',sys.executable)
++	if Options.options.pythondir:
++		v['PYTHONDIR']=Options.options.pythondir
++	if Options.options.pythonarchdir:
++		v['PYTHONARCHDIR']=Options.options.pythonarchdir
++	conf.find_program('python',var='PYTHON')
 +	v['PYFLAGS']=''
 +	v['PYFLAGS_OPT']='-O'
 +	v['PYC']=getattr(Options.options,'pyc',1)
 +	v['PYO']=getattr(Options.options,'pyo',1)
++	try:
++		v.PYTAG=conf.cmd_and_log(conf.env.PYTHON+['-c',"import imp;print(imp.get_tag())"]).strip()
++	except Errors.WafError:
++		pass
 +def options(opt):
-+	opt.add_option('--nopyc',action='store_false',default=1,help='Do not install bytecode compiled .pyc files (configuration) [Default:install]',dest='pyc')
-+	opt.add_option('--nopyo',action='store_false',default=1,help='Do not install optimised compiled .pyo files (configuration) [Default:install]',dest='pyo')
++	pyopt=opt.add_option_group("Python Options")
++	pyopt.add_option('--nopyc',dest='pyc',action='store_false',default=1,help='Do not install bytecode compiled .pyc files (configuration) [Default:install]')
++	pyopt.add_option('--nopyo',dest='pyo',action='store_false',default=1,help='Do not install optimised compiled .pyo files (configuration) [Default:install]')
++	pyopt.add_option('--python',dest="python",help='python binary to be used [Default: %s]'%sys.executable)
++	pyopt.add_option('--pythondir',dest='pythondir',help='Installation path for python modules (py, platform-independent .py and .pyc files)')
++	pyopt.add_option('--pythonarchdir',dest='pythonarchdir',help='Installation path for python extension (pyext, platform-dependent .so or .dylib files)')
 --- /dev/null
 +++ b/waflib/Tools/qt4.py
-@@ -0,0 +1,455 @@
+@@ -0,0 +1,463 @@
 +#! /usr/bin/env python
 +# encoding: utf-8
 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
@@ -10295,7 +10476,7 @@ Last-Update: 2014-03-11
 +	has_xml=True
 +import os,sys
 +from waflib.Tools import c_preproc,cxx
-+from waflib import Task,Utils,Options,Errors
++from waflib import Task,Utils,Options,Errors,Context
 +from waflib.TaskGen import feature,after_method,extension
 +from waflib.Configure import conf
 +from waflib import Logs
@@ -10339,6 +10520,8 @@ Last-Update: 2014-03-11
 +			tsk=moc_cache[h_node]=Task.classes['moc'](env=self.env,generator=self.generator)
 +			tsk.set_inputs(h_node)
 +			tsk.set_outputs(m_node)
++			if self.generator:
++				self.generator.tasks.append(tsk)
 +			gen=self.generator.bld.producer
 +			gen.outstanding.insert(0,tsk)
 +			gen.total+=1
@@ -10367,43 +10550,48 @@ Last-Update: 2014-03-11
 +				continue
 +			mocfiles.append(d)
 +			h_node=None
-+			try:ext=Options.options.qt_header_ext.split()
-+			except AttributeError:pass
-+			if not ext:ext=MOC_H
-+			base2=d[:-4]
-+			for x in[node.parent]+self.generator.includes_nodes:
-+				for e in ext:
-+					h_node=x.find_node(base2+e)
-+					if h_node:
-+						break
-+				if h_node:
-+					m_node=h_node.change_ext('.moc')
-+					break
++			try:
++				(h_path,m_from_h)=bld.node_deps[(node.parent.abspath(),d)]
++			except KeyError:
++				pass
 +			else:
-+				for k in EXT_QT4:
-+					if base2.endswith(k):
-+						for x in[node.parent]+self.generator.includes_nodes:
-+							h_node=x.find_node(base2)
-+							if h_node:
-+								break
++				h_node=bld.root.find_node(h_path)
++				if h_node:
++					m_node=h_node.parent.find_or_declare(m_from_h)
++			if not h_node:
++				try:ext=Options.options.qt_header_ext.split()
++				except AttributeError:pass
++				if not ext:ext=MOC_H
++				base2=d[:-4]
++				for x in[node.parent]+self.generator.includes_nodes:
++					for e in ext:
++						h_node=x.find_node(base2+e)
++						if h_node:
++							break
 +					if h_node:
-+						m_node=h_node.change_ext(k+'.moc')
++						m_node=h_node.change_ext('.moc')
 +						break
-+			if not h_node:
-+				raise Errors.WafError('no header found for %r which is a moc file'%d)
-+			bld.node_deps[(self.inputs[0].parent.abspath(),m_node.name)]=h_node
++				else:
++					for k in EXT_QT4:
++						if base2.endswith(k):
++							for x in[node.parent]+self.generator.includes_nodes:
++								h_node=x.find_node(base2)
++								if h_node:
++									break
++						if h_node:
++							m_node=h_node.change_ext(k+'.moc')
++							break
++				if not h_node:
++					raise Errors.WafError('no source found for %r which is a moc file'%d)
++				h_path=h_node.abspath()
++				m_from_h=m_node.path_from(h_node.parent.get_bld())
++				for name in(d,m_node.path_from(node.parent.get_bld())):
++					bld.node_deps[(node.parent.abspath(),name)]=(h_path,m_from_h)
 +			task=self.create_moc_task(h_node,m_node)
 +			moctasks.append(task)
-+		tmp_lst=bld.raw_deps[self.uid()]=mocfiles
-+		lst=bld.node_deps.get(self.uid(),())
-+		for d in lst:
-+			name=d.name
-+			if name.endswith('.moc'):
-+				task=self.create_moc_task(bld.node_deps[(self.inputs[0].parent.abspath(),name)],d)
-+				moctasks.append(task)
++		bld.raw_deps[self.uid()]=mocfiles
 +		self.run_after.update(set(moctasks))
 +		self.moc_done=1
-+	run=Task.classes['cxx'].__dict__['run']
 +class trans_update(Task.Task):
 +	run_str='${QT_LUPDATE} ${SRC} -ts ${TGT}'
 +	color='BLUE'
@@ -10462,7 +10650,7 @@ Last-Update: 2014-03-11
 +	for flag in self.to_list(self.env['CXXFLAGS']):
 +		if len(flag)<2:continue
 +		f=flag[0:2]
-+		if f in['-D','-I','/D','/I']:
++		if f in('-D','-I','/D','/I'):
 +			if(f[0]=='/'):
 +				lst.append('-'+flag[1:])
 +			else:
@@ -10473,8 +10661,10 @@ Last-Update: 2014-03-11
 +	return self.create_compiled_task('qxx',node)
 +class rcc(Task.Task):
 +	color='BLUE'
-+	run_str='${QT_RCC} -name ${SRC[0].name} ${SRC[0].abspath()} ${RCC_ST} -o ${TGT}'
++	run_str='${QT_RCC} -name ${tsk.rcname()} ${SRC[0].abspath()} ${RCC_ST} -o ${TGT}'
 +	ext_out=['.h']
++	def rcname(self):
++		return os.path.splitext(self.inputs[0].name)[0]
 +	def scan(self):
 +		node=self.inputs[0]
 +		if not has_xml:
@@ -10550,14 +10740,14 @@ Last-Update: 2014-03-11
 +				paths.append(qtbin)
 +	cand=None
 +	prev_ver=['4','0','0']
-+	for qmk in['qmake-qt4','qmake4','qmake']:
++	for qmk in('qmake-qt4','qmake4','qmake'):
 +		try:
 +			qmake=self.find_program(qmk,path_list=paths)
 +		except self.errors.ConfigurationError:
 +			pass
 +		else:
 +			try:
-+				version=self.cmd_and_log([qmake,'-query','QT_VERSION']).strip()
++				version=self.cmd_and_log(qmake+['-query','QT_VERSION']).strip()
 +			except self.errors.WafError:
 +				pass
 +			else:
@@ -10570,7 +10760,7 @@ Last-Update: 2014-03-11
 +		self.env.QMAKE=cand
 +	else:
 +		self.fatal('Could not find qmake for qt4')
-+	qtbin=self.cmd_and_log([self.env.QMAKE,'-query','QT_INSTALL_BINS']).strip()+os.sep
++	qtbin=self.cmd_and_log(self.env.QMAKE+['-query','QT_INSTALL_BINS']).strip()+os.sep
 +	def find_bin(lst,var):
 +		if var in env:
 +			return
@@ -10584,18 +10774,17 @@ Last-Update: 2014-03-11
 +				break
 +	find_bin(['uic-qt3','uic3'],'QT_UIC3')
 +	find_bin(['uic-qt4','uic'],'QT_UIC')
-+	if not env['QT_UIC']:
++	if not env.QT_UIC:
 +		self.fatal('cannot find the uic compiler for qt4')
-+	try:
-+		uicver=self.cmd_and_log(env['QT_UIC']+" -version 2>&1").strip()
-+	except self.errors.ConfigurationError:
-+		self.fatal('this uic compiler is for qt3, add uic for qt4 to your path')
++	self.start_msg('Checking for uic version')
++	uicver=self.cmd_and_log(env.QT_UIC+["-version"],output=Context.BOTH)
++	uicver=''.join(uicver).strip()
 +	uicver=uicver.replace('Qt User Interface Compiler ','').replace('User Interface Compiler for Qt','')
-+	self.msg('Checking for uic version','%s'%uicver)
++	self.end_msg(uicver)
 +	if uicver.find(' 3.')!=-1:
 +		self.fatal('this uic compiler is for qt3, add uic for qt4 to your path')
 +	find_bin(['moc-qt4','moc'],'QT_MOC')
-+	find_bin(['rcc'],'QT_RCC')
++	find_bin(['rcc-qt4','rcc'],'QT_RCC')
 +	find_bin(['lrelease-qt4','lrelease'],'QT_LRELEASE')
 +	find_bin(['lupdate-qt4','lupdate'],'QT_LUPDATE')
 +	env['UIC3_ST']='%s -o %s'
@@ -10610,12 +10799,12 @@ Last-Update: 2014-03-11
 +	qtlibs=getattr(Options.options,'qtlibs',None)or os.environ.get("QT4_LIBDIR",None)
 +	if not qtlibs:
 +		try:
-+			qtlibs=self.cmd_and_log([self.env.QMAKE,'-query','QT_INSTALL_LIBS']).strip()
++			qtlibs=self.cmd_and_log(self.env.QMAKE+['-query','QT_INSTALL_LIBS']).strip()
 +		except Errors.WafError:
-+			qtdir=self.cmd_and_log([self.env.QMAKE,'-query','QT_INSTALL_PREFIX']).strip()+os.sep
++			qtdir=self.cmd_and_log(self.env.QMAKE+['-query','QT_INSTALL_PREFIX']).strip()+os.sep
 +			qtlibs=os.path.join(qtdir,'lib')
 +	self.msg('Found the Qt4 libraries in',qtlibs)
-+	qtincludes=os.environ.get("QT4_INCLUDES",None)or self.cmd_and_log([self.env.QMAKE,'-query','QT_INSTALL_HEADERS']).strip()
++	qtincludes=os.environ.get("QT4_INCLUDES",None)or self.cmd_and_log(self.env.QMAKE+['-query','QT_INSTALL_HEADERS']).strip()
 +	env=self.env
 +	if not'PKG_CONFIG_PATH'in os.environ:
 +		os.environ['PKG_CONFIG_PATH']='%s:%s/pkgconfig:/usr/lib/qt4/lib/pkgconfig:/opt/qt4/lib/pkgconfig:/usr/lib/qt4/lib:/opt/qt4/lib'%(qtlibs,qtlibs)
@@ -10737,131 +10926,631 @@ Last-Update: 2014-03-11
 +		opt.add_option('--'+i,type='string',default='',dest=i)
 +	opt.add_option('--translate',action="store_true",help="collect translation strings",dest="trans_qt4",default=False)
 --- /dev/null
-+++ b/waflib/Tools/ruby.py
-@@ -0,0 +1,103 @@
-+#! /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
-+from waflib import Task,Options,Utils
-+from waflib.TaskGen import before_method,feature,after_method,Task,extension
-+from waflib.Configure import conf
-+ at feature('rubyext')
-+ at before_method('apply_incpaths','apply_lib_vars','apply_bundle','apply_link')
-+def init_rubyext(self):
-+	self.install_path='${ARCHDIR_RUBY}'
-+	self.uselib=self.to_list(getattr(self,'uselib',''))
-+	if not'RUBY'in self.uselib:
-+		self.uselib.append('RUBY')
-+	if not'RUBYEXT'in self.uselib:
-+		self.uselib.append('RUBYEXT')
-+ at feature('rubyext')
-+ at before_method('apply_link','propagate_uselib')
-+def apply_ruby_so_name(self):
-+	self.env['cshlib_PATTERN']=self.env['cxxshlib_PATTERN']=self.env['rubyext_PATTERN']
-+ at conf
-+def check_ruby_version(self,minver=()):
-+	if Options.options.rubybinary:
-+		self.env.RUBY=Options.options.rubybinary
-+	else:
-+		self.find_program('ruby',var='RUBY')
-+	ruby=self.env.RUBY
-+	try:
-+		version=self.cmd_and_log([ruby,'-e','puts defined?(VERSION) ? VERSION : RUBY_VERSION']).strip()
-+	except Exception:
-+		self.fatal('could not determine ruby version')
-+	self.env.RUBY_VERSION=version
-+	try:
-+		ver=tuple(map(int,version.split(".")))
-+	except Exception:
-+		self.fatal('unsupported ruby version %r'%version)
-+	cver=''
-+	if minver:
-+		if ver<minver:
-+			self.fatal('ruby is too old %r'%ver)
-+		cver='.'.join([str(x)for x in minver])
-+	else:
-+		cver=ver
-+	self.msg('Checking for ruby version %s'%str(minver or''),cver)
-+ at conf
-+def check_ruby_ext_devel(self):
-+	if not self.env.RUBY:
-+		self.fatal('ruby detection is required first')
-+	if not self.env.CC_NAME and not self.env.CXX_NAME:
-+		self.fatal('load a c/c++ compiler first')
-+	version=tuple(map(int,self.env.RUBY_VERSION.split(".")))
-+	def read_out(cmd):
-+		return Utils.to_list(self.cmd_and_log([self.env.RUBY,'-rrbconfig','-e',cmd]))
-+	def read_config(key):
-+		return read_out('puts Config::CONFIG[%r]'%key)
-+	ruby=self.env['RUBY']
-+	archdir=read_config('archdir')
-+	cpppath=archdir
-+	if version>=(1,9,0):
-+		ruby_hdrdir=read_config('rubyhdrdir')
-+		cpppath+=ruby_hdrdir
-+		cpppath+=[os.path.join(ruby_hdrdir[0],read_config('arch')[0])]
-+	self.check(header_name='ruby.h',includes=cpppath,errmsg='could not find ruby header file')
-+	self.env.LIBPATH_RUBYEXT=read_config('libdir')
-+	self.env.LIBPATH_RUBYEXT+=archdir
-+	self.env.INCLUDES_RUBYEXT=cpppath
-+	self.env.CFLAGS_RUBYEXT=read_config('CCDLFLAGS')
-+	self.env.rubyext_PATTERN='%s.'+read_config('DLEXT')[0]
-+	flags=read_config('LDSHARED')
-+	while flags and flags[0][0]!='-':
-+		flags=flags[1:]
-+	if len(flags)>1 and flags[1]=="ppc":
-+		flags=flags[2:]
-+	self.env.LINKFLAGS_RUBYEXT=flags
-+	self.env.LINKFLAGS_RUBYEXT+=read_config('LIBS')
-+	self.env.LINKFLAGS_RUBYEXT+=read_config('LIBRUBYARG_SHARED')
-+	if Options.options.rubyarchdir:
-+		self.env.ARCHDIR_RUBY=Options.options.rubyarchdir
-+	else:
-+		self.env.ARCHDIR_RUBY=read_config('sitearchdir')[0]
-+	if Options.options.rubylibdir:
-+		self.env.LIBDIR_RUBY=Options.options.rubylibdir
-+	else:
-+		self.env.LIBDIR_RUBY=read_config('sitelibdir')[0]
-+ at conf
-+def check_ruby_module(self,module_name):
-+	self.start_msg('Ruby module %s'%module_name)
-+	try:
-+		self.cmd_and_log([self.env['RUBY'],'-e','require \'%s\';puts 1'%module_name])
-+	except Exception:
-+		self.end_msg(False)
-+		self.fatal('Could not find the ruby module %r'%module_name)
-+	self.end_msg(True)
-+ at extension('.rb')
-+def process(self,node):
-+	tsk=self.create_task('run_ruby',node)
-+class run_ruby(Task.Task):
-+	run_str='${RUBY} ${RBFLAGS} -I ${SRC[0].parent.abspath()} ${SRC}'
-+def options(opt):
-+	opt.add_option('--with-ruby-archdir',type='string',dest='rubyarchdir',help='Specify directory where to install arch specific files')
-+	opt.add_option('--with-ruby-libdir',type='string',dest='rubylibdir',help='Specify alternate ruby library path')
-+	opt.add_option('--with-ruby-binary',type='string',dest='rubybinary',help='Specify alternate ruby binary')
---- /dev/null
-+++ b/waflib/Tools/suncc.py
-@@ -0,0 +1,54 @@
++++ b/waflib/Tools/qt5.py
+@@ -0,0 +1,498 @@
 +#! /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
-+from waflib import Utils
-+from waflib.Tools import ccroot,ar
++try:
++	from xml.sax import make_parser
++	from xml.sax.handler import ContentHandler
++except ImportError:
++	has_xml=False
++	ContentHandler=object
++else:
++	has_xml=True
++import os,sys
++from waflib.Tools import c_preproc,cxx
++from waflib import Task,Utils,Options,Errors,Context
++from waflib.TaskGen import feature,after_method,extension
 +from waflib.Configure import conf
-+ at conf
-+def find_scc(conf):
-+	v=conf.env
++from waflib import Logs
++MOC_H=['.h','.hpp','.hxx','.hh']
++EXT_RCC=['.qrc']
++EXT_UI=['.ui']
++EXT_QT5=['.cpp','.cc','.cxx','.C']
++QT5_LIBS='''
++qtmain
++Qt5Bluetooth
++Qt5CLucene
++Qt5Concurrent
++Qt5Core
++Qt5DBus
++Qt5Declarative
++Qt5DesignerComponents
++Qt5Designer
++Qt5Gui
++Qt5Help
++Qt5MultimediaQuick_p
++Qt5Multimedia
++Qt5MultimediaWidgets
++Qt5Network
++Qt5Nfc
++Qt5OpenGL
++Qt5Positioning
++Qt5PrintSupport
++Qt5Qml
++Qt5QuickParticles
++Qt5Quick
++Qt5QuickTest
++Qt5Script
++Qt5ScriptTools
++Qt5Sensors
++Qt5SerialPort
++Qt5Sql
++Qt5Svg
++Qt5Test
++Qt5WebKit
++Qt5WebKitWidgets
++Qt5Widgets
++Qt5WinExtras
++Qt5X11Extras
++Qt5XmlPatterns
++Qt5Xml'''
++class qxx(Task.classes['cxx']):
++	def __init__(self,*k,**kw):
++		Task.Task.__init__(self,*k,**kw)
++		self.moc_done=0
++	def scan(self):
++		(nodes,names)=c_preproc.scan(self)
++		lst=[]
++		for x in nodes:
++			if x.name.endswith('.moc'):
++				s=x.path_from(self.inputs[0].parent.get_bld())
++				if s not in names:
++					names.append(s)
++			else:
++				lst.append(x)
++		return(lst,names)
++	def runnable_status(self):
++		if self.moc_done:
++			return Task.Task.runnable_status(self)
++		else:
++			for t in self.run_after:
++				if not t.hasrun:
++					return Task.ASK_LATER
++			self.add_moc_tasks()
++			return Task.Task.runnable_status(self)
++	def create_moc_task(self,h_node,m_node):
++		try:
++			moc_cache=self.generator.bld.moc_cache
++		except AttributeError:
++			moc_cache=self.generator.bld.moc_cache={}
++		try:
++			return moc_cache[h_node]
++		except KeyError:
++			tsk=moc_cache[h_node]=Task.classes['moc'](env=self.env,generator=self.generator)
++			tsk.set_inputs(h_node)
++			tsk.set_outputs(m_node)
++			if self.generator:
++				self.generator.tasks.append(tsk)
++			gen=self.generator.bld.producer
++			gen.outstanding.insert(0,tsk)
++			gen.total+=1
++			return tsk
++	def add_moc_tasks(self):
++		node=self.inputs[0]
++		bld=self.generator.bld
++		try:
++			self.signature()
++		except KeyError:
++			pass
++		else:
++			delattr(self,'cache_sig')
++		moctasks=[]
++		mocfiles=[]
++		try:
++			tmp_lst=bld.raw_deps[self.uid()]
++			bld.raw_deps[self.uid()]=[]
++		except KeyError:
++			tmp_lst=[]
++		for d in tmp_lst:
++			if not d.endswith('.moc'):
++				continue
++			if d in mocfiles:
++				Logs.error("paranoia owns")
++				continue
++			mocfiles.append(d)
++			h_node=None
++			try:
++				(h_path,m_from_h)=bld.node_deps[(node.parent.abspath(),d)]
++			except KeyError:
++				pass
++			else:
++				h_node=bld.root.find_node(h_path)
++				if h_node:
++					m_node=h_node.parent.find_or_declare(m_from_h)
++			if not h_node:
++				try:ext=Options.options.qt_header_ext.split()
++				except AttributeError:pass
++				if not ext:ext=MOC_H
++				base2=d[:-4]
++				for x in[node.parent]+self.generator.includes_nodes:
++					for e in ext:
++						h_node=x.find_node(base2+e)
++						if h_node:
++							break
++					if h_node:
++						m_node=h_node.change_ext('.moc')
++						break
++				else:
++					for k in EXT_QT5:
++						if base2.endswith(k):
++							for x in[node.parent]+self.generator.includes_nodes:
++								h_node=x.find_node(base2)
++								if h_node:
++									break
++						if h_node:
++							m_node=h_node.change_ext(k+'.moc')
++							break
++				if not h_node:
++					raise Errors.WafError('no source found for %r which is a moc file'%d)
++				h_path=h_node.abspath()
++				m_from_h=m_node.path_from(h_node.parent.get_bld())
++				for name in(d,m_node.path_from(node.parent.get_bld())):
++					bld.node_deps[(node.parent.abspath(),name)]=(h_path,m_from_h)
++			task=self.create_moc_task(h_node,m_node)
++			moctasks.append(task)
++		bld.raw_deps[self.uid()]=mocfiles
++		self.run_after.update(set(moctasks))
++		self.moc_done=1
++class trans_update(Task.Task):
++	run_str='${QT_LUPDATE} ${SRC} -ts ${TGT}'
++	color='BLUE'
++Task.update_outputs(trans_update)
++class XMLHandler(ContentHandler):
++	def __init__(self):
++		self.buf=[]
++		self.files=[]
++	def startElement(self,name,attrs):
++		if name=='file':
++			self.buf=[]
++	def endElement(self,name):
++		if name=='file':
++			self.files.append(str(''.join(self.buf)))
++	def characters(self,cars):
++		self.buf.append(cars)
++ at extension(*EXT_RCC)
++def create_rcc_task(self,node):
++	rcnode=node.change_ext('_rc.cpp')
++	rcctask=self.create_task('rcc',node,rcnode)
++	cpptask=self.create_task('cxx',rcnode,rcnode.change_ext('.o'))
++	try:
++		self.compiled_tasks.append(cpptask)
++	except AttributeError:
++		self.compiled_tasks=[cpptask]
++	return cpptask
++ at extension(*EXT_UI)
++def create_uic_task(self,node):
++	uictask=self.create_task('ui5',node)
++	uictask.outputs=[self.path.find_or_declare(self.env['ui_PATTERN']%node.name[:-3])]
++ at extension('.ts')
++def add_lang(self,node):
++	self.lang=self.to_list(getattr(self,'lang',[]))+[node]
++ at feature('qt5')
++ at after_method('apply_link')
++def apply_qt5(self):
++	if getattr(self,'lang',None):
++		qmtasks=[]
++		for x in self.to_list(self.lang):
++			if isinstance(x,str):
++				x=self.path.find_resource(x+'.ts')
++			qmtasks.append(self.create_task('ts2qm',x,x.change_ext('.qm')))
++		if getattr(self,'update',None)and Options.options.trans_qt5:
++			cxxnodes=[a.inputs[0]for a in self.compiled_tasks]+[a.inputs[0]for a in self.tasks if getattr(a,'inputs',None)and a.inputs[0].name.endswith('.ui')]
++			for x in qmtasks:
++				self.create_task('trans_update',cxxnodes,x.inputs)
++		if getattr(self,'langname',None):
++			qmnodes=[x.outputs[0]for x in qmtasks]
++			rcnode=self.langname
++			if isinstance(rcnode,str):
++				rcnode=self.path.find_or_declare(rcnode+'.qrc')
++			t=self.create_task('qm2rcc',qmnodes,rcnode)
++			k=create_rcc_task(self,t.outputs[0])
++			self.link_task.inputs.append(k.outputs[0])
++	lst=[]
++	for flag in self.to_list(self.env['CXXFLAGS']):
++		if len(flag)<2:continue
++		f=flag[0:2]
++		if f in('-D','-I','/D','/I'):
++			if(f[0]=='/'):
++				lst.append('-'+flag[1:])
++			else:
++				lst.append(flag)
++	self.env.append_value('MOC_FLAGS',lst)
++ at extension(*EXT_QT5)
++def cxx_hook(self,node):
++	return self.create_compiled_task('qxx',node)
++class rcc(Task.Task):
++	color='BLUE'
++	run_str='${QT_RCC} -name ${tsk.rcname()} ${SRC[0].abspath()} ${RCC_ST} -o ${TGT}'
++	ext_out=['.h']
++	def rcname(self):
++		return os.path.splitext(self.inputs[0].name)[0]
++	def scan(self):
++		node=self.inputs[0]
++		if not has_xml:
++			Logs.error('no xml support was found, the rcc dependencies will be incomplete!')
++			return([],[])
++		parser=make_parser()
++		curHandler=XMLHandler()
++		parser.setContentHandler(curHandler)
++		fi=open(self.inputs[0].abspath(),'r')
++		try:
++			parser.parse(fi)
++		finally:
++			fi.close()
++		nodes=[]
++		names=[]
++		root=self.inputs[0].parent
++		for x in curHandler.files:
++			nd=root.find_resource(x)
++			if nd:nodes.append(nd)
++			else:names.append(x)
++		return(nodes,names)
++class moc(Task.Task):
++	color='BLUE'
++	run_str='${QT_MOC} ${MOC_FLAGS} ${MOCCPPPATH_ST:INCPATHS} ${MOCDEFINES_ST:DEFINES} ${SRC} ${MOC_ST} ${TGT}'
++class ui5(Task.Task):
++	color='BLUE'
++	run_str='${QT_UIC} ${SRC} -o ${TGT}'
++	ext_out=['.h']
++class ts2qm(Task.Task):
++	color='BLUE'
++	run_str='${QT_LRELEASE} ${QT_LRELEASE_FLAGS} ${SRC} -qm ${TGT}'
++class qm2rcc(Task.Task):
++	color='BLUE'
++	after='ts2qm'
++	def run(self):
++		txt='\n'.join(['<file>%s</file>'%k.path_from(self.outputs[0].parent)for k in self.inputs])
++		code='<!DOCTYPE RCC><RCC version="1.0">\n<qresource>\n%s\n</qresource>\n</RCC>'%txt
++		self.outputs[0].write(code)
++def configure(self):
++	self.find_qt5_binaries()
++	self.set_qt5_libs_to_check()
++	self.set_qt5_defines()
++	self.find_qt5_libraries()
++	self.add_qt5_rpath()
++	self.simplify_qt5_libs()
++ at conf
++def find_qt5_binaries(self):
++	env=self.env
++	opt=Options.options
++	qtdir=getattr(opt,'qtdir','')
++	qtbin=getattr(opt,'qtbin','')
++	paths=[]
++	if qtdir:
++		qtbin=os.path.join(qtdir,'bin')
++	if not qtdir:
++		qtdir=os.environ.get('QT5_ROOT','')
++		qtbin=os.environ.get('QT5_BIN',None)or os.path.join(qtdir,'bin')
++	if qtbin:
++		paths=[qtbin]
++	if not qtdir:
++		paths=os.environ.get('PATH','').split(os.pathsep)
++		paths.append('/usr/share/qt5/bin/')
++		try:
++			lst=Utils.listdir('/usr/local/Trolltech/')
++		except OSError:
++			pass
++		else:
++			if lst:
++				lst.sort()
++				lst.reverse()
++				qtdir='/usr/local/Trolltech/%s/'%lst[0]
++				qtbin=os.path.join(qtdir,'bin')
++				paths.append(qtbin)
++	cand=None
++	prev_ver=['5','0','0']
++	for qmk in('qmake-qt5','qmake5','qmake'):
++		try:
++			qmake=self.find_program(qmk,path_list=paths)
++		except self.errors.ConfigurationError:
++			pass
++		else:
++			try:
++				version=self.cmd_and_log(qmake+['-query','QT_VERSION']).strip()
++			except self.errors.WafError:
++				pass
++			else:
++				if version:
++					new_ver=version.split('.')
++					if new_ver>prev_ver:
++						cand=qmake
++						prev_ver=new_ver
++	if cand:
++		self.env.QMAKE=cand
++	else:
++		self.fatal('Could not find qmake for qt5')
++	qtbin=self.cmd_and_log(self.env.QMAKE+['-query','QT_INSTALL_BINS']).strip()+os.sep
++	def find_bin(lst,var):
++		if var in env:
++			return
++		for f in lst:
++			try:
++				ret=self.find_program(f,path_list=paths)
++			except self.errors.ConfigurationError:
++				pass
++			else:
++				env[var]=ret
++				break
++	find_bin(['uic-qt5','uic'],'QT_UIC')
++	if not env.QT_UIC:
++		self.fatal('cannot find the uic compiler for qt5')
++	self.start_msg('Checking for uic version')
++	uicver=self.cmd_and_log(env.QT_UIC+["-version"],output=Context.BOTH)
++	uicver=''.join(uicver).strip()
++	uicver=uicver.replace('Qt User Interface Compiler ','').replace('User Interface Compiler for Qt','')
++	self.end_msg(uicver)
++	if uicver.find(' 3.')!=-1 or uicver.find(' 4.')!=-1:
++		self.fatal('this uic compiler is for qt3 or qt5, add uic for qt5 to your path')
++	find_bin(['moc-qt5','moc'],'QT_MOC')
++	find_bin(['rcc-qt5','rcc'],'QT_RCC')
++	find_bin(['lrelease-qt5','lrelease'],'QT_LRELEASE')
++	find_bin(['lupdate-qt5','lupdate'],'QT_LUPDATE')
++	env['UIC_ST']='%s -o %s'
++	env['MOC_ST']='-o'
++	env['ui_PATTERN']='ui_%s.h'
++	env['QT_LRELEASE_FLAGS']=['-silent']
++	env.MOCCPPPATH_ST='-I%s'
++	env.MOCDEFINES_ST='-D%s'
++ at conf
++def find_qt5_libraries(self):
++	qtlibs=getattr(Options.options,'qtlibs',None)or os.environ.get("QT5_LIBDIR",None)
++	if not qtlibs:
++		try:
++			qtlibs=self.cmd_and_log(self.env.QMAKE+['-query','QT_INSTALL_LIBS']).strip()
++		except Errors.WafError:
++			qtdir=self.cmd_and_log(self.env.QMAKE+['-query','QT_INSTALL_PREFIX']).strip()+os.sep
++			qtlibs=os.path.join(qtdir,'lib')
++	self.msg('Found the Qt5 libraries in',qtlibs)
++	qtincludes=os.environ.get("QT5_INCLUDES",None)or self.cmd_and_log(self.env.QMAKE+['-query','QT_INSTALL_HEADERS']).strip()
++	env=self.env
++	if not'PKG_CONFIG_PATH'in os.environ:
++		os.environ['PKG_CONFIG_PATH']='%s:%s/pkgconfig:/usr/lib/qt5/lib/pkgconfig:/opt/qt5/lib/pkgconfig:/usr/lib/qt5/lib:/opt/qt5/lib'%(qtlibs,qtlibs)
++	try:
++		if os.environ.get("QT5_XCOMPILE",None):
++			raise self.errors.ConfigurationError()
++		self.check_cfg(atleast_pkgconfig_version='0.1')
++	except self.errors.ConfigurationError:
++		for i in self.qt5_vars:
++			uselib=i.upper()
++			if Utils.unversioned_sys_platform()=="darwin":
++				frameworkName=i+".framework"
++				qtDynamicLib=os.path.join(qtlibs,frameworkName,i)
++				if os.path.exists(qtDynamicLib):
++					env.append_unique('FRAMEWORK_'+uselib,i)
++					self.msg('Checking for %s'%i,qtDynamicLib,'GREEN')
++				else:
++					self.msg('Checking for %s'%i,False,'YELLOW')
++				env.append_unique('INCLUDES_'+uselib,os.path.join(qtlibs,frameworkName,'Headers'))
++			elif env.DEST_OS!="win32":
++				qtDynamicLib=os.path.join(qtlibs,"lib"+i+".so")
++				qtStaticLib=os.path.join(qtlibs,"lib"+i+".a")
++				if os.path.exists(qtDynamicLib):
++					env.append_unique('LIB_'+uselib,i)
++					self.msg('Checking for %s'%i,qtDynamicLib,'GREEN')
++				elif os.path.exists(qtStaticLib):
++					env.append_unique('LIB_'+uselib,i)
++					self.msg('Checking for %s'%i,qtStaticLib,'GREEN')
++				else:
++					self.msg('Checking for %s'%i,False,'YELLOW')
++				env.append_unique('LIBPATH_'+uselib,qtlibs)
++				env.append_unique('INCLUDES_'+uselib,qtincludes)
++				env.append_unique('INCLUDES_'+uselib,os.path.join(qtincludes,i))
++			else:
++				for k in("lib%s.a","lib%s5.a","%s.lib","%s5.lib"):
++					lib=os.path.join(qtlibs,k%i)
++					if os.path.exists(lib):
++						env.append_unique('LIB_'+uselib,i+k[k.find("%s")+2:k.find('.')])
++						self.msg('Checking for %s'%i,lib,'GREEN')
++						break
++				else:
++					self.msg('Checking for %s'%i,False,'YELLOW')
++				env.append_unique('LIBPATH_'+uselib,qtlibs)
++				env.append_unique('INCLUDES_'+uselib,qtincludes)
++				env.append_unique('INCLUDES_'+uselib,os.path.join(qtincludes,i))
++				uselib=i.upper()+"_debug"
++				for k in("lib%sd.a","lib%sd5.a","%sd.lib","%sd5.lib"):
++					lib=os.path.join(qtlibs,k%i)
++					if os.path.exists(lib):
++						env.append_unique('LIB_'+uselib,i+k[k.find("%s")+2:k.find('.')])
++						self.msg('Checking for %s'%i,lib,'GREEN')
++						break
++				else:
++					self.msg('Checking for %s'%i,False,'YELLOW')
++				env.append_unique('LIBPATH_'+uselib,qtlibs)
++				env.append_unique('INCLUDES_'+uselib,qtincludes)
++				env.append_unique('INCLUDES_'+uselib,os.path.join(qtincludes,i))
++	else:
++		for i in self.qt5_vars_debug+self.qt5_vars:
++			self.check_cfg(package=i,args='--cflags --libs',mandatory=False)
++ at conf
++def simplify_qt5_libs(self):
++	env=self.env
++	def process_lib(vars_,coreval):
++		for d in vars_:
++			var=d.upper()
++			if var=='QTCORE':
++				continue
++			value=env['LIBPATH_'+var]
++			if value:
++				core=env[coreval]
++				accu=[]
++				for lib in value:
++					if lib in core:
++						continue
++					accu.append(lib)
++				env['LIBPATH_'+var]=accu
++	process_lib(self.qt5_vars,'LIBPATH_QTCORE')
++	process_lib(self.qt5_vars_debug,'LIBPATH_QTCORE_DEBUG')
++ at conf
++def add_qt5_rpath(self):
++	env=self.env
++	if getattr(Options.options,'want_rpath',False):
++		def process_rpath(vars_,coreval):
++			for d in vars_:
++				var=d.upper()
++				value=env['LIBPATH_'+var]
++				if value:
++					core=env[coreval]
++					accu=[]
++					for lib in value:
++						if var!='QTCORE':
++							if lib in core:
++								continue
++						accu.append('-Wl,--rpath='+lib)
++					env['RPATH_'+var]=accu
++		process_rpath(self.qt5_vars,'LIBPATH_QTCORE')
++		process_rpath(self.qt5_vars_debug,'LIBPATH_QTCORE_DEBUG')
++ at conf
++def set_qt5_libs_to_check(self):
++	if not hasattr(self,'qt5_vars'):
++		self.qt5_vars=QT5_LIBS
++	self.qt5_vars=Utils.to_list(self.qt5_vars)
++	if not hasattr(self,'qt5_vars_debug'):
++		self.qt5_vars_debug=[a+'_debug'for a in self.qt5_vars]
++	self.qt5_vars_debug=Utils.to_list(self.qt5_vars_debug)
++ at conf
++def set_qt5_defines(self):
++	if sys.platform!='win32':
++		return
++	for x in self.qt5_vars:
++		y=x[2:].upper()
++		self.env.append_unique('DEFINES_%s'%x.upper(),'QT_%s_LIB'%y)
++		self.env.append_unique('DEFINES_%s_DEBUG'%x.upper(),'QT_%s_LIB'%y)
++def options(opt):
++	opt.add_option('--want-rpath',action='store_true',default=False,dest='want_rpath',help='enable the rpath for qt libraries')
++	opt.add_option('--header-ext',type='string',default='',help='header extension for moc files',dest='qt_header_ext')
++	for i in'qtdir qtbin qtlibs'.split():
++		opt.add_option('--'+i,type='string',default='',dest=i)
++	opt.add_option('--translate',action="store_true",help="collect translation strings",dest="trans_qt5",default=False)
+--- /dev/null
++++ b/waflib/Tools/ruby.py
+@@ -0,0 +1,103 @@
++#! /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
++from waflib import Task,Options,Utils
++from waflib.TaskGen import before_method,feature,after_method,Task,extension
++from waflib.Configure import conf
++ at feature('rubyext')
++ at before_method('apply_incpaths','apply_lib_vars','apply_bundle','apply_link')
++def init_rubyext(self):
++	self.install_path='${ARCHDIR_RUBY}'
++	self.uselib=self.to_list(getattr(self,'uselib',''))
++	if not'RUBY'in self.uselib:
++		self.uselib.append('RUBY')
++	if not'RUBYEXT'in self.uselib:
++		self.uselib.append('RUBYEXT')
++ at feature('rubyext')
++ at before_method('apply_link','propagate_uselib')
++def apply_ruby_so_name(self):
++	self.env['cshlib_PATTERN']=self.env['cxxshlib_PATTERN']=self.env['rubyext_PATTERN']
++ at conf
++def check_ruby_version(self,minver=()):
++	if Options.options.rubybinary:
++		self.env.RUBY=Options.options.rubybinary
++	else:
++		self.find_program('ruby',var='RUBY')
++	ruby=self.env.RUBY
++	try:
++		version=self.cmd_and_log(ruby+['-e','puts defined?(VERSION) ? VERSION : RUBY_VERSION']).strip()
++	except Exception:
++		self.fatal('could not determine ruby version')
++	self.env.RUBY_VERSION=version
++	try:
++		ver=tuple(map(int,version.split(".")))
++	except Exception:
++		self.fatal('unsupported ruby version %r'%version)
++	cver=''
++	if minver:
++		if ver<minver:
++			self.fatal('ruby is too old %r'%ver)
++		cver='.'.join([str(x)for x in minver])
++	else:
++		cver=ver
++	self.msg('Checking for ruby version %s'%str(minver or''),cver)
++ at conf
++def check_ruby_ext_devel(self):
++	if not self.env.RUBY:
++		self.fatal('ruby detection is required first')
++	if not self.env.CC_NAME and not self.env.CXX_NAME:
++		self.fatal('load a c/c++ compiler first')
++	version=tuple(map(int,self.env.RUBY_VERSION.split(".")))
++	def read_out(cmd):
++		return Utils.to_list(self.cmd_and_log(self.env.RUBY+['-rrbconfig','-e',cmd]))
++	def read_config(key):
++		return read_out('puts Config::CONFIG[%r]'%key)
++	ruby=self.env['RUBY']
++	archdir=read_config('archdir')
++	cpppath=archdir
++	if version>=(1,9,0):
++		ruby_hdrdir=read_config('rubyhdrdir')
++		cpppath+=ruby_hdrdir
++		cpppath+=[os.path.join(ruby_hdrdir[0],read_config('arch')[0])]
++	self.check(header_name='ruby.h',includes=cpppath,errmsg='could not find ruby header file')
++	self.env.LIBPATH_RUBYEXT=read_config('libdir')
++	self.env.LIBPATH_RUBYEXT+=archdir
++	self.env.INCLUDES_RUBYEXT=cpppath
++	self.env.CFLAGS_RUBYEXT=read_config('CCDLFLAGS')
++	self.env.rubyext_PATTERN='%s.'+read_config('DLEXT')[0]
++	flags=read_config('LDSHARED')
++	while flags and flags[0][0]!='-':
++		flags=flags[1:]
++	if len(flags)>1 and flags[1]=="ppc":
++		flags=flags[2:]
++	self.env.LINKFLAGS_RUBYEXT=flags
++	self.env.LINKFLAGS_RUBYEXT+=read_config('LIBS')
++	self.env.LINKFLAGS_RUBYEXT+=read_config('LIBRUBYARG_SHARED')
++	if Options.options.rubyarchdir:
++		self.env.ARCHDIR_RUBY=Options.options.rubyarchdir
++	else:
++		self.env.ARCHDIR_RUBY=read_config('sitearchdir')[0]
++	if Options.options.rubylibdir:
++		self.env.LIBDIR_RUBY=Options.options.rubylibdir
++	else:
++		self.env.LIBDIR_RUBY=read_config('sitelibdir')[0]
++ at conf
++def check_ruby_module(self,module_name):
++	self.start_msg('Ruby module %s'%module_name)
++	try:
++		self.cmd_and_log(self.env.RUBY+['-e','require \'%s\';puts 1'%module_name])
++	except Exception:
++		self.end_msg(False)
++		self.fatal('Could not find the ruby module %r'%module_name)
++	self.end_msg(True)
++ at extension('.rb')
++def process(self,node):
++	tsk=self.create_task('run_ruby',node)
++class run_ruby(Task.Task):
++	run_str='${RUBY} ${RBFLAGS} -I ${SRC[0].parent.abspath()} ${SRC}'
++def options(opt):
++	opt.add_option('--with-ruby-archdir',type='string',dest='rubyarchdir',help='Specify directory where to install arch specific files')
++	opt.add_option('--with-ruby-libdir',type='string',dest='rubylibdir',help='Specify alternate ruby library path')
++	opt.add_option('--with-ruby-binary',type='string',dest='rubybinary',help='Specify alternate ruby binary')
+--- /dev/null
++++ b/waflib/Tools/suncc.py
+@@ -0,0 +1,53 @@
++#! /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
++from waflib import Utils
++from waflib.Tools import ccroot,ar
++from waflib.Configure import conf
++ at conf
++def find_scc(conf):
++	v=conf.env
 +	cc=None
 +	if v['CC']:cc=v['CC']
 +	elif'CC'in conf.environ:cc=conf.environ['CC']
 +	if not cc:cc=conf.find_program('cc',var='CC')
 +	if not cc:conf.fatal('Could not find a Sun C compiler')
-+	cc=conf.cmd_to_list(cc)
 +	try:
 +		conf.cmd_and_log(cc+['-flags'])
 +	except Exception:
@@ -10901,7 +11590,7 @@ Last-Update: 2014-03-11
 +	conf.link_add_flags()
 --- /dev/null
 +++ b/waflib/Tools/suncxx.py
-@@ -0,0 +1,55 @@
+@@ -0,0 +1,54 @@
 +#! /usr/bin/env python
 +# encoding: utf-8
 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
@@ -10919,7 +11608,6 @@ Last-Update: 2014-03-11
 +	if not cc:cc=conf.find_program('CC',var='CXX')
 +	if not cc:cc=conf.find_program('c++',var='CXX')
 +	if not cc:conf.fatal('Could not find a Sun C++ compiler')
-+	cc=conf.cmd_to_list(cc)
 +	try:
 +		conf.cmd_and_log(cc+['-flags'])
 +	except Exception:
@@ -10959,13 +11647,13 @@ Last-Update: 2014-03-11
 +	conf.link_add_flags()
 --- /dev/null
 +++ b/waflib/Tools/tex.py
-@@ -0,0 +1,257 @@
+@@ -0,0 +1,315 @@
 +#! /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,re
-+from waflib import Utils,Task,Errors,Logs
++from waflib import Utils,Task,Errors,Logs,Node
 +from waflib.TaskGen import feature,before_method
 +re_bibunit=re.compile(r'\\(?P<type>putbib)\[(?P<file>[^\[\]]*)\]',re.M)
 +def bibunitscan(self):
@@ -10976,7 +11664,7 @@ Last-Update: 2014-03-11
 +	for match in re_bibunit.finditer(code):
 +		path=match.group('file')
 +		if path:
-+			for k in['','.bib']:
++			for k in('','.bib'):
 +				Logs.debug('tex: trying %s%s'%(path,k))
 +				fi=node.parent.find_resource(path+k)
 +				if fi:
@@ -10985,10 +11673,11 @@ Last-Update: 2014-03-11
 +				Logs.debug('tex: could not find %s'%path)
 +	Logs.debug("tex: found the following bibunit files: %s"%nodes)
 +	return nodes
-+exts_deps_tex=['','.ltx','.tex','.bib','.pdf','.png','.eps','.ps']
++exts_deps_tex=['','.ltx','.tex','.bib','.pdf','.png','.eps','.ps','.sty']
 +exts_tex=['.ltx','.tex']
-+re_tex=re.compile(r'\\(?P<type>include|bibliography|putbib|includegraphics|input|import|bringin|lstinputlisting)(\[[^\[\]]*\])?{(?P<file>[^{}]*)}',re.M)
++re_tex=re.compile(r'\\(?P<type>usepackage|RequirePackage|include|bibliography([^\[\]{}]*)|putbib|includegraphics|input|import|bringin|lstinputlisting)(\[[^\[\]]*\])?{(?P<file>[^{}]*)}',re.M)
 +g_bibtex_re=re.compile('bibdata',re.M)
++g_glossaries_re=re.compile('\\@newglossary',re.M)
 +class tex(Task.Task):
 +	bibtex_fun,_=Task.compile_fun('${BIBTEX} ${BIBTEXFLAGS} ${SRCFILE}',shell=False)
 +	bibtex_fun.__doc__="""
@@ -10998,6 +11687,10 @@ Last-Update: 2014-03-11
 +	makeindex_fun.__doc__="""
 +	Execute the program **makeindex**
 +	"""
++	makeglossaries_fun,_=Task.compile_fun('${MAKEGLOSSARIES} ${SRCFILE}',shell=False)
++	makeglossaries_fun.__doc__="""
++	Execute the program **makeglossaries**
++	"""
 +	def exec_command(self,cmd,**kw):
 +		bld=self.generator.bld
 +		try:
@@ -11033,13 +11726,23 @@ Last-Update: 2014-03-11
 +			code=node.read()
 +			global re_tex
 +			for match in re_tex.finditer(code):
++				multibib=match.group('type')
++				if multibib and multibib.startswith('bibliography'):
++					multibib=multibib[len('bibliography'):]
++					if multibib.startswith('style'):
++						continue
++				else:
++					multibib=None
 +				for path in match.group('file').split(','):
 +					if path:
 +						add_name=True
 +						found=None
 +						for k in exts_deps_tex:
-+							Logs.debug('tex: trying %s%s'%(path,k))
-+							found=node.parent.find_resource(path+k)
++							for up in self.texinputs_nodes:
++								Logs.debug('tex: trying %s%s'%(path,k))
++								found=up.find_resource(path+k)
++								if found:
++									break
 +							for tsk in self.generator.tasks:
 +								if not found or found in tsk.outputs:
 +									break
@@ -11050,6 +11753,11 @@ Last-Update: 2014-03-11
 +									if found.name.endswith(ext):
 +										parse_node(found)
 +										break
++							if found and multibib and found.name.endswith('.bib'):
++								try:
++									self.multibibs.append(found)
++								except AttributeError:
++									self.multibibs=[found]
 +						if add_name:
 +							names.append(path)
 +		parse_node(node)
@@ -11068,12 +11776,18 @@ Last-Update: 2014-03-11
 +				Logs.error('Error reading %s: %r'%aux_node.abspath())
 +				continue
 +			if g_bibtex_re.findall(ct):
-+				Logs.warn('calling bibtex')
++				Logs.info('calling bibtex')
 +				self.env.env={}
 +				self.env.env.update(os.environ)
-+				self.env.env.update({'BIBINPUTS':self.TEXINPUTS,'BSTINPUTS':self.TEXINPUTS})
++				self.env.env.update({'BIBINPUTS':self.texinputs(),'BSTINPUTS':self.texinputs()})
 +				self.env.SRCFILE=aux_node.name[:-4]
 +				self.check_status('error when calling bibtex',self.bibtex_fun())
++		for node in getattr(self,'multibibs',[]):
++			self.env.env={}
++			self.env.env.update(os.environ)
++			self.env.env.update({'BIBINPUTS':self.texinputs(),'BSTINPUTS':self.texinputs()})
++			self.env.SRCFILE=node.name[:-4]
++			self.check_status('error when calling bibtex',self.bibtex_fun())
 +	def bibunits(self):
 +		try:
 +			bibunits=bibunitscan(self)
@@ -11081,21 +11795,22 @@ Last-Update: 2014-03-11
 +			Logs.error('error bibunitscan')
 +		else:
 +			if bibunits:
-+				fn=['bu'+str(i)for i in xrange(1,len(bibunits)+1)]
++				fn=['bu'+str(i)for i in range(1,len(bibunits)+1)]
 +				if fn:
-+					Logs.warn('calling bibtex on bibunits')
++					Logs.info('calling bibtex on bibunits')
 +				for f in fn:
-+					self.env.env={'BIBINPUTS':self.TEXINPUTS,'BSTINPUTS':self.TEXINPUTS}
++					self.env.env={'BIBINPUTS':self.texinputs(),'BSTINPUTS':self.texinputs()}
 +					self.env.SRCFILE=f
 +					self.check_status('error when calling bibtex',self.bibtex_fun())
 +	def makeindex(self):
++		self.idx_node=self.inputs[0].change_ext('.idx')
 +		try:
 +			idx_path=self.idx_node.abspath()
 +			os.stat(idx_path)
 +		except OSError:
-+			Logs.warn('index file %s absent, not calling makeindex'%idx_path)
++			Logs.info('index file %s absent, not calling makeindex'%idx_path)
 +		else:
-+			Logs.warn('calling makeindex')
++			Logs.info('calling makeindex')
 +			self.env.SRCFILE=self.idx_node.name
 +			self.env.env={}
 +			self.check_status('error when calling makeindex %s'%idx_path,self.makeindex_fun())
@@ -11103,47 +11818,65 @@ Last-Update: 2014-03-11
 +		p=self.inputs[0].parent.get_bld()
 +		if os.path.exists(os.path.join(p.abspath(),'btaux.aux')):
 +			self.aux_nodes+=p.ant_glob('*[0-9].aux')
++	def makeglossaries(self):
++		src_file=self.inputs[0].abspath()
++		base_file=os.path.basename(src_file)
++		base,_=os.path.splitext(base_file)
++		for aux_node in self.aux_nodes:
++			try:
++				ct=aux_node.read()
++			except(OSError,IOError):
++				Logs.error('Error reading %s: %r'%aux_node.abspath())
++				continue
++			if g_glossaries_re.findall(ct):
++				if not self.env.MAKEGLOSSARIES:
++					raise Errors.WafError("The program 'makeglossaries' is missing!")
++				Logs.warn('calling makeglossaries')
++				self.env.SRCFILE=base
++				self.check_status('error when calling makeglossaries %s'%base,self.makeglossaries_fun())
++				return
++	def texinputs(self):
++		return os.pathsep.join([k.abspath()for k in self.texinputs_nodes])+os.pathsep
 +	def run(self):
 +		env=self.env
 +		if not env['PROMPT_LATEX']:
 +			env.append_value('LATEXFLAGS','-interaction=batchmode')
 +			env.append_value('PDFLATEXFLAGS','-interaction=batchmode')
 +			env.append_value('XELATEXFLAGS','-interaction=batchmode')
-+		fun=self.texfun
-+		node=self.inputs[0]
-+		srcfile=node.abspath()
-+		texinputs=self.env.TEXINPUTS or''
-+		self.TEXINPUTS=node.parent.get_bld().abspath()+os.pathsep+node.parent.get_src().abspath()+os.pathsep+texinputs+os.pathsep
 +		self.cwd=self.inputs[0].parent.get_bld().abspath()
-+		Logs.warn('first pass on %s'%self.__class__.__name__)
-+		self.env.env={}
-+		self.env.env.update(os.environ)
-+		self.env.env.update({'TEXINPUTS':self.TEXINPUTS})
-+		self.env.SRCFILE=srcfile
-+		self.check_status('error when calling latex',fun())
-+		self.aux_nodes=self.scan_aux(node.change_ext('.aux'))
-+		self.idx_node=node.change_ext('.idx')
++		Logs.info('first pass on %s'%self.__class__.__name__)
++		cur_hash=self.hash_aux_nodes()
++		self.call_latex()
++		self.hash_aux_nodes()
 +		self.bibtopic()
 +		self.bibfile()
 +		self.bibunits()
 +		self.makeindex()
-+		hash=''
++		self.makeglossaries()
 +		for i in range(10):
-+			prev_hash=hash
-+			try:
-+				hashes=[Utils.h_file(x.abspath())for x in self.aux_nodes]
-+				hash=Utils.h_list(hashes)
-+			except(OSError,IOError):
-+				Logs.error('could not read aux.h')
-+				pass
-+			if hash and hash==prev_hash:
++			prev_hash=cur_hash
++			cur_hash=self.hash_aux_nodes()
++			if not cur_hash:
++				Logs.error('No aux.h to process')
++			if cur_hash and cur_hash==prev_hash:
 +				break
-+			Logs.warn('calling %s'%self.__class__.__name__)
-+			self.env.env={}
-+			self.env.env.update(os.environ)
-+			self.env.env.update({'TEXINPUTS':self.TEXINPUTS})
-+			self.env.SRCFILE=srcfile
-+			self.check_status('error when calling %s'%self.__class__.__name__,fun())
++			Logs.info('calling %s'%self.__class__.__name__)
++			self.call_latex()
++	def hash_aux_nodes(self):
++		try:
++			nodes=self.aux_nodes
++		except AttributeError:
++			try:
++				self.aux_nodes=self.scan_aux(self.inputs[0].change_ext('.aux'))
++			except IOError:
++				return None
++		return Utils.h_list([Utils.h_file(x.abspath())for x in self.aux_nodes])
++	def call_latex(self):
++		self.env.env={}
++		self.env.env.update(os.environ)
++		self.env.env.update({'TEXINPUTS':self.texinputs()})
++		self.env.SRCFILE=self.inputs[0].abspath()
++		self.check_status('error when calling latex',self.texfun())
 +class latex(tex):
 +	texfun,vars=Task.compile_fun('${LATEX} ${LATEXFLAGS} ${SRCFILE}',shell=False)
 +class pdflatex(tex):
@@ -11165,7 +11898,7 @@ Last-Update: 2014-03-11
 + at feature('tex')
 + at before_method('process_source')
 +def apply_tex(self):
-+	if not getattr(self,'type',None)in['latex','pdflatex','xelatex']:
++	if not getattr(self,'type',None)in('latex','pdflatex','xelatex'):
 +		self.type='pdflatex'
 +	tree=self.bld
 +	outs=Utils.to_list(getattr(self,'outs',[]))
@@ -11173,12 +11906,15 @@ Last-Update: 2014-03-11
 +	deps_lst=[]
 +	if getattr(self,'deps',None):
 +		deps=self.to_list(self.deps)
-+		for filename in deps:
-+			n=self.path.find_resource(filename)
-+			if not n:
-+				self.bld.fatal('Could not find %r for %r'%(filename,self))
-+			if not n in deps_lst:
-+				deps_lst.append(n)
++		for dep in deps:
++			if isinstance(dep,str):
++				n=self.path.find_resource(dep)
++				if not n:
++					self.bld.fatal('Could not find %r for %r'%(dep,self))
++				if not n in deps_lst:
++					deps_lst.append(n)
++			elif isinstance(dep,Node.Node):
++				deps_lst.append(dep)
 +	for node in self.to_nodes(self.source):
 +		if self.type=='latex':
 +			task=self.create_task('latex',node,node.change_ext('.dvi'))
@@ -11188,30 +11924,40 @@ Last-Update: 2014-03-11
 +			task=self.create_task('xelatex',node,node.change_ext('.pdf'))
 +		task.env=self.env
 +		if deps_lst:
-+			try:
-+				lst=tree.node_deps[task.uid()]
-+				for n in deps_lst:
-+					if not n in lst:
-+						lst.append(n)
-+			except KeyError:
-+				tree.node_deps[task.uid()]=deps_lst
-+		v=dict(os.environ)
-+		p=node.parent.abspath()+os.pathsep+self.path.abspath()+os.pathsep+self.path.get_bld().abspath()+os.pathsep+v.get('TEXINPUTS','')+os.pathsep
-+		v['TEXINPUTS']=p
++			for n in deps_lst:
++				if not n in task.dep_nodes:
++					task.dep_nodes.append(n)
++		if hasattr(self,'texinputs'):
++			task.texinputs_nodes=self.texinputs_nodes
++		else:
++			task.texinputs_nodes=[node.parent,node.parent.get_bld(),self.path,self.path.get_bld()]
++			lst=os.environ.get('TEXINPUTS','')
++			if lst:
++				lst=lst.split(os.pathsep)
++			for x in lst:
++				if x:
++					if os.path.isabs(x):
++						p=self.bld.root.find_node(x)
++						if p:
++							task.texinputs_nodes.append(p)
++						else:
++							Logs.error('Invalid TEXINPUTS folder %s'%x)
++					else:
++						Logs.error('Cannot resolve relative paths in TEXINPUTS %s'%x)
 +		if self.type=='latex':
 +			if'ps'in outs:
 +				tsk=self.create_task('dvips',task.outputs,node.change_ext('.ps'))
-+				tsk.env.env=dict(v)
++				tsk.env.env=dict(os.environ)
 +			if'pdf'in outs:
 +				tsk=self.create_task('dvipdf',task.outputs,node.change_ext('.pdf'))
-+				tsk.env.env=dict(v)
++				tsk.env.env=dict(os.environ)
 +		elif self.type=='pdflatex':
 +			if'ps'in outs:
 +				self.create_task('pdf2ps',task.outputs,node.change_ext('.ps'))
 +	self.source=[]
 +def configure(self):
 +	v=self.env
-+	for p in'tex latex pdflatex xelatex bibtex dvips dvipdf ps2pdf makeindex pdf2ps'.split():
++	for p in'tex latex pdflatex xelatex bibtex dvips dvipdf ps2pdf makeindex pdf2ps makeglossaries'.split():
 +		try:
 +			self.find_program(p,var=p.upper())
 +		except self.errors.ConfigurationError:
@@ -11232,7 +11978,7 @@ Last-Update: 2014-03-11
 +	vars=["VALAC","VALAC_VERSION","VALAFLAGS"]
 +	ext_out=['.h']
 +	def run(self):
-+		cmd=[self.env['VALAC']]+self.env['VALAFLAGS']
++		cmd=self.env.VALAC+self.env.VALAFLAGS
 +		cmd.extend([a.abspath()for a in self.inputs])
 +		ret=self.exec_command(cmd,cwd=self.outputs[0].parent.abspath())
 +		if ret:
@@ -11381,7 +12127,7 @@ Last-Update: 2014-03-11
 +def find_valac(self,valac_name,min_version):
 +	valac=self.find_program(valac_name,var='VALAC')
 +	try:
-+		output=self.cmd_and_log(valac+' --version')
++		output=self.cmd_and_log(valac+['--version'])
 +	except Exception:
 +		valac_version=None
 +	else:
@@ -11423,13 +12169,13 @@ Last-Update: 2014-03-11
 +	valaopts.add_option('--vala-target-glib',default=None,dest='vala_target_glib',metavar='MAJOR.MINOR',help='Target version of glib for Vala GObject code generation')
 --- /dev/null
 +++ b/waflib/Tools/waf_unit_test.py
-@@ -0,0 +1,97 @@
+@@ -0,0 +1,101 @@
 +#! /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
-+from waflib.TaskGen import feature,after_method
++import os
++from waflib.TaskGen import feature,after_method,taskgen_method
 +from waflib import Utils,Task,Logs,Options
 +testlock=Utils.threading.Lock()
 + at feature('test')
@@ -11437,6 +12183,14 @@ Last-Update: 2014-03-11
 +def make_test(self):
 +	if getattr(self,'link_task',None):
 +		self.create_task('utest',self.link_task.outputs)
++ at taskgen_method
++def add_test_results(self,tup):
++	Logs.debug("ut: %r",tup)
++	self.utest_result=tup
++	try:
++		self.bld.utest_results.append(tup)
++	except AttributeError:
++		self.bld.utest_results=[tup]
 +class utest(Task.Task):
 +	color='PINK'
 +	after=['vnum','inst']
@@ -11449,11 +12203,9 @@ Last-Update: 2014-03-11
 +			if getattr(Options.options,'all_tests',False):
 +				return Task.RUN_ME
 +		return ret
-+	def run(self):
-+		filename=self.inputs[0].abspath()
-+		self.ut_exec=getattr(self.generator,'ut_exec',[filename])
-+		if getattr(self.generator,'ut_fun',None):
-+			self.generator.ut_fun(self)
++	def add_path(self,dct,path,var):
++		dct[var]=os.pathsep.join(Utils.to_list(path)+[os.environ.get(var,'')])
++	def get_test_env(self):
 +		try:
 +			fu=getattr(self.generator.bld,'all_test_paths')
 +		except AttributeError:
@@ -11465,32 +12217,30 @@ Last-Update: 2014-03-11
 +						s=tg.link_task.outputs[0].parent.abspath()
 +						if s not in lst:
 +							lst.append(s)
-+			def add_path(dct,path,var):
-+				dct[var]=os.pathsep.join(Utils.to_list(path)+[os.environ.get(var,'')])
 +			if Utils.is_win32:
-+				add_path(fu,lst,'PATH')
++				self.add_path(fu,lst,'PATH')
 +			elif Utils.unversioned_sys_platform()=='darwin':
-+				add_path(fu,lst,'DYLD_LIBRARY_PATH')
-+				add_path(fu,lst,'LD_LIBRARY_PATH')
++				self.add_path(fu,lst,'DYLD_LIBRARY_PATH')
++				self.add_path(fu,lst,'LD_LIBRARY_PATH')
 +			else:
-+				add_path(fu,lst,'LD_LIBRARY_PATH')
++				self.add_path(fu,lst,'LD_LIBRARY_PATH')
 +			self.generator.bld.all_test_paths=fu
++		return fu
++	def run(self):
++		filename=self.inputs[0].abspath()
++		self.ut_exec=getattr(self.generator,'ut_exec',[filename])
++		if getattr(self.generator,'ut_fun',None):
++			self.generator.ut_fun(self)
 +		cwd=getattr(self.generator,'ut_cwd','')or self.inputs[0].parent.abspath()
-+		testcmd=getattr(Options.options,'testcmd',False)
++		testcmd=getattr(self.generator,'ut_cmd',False)or getattr(Options.options,'testcmd',False)
 +		if testcmd:
 +			self.ut_exec=(testcmd%self.ut_exec[0]).split(' ')
-+		proc=Utils.subprocess.Popen(self.ut_exec,cwd=cwd,env=fu,stderr=Utils.subprocess.PIPE,stdout=Utils.subprocess.PIPE)
++		proc=Utils.subprocess.Popen(self.ut_exec,cwd=cwd,env=self.get_test_env(),stderr=Utils.subprocess.PIPE,stdout=Utils.subprocess.PIPE)
 +		(stdout,stderr)=proc.communicate()
 +		tup=(filename,proc.returncode,stdout,stderr)
-+		self.generator.utest_result=tup
 +		testlock.acquire()
 +		try:
-+			bld=self.generator.bld
-+			Logs.debug("ut: %r",tup)
-+			try:
-+				bld.utest_results.append(tup)
-+			except AttributeError:
-+				bld.utest_results=[tup]
++			return self.generator.add_test_results(tup)
 +		finally:
 +			testlock.release()
 +def summary(bld):
@@ -11611,7 +12361,7 @@ Last-Update: 2014-03-11
 +	v['WINRCFLAGS']=[]
 --- /dev/null
 +++ b/waflib/Tools/xlc.py
-@@ -0,0 +1,45 @@
+@@ -0,0 +1,44 @@
 +#! /usr/bin/env python
 +# encoding: utf-8
 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
@@ -11621,7 +12371,6 @@ Last-Update: 2014-03-11
 + at conf
 +def find_xlc(conf):
 +	cc=conf.find_program(['xlc_r','xlc'],var='CC')
-+	cc=conf.cmd_to_list(cc)
 +	conf.get_xlc_version(cc)
 +	conf.env.CC_NAME='xlc'
 +	conf.env.CC=cc
@@ -11659,7 +12408,7 @@ Last-Update: 2014-03-11
 +	conf.link_add_flags()
 --- /dev/null
 +++ b/waflib/Tools/xlcxx.py
-@@ -0,0 +1,45 @@
+@@ -0,0 +1,44 @@
 +#! /usr/bin/env python
 +# encoding: utf-8
 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
@@ -11669,7 +12418,6 @@ Last-Update: 2014-03-11
 + at conf
 +def find_xlcxx(conf):
 +	cxx=conf.find_program(['xlc++_r','xlc++'],var='CXX')
-+	cxx=conf.cmd_to_list(cxx)
 +	conf.get_xlc_version(cxx)
 +	conf.env.CXX_NAME='xlc++'
 +	conf.env.CXX=cxx
@@ -11707,19 +12455,14 @@ Last-Update: 2014-03-11
 +	conf.link_add_flags()
 --- /dev/null
 +++ b/waflib/Utils.py
-@@ -0,0 +1,412 @@
+@@ -0,0 +1,435 @@
 +#! /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)
++from collections import deque,defaultdict
 +try:
 +	import _winreg as winreg
 +except ImportError:
@@ -11742,6 +12485,8 @@ Last-Update: 2014-03-11
 +try:
 +	import threading
 +except ImportError:
++	if not'JOBS'in os.environ:
++		os.environ['JOBS']='1'
 +	class threading(object):
 +		pass
 +	class Lock(object):
@@ -11766,23 +12511,34 @@ Last-Update: 2014-03-11
 +rot_chr=['\\','|','/','-']
 +rot_idx=0
 +try:
-+	from collections import defaultdict
++	from collections import OrderedDict as ordered_iter_dict
 +except ImportError:
-+	class defaultdict(dict):
-+		def __init__(self,default_factory):
-+			super(defaultdict,self).__init__()
-+			self.default_factory=default_factory
-+		def __getitem__(self,key):
++	class ordered_iter_dict(dict):
++		def __init__(self,*k,**kw):
++			self.lst=[]
++			dict.__init__(self,*k,**kw)
++		def clear(self):
++			dict.clear(self)
++			self.lst=[]
++		def __setitem__(self,key,value):
++			dict.__setitem__(self,key,value)
 +			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'
++				self.lst.remove(key)
++			except ValueError:
++				pass
++			self.lst.append(key)
++		def __delitem__(self,key):
++			dict.__delitem__(self,key)
++			try:
++				self.lst.remove(key)
++			except ValueError:
++				pass
++		def __iter__(self):
++			for x in self.lst:
++				yield x
++		def keys(self):
++			return self.lst
++is_win32=sys.platform in('win32','cli','os2')
 +def readf(fname,m='r',encoding='ISO8859-1'):
 +	if sys.hexversion>0x3000000 and not'b'in m:
 +		m+='b'
@@ -11791,7 +12547,10 @@ Last-Update: 2014-03-11
 +			txt=f.read()
 +		finally:
 +			f.close()
-+		txt=txt.decode(encoding)
++		if encoding:
++			txt=txt.decode(encoding)
++		else:
++			txt=txt.decode()
 +	else:
 +		f=open(fname,m)
 +		try:
@@ -11818,67 +12577,70 @@ Last-Update: 2014-03-11
 +	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)
++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:
-+			f.write(data)
++			txt=f.read()
 +		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()
++		if encoding:
++			txt=txt.decode(encoding)
++		else:
++			txt=txt.decode()
++	else:
++		f=os.fdopen(fd,m)
 +		try:
-+			while fname:
-+				fname=f.read(200000)
-+				m.update(fname)
++			txt=f.read()
 +		finally:
 +			f.close()
-+		return m.digest()
-+	readf_old=readf
-+	writef_old=writef
-+	h_file_old=h_file
++	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_unix=readf
++writef_unix=writef
++h_file_unix=h_file
++if hasattr(os,'O_NOINHERIT')and sys.hexversion<0x3040000:
 +	readf=readf_win32
 +	writef=writef_win32
 +	h_file=h_file_win32
@@ -11900,27 +12662,27 @@ Last-Update: 2014-03-11
 +:param s: string to convert
 +:type s: string
 +"""
++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=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):
@@ -11941,18 +12703,7 @@ Last-Update: 2014-03-11
 +		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):
++def split_path_unix(path):
 +	return path.split('/')
 +def split_path_cygwin(path):
 +	if path.startswith('//'):
@@ -11971,6 +12722,8 @@ Last-Update: 2014-03-11
 +	split_path=split_path_cygwin
 +elif is_win32:
 +	split_path=split_path_win32
++else:
++	split_path=split_path_unix
 +split_path.__doc__="""
 +Split a path by / or \\. This function is not like os.path.split
 +
@@ -11985,12 +12738,29 @@ Last-Update: 2014-03-11
 +		except OSError ,e:
 +			if not os.path.isdir(path):
 +				raise Errors.WafError('Cannot create the folder %r'%path,ex=e)
++def check_exe(name,env=None):
++	if not name:
++		raise ValueError('Cannot execute an empty string!')
++	def is_exe(fpath):
++		return os.path.isfile(fpath)and os.access(fpath,os.X_OK)
++	fpath,fname=os.path.split(name)
++	if fpath and is_exe(name):
++		return os.path.abspath(name)
++	else:
++		env=env or os.environ
++		for path in env["PATH"].split(os.pathsep):
++			path=path.strip('"')
++			exe_file=os.path.join(path,name)
++			if is_exe(exe_file):
++				return os.path.abspath(exe_file)
++	return None
 +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=re.sub('[^a-zA-Z0-9]','_',s)
++	fu=re.sub('_+','_',fu)
 +	fu=fu.upper()
 +	return fu
 +def h_list(lst):
@@ -12046,7 +12816,8 @@ Last-Update: 2014-03-11
 +		else:s=s.lower()
 +	if s=='powerpc':
 +		return'darwin'
-+	if s=='win32'or s.endswith('os2')and s!='sunos2':return s
++	if s=='win32'or s=='os2':
++		return s
 +	return re.split('\d+$',s)[0]
 +def nada(*k,**kw):
 +	pass
@@ -12055,10 +12826,10 @@ Last-Update: 2014-03-11
 +		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
++		days=delta.days
++		hours,rem=divmod(delta.seconds,3600)
++		minutes,seconds=divmod(rem,60)
++		seconds+=delta.microseconds*1e-6
 +		result=''
 +		if days:
 +			result+='%dd'%days
@@ -12129,70 +12900,88 @@ Last-Update: 2014-03-11
 +
 --- /dev/null
 +++ b/waflib/ansiterm.py
-@@ -0,0 +1,191 @@
+@@ -0,0 +1,238 @@
 +#! /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 sys,os
++import re,sys
++from waflib.Utils import threading
++wlock=threading.Lock()
 +try:
-+	if not(sys.stderr.isatty()and sys.stdout.isatty()):
-+		raise ValueError('not a tty')
-+	from ctypes import Structure,windll,c_short,c_ushort,c_ulong,c_int,byref,POINTER,c_long,c_char
++	from ctypes import Structure,windll,c_short,c_ushort,c_ulong,c_int,byref,c_wchar,POINTER,c_long
++except ImportError:
++	class AnsiTerm(object):
++		def __init__(self,stream):
++			self.stream=stream
++			try:
++				self.errors=self.stream.errors
++			except AttributeError:
++				pass
++			self.encoding=self.stream.encoding
++		def write(self,txt):
++			try:
++				wlock.acquire()
++				self.stream.write(txt)
++				self.stream.flush()
++			finally:
++				wlock.release()
++		def fileno(self):
++			return self.stream.fileno()
++		def flush(self):
++			self.stream.flush()
++		def isatty(self):
++			return self.stream.isatty()
++else:
 +	class COORD(Structure):
 +		_fields_=[("X",c_short),("Y",c_short)]
 +	class SMALL_RECT(Structure):
 +		_fields_=[("Left",c_short),("Top",c_short),("Right",c_short),("Bottom",c_short)]
 +	class CONSOLE_SCREEN_BUFFER_INFO(Structure):
-+		_fields_=[("Size",COORD),("CursorPosition",COORD),("Attributes",c_short),("Window",SMALL_RECT),("MaximumWindowSize",COORD)]
++		_fields_=[("Size",COORD),("CursorPosition",COORD),("Attributes",c_ushort),("Window",SMALL_RECT),("MaximumWindowSize",COORD)]
 +	class CONSOLE_CURSOR_INFO(Structure):
 +		_fields_=[('dwSize',c_ulong),('bVisible',c_int)]
++	try:
++		_type=unicode
++	except NameError:
++		_type=str
++	to_int=lambda number,default:number and int(number)or default
++	STD_OUTPUT_HANDLE=-11
++	STD_ERROR_HANDLE=-12
 +	windll.kernel32.GetStdHandle.argtypes=[c_ulong]
 +	windll.kernel32.GetStdHandle.restype=c_ulong
 +	windll.kernel32.GetConsoleScreenBufferInfo.argtypes=[c_ulong,POINTER(CONSOLE_SCREEN_BUFFER_INFO)]
 +	windll.kernel32.GetConsoleScreenBufferInfo.restype=c_long
 +	windll.kernel32.SetConsoleTextAttribute.argtypes=[c_ulong,c_ushort]
 +	windll.kernel32.SetConsoleTextAttribute.restype=c_long
-+	windll.kernel32.FillConsoleOutputCharacterA.argtypes=[c_ulong,c_char,c_ulong,POINTER(COORD),POINTER(c_ulong)]
-+	windll.kernel32.FillConsoleOutputCharacterA.restype=c_long
++	windll.kernel32.FillConsoleOutputCharacterW.argtypes=[c_ulong,c_wchar,c_ulong,POINTER(COORD),POINTER(c_ulong)]
++	windll.kernel32.FillConsoleOutputCharacterW.restype=c_long
 +	windll.kernel32.FillConsoleOutputAttribute.argtypes=[c_ulong,c_ushort,c_ulong,POINTER(COORD),POINTER(c_ulong)]
 +	windll.kernel32.FillConsoleOutputAttribute.restype=c_long
 +	windll.kernel32.SetConsoleCursorPosition.argtypes=[c_ulong,POINTER(COORD)]
 +	windll.kernel32.SetConsoleCursorPosition.restype=c_long
 +	windll.kernel32.SetConsoleCursorInfo.argtypes=[c_ulong,POINTER(CONSOLE_CURSOR_INFO)]
 +	windll.kernel32.SetConsoleCursorInfo.restype=c_long
-+	sbinfo=CONSOLE_SCREEN_BUFFER_INFO()
-+	csinfo=CONSOLE_CURSOR_INFO()
-+	hconsole=windll.kernel32.GetStdHandle(-11)
-+	windll.kernel32.GetConsoleScreenBufferInfo(hconsole,byref(sbinfo))
-+	if sbinfo.Size.X<9 or sbinfo.Size.Y<9:raise ValueError('small console')
-+	windll.kernel32.GetConsoleCursorInfo(hconsole,byref(csinfo))
-+except Exception:
-+	pass
-+else:
-+	import re,threading
-+	is_vista=getattr(sys,"getwindowsversion",None)and sys.getwindowsversion()[0]>=6
-+	try:
-+		_type=unicode
-+	except NameError:
-+		_type=str
-+	to_int=lambda number,default:number and int(number)or default
-+	wlock=threading.Lock()
-+	STD_OUTPUT_HANDLE=-11
-+	STD_ERROR_HANDLE=-12
 +	class AnsiTerm(object):
-+		def __init__(self):
-+			self.encoding=sys.stdout.encoding
-+			self.hconsole=windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
++		def __init__(self,s):
++			self.stream=s
++			try:
++				self.errors=s.errors
++			except AttributeError:
++				pass
++			self.encoding=s.encoding
 +			self.cursor_history=[]
-+			self.orig_sbinfo=CONSOLE_SCREEN_BUFFER_INFO()
-+			self.orig_csinfo=CONSOLE_CURSOR_INFO()
-+			windll.kernel32.GetConsoleScreenBufferInfo(self.hconsole,byref(self.orig_sbinfo))
-+			windll.kernel32.GetConsoleCursorInfo(hconsole,byref(self.orig_csinfo))
++			handle=(s.fileno()==2)and STD_ERROR_HANDLE or STD_OUTPUT_HANDLE
++			self.hconsole=windll.kernel32.GetStdHandle(handle)
++			self._sbinfo=CONSOLE_SCREEN_BUFFER_INFO()
++			self._csinfo=CONSOLE_CURSOR_INFO()
++			windll.kernel32.GetConsoleCursorInfo(self.hconsole,byref(self._csinfo))
++			self._orig_sbinfo=CONSOLE_SCREEN_BUFFER_INFO()
++			r=windll.kernel32.GetConsoleScreenBufferInfo(self.hconsole,byref(self._orig_sbinfo))
++			self._isatty=r==1
 +		def screen_buffer_info(self):
-+			sbinfo=CONSOLE_SCREEN_BUFFER_INFO()
-+			windll.kernel32.GetConsoleScreenBufferInfo(self.hconsole,byref(sbinfo))
-+			return sbinfo
++			windll.kernel32.GetConsoleScreenBufferInfo(self.hconsole,byref(self._sbinfo))
++			return self._sbinfo
 +		def clear_line(self,param):
 +			mode=param and int(param)or 0
 +			sbinfo=self.screen_buffer_info()
@@ -12206,7 +12995,7 @@ Last-Update: 2014-03-11
 +				line_start=sbinfo.CursorPosition
 +				line_length=sbinfo.Size.X-sbinfo.CursorPosition.X
 +			chars_written=c_ulong()
-+			windll.kernel32.FillConsoleOutputCharacterA(self.hconsole,c_char(' '),line_length,line_start,byref(chars_written))
++			windll.kernel32.FillConsoleOutputCharacterW(self.hconsole,c_wchar(' '),line_length,line_start,byref(chars_written))
 +			windll.kernel32.FillConsoleOutputAttribute(self.hconsole,sbinfo.Attributes,line_length,line_start,byref(chars_written))
 +		def clear_screen(self,param):
 +			mode=to_int(param,0)
@@ -12222,7 +13011,7 @@ Last-Update: 2014-03-11
 +				clear_start=sbinfo.CursorPosition
 +				clear_length=((sbinfo.Size.X-sbinfo.CursorPosition.X)+sbinfo.Size.X*(sbinfo.Size.Y-sbinfo.CursorPosition.Y))
 +			chars_written=c_ulong()
-+			windll.kernel32.FillConsoleOutputCharacterA(self.hconsole,c_char(' '),clear_length,clear_start,byref(chars_written))
++			windll.kernel32.FillConsoleOutputCharacterW(self.hconsole,c_wchar(' '),clear_length,clear_start,byref(chars_written))
 +			windll.kernel32.FillConsoleOutputAttribute(self.hconsole,sbinfo.Attributes,clear_length,clear_start,byref(chars_written))
 +		def push_cursor(self,param):
 +			sbinfo=self.screen_buffer_info()
@@ -12265,20 +13054,16 @@ Last-Update: 2014-03-11
 +			return((c&1)<<2)|(c&2)|((c&4)>>2)
 +		def set_color(self,param):
 +			cols=param.split(';')
-+			sbinfo=CONSOLE_SCREEN_BUFFER_INFO()
-+			windll.kernel32.GetConsoleScreenBufferInfo(self.hconsole,byref(sbinfo))
++			sbinfo=self.screen_buffer_info()
 +			attr=sbinfo.Attributes
 +			for c in cols:
-+				if is_vista:
-+					c=int(c)
-+				else:
-+					c=to_int(c,0)
++				c=to_int(c,0)
 +				if 29<c<38:
 +					attr=(attr&0xfff0)|self.rgb2bgr(c-30)
 +				elif 39<c<48:
 +					attr=(attr&0xff0f)|(self.rgb2bgr(c-40)<<4)
 +				elif c==0:
-+					attr=self.orig_sbinfo.Attributes
++					attr=self._orig_sbinfo.Attributes
 +				elif c==1:
 +					attr|=0x08
 +				elif c==4:
@@ -12287,23 +13072,26 @@ Last-Update: 2014-03-11
 +					attr=(attr&0xff88)|((attr&0x70)>>4)|((attr&0x07)<<4)
 +			windll.kernel32.SetConsoleTextAttribute(self.hconsole,attr)
 +		def show_cursor(self,param):
-+			csinfo.bVisible=1
-+			windll.kernel32.SetConsoleCursorInfo(self.hconsole,byref(csinfo))
++			self._csinfo.bVisible=1
++			windll.kernel32.SetConsoleCursorInfo(self.hconsole,byref(self._csinfo))
 +		def hide_cursor(self,param):
-+			csinfo.bVisible=0
-+			windll.kernel32.SetConsoleCursorInfo(self.hconsole,byref(csinfo))
++			self._csinfo.bVisible=0
++			windll.kernel32.SetConsoleCursorInfo(self.hconsole,byref(self._csinfo))
 +		ansi_command_table={'A':move_up,'B':move_down,'C':move_right,'D':move_left,'E':next_line,'F':prev_line,'G':set_column,'H':set_cursor,'f':set_cursor,'J':clear_screen,'K':clear_line,'h':show_cursor,'l':hide_cursor,'m':set_color,'s':push_cursor,'u':pop_cursor,}
 +		ansi_tokens=re.compile('(?:\x1b\[([0-9?;]*)([a-zA-Z])|([^\x1b]+))')
 +		def write(self,text):
 +			try:
 +				wlock.acquire()
-+				for param,cmd,txt in self.ansi_tokens.findall(text):
-+					if cmd:
-+						cmd_func=self.ansi_command_table.get(cmd)
-+						if cmd_func:
-+							cmd_func(self,param)
-+					else:
-+						self.writeconsole(txt)
++				if self._isatty:
++					for param,cmd,txt in self.ansi_tokens.findall(text):
++						if cmd:
++							cmd_func=self.ansi_command_table.get(cmd)
++							if cmd_func:
++								cmd_func(self,param)
++						else:
++							self.writeconsole(txt)
++				else:
++					self.stream.write(text)
 +			finally:
 +				wlock.release()
 +		def writeconsole(self,txt):
@@ -12311,16 +13099,46 @@ Last-Update: 2014-03-11
 +			writeconsole=windll.kernel32.WriteConsoleA
 +			if isinstance(txt,_type):
 +				writeconsole=windll.kernel32.WriteConsoleW
-+			TINY_STEP=3000
-+			for x in range(0,len(txt),TINY_STEP):
-+				tiny=txt[x:x+TINY_STEP]
-+				writeconsole(self.hconsole,tiny,len(tiny),byref(chars_written),None)
++			done=0
++			todo=len(txt)
++			chunk=32<<10
++			while todo!=0:
++				doing=min(chunk,todo)
++				buf=txt[done:done+doing]
++				r=writeconsole(self.hconsole,buf,doing,byref(chars_written),None)
++				if r==0:
++					chunk>>=1
++					continue
++				done+=doing
++				todo-=doing
++		def fileno(self):
++			return self.stream.fileno()
 +		def flush(self):
 +			pass
 +		def isatty(self):
-+			return True
-+	sys.stderr=sys.stdout=AnsiTerm()
-+	os.environ['TERM']='vt100'
++			return self._isatty
++	if sys.stdout.isatty()or sys.stderr.isatty():
++		handle=sys.stdout.isatty()and STD_OUTPUT_HANDLE or STD_ERROR_HANDLE
++		console=windll.kernel32.GetStdHandle(handle)
++		sbinfo=CONSOLE_SCREEN_BUFFER_INFO()
++		def get_term_cols():
++			windll.kernel32.GetConsoleScreenBufferInfo(console,byref(sbinfo))
++			return sbinfo.Size.X-1
++try:
++	import struct,fcntl,termios
++except ImportError:
++	pass
++else:
++	if sys.stdout.isatty()or sys.stderr.isatty():
++		FD=sys.stdout.isatty()and sys.stdout.fileno()or sys.stderr.fileno()
++		def fun():
++			return struct.unpack("HHHH",fcntl.ioctl(FD,termios.TIOCGWINSZ,struct.pack("HHHH",0,0,0,0)))[1]
++		try:
++			fun()
++		except Exception ,e:
++			pass
++		else:
++			get_term_cols=fun
 --- /dev/null
 +++ b/waflib/extras/__init__.py
 @@ -0,0 +1,4 @@
@@ -12330,7 +13148,7 @@ Last-Update: 2014-03-11
 +
 --- /dev/null
 +++ b/waflib/extras/compat15.py
-@@ -0,0 +1,220 @@
+@@ -0,0 +1,279 @@
 +#! /usr/bin/env python
 +# encoding: utf-8
 +# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
@@ -12359,8 +13177,36 @@ Last-Update: 2014-03-11
 +Build.BuildContext.new_task_gen=Build.BuildContext.__call__
 +Build.BuildContext.is_install=0
 +Node.Node.relpath_gen=Node.Node.path_from
++Utils.pproc=Utils.subprocess
++Utils.get_term_cols=Logs.get_term_cols
++def cmd_output(cmd,**kw):
++	silent=False
++	if'silent'in kw:
++		silent=kw['silent']
++		del(kw['silent'])
++	if'e'in kw:
++		tmp=kw['e']
++		del(kw['e'])
++		kw['env']=tmp
++	kw['shell']=isinstance(cmd,str)
++	kw['stdout']=Utils.subprocess.PIPE
++	if silent:
++		kw['stderr']=Utils.subprocess.PIPE
++	try:
++		p=Utils.subprocess.Popen(cmd,**kw)
++		output=p.communicate()[0]
++	except OSError,e:
++		raise ValueError(str(e))
++	if p.returncode:
++		if not silent:
++			msg="command execution failed: %s -> %r"%(cmd,str(output))
++			raise ValueError(msg)
++		output=''
++	return output
++Utils.cmd_output=cmd_output
 +def name_to_obj(self,s,env=None):
-+	Logs.warn('compat: change "name_to_obj(name, env)" by "get_tgen_by_name(name)"')
++	if Logs.verbose:
++		Logs.warn('compat: change "name_to_obj(name, env)" by "get_tgen_by_name(name)"')
 +	return self.get_tgen_by_name(s)
 +Build.BuildContext.name_to_obj=name_to_obj
 +def env_of_name(self,name):
@@ -12382,13 +13228,15 @@ Last-Update: 2014-03-11
 +		self.prepare_env(env)
 +		self.all_envs[name]=env
 +	else:
-+		if fromenv:Logs.warn("The environment %s may have been configured already"%name)
++		if fromenv:
++			Logs.warn("The environment %s may have been configured already"%name)
 +	return env
 +Configure.ConfigurationContext.retrieve=retrieve
 +Configure.ConfigurationContext.sub_config=Configure.ConfigurationContext.recurse
 +Configure.ConfigurationContext.check_tool=Configure.ConfigurationContext.load
 +Configure.conftest=Configure.conf
 +Configure.ConfigurationError=Errors.ConfigurationError
++Utils.WafError=Errors.WafError
 +Options.OptionsContext.sub_options=Options.OptionsContext.recurse
 +Options.OptionsContext.tool_options=Context.Context.load
 +Options.Handler=Options.OptionsContext
@@ -12409,24 +13257,32 @@ Last-Update: 2014-03-11
 +def load_tool(*k,**kw):
 +	ret=eld(*k,**kw)
 +	if'set_options'in ret.__dict__:
-+		Logs.warn('compat: rename "set_options" to options')
++		if Logs.verbose:
++			Logs.warn('compat: rename "set_options" to options')
 +		ret.options=ret.set_options
 +	if'detect'in ret.__dict__:
-+		Logs.warn('compat: rename "detect" to "configure"')
++		if Logs.verbose:
++			Logs.warn('compat: rename "detect" to "configure"')
 +		ret.configure=ret.detect
 +	return ret
 +Context.load_tool=load_tool
++def get_curdir(self):
++	return self.path.abspath()
++Context.Context.curdir=property(get_curdir,Utils.nada)
 +rev=Context.load_module
-+def load_module(path):
-+	ret=rev(path)
++def load_module(path,encoding=None):
++	ret=rev(path,encoding)
 +	if'set_options'in ret.__dict__:
-+		Logs.warn('compat: rename "set_options" to "options" (%r)'%path)
++		if Logs.verbose:
++			Logs.warn('compat: rename "set_options" to "options" (%r)'%path)
 +		ret.options=ret.set_options
 +	if'srcdir'in ret.__dict__:
-+		Logs.warn('compat: rename "srcdir" to "top" (%r)'%path)
++		if Logs.verbose:
++			Logs.warn('compat: rename "srcdir" to "top" (%r)'%path)
 +		ret.top=ret.srcdir
 +	if'blddir'in ret.__dict__:
-+		Logs.warn('compat: rename "blddir" to "out" (%r)'%path)
++		if Logs.verbose:
++			Logs.warn('compat: rename "blddir" to "out" (%r)'%path)
 +		ret.out=ret.blddir
 +	return ret
 +Context.load_module=load_module
@@ -12434,15 +13290,18 @@ Last-Update: 2014-03-11
 +def post(self):
 +	self.features=self.to_list(self.features)
 +	if'cc'in self.features:
-+		Logs.warn('compat: the feature cc does not exist anymore (use "c")')
++		if Logs.verbose:
++			Logs.warn('compat: the feature cc does not exist anymore (use "c")')
 +		self.features.remove('cc')
 +		self.features.append('c')
 +	if'cstaticlib'in self.features:
-+		Logs.warn('compat: the feature cstaticlib does not exist anymore (use "cstlib" or "cxxstlib")')
++		if Logs.verbose:
++			Logs.warn('compat: the feature cstaticlib does not exist anymore (use "cstlib" or "cxxstlib")')
 +		self.features.remove('cstaticlib')
 +		self.features.append(('cxx'in self.features)and'cxxstlib'or'cstlib')
 +	if getattr(self,'ccflags',None):
-+		Logs.warn('compat: "ccflags" was renamed to "cflags"')
++		if Logs.verbose:
++			Logs.warn('compat: "ccflags" was renamed to "cflags"')
 +		self.cflags=self.ccflags
 +	return old_post(self)
 +TaskGen.task_gen.post=post
@@ -12461,9 +13320,11 @@ Last-Update: 2014-03-11
 +	names=self.to_list(getattr(self,'uselib_local',[]))
 +	get=self.bld.get_tgen_by_name
 +	seen=set([])
++	seen_uselib=set([])
 +	tmp=Utils.deque(names)
 +	if tmp:
-+		Logs.warn('compat: "uselib_local" is deprecated, replace by "use"')
++		if Logs.verbose:
++			Logs.warn('compat: "uselib_local" is deprecated, replace by "use"')
 +	while tmp:
 +		lib_name=tmp.popleft()
 +		if lib_name in seen:
@@ -12490,9 +13351,11 @@ Last-Update: 2014-03-11
 +			if not tmp_path in env['LIBPATH']:
 +				env.prepend_value('LIBPATH',[tmp_path])
 +		for v in self.to_list(getattr(y,'uselib',[])):
-+			if not env['STLIB_'+v]:
-+				if not v in self.uselib:
-+					self.uselib.insert(0,v)
++			if v not in seen_uselib:
++				seen_uselib.add(v)
++				if not env['STLIB_'+v]:
++					if not v in self.uselib:
++						self.uselib.insert(0,v)
 +		if getattr(y,'export_includes',None):
 +			self.includes.extend(y.to_incnodes(y.export_includes))
 + at TaskGen.feature('cprogram','cxxprogram','cstlib','cxxstlib','cshlib','cxxshlib','dprogram','dstlib','dshlib')
@@ -12551,6 +13414,20 @@ Last-Update: 2014-03-11
 +	Logs.warn('compat: change "export_incdirs" by "export_includes"')
 +	self.export_includes=val
 +TaskGen.task_gen.export_incdirs=property(None,set_incdirs)
++def install_dir(self,path):
++	if not path:
++		return[]
++	destpath=Utils.subst_vars(path,self.env)
++	if self.is_install>0:
++		Logs.info('* creating %s'%destpath)
++		Utils.check_dir(destpath)
++	elif self.is_install<0:
++		Logs.info('* removing %s'%destpath)
++		try:
++			os.remove(destpath)
++		except OSError:
++			pass
++Build.BuildContext.install_dir=install_dir
 --- /dev/null
 +++ b/waflib/fixpy2.py
 @@ -0,0 +1,53 @@

-- 
mpv packaging



More information about the pkg-multimedia-commits mailing list