Index: pylib/gyp/generator/analyzer.py |
=================================================================== |
--- pylib/gyp/generator/analyzer.py (revision 1948) |
+++ pylib/gyp/generator/analyzer.py (working copy) |
@@ -55,6 +55,23 @@ |
return '' |
return target[0:(last_index + 1)] |
+def __ResolveParent(path, base_path_components): |
+ """Resolves |path|, which starts with at least one '../'. Returns an empty |
+ string if the path shouldn't be considered. See __AddSources() for a |
+ description of |base_path_components|.""" |
+ depth = 0 |
+ while path.startswith('../'): |
+ depth += 1 |
+ path = path[3:] |
+ # Relative includes may go outside the source tree. For example, an action may |
+ # have inputs in /usr/include, which are not in the source tree. |
+ if depth > len(base_path_components): |
+ return '' |
+ if depth == len(base_path_components): |
+ return path |
+ return '/'.join(base_path_components[0:len(base_path_components) - depth]) + \ |
+ '/' + path |
+ |
def __AddSources(sources, base_path, base_path_components, result): |
"""Extracts valid sources from |sources| and adds them to |result|. Each |
source file is relative to |base_path|, but may contain '..'. To make |
@@ -69,12 +86,9 @@ |
# variable expansion may lead to //. |
source = source[0] + source[1:].replace('//', '/') |
if source.startswith('../'): |
- path_components = base_path_components[:] |
- # Resolve relative paths. |
- while source.startswith('../'): |
- path_components.pop(len(path_components) - 1) |
- source = source[3:] |
- result.append('/'.join(path_components) + source) |
+ source = __ResolveParent(source, base_path_components) |
+ if len(source): |
+ result.append(source) |
continue |
result.append(base_path + source) |