| OLD | NEW | 
|---|
| 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 ntpath | 6 import ntpath | 
| 7 import os | 7 import os | 
| 8 import posixpath | 8 import posixpath | 
| 9 import re | 9 import re | 
| 10 import subprocess | 10 import subprocess | 
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 198                                                 excluded=excluded, | 198                                                 excluded=excluded, | 
| 199                                                 list_excluded=list_excluded) | 199                                                 list_excluded=list_excluded) | 
| 200     contents = MSVSProject.Filter(f, contents=contents) | 200     contents = MSVSProject.Filter(f, contents=contents) | 
| 201     result.append(contents) | 201     result.append(contents) | 
| 202 | 202 | 
| 203   return result | 203   return result | 
| 204 | 204 | 
| 205 | 205 | 
| 206 def _ToolAppend(tools, tool_name, setting, value, only_if_unset=False): | 206 def _ToolAppend(tools, tool_name, setting, value, only_if_unset=False): | 
| 207   if not value: return | 207   if not value: return | 
|  | 208   _ToolSetOrAppend(tools, tool_name, setting, value, only_if_unset) | 
|  | 209 | 
|  | 210 | 
|  | 211 def _ToolSetOrAppend(tools, tool_name, setting, value, only_if_unset=False): | 
| 208   # TODO(bradnelson): ugly hack, fix this more generally!!! | 212   # TODO(bradnelson): ugly hack, fix this more generally!!! | 
| 209   if 'Directories' in setting or 'Dependencies' in setting: | 213   if 'Directories' in setting or 'Dependencies' in setting: | 
| 210     if type(value) == str: | 214     if type(value) == str: | 
| 211       value = value.replace('/', '\\') | 215       value = value.replace('/', '\\') | 
| 212     else: | 216     else: | 
| 213       value = [i.replace('/', '\\') for i in value] | 217       value = [i.replace('/', '\\') for i in value] | 
| 214   if not tools.get(tool_name): | 218   if not tools.get(tool_name): | 
| 215     tools[tool_name] = dict() | 219     tools[tool_name] = dict() | 
| 216   tool = tools[tool_name] | 220   tool = tools[tool_name] | 
| 217   if tool.get(setting): | 221   if tool.get(setting): | 
| 218     if only_if_unset: return | 222     if only_if_unset: return | 
| 219     if type(tool[setting]) == list: | 223     if type(tool[setting]) == list: | 
| 220       tool[setting] += value | 224       tool[setting] += value | 
| 221     else: | 225     else: | 
| 222       raise TypeError( | 226       raise TypeError( | 
| 223           'Appending "%s" to a non-list setting "%s" for tool "%s" is ' | 227           'Appending "%s" to a non-list setting "%s" for tool "%s" is ' | 
| 224           'not allowed, previous value: %s' % ( | 228           'not allowed, previous value: %s' % ( | 
| 225               value, setting, tool_name, str(tool[setting]))) | 229               value, setting, tool_name, str(tool[setting]))) | 
| 226   else: | 230   else: | 
| 227     tool[setting] = value | 231     tool[setting] = value | 
| 228 | 232 | 
| 229 | 233 | 
| 230 def _ConfigPlatform(config_data): | 234 def _ConfigPlatform(config_data): | 
| 231   return config_data.get('msvs_configuration_platform', 'Win32') | 235   return config_data.get('msvs_configuration_platform', 'Win32') | 
| 232 | 236 | 
| 233 | 237 | 
| 234 def _ConfigBaseName(config_name, platform_name): | 238 def _ConfigBaseName(config_name, platform_name): | 
| 235   if config_name.endswith('_' + platform_name): | 239   if config_name.endswith('_' + platform_name): | 
| 236     return config_name[0:-len(platform_name)-1] | 240     return config_name[0:-len(platform_name) - 1] | 
| 237   else: | 241   else: | 
| 238     return config_name | 242     return config_name | 
| 239 | 243 | 
| 240 | 244 | 
| 241 def _ConfigFullName(config_name, config_data): | 245 def _ConfigFullName(config_name, config_data): | 
| 242   platform_name = _ConfigPlatform(config_data) | 246   platform_name = _ConfigPlatform(config_data) | 
| 243   return '%s|%s' % (_ConfigBaseName(config_name, platform_name), platform_name) | 247   return '%s|%s' % (_ConfigBaseName(config_name, platform_name), platform_name) | 
| 244 | 248 | 
| 245 | 249 | 
| 246 def _BuildCommandLineForRuleRaw(spec, cmd, cygwin_shell, has_input_path, | 250 def _BuildCommandLineForRuleRaw(spec, cmd, cygwin_shell, has_input_path, | 
| (...skipping 17 matching lines...) Expand all  Loading... | 
| 264                             '`cygpath -m "${INTDIR}"`') for i in direct_cmd] | 268                             '`cygpath -m "${INTDIR}"`') for i in direct_cmd] | 
| 265     direct_cmd = [i.replace('$(OutDir)', | 269     direct_cmd = [i.replace('$(OutDir)', | 
| 266                             '`cygpath -m "${OUTDIR}"`') for i in direct_cmd] | 270                             '`cygpath -m "${OUTDIR}"`') for i in direct_cmd] | 
| 267     direct_cmd = [i.replace('$(InputDir)', | 271     direct_cmd = [i.replace('$(InputDir)', | 
| 268                             '`cygpath -m "${INPUTDIR}"`') for i in direct_cmd] | 272                             '`cygpath -m "${INPUTDIR}"`') for i in direct_cmd] | 
| 269     if has_input_path: | 273     if has_input_path: | 
| 270       direct_cmd = [i.replace('$(InputPath)', | 274       direct_cmd = [i.replace('$(InputPath)', | 
| 271                               '`cygpath -m "${INPUTPATH}"`') | 275                               '`cygpath -m "${INPUTPATH}"`') | 
| 272                     for i in direct_cmd] | 276                     for i in direct_cmd] | 
| 273     direct_cmd = ['\\"%s\\"' % i.replace('"', '\\\\\\"') for i in direct_cmd] | 277     direct_cmd = ['\\"%s\\"' % i.replace('"', '\\\\\\"') for i in direct_cmd] | 
| 274     #direct_cmd = gyp.common.EncodePOSIXShellList(direct_cmd) | 278     # direct_cmd = gyp.common.EncodePOSIXShellList(direct_cmd) | 
| 275     direct_cmd = ' '.join(direct_cmd) | 279     direct_cmd = ' '.join(direct_cmd) | 
| 276     # TODO(quote):  regularize quoting path names throughout the module | 280     # TODO(quote):  regularize quoting path names throughout the module | 
| 277     cmd = '' | 281     cmd = '' | 
| 278     if do_setup_env: | 282     if do_setup_env: | 
| 279       cmd += 'call "$(ProjectDir)%(cygwin_dir)s\\setup_env.bat" && ' | 283       cmd += 'call "$(ProjectDir)%(cygwin_dir)s\\setup_env.bat" && ' | 
| 280     cmd += 'set CYGWIN=nontsec&& ' | 284     cmd += 'set CYGWIN=nontsec&& ' | 
| 281     if direct_cmd.find('NUMBER_OF_PROCESSORS') >= 0: | 285     if direct_cmd.find('NUMBER_OF_PROCESSORS') >= 0: | 
| 282       cmd += 'set /a NUMBER_OF_PROCESSORS_PLUS_1=%%NUMBER_OF_PROCESSORS%%+1&& ' | 286       cmd += 'set /a NUMBER_OF_PROCESSORS_PLUS_1=%%NUMBER_OF_PROCESSORS%%+1&& ' | 
| 283     if direct_cmd.find('INTDIR') >= 0: | 287     if direct_cmd.find('INTDIR') >= 0: | 
| 284       cmd += 'set INTDIR=$(IntDir)&& ' | 288       cmd += 'set INTDIR=$(IntDir)&& ' | 
| (...skipping 15 matching lines...) Expand all  Loading... | 
| 300     # after the other without aborting in Incredibuild, since IB makes a bat | 304     # after the other without aborting in Incredibuild, since IB makes a bat | 
| 301     # file out of the raw command string, and some commands (like python) are | 305     # file out of the raw command string, and some commands (like python) are | 
| 302     # actually batch files themselves. | 306     # actually batch files themselves. | 
| 303     command.insert(0, 'call') | 307     command.insert(0, 'call') | 
| 304     # Fix the paths | 308     # Fix the paths | 
| 305     # TODO(quote): This is a really ugly heuristic, and will miss path fixing | 309     # TODO(quote): This is a really ugly heuristic, and will miss path fixing | 
| 306     #              for arguments like "--arg=path" or "/opt:path". | 310     #              for arguments like "--arg=path" or "/opt:path". | 
| 307     # If the argument starts with a slash or dash, it's probably a command line | 311     # If the argument starts with a slash or dash, it's probably a command line | 
| 308     # switch | 312     # switch | 
| 309     arguments = [i if (i[:1] in "/-") else _FixPath(i) for i in cmd[1:]] | 313     arguments = [i if (i[:1] in "/-") else _FixPath(i) for i in cmd[1:]] | 
| 310     arguments = [i.replace('$(InputDir)','%INPUTDIR%') for i in arguments] | 314     arguments = [i.replace('$(InputDir)', '%INPUTDIR%') for i in arguments] | 
| 311     arguments = [MSVSSettings.FixVCMacroSlashes(i) for i in arguments] | 315     arguments = [MSVSSettings.FixVCMacroSlashes(i) for i in arguments] | 
| 312     if quote_cmd: | 316     if quote_cmd: | 
| 313       # Support a mode for using cmd directly. | 317       # Support a mode for using cmd directly. | 
| 314       # Convert any paths to native form (first element is used directly). | 318       # Convert any paths to native form (first element is used directly). | 
| 315       # TODO(quote):  regularize quoting path names throughout the module | 319       # TODO(quote):  regularize quoting path names throughout the module | 
| 316       arguments = ['"%s"' % i for i in arguments] | 320       arguments = ['"%s"' % i for i in arguments] | 
| 317     # Collapse into a single command. | 321     # Collapse into a single command. | 
| 318     return input_dir_preamble + ' '.join(command + arguments) | 322     return input_dir_preamble + ' '.join(command + arguments) | 
| 319 | 323 | 
| 320 | 324 | 
| (...skipping 393 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 714   return s | 718   return s | 
| 715 | 719 | 
| 716 | 720 | 
| 717 quote_replacer_regex2 = re.compile(r'(\\+)"') | 721 quote_replacer_regex2 = re.compile(r'(\\+)"') | 
| 718 | 722 | 
| 719 | 723 | 
| 720 def _EscapeCommandLineArgumentForMSBuild(s): | 724 def _EscapeCommandLineArgumentForMSBuild(s): | 
| 721   """Escapes a Windows command-line argument for use by MSBuild.""" | 725   """Escapes a Windows command-line argument for use by MSBuild.""" | 
| 722 | 726 | 
| 723   def _Replace(match): | 727   def _Replace(match): | 
| 724     return (len(match.group(1))/2*4)*'\\' + '\\"' | 728     return (len(match.group(1)) / 2 * 4) * '\\' + '\\"' | 
| 725 | 729 | 
| 726   # Escape all quotes so that they are interpreted literally. | 730   # Escape all quotes so that they are interpreted literally. | 
| 727   s = quote_replacer_regex2.sub(_Replace, s) | 731   s = quote_replacer_regex2.sub(_Replace, s) | 
| 728   return s | 732   return s | 
| 729 | 733 | 
| 730 | 734 | 
| 731 def _EscapeMSBuildSpecialCharacters(s): | 735 def _EscapeMSBuildSpecialCharacters(s): | 
| 732   escape_dictionary = { | 736   escape_dictionary = { | 
| 733       '%': '%25', | 737       '%': '%25', | 
| 734       '$': '%24', | 738       '$': '%24', | 
| (...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1035   prebuild = config.get('msvs_prebuild') | 1039   prebuild = config.get('msvs_prebuild') | 
| 1036   postbuild = config.get('msvs_postbuild') | 1040   postbuild = config.get('msvs_postbuild') | 
| 1037   def_file = _GetModuleDefinition(spec) | 1041   def_file = _GetModuleDefinition(spec) | 
| 1038   precompiled_header = config.get('msvs_precompiled_header') | 1042   precompiled_header = config.get('msvs_precompiled_header') | 
| 1039 | 1043 | 
| 1040   # Prepare the list of tools as a dictionary. | 1044   # Prepare the list of tools as a dictionary. | 
| 1041   tools = dict() | 1045   tools = dict() | 
| 1042   # Add in user specified msvs_settings. | 1046   # Add in user specified msvs_settings. | 
| 1043   msvs_settings = config.get('msvs_settings', {}) | 1047   msvs_settings = config.get('msvs_settings', {}) | 
| 1044   MSVSSettings.ValidateMSVSSettings(msvs_settings) | 1048   MSVSSettings.ValidateMSVSSettings(msvs_settings) | 
|  | 1049 | 
|  | 1050   # Prevent default library inheritance from the environment. | 
|  | 1051   _ToolAppend(tools, 'VCLinkerTool', 'AdditionalDependencies', ['$(NOINHERIT)']) | 
|  | 1052 | 
| 1045   for tool in msvs_settings: | 1053   for tool in msvs_settings: | 
| 1046     settings = config['msvs_settings'][tool] | 1054     settings = config['msvs_settings'][tool] | 
| 1047     for setting in settings: | 1055     for setting in settings: | 
| 1048       _ToolAppend(tools, tool, setting, settings[setting]) | 1056       _ToolAppend(tools, tool, setting, settings[setting]) | 
| 1049   # Add the information to the appropriate tool | 1057   # Add the information to the appropriate tool | 
| 1050   _ToolAppend(tools, 'VCCLCompilerTool', | 1058   _ToolAppend(tools, 'VCCLCompilerTool', | 
| 1051               'AdditionalIncludeDirectories', include_dirs) | 1059               'AdditionalIncludeDirectories', include_dirs) | 
| 1052   _ToolAppend(tools, 'VCResourceCompilerTool', | 1060   _ToolAppend(tools, 'VCResourceCompilerTool', | 
| 1053               'AdditionalIncludeDirectories', resource_include_dirs) | 1061               'AdditionalIncludeDirectories', resource_include_dirs) | 
| 1054   # Add in libraries. | 1062   # Add in libraries. | 
| (...skipping 745 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1800                                websiteProperties=False, | 1808                                websiteProperties=False, | 
| 1801                                version=msvs_version) | 1809                                version=msvs_version) | 
| 1802     sln.Write() | 1810     sln.Write() | 
| 1803 | 1811 | 
| 1804   if missing_sources: | 1812   if missing_sources: | 
| 1805     error_message = "Missing input files:\n" + \ | 1813     error_message = "Missing input files:\n" + \ | 
| 1806                     '\n'.join(set(missing_sources)) | 1814                     '\n'.join(set(missing_sources)) | 
| 1807     if generator_flags.get('msvs_error_on_missing_sources', False): | 1815     if generator_flags.get('msvs_error_on_missing_sources', False): | 
| 1808       raise GypError(error_message) | 1816       raise GypError(error_message) | 
| 1809     else: | 1817     else: | 
| 1810       print >>sys.stdout, "Warning: " + error_message | 1818       print >> sys.stdout, "Warning: " + error_message | 
| 1811 | 1819 | 
| 1812 | 1820 | 
| 1813 def _GenerateMSBuildFiltersFile(filters_path, source_files, | 1821 def _GenerateMSBuildFiltersFile(filters_path, source_files, | 
| 1814                                 extension_to_rule_name): | 1822                                 extension_to_rule_name): | 
| 1815   """Generate the filters file. | 1823   """Generate the filters file. | 
| 1816 | 1824 | 
| 1817   This file is used by Visual Studio to organize the presentation of source | 1825   This file is used by Visual Studio to organize the presentation of source | 
| 1818   files into folders. | 1826   files into folders. | 
| 1819 | 1827 | 
| 1820   Arguments: | 1828   Arguments: | 
| (...skipping 914 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2735   precompiled_header = configuration.get('msvs_precompiled_header') | 2743   precompiled_header = configuration.get('msvs_precompiled_header') | 
| 2736 | 2744 | 
| 2737   # Add the information to the appropriate tool | 2745   # Add the information to the appropriate tool | 
| 2738   # TODO(jeanluc) We could optimize and generate these settings only if | 2746   # TODO(jeanluc) We could optimize and generate these settings only if | 
| 2739   # the corresponding files are found, e.g. don't generate ResourceCompile | 2747   # the corresponding files are found, e.g. don't generate ResourceCompile | 
| 2740   # if you don't have any resources. | 2748   # if you don't have any resources. | 
| 2741   _ToolAppend(msbuild_settings, 'ClCompile', | 2749   _ToolAppend(msbuild_settings, 'ClCompile', | 
| 2742               'AdditionalIncludeDirectories', include_dirs) | 2750               'AdditionalIncludeDirectories', include_dirs) | 
| 2743   _ToolAppend(msbuild_settings, 'ResourceCompile', | 2751   _ToolAppend(msbuild_settings, 'ResourceCompile', | 
| 2744               'AdditionalIncludeDirectories', resource_include_dirs) | 2752               'AdditionalIncludeDirectories', resource_include_dirs) | 
| 2745   # Add in libraries. | 2753   # Add in libraries, note that even for empty libraries, we want this | 
| 2746   _ToolAppend(msbuild_settings, 'Link', 'AdditionalDependencies', libraries) | 2754   # set, to prevent inheriting default libraries from the enviroment. | 
|  | 2755   _ToolSetOrAppend(msbuild_settings, 'Link', 'AdditionalDependencies', | 
|  | 2756                   libraries) | 
| 2747   if out_file: | 2757   if out_file: | 
| 2748     _ToolAppend(msbuild_settings, msbuild_tool, 'OutputFile', out_file, | 2758     _ToolAppend(msbuild_settings, msbuild_tool, 'OutputFile', out_file, | 
| 2749                 only_if_unset=True) | 2759                 only_if_unset=True) | 
| 2750   # Add defines. | 2760   # Add defines. | 
| 2751   _ToolAppend(msbuild_settings, 'ClCompile', | 2761   _ToolAppend(msbuild_settings, 'ClCompile', | 
| 2752               'PreprocessorDefinitions', defines) | 2762               'PreprocessorDefinitions', defines) | 
| 2753   _ToolAppend(msbuild_settings, 'ResourceCompile', | 2763   _ToolAppend(msbuild_settings, 'ResourceCompile', | 
| 2754               'PreprocessorDefinitions', defines) | 2764               'PreprocessorDefinitions', defines) | 
| 2755   # Add disabled warnings. | 2765   # Add disabled warnings. | 
| 2756   _ToolAppend(msbuild_settings, 'ClCompile', | 2766   _ToolAppend(msbuild_settings, 'ClCompile', | 
| (...skipping 13 matching lines...) Expand all  Loading... | 
| 2770   # Set the module definition file if any. | 2780   # Set the module definition file if any. | 
| 2771   if def_file: | 2781   if def_file: | 
| 2772     _ToolAppend(msbuild_settings, 'Link', 'ModuleDefinitionFile', def_file) | 2782     _ToolAppend(msbuild_settings, 'Link', 'ModuleDefinitionFile', def_file) | 
| 2773   configuration['finalized_msbuild_settings'] = msbuild_settings | 2783   configuration['finalized_msbuild_settings'] = msbuild_settings | 
| 2774 | 2784 | 
| 2775 | 2785 | 
| 2776 def _GetValueFormattedForMSBuild(tool_name, name, value): | 2786 def _GetValueFormattedForMSBuild(tool_name, name, value): | 
| 2777   if type(value) == list: | 2787   if type(value) == list: | 
| 2778     # For some settings, VS2010 does not automatically extends the settings | 2788     # For some settings, VS2010 does not automatically extends the settings | 
| 2779     # TODO(jeanluc) Is this what we want? | 2789     # TODO(jeanluc) Is this what we want? | 
| 2780     if name in ['AdditionalDependencies', | 2790     if name in ['AdditionalIncludeDirectories', | 
| 2781                 'AdditionalIncludeDirectories', |  | 
| 2782                 'AdditionalLibraryDirectories', | 2791                 'AdditionalLibraryDirectories', | 
| 2783                 'AdditionalOptions', | 2792                 'AdditionalOptions', | 
| 2784                 'DelayLoadDLLs', | 2793                 'DelayLoadDLLs', | 
| 2785                 'DisableSpecificWarnings', | 2794                 'DisableSpecificWarnings', | 
| 2786                 'PreprocessorDefinitions']: | 2795                 'PreprocessorDefinitions']: | 
| 2787       value.append('%%(%s)' % name) | 2796       value.append('%%(%s)' % name) | 
| 2788     # For most tools, entries in a list should be separated with ';' but some | 2797     # For most tools, entries in a list should be separated with ';' but some | 
| 2789     # settings use a space.  Check for those first. | 2798     # settings use a space.  Check for those first. | 
| 2790     exceptions = { | 2799     exceptions = { | 
| 2791         'ClCompile': ['AdditionalOptions'], | 2800         'ClCompile': ['AdditionalOptions'], | 
| (...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3093   action_spec.extend( | 3102   action_spec.extend( | 
| 3094       # TODO(jeanluc) 'Document' for all or just if as_sources? | 3103       # TODO(jeanluc) 'Document' for all or just if as_sources? | 
| 3095       [['FileType', 'Document'], | 3104       [['FileType', 'Document'], | 
| 3096        ['Command', command], | 3105        ['Command', command], | 
| 3097        ['Message', description], | 3106        ['Message', description], | 
| 3098        ['Outputs', outputs] | 3107        ['Outputs', outputs] | 
| 3099       ]) | 3108       ]) | 
| 3100   if additional_inputs: | 3109   if additional_inputs: | 
| 3101     action_spec.append(['AdditionalInputs', additional_inputs]) | 3110     action_spec.append(['AdditionalInputs', additional_inputs]) | 
| 3102   actions_spec.append(action_spec) | 3111   actions_spec.append(action_spec) | 
| OLD | NEW | 
|---|