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

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

Issue 9427002: Fix quoting shell args on Windows (Closed) Base URL: http://gyp.googlecode.com/svn/trunk/
Patch Set: Created 8 years, 10 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/msvs_emulation.py » ('j') | no next file with comments »
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 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.system_test 9 import gyp.system_test
9 import gyp.xcode_emulation 10 import gyp.xcode_emulation
10 import os.path 11 import os.path
11 import re 12 import re
12 import subprocess 13 import subprocess
13 import sys 14 import sys
14 15
15 import gyp.ninja_syntax as ninja_syntax 16 import gyp.ninja_syntax as ninja_syntax
16 17
17 generator_default_variables = { 18 generator_default_variables = {
(...skipping 30 matching lines...) Expand all
48 # - how to decide what the host compiler is (should not just be $cc). 49 # - how to decide what the host compiler is (should not just be $cc).
49 # - need ld_host as well. 50 # - need ld_host as well.
50 generator_supports_multiple_toolsets = False 51 generator_supports_multiple_toolsets = False
51 52
52 53
53 def StripPrefix(arg, prefix): 54 def StripPrefix(arg, prefix):
54 if arg.startswith(prefix): 55 if arg.startswith(prefix):
55 return arg[len(prefix):] 56 return arg[len(prefix):]
56 return arg 57 return arg
57 58
58 59 def QuoteShellArgument(arg, flavor):
59 def QuoteShellArgument(arg):
60 """Quote a string such that it will be interpreted as a single argument 60 """Quote a string such that it will be interpreted as a single argument
61 by the shell.""" 61 by the shell."""
62 # Rather than attempting to enumerate the bad shell characters, just 62 # Rather than attempting to enumerate the bad shell characters, just
63 # whitelist common OK ones and quote anything else. 63 # whitelist common OK ones and quote anything else.
64 if re.match(r'^[a-zA-Z0-9_=-]+$', arg): 64 if re.match(r'^[a-zA-Z0-9_=-]+$', arg):
65 return arg # No quoting necessary. 65 return arg # No quoting necessary.
66 if flavor == 'win':
67 return gyp.msvs_emulation.QuoteCmdExeArgument(arg)
66 return "'" + arg.replace("'", "'" + '"\'"' + "'") + "'" 68 return "'" + arg.replace("'", "'" + '"\'"' + "'") + "'"
67 69
68
69 def InvertRelativePath(path): 70 def InvertRelativePath(path):
70 """Given a relative path like foo/bar, return the inverse relative path: 71 """Given a relative path like foo/bar, return the inverse relative path:
71 the path from the relative path back to the origin dir. 72 the path from the relative path back to the origin dir.
72 73
73 E.g. os.path.normpath(os.path.join(path, InvertRelativePath(path))) 74 E.g. os.path.normpath(os.path.join(path, InvertRelativePath(path)))
74 should always produce the empty string.""" 75 should always produce the empty string."""
75 76
76 if not path: 77 if not path:
77 return path 78 return path
78 # Only need to handle relative paths into subdirectories for now. 79 # Only need to handle relative paths into subdirectories for now.
(...skipping 470 matching lines...) Expand 10 before | Expand all | Expand 10 after
549 info_plist, out, defines, extra_env = gyp.xcode_emulation.GetMacInfoPlist( 550 info_plist, out, defines, extra_env = gyp.xcode_emulation.GetMacInfoPlist(
550 self.ExpandSpecial(generator_default_variables['PRODUCT_DIR']), 551 self.ExpandSpecial(generator_default_variables['PRODUCT_DIR']),
551 self.xcode_settings, self.GypPathToNinja) 552 self.xcode_settings, self.GypPathToNinja)
552 if not info_plist: 553 if not info_plist:
553 return 554 return
554 if defines: 555 if defines:
555 # Create an intermediate file to store preprocessed results. 556 # Create an intermediate file to store preprocessed results.
556 intermediate_plist = self.GypPathToUniqueOutput( 557 intermediate_plist = self.GypPathToUniqueOutput(
557 os.path.basename(info_plist)) 558 os.path.basename(info_plist))
558 defines = ' '.join( 559 defines = ' '.join(
559 [QuoteShellArgument(ninja_syntax.escape('-D' + d)) for d in defines]) 560 [QuoteShellArgument(ninja_syntax.escape('-D' + d), self.flavor)
561 for d in defines])
560 info_plist = self.ninja.build(intermediate_plist, 'infoplist', info_plist, 562 info_plist = self.ninja.build(intermediate_plist, 'infoplist', info_plist,
561 variables=[('defines',defines)]) 563 variables=[('defines',defines)])
562 564
563 env = self.GetXcodeEnv(additional_settings=extra_env) 565 env = self.GetXcodeEnv(additional_settings=extra_env)
564 env = self.ComputeExportEnvString(env) 566 env = self.ComputeExportEnvString(env)
565 567
566 self.ninja.build(out, 'mac_tool', info_plist, 568 self.ninja.build(out, 'mac_tool', info_plist,
567 variables=[('mactool_cmd', 'copy-info-plist'), 569 variables=[('mactool_cmd', 'copy-info-plist'),
568 ('env', env)]) 570 ('env', env)])
569 bundle_depends.append(out) 571 bundle_depends.append(out)
(...skipping 12 matching lines...) Expand all
582 cflags_objc = ['$cflags_c'] + \ 584 cflags_objc = ['$cflags_c'] + \
583 self.xcode_settings.GetCflagsObjC(config_name) 585 self.xcode_settings.GetCflagsObjC(config_name)
584 cflags_objcc = ['$cflags_cc'] + \ 586 cflags_objcc = ['$cflags_cc'] + \
585 self.xcode_settings.GetCflagsObjCC(config_name) 587 self.xcode_settings.GetCflagsObjCC(config_name)
586 else: 588 else:
587 cflags = config.get('cflags', []) 589 cflags = config.get('cflags', [])
588 cflags_c = config.get('cflags_c', []) 590 cflags_c = config.get('cflags_c', [])
589 cflags_cc = config.get('cflags_cc', []) 591 cflags_cc = config.get('cflags_cc', [])
590 592
591 self.WriteVariableList('defines', 593 self.WriteVariableList('defines',
592 [QuoteShellArgument(ninja_syntax.escape('-D' + d)) 594 [QuoteShellArgument(ninja_syntax.escape('-D' + d), self.flavor)
593 for d in config.get('defines', [])]) 595 for d in config.get('defines', [])])
594 self.WriteVariableList('includes', 596 self.WriteVariableList('includes',
595 ['-I' + self.GypPathToNinja(i) 597 ['-I' + self.GypPathToNinja(i)
596 for i in config.get('include_dirs', [])]) 598 for i in config.get('include_dirs', [])])
597 599
598 pch_commands = precompiled_header.GetGchBuildCommands() 600 pch_commands = precompiled_header.GetGchBuildCommands()
599 if self.flavor == 'mac': 601 if self.flavor == 'mac':
600 self.WriteVariableList('cflags_pch_c', 602 self.WriteVariableList('cflags_pch_c',
601 [precompiled_header.GetInclude('c')]) 603 [precompiled_header.GetInclude('c')])
602 self.WriteVariableList('cflags_pch_cc', 604 self.WriteVariableList('cflags_pch_cc',
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
778 strip_save_file) 780 strip_save_file)
779 return self.GetXcodeEnv(additional_settings=postbuild_settings) 781 return self.GetXcodeEnv(additional_settings=postbuild_settings)
780 782
781 def GetPostbuildCommand(self, spec, output, output_binary, 783 def GetPostbuildCommand(self, spec, output, output_binary,
782 is_command_start=False): 784 is_command_start=False):
783 """Returns a shell command that runs all the postbuilds, and removes 785 """Returns a shell command that runs all the postbuilds, and removes
784 |output| if any of them fails. If |is_command_start| is False, then the 786 |output| if any of them fails. If |is_command_start| is False, then the
785 returned string will start with ' && '.""" 787 returned string will start with ' && '."""
786 if not self.xcode_settings or spec['type'] == 'none' or not output: 788 if not self.xcode_settings or spec['type'] == 'none' or not output:
787 return '' 789 return ''
788 output = QuoteShellArgument(output) 790 output = QuoteShellArgument(output, self.flavor)
789 target_postbuilds = self.xcode_settings.GetTargetPostbuilds( 791 target_postbuilds = self.xcode_settings.GetTargetPostbuilds(
790 self.config_name, output, QuoteShellArgument(output_binary), quiet=True) 792 self.config_name,
793 output,
794 QuoteShellArgument(output_binary, self.flavor),
795 quiet=True)
791 postbuilds = gyp.xcode_emulation.GetSpecPostbuildCommands( 796 postbuilds = gyp.xcode_emulation.GetSpecPostbuildCommands(
792 spec, self.GypPathToNinja, quiet=True) 797 spec, self.GypPathToNinja, quiet=True)
793 postbuilds = target_postbuilds + postbuilds 798 postbuilds = target_postbuilds + postbuilds
794 if not postbuilds: 799 if not postbuilds:
795 return '' 800 return ''
796 env = self.ComputeExportEnvString(self.GetXcodePostbuildEnv()) 801 env = self.ComputeExportEnvString(self.GetXcodePostbuildEnv())
797 commands = env + ' F=0; ' + \ 802 commands = env + ' F=0; ' + \
798 ' '.join([ninja_syntax.escape(command) + ' || F=$$?;' 803 ' '.join([ninja_syntax.escape(command) + ' || F=$$?;'
799 for command in postbuilds]) 804 for command in postbuilds])
800 command_string = env + commands + ' ((exit $$F) || rm -rf %s) ' % output + \ 805 command_string = env + commands + ' ((exit $$F) || rm -rf %s) ' % output + \
(...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after
1247 1252
1248 user_config = params.get('generator_flags', {}).get('config', None) 1253 user_config = params.get('generator_flags', {}).get('config', None)
1249 if user_config: 1254 if user_config:
1250 GenerateOutputForConfig(target_list, target_dicts, data, params, 1255 GenerateOutputForConfig(target_list, target_dicts, data, params,
1251 user_config) 1256 user_config)
1252 else: 1257 else:
1253 config_names = target_dicts[target_list[0]]['configurations'].keys() 1258 config_names = target_dicts[target_list[0]]['configurations'].keys()
1254 for config_name in config_names: 1259 for config_name in config_names:
1255 GenerateOutputForConfig(target_list, target_dicts, data, params, 1260 GenerateOutputForConfig(target_list, target_dicts, data, params,
1256 config_name) 1261 config_name)
OLDNEW
« no previous file with comments | « no previous file | pylib/gyp/msvs_emulation.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698