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

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

Issue 10458006: mac ninja/make: Do topological sort only once instead of at each access. (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
« no previous file with comments | « no previous file | pylib/gyp/generator/ninja.py » ('j') | pylib/gyp/xcode_emulation.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 880 matching lines...) Expand 10 before | Expand all | Expand 10 after
891 # The makefile rules are all relative to the top dir, but the gyp actions 891 # The makefile rules are all relative to the top dir, but the gyp actions
892 # are defined relative to their containing dir. This replaces the obj 892 # are defined relative to their containing dir. This replaces the obj
893 # variable for the action rule with an absolute version so that the output 893 # variable for the action rule with an absolute version so that the output
894 # goes in the right place. 894 # goes in the right place.
895 # Only write the 'obj' and 'builddir' rules for the "primary" output (:1); 895 # Only write the 'obj' and 'builddir' rules for the "primary" output (:1);
896 # it's superfluous for the "extra outputs", and this avoids accidentally 896 # it's superfluous for the "extra outputs", and this avoids accidentally
897 # writing duplicate dummy rules for those outputs. 897 # writing duplicate dummy rules for those outputs.
898 # Same for environment. 898 # Same for environment.
899 self.WriteLn("%s: obj := $(abs_obj)" % QuoteSpaces(outputs[0])) 899 self.WriteLn("%s: obj := $(abs_obj)" % QuoteSpaces(outputs[0]))
900 self.WriteLn("%s: builddir := $(abs_builddir)" % QuoteSpaces(outputs[0])) 900 self.WriteLn("%s: builddir := $(abs_builddir)" % QuoteSpaces(outputs[0]))
901 self.WriteXcodeEnv(outputs[0], self.GetXcodeEnv()) 901 self.WriteSortedXcodeEnv(outputs[0], self.GetSortedXcodeEnv())
902 902
903 for input in inputs: 903 for input in inputs:
904 assert ' ' not in input, ( 904 assert ' ' not in input, (
905 "Spaces in action input filenames not supported (%s)" % input) 905 "Spaces in action input filenames not supported (%s)" % input)
906 for output in outputs: 906 for output in outputs:
907 assert ' ' not in output, ( 907 assert ' ' not in output, (
908 "Spaces in action output filenames not supported (%s)" % output) 908 "Spaces in action output filenames not supported (%s)" % output)
909 909
910 # See the comment in WriteCopies about expanding env vars. 910 # See the comment in WriteCopies about expanding env vars.
911 env = self.GetXcodeEnv() 911 env = self.GetSortedXcodeEnv()
912 outputs = [gyp.xcode_emulation.ExpandEnvVars(o, env) for o in outputs] 912 outputs = [gyp.xcode_emulation.ExpandEnvVars(o, env) for o in outputs]
913 inputs = [gyp.xcode_emulation.ExpandEnvVars(i, env) for i in inputs] 913 inputs = [gyp.xcode_emulation.ExpandEnvVars(i, env) for i in inputs]
914 914
915 self.WriteDoCmd(outputs, map(Sourceify, map(self.Absolutify, inputs)), 915 self.WriteDoCmd(outputs, map(Sourceify, map(self.Absolutify, inputs)),
916 part_of_all=part_of_all, command=name) 916 part_of_all=part_of_all, command=name)
917 917
918 # Stuff the outputs in a variable so we can refer to them later. 918 # Stuff the outputs in a variable so we can refer to them later.
919 outputs_variable = 'action_%s_outputs' % name 919 outputs_variable = 'action_%s_outputs' % name
920 self.WriteLn('%s := %s' % (outputs_variable, ' '.join(outputs))) 920 self.WriteLn('%s := %s' % (outputs_variable, ' '.join(outputs)))
921 extra_outputs.append('$(%s)' % outputs_variable) 921 extra_outputs.append('$(%s)' % outputs_variable)
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
1062 1062
1063 # If the output path has variables in it, which happens in practice for 1063 # If the output path has variables in it, which happens in practice for
1064 # 'copies', writing the environment as target-local doesn't work, 1064 # 'copies', writing the environment as target-local doesn't work,
1065 # because the variables are already needed for the target name. 1065 # because the variables are already needed for the target name.
1066 # Copying the environment variables into global make variables doesn't 1066 # Copying the environment variables into global make variables doesn't
1067 # work either, because then the .d files will potentially contain spaces 1067 # work either, because then the .d files will potentially contain spaces
1068 # after variable expansion, and .d file handling cannot handle spaces. 1068 # after variable expansion, and .d file handling cannot handle spaces.
1069 # As a workaround, manually expand variables at gyp time. Since 'copies' 1069 # As a workaround, manually expand variables at gyp time. Since 'copies'
1070 # can't run scripts, there's no need to write the env then. 1070 # can't run scripts, there's no need to write the env then.
1071 # WriteDoCmd() will escape spaces for .d files. 1071 # WriteDoCmd() will escape spaces for .d files.
1072 env = self.GetXcodeEnv() 1072 env = self.GetSortedXcodeEnv()
1073 output = gyp.xcode_emulation.ExpandEnvVars(output, env) 1073 output = gyp.xcode_emulation.ExpandEnvVars(output, env)
1074 path = gyp.xcode_emulation.ExpandEnvVars(path, env) 1074 path = gyp.xcode_emulation.ExpandEnvVars(path, env)
1075 self.WriteDoCmd([output], [path], 'copy', part_of_all) 1075 self.WriteDoCmd([output], [path], 'copy', part_of_all)
1076 outputs.append(output) 1076 outputs.append(output)
1077 self.WriteLn('%s = %s' % (variable, ' '.join(map(QuoteSpaces, outputs)))) 1077 self.WriteLn('%s = %s' % (variable, ' '.join(map(QuoteSpaces, outputs))))
1078 extra_outputs.append('$(%s)' % variable) 1078 extra_outputs.append('$(%s)' % variable)
1079 self.WriteLn() 1079 self.WriteLn()
1080 1080
1081 1081
1082 def WriteMacBundleResources(self, resources, bundle_deps): 1082 def WriteMacBundleResources(self, resources, bundle_deps):
(...skipping 21 matching lines...) Expand all
1104 os.path.basename(info_plist)) 1104 os.path.basename(info_plist))
1105 self.WriteList(defines, intermediate_plist + ': INFOPLIST_DEFINES', '-D', 1105 self.WriteList(defines, intermediate_plist + ': INFOPLIST_DEFINES', '-D',
1106 quoter=EscapeCppDefine) 1106 quoter=EscapeCppDefine)
1107 self.WriteMakeRule([intermediate_plist], [info_plist], 1107 self.WriteMakeRule([intermediate_plist], [info_plist],
1108 ['$(call do_cmd,infoplist)', 1108 ['$(call do_cmd,infoplist)',
1109 # "Convert" the plist so that any weird whitespace changes from the 1109 # "Convert" the plist so that any weird whitespace changes from the
1110 # preprocessor do not affect the XML parser in mac_tool. 1110 # preprocessor do not affect the XML parser in mac_tool.
1111 '@plutil -convert xml1 $@ $@']) 1111 '@plutil -convert xml1 $@ $@'])
1112 info_plist = intermediate_plist 1112 info_plist = intermediate_plist
1113 # plists can contain envvars and substitute them into the file. 1113 # plists can contain envvars and substitute them into the file.
1114 self.WriteXcodeEnv(out, self.GetXcodeEnv(additional_settings=extra_env)) 1114 self.WriteSortedXcodeEnv(
1115 out, self.GetSortedXcodeEnv(additional_settings=extra_env))
1115 self.WriteDoCmd([out], [info_plist], 'mac_tool,,,copy-info-plist', 1116 self.WriteDoCmd([out], [info_plist], 'mac_tool,,,copy-info-plist',
1116 part_of_all=True) 1117 part_of_all=True)
1117 bundle_deps.append(out) 1118 bundle_deps.append(out)
1118 1119
1119 1120
1120 def WriteSources(self, configs, deps, sources, 1121 def WriteSources(self, configs, deps, sources,
1121 extra_outputs, extra_link_deps, 1122 extra_outputs, extra_link_deps,
1122 part_of_all, precompiled_header): 1123 part_of_all, precompiled_header):
1123 """Write Makefile code for any 'sources' from the gyp input. 1124 """Write Makefile code for any 'sources' from the gyp input.
1124 These are source files necessary to build the current target. 1125 These are source files necessary to build the current target.
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after
1441 if self.flavor == 'mac': 1442 if self.flavor == 'mac':
1442 if target_postbuilds: 1443 if target_postbuilds:
1443 postbuilds.append('$(TARGET_POSTBUILDS_$(BUILDTYPE))') 1444 postbuilds.append('$(TARGET_POSTBUILDS_$(BUILDTYPE))')
1444 postbuilds.extend( 1445 postbuilds.extend(
1445 gyp.xcode_emulation.GetSpecPostbuildCommands(spec)) 1446 gyp.xcode_emulation.GetSpecPostbuildCommands(spec))
1446 1447
1447 if postbuilds: 1448 if postbuilds:
1448 # Envvars may be referenced by TARGET_POSTBUILDS_$(BUILDTYPE), 1449 # Envvars may be referenced by TARGET_POSTBUILDS_$(BUILDTYPE),
1449 # so we must output its definition first, since we declare variables 1450 # so we must output its definition first, since we declare variables
1450 # using ":=". 1451 # using ":=".
1451 self.WriteXcodeEnv(self.output, self.GetXcodePostbuildEnv()) 1452 self.WriteSortedXcodeEnv(self.output, self.GetSortedXcodePostbuildEnv())
1452 1453
1453 for configname in target_postbuilds: 1454 for configname in target_postbuilds:
1454 self.WriteLn('%s: TARGET_POSTBUILDS_%s := %s' % 1455 self.WriteLn('%s: TARGET_POSTBUILDS_%s := %s' %
1455 (QuoteSpaces(self.output), 1456 (QuoteSpaces(self.output),
1456 configname, 1457 configname,
1457 gyp.common.EncodePOSIXShellList(target_postbuilds[configname]))) 1458 gyp.common.EncodePOSIXShellList(target_postbuilds[configname])))
1458 1459
1459 # Postbuilds expect to be run in the gyp file's directory, so insert an 1460 # Postbuilds expect to be run in the gyp file's directory, so insert an
1460 # implicit postbuild to cd to there. 1461 # implicit postbuild to cd to there.
1461 postbuilds.insert(0, gyp.common.EncodePOSIXShellList(['cd', self.path])) 1462 postbuilds.insert(0, gyp.common.EncodePOSIXShellList(['cd', self.path]))
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after
1776 self.WriteLn('include $(BUILD_SHARED_LIBRARY)') 1777 self.WriteLn('include $(BUILD_SHARED_LIBRARY)')
1777 elif self.type == 'static_library': 1778 elif self.type == 'static_library':
1778 self.WriteLn('include $(BUILD_STATIC_LIBRARY)') 1779 self.WriteLn('include $(BUILD_STATIC_LIBRARY)')
1779 self.WriteLn() 1780 self.WriteLn()
1780 1781
1781 1782
1782 def WriteLn(self, text=''): 1783 def WriteLn(self, text=''):
1783 self.fp.write(text + '\n') 1784 self.fp.write(text + '\n')
1784 1785
1785 1786
1786 def GetXcodeEnv(self, additional_settings=None): 1787 def GetSortedXcodeEnv(self, additional_settings=None):
1787 return gyp.xcode_emulation.GetXcodeEnv( 1788 return gyp.xcode_emulation.GetSortedXcodeEnv(
1788 self.xcode_settings, "$(abs_builddir)", 1789 self.xcode_settings, "$(abs_builddir)",
1789 os.path.join("$(abs_srcdir)", self.path), "$(BUILDTYPE)", 1790 os.path.join("$(abs_srcdir)", self.path), "$(BUILDTYPE)",
1790 additional_settings) 1791 additional_settings)
1791 1792
1792 1793
1793 def GetXcodePostbuildEnv(self): 1794 def GetSortedXcodePostbuildEnv(self):
1794 # CHROMIUM_STRIP_SAVE_FILE is a chromium-specific hack. 1795 # CHROMIUM_STRIP_SAVE_FILE is a chromium-specific hack.
1795 # TODO(thakis): It would be nice to have some general mechanism instead. 1796 # TODO(thakis): It would be nice to have some general mechanism instead.
1796 strip_save_file = self.xcode_settings.GetPerTargetSetting( 1797 strip_save_file = self.xcode_settings.GetPerTargetSetting(
1797 'CHROMIUM_STRIP_SAVE_FILE', '') 1798 'CHROMIUM_STRIP_SAVE_FILE', '')
1798 # Even if strip_save_file is empty, explicitly write it. Else a postbuild 1799 # Even if strip_save_file is empty, explicitly write it. Else a postbuild
1799 # might pick up an export from an earlier target. 1800 # might pick up an export from an earlier target.
1800 return self.GetXcodeEnv( 1801 return self.GetSortedXcodeEnv(
1801 additional_settings={'CHROMIUM_STRIP_SAVE_FILE': strip_save_file}) 1802 additional_settings={'CHROMIUM_STRIP_SAVE_FILE': strip_save_file})
1802 1803
1803 1804
1804 def WriteXcodeEnv(self, target, env): 1805 def WriteSortedXcodeEnv(self, target, env):
1805 for k in gyp.xcode_emulation.TopologicallySortedEnvVarKeys(env): 1806 for k, v in env:
1806 # For 1807 # For
1807 # foo := a\ b 1808 # foo := a\ b
1808 # the escaped space does the right thing. For 1809 # the escaped space does the right thing. For
1809 # export foo := a\ b 1810 # export foo := a\ b
1810 # it does not -- the backslash is written to the env as literal character. 1811 # it does not -- the backslash is written to the env as literal character.
1811 # So don't escape spaces in |env[k]|. 1812 # So don't escape spaces in |env[k]|.
1812 self.WriteLn('%s: export %s := %s' % (QuoteSpaces(target), k, env[k])) 1813 self.WriteLn('%s: export %s := %s' % (QuoteSpaces(target), k, v))
1813 1814
1814 1815
1815 def Objectify(self, path): 1816 def Objectify(self, path):
1816 """Convert a path to its output directory form.""" 1817 """Convert a path to its output directory form."""
1817 if '$(' in path: 1818 if '$(' in path:
1818 path = path.replace('$(obj)/', '$(obj).%s/$(TARGET)/' % self.toolset) 1819 path = path.replace('$(obj)/', '$(obj).%s/$(TARGET)/' % self.toolset)
1819 return path 1820 return path
1820 return '$(obj).%s/$(TARGET)/%s' % (self.toolset, path) 1821 return '$(obj).%s/$(TARGET)/%s' % (self.toolset, path)
1821 1822
1822 1823
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after
2134 root_makefile.write(" include " + include_file + "\n") 2135 root_makefile.write(" include " + include_file + "\n")
2135 root_makefile.write("endif\n") 2136 root_makefile.write("endif\n")
2136 root_makefile.write('\n') 2137 root_makefile.write('\n')
2137 2138
2138 if generator_flags.get('auto_regeneration', True): 2139 if generator_flags.get('auto_regeneration', True):
2139 WriteAutoRegenerationRule(params, root_makefile, makefile_name, build_files) 2140 WriteAutoRegenerationRule(params, root_makefile, makefile_name, build_files)
2140 2141
2141 root_makefile.write(SHARED_FOOTER) 2142 root_makefile.write(SHARED_FOOTER)
2142 2143
2143 root_makefile.close() 2144 root_makefile.close()
OLDNEW
« no previous file with comments | « no previous file | pylib/gyp/generator/ninja.py » ('j') | pylib/gyp/xcode_emulation.py » ('J')

Powered by Google App Engine
This is Rietveld 408576698