diff options
Diffstat (limited to 'pylib/gyp/generator/analyzer.py')
-rw-r--r-- | pylib/gyp/generator/analyzer.py | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/pylib/gyp/generator/analyzer.py b/pylib/gyp/generator/analyzer.py index ba53e493..9c2ef9f7 100644 --- a/pylib/gyp/generator/analyzer.py +++ b/pylib/gyp/generator/analyzer.py @@ -128,16 +128,20 @@ def _ExtractSourcesFromAction(action, base_path, base_path_components, _AddSources(action['inputs'], base_path, base_path_components, results) +def _ToLocalPath(toplevel_dir, path): + """Converts |path| to a path relative to |toplevel_dir|.""" + if path == toplevel_dir: + return '' + if path.startswith(toplevel_dir + '/'): + return path[len(toplevel_dir) + len('/'):] + return path + + def _ExtractSources(target, target_dict, toplevel_dir): # |target| is either absolute or relative and in the format of the OS. Gyp # source paths are always posix. Convert |target| to a posix path relative to # |toplevel_dir_|. This is done to make it easy to build source paths. - base_path = _ToGypPath(target) - if base_path == toplevel_dir: - base_path = '' - elif base_path.startswith(toplevel_dir + '/'): - base_path = base_path[len(toplevel_dir) + len('/'):] - base_path = posixpath.dirname(base_path) + base_path = posixpath.dirname(_ToLocalPath(toplevel_dir, _ToGypPath(target))) base_path_components = base_path.split('/') # Add a trailing '/' so that _AddSources() can easily build paths. @@ -178,7 +182,8 @@ class Target(object): See _DoesTargetTypeRequireBuild for details. added_to_compile_targets: used when determining if the target was added to the set of targets that needs to be built. - in_roots: true if this target is a descendant of one of the root nodes.""" + in_roots: true if this target is a descendant of one of the root nodes. + is_executable: true if the type of target is executable.""" def __init__(self, name): self.deps = set() self.match_status = MATCH_STATUS_TBD @@ -190,6 +195,7 @@ class Target(object): self.requires_build = False self.added_to_compile_targets = False self.in_roots = False + self.is_executable = False class Config(object): @@ -221,10 +227,11 @@ class Config(object): self.targets = set(config.get('targets', [])) -def _WasBuildFileModified(build_file, data, files): +def _WasBuildFileModified(build_file, data, files, toplevel_dir): """Returns true if the build file |build_file| is either in |files| or - one of the files included by |build_file| is in |files|.""" - if _ToGypPath(build_file) in files: + one of the files included by |build_file| is in |files|. |toplevel_dir| is + the root of the source tree.""" + if _ToLocalPath(toplevel_dir, _ToGypPath(build_file)) in files: if debug: print 'gyp file modified', build_file return True @@ -237,7 +244,7 @@ def _WasBuildFileModified(build_file, data, files): # |included_files| are relative to the directory of the |build_file|. rel_include_file = \ _ToGypPath(gyp.common.UnrelativePath(include_file, build_file)) - if rel_include_file in files: + if _ToLocalPath(toplevel_dir, rel_include_file) in files: if debug: print 'included gyp file modified, gyp_file=', build_file, \ 'included file=', rel_include_file @@ -302,11 +309,12 @@ def _GenerateTargets(data, target_list, target_dicts, toplevel_dir, files, target.visited = True target.requires_build = _DoesTargetTypeRequireBuild( target_dicts[target_name]) + target.is_executable = target_dicts[target_name]['type'] == 'executable' build_file = gyp.common.ParseQualifiedTarget(target_name)[0] if not build_file in build_file_in_files: build_file_in_files[build_file] = \ - _WasBuildFileModified(build_file, data, files) + _WasBuildFileModified(build_file, data, files, toplevel_dir) if build_file in build_files: build_file_targets.add(target) @@ -404,8 +412,13 @@ def _AddBuildTargets(target, roots, add_if_no_ancestor, result): target.added_to_compile_targets |= back_dep_target.added_to_compile_targets target.in_roots |= back_dep_target.in_roots - if not target.added_to_compile_targets and target.in_roots and \ - (add_if_no_ancestor or target.requires_build): + # Always add 'executable' targets. Even though they may be built by other + # targets that depend upon them it makes detection of what is going to be + # built easier. + if target.in_roots and \ + (target.is_executable or + (not target.added_to_compile_targets and + (add_if_no_ancestor or target.requires_build))): result.add(target) target.added_to_compile_targets = True |