diff options
author | Neal Norwitz <nnorwitz@gmail.com> | 2007-04-01 18:24:22 (GMT) |
---|---|---|
committer | Neal Norwitz <nnorwitz@gmail.com> | 2007-04-01 18:24:22 (GMT) |
commit | 8f35f44af3aacf1802253dc33e26e64306e55756 (patch) | |
tree | c59f9448b02da4570bdbdab7d190315113c82256 /Lib/distutils/msvccompiler.py | |
parent | 1520fe4e5856ec92fdbff23765ad19159b2f609d (diff) | |
download | cpython-8f35f44af3aacf1802253dc33e26e64306e55756.zip cpython-8f35f44af3aacf1802253dc33e26e64306e55756.tar.gz cpython-8f35f44af3aacf1802253dc33e26e64306e55756.tar.bz2 |
SF #1685563, MSVCCompiler creates redundant and long PATH strings
If MSVCCompiler.initialize() was called multiple times, the path
would get duplicated. On Windows, this is a problem because the
path is limited to 4k. There's no benefit in adding a path multiple
times, so prevent that from occuring. We also normalize the path
before checking for duplicates so things like /a and /a/ won't both
be stored.
Will backport.
Diffstat (limited to 'Lib/distutils/msvccompiler.py')
-rw-r--r-- | Lib/distutils/msvccompiler.py | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/Lib/distutils/msvccompiler.py b/Lib/distutils/msvccompiler.py index 0d72837..29a9020 100644 --- a/Lib/distutils/msvccompiler.py +++ b/Lib/distutils/msvccompiler.py @@ -187,6 +187,19 @@ def get_build_architecture(): j = string.find(sys.version, ")", i) return sys.version[i+len(prefix):j] +def normalize_and_reduce_paths(paths): + """Return a list of normalized paths with duplicates removed. + + The current order of paths is maintained. + """ + # Paths are normalized so things like: /a and /a/ aren't both preserved. + reduced_paths = [] + for p in paths: + np = os.path.normpath(p) + # XXX(nnorwitz): O(n**2), if reduced_paths gets long perhaps use a set. + if np not in reduced_paths: + reduced_paths.append(np) + return reduced_paths class MSVCCompiler (CCompiler) : @@ -270,6 +283,7 @@ class MSVCCompiler (CCompiler) : self.__paths.append(p) except KeyError: pass + self.__paths = normalize_and_reduce_paths(self.__paths) os.environ['path'] = string.join(self.__paths, ';') self.preprocess_options = None |