Index: pylib/gyp/generator/ninja.py |
diff --git a/pylib/gyp/generator/ninja.py b/pylib/gyp/generator/ninja.py |
index a8ae6da0844e557d375481cf4e1adf9bbee7480b..fe222c113c8cbfc7bdbc264440a711d0d2fc9a4f 100644 |
--- a/pylib/gyp/generator/ninja.py |
+++ b/pylib/gyp/generator/ninja.py |
@@ -281,8 +281,7 @@ class NinjaWriter: |
if link_deps or sources_depends or actions_depends: |
output, output_binary = self.WriteTarget( |
spec, config_name, config, link_deps, |
- sources_depends or actions_depends, mac_bundle_depends, |
- order_only=actions_depends) |
+ sources_depends or actions_depends, mac_bundle_depends) |
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 |
@@ -572,94 +571,88 @@ class NinjaWriter: |
cmd = { 'c': 'cc', 'cc': 'cxx', 'm': 'objc', 'mm': 'objcxx', }.get(lang) |
self.ninja.build(gch, cmd, input, variables=[(var_name, lang_flag)]) |
- def WriteTarget(self, spec, config_name, config, link_deps, final_deps, |
- mac_bundle_depends, order_only): |
- if spec['type'] == 'none': |
- # This target doesn't have any explicit final output, but is instead |
- # used for its effects before the final output (e.g. copies steps). |
- # Reuse the existing output if it's easy. |
- if len(final_deps) == 1: |
- return final_deps[0], final_deps[0] |
- # Otherwise, fall through to writing out a stamp file. |
- output_uses_linker = spec['type'] in ('executable', 'loadable_module', |
- 'shared_library') |
+ def WriteLink(self, spec, config_name, config, link_deps): |
+ """Write out a link step. Returns the path to the output.""" |
+ |
+ command = { |
+ 'executable': 'link', |
+ 'loadable_module': 'solink_module', |
+ 'shared_library': 'solink', |
+ }[spec['type']] |
implicit_deps = set() |
+ |
if 'dependencies' in spec: |
# Two kinds of dependencies: |
# - Linkable dependencies (like a .a or a .so): add them to the link line. |
# - Non-linkable dependencies (like a rule that generates a file |
# and writes a stamp file): add them to implicit_deps |
- if output_uses_linker: |
- extra_link_deps = set() |
- for dep in spec['dependencies']: |
- _, binary, _, linkable = self.target_outputs.get( |
- dep, (None, None, [], False)) |
- if not binary: |
- continue |
- if linkable: |
- extra_link_deps.add(binary) |
- else: |
- # TODO: Chrome-specific HACK. Chrome runs this lastchange rule on |
- # every build, but we don't want to rebuild when it runs. |
- if 'lastchange' in binary: |
- continue |
- # TODO(evan): it's confusing that the variable here is called |
- # "binary", despite being a stamp file. Fix this. |
- implicit_deps.add(binary) |
- link_deps.extend(list(extra_link_deps)) |
+ extra_link_deps = set() |
+ for dep in spec['dependencies']: |
+ output, binary, _, linkable = self.target_outputs.get( |
+ dep, (None, None, [], False)) |
+ if not binary: |
+ continue |
+ if linkable: |
+ extra_link_deps.add(binary) |
+ |
+ # TODO: Chrome-specific HACK. Chrome runs this lastchange rule on |
+ # every build, but we don't want to rebuild when it runs. |
+ if 'lastchange' in output: |
+ continue |
+ if not linkable or output != binary: |
+ implicit_deps.add(output) |
+ link_deps.extend(list(extra_link_deps)) |
if self.is_mac_bundle: |
- output = self.ComputeMacBundleOutput(spec) |
- output_binary = self.ComputeMacBundleBinaryOutput(spec) |
- if not link_deps: |
- output_binary = self.ComputeOutput(spec, type='none') |
- mac_bundle_depends.append(output_binary) |
+ output = self.ComputeMacBundleBinaryOutput(spec) |
else: |
- output = output_binary = self.ComputeOutput(spec) |
+ output = self.ComputeOutput(spec) |
- command_map = { |
- 'executable': 'link', |
- 'static_library': 'alink', |
- 'loadable_module': 'solink_module', |
- 'shared_library': 'solink', |
- 'none': 'stamp', |
- } |
- command = command_map[spec['type']] |
- |
- if link_deps: |
- final_deps = link_deps |
+ if self.flavor == 'mac': |
+ ldflags = self.xcode_settings.GetLdflags(config_name, |
+ self.ExpandSpecial(generator_default_variables['PRODUCT_DIR']), |
+ self.GypPathToNinja) |
else: |
- command = 'stamp' |
- order_only += final_deps |
- final_deps = [] |
- |
- if output_uses_linker: |
- if self.flavor == 'mac': |
- ldflags = self.xcode_settings.GetLdflags(config_name, |
- self.ExpandSpecial(generator_default_variables['PRODUCT_DIR']), |
- self.GypPathToNinja) |
- else: |
- ldflags = config.get('ldflags', []) |
- self.WriteVariableList('ldflags', |
- gyp.common.uniquer(map(self.ExpandSpecial, |
- ldflags))) |
+ ldflags = config.get('ldflags', []) |
+ self.WriteVariableList('ldflags', |
+ gyp.common.uniquer(map(self.ExpandSpecial, |
+ ldflags))) |
- libraries = gyp.common.uniquer(map(self.ExpandSpecial, |
- spec.get('libraries', []))) |
- if self.flavor == 'mac': |
- libraries = self.xcode_settings.AdjustFrameworkLibraries(libraries) |
- self.WriteVariableList('libs', libraries) |
+ libraries = gyp.common.uniquer(map(self.ExpandSpecial, |
+ spec.get('libraries', []))) |
+ if self.flavor == 'mac': |
+ libraries = self.xcode_settings.AdjustFrameworkLibraries(libraries) |
+ self.WriteVariableList('libs', libraries) |
extra_bindings = [] |
if command in ('solink', 'solink_module'): |
- extra_bindings.append(('soname', os.path.split(output_binary)[1])) |
+ extra_bindings.append(('soname', os.path.split(output)[1])) |
- self.ninja.build(output_binary, command, final_deps, |
+ self.ninja.build(output, command, link_deps, |
implicit=list(implicit_deps), |
- order_only=order_only, |
variables=extra_bindings) |
+ return output |
+ |
+ def WriteTarget(self, spec, config_name, config, link_deps, final_deps, |
+ mac_bundle_depends): |
+ if spec['type'] == 'none': |
+ assert len(final_deps) == 1, final_deps |
+ output = final_deps[0] |
+ return output, output |
+ elif spec['type'] == 'static_library': |
+ output_binary = self.ComputeOutput(spec) |
+ self.ninja.build(output_binary, 'alink', link_deps, |
+ order_only=final_deps) |
+ else: |
+ output_binary = self.WriteLink(spec, config_name, config, link_deps) |
+ |
+ if self.is_mac_bundle: |
+ output = self.ComputeMacBundleOutput(spec) |
+ mac_bundle_depends.append(output_binary) |
+ else: |
+ output = output_binary |
if self.is_mac_bundle: |
if spec['type'] in ('shared_library', 'loadable_module'): |