Match file extensions in the order of declaration

This commit is contained in:
Thomas Nagy 2013-10-27 12:42:41 +01:00
parent 8f24d28534
commit b13e98f1e4
3 changed files with 40 additions and 6 deletions

View File

@ -31,8 +31,11 @@ class task_gen(object):
* The attribute 'idx' is a counter of task generators in the same path
"""
mappings = {}
mappings = Utils.ordered_iter_dict()
"""Mappings are global file extension mappings, they are retrieved in the order of definition"""
prec = Utils.defaultdict(list)
"""Dict holding the precedence rules for task generator methods"""
def __init__(self, *k, **kw):
"""
@ -64,6 +67,7 @@ class task_gen(object):
self.mappings = {}
"""
List of mappings {extension -> function} for processing files by extension
This is very rarely used, so we do not use an ordered dict here
"""
self.features = []
@ -235,9 +239,10 @@ class task_gen(object):
:rtype: function
"""
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]
@ -337,7 +342,7 @@ def declare_chain(name='', rule=None, reentrant=None, color='BLUE',
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)
@ -346,6 +351,7 @@ def declare_chain(name='', rule=None, reentrant=None, color='BLUE',
if cnt < int(reentrant):
self.source.append(k)
else:
# reinject downstream files into the build
for y in keys: # ~ nfile * nextensions :-/
if k.name.endswith(y):
self.source.append(k)

View File

@ -102,6 +102,34 @@ except ImportError:
value = self.default_factory()
self[key] = value
return value
try:
from collections import OrderedDico as ordered_iter_dict
except ImportError:
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:
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')

View File

@ -299,7 +299,7 @@ def create_waf(*k, **kw):
tarinfo.name = 'waflib/extras/' + os.path.split(x)[1]
print(" adding %s as %s" % (x, tarinfo.name))
def dest(x):
if os.path.isabs(x):
return os.path.join("extras", os.path.basename(x))