From ee570a49d08112a9d206c24cea379667cd6f7cf0 Mon Sep 17 00:00:00 2001 From: evhub Date: Mon, 28 Jul 2014 10:42:22 -0700 Subject: [PATCH] More fixes to VSProject sorting algorithm --- site_scons/site_tools/VSProject.py | 39 ++++++++++++++++-------------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/site_scons/site_tools/VSProject.py b/site_scons/site_tools/VSProject.py index 7a83a4b1f..099d2f5dd 100644 --- a/site_scons/site_tools/VSProject.py +++ b/site_scons/site_tools/VSProject.py @@ -94,25 +94,28 @@ def is_subdir(child, parent): '''Determine if child is a subdirectory of parent''' return os.path.commonprefix([parent, child]) == parent +def _key(item): + if isinstance(item, (str, unicode)): + return ('s', item.upper(), item) + elif isinstance(item, (int, long, float)): + return ('n', item) + elif isinstance(item, (list, tuple)): + return ('l', map(_key, item)) + elif isinstance(item, dict): + return ('d', xsorted(item.keys()), xsorted(item.values())) + elif isinstance(item, Configuration): + return ('c', _key(item.name), _key(item.target), _key(item.variant), _key(item.platform)) + elif isinstance(item, Item): + return ('i', _key(item.path()), _key(item.is_compiled()), _key(item.builder()), _key(item.tag()), _key(item.is_excluded())) + elif isinstance(item, SCons.Node.FS.File): + return ('f', _key(item.name), _key(item.suffix)) + else: + return ('x', item) + def xsorted(tosort, **kwargs): '''Performs sorted in a deterministic manner.''' if 'key' in kwargs: map(kwargs['key'], tosort) - def _key(item): - if isinstance(item, (str, unicode)): - return ("s", item.upper(), item) - elif isinstance(item, (list, tuple)): - return ("l", map(_key, item)) - elif isinstance(item, dict): - return ("d", xsorted(item.keys()), xsorted(item.values())) - elif isinstance(item, Configuration): - return ("c", item.target, item.platform, item.variant) - elif isinstance(item, Item): - return ("i", item._path, item._builder) - elif isinstance(item, SCons.Node.FS.File): - return ("f", item.name, item.suffix) - else: - return ("x", item) kwargs['key'] = _key return sorted(tosort, **kwargs) @@ -582,7 +585,7 @@ class _ProjectGenerator(object): def __init__(self, project_node, filters_node, env): try: - self.configs = xsorted(env['VSPROJECT_CONFIGS'], key=lambda x: x.name) + self.configs = xsorted(env['VSPROJECT_CONFIGS']) except KeyError: raise ValueError ('Missing VSPROJECT_CONFIGS') self.root_dir = os.getcwd() @@ -620,7 +623,7 @@ class _ProjectGenerator(object): targets = config.target for target in targets: _walk(target, items) - self.items = xsorted(items.values(), key=lambda x: x.path()) + self.items = xsorted(items.values()) def makeListTag(self, items, prefix, tag, attrs, inherit=True): '''Builds an XML tag string from a list of items. If items is @@ -662,7 +665,7 @@ class _ProjectGenerator(object): f.write(' \r\n') for config in self.configs: variant = config.variant - platform = config.platform + platform = config.platform f.write(V12DSPProjectConfiguration % locals()) f.write(' \r\n')