Index: pylib/gyp/generator/ninja.py |
=================================================================== |
--- pylib/gyp/generator/ninja.py (revision 1414) |
+++ pylib/gyp/generator/ninja.py (working copy) |
@@ -189,12 +189,12 @@ |
# into the equivalent ninja path. |
# |
# - GypPathToUniqueOutput translates a gyp path into a ninja path to write |
-# an output file; the result can be namespaced such that is unique |
+# an output file; the result can be namespaced such that it is unique |
# to the input file name as well as the output target name. |
class NinjaWriter: |
- def __init__(self, target_outputs, base_dir, build_dir, output_file, flavor, |
- abs_build_dir=None): |
+ def __init__(self, qualified_target, target_outputs, base_dir, build_dir, |
+ output_file, flavor, abs_build_dir=None): |
""" |
base_dir: path from source root to directory containing this gyp file, |
by gyp semantics, all input paths are relative to this |
@@ -202,6 +202,7 @@ |
abs_build_dir: absolute path to the build directory |
""" |
+ self.qualified_target = qualified_target |
self.target_outputs = target_outputs |
self.base_dir = base_dir |
self.build_dir = build_dir |
@@ -413,12 +414,6 @@ |
if not output: |
return None |
- if self.name != output and self.toolset == 'target': |
- # Write a short name to build this target. This benefits both the |
- # "build chrome" case as well as the gyp tests, which expect to be |
- # able to run actions and build libraries by their short name. |
- self.ninja.build(self.name, 'phony', output) |
- |
assert self.target.FinalOutput(), output |
return self.target |
@@ -508,7 +503,7 @@ |
all_outputs = [] |
for action in actions: |
# First write out a rule for the action. |
- name = action['action_name'] |
+ name = '%s_%s' % (self.qualified_target, action['action_name']) |
description = self.GenerateDescription('ACTION', |
action.get('message', None), |
name) |
@@ -541,7 +536,7 @@ |
all_outputs = [] |
for rule in rules: |
# First write out a rule for the rule action. |
- name = rule['rule_name'] |
+ name = '%s_%s' % (self.qualified_target, rule['rule_name']) |
# Skip a rule with no action and no inputs. |
if 'action' not in rule and not rule.get('rule_sources', []): |
continue |
@@ -1487,6 +1482,9 @@ |
# target_outputs is a map from qualified target name to a Target object. |
target_outputs = {} |
+ # target_short_names is a map from target short name to a list of Target |
+ # objects. |
+ target_short_names = {} |
for qualified_target in target_list: |
# qualified_target is like: third_party/icu/icu.gyp:icui18n#target |
build_file, name, toolset = \ |
@@ -1509,17 +1507,29 @@ |
output_file = os.path.join(obj, base_path, name + '.ninja') |
abs_build_dir = os.path.abspath(toplevel_build) |
- writer = NinjaWriter(target_outputs, base_path, build_dir, |
+ writer = NinjaWriter(qualified_target, target_outputs, base_path, build_dir, |
OpenOutput(os.path.join(toplevel_build, output_file)), |
flavor, abs_build_dir=abs_build_dir) |
master_ninja.subninja(output_file) |
target = writer.WriteSpec(spec, config_name, generator_flags) |
if target: |
+ if name != target.FinalOutput() and spec['toolset'] == 'target': |
+ target_short_names.setdefault(name, []).append(target) |
target_outputs[qualified_target] = target |
if qualified_target in all_targets: |
all_outputs.add(target.FinalOutput()) |
+ if target_short_names: |
+ # Write a short name to build this target. This benefits both the |
+ # "build chrome" case as well as the gyp tests, which expect to be |
+ # able to run actions and build libraries by their short name. |
+ master_ninja.newline() |
+ master_ninja.comment('Short names for targets.') |
+ for short_name in target_short_names: |
+ master_ninja.build(short_name, 'phony', [x.FinalOutput() for x in |
+ target_short_names[short_name]]) |
+ |
if all_outputs: |
master_ninja.newline() |
master_ninja.build('all', 'phony', list(all_outputs)) |