| Index: pylib/gyp/generator/analyzer.py
|
| diff --git a/pylib/gyp/generator/analyzer.py b/pylib/gyp/generator/analyzer.py
|
| index 0e01e9c811e287e90d9d07f5e7b293ec65f0cdf9..c093f1c6bda4fdcd466775a7af7755eec43f86ab 100644
|
| --- a/pylib/gyp/generator/analyzer.py
|
| +++ b/pylib/gyp/generator/analyzer.py
|
| @@ -274,12 +274,13 @@ def _WasBuildFileModified(build_file, data, files, toplevel_dir):
|
|
|
| def _GetOrCreateTargetByName(targets, target_name):
|
| """Creates or returns the Target at targets[target_name]. If there is no
|
| - Target for |target_name| one is created."""
|
| + Target for |target_name| one is created. Returns a tuple of whether a new
|
| + Target was created and the Target."""
|
| if target_name in targets:
|
| - return targets[target_name]
|
| + return False, targets[target_name]
|
| target = Target(target_name)
|
| targets[target_name] = target
|
| - return target
|
| + return True, target
|
|
|
|
|
| def _DoesTargetTypeRequireBuild(target_dict):
|
| @@ -294,6 +295,8 @@ def _GenerateTargets(data, target_list, target_dicts, toplevel_dir, files,
|
| """Returns a tuple of the following:
|
| . A dictionary mapping from fully qualified name to Target.
|
| . A list of the targets that have a source file in |files|.
|
| + . Set of root Targets reachable from the the files |build_files|. This
|
| + is the set of targets built by the 'all' target.
|
| This sets the |match_status| of the targets that contain any of the source
|
| files in |files| to MATCH_STATUS_MATCHES.
|
| |toplevel_dir| is the root of the source tree."""
|
| @@ -310,10 +313,18 @@ def _GenerateTargets(data, target_list, target_dicts, toplevel_dir, files,
|
| # |files|.
|
| build_file_in_files = {}
|
|
|
| + # Root targets across all files.
|
| + roots = set()
|
| +
|
| + # Set of Targets in |build_files|.
|
| + build_file_targets = set()
|
| +
|
| while len(targets_to_visit) > 0:
|
| target_name = targets_to_visit.pop()
|
| - target = _GetOrCreateTargetByName(targets, target_name)
|
| - if target.visited:
|
| + created_target, target = _GetOrCreateTargetByName(targets, target_name)
|
| + if created_target:
|
| + roots.add(target)
|
| + elif target.visited:
|
| continue
|
|
|
| target.visited = True
|
| @@ -330,6 +341,9 @@ def _GenerateTargets(data, target_list, target_dicts, toplevel_dir, files,
|
| build_file_in_files[build_file] = \
|
| _WasBuildFileModified(build_file, data, files, toplevel_dir)
|
|
|
| + if build_file in build_files:
|
| + build_file_targets.add(target)
|
| +
|
| # If a build file (or any of its included files) is modified we assume all
|
| # targets in the file are modified.
|
| if build_file_in_files[build_file]:
|
| @@ -350,12 +364,14 @@ def _GenerateTargets(data, target_list, target_dicts, toplevel_dir, files,
|
| for dep in target_dicts[target_name].get('dependencies', []):
|
| targets_to_visit.append(dep)
|
|
|
| - dep_target = _GetOrCreateTargetByName(targets, dep)
|
| + created_dep_target, dep_target = _GetOrCreateTargetByName(targets, dep)
|
| + if not created_dep_target:
|
| + roots.discard(dep_target)
|
|
|
| target.deps.add(dep_target)
|
| dep_target.back_deps.add(target)
|
|
|
| - return targets, matching_targets
|
| + return targets, matching_targets, roots & build_file_targets
|
|
|
|
|
| def _GetUnqualifiedToTargetMapping(all_targets, to_find):
|
| @@ -523,7 +539,7 @@ def GenerateOutput(target_list, target_dicts, data, params):
|
| _WriteOutput(params, **result_dict)
|
| return
|
|
|
| - all_targets, matching_targets = _GenerateTargets(
|
| + all_targets, matching_targets, _ = _GenerateTargets(
|
| data, target_list, target_dicts, toplevel_dir, frozenset(config.files),
|
| params['build_files'])
|
|
|
|
|