Chromium Code Reviews| Index: pylib/gyp/generator/ninja.py |
| =================================================================== |
| --- pylib/gyp/generator/ninja.py (revision 1413) |
| +++ 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']) |
|
Nico
2012/06/08 19:31:02
This will make target 'a' with rule 'b_c' clash wi
Steve Block
2012/06/11 09:33:55
Yes, but I think it's unlikely we'll hit such prob
|
| 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)) |