Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(78)

Side by Side Diff: pylib/gyp/generator/make.py

Issue 10454038: Fixing make generator handling of multiple actions in a dependent target. (Closed) Base URL: http://gyp.googlecode.com/svn/trunk/
Patch Set: Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 # Copyright (c) 2012 Google Inc. All rights reserved. 1 # Copyright (c) 2012 Google Inc. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 # Notes: 5 # Notes:
6 # 6 #
7 # This is all roughly based on the Makefile system used by the Linux 7 # This is all roughly based on the Makefile system used by the Linux
8 # kernel, but is a non-recursive make -- we put the entire dependency 8 # kernel, but is a non-recursive make -- we put the entire dependency
9 # graph in front of make and let it figure it out. 9 # graph in front of make and let it figure it out.
10 # 10 #
(...skipping 1370 matching lines...) Expand 10 before | Expand all | Expand 10 after
1381 part_of_all: flag indicating this target is part of 'all' 1381 part_of_all: flag indicating this target is part of 'all'
1382 """ 1382 """
1383 1383
1384 self.WriteLn('### Rules for final target.') 1384 self.WriteLn('### Rules for final target.')
1385 1385
1386 if extra_outputs: 1386 if extra_outputs:
1387 self.WriteDependencyOnExtraOutputs(self.output_binary, extra_outputs) 1387 self.WriteDependencyOnExtraOutputs(self.output_binary, extra_outputs)
1388 self.WriteMakeRule(extra_outputs, deps, 1388 self.WriteMakeRule(extra_outputs, deps,
1389 comment=('Preserve order dependency of ' 1389 comment=('Preserve order dependency of '
1390 'special output on deps.'), 1390 'special output on deps.'),
1391 order_only = True, 1391 order_only = True)
1392 multiple_output_trick = False)
1393 1392
1394 target_postbuilds = {} 1393 target_postbuilds = {}
1395 if self.type != 'none': 1394 if self.type != 'none':
1396 for configname in sorted(configs.keys()): 1395 for configname in sorted(configs.keys()):
1397 config = configs[configname] 1396 config = configs[configname]
1398 if self.flavor == 'mac': 1397 if self.flavor == 'mac':
1399 ldflags = self.xcode_settings.GetLdflags(configname, 1398 ldflags = self.xcode_settings.GetLdflags(configname,
1400 generator_default_variables['PRODUCT_DIR'], 1399 generator_default_variables['PRODUCT_DIR'],
1401 lambda p: Sourceify(self.Absolutify(p))) 1400 lambda p: Sourceify(self.Absolutify(p)))
1402 1401
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
1622 force = True) 1621 force = True)
1623 # Add our outputs to the list of targets we read depfiles from. 1622 # Add our outputs to the list of targets we read depfiles from.
1624 # all_deps is only used for deps file reading, and for deps files we replace 1623 # all_deps is only used for deps file reading, and for deps files we replace
1625 # spaces with ? because escaping doesn't work with make's $(sort) and 1624 # spaces with ? because escaping doesn't work with make's $(sort) and
1626 # other functions. 1625 # other functions.
1627 outputs = [QuoteSpaces(o, SPACE_REPLACEMENT) for o in outputs] 1626 outputs = [QuoteSpaces(o, SPACE_REPLACEMENT) for o in outputs]
1628 self.WriteLn('all_deps += %s' % ' '.join(outputs)) 1627 self.WriteLn('all_deps += %s' % ' '.join(outputs))
1629 1628
1630 1629
1631 def WriteMakeRule(self, outputs, inputs, actions=None, comment=None, 1630 def WriteMakeRule(self, outputs, inputs, actions=None, comment=None,
1632 order_only=False, force=False, phony=False, 1631 order_only=False, force=False, phony=False):
1633 multiple_output_trick=True):
1634 """Write a Makefile rule, with some extra tricks. 1632 """Write a Makefile rule, with some extra tricks.
1635 1633
1636 outputs: a list of outputs for the rule (note: this is not directly 1634 outputs: a list of outputs for the rule (note: this is not directly
1637 supported by make; see comments below) 1635 supported by make; see comments below)
1638 inputs: a list of inputs for the rule 1636 inputs: a list of inputs for the rule
1639 actions: a list of shell commands to run for the rule 1637 actions: a list of shell commands to run for the rule
1640 comment: a comment to put in the Makefile above the rule (also useful 1638 comment: a comment to put in the Makefile above the rule (also useful
1641 for making this Python script's code self-documenting) 1639 for making this Python script's code self-documenting)
1642 order_only: if true, makes the dependency order-only 1640 order_only: if true, makes the dependency order-only
1643 force: if true, include FORCE_DO_CMD as an order-only dep 1641 force: if true, include FORCE_DO_CMD as an order-only dep
1644 phony: if true, the rule does not actually generate the named output, the 1642 phony: if true, the rule does not actually generate the named output, the
1645 output is just a name to run the rule 1643 output is just a name to run the rule
1646 multiple_output_trick: if true (the default), perform tricks such as dummy
1647 rules to avoid problems with multiple outputs.
1648 """ 1644 """
1649 outputs = map(QuoteSpaces, outputs) 1645 outputs = map(QuoteSpaces, outputs)
1650 inputs = map(QuoteSpaces, inputs) 1646 inputs = map(QuoteSpaces, inputs)
1651 1647
1652 if comment: 1648 if comment:
1653 self.WriteLn('# ' + comment) 1649 self.WriteLn('# ' + comment)
1654 if phony: 1650 if phony:
1655 self.WriteLn('.PHONY: ' + ' '.join(outputs)) 1651 self.WriteLn('.PHONY: ' + ' '.join(outputs))
1656 # TODO(evanm): just make order_only a list of deps instead of these hacks. 1652 # TODO(evanm): just make order_only a list of deps instead of these hacks.
1657 if order_only: 1653 if order_only:
1658 order_insert = '| ' 1654 order_insert = '| '
1655 pick_output = ' '.join(outputs)
1659 else: 1656 else:
1660 order_insert = '' 1657 order_insert = ''
1658 pick_output = outputs[0]
1661 if force: 1659 if force:
1662 force_append = ' FORCE_DO_CMD' 1660 force_append = ' FORCE_DO_CMD'
1663 else: 1661 else:
1664 force_append = '' 1662 force_append = ''
1665 if actions: 1663 if actions:
1666 self.WriteLn("%s: TOOLSET := $(TOOLSET)" % outputs[0]) 1664 self.WriteLn("%s: TOOLSET := $(TOOLSET)" % outputs[0])
1667 self.WriteLn('%s: %s%s%s' % (outputs[0], order_insert, ' '.join(inputs), 1665 self.WriteLn('%s: %s%s%s' % (pick_output, order_insert, ' '.join(inputs),
1668 force_append)) 1666 force_append))
1669 if actions: 1667 if actions:
1670 for action in actions: 1668 for action in actions:
1671 self.WriteLn('\t%s' % action) 1669 self.WriteLn('\t%s' % action)
1672 if multiple_output_trick and len(outputs) > 1: 1670 if not order_only and len(outputs) > 1:
1673 # If we have more than one output, a rule like 1671 # If we have more than one output, a rule like
1674 # foo bar: baz 1672 # foo bar: baz
1675 # that for *each* output we must run the action, potentially 1673 # that for *each* output we must run the action, potentially
1676 # in parallel. That is not what we're trying to write -- what 1674 # in parallel. That is not what we're trying to write -- what
1677 # we want is that we run the action once and it generates all 1675 # we want is that we run the action once and it generates all
1678 # the files. 1676 # the files.
1679 # http://www.gnu.org/software/hello/manual/automake/Multiple-Outputs.html 1677 # http://www.gnu.org/software/hello/manual/automake/Multiple-Outputs.html
1680 # discusses this problem and has this solution: 1678 # discusses this problem and has this solution:
1681 # 1) Write the naive rule that would produce parallel runs of 1679 # 1) Write the naive rule that would produce parallel runs of
1682 # the action. 1680 # the action.
(...skipping 447 matching lines...) Expand 10 before | Expand all | Expand 10 after
2130 root_makefile.write(" include " + include_file + "\n") 2128 root_makefile.write(" include " + include_file + "\n")
2131 root_makefile.write("endif\n") 2129 root_makefile.write("endif\n")
2132 root_makefile.write('\n') 2130 root_makefile.write('\n')
2133 2131
2134 if generator_flags.get('auto_regeneration', True): 2132 if generator_flags.get('auto_regeneration', True):
2135 WriteAutoRegenerationRule(params, root_makefile, makefile_name, build_files) 2133 WriteAutoRegenerationRule(params, root_makefile, makefile_name, build_files)
2136 2134
2137 root_makefile.write(SHARED_FOOTER) 2135 root_makefile.write(SHARED_FOOTER)
2138 2136
2139 root_makefile.close() 2137 root_makefile.close()
OLDNEW
« no previous file with comments | « no previous file | test/actions-multiple/gyptest-all.py » ('j') | test/actions-multiple/gyptest-all.py » ('J')

Powered by Google App Engine
This is Rietveld 408576698