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

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

Issue 10447063: Fix make and ninja backends to sensibly handle duplicate target names in different directories (Closed) Base URL: http://git.chromium.org/external/gyp.git@master
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
« no previous file with comments | « no previous file | pylib/gyp/generator/ninja.py » ('j') | pylib/gyp/generator/ninja.py » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 580 matching lines...) Expand 10 before | Expand all | Expand 10 after
591 def QuoteIfNecessary(string): 591 def QuoteIfNecessary(string):
592 """TODO: Should this ideally be replaced with one or more of the above 592 """TODO: Should this ideally be replaced with one or more of the above
593 functions?""" 593 functions?"""
594 if '"' in string: 594 if '"' in string:
595 string = '"' + string.replace('"', '\\"') + '"' 595 string = '"' + string.replace('"', '\\"') + '"'
596 return string 596 return string
597 597
598 598
599 def StringToMakefileVariable(string): 599 def StringToMakefileVariable(string):
600 """Convert a string to a value that is acceptable as a make variable name.""" 600 """Convert a string to a value that is acceptable as a make variable name."""
601 # TODO: replace other metacharacters that we encounter. 601 return re.sub('[^a-zA-Z0-9_]', '_', string)
602 return re.sub('[ {}$]', '_', string)
603 602
604 603
605 srcdir_prefix = '' 604 srcdir_prefix = ''
606 def Sourceify(path): 605 def Sourceify(path):
607 """Convert a path to its source directory form.""" 606 """Convert a path to its source directory form."""
608 if '$(' in path: 607 if '$(' in path:
609 return path 608 return path
610 if os.path.isabs(path): 609 if os.path.isabs(path):
611 return path 610 return path
612 return srcdir_prefix + path 611 return srcdir_prefix + path
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
684 output_filename: output .mk file name to write 683 output_filename: output .mk file name to write
685 spec, configs: gyp info 684 spec, configs: gyp info
686 part_of_all: flag indicating this target is part of 'all' 685 part_of_all: flag indicating this target is part of 'all'
687 """ 686 """
688 ensure_directory_exists(output_filename) 687 ensure_directory_exists(output_filename)
689 688
690 self.fp = open(output_filename, 'w') 689 self.fp = open(output_filename, 'w')
691 690
692 self.fp.write(header) 691 self.fp.write(header)
693 692
693 self.qualified_target = qualified_target
694 self.path = base_path 694 self.path = base_path
695 self.target = spec['target_name'] 695 self.target = spec['target_name']
696 self.type = spec['type'] 696 self.type = spec['type']
697 self.toolset = spec['toolset'] 697 self.toolset = spec['toolset']
698 698
699 self.is_mac_bundle = gyp.xcode_emulation.IsMacBundle(self.flavor, spec) 699 self.is_mac_bundle = gyp.xcode_emulation.IsMacBundle(self.flavor, spec)
700 if self.flavor == 'mac': 700 if self.flavor == 'mac':
701 self.xcode_settings = gyp.xcode_emulation.XcodeSettings(spec) 701 self.xcode_settings = gyp.xcode_emulation.XcodeSettings(spec)
702 else: 702 else:
703 self.xcode_settings = None 703 self.xcode_settings = None
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
830 """Write Makefile code for any 'actions' from the gyp input. 830 """Write Makefile code for any 'actions' from the gyp input.
831 831
832 extra_sources: a list that will be filled in with newly generated source 832 extra_sources: a list that will be filled in with newly generated source
833 files, if any 833 files, if any
834 extra_outputs: a list that will be filled in with any outputs of these 834 extra_outputs: a list that will be filled in with any outputs of these
835 actions (used to make other pieces dependent on these 835 actions (used to make other pieces dependent on these
836 actions) 836 actions)
837 part_of_all: flag indicating this target is part of 'all' 837 part_of_all: flag indicating this target is part of 'all'
838 """ 838 """
839 for action in actions: 839 for action in actions:
840 name = self.target + '_' + StringToMakefileVariable(action['action_name']) 840 name = StringToMakefileVariable('%s_%s' % (self.qualified_target,
841 action['action_name']))
841 self.WriteLn('### Rules for action "%s":' % action['action_name']) 842 self.WriteLn('### Rules for action "%s":' % action['action_name'])
842 inputs = action['inputs'] 843 inputs = action['inputs']
843 outputs = action['outputs'] 844 outputs = action['outputs']
844 845
845 # Build up a list of outputs. 846 # Build up a list of outputs.
846 # Collect the output dirs we'll need. 847 # Collect the output dirs we'll need.
847 dirs = set() 848 dirs = set()
848 for out in outputs: 849 for out in outputs:
849 dir = os.path.split(out)[0] 850 dir = os.path.split(out)[0]
850 if dir: 851 if dir:
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
924 extra_mac_bundle_resources, part_of_all): 925 extra_mac_bundle_resources, part_of_all):
925 """Write Makefile code for any 'rules' from the gyp input. 926 """Write Makefile code for any 'rules' from the gyp input.
926 927
927 extra_sources: a list that will be filled in with newly generated source 928 extra_sources: a list that will be filled in with newly generated source
928 files, if any 929 files, if any
929 extra_outputs: a list that will be filled in with any outputs of these 930 extra_outputs: a list that will be filled in with any outputs of these
930 rules (used to make other pieces dependent on these rules) 931 rules (used to make other pieces dependent on these rules)
931 part_of_all: flag indicating this target is part of 'all' 932 part_of_all: flag indicating this target is part of 'all'
932 """ 933 """
933 for rule in rules: 934 for rule in rules:
934 name = self.target + '_' + StringToMakefileVariable(rule['rule_name']) 935 name = StringToMakefileVariable('%s_%s' % (self.qualified_target,
936 rule['rule_name']))
935 count = 0 937 count = 0
936 self.WriteLn('### Generated for rule %s:' % name) 938 self.WriteLn('### Generated for rule %s:' % name)
937 939
938 all_outputs = [] 940 all_outputs = []
939 941
940 for rule_source in rule.get('rule_sources', []): 942 for rule_source in rule.get('rule_sources', []):
941 dirs = set() 943 dirs = set()
942 (rule_source_dirname, rule_source_basename) = os.path.split(rule_source) 944 (rule_source_dirname, rule_source_basename) = os.path.split(rule_source)
943 (rule_source_root, rule_source_ext) = \ 945 (rule_source_root, rule_source_ext) = \
944 os.path.splitext(rule_source_basename) 946 os.path.splitext(rule_source_basename)
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
1039 1041
1040 def WriteCopies(self, copies, extra_outputs, part_of_all): 1042 def WriteCopies(self, copies, extra_outputs, part_of_all):
1041 """Write Makefile code for any 'copies' from the gyp input. 1043 """Write Makefile code for any 'copies' from the gyp input.
1042 1044
1043 extra_outputs: a list that will be filled in with any outputs of this action 1045 extra_outputs: a list that will be filled in with any outputs of this action
1044 (used to make other pieces dependent on this action) 1046 (used to make other pieces dependent on this action)
1045 part_of_all: flag indicating this target is part of 'all' 1047 part_of_all: flag indicating this target is part of 'all'
1046 """ 1048 """
1047 self.WriteLn('### Generated for copy rule.') 1049 self.WriteLn('### Generated for copy rule.')
1048 1050
1049 variable = self.target + '_copies' 1051 name = StringToMakefileVariable(self.qualified_target + '_copies')
1050 outputs = [] 1052 outputs = []
1051 for copy in copies: 1053 for copy in copies:
1052 for path in copy['files']: 1054 for path in copy['files']:
1053 # Absolutify() calls normpath, stripping trailing slashes. 1055 # Absolutify() calls normpath, stripping trailing slashes.
1054 path = Sourceify(self.Absolutify(path)) 1056 path = Sourceify(self.Absolutify(path))
1055 filename = os.path.split(path)[1] 1057 filename = os.path.split(path)[1]
1056 output = Sourceify(self.Absolutify(os.path.join(copy['destination'], 1058 output = Sourceify(self.Absolutify(os.path.join(copy['destination'],
1057 filename))) 1059 filename)))
1058 1060
1059 # If the output path has variables in it, which happens in practice for 1061 # If the output path has variables in it, which happens in practice for
(...skipping 1070 matching lines...) Expand 10 before | Expand all | Expand 10 after
2130 root_makefile.write(" include " + include_file + "\n") 2132 root_makefile.write(" include " + include_file + "\n")
2131 root_makefile.write("endif\n") 2133 root_makefile.write("endif\n")
2132 root_makefile.write('\n') 2134 root_makefile.write('\n')
2133 2135
2134 if generator_flags.get('auto_regeneration', True): 2136 if generator_flags.get('auto_regeneration', True):
2135 WriteAutoRegenerationRule(params, root_makefile, makefile_name, build_files) 2137 WriteAutoRegenerationRule(params, root_makefile, makefile_name, build_files)
2136 2138
2137 root_makefile.write(SHARED_FOOTER) 2139 root_makefile.write(SHARED_FOOTER)
2138 2140
2139 root_makefile.close() 2141 root_makefile.close()
OLDNEW
« no previous file with comments | « no previous file | pylib/gyp/generator/ninja.py » ('j') | pylib/gyp/generator/ninja.py » ('J')

Powered by Google App Engine
This is Rietveld 408576698