| Index: build/build_nexe.py | 
| diff --git a/build/build_nexe.py b/build/build_nexe.py | 
| index ee72caba4ec1135388bac48caddb211cb6d2afcb..6c4ad3cee167f6f4c6c95409d29a541e9bd5f8de 100644 | 
| --- a/build/build_nexe.py | 
| +++ b/build/build_nexe.py | 
| @@ -9,6 +9,7 @@ This module will take a set of source files, include paths, library paths, and | 
| additional arguments, and use them to build. | 
| """ | 
|  | 
| +import hashlib | 
| from optparse import OptionParser | 
| import os | 
| import re | 
| @@ -66,7 +67,8 @@ def OpenFile(path, mode='r'): | 
|  | 
| def RemoveQuotes(opt): | 
| if opt and opt[0] == '"': | 
| -    return opt[1:-1] | 
| +    assert opt[-1] == '"', opt | 
| +    return opt[1:-1].replace('\\"', '"') | 
| return opt | 
|  | 
|  | 
| @@ -74,9 +76,9 @@ def ArgToList(opt): | 
| outlist = [] | 
| if opt is None: | 
| return outlist | 
| -  optlist = RemoveQuotes(opt).split(' ') | 
| +  optlist = opt.split(' ') | 
| for optitem in optlist: | 
| -    optitem = RemoveQuotes(optitem).replace('\\"', '"') | 
| +    optitem = RemoveQuotes(optitem) | 
| if optitem: | 
| outlist.append(optitem) | 
| return outlist | 
| @@ -227,7 +229,6 @@ class Builder(object): | 
| self.BuildLinkOptions(options.link_flags) | 
| self.BuildArchiveOptions() | 
| self.verbose = options.verbose | 
| -    self.suffix = options.suffix | 
| self.strip = options.strip | 
| self.empty = options.empty | 
| self.strip_all = options.strip_all | 
| @@ -435,13 +436,19 @@ class Builder(object): | 
| def GetObjectName(self, src): | 
| if self.strip: | 
| src = src.replace(self.strip,'') | 
| +    # Hash the full path of the source file and add 32 bits of that hash onto | 
| +    # the end of the object file name.  This helps disambiguate files with the | 
| +    # same name, because all of the object files are placed into the same | 
| +    # directory.  Technically, the correct solution would be to preserve the | 
| +    # directory structure of the input source files inside the object file | 
| +    # directory, but doing that runs the risk of running into filename length | 
| +    # issues on Windows. | 
| +    h = hashlib.sha1() | 
| +    h.update(src) | 
| +    wart = h.hexdigest()[:8] | 
| _, filename = os.path.split(src) | 
| filename, _ = os.path.splitext(filename) | 
| -    if self.suffix: | 
| -      return os.path.join(self.outdir, filename + '.o') | 
| -    else: | 
| -      filename = os.path.split(src)[1] | 
| -      return os.path.join(self.outdir, os.path.splitext(filename)[0] + '.o') | 
| +    return os.path.join(self.outdir, filename + '_' + wart + '.o') | 
|  | 
| def CleanOutput(self, out): | 
| if IsFile(out): | 
| @@ -876,8 +883,6 @@ def Main(argv): | 
| help='Do not pass sources to library.', action='store_true') | 
| parser.add_option('--no-suffix', dest='suffix', default=True, | 
| help='Do not append arch suffix.', action='store_false') | 
| -  parser.add_option('--sufix', dest='suffix', | 
| -                    help='Do append arch suffix.', action='store_true') | 
| parser.add_option('--strip-debug', dest='strip_debug', default=False, | 
| help='Strip the NEXE for debugging', action='store_true') | 
| parser.add_option('--strip-all', dest='strip_all', default=False, | 
|  |