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 test_targets: unqualified target names to search for. Any target in this list | 10 test_targets: unqualified target names to search for. Any target in this list |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 | 55 |
56 In Gyp the "all" target is shorthand for the root targets in the files passed | 56 In Gyp the "all" target is shorthand for the root targets in the files passed |
57 to gyp. For example, if file "a.gyp" contains targets "a1" and | 57 to gyp. For example, if file "a.gyp" contains targets "a1" and |
58 "a2", and file "b.gyp" contains targets "b1" and "b2" and "a2" has a dependency | 58 "a2", and file "b.gyp" contains targets "b1" and "b2" and "a2" has a dependency |
59 on "b2" and gyp is supplied "a.gyp" then "all" consists of "a1" and "a2". | 59 on "b2" and gyp is supplied "a.gyp" then "all" consists of "a1" and "a2". |
60 Notice that "b1" and "b2" are not in the "all" target as "b.gyp" was not | 60 Notice that "b1" and "b2" are not in the "all" target as "b.gyp" was not |
61 directly supplied to gyp. OTOH if both "a.gyp" and "b.gyp" are supplied to gyp | 61 directly supplied to gyp. OTOH if both "a.gyp" and "b.gyp" are supplied to gyp |
62 then the "all" target includes "b1" and "b2". | 62 then the "all" target includes "b1" and "b2". |
63 """ | 63 """ |
64 | 64 |
| 65 from __future__ import print_function |
| 66 |
65 import gyp.common | 67 import gyp.common |
66 import gyp.ninja_syntax as ninja_syntax | 68 import gyp.ninja_syntax as ninja_syntax |
67 import json | 69 import json |
68 import os | 70 import os |
69 import posixpath | 71 import posixpath |
70 import sys | 72 import sys |
71 | 73 |
72 debug = False | 74 debug = False |
73 | 75 |
74 found_dependency_string = 'Found dependency' | 76 found_dependency_string = 'Found dependency' |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
148 # variable expansion may lead to //. | 150 # variable expansion may lead to //. |
149 org_source = source | 151 org_source = source |
150 source = source[0] + source[1:].replace('//', '/') | 152 source = source[0] + source[1:].replace('//', '/') |
151 if source.startswith('../'): | 153 if source.startswith('../'): |
152 source = _ResolveParent(source, base_path_components) | 154 source = _ResolveParent(source, base_path_components) |
153 if len(source): | 155 if len(source): |
154 result.append(source) | 156 result.append(source) |
155 continue | 157 continue |
156 result.append(base_path + source) | 158 result.append(base_path + source) |
157 if debug: | 159 if debug: |
158 print 'AddSource', org_source, result[len(result) - 1] | 160 print('AddSource', org_source, result[len(result) - 1]) |
159 | 161 |
160 | 162 |
161 def _ExtractSourcesFromAction(action, base_path, base_path_components, | 163 def _ExtractSourcesFromAction(action, base_path, base_path_components, |
162 results): | 164 results): |
163 if 'inputs' in action: | 165 if 'inputs' in action: |
164 _AddSources(action['inputs'], base_path, base_path_components, results) | 166 _AddSources(action['inputs'], base_path, base_path_components, results) |
165 | 167 |
166 | 168 |
167 def _ToLocalPath(toplevel_dir, path): | 169 def _ToLocalPath(toplevel_dir, path): |
168 """Converts |path| to a path relative to |toplevel_dir|.""" | 170 """Converts |path| to a path relative to |toplevel_dir|.""" |
169 if path == toplevel_dir: | 171 if path == toplevel_dir: |
170 return '' | 172 return '' |
171 if path.startswith(toplevel_dir + '/'): | 173 if path.startswith(toplevel_dir + '/'): |
172 return path[len(toplevel_dir) + len('/'):] | 174 return path[len(toplevel_dir) + len('/'):] |
173 return path | 175 return path |
174 | 176 |
175 | 177 |
176 def _ExtractSources(target, target_dict, toplevel_dir): | 178 def _ExtractSources(target, target_dict, toplevel_dir): |
177 # |target| is either absolute or relative and in the format of the OS. Gyp | 179 # |target| is either absolute or relative and in the format of the OS. Gyp |
178 # source paths are always posix. Convert |target| to a posix path relative to | 180 # source paths are always posix. Convert |target| to a posix path relative to |
179 # |toplevel_dir_|. This is done to make it easy to build source paths. | 181 # |toplevel_dir_|. This is done to make it easy to build source paths. |
180 base_path = posixpath.dirname(_ToLocalPath(toplevel_dir, _ToGypPath(target))) | 182 base_path = posixpath.dirname(_ToLocalPath(toplevel_dir, _ToGypPath(target))) |
181 base_path_components = base_path.split('/') | 183 base_path_components = base_path.split('/') |
182 | 184 |
183 # Add a trailing '/' so that _AddSources() can easily build paths. | 185 # Add a trailing '/' so that _AddSources() can easily build paths. |
184 if len(base_path): | 186 if len(base_path): |
185 base_path += '/' | 187 base_path += '/' |
186 | 188 |
187 if debug: | 189 if debug: |
188 print 'ExtractSources', target, base_path | 190 print('ExtractSources', target, base_path) |
189 | 191 |
190 results = [] | 192 results = [] |
191 if 'sources' in target_dict: | 193 if 'sources' in target_dict: |
192 _AddSources(target_dict['sources'], base_path, base_path_components, | 194 _AddSources(target_dict['sources'], base_path, base_path_components, |
193 results) | 195 results) |
194 # Include the inputs from any actions. Any changes to these affect the | 196 # Include the inputs from any actions. Any changes to these affect the |
195 # resulting output. | 197 # resulting output. |
196 if 'actions' in target_dict: | 198 if 'actions' in target_dict: |
197 for action in target_dict['actions']: | 199 for action in target_dict['actions']: |
198 _ExtractSourcesFromAction(action, base_path, base_path_components, | 200 _ExtractSourcesFromAction(action, base_path, base_path_components, |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
271 config.get('additional_compile_targets', [])) | 273 config.get('additional_compile_targets', [])) |
272 self.test_target_names = set(config.get('test_targets', [])) | 274 self.test_target_names = set(config.get('test_targets', [])) |
273 | 275 |
274 | 276 |
275 def _WasBuildFileModified(build_file, data, files, toplevel_dir): | 277 def _WasBuildFileModified(build_file, data, files, toplevel_dir): |
276 """Returns true if the build file |build_file| is either in |files| or | 278 """Returns true if the build file |build_file| is either in |files| or |
277 one of the files included by |build_file| is in |files|. |toplevel_dir| is | 279 one of the files included by |build_file| is in |files|. |toplevel_dir| is |
278 the root of the source tree.""" | 280 the root of the source tree.""" |
279 if _ToLocalPath(toplevel_dir, _ToGypPath(build_file)) in files: | 281 if _ToLocalPath(toplevel_dir, _ToGypPath(build_file)) in files: |
280 if debug: | 282 if debug: |
281 print 'gyp file modified', build_file | 283 print('gyp file modified', build_file) |
282 return True | 284 return True |
283 | 285 |
284 # First element of included_files is the file itself. | 286 # First element of included_files is the file itself. |
285 if len(data[build_file]['included_files']) <= 1: | 287 if len(data[build_file]['included_files']) <= 1: |
286 return False | 288 return False |
287 | 289 |
288 for include_file in data[build_file]['included_files'][1:]: | 290 for include_file in data[build_file]['included_files'][1:]: |
289 # |included_files| are relative to the directory of the |build_file|. | 291 # |included_files| are relative to the directory of the |build_file|. |
290 rel_include_file = \ | 292 rel_include_file = \ |
291 _ToGypPath(gyp.common.UnrelativePath(include_file, build_file)) | 293 _ToGypPath(gyp.common.UnrelativePath(include_file, build_file)) |
292 if _ToLocalPath(toplevel_dir, rel_include_file) in files: | 294 if _ToLocalPath(toplevel_dir, rel_include_file) in files: |
293 if debug: | 295 if debug: |
294 print 'included gyp file modified, gyp_file=', build_file, \ | 296 print('included gyp file modified, gyp_file=', build_file, \ |
295 'included file=', rel_include_file | 297 'included file=', rel_include_file) |
296 return True | 298 return True |
297 return False | 299 return False |
298 | 300 |
299 | 301 |
300 def _GetOrCreateTargetByName(targets, target_name): | 302 def _GetOrCreateTargetByName(targets, target_name): |
301 """Creates or returns the Target at targets[target_name]. If there is no | 303 """Creates or returns the Target at targets[target_name]. If there is no |
302 Target for |target_name| one is created. Returns a tuple of whether a new | 304 Target for |target_name| one is created. Returns a tuple of whether a new |
303 Target was created and the Target.""" | 305 Target was created and the Target.""" |
304 if target_name in targets: | 306 if target_name in targets: |
305 return False, targets[target_name] | 307 return False, targets[target_name] |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
366 if not build_file in build_file_in_files: | 368 if not build_file in build_file_in_files: |
367 build_file_in_files[build_file] = \ | 369 build_file_in_files[build_file] = \ |
368 _WasBuildFileModified(build_file, data, files, toplevel_dir) | 370 _WasBuildFileModified(build_file, data, files, toplevel_dir) |
369 | 371 |
370 if build_file in build_files: | 372 if build_file in build_files: |
371 build_file_targets.add(target) | 373 build_file_targets.add(target) |
372 | 374 |
373 # If a build file (or any of its included files) is modified we assume all | 375 # If a build file (or any of its included files) is modified we assume all |
374 # targets in the file are modified. | 376 # targets in the file are modified. |
375 if build_file_in_files[build_file]: | 377 if build_file_in_files[build_file]: |
376 print 'matching target from modified build file', target_name | 378 print('matching target from modified build file', target_name) |
377 target.match_status = MATCH_STATUS_MATCHES | 379 target.match_status = MATCH_STATUS_MATCHES |
378 matching_targets.append(target) | 380 matching_targets.append(target) |
379 else: | 381 else: |
380 sources = _ExtractSources(target_name, target_dicts[target_name], | 382 sources = _ExtractSources(target_name, target_dicts[target_name], |
381 toplevel_dir) | 383 toplevel_dir) |
382 for source in sources: | 384 for source in sources: |
383 if _ToGypPath(os.path.normpath(source)) in files: | 385 if _ToGypPath(os.path.normpath(source)) in files: |
384 print 'target', target_name, 'matches', source | 386 print('target', target_name, 'matches', source) |
385 target.match_status = MATCH_STATUS_MATCHES | 387 target.match_status = MATCH_STATUS_MATCHES |
386 matching_targets.append(target) | 388 matching_targets.append(target) |
387 break | 389 break |
388 | 390 |
389 # Add dependencies to visit as well as updating back pointers for deps. | 391 # Add dependencies to visit as well as updating back pointers for deps. |
390 for dep in target_dicts[target_name].get('dependencies', []): | 392 for dep in target_dicts[target_name].get('dependencies', []): |
391 targets_to_visit.append(dep) | 393 targets_to_visit.append(dep) |
392 | 394 |
393 created_dep_target, dep_target = _GetOrCreateTargetByName(name_to_target, | 395 created_dep_target, dep_target = _GetOrCreateTargetByName(name_to_target, |
394 dep) | 396 dep) |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
426 |matches| of the Targets as it recurses. | 428 |matches| of the Targets as it recurses. |
427 target: the Target to look for.""" | 429 target: the Target to look for.""" |
428 if target.match_status == MATCH_STATUS_DOESNT_MATCH: | 430 if target.match_status == MATCH_STATUS_DOESNT_MATCH: |
429 return False | 431 return False |
430 if target.match_status == MATCH_STATUS_MATCHES or \ | 432 if target.match_status == MATCH_STATUS_MATCHES or \ |
431 target.match_status == MATCH_STATUS_MATCHES_BY_DEPENDENCY: | 433 target.match_status == MATCH_STATUS_MATCHES_BY_DEPENDENCY: |
432 return True | 434 return True |
433 for dep in target.deps: | 435 for dep in target.deps: |
434 if _DoesTargetDependOnMatchingTargets(dep): | 436 if _DoesTargetDependOnMatchingTargets(dep): |
435 target.match_status = MATCH_STATUS_MATCHES_BY_DEPENDENCY | 437 target.match_status = MATCH_STATUS_MATCHES_BY_DEPENDENCY |
436 print '\t', target.name, 'matches by dep', dep.name | 438 print('\t', target.name, 'matches by dep', dep.name) |
437 return True | 439 return True |
438 target.match_status = MATCH_STATUS_DOESNT_MATCH | 440 target.match_status = MATCH_STATUS_DOESNT_MATCH |
439 return False | 441 return False |
440 | 442 |
441 | 443 |
442 def _GetTargetsDependingOnMatchingTargets(possible_targets): | 444 def _GetTargetsDependingOnMatchingTargets(possible_targets): |
443 """Returns the list of Targets in |possible_targets| that depend (either | 445 """Returns the list of Targets in |possible_targets| that depend (either |
444 directly on indirectly) on at least one of the targets containing the files | 446 directly on indirectly) on at least one of the targets containing the files |
445 supplied as input to analyzer. | 447 supplied as input to analyzer. |
446 possible_targets: targets to search from.""" | 448 possible_targets: targets to search from.""" |
447 found = [] | 449 found = [] |
448 print 'Targets that matched by dependency:' | 450 print('Targets that matched by dependency:') |
449 for target in possible_targets: | 451 for target in possible_targets: |
450 if _DoesTargetDependOnMatchingTargets(target): | 452 if _DoesTargetDependOnMatchingTargets(target): |
451 found.append(target) | 453 found.append(target) |
452 return found | 454 return found |
453 | 455 |
454 | 456 |
455 def _AddCompileTargets(target, roots, add_if_no_ancestor, result): | 457 def _AddCompileTargets(target, roots, add_if_no_ancestor, result): |
456 """Recurses through all targets that depend on |target|, adding all targets | 458 """Recurses through all targets that depend on |target|, adding all targets |
457 that need to be built (and are in |roots|) to |result|. | 459 that need to be built (and are in |roots|) to |result|. |
458 roots: set of root targets. | 460 roots: set of root targets. |
(...skipping 18 matching lines...) Expand all Loading... |
477 # built easier. | 479 # built easier. |
478 # And always add static_libraries that have no dependencies on them from | 480 # And always add static_libraries that have no dependencies on them from |
479 # linkables. This is necessary as the other dependencies on them may be | 481 # linkables. This is necessary as the other dependencies on them may be |
480 # static libraries themselves, which are not compile time dependencies. | 482 # static libraries themselves, which are not compile time dependencies. |
481 if target.in_roots and \ | 483 if target.in_roots and \ |
482 (target.is_executable or | 484 (target.is_executable or |
483 (not target.added_to_compile_targets and | 485 (not target.added_to_compile_targets and |
484 (add_if_no_ancestor or target.requires_build)) or | 486 (add_if_no_ancestor or target.requires_build)) or |
485 (target.is_static_library and add_if_no_ancestor and | 487 (target.is_static_library and add_if_no_ancestor and |
486 not target.is_or_has_linked_ancestor)): | 488 not target.is_or_has_linked_ancestor)): |
487 print '\t\tadding to compile targets', target.name, 'executable', \ | 489 print('\t\tadding to compile targets', target.name, 'executable', |
488 target.is_executable, 'added_to_compile_targets', \ | 490 target.is_executable, 'added_to_compile_targets', |
489 target.added_to_compile_targets, 'add_if_no_ancestor', \ | 491 target.added_to_compile_targets, 'add_if_no_ancestor', |
490 add_if_no_ancestor, 'requires_build', target.requires_build, \ | 492 add_if_no_ancestor, 'requires_build', target.requires_build, |
491 'is_static_library', target.is_static_library, \ | 493 'is_static_library', target.is_static_library, |
492 'is_or_has_linked_ancestor', target.is_or_has_linked_ancestor | 494 'is_or_has_linked_ancestor', target.is_or_has_linked_ancestor |
| 495 ) |
493 result.add(target) | 496 result.add(target) |
494 target.added_to_compile_targets = True | 497 target.added_to_compile_targets = True |
495 | 498 |
496 | 499 |
497 def _GetCompileTargets(matching_targets, supplied_targets): | 500 def _GetCompileTargets(matching_targets, supplied_targets): |
498 """Returns the set of Targets that require a build. | 501 """Returns the set of Targets that require a build. |
499 matching_targets: targets that changed and need to be built. | 502 matching_targets: targets that changed and need to be built. |
500 supplied_targets: set of targets supplied to analyzer to search from.""" | 503 supplied_targets: set of targets supplied to analyzer to search from.""" |
501 result = set() | 504 result = set() |
502 for target in matching_targets: | 505 for target in matching_targets: |
503 print 'finding compile targets for match', target.name | 506 print('finding compile targets for match', target.name) |
504 _AddCompileTargets(target, supplied_targets, True, result) | 507 _AddCompileTargets(target, supplied_targets, True, result) |
505 return result | 508 return result |
506 | 509 |
507 | 510 |
508 def _WriteOutput(params, **values): | 511 def _WriteOutput(params, **values): |
509 """Writes the output, either to stdout or a file is specified.""" | 512 """Writes the output, either to stdout or a file is specified.""" |
510 if 'error' in values: | 513 if 'error' in values: |
511 print 'Error:', values['error'] | 514 print('Error:', values['error']) |
512 if 'status' in values: | 515 if 'status' in values: |
513 print values['status'] | 516 print(values['status']) |
514 if 'targets' in values: | 517 if 'targets' in values: |
515 values['targets'].sort() | 518 values['targets'].sort() |
516 print 'Supplied targets that depend on changed files:' | 519 print('Supplied targets that depend on changed files:') |
517 for target in values['targets']: | 520 for target in values['targets']: |
518 print '\t', target | 521 print('\t', target) |
519 if 'invalid_targets' in values: | 522 if 'invalid_targets' in values: |
520 values['invalid_targets'].sort() | 523 values['invalid_targets'].sort() |
521 print 'The following targets were not found:' | 524 print('The following targets were not found:') |
522 for target in values['invalid_targets']: | 525 for target in values['invalid_targets']: |
523 print '\t', target | 526 print('\t', target) |
524 if 'build_targets' in values: | 527 if 'build_targets' in values: |
525 values['build_targets'].sort() | 528 values['build_targets'].sort() |
526 print 'Targets that require a build:' | 529 print('Targets that require a build:') |
527 for target in values['build_targets']: | 530 for target in values['build_targets']: |
528 print '\t', target | 531 print('\t', target) |
529 if 'compile_targets' in values: | 532 if 'compile_targets' in values: |
530 values['compile_targets'].sort() | 533 values['compile_targets'].sort() |
531 print 'Targets that need to be built:' | 534 print('Targets that need to be built:') |
532 for target in values['compile_targets']: | 535 for target in values['compile_targets']: |
533 print '\t', target | 536 print('\t', target) |
534 if 'test_targets' in values: | 537 if 'test_targets' in values: |
535 values['test_targets'].sort() | 538 values['test_targets'].sort() |
536 print 'Test targets:' | 539 print('Test targets:') |
537 for target in values['test_targets']: | 540 for target in values['test_targets']: |
538 print '\t', target | 541 print('\t', target) |
539 | 542 |
540 output_path = params.get('generator_flags', {}).get( | 543 output_path = params.get('generator_flags', {}).get( |
541 'analyzer_output_path', None) | 544 'analyzer_output_path', None) |
542 if not output_path: | 545 if not output_path: |
543 print json.dumps(values) | 546 print(json.dumps(values)) |
544 return | 547 return |
545 try: | 548 try: |
546 f = open(output_path, 'w') | 549 f = open(output_path, 'w') |
547 f.write(json.dumps(values) + '\n') | 550 f.write(json.dumps(values) + '\n') |
548 f.close() | 551 f.close() |
549 except IOError as e: | 552 except IOError as e: |
550 print 'Error writing to output file', output_path, str(e) | 553 print('Error writing to output file', output_path, str(e)) |
551 | 554 |
552 | 555 |
553 def _WasGypIncludeFileModified(params, files): | 556 def _WasGypIncludeFileModified(params, files): |
554 """Returns true if one of the files in |files| is in the set of included | 557 """Returns true if one of the files in |files| is in the set of included |
555 files.""" | 558 files.""" |
556 if params['options'].includes: | 559 if params['options'].includes: |
557 for include in params['options'].includes: | 560 for include in params['options'].includes: |
558 if _ToGypPath(os.path.normpath(include)) in files: | 561 if _ToGypPath(os.path.normpath(include)) in files: |
559 print 'Include file modified, assuming all changed', include | 562 print('Include file modified, assuming all changed', include) |
560 return True | 563 return True |
561 return False | 564 return False |
562 | 565 |
563 | 566 |
564 def _NamesNotIn(names, mapping): | 567 def _NamesNotIn(names, mapping): |
565 """Returns a list of the values in |names| that are not in |mapping|.""" | 568 """Returns a list of the values in |names| that are not in |mapping|.""" |
566 return [name for name in names if name not in mapping] | 569 return [name for name in names if name not in mapping] |
567 | 570 |
568 | 571 |
569 def _LookupTargets(names, mapping): | 572 def _LookupTargets(names, mapping): |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
631 test_target_names_no_all = set(self._test_target_names) | 634 test_target_names_no_all = set(self._test_target_names) |
632 test_target_names_no_all.discard('all') | 635 test_target_names_no_all.discard('all') |
633 test_targets_no_all = _LookupTargets(test_target_names_no_all, | 636 test_targets_no_all = _LookupTargets(test_target_names_no_all, |
634 self._unqualified_mapping) | 637 self._unqualified_mapping) |
635 test_target_names_contains_all = 'all' in self._test_target_names | 638 test_target_names_contains_all = 'all' in self._test_target_names |
636 if test_target_names_contains_all: | 639 if test_target_names_contains_all: |
637 test_targets = [x for x in (set(test_targets_no_all) | | 640 test_targets = [x for x in (set(test_targets_no_all) | |
638 set(self._root_targets))] | 641 set(self._root_targets))] |
639 else: | 642 else: |
640 test_targets = [x for x in test_targets_no_all] | 643 test_targets = [x for x in test_targets_no_all] |
641 print 'supplied test_targets' | 644 print('supplied test_targets') |
642 for target_name in self._test_target_names: | 645 for target_name in self._test_target_names: |
643 print '\t', target_name | 646 print('\t', target_name) |
644 print 'found test_targets' | 647 print('found test_targets') |
645 for target in test_targets: | 648 for target in test_targets: |
646 print '\t', target.name | 649 print('\t', target.name) |
647 print 'searching for matching test targets' | 650 print('searching for matching test targets') |
648 matching_test_targets = _GetTargetsDependingOnMatchingTargets(test_targets) | 651 matching_test_targets = _GetTargetsDependingOnMatchingTargets(test_targets) |
649 matching_test_targets_contains_all = (test_target_names_contains_all and | 652 matching_test_targets_contains_all = (test_target_names_contains_all and |
650 set(matching_test_targets) & | 653 set(matching_test_targets) & |
651 set(self._root_targets)) | 654 set(self._root_targets)) |
652 if matching_test_targets_contains_all: | 655 if matching_test_targets_contains_all: |
653 # Remove any of the targets for all that were not explicitly supplied, | 656 # Remove any of the targets for all that were not explicitly supplied, |
654 # 'all' is subsequentely added to the matching names below. | 657 # 'all' is subsequentely added to the matching names below. |
655 matching_test_targets = [x for x in (set(matching_test_targets) & | 658 matching_test_targets = [x for x in (set(matching_test_targets) & |
656 set(test_targets_no_all))] | 659 set(test_targets_no_all))] |
657 print 'matched test_targets' | 660 print('matched test_targets') |
658 for target in matching_test_targets: | 661 for target in matching_test_targets: |
659 print '\t', target.name | 662 print('\t', target.name) |
660 matching_target_names = [gyp.common.ParseQualifiedTarget(target.name)[1] | 663 matching_target_names = [gyp.common.ParseQualifiedTarget(target.name)[1] |
661 for target in matching_test_targets] | 664 for target in matching_test_targets] |
662 if matching_test_targets_contains_all: | 665 if matching_test_targets_contains_all: |
663 matching_target_names.append('all') | 666 matching_target_names.append('all') |
664 print '\tall' | 667 print('\tall') |
665 return matching_target_names | 668 return matching_target_names |
666 | 669 |
667 def find_matching_compile_target_names(self): | 670 def find_matching_compile_target_names(self): |
668 """Returns the set of output compile targets.""" | 671 """Returns the set of output compile targets.""" |
669 assert self.is_build_impacted(); | 672 assert self.is_build_impacted(); |
670 # Compile targets are found by searching up from changed targets. | 673 # Compile targets are found by searching up from changed targets. |
671 # Reset the visited status for _GetBuildTargets. | 674 # Reset the visited status for _GetBuildTargets. |
672 for target in self._name_to_target.itervalues(): | 675 for target in self._name_to_target.values(): |
673 target.visited = False | 676 target.visited = False |
674 | 677 |
675 supplied_targets = _LookupTargets(self._supplied_target_names_no_all(), | 678 supplied_targets = _LookupTargets(self._supplied_target_names_no_all(), |
676 self._unqualified_mapping) | 679 self._unqualified_mapping) |
677 if 'all' in self._supplied_target_names(): | 680 if 'all' in self._supplied_target_names(): |
678 supplied_targets = [x for x in (set(supplied_targets) | | 681 supplied_targets = [x for x in (set(supplied_targets) | |
679 set(self._root_targets))] | 682 set(self._root_targets))] |
680 print 'Supplied test_targets & compile_targets' | 683 print('Supplied test_targets & compile_targets') |
681 for target in supplied_targets: | 684 for target in supplied_targets: |
682 print '\t', target.name | 685 print('\t', target.name) |
683 print 'Finding compile targets' | 686 print('Finding compile targets') |
684 compile_targets = _GetCompileTargets(self._changed_targets, | 687 compile_targets = _GetCompileTargets(self._changed_targets, |
685 supplied_targets) | 688 supplied_targets) |
686 return [gyp.common.ParseQualifiedTarget(target.name)[1] | 689 return [gyp.common.ParseQualifiedTarget(target.name)[1] |
687 for target in compile_targets] | 690 for target in compile_targets] |
688 | 691 |
689 | 692 |
690 def GenerateOutput(target_list, target_dicts, data, params): | 693 def GenerateOutput(target_list, target_dicts, data, params): |
691 """Called by gyp as the final stage. Outputs results.""" | 694 """Called by gyp as the final stage. Outputs results.""" |
692 config = Config() | 695 config = Config() |
693 try: | 696 try: |
694 config.Init(params) | 697 config.Init(params) |
695 | 698 |
696 if not config.files: | 699 if not config.files: |
697 raise Exception('Must specify files to analyze via config_path generator ' | 700 raise Exception('Must specify files to analyze via config_path generator ' |
698 'flag') | 701 'flag') |
699 | 702 |
700 toplevel_dir = _ToGypPath(os.path.abspath(params['options'].toplevel_dir)) | 703 toplevel_dir = _ToGypPath(os.path.abspath(params['options'].toplevel_dir)) |
701 if debug: | 704 if debug: |
702 print 'toplevel_dir', toplevel_dir | 705 print('toplevel_dir', toplevel_dir) |
703 | 706 |
704 if _WasGypIncludeFileModified(params, config.files): | 707 if _WasGypIncludeFileModified(params, config.files): |
705 result_dict = { 'status': all_changed_string, | 708 result_dict = { 'status': all_changed_string, |
706 'test_targets': list(config.test_target_names), | 709 'test_targets': list(config.test_target_names), |
707 'compile_targets': list( | 710 'compile_targets': list( |
708 config.additional_compile_target_names | | 711 config.additional_compile_target_names | |
709 config.test_target_names) } | 712 config.test_target_names) } |
710 _WriteOutput(params, **result_dict) | 713 _WriteOutput(params, **result_dict) |
711 return | 714 return |
712 | 715 |
(...skipping 19 matching lines...) Expand all Loading... |
732 found_at_least_one_target else no_dependency_string, | 735 found_at_least_one_target else no_dependency_string, |
733 'compile_targets': list( | 736 'compile_targets': list( |
734 set(compile_target_names) | | 737 set(compile_target_names) | |
735 set(test_target_names)) } | 738 set(test_target_names)) } |
736 if calculator.invalid_targets: | 739 if calculator.invalid_targets: |
737 result_dict['invalid_targets'] = calculator.invalid_targets | 740 result_dict['invalid_targets'] = calculator.invalid_targets |
738 _WriteOutput(params, **result_dict) | 741 _WriteOutput(params, **result_dict) |
739 | 742 |
740 except Exception as e: | 743 except Exception as e: |
741 _WriteOutput(params, error=str(e)) | 744 _WriteOutput(params, error=str(e)) |
OLD | NEW |