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

Side by Side Diff: pylib/gyp/generator/ninja.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
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 import copy 5 import copy
6 import gyp 6 import gyp
7 import gyp.common 7 import gyp.common
8 import gyp.msvs_emulation 8 import gyp.msvs_emulation
9 import gyp.MSVSVersion 9 import gyp.MSVSVersion
10 import gyp.system_test 10 import gyp.system_test
(...skipping 485 matching lines...) Expand 10 before | Expand all | Expand 10 after
496 if self.toolset != 'target': 496 if self.toolset != 'target':
497 verb += '(%s)' % self.toolset 497 verb += '(%s)' % self.toolset
498 if message: 498 if message:
499 return '%s %s' % (verb, self.ExpandSpecial(message)) 499 return '%s %s' % (verb, self.ExpandSpecial(message))
500 else: 500 else:
501 return '%s %s: %s' % (verb, self.name, fallback) 501 return '%s %s: %s' % (verb, self.name, fallback)
502 502
503 def WriteActions(self, actions, extra_sources, prebuild, 503 def WriteActions(self, actions, extra_sources, prebuild,
504 extra_mac_bundle_resources): 504 extra_mac_bundle_resources):
505 # Actions cd into the base directory. 505 # Actions cd into the base directory.
506 env = self.GetXcodeEnv() 506 env = self.GetSortedXcodeEnv()
507 if self.flavor == 'win': 507 if self.flavor == 'win':
508 env = self.msvs_settings.GetVSMacroEnv('$!PRODUCT_DIR') 508 env = self.msvs_settings.GetVSMacroEnv('$!PRODUCT_DIR')
509 all_outputs = [] 509 all_outputs = []
510 for action in actions: 510 for action in actions:
511 # First write out a rule for the action. 511 # First write out a rule for the action.
512 name = re.sub(r'[ {}$]', '_', action['action_name']) 512 name = re.sub(r'[ {}$]', '_', action['action_name'])
513 description = self.GenerateDescription('ACTION', 513 description = self.GenerateDescription('ACTION',
514 action.get('message', None), 514 action.get('message', None),
515 name) 515 name)
516 is_cygwin = (self.msvs_settings.IsRuleRunUnderCygwin(action) 516 is_cygwin = (self.msvs_settings.IsRuleRunUnderCygwin(action)
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
615 implicit=inputs, 615 implicit=inputs,
616 order_only=prebuild, 616 order_only=prebuild,
617 variables=extra_bindings) 617 variables=extra_bindings)
618 618
619 all_outputs.extend(outputs) 619 all_outputs.extend(outputs)
620 620
621 return all_outputs 621 return all_outputs
622 622
623 def WriteCopies(self, copies, prebuild): 623 def WriteCopies(self, copies, prebuild):
624 outputs = [] 624 outputs = []
625 env = self.GetXcodeEnv() 625 env = self.GetSortedXcodeEnv()
626 for copy in copies: 626 for copy in copies:
627 for path in copy['files']: 627 for path in copy['files']:
628 # Normalize the path so trailing slashes don't confuse us. 628 # Normalize the path so trailing slashes don't confuse us.
629 path = os.path.normpath(path) 629 path = os.path.normpath(path)
630 basename = os.path.split(path)[1] 630 basename = os.path.split(path)[1]
631 src = self.GypPathToNinja(path, env) 631 src = self.GypPathToNinja(path, env)
632 dst = self.GypPathToNinja(os.path.join(copy['destination'], basename), 632 dst = self.GypPathToNinja(os.path.join(copy['destination'], basename),
633 env) 633 env)
634 outputs += self.ninja.build(dst, 'copy', src, order_only=prebuild) 634 outputs += self.ninja.build(dst, 'copy', src, order_only=prebuild)
635 635
(...skipping 16 matching lines...) Expand all
652 if not info_plist: 652 if not info_plist:
653 return 653 return
654 if defines: 654 if defines:
655 # Create an intermediate file to store preprocessed results. 655 # Create an intermediate file to store preprocessed results.
656 intermediate_plist = self.GypPathToUniqueOutput( 656 intermediate_plist = self.GypPathToUniqueOutput(
657 os.path.basename(info_plist)) 657 os.path.basename(info_plist))
658 defines = ' '.join([Define(d, self.flavor) for d in defines]) 658 defines = ' '.join([Define(d, self.flavor) for d in defines])
659 info_plist = self.ninja.build(intermediate_plist, 'infoplist', info_plist, 659 info_plist = self.ninja.build(intermediate_plist, 'infoplist', info_plist,
660 variables=[('defines',defines)]) 660 variables=[('defines',defines)])
661 661
662 env = self.GetXcodeEnv(additional_settings=extra_env) 662 env = self.GetSortedXcodeEnv(additional_settings=extra_env)
663 env = self.ComputeExportEnvString(env) 663 env = self.ComputeExportEnvString(env)
664 664
665 self.ninja.build(out, 'mac_tool', info_plist, 665 self.ninja.build(out, 'mac_tool', info_plist,
666 variables=[('mactool_cmd', 'copy-info-plist'), 666 variables=[('mactool_cmd', 'copy-info-plist'),
667 ('env', env)]) 667 ('env', env)])
668 bundle_depends.append(out) 668 bundle_depends.append(out)
669 669
670 def WriteSources(self, config_name, config, sources, predepends, 670 def WriteSources(self, config_name, config, sources, predepends,
671 precompiled_header): 671 precompiled_header):
672 """Write build rules to compile all of |sources|.""" 672 """Write build rules to compile all of |sources|."""
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
899 if package_framework: 899 if package_framework:
900 variables.append(('version', self.xcode_settings.GetFrameworkVersion())) 900 variables.append(('version', self.xcode_settings.GetFrameworkVersion()))
901 self.ninja.build(output, 'package_framework', mac_bundle_depends, 901 self.ninja.build(output, 'package_framework', mac_bundle_depends,
902 variables=variables) 902 variables=variables)
903 else: 903 else:
904 self.ninja.build(output, 'stamp', mac_bundle_depends, 904 self.ninja.build(output, 'stamp', mac_bundle_depends,
905 variables=variables) 905 variables=variables)
906 self.target.bundle = output 906 self.target.bundle = output
907 return output 907 return output
908 908
909 def GetXcodeEnv(self, additional_settings=None): 909 def GetSortedXcodeEnv(self, additional_settings=None):
910 """Returns the variables Xcode would set for build steps.""" 910 """Returns the variables Xcode would set for build steps."""
911 assert self.abs_build_dir 911 assert self.abs_build_dir
912 abs_build_dir = self.abs_build_dir 912 abs_build_dir = self.abs_build_dir
913 return gyp.xcode_emulation.GetXcodeEnv( 913 return gyp.xcode_emulation.GetSortedXcodeEnv(
914 self.xcode_settings, abs_build_dir, 914 self.xcode_settings, abs_build_dir,
915 os.path.join(abs_build_dir, self.build_to_base), self.config_name, 915 os.path.join(abs_build_dir, self.build_to_base), self.config_name,
916 additional_settings) 916 additional_settings)
917 917
918 def GetXcodePostbuildEnv(self): 918 def GetSortedXcodePostbuildEnv(self):
919 """Returns the variables Xcode would set for postbuild steps.""" 919 """Returns the variables Xcode would set for postbuild steps."""
920 postbuild_settings = {} 920 postbuild_settings = {}
921 # CHROMIUM_STRIP_SAVE_FILE is a chromium-specific hack. 921 # CHROMIUM_STRIP_SAVE_FILE is a chromium-specific hack.
922 # TODO(thakis): It would be nice to have some general mechanism instead. 922 # TODO(thakis): It would be nice to have some general mechanism instead.
923 strip_save_file = self.xcode_settings.GetPerTargetSetting( 923 strip_save_file = self.xcode_settings.GetPerTargetSetting(
924 'CHROMIUM_STRIP_SAVE_FILE') 924 'CHROMIUM_STRIP_SAVE_FILE')
925 if strip_save_file: 925 if strip_save_file:
926 postbuild_settings['CHROMIUM_STRIP_SAVE_FILE'] = strip_save_file 926 postbuild_settings['CHROMIUM_STRIP_SAVE_FILE'] = strip_save_file
927 return self.GetXcodeEnv(additional_settings=postbuild_settings) 927 return self.GetSortedXcodeEnv(additional_settings=postbuild_settings)
928 928
929 def GetPostbuildCommand(self, spec, output, output_binary, 929 def GetPostbuildCommand(self, spec, output, output_binary,
930 is_command_start=False): 930 is_command_start=False):
931 """Returns a shell command that runs all the postbuilds, and removes 931 """Returns a shell command that runs all the postbuilds, and removes
932 |output| if any of them fails. If |is_command_start| is False, then the 932 |output| if any of them fails. If |is_command_start| is False, then the
933 returned string will start with ' && '.""" 933 returned string will start with ' && '."""
934 if not self.xcode_settings or spec['type'] == 'none' or not output: 934 if not self.xcode_settings or spec['type'] == 'none' or not output:
935 return '' 935 return ''
936 output = QuoteShellArgument(output, self.flavor) 936 output = QuoteShellArgument(output, self.flavor)
937 target_postbuilds = self.xcode_settings.GetTargetPostbuilds( 937 target_postbuilds = self.xcode_settings.GetTargetPostbuilds(
938 self.config_name, 938 self.config_name,
939 os.path.normpath(os.path.join(self.base_to_build, output)), 939 os.path.normpath(os.path.join(self.base_to_build, output)),
940 QuoteShellArgument( 940 QuoteShellArgument(
941 os.path.normpath(os.path.join(self.base_to_build, output_binary)), 941 os.path.normpath(os.path.join(self.base_to_build, output_binary)),
942 self.flavor), 942 self.flavor),
943 quiet=True) 943 quiet=True)
944 postbuilds = gyp.xcode_emulation.GetSpecPostbuildCommands(spec, quiet=True) 944 postbuilds = gyp.xcode_emulation.GetSpecPostbuildCommands(spec, quiet=True)
945 postbuilds = target_postbuilds + postbuilds 945 postbuilds = target_postbuilds + postbuilds
946 if not postbuilds: 946 if not postbuilds:
947 return '' 947 return ''
948 # Postbuilds expect to be run in the gyp file's directory, so insert an 948 # Postbuilds expect to be run in the gyp file's directory, so insert an
949 # implicit postbuild to cd to there. 949 # implicit postbuild to cd to there.
950 postbuilds.insert(0, gyp.common.EncodePOSIXShellList( 950 postbuilds.insert(0, gyp.common.EncodePOSIXShellList(
951 ['cd', self.build_to_base])) 951 ['cd', self.build_to_base]))
952 env = self.ComputeExportEnvString(self.GetXcodePostbuildEnv()) 952 env = self.ComputeExportEnvString(self.GetSortedXcodePostbuildEnv())
953 # G will be non-null if any postbuild fails. Run all postbuilds in a 953 # G will be non-null if any postbuild fails. Run all postbuilds in a
954 # subshell. 954 # subshell.
955 commands = env + ' (F=0; ' + \ 955 commands = env + ' (F=0; ' + \
956 ' '.join([ninja_syntax.escape(command) + ' || F=$$?;' 956 ' '.join([ninja_syntax.escape(command) + ' || F=$$?;'
957 for command in postbuilds]) 957 for command in postbuilds])
958 command_string = (commands + ' exit $$F); G=$$?; ' 958 command_string = (commands + ' exit $$F); G=$$?; '
959 # Remove the final output if any postbuild failed. 959 # Remove the final output if any postbuild failed.
960 '((exit $$G) || rm -rf %s) ' % output + '&& exit $$G)') 960 '((exit $$G) || rm -rf %s) ' % output + '&& exit $$G)')
961 if is_command_start: 961 if is_command_start:
962 return '(' + command_string + ' && ' 962 return '(' + command_string + ' && '
963 else: 963 else:
964 return '$ && (' + command_string 964 return '$ && (' + command_string
965 965
966 def ComputeExportEnvString(self, env): 966 def ComputeExportEnvString(self, env):
967 """Given an environment, returns a string looking like 967 """Given an environment, returns a string looking like
968 'export FOO=foo; export BAR="${FOO} bar;' 968 'export FOO=foo; export BAR="${FOO} bar;'
969 that exports |env| to the shell.""" 969 that exports |env| to the shell."""
970 export_str = [] 970 export_str = []
971 for k in gyp.xcode_emulation.TopologicallySortedEnvVarKeys(env): 971 for k, v in env:
972 export_str.append('export %s=%s;' % 972 export_str.append('export %s=%s;' %
973 (k, ninja_syntax.escape(gyp.common.EncodePOSIXShellArgument(env[k])))) 973 (k, ninja_syntax.escape(gyp.common.EncodePOSIXShellArgument(v))))
974 return ' '.join(export_str) 974 return ' '.join(export_str)
975 975
976 def ComputeMacBundleOutput(self): 976 def ComputeMacBundleOutput(self):
977 """Return the 'output' (full output path) to a bundle output directory.""" 977 """Return the 'output' (full output path) to a bundle output directory."""
978 assert self.is_mac_bundle 978 assert self.is_mac_bundle
979 path = self.ExpandSpecial(generator_default_variables['PRODUCT_DIR']) 979 path = self.ExpandSpecial(generator_default_variables['PRODUCT_DIR'])
980 return os.path.join(path, self.xcode_settings.GetWrapperName()) 980 return os.path.join(path, self.xcode_settings.GetWrapperName())
981 981
982 def ComputeMacBundleBinaryOutput(self): 982 def ComputeMacBundleBinaryOutput(self):
983 """Return the 'output' (full output path) to the binary in a bundle.""" 983 """Return the 'output' (full output path) to the binary in a bundle."""
(...skipping 544 matching lines...) Expand 10 before | Expand all | Expand 10 after
1528 1528
1529 user_config = params.get('generator_flags', {}).get('config', None) 1529 user_config = params.get('generator_flags', {}).get('config', None)
1530 if user_config: 1530 if user_config:
1531 GenerateOutputForConfig(target_list, target_dicts, data, params, 1531 GenerateOutputForConfig(target_list, target_dicts, data, params,
1532 user_config) 1532 user_config)
1533 else: 1533 else:
1534 config_names = target_dicts[target_list[0]]['configurations'].keys() 1534 config_names = target_dicts[target_list[0]]['configurations'].keys()
1535 for config_name in config_names: 1535 for config_name in config_names:
1536 GenerateOutputForConfig(target_list, target_dicts, data, params, 1536 GenerateOutputForConfig(target_list, target_dicts, data, params,
1537 config_name) 1537 config_name)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698