summaryrefslogtreecommitdiff
path: root/pylib/gyp/generator/analyzer.py
diff options
context:
space:
mode:
Diffstat (limited to 'pylib/gyp/generator/analyzer.py')
-rw-r--r--pylib/gyp/generator/analyzer.py41
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