Chromium Code Reviews| 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 config_path) the path of a json file that dictates the files | 7 the generator flag config_path) the path of a json file that dictates the files |
| 8 and targets to search for. The following keys are supported: | 8 and targets to search for. The following keys are supported: |
| 9 files: list of paths (relative) of the files to search for. | 9 files: list of paths (relative) of the files to search for. |
| 10 targets: list of targets to search for. The target names are unqualified. | 10 targets: list of targets to search for. The target names are unqualified. |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 121 if debug: | 121 if debug: |
| 122 print 'AddSource', org_source, result[len(result) - 1] | 122 print 'AddSource', org_source, result[len(result) - 1] |
| 123 | 123 |
| 124 | 124 |
| 125 def _ExtractSourcesFromAction(action, base_path, base_path_components, | 125 def _ExtractSourcesFromAction(action, base_path, base_path_components, |
| 126 results): | 126 results): |
| 127 if 'inputs' in action: | 127 if 'inputs' in action: |
| 128 _AddSources(action['inputs'], base_path, base_path_components, results) | 128 _AddSources(action['inputs'], base_path, base_path_components, results) |
| 129 | 129 |
| 130 | 130 |
| 131 def _ToLocalPath(toplevel_dir, path): | |
| 132 """Converts |path| to a path relative to |toplevel_dir|.""" | |
| 133 if path == toplevel_dir: | |
| 134 return '' | |
| 135 if path.startswith(toplevel_dir + '/'): | |
|
scottmg
2014/09/02 22:06:45
will there be any problems with \ here?
sky
2014/09/02 22:11:29
Paths should have been mapped to / by the time we
| |
| 136 return path[len(toplevel_dir) + len('/'):] | |
| 137 return path | |
| 138 | |
| 139 | |
| 131 def _ExtractSources(target, target_dict, toplevel_dir): | 140 def _ExtractSources(target, target_dict, toplevel_dir): |
| 132 # |target| is either absolute or relative and in the format of the OS. Gyp | 141 # |target| is either absolute or relative and in the format of the OS. Gyp |
| 133 # source paths are always posix. Convert |target| to a posix path relative to | 142 # source paths are always posix. Convert |target| to a posix path relative to |
| 134 # |toplevel_dir_|. This is done to make it easy to build source paths. | 143 # |toplevel_dir_|. This is done to make it easy to build source paths. |
| 135 base_path = _ToGypPath(target) | 144 base_path = posixpath.dirname(_ToLocalPath(toplevel_dir, _ToGypPath(target))) |
| 136 if base_path == toplevel_dir: | |
| 137 base_path = '' | |
| 138 elif base_path.startswith(toplevel_dir + '/'): | |
| 139 base_path = base_path[len(toplevel_dir) + len('/'):] | |
| 140 base_path = posixpath.dirname(base_path) | |
| 141 base_path_components = base_path.split('/') | 145 base_path_components = base_path.split('/') |
| 142 | 146 |
| 143 # Add a trailing '/' so that _AddSources() can easily build paths. | 147 # Add a trailing '/' so that _AddSources() can easily build paths. |
| 144 if len(base_path): | 148 if len(base_path): |
| 145 base_path += '/' | 149 base_path += '/' |
| 146 | 150 |
| 147 if debug: | 151 if debug: |
| 148 print 'ExtractSources', target, base_path | 152 print 'ExtractSources', target, base_path |
| 149 | 153 |
| 150 results = [] | 154 results = [] |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 216 except IOError: | 220 except IOError: |
| 217 raise Exception('Unable to open file ' + config_path) | 221 raise Exception('Unable to open file ' + config_path) |
| 218 except ValueError as e: | 222 except ValueError as e: |
| 219 raise Exception('Unable to parse config file ' + config_path + str(e)) | 223 raise Exception('Unable to parse config file ' + config_path + str(e)) |
| 220 if not isinstance(config, dict): | 224 if not isinstance(config, dict): |
| 221 raise Exception('config_path must be a JSON file containing a dictionary') | 225 raise Exception('config_path must be a JSON file containing a dictionary') |
| 222 self.files = config.get('files', []) | 226 self.files = config.get('files', []) |
| 223 self.targets = set(config.get('targets', [])) | 227 self.targets = set(config.get('targets', [])) |
| 224 | 228 |
| 225 | 229 |
| 226 def _WasBuildFileModified(build_file, data, files): | 230 def _WasBuildFileModified(build_file, data, files, toplevel_dir): |
| 227 """Returns true if the build file |build_file| is either in |files| or | 231 """Returns true if the build file |build_file| is either in |files| or |
| 228 one of the files included by |build_file| is in |files|.""" | 232 one of the files included by |build_file| is in |files|. |toplevel_dir| is |
| 229 if _ToGypPath(build_file) in files: | 233 the root of the source tree.""" |
| 234 if _ToLocalPath(toplevel_dir, _ToGypPath(build_file)) in files: | |
| 230 if debug: | 235 if debug: |
| 231 print 'gyp file modified', build_file | 236 print 'gyp file modified', build_file |
| 232 return True | 237 return True |
| 233 | 238 |
| 234 # First element of included_files is the file itself. | 239 # First element of included_files is the file itself. |
| 235 if len(data[build_file]['included_files']) <= 1: | 240 if len(data[build_file]['included_files']) <= 1: |
| 236 return False | 241 return False |
| 237 | 242 |
| 238 for include_file in data[build_file]['included_files'][1:]: | 243 for include_file in data[build_file]['included_files'][1:]: |
| 239 # |included_files| are relative to the directory of the |build_file|. | 244 # |included_files| are relative to the directory of the |build_file|. |
| 240 rel_include_file = \ | 245 rel_include_file = \ |
| 241 _ToGypPath(gyp.common.UnrelativePath(include_file, build_file)) | 246 _ToGypPath(gyp.common.UnrelativePath(include_file, build_file)) |
| 242 if rel_include_file in files: | 247 if _ToLocalPath(toplevel_dir, rel_include_file) in files: |
| 243 if debug: | 248 if debug: |
| 244 print 'included gyp file modified, gyp_file=', build_file, \ | 249 print 'included gyp file modified, gyp_file=', build_file, \ |
| 245 'included file=', rel_include_file | 250 'included file=', rel_include_file |
| 246 return True | 251 return True |
| 247 return False | 252 return False |
| 248 | 253 |
| 249 | 254 |
| 250 def _GetOrCreateTargetByName(targets, target_name): | 255 def _GetOrCreateTargetByName(targets, target_name): |
| 251 """Creates or returns the Target at targets[target_name]. If there is no | 256 """Creates or returns the Target at targets[target_name]. If there is no |
| 252 Target for |target_name| one is created. Returns a tuple of whether a new | 257 Target for |target_name| one is created. Returns a tuple of whether a new |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 302 continue | 307 continue |
| 303 | 308 |
| 304 target.visited = True | 309 target.visited = True |
| 305 target.requires_build = _DoesTargetTypeRequireBuild( | 310 target.requires_build = _DoesTargetTypeRequireBuild( |
| 306 target_dicts[target_name]) | 311 target_dicts[target_name]) |
| 307 target.is_executable = target_dicts[target_name]['type'] == 'executable' | 312 target.is_executable = target_dicts[target_name]['type'] == 'executable' |
| 308 | 313 |
| 309 build_file = gyp.common.ParseQualifiedTarget(target_name)[0] | 314 build_file = gyp.common.ParseQualifiedTarget(target_name)[0] |
| 310 if not build_file in build_file_in_files: | 315 if not build_file in build_file_in_files: |
| 311 build_file_in_files[build_file] = \ | 316 build_file_in_files[build_file] = \ |
| 312 _WasBuildFileModified(build_file, data, files) | 317 _WasBuildFileModified(build_file, data, files, toplevel_dir) |
| 313 | 318 |
| 314 if build_file in build_files: | 319 if build_file in build_files: |
| 315 build_file_targets.add(target) | 320 build_file_targets.add(target) |
| 316 | 321 |
| 317 # If a build file (or any of its included files) is modified we assume all | 322 # If a build file (or any of its included files) is modified we assume all |
| 318 # targets in the file are modified. | 323 # targets in the file are modified. |
| 319 if build_file_in_files[build_file]: | 324 if build_file_in_files[build_file]: |
| 320 print 'matching target from modified build file', target_name | 325 print 'matching target from modified build file', target_name |
| 321 target.match_status = MATCH_STATUS_MATCHES | 326 target.match_status = MATCH_STATUS_MATCHES |
| 322 matching_targets.append(target) | 327 matching_targets.append(target) |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 551 result_dict = { 'targets': matched_search_targets, | 556 result_dict = { 'targets': matched_search_targets, |
| 552 'status': found_dependency_string if matching_targets else | 557 'status': found_dependency_string if matching_targets else |
| 553 no_dependency_string, | 558 no_dependency_string, |
| 554 'build_targets': build_targets} | 559 'build_targets': build_targets} |
| 555 if warning: | 560 if warning: |
| 556 result_dict['warning'] = warning | 561 result_dict['warning'] = warning |
| 557 _WriteOutput(params, **result_dict) | 562 _WriteOutput(params, **result_dict) |
| 558 | 563 |
| 559 except Exception as e: | 564 except Exception as e: |
| 560 _WriteOutput(params, error=str(e)) | 565 _WriteOutput(params, error=str(e)) |
| OLD | NEW |