OLD | NEW |
1 # Copyright (c) 2014 Google Inc. All rights reserved. | 1 # Copyright (c) 2014 Google Inc. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 """ | 5 """ |
6 This script is intended for use as a GYP_GENERATOR. It takes as input (by way of | 6 This script is intended for use as a GYP_GENERATOR. It takes as input (by way of |
7 the generator flag file_path) the list of relative file paths to consider. If | 7 the generator flag file_path) the list of relative file paths to consider. If |
8 any target has at least one of the paths as a source (or input to an action or | 8 any target has at least one of the paths as a source (or input to an action or |
9 rule) then 'Found dependency' is output, otherwise 'No dependencies' is output. | 9 rule) then 'Found dependency' is output, otherwise 'No dependencies' is output. |
10 """ | 10 """ |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
48 path = path[0:len(path) - len('#target')] | 48 path = path[0:len(path) - len('#target')] |
49 return path | 49 return path |
50 | 50 |
51 def __ExtractBasePath(target): | 51 def __ExtractBasePath(target): |
52 """Extracts the path components of the specified gyp target path.""" | 52 """Extracts the path components of the specified gyp target path.""" |
53 last_index = target.rfind('/') | 53 last_index = target.rfind('/') |
54 if last_index == -1: | 54 if last_index == -1: |
55 return '' | 55 return '' |
56 return target[0:(last_index + 1)] | 56 return target[0:(last_index + 1)] |
57 | 57 |
| 58 def __ResolveParent(path, base_path_components): |
| 59 """Resolves |path|, which starts with at least one '../'. Returns an empty |
| 60 string if the path shouldn't be considered. See __AddSources() for a |
| 61 description of |base_path_components|.""" |
| 62 depth = 0 |
| 63 while path.startswith('../'): |
| 64 depth += 1 |
| 65 path = path[3:] |
| 66 # Relative includes may go outside the source tree. For example, an action may |
| 67 # have inputs in /usr/include, which are not in the source tree. |
| 68 if depth > len(base_path_components): |
| 69 return '' |
| 70 if depth == len(base_path_components): |
| 71 return path |
| 72 return '/'.join(base_path_components[0:len(base_path_components) - depth]) + \ |
| 73 '/' + path |
| 74 |
58 def __AddSources(sources, base_path, base_path_components, result): | 75 def __AddSources(sources, base_path, base_path_components, result): |
59 """Extracts valid sources from |sources| and adds them to |result|. Each | 76 """Extracts valid sources from |sources| and adds them to |result|. Each |
60 source file is relative to |base_path|, but may contain '..'. To make | 77 source file is relative to |base_path|, but may contain '..'. To make |
61 resolving '..' easier |base_path_components| contains each of the | 78 resolving '..' easier |base_path_components| contains each of the |
62 directories in |base_path|. Additionally each source may contain variables. | 79 directories in |base_path|. Additionally each source may contain variables. |
63 Such sources are ignored as it is assumed dependencies on them are expressed | 80 Such sources are ignored as it is assumed dependencies on them are expressed |
64 and tracked in some other means.""" | 81 and tracked in some other means.""" |
65 # NOTE: gyp paths are always posix style. | 82 # NOTE: gyp paths are always posix style. |
66 for source in sources: | 83 for source in sources: |
67 if not len(source) or source.startswith('!!!') or source.startswith('$'): | 84 if not len(source) or source.startswith('!!!') or source.startswith('$'): |
68 continue | 85 continue |
69 # variable expansion may lead to //. | 86 # variable expansion may lead to //. |
70 source = source[0] + source[1:].replace('//', '/') | 87 source = source[0] + source[1:].replace('//', '/') |
71 if source.startswith('../'): | 88 if source.startswith('../'): |
72 path_components = base_path_components[:] | 89 source = __ResolveParent(source, base_path_components) |
73 # Resolve relative paths. | 90 if len(source): |
74 while source.startswith('../'): | 91 result.append(source) |
75 path_components.pop(len(path_components) - 1) | |
76 source = source[3:] | |
77 result.append('/'.join(path_components) + source) | |
78 continue | 92 continue |
79 result.append(base_path + source) | 93 result.append(base_path + source) |
80 | 94 |
81 def __ExtractSourcesFromAction(action, base_path, base_path_components, | 95 def __ExtractSourcesFromAction(action, base_path, base_path_components, |
82 results): | 96 results): |
83 if 'inputs' in action: | 97 if 'inputs' in action: |
84 __AddSources(action['inputs'], base_path, base_path_components, results) | 98 __AddSources(action['inputs'], base_path, base_path_components, results) |
85 | 99 |
86 def __ExtractSources(target, target_dict): | 100 def __ExtractSources(target, target_dict): |
87 base_path = posixpath.dirname(target) | 101 base_path = posixpath.dirname(target) |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 | 208 |
195 files_set = frozenset(files) | 209 files_set = frozenset(files) |
196 found_in_all_sources = 0 | 210 found_in_all_sources = 0 |
197 for target_name, target in targets.iteritems(): | 211 for target_name, target in targets.iteritems(): |
198 sources = files_set.intersection(target.sources) | 212 sources = files_set.intersection(target.sources) |
199 if len(sources): | 213 if len(sources): |
200 print 'Found dependency' | 214 print 'Found dependency' |
201 return | 215 return |
202 | 216 |
203 print 'No dependencies' | 217 print 'No dependencies' |
OLD | NEW |