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
3 # found in the LICENSE file.
5 """Code to validate and convert settings of the Microsoft build tools.
7 This file contains code to validate and convert settings of the Microsoft
8 build tools. The function ConvertToMSBuildSettings(), ValidateMSVSSettings(),
9 and ValidateMSBuildSettings() are the entry points.
11 This file was created by comparing the projects created by Visual Studio 2008
12 and Visual Studio 2010 for all available settings through the user interface.
13 The MSBuild schemas were also considered. They are typically found in the
14 MSBuild install directory, e.g. c:\Program Files (x86)\MSBuild
20 # Dictionaries of settings validators. The key is the tool name, the value is
21 # a dictionary mapping setting names to validation functions.
23 _msbuild_validators = {}
26 # A dictionary of settings converters. The key is the tool name, the value is
27 # a dictionary mapping setting names to conversion functions.
28 _msvs_to_msbuild_converters = {}
31 # Tool name mapping from MSVS to MSBuild.
32 _msbuild_name_of_tool = {}
36 """Represents a tool used by MSVS or MSBuild.
39 msvs_name: The name of the tool in MSVS.
40 msbuild_name: The name of the tool in MSBuild.
43 def __init__(self, msvs_name, msbuild_name):
44 self.msvs_name = msvs_name
45 self.msbuild_name = msbuild_name
49 """Adds a tool to the four dictionaries used to process settings.
51 This only defines the tool. Each setting also needs to be added.
54 tool: The _Tool object to be added.
56 _msvs_validators[tool.msvs_name] = {}
57 _msbuild_validators[tool.msbuild_name] = {}
58 _msvs_to_msbuild_converters[tool.msvs_name] = {}
59 _msbuild_name_of_tool[tool.msvs_name] = tool.msbuild_name
62 def _GetMSBuildToolSettings(msbuild_settings, tool):
63 """Returns an MSBuild tool dictionary. Creates it if needed."""
64 return msbuild_settings.setdefault(tool.msbuild_name, {})
68 """Type of settings (Base class)."""
70 def ValidateMSVS(self, value):
71 """Verifies that the value is legal for MSVS.
74 value: the value to check for this type.
77 ValueError if value is not valid for MSVS.
80 def ValidateMSBuild(self, value):
81 """Verifies that the value is legal for MSBuild.
84 value: the value to check for this type.
87 ValueError if value is not valid for MSBuild.
90 def ConvertToMSBuild(self, value):
91 """Returns the MSBuild equivalent of the MSVS value given.
94 value: the MSVS value to convert.
97 the MSBuild equivalent.
100 ValueError if value is not valid.
105 class _String(_Type):
106 """A setting that's just a string."""
108 def ValidateMSVS(self, value):
109 if not isinstance(value, basestring):
110 raise ValueError('expected string; got %r' % value)
112 def ValidateMSBuild(self, value):
113 if not isinstance(value, basestring):
114 raise ValueError('expected string; got %r' % value)
116 def ConvertToMSBuild(self, value):
118 return ConvertVCMacrosToMSBuild(value)
121 class _StringList(_Type):
122 """A settings that's a list of strings."""
124 def ValidateMSVS(self, value):
125 if not isinstance(value, basestring) and not isinstance(value, list):
126 raise ValueError('expected string list; got %r' % value)
128 def ValidateMSBuild(self, value):
129 if not isinstance(value, basestring) and not isinstance(value, list):
130 raise ValueError('expected string list; got %r' % value)
132 def ConvertToMSBuild(self, value):
134 if isinstance(value, list):
135 return [ConvertVCMacrosToMSBuild(i) for i in value]
137 return ConvertVCMacrosToMSBuild(value)
140 class _Boolean(_Type):
141 """Boolean settings, can have the values 'false' or 'true'."""
143 def _Validate(self, value):
144 if value != 'true' and value != 'false':
145 raise ValueError('expected bool; got %r' % value)
147 def ValidateMSVS(self, value):
148 self._Validate(value)
150 def ValidateMSBuild(self, value):
151 self._Validate(value)
153 def ConvertToMSBuild(self, value):
154 self._Validate(value)
158 class _Integer(_Type):
159 """Integer settings."""
161 def __init__(self, msbuild_base=10):
163 self._msbuild_base = msbuild_base
165 def ValidateMSVS(self, value):
166 # Try to convert, this will raise ValueError if invalid.
167 self.ConvertToMSBuild(value)
169 def ValidateMSBuild(self, value):
170 # Try to convert, this will raise ValueError if invalid.
171 int(value, self._msbuild_base)
173 def ConvertToMSBuild(self, value):
174 msbuild_format = (self._msbuild_base == 10) and '%d' or '0x%04x'
175 return msbuild_format % int(value)
178 class _Enumeration(_Type):
179 """Type of settings that is an enumeration.
181 In MSVS, the values are indexes like '0', '1', and '2'.
182 MSBuild uses text labels that are more representative, like 'Win32'.
185 label_list: an array of MSBuild labels that correspond to the MSVS index.
186 In the rare cases where MSVS has skipped an index value, None is
187 used in the array to indicate the unused spot.
188 new: an array of labels that are new to MSBuild.
191 def __init__(self, label_list, new=None):
193 self._label_list = label_list
194 self._msbuild_values = set(value for value in label_list
195 if value is not None)
197 self._msbuild_values.update(new)
199 def ValidateMSVS(self, value):
200 # Try to convert. It will raise an exception if not valid.
201 self.ConvertToMSBuild(value)
203 def ValidateMSBuild(self, value):
204 if value not in self._msbuild_values:
205 raise ValueError('unrecognized enumerated value %s' % value)
207 def ConvertToMSBuild(self, value):
209 if index < 0 or index >= len(self._label_list):
210 raise ValueError('index value (%d) not in expected range [0, %d)' %
211 (index, len(self._label_list)))
212 label = self._label_list[index]
214 raise ValueError('converted value for %s not specified.' % value)
218 # Instantiate the various generic types.
219 _boolean = _Boolean()
220 _integer = _Integer()
221 # For now, we don't do any special validation on these types:
223 _file_name = _String()
224 _folder_name = _String()
225 _file_list = _StringList()
226 _folder_list = _StringList()
227 _string_list = _StringList()
228 # Some boolean settings went from numerical values to boolean. The
229 # mapping is 0: default, 1: false, 2: true.
230 _newly_boolean = _Enumeration(['', 'false', 'true'])
233 def _Same(tool, name, setting_type):
234 """Defines a setting that has the same name in MSVS and MSBuild.
237 tool: a dictionary that gives the names of the tool for MSVS and MSBuild.
238 name: the name of the setting.
239 setting_type: the type of this setting.
241 _Renamed(tool, name, name, setting_type)
244 def _Renamed(tool, msvs_name, msbuild_name, setting_type):
245 """Defines a setting for which the name has changed.
248 tool: a dictionary that gives the names of the tool for MSVS and MSBuild.
249 msvs_name: the name of the MSVS setting.
250 msbuild_name: the name of the MSBuild setting.
251 setting_type: the type of this setting.
254 def _Translate(value, msbuild_settings):
255 msbuild_tool_settings = _GetMSBuildToolSettings(msbuild_settings, tool)
256 msbuild_tool_settings[msbuild_name] = setting_type.ConvertToMSBuild(value)
258 _msvs_validators[tool.msvs_name][msvs_name] = setting_type.ValidateMSVS
259 _msbuild_validators[tool.msbuild_name][msbuild_name] = (
260 setting_type.ValidateMSBuild)
261 _msvs_to_msbuild_converters[tool.msvs_name][msvs_name] = _Translate
264 def _Moved(tool, settings_name, msbuild_tool_name, setting_type):
265 _MovedAndRenamed(tool, settings_name, msbuild_tool_name, settings_name,
269 def _MovedAndRenamed(tool, msvs_settings_name, msbuild_tool_name,
270 msbuild_settings_name, setting_type):
271 """Defines a setting that may have moved to a new section.
274 tool: a dictionary that gives the names of the tool for MSVS and MSBuild.
275 msvs_settings_name: the MSVS name of the setting.
276 msbuild_tool_name: the name of the MSBuild tool to place the setting under.
277 msbuild_settings_name: the MSBuild name of the setting.
278 setting_type: the type of this setting.
281 def _Translate(value, msbuild_settings):
282 tool_settings = msbuild_settings.setdefault(msbuild_tool_name, {})
283 tool_settings[msbuild_settings_name] = setting_type.ConvertToMSBuild(value)
285 _msvs_validators[tool.msvs_name][msvs_settings_name] = (
286 setting_type.ValidateMSVS)
287 validator = setting_type.ValidateMSBuild
288 _msbuild_validators[msbuild_tool_name][msbuild_settings_name] = validator
289 _msvs_to_msbuild_converters[tool.msvs_name][msvs_settings_name] = _Translate
292 def _MSVSOnly(tool, name, setting_type):
293 """Defines a setting that is only found in MSVS.
296 tool: a dictionary that gives the names of the tool for MSVS and MSBuild.
297 name: the name of the setting.
298 setting_type: the type of this setting.
301 def _Translate(unused_value, unused_msbuild_settings):
302 # Since this is for MSVS only settings, no translation will happen.
305 _msvs_validators[tool.msvs_name][name] = setting_type.ValidateMSVS
306 _msvs_to_msbuild_converters[tool.msvs_name][name] = _Translate
309 def _MSBuildOnly(tool, name, setting_type):
310 """Defines a setting that is only found in MSBuild.
313 tool: a dictionary that gives the names of the tool for MSVS and MSBuild.
314 name: the name of the setting.
315 setting_type: the type of this setting.
317 _msbuild_validators[tool.msbuild_name][name] = setting_type.ValidateMSBuild
320 def _ConvertedToAdditionalOption(tool, msvs_name, flag):
321 """Defines a setting that's handled via a command line option in MSBuild.
324 tool: a dictionary that gives the names of the tool for MSVS and MSBuild.
325 msvs_name: the name of the MSVS setting that if 'true' becomes a flag
326 flag: the flag to insert at the end of the AdditionalOptions
329 def _Translate(value, msbuild_settings):
331 tool_settings = _GetMSBuildToolSettings(msbuild_settings, tool)
332 if 'AdditionalOptions' in tool_settings:
333 new_flags = '%s %s' % (tool_settings['AdditionalOptions'], flag)
336 tool_settings['AdditionalOptions'] = new_flags
337 _msvs_validators[tool.msvs_name][msvs_name] = _boolean.ValidateMSVS
338 _msvs_to_msbuild_converters[tool.msvs_name][msvs_name] = _Translate
341 def _CustomGeneratePreprocessedFile(tool, msvs_name):
342 def _Translate(value, msbuild_settings):
343 tool_settings = _GetMSBuildToolSettings(msbuild_settings, tool)
345 tool_settings['PreprocessToFile'] = 'false'
346 tool_settings['PreprocessSuppressLineNumbers'] = 'false'
347 elif value == '1': # /P
348 tool_settings['PreprocessToFile'] = 'true'
349 tool_settings['PreprocessSuppressLineNumbers'] = 'false'
350 elif value == '2': # /EP /P
351 tool_settings['PreprocessToFile'] = 'true'
352 tool_settings['PreprocessSuppressLineNumbers'] = 'true'
354 raise ValueError('value must be one of [0, 1, 2]; got %s' % value)
355 # Create a bogus validator that looks for '0', '1', or '2'
356 msvs_validator = _Enumeration(['a', 'b', 'c']).ValidateMSVS
357 _msvs_validators[tool.msvs_name][msvs_name] = msvs_validator
358 msbuild_validator = _boolean.ValidateMSBuild
359 msbuild_tool_validators = _msbuild_validators[tool.msbuild_name]
360 msbuild_tool_validators['PreprocessToFile'] = msbuild_validator
361 msbuild_tool_validators['PreprocessSuppressLineNumbers'] = msbuild_validator
362 _msvs_to_msbuild_converters[tool.msvs_name][msvs_name] = _Translate
365 fix_vc_macro_slashes_regex_list = ('IntDir', 'OutDir')
366 fix_vc_macro_slashes_regex = re.compile(
367 r'(\$\((?:%s)\))(?:[\\/]+)' % "|".join(fix_vc_macro_slashes_regex_list)
370 def FixVCMacroSlashes(s):
371 """Replace macros which have excessive following slashes.
373 These macros are known to have a built-in trailing slash. Furthermore, many
374 scripts hiccup on processing paths with extra slashes in the middle.
376 This list is probably not exhaustive. Add as needed.
379 s = fix_vc_macro_slashes_regex.sub(r'\1', s)
383 def ConvertVCMacrosToMSBuild(s):
384 """Convert the the MSVS macros found in the string to the MSBuild equivalent.
386 This list is probably not exhaustive. Add as needed.
390 '$(ConfigurationName)': '$(Configuration)',
391 '$(InputDir)': '%(RootDir)%(Directory)',
392 '$(InputExt)': '%(Extension)',
393 '$(InputFileName)': '%(Filename)%(Extension)',
394 '$(InputName)': '%(Filename)',
395 '$(InputPath)': '%(FullPath)',
396 '$(ParentName)': '$(ProjectFileName)',
397 '$(PlatformName)': '$(Platform)',
398 '$(SafeInputName)': '%(Filename)',
400 for old, new in replace_map.iteritems():
401 s = s.replace(old, new)
402 s = FixVCMacroSlashes(s)
406 def ConvertToMSBuildSettings(msvs_settings, stderr=sys.stderr):
407 """Converts MSVS settings (VS2008 and earlier) to MSBuild settings (VS2010+).
410 msvs_settings: A dictionary. The key is the tool name. The values are
411 themselves dictionaries of settings and their values.
412 stderr: The stream receiving the error messages.
415 A dictionary of MSBuild settings. The key is either the MSBuild tool name
416 or the empty string (for the global settings). The values are themselves
417 dictionaries of settings and their values.
419 msbuild_settings = {}
420 for msvs_tool_name, msvs_tool_settings in msvs_settings.iteritems():
421 if msvs_tool_name in _msvs_to_msbuild_converters:
422 msvs_tool = _msvs_to_msbuild_converters[msvs_tool_name]
423 for msvs_setting, msvs_value in msvs_tool_settings.iteritems():
424 if msvs_setting in msvs_tool:
425 # Invoke the translation function.
427 msvs_tool[msvs_setting](msvs_value, msbuild_settings)
428 except ValueError, e:
429 print >> stderr, ('Warning: while converting %s/%s to MSBuild, '
430 '%s' % (msvs_tool_name, msvs_setting, e))
432 # We don't know this setting. Give a warning.
433 print >> stderr, ('Warning: unrecognized setting %s/%s '
434 'while converting to MSBuild.' %
435 (msvs_tool_name, msvs_setting))
437 print >> stderr, ('Warning: unrecognized tool %s while converting to '
438 'MSBuild.' % msvs_tool_name)
439 return msbuild_settings
442 def ValidateMSVSSettings(settings, stderr=sys.stderr):
443 """Validates that the names of the settings are valid for MSVS.
446 settings: A dictionary. The key is the tool name. The values are
447 themselves dictionaries of settings and their values.
448 stderr: The stream receiving the error messages.
450 _ValidateSettings(_msvs_validators, settings, stderr)
453 def ValidateMSBuildSettings(settings, stderr=sys.stderr):
454 """Validates that the names of the settings are valid for MSBuild.
457 settings: A dictionary. The key is the tool name. The values are
458 themselves dictionaries of settings and their values.
459 stderr: The stream receiving the error messages.
461 _ValidateSettings(_msbuild_validators, settings, stderr)
464 def _ValidateSettings(validators, settings, stderr):
465 """Validates that the settings are valid for MSBuild or MSVS.
467 We currently only validate the names of the settings, not their values.
470 validators: A dictionary of tools and their validators.
471 settings: A dictionary. The key is the tool name. The values are
472 themselves dictionaries of settings and their values.
473 stderr: The stream receiving the error messages.
475 for tool_name in settings:
476 if tool_name in validators:
477 tool_validators = validators[tool_name]
478 for setting, value in settings[tool_name].iteritems():
479 if setting in tool_validators:
481 tool_validators[setting](value)
482 except ValueError, e:
483 print >> stderr, ('Warning: for %s/%s, %s' %
484 (tool_name, setting, e))
486 print >> stderr, ('Warning: unrecognized setting %s/%s' %
487 (tool_name, setting))
489 print >> stderr, ('Warning: unrecognized tool %s' % tool_name)
492 # MSVS and MBuild names of the tools.
493 _compile = _Tool('VCCLCompilerTool', 'ClCompile')
494 _link = _Tool('VCLinkerTool', 'Link')
495 _midl = _Tool('VCMIDLTool', 'Midl')
496 _rc = _Tool('VCResourceCompilerTool', 'ResourceCompile')
497 _lib = _Tool('VCLibrarianTool', 'Lib')
498 _manifest = _Tool('VCManifestTool', 'Manifest')
507 # Add sections only found in the MSBuild settings.
508 _msbuild_validators[''] = {}
509 _msbuild_validators['ProjectReference'] = {}
510 _msbuild_validators['ManifestResourceCompile'] = {}
512 # Descriptions of the compiler options, i.e. VCCLCompilerTool in MSVS and
513 # ClCompile in MSBuild.
514 # See "c:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\1033\cl.xml" for
515 # the schema of the MSBuild ClCompile settings.
517 # Options that have the same name in MSVS and MSBuild
518 _Same(_compile, 'AdditionalIncludeDirectories', _folder_list) # /I
519 _Same(_compile, 'AdditionalOptions', _string_list)
520 _Same(_compile, 'AdditionalUsingDirectories', _folder_list) # /AI
521 _Same(_compile, 'AssemblerListingLocation', _file_name) # /Fa
522 _Same(_compile, 'BrowseInformationFile', _file_name)
523 _Same(_compile, 'BufferSecurityCheck', _boolean) # /GS
524 _Same(_compile, 'DisableLanguageExtensions', _boolean) # /Za
525 _Same(_compile, 'DisableSpecificWarnings', _string_list) # /wd
526 _Same(_compile, 'EnableFiberSafeOptimizations', _boolean) # /GT
527 _Same(_compile, 'EnablePREfast', _boolean) # /analyze Visible='false'
528 _Same(_compile, 'ExpandAttributedSource', _boolean) # /Fx
529 _Same(_compile, 'FloatingPointExceptions', _boolean) # /fp:except
530 _Same(_compile, 'ForceConformanceInForLoopScope', _boolean) # /Zc:forScope
531 _Same(_compile, 'ForcedIncludeFiles', _file_list) # /FI
532 _Same(_compile, 'ForcedUsingFiles', _file_list) # /FU
533 _Same(_compile, 'GenerateXMLDocumentationFiles', _boolean) # /doc
534 _Same(_compile, 'IgnoreStandardIncludePath', _boolean) # /X
535 _Same(_compile, 'MinimalRebuild', _boolean) # /Gm
536 _Same(_compile, 'OmitDefaultLibName', _boolean) # /Zl
537 _Same(_compile, 'OmitFramePointers', _boolean) # /Oy
538 _Same(_compile, 'PreprocessorDefinitions', _string_list) # /D
539 _Same(_compile, 'ProgramDataBaseFileName', _file_name) # /Fd
540 _Same(_compile, 'RuntimeTypeInfo', _boolean) # /GR
541 _Same(_compile, 'ShowIncludes', _boolean) # /showIncludes
542 _Same(_compile, 'SmallerTypeCheck', _boolean) # /RTCc
543 _Same(_compile, 'StringPooling', _boolean) # /GF
544 _Same(_compile, 'SuppressStartupBanner', _boolean) # /nologo
545 _Same(_compile, 'TreatWChar_tAsBuiltInType', _boolean) # /Zc:wchar_t
546 _Same(_compile, 'UndefineAllPreprocessorDefinitions', _boolean) # /u
547 _Same(_compile, 'UndefinePreprocessorDefinitions', _string_list) # /U
548 _Same(_compile, 'UseFullPaths', _boolean) # /FC
549 _Same(_compile, 'WholeProgramOptimization', _boolean) # /GL
550 _Same(_compile, 'XMLDocumentationFileName', _file_name)
552 _Same(_compile, 'AssemblerOutput',
553 _Enumeration(['NoListing',
554 'AssemblyCode', # /FA
556 'AssemblyAndMachineCode', # /FAc
557 'AssemblyAndSourceCode'])) # /FAs
558 _Same(_compile, 'BasicRuntimeChecks',
559 _Enumeration(['Default',
560 'StackFrameRuntimeCheck', # /RTCs
561 'UninitializedLocalUsageCheck', # /RTCu
562 'EnableFastChecks'])) # /RTC1
563 _Same(_compile, 'BrowseInformation',
564 _Enumeration(['false',
567 _Same(_compile, 'CallingConvention',
568 _Enumeration(['Cdecl', # /Gd
571 _Same(_compile, 'CompileAs',
572 _Enumeration(['Default',
574 'CompileAsCpp'])) # /TP
575 _Same(_compile, 'DebugInformationFormat',
576 _Enumeration(['', # Disabled
579 'ProgramDatabase', # /Zi
580 'EditAndContinue'])) # /ZI
581 _Same(_compile, 'EnableEnhancedInstructionSet',
582 _Enumeration(['NotSet',
583 'StreamingSIMDExtensions', # /arch:SSE
584 'StreamingSIMDExtensions2'])) # /arch:SSE2
585 _Same(_compile, 'ErrorReporting',
586 _Enumeration(['None', # /errorReport:none
587 'Prompt', # /errorReport:prompt
588 'Queue'], # /errorReport:queue
589 new=['Send'])) # /errorReport:send"
590 _Same(_compile, 'ExceptionHandling',
591 _Enumeration(['false',
594 new=['SyncCThrow'])) # /EHs
595 _Same(_compile, 'FavorSizeOrSpeed',
596 _Enumeration(['Neither',
599 _Same(_compile, 'FloatingPointModel',
600 _Enumeration(['Precise', # /fp:precise
601 'Strict', # /fp:strict
603 _Same(_compile, 'InlineFunctionExpansion',
604 _Enumeration(['Default',
605 'OnlyExplicitInline', # /Ob1
606 'AnySuitable'], # /Ob2
607 new=['Disabled'])) # /Ob0
608 _Same(_compile, 'Optimization',
609 _Enumeration(['Disabled', # /Od
613 _Same(_compile, 'RuntimeLibrary',
614 _Enumeration(['MultiThreaded', # /MT
615 'MultiThreadedDebug', # /MTd
616 'MultiThreadedDLL', # /MD
617 'MultiThreadedDebugDLL'])) # /MDd
618 _Same(_compile, 'StructMemberAlignment',
619 _Enumeration(['Default',
625 _Same(_compile, 'WarningLevel',
626 _Enumeration(['TurnOffAllWarnings', # /W0
631 new=['EnableAllWarnings'])) # /Wall
633 # Options found in MSVS that have been renamed in MSBuild.
634 _Renamed(_compile, 'EnableFunctionLevelLinking', 'FunctionLevelLinking',
636 _Renamed(_compile, 'EnableIntrinsicFunctions', 'IntrinsicFunctions',
638 _Renamed(_compile, 'KeepComments', 'PreprocessKeepComments', _boolean) # /C
639 _Renamed(_compile, 'ObjectFile', 'ObjectFileName', _file_name) # /Fo
640 _Renamed(_compile, 'OpenMP', 'OpenMPSupport', _boolean) # /openmp
641 _Renamed(_compile, 'PrecompiledHeaderThrough', 'PrecompiledHeaderFile',
642 _file_name) # Used with /Yc and /Yu
643 _Renamed(_compile, 'PrecompiledHeaderFile', 'PrecompiledHeaderOutputFile',
645 _Renamed(_compile, 'UsePrecompiledHeader', 'PrecompiledHeader',
646 _Enumeration(['NotUsing', # VS recognized '' for this value too.
649 _Renamed(_compile, 'WarnAsError', 'TreatWarningAsError', _boolean) # /WX
651 _ConvertedToAdditionalOption(_compile, 'DefaultCharIsUnsigned', '/J')
653 # MSVS options not found in MSBuild.
654 _MSVSOnly(_compile, 'Detect64BitPortabilityProblems', _boolean)
655 _MSVSOnly(_compile, 'UseUnicodeResponseFiles', _boolean)
657 # MSBuild options not found in MSVS.
658 _MSBuildOnly(_compile, 'BuildingInIDE', _boolean)
659 _MSBuildOnly(_compile, 'CompileAsManaged',
660 _Enumeration([], new=['false',
664 'OldSyntax'])) # /clr:oldSyntax
665 _MSBuildOnly(_compile, 'CreateHotpatchableImage', _boolean) # /hotpatch
666 _MSBuildOnly(_compile, 'MultiProcessorCompilation', _boolean) # /MP
667 _MSBuildOnly(_compile, 'PreprocessOutputPath', _string) # /Fi
668 _MSBuildOnly(_compile, 'ProcessorNumber', _integer) # the number of processors
669 _MSBuildOnly(_compile, 'TrackerLogDirectory', _folder_name)
670 _MSBuildOnly(_compile, 'TreatSpecificWarningsAsErrors', _string_list) # /we
671 _MSBuildOnly(_compile, 'UseUnicodeForAssemblerListing', _boolean) # /FAu
673 # Defines a setting that needs very customized processing
674 _CustomGeneratePreprocessedFile(_compile, 'GeneratePreprocessedFile')
677 # Directives for converting MSVS VCLinkerTool to MSBuild Link.
678 # See "c:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\1033\link.xml" for
679 # the schema of the MSBuild Link settings.
681 # Options that have the same name in MSVS and MSBuild
682 _Same(_link, 'AdditionalDependencies', _file_list)
683 _Same(_link, 'AdditionalLibraryDirectories', _folder_list) # /LIBPATH
684 # /MANIFESTDEPENDENCY:
685 _Same(_link, 'AdditionalManifestDependencies', _file_list)
686 _Same(_link, 'AdditionalOptions', _string_list)
687 _Same(_link, 'AddModuleNamesToAssembly', _file_list) # /ASSEMBLYMODULE
688 _Same(_link, 'AllowIsolation', _boolean) # /ALLOWISOLATION
689 _Same(_link, 'AssemblyLinkResource', _file_list) # /ASSEMBLYLINKRESOURCE
690 _Same(_link, 'BaseAddress', _string) # /BASE
691 _Same(_link, 'CLRUnmanagedCodeCheck', _boolean) # /CLRUNMANAGEDCODECHECK
692 _Same(_link, 'DelayLoadDLLs', _file_list) # /DELAYLOAD
693 _Same(_link, 'DelaySign', _boolean) # /DELAYSIGN
694 _Same(_link, 'EmbedManagedResourceFile', _file_list) # /ASSEMBLYRESOURCE
695 _Same(_link, 'EnableUAC', _boolean) # /MANIFESTUAC
696 _Same(_link, 'EntryPointSymbol', _string) # /ENTRY
697 _Same(_link, 'ForceSymbolReferences', _file_list) # /INCLUDE
698 _Same(_link, 'FunctionOrder', _file_name) # /ORDER
699 _Same(_link, 'GenerateDebugInformation', _boolean) # /DEBUG
700 _Same(_link, 'GenerateMapFile', _boolean) # /MAP
701 _Same(_link, 'HeapCommitSize', _string)
702 _Same(_link, 'HeapReserveSize', _string) # /HEAP
703 _Same(_link, 'IgnoreAllDefaultLibraries', _boolean) # /NODEFAULTLIB
704 _Same(_link, 'IgnoreEmbeddedIDL', _boolean) # /IGNOREIDL
705 _Same(_link, 'ImportLibrary', _file_name) # /IMPLIB
706 _Same(_link, 'KeyContainer', _file_name) # /KEYCONTAINER
707 _Same(_link, 'KeyFile', _file_name) # /KEYFILE
708 _Same(_link, 'ManifestFile', _file_name) # /ManifestFile
709 _Same(_link, 'MapExports', _boolean) # /MAPINFO:EXPORTS
710 _Same(_link, 'MapFileName', _file_name)
711 _Same(_link, 'MergedIDLBaseFileName', _file_name) # /IDLOUT
712 _Same(_link, 'MergeSections', _string) # /MERGE
713 _Same(_link, 'MidlCommandFile', _file_name) # /MIDL
714 _Same(_link, 'ModuleDefinitionFile', _file_name) # /DEF
715 _Same(_link, 'OutputFile', _file_name) # /OUT
716 _Same(_link, 'PerUserRedirection', _boolean)
717 _Same(_link, 'Profile', _boolean) # /PROFILE
718 _Same(_link, 'ProfileGuidedDatabase', _file_name) # /PGD
719 _Same(_link, 'ProgramDatabaseFile', _file_name) # /PDB
720 _Same(_link, 'RegisterOutput', _boolean)
721 _Same(_link, 'SetChecksum', _boolean) # /RELEASE
722 _Same(_link, 'StackCommitSize', _string)
723 _Same(_link, 'StackReserveSize', _string) # /STACK
724 _Same(_link, 'StripPrivateSymbols', _file_name) # /PDBSTRIPPED
725 _Same(_link, 'SupportUnloadOfDelayLoadedDLL', _boolean) # /DELAY:UNLOAD
726 _Same(_link, 'SuppressStartupBanner', _boolean) # /NOLOGO
727 _Same(_link, 'SwapRunFromCD', _boolean) # /SWAPRUN:CD
728 _Same(_link, 'TurnOffAssemblyGeneration', _boolean) # /NOASSEMBLY
729 _Same(_link, 'TypeLibraryFile', _file_name) # /TLBOUT
730 _Same(_link, 'TypeLibraryResourceID', _integer) # /TLBID
731 _Same(_link, 'UACUIAccess', _boolean) # /uiAccess='true'
732 _Same(_link, 'Version', _string) # /VERSION
734 _Same(_link, 'EnableCOMDATFolding', _newly_boolean) # /OPT:ICF
735 _Same(_link, 'FixedBaseAddress', _newly_boolean) # /FIXED
736 _Same(_link, 'LargeAddressAware', _newly_boolean) # /LARGEADDRESSAWARE
737 _Same(_link, 'OptimizeReferences', _newly_boolean) # /OPT:REF
738 _Same(_link, 'RandomizedBaseAddress', _newly_boolean) # /DYNAMICBASE
739 _Same(_link, 'TerminalServerAware', _newly_boolean) # /TSAWARE
741 _subsystem_enumeration = _Enumeration(
743 'Console', # /SUBSYSTEM:CONSOLE
744 'Windows', # /SUBSYSTEM:WINDOWS
745 'Native', # /SUBSYSTEM:NATIVE
746 'EFI Application', # /SUBSYSTEM:EFI_APPLICATION
747 'EFI Boot Service Driver', # /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER
748 'EFI ROM', # /SUBSYSTEM:EFI_ROM
749 'EFI Runtime', # /SUBSYSTEM:EFI_RUNTIME_DRIVER
750 'WindowsCE'], # /SUBSYSTEM:WINDOWSCE
751 new=['POSIX']) # /SUBSYSTEM:POSIX
753 _target_machine_enumeration = _Enumeration(
755 'MachineX86', # /MACHINE:X86
757 'MachineARM', # /MACHINE:ARM
758 'MachineEBC', # /MACHINE:EBC
759 'MachineIA64', # /MACHINE:IA64
761 'MachineMIPS', # /MACHINE:MIPS
762 'MachineMIPS16', # /MACHINE:MIPS16
763 'MachineMIPSFPU', # /MACHINE:MIPSFPU
764 'MachineMIPSFPU16', # /MACHINE:MIPSFPU16
768 'MachineSH4', # /MACHINE:SH4
770 'MachineTHUMB', # /MACHINE:THUMB
771 'MachineX64']) # /MACHINE:X64
773 _Same(_link, 'AssemblyDebug',
775 'true', # /ASSEMBLYDEBUG
776 'false'])) # /ASSEMBLYDEBUG:DISABLE
777 _Same(_link, 'CLRImageType',
778 _Enumeration(['Default',
779 'ForceIJWImage', # /CLRIMAGETYPE:IJW
780 'ForcePureILImage', # /Switch="CLRIMAGETYPE:PURE
781 'ForceSafeILImage'])) # /Switch="CLRIMAGETYPE:SAFE
782 _Same(_link, 'CLRThreadAttribute',
783 _Enumeration(['DefaultThreadingAttribute', # /CLRTHREADATTRIBUTE:NONE
784 'MTAThreadingAttribute', # /CLRTHREADATTRIBUTE:MTA
785 'STAThreadingAttribute'])) # /CLRTHREADATTRIBUTE:STA
786 _Same(_link, 'DataExecutionPrevention',
788 'false', # /NXCOMPAT:NO
789 'true'])) # /NXCOMPAT
790 _Same(_link, 'Driver',
791 _Enumeration(['NotSet',
793 'UpOnly', # /DRIVER:UPONLY
794 'WDM'])) # /DRIVER:WDM
795 _Same(_link, 'LinkTimeCodeGeneration',
796 _Enumeration(['Default',
797 'UseLinkTimeCodeGeneration', # /LTCG
798 'PGInstrument', # /LTCG:PGInstrument
799 'PGOptimization', # /LTCG:PGOptimize
800 'PGUpdate'])) # /LTCG:PGUpdate
801 _Same(_link, 'ShowProgress',
802 _Enumeration(['NotSet',
803 'LinkVerbose', # /VERBOSE
804 'LinkVerboseLib'], # /VERBOSE:Lib
805 new=['LinkVerboseICF', # /VERBOSE:ICF
806 'LinkVerboseREF', # /VERBOSE:REF
807 'LinkVerboseSAFESEH', # /VERBOSE:SAFESEH
808 'LinkVerboseCLR'])) # /VERBOSE:CLR
809 _Same(_link, 'SubSystem', _subsystem_enumeration)
810 _Same(_link, 'TargetMachine', _target_machine_enumeration)
811 _Same(_link, 'UACExecutionLevel',
812 _Enumeration(['AsInvoker', # /level='asInvoker'
813 'HighestAvailable', # /level='highestAvailable'
814 'RequireAdministrator'])) # /level='requireAdministrator'
815 _Same(_link, 'MinimumRequiredVersion', _string)
816 _Same(_link, 'TreatLinkerWarningAsErrors', _boolean) # /WX
819 # Options found in MSVS that have been renamed in MSBuild.
820 _Renamed(_link, 'ErrorReporting', 'LinkErrorReporting',
821 _Enumeration(['NoErrorReport', # /ERRORREPORT:NONE
822 'PromptImmediately', # /ERRORREPORT:PROMPT
823 'QueueForNextLogin'], # /ERRORREPORT:QUEUE
824 new=['SendErrorReport'])) # /ERRORREPORT:SEND
825 _Renamed(_link, 'IgnoreDefaultLibraryNames', 'IgnoreSpecificDefaultLibraries',
826 _file_list) # /NODEFAULTLIB
827 _Renamed(_link, 'ResourceOnlyDLL', 'NoEntryPoint', _boolean) # /NOENTRY
828 _Renamed(_link, 'SwapRunFromNet', 'SwapRunFromNET', _boolean) # /SWAPRUN:NET
830 _Moved(_link, 'GenerateManifest', '', _boolean)
831 _Moved(_link, 'IgnoreImportLibrary', '', _boolean)
832 _Moved(_link, 'LinkIncremental', '', _newly_boolean)
833 _Moved(_link, 'LinkLibraryDependencies', 'ProjectReference', _boolean)
834 _Moved(_link, 'UseLibraryDependencyInputs', 'ProjectReference', _boolean)
836 # MSVS options not found in MSBuild.
837 _MSVSOnly(_link, 'OptimizeForWindows98', _newly_boolean)
838 _MSVSOnly(_link, 'UseUnicodeResponseFiles', _boolean)
839 # These settings generate correctly in the MSVS output files when using
840 # e.g. DelayLoadDLLs! or AdditionalDependencies! to exclude files from
841 # configuration entries, but result in spurious artifacts which can be
842 # safely ignored here. See crbug.com/246570
843 _MSVSOnly(_link, 'AdditionalLibraryDirectories_excluded', _folder_list)
844 _MSVSOnly(_link, 'DelayLoadDLLs_excluded', _file_list)
845 _MSVSOnly(_link, 'AdditionalDependencies_excluded', _file_list)
847 # MSBuild options not found in MSVS.
848 _MSBuildOnly(_link, 'BuildingInIDE', _boolean)
849 _MSBuildOnly(_link, 'ImageHasSafeExceptionHandlers', _boolean) # /SAFESEH
850 _MSBuildOnly(_link, 'LinkDLL', _boolean) # /DLL Visible='false'
851 _MSBuildOnly(_link, 'LinkStatus', _boolean) # /LTCG:STATUS
852 _MSBuildOnly(_link, 'PreventDllBinding', _boolean) # /ALLOWBIND
853 _MSBuildOnly(_link, 'SupportNobindOfDelayLoadedDLL', _boolean) # /DELAY:NOBIND
854 _MSBuildOnly(_link, 'TrackerLogDirectory', _folder_name)
855 _MSBuildOnly(_link, 'MSDOSStubFileName', _file_name) # /STUB Visible='false'
856 _MSBuildOnly(_link, 'SectionAlignment', _integer) # /ALIGN
857 _MSBuildOnly(_link, 'SpecifySectionAttributes', _string) # /SECTION
858 _MSBuildOnly(_link, 'ForceFileOutput',
859 _Enumeration([], new=['Enabled', # /FORCE
861 'MultiplyDefinedSymbolOnly',
862 'UndefinedSymbolOnly'])) # /FORCE:UNRESOLVED
863 _MSBuildOnly(_link, 'CreateHotPatchableImage',
864 _Enumeration([], new=['Enabled', # /FUNCTIONPADMIN
865 'X86Image', # /FUNCTIONPADMIN:5
866 'X64Image', # /FUNCTIONPADMIN:6
867 'ItaniumImage'])) # /FUNCTIONPADMIN:16
868 _MSBuildOnly(_link, 'CLRSupportLastError',
869 _Enumeration([], new=['Enabled', # /CLRSupportLastError
870 'Disabled', # /CLRSupportLastError:NO
871 # /CLRSupportLastError:SYSTEMDLL
875 # Directives for converting VCResourceCompilerTool to ResourceCompile.
876 # See "c:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\1033\rc.xml" for
877 # the schema of the MSBuild ResourceCompile settings.
879 _Same(_rc, 'AdditionalOptions', _string_list)
880 _Same(_rc, 'AdditionalIncludeDirectories', _folder_list) # /I
881 _Same(_rc, 'Culture', _Integer(msbuild_base=16))
882 _Same(_rc, 'IgnoreStandardIncludePath', _boolean) # /X
883 _Same(_rc, 'PreprocessorDefinitions', _string_list) # /D
884 _Same(_rc, 'ResourceOutputFileName', _string) # /fo
885 _Same(_rc, 'ShowProgress', _boolean) # /v
886 # There is no UI in VisualStudio 2008 to set the following properties.
887 # However they are found in CL and other tools. Include them here for
888 # completeness, as they are very likely to have the same usage pattern.
889 _Same(_rc, 'SuppressStartupBanner', _boolean) # /nologo
890 _Same(_rc, 'UndefinePreprocessorDefinitions', _string_list) # /u
892 # MSBuild options not found in MSVS.
893 _MSBuildOnly(_rc, 'NullTerminateStrings', _boolean) # /n
894 _MSBuildOnly(_rc, 'TrackerLogDirectory', _folder_name)
897 # Directives for converting VCMIDLTool to Midl.
898 # See "c:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\1033\midl.xml" for
899 # the schema of the MSBuild Midl settings.
901 _Same(_midl, 'AdditionalIncludeDirectories', _folder_list) # /I
902 _Same(_midl, 'AdditionalOptions', _string_list)
903 _Same(_midl, 'CPreprocessOptions', _string) # /cpp_opt
904 _Same(_midl, 'ErrorCheckAllocations', _boolean) # /error allocation
905 _Same(_midl, 'ErrorCheckBounds', _boolean) # /error bounds_check
906 _Same(_midl, 'ErrorCheckEnumRange', _boolean) # /error enum
907 _Same(_midl, 'ErrorCheckRefPointers', _boolean) # /error ref
908 _Same(_midl, 'ErrorCheckStubData', _boolean) # /error stub_data
909 _Same(_midl, 'GenerateStublessProxies', _boolean) # /Oicf
910 _Same(_midl, 'GenerateTypeLibrary', _boolean)
911 _Same(_midl, 'HeaderFileName', _file_name) # /h
912 _Same(_midl, 'IgnoreStandardIncludePath', _boolean) # /no_def_idir
913 _Same(_midl, 'InterfaceIdentifierFileName', _file_name) # /iid
914 _Same(_midl, 'MkTypLibCompatible', _boolean) # /mktyplib203
915 _Same(_midl, 'OutputDirectory', _string) # /out
916 _Same(_midl, 'PreprocessorDefinitions', _string_list) # /D
917 _Same(_midl, 'ProxyFileName', _file_name) # /proxy
918 _Same(_midl, 'RedirectOutputAndErrors', _file_name) # /o
919 _Same(_midl, 'SuppressStartupBanner', _boolean) # /nologo
920 _Same(_midl, 'TypeLibraryName', _file_name) # /tlb
921 _Same(_midl, 'UndefinePreprocessorDefinitions', _string_list) # /U
922 _Same(_midl, 'WarnAsError', _boolean) # /WX
924 _Same(_midl, 'DefaultCharType',
925 _Enumeration(['Unsigned', # /char unsigned
926 'Signed', # /char signed
927 'Ascii'])) # /char ascii7
928 _Same(_midl, 'TargetEnvironment',
929 _Enumeration(['NotSet',
930 'Win32', # /env win32
931 'Itanium', # /env ia64
933 _Same(_midl, 'EnableErrorChecks',
934 _Enumeration(['EnableCustom',
935 'None', # /error none
936 'All'])) # /error all
937 _Same(_midl, 'StructMemberAlignment',
938 _Enumeration(['NotSet',
943 _Same(_midl, 'WarningLevel',
944 _Enumeration(['0', # /W0
950 _Renamed(_midl, 'DLLDataFileName', 'DllDataFileName', _file_name) # /dlldata
951 _Renamed(_midl, 'ValidateParameters', 'ValidateAllParameters',
954 # MSBuild options not found in MSVS.
955 _MSBuildOnly(_midl, 'ApplicationConfigurationMode', _boolean) # /app_config
956 _MSBuildOnly(_midl, 'ClientStubFile', _file_name) # /cstub
957 _MSBuildOnly(_midl, 'GenerateClientFiles',
958 _Enumeration([], new=['Stub', # /client stub
959 'None'])) # /client none
960 _MSBuildOnly(_midl, 'GenerateServerFiles',
961 _Enumeration([], new=['Stub', # /client stub
962 'None'])) # /client none
963 _MSBuildOnly(_midl, 'LocaleID', _integer) # /lcid DECIMAL
964 _MSBuildOnly(_midl, 'ServerStubFile', _file_name) # /sstub
965 _MSBuildOnly(_midl, 'SuppressCompilerWarnings', _boolean) # /no_warn
966 _MSBuildOnly(_midl, 'TrackerLogDirectory', _folder_name)
967 _MSBuildOnly(_midl, 'TypeLibFormat',
968 _Enumeration([], new=['NewFormat', # /newtlb
969 'OldFormat'])) # /oldtlb
972 # Directives for converting VCLibrarianTool to Lib.
973 # See "c:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\1033\lib.xml" for
974 # the schema of the MSBuild Lib settings.
976 _Same(_lib, 'AdditionalDependencies', _file_list)
977 _Same(_lib, 'AdditionalLibraryDirectories', _folder_list) # /LIBPATH
978 _Same(_lib, 'AdditionalOptions', _string_list)
979 _Same(_lib, 'ExportNamedFunctions', _string_list) # /EXPORT
980 _Same(_lib, 'ForceSymbolReferences', _string) # /INCLUDE
981 _Same(_lib, 'IgnoreAllDefaultLibraries', _boolean) # /NODEFAULTLIB
982 _Same(_lib, 'IgnoreSpecificDefaultLibraries', _file_list) # /NODEFAULTLIB
983 _Same(_lib, 'ModuleDefinitionFile', _file_name) # /DEF
984 _Same(_lib, 'OutputFile', _file_name) # /OUT
985 _Same(_lib, 'SuppressStartupBanner', _boolean) # /NOLOGO
986 _Same(_lib, 'UseUnicodeResponseFiles', _boolean)
987 _Same(_lib, 'LinkTimeCodeGeneration', _boolean) # /LTCG
988 _Same(_lib, 'TargetMachine', _target_machine_enumeration)
990 # TODO(jeanluc) _link defines the same value that gets moved to
991 # ProjectReference. We may want to validate that they are consistent.
992 _Moved(_lib, 'LinkLibraryDependencies', 'ProjectReference', _boolean)
994 # TODO(jeanluc) I don't think these are genuine settings but byproducts of Gyp.
995 _MSVSOnly(_lib, 'AdditionalLibraryDirectories_excluded', _folder_list)
997 _MSBuildOnly(_lib, 'DisplayLibrary', _string) # /LIST Visible='false'
998 _MSBuildOnly(_lib, 'ErrorReporting',
999 _Enumeration([], new=['PromptImmediately', # /ERRORREPORT:PROMPT
1000 'QueueForNextLogin', # /ERRORREPORT:QUEUE
1001 'SendErrorReport', # /ERRORREPORT:SEND
1002 'NoErrorReport'])) # /ERRORREPORT:NONE
1003 _MSBuildOnly(_lib, 'MinimumRequiredVersion', _string)
1004 _MSBuildOnly(_lib, 'Name', _file_name) # /NAME
1005 _MSBuildOnly(_lib, 'RemoveObjects', _file_list) # /REMOVE
1006 _MSBuildOnly(_lib, 'SubSystem', _subsystem_enumeration)
1007 _MSBuildOnly(_lib, 'TrackerLogDirectory', _folder_name)
1008 _MSBuildOnly(_lib, 'TreatLibWarningAsErrors', _boolean) # /WX
1009 _MSBuildOnly(_lib, 'Verbose', _boolean)
1012 # Directives for converting VCManifestTool to Mt.
1013 # See "c:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\1033\mt.xml" for
1014 # the schema of the MSBuild Lib settings.
1016 # Options that have the same name in MSVS and MSBuild
1017 _Same(_manifest, 'AdditionalManifestFiles', _file_list) # /manifest
1018 _Same(_manifest, 'AdditionalOptions', _string_list)
1019 _Same(_manifest, 'AssemblyIdentity', _string) # /identity:
1020 _Same(_manifest, 'ComponentFileName', _file_name) # /dll
1021 _Same(_manifest, 'GenerateCatalogFiles', _boolean) # /makecdfs
1022 _Same(_manifest, 'InputResourceManifests', _string) # /inputresource
1023 _Same(_manifest, 'OutputManifestFile', _file_name) # /out
1024 _Same(_manifest, 'RegistrarScriptFile', _file_name) # /rgs
1025 _Same(_manifest, 'ReplacementsFile', _file_name) # /replacements
1026 _Same(_manifest, 'SuppressStartupBanner', _boolean) # /nologo
1027 _Same(_manifest, 'TypeLibraryFile', _file_name) # /tlb:
1028 _Same(_manifest, 'UpdateFileHashes', _boolean) # /hashupdate
1029 _Same(_manifest, 'UpdateFileHashesSearchPath', _file_name)
1030 _Same(_manifest, 'VerboseOutput', _boolean) # /verbose
1032 # Options that have moved location.
1033 _MovedAndRenamed(_manifest, 'ManifestResourceFile',
1034 'ManifestResourceCompile',
1035 'ResourceOutputFileName',
1037 _Moved(_manifest, 'EmbedManifest', '', _boolean)
1039 # MSVS options not found in MSBuild.
1040 _MSVSOnly(_manifest, 'DependencyInformationFile', _file_name)
1041 _MSVSOnly(_manifest, 'UseFAT32Workaround', _boolean)
1042 _MSVSOnly(_manifest, 'UseUnicodeResponseFiles', _boolean)
1044 # MSBuild options not found in MSVS.
1045 _MSBuildOnly(_manifest, 'EnableDPIAwareness', _boolean)
1046 _MSBuildOnly(_manifest, 'GenerateCategoryTags', _boolean) # /category
1047 _MSBuildOnly(_manifest, 'ManifestFromManagedAssembly',
1048 _file_name) # /managedassemblyname
1049 _MSBuildOnly(_manifest, 'OutputResourceManifests', _string) # /outputresource
1050 _MSBuildOnly(_manifest, 'SuppressDependencyElement', _boolean) # /nodependency
1051 _MSBuildOnly(_manifest, 'TrackerLogDirectory', _folder_name)