Home | History | Annotate | Download | only in gyp
      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.
      4 
      5 r"""Code to validate and convert settings of the Microsoft build tools.
      6 
      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.
     10 
     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
     15 """
     16 
     17 import sys
     18 import re
     19 
     20 # Dictionaries of settings validators. The key is the tool name, the value is
     21 # a dictionary mapping setting names to validation functions.
     22 _msvs_validators = {}
     23 _msbuild_validators = {}
     24 
     25 
     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 = {}
     29 
     30 
     31 # Tool name mapping from MSVS to MSBuild.
     32 _msbuild_name_of_tool = {}
     33 
     34 
     35 class _Tool(object):
     36   """Represents a tool used by MSVS or MSBuild.
     37 
     38   Attributes:
     39       msvs_name: The name of the tool in MSVS.
     40       msbuild_name: The name of the tool in MSBuild.
     41   """
     42 
     43   def __init__(self, msvs_name, msbuild_name):
     44     self.msvs_name = msvs_name
     45     self.msbuild_name = msbuild_name
     46 
     47 
     48 def _AddTool(tool):
     49   """Adds a tool to the four dictionaries used to process settings.
     50 
     51   This only defines the tool.  Each setting also needs to be added.
     52 
     53   Args:
     54     tool: The _Tool object to be added.
     55   """
     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
     60 
     61 
     62 def _GetMSBuildToolSettings(msbuild_settings, tool):
     63   """Returns an MSBuild tool dictionary.  Creates it if needed."""
     64   return msbuild_settings.setdefault(tool.msbuild_name, {})
     65 
     66 
     67 class _Type(object):
     68   """Type of settings (Base class)."""
     69 
     70   def ValidateMSVS(self, value):
     71     """Verifies that the value is legal for MSVS.
     72 
     73     Args:
     74       value: the value to check for this type.
     75 
     76     Raises:
     77       ValueError if value is not valid for MSVS.
     78     """
     79 
     80   def ValidateMSBuild(self, value):
     81     """Verifies that the value is legal for MSBuild.
     82 
     83     Args:
     84       value: the value to check for this type.
     85 
     86     Raises:
     87       ValueError if value is not valid for MSBuild.
     88     """
     89 
     90   def ConvertToMSBuild(self, value):
     91     """Returns the MSBuild equivalent of the MSVS value given.
     92 
     93     Args:
     94       value: the MSVS value to convert.
     95 
     96     Returns:
     97       the MSBuild equivalent.
     98 
     99     Raises:
    100       ValueError if value is not valid.
    101     """
    102     return value
    103 
    104 
    105 class _String(_Type):
    106   """A setting that's just a string."""
    107 
    108   def ValidateMSVS(self, value):
    109     if not isinstance(value, basestring):
    110       raise ValueError('expected string; got %r' % value)
    111 
    112   def ValidateMSBuild(self, value):
    113     if not isinstance(value, basestring):
    114       raise ValueError('expected string; got %r' % value)
    115 
    116   def ConvertToMSBuild(self, value):
    117     # Convert the macros
    118     return ConvertVCMacrosToMSBuild(value)
    119 
    120 
    121 class _StringList(_Type):
    122   """A settings that's a list of strings."""
    123 
    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)
    127 
    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)
    131 
    132   def ConvertToMSBuild(self, value):
    133     # Convert the macros
    134     if isinstance(value, list):
    135       return [ConvertVCMacrosToMSBuild(i) for i in value]
    136     else:
    137       return ConvertVCMacrosToMSBuild(value)
    138 
    139 
    140 class _Boolean(_Type):
    141   """Boolean settings, can have the values 'false' or 'true'."""
    142 
    143   def _Validate(self, value):
    144     if value != 'true' and value != 'false':
    145       raise ValueError('expected bool; got %r' % value)
    146 
    147   def ValidateMSVS(self, value):
    148     self._Validate(value)
    149 
    150   def ValidateMSBuild(self, value):
    151     self._Validate(value)
    152 
    153   def ConvertToMSBuild(self, value):
    154     self._Validate(value)
    155     return value
    156 
    157 
    158 class _Integer(_Type):
    159   """Integer settings."""
    160 
    161   def __init__(self, msbuild_base=10):
    162     _Type.__init__(self)
    163     self._msbuild_base = msbuild_base
    164 
    165   def ValidateMSVS(self, value):
    166     # Try to convert, this will raise ValueError if invalid.
    167     self.ConvertToMSBuild(value)
    168 
    169   def ValidateMSBuild(self, value):
    170     # Try to convert, this will raise ValueError if invalid.
    171     int(value, self._msbuild_base)
    172 
    173   def ConvertToMSBuild(self, value):
    174     msbuild_format = (self._msbuild_base == 10) and '%d' or '0x%04x'
    175     return msbuild_format % int(value)
    176 
    177 
    178 class _Enumeration(_Type):
    179   """Type of settings that is an enumeration.
    180 
    181   In MSVS, the values are indexes like '0', '1', and '2'.
    182   MSBuild uses text labels that are more representative, like 'Win32'.
    183 
    184   Constructor args:
    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.
    189   """
    190 
    191   def __init__(self, label_list, new=None):
    192     _Type.__init__(self)
    193     self._label_list = label_list
    194     self._msbuild_values = set(value for value in label_list
    195                                if value is not None)
    196     if new is not None:
    197       self._msbuild_values.update(new)
    198 
    199   def ValidateMSVS(self, value):
    200     # Try to convert.  It will raise an exception if not valid.
    201     self.ConvertToMSBuild(value)
    202 
    203   def ValidateMSBuild(self, value):
    204     if value not in self._msbuild_values:
    205       raise ValueError('unrecognized enumerated value %s' % value)
    206 
    207   def ConvertToMSBuild(self, value):
    208     index = int(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]
    213     if label is None:
    214       raise ValueError('converted value for %s not specified.' % value)
    215     return label
    216 
    217 
    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:
    222 _string = _String()
    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'])
    231 
    232 
    233 def _Same(tool, name, setting_type):
    234   """Defines a setting that has the same name in MSVS and MSBuild.
    235 
    236   Args:
    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.
    240   """
    241   _Renamed(tool, name, name, setting_type)
    242 
    243 
    244 def _Renamed(tool, msvs_name, msbuild_name, setting_type):
    245   """Defines a setting for which the name has changed.
    246 
    247   Args:
    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.
    252   """
    253 
    254   def _Translate(value, msbuild_settings):
    255     msbuild_tool_settings = _GetMSBuildToolSettings(msbuild_settings, tool)
    256     msbuild_tool_settings[msbuild_name] = setting_type.ConvertToMSBuild(value)
    257 
    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
    262 
    263 
    264 def _Moved(tool, settings_name, msbuild_tool_name, setting_type):
    265   _MovedAndRenamed(tool, settings_name, msbuild_tool_name, settings_name,
    266                    setting_type)
    267 
    268 
    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.
    272 
    273   Args:
    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.
    279   """
    280 
    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)
    284 
    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
    290 
    291 
    292 def _MSVSOnly(tool, name, setting_type):
    293   """Defines a setting that is only found in MSVS.
    294 
    295   Args:
    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.
    299   """
    300 
    301   def _Translate(unused_value, unused_msbuild_settings):
    302     # Since this is for MSVS only settings, no translation will happen.
    303     pass
    304 
    305   _msvs_validators[tool.msvs_name][name] = setting_type.ValidateMSVS
    306   _msvs_to_msbuild_converters[tool.msvs_name][name] = _Translate
    307 
    308 
    309 def _MSBuildOnly(tool, name, setting_type):
    310   """Defines a setting that is only found in MSBuild.
    311 
    312   Args:
    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.
    316   """
    317 
    318   def _Translate(value, msbuild_settings):
    319     # Let msbuild-only properties get translated as-is from msvs_settings.
    320     tool_settings = msbuild_settings.setdefault(tool.msbuild_name, {})
    321     tool_settings[name] = value
    322 
    323   _msbuild_validators[tool.msbuild_name][name] = setting_type.ValidateMSBuild
    324   _msvs_to_msbuild_converters[tool.msvs_name][name] = _Translate
    325 
    326 
    327 def _ConvertedToAdditionalOption(tool, msvs_name, flag):
    328   """Defines a setting that's handled via a command line option in MSBuild.
    329 
    330   Args:
    331     tool: a dictionary that gives the names of the tool for MSVS and MSBuild.
    332     msvs_name: the name of the MSVS setting that if 'true' becomes a flag
    333     flag: the flag to insert at the end of the AdditionalOptions
    334   """
    335 
    336   def _Translate(value, msbuild_settings):
    337     if value == 'true':
    338       tool_settings = _GetMSBuildToolSettings(msbuild_settings, tool)
    339       if 'AdditionalOptions' in tool_settings:
    340         new_flags = '%s %s' % (tool_settings['AdditionalOptions'], flag)
    341       else:
    342         new_flags = flag
    343       tool_settings['AdditionalOptions'] = new_flags
    344   _msvs_validators[tool.msvs_name][msvs_name] = _boolean.ValidateMSVS
    345   _msvs_to_msbuild_converters[tool.msvs_name][msvs_name] = _Translate
    346 
    347 
    348 def _CustomGeneratePreprocessedFile(tool, msvs_name):
    349   def _Translate(value, msbuild_settings):
    350     tool_settings = _GetMSBuildToolSettings(msbuild_settings, tool)
    351     if value == '0':
    352       tool_settings['PreprocessToFile'] = 'false'
    353       tool_settings['PreprocessSuppressLineNumbers'] = 'false'
    354     elif value == '1':  # /P
    355       tool_settings['PreprocessToFile'] = 'true'
    356       tool_settings['PreprocessSuppressLineNumbers'] = 'false'
    357     elif value == '2':  # /EP /P
    358       tool_settings['PreprocessToFile'] = 'true'
    359       tool_settings['PreprocessSuppressLineNumbers'] = 'true'
    360     else:
    361       raise ValueError('value must be one of [0, 1, 2]; got %s' % value)
    362   # Create a bogus validator that looks for '0', '1', or '2'
    363   msvs_validator = _Enumeration(['a', 'b', 'c']).ValidateMSVS
    364   _msvs_validators[tool.msvs_name][msvs_name] = msvs_validator
    365   msbuild_validator = _boolean.ValidateMSBuild
    366   msbuild_tool_validators = _msbuild_validators[tool.msbuild_name]
    367   msbuild_tool_validators['PreprocessToFile'] = msbuild_validator
    368   msbuild_tool_validators['PreprocessSuppressLineNumbers'] = msbuild_validator
    369   _msvs_to_msbuild_converters[tool.msvs_name][msvs_name] = _Translate
    370 
    371 
    372 fix_vc_macro_slashes_regex_list = ('IntDir', 'OutDir')
    373 fix_vc_macro_slashes_regex = re.compile(
    374   r'(\$\((?:%s)\))(?:[\\/]+)' % "|".join(fix_vc_macro_slashes_regex_list)
    375 )
    376 
    377 # Regular expression to detect keys that were generated by exclusion lists
    378 _EXCLUDED_SUFFIX_RE = re.compile('^(.*)_excluded$')
    379 
    380 
    381 def _ValidateExclusionSetting(setting, settings, error_msg, stderr=sys.stderr):
    382   """Verify that 'setting' is valid if it is generated from an exclusion list.
    383 
    384   If the setting appears to be generated from an exclusion list, the root name
    385   is checked.
    386 
    387   Args:
    388       setting:   A string that is the setting name to validate
    389       settings:  A dictionary where the keys are valid settings
    390       error_msg: The message to emit in the event of error
    391       stderr:    The stream receiving the error messages.
    392   """
    393   # This may be unrecognized because it's an exclusion list. If the
    394   # setting name has the _excluded suffix, then check the root name.
    395   unrecognized = True
    396   m = re.match(_EXCLUDED_SUFFIX_RE, setting)
    397   if m:
    398     root_setting = m.group(1)
    399     unrecognized = root_setting not in settings
    400 
    401   if unrecognized:
    402     # We don't know this setting. Give a warning.
    403     print >> stderr, error_msg
    404 
    405 
    406 def FixVCMacroSlashes(s):
    407   """Replace macros which have excessive following slashes.
    408 
    409   These macros are known to have a built-in trailing slash. Furthermore, many
    410   scripts hiccup on processing paths with extra slashes in the middle.
    411 
    412   This list is probably not exhaustive.  Add as needed.
    413   """
    414   if '$' in s:
    415     s = fix_vc_macro_slashes_regex.sub(r'\1', s)
    416   return s
    417 
    418 
    419 def ConvertVCMacrosToMSBuild(s):
    420   """Convert the the MSVS macros found in the string to the MSBuild equivalent.
    421 
    422   This list is probably not exhaustive.  Add as needed.
    423   """
    424   if '$' in s:
    425     replace_map = {
    426         '$(ConfigurationName)': '$(Configuration)',
    427         '$(InputDir)': '%(RelativeDir)',
    428         '$(InputExt)': '%(Extension)',
    429         '$(InputFileName)': '%(Filename)%(Extension)',
    430         '$(InputName)': '%(Filename)',
    431         '$(InputPath)': '%(Identity)',
    432         '$(ParentName)': '$(ProjectFileName)',
    433         '$(PlatformName)': '$(Platform)',
    434         '$(SafeInputName)': '%(Filename)',
    435     }
    436     for old, new in replace_map.iteritems():
    437       s = s.replace(old, new)
    438     s = FixVCMacroSlashes(s)
    439   return s
    440 
    441 
    442 def ConvertToMSBuildSettings(msvs_settings, stderr=sys.stderr):
    443   """Converts MSVS settings (VS2008 and earlier) to MSBuild settings (VS2010+).
    444 
    445   Args:
    446       msvs_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.
    449 
    450   Returns:
    451       A dictionary of MSBuild settings.  The key is either the MSBuild tool name
    452       or the empty string (for the global settings).  The values are themselves
    453       dictionaries of settings and their values.
    454   """
    455   msbuild_settings = {}
    456   for msvs_tool_name, msvs_tool_settings in msvs_settings.iteritems():
    457     if msvs_tool_name in _msvs_to_msbuild_converters:
    458       msvs_tool = _msvs_to_msbuild_converters[msvs_tool_name]
    459       for msvs_setting, msvs_value in msvs_tool_settings.iteritems():
    460         if msvs_setting in msvs_tool:
    461           # Invoke the translation function.
    462           try:
    463             msvs_tool[msvs_setting](msvs_value, msbuild_settings)
    464           except ValueError, e:
    465             print >> stderr, ('Warning: while converting %s/%s to MSBuild, '
    466                               '%s' % (msvs_tool_name, msvs_setting, e))
    467         else:
    468           _ValidateExclusionSetting(msvs_setting,
    469                                     msvs_tool,
    470                                     ('Warning: unrecognized setting %s/%s '
    471                                      'while converting to MSBuild.' %
    472                                      (msvs_tool_name, msvs_setting)),
    473                                     stderr)
    474     else:
    475       print >> stderr, ('Warning: unrecognized tool %s while converting to '
    476                         'MSBuild.' % msvs_tool_name)
    477   return msbuild_settings
    478 
    479 
    480 def ValidateMSVSSettings(settings, stderr=sys.stderr):
    481   """Validates that the names of the settings are valid for MSVS.
    482 
    483   Args:
    484       settings: A dictionary.  The key is the tool name.  The values are
    485           themselves dictionaries of settings and their values.
    486       stderr: The stream receiving the error messages.
    487   """
    488   _ValidateSettings(_msvs_validators, settings, stderr)
    489 
    490 
    491 def ValidateMSBuildSettings(settings, stderr=sys.stderr):
    492   """Validates that the names of the settings are valid for MSBuild.
    493 
    494   Args:
    495       settings: A dictionary.  The key is the tool name.  The values are
    496           themselves dictionaries of settings and their values.
    497       stderr: The stream receiving the error messages.
    498   """
    499   _ValidateSettings(_msbuild_validators, settings, stderr)
    500 
    501 
    502 def _ValidateSettings(validators, settings, stderr):
    503   """Validates that the settings are valid for MSBuild or MSVS.
    504 
    505   We currently only validate the names of the settings, not their values.
    506 
    507   Args:
    508       validators: A dictionary of tools and their validators.
    509       settings: A dictionary.  The key is the tool name.  The values are
    510           themselves dictionaries of settings and their values.
    511       stderr: The stream receiving the error messages.
    512   """
    513   for tool_name in settings:
    514     if tool_name in validators:
    515       tool_validators = validators[tool_name]
    516       for setting, value in settings[tool_name].iteritems():
    517         if setting in tool_validators:
    518           try:
    519             tool_validators[setting](value)
    520           except ValueError, e:
    521             print >> stderr, ('Warning: for %s/%s, %s' %
    522                               (tool_name, setting, e))
    523         else:
    524           _ValidateExclusionSetting(setting,
    525                                     tool_validators,
    526                                     ('Warning: unrecognized setting %s/%s' %
    527                                      (tool_name, setting)),
    528                                     stderr)
    529 
    530     else:
    531       print >> stderr, ('Warning: unrecognized tool %s' % tool_name)
    532 
    533 
    534 # MSVS and MBuild names of the tools.
    535 _compile = _Tool('VCCLCompilerTool', 'ClCompile')
    536 _link = _Tool('VCLinkerTool', 'Link')
    537 _midl = _Tool('VCMIDLTool', 'Midl')
    538 _rc = _Tool('VCResourceCompilerTool', 'ResourceCompile')
    539 _lib = _Tool('VCLibrarianTool', 'Lib')
    540 _manifest = _Tool('VCManifestTool', 'Manifest')
    541 _masm = _Tool('MASM', 'MASM')
    542 
    543 
    544 _AddTool(_compile)
    545 _AddTool(_link)
    546 _AddTool(_midl)
    547 _AddTool(_rc)
    548 _AddTool(_lib)
    549 _AddTool(_manifest)
    550 _AddTool(_masm)
    551 # Add sections only found in the MSBuild settings.
    552 _msbuild_validators[''] = {}
    553 _msbuild_validators['ProjectReference'] = {}
    554 _msbuild_validators['ManifestResourceCompile'] = {}
    555 
    556 # Descriptions of the compiler options, i.e. VCCLCompilerTool in MSVS and
    557 # ClCompile in MSBuild.
    558 # See "c:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\1033\cl.xml" for
    559 # the schema of the MSBuild ClCompile settings.
    560 
    561 # Options that have the same name in MSVS and MSBuild
    562 _Same(_compile, 'AdditionalIncludeDirectories', _folder_list)  # /I
    563 _Same(_compile, 'AdditionalOptions', _string_list)
    564 _Same(_compile, 'AdditionalUsingDirectories', _folder_list)  # /AI
    565 _Same(_compile, 'AssemblerListingLocation', _file_name)  # /Fa
    566 _Same(_compile, 'BrowseInformationFile', _file_name)
    567 _Same(_compile, 'BufferSecurityCheck', _boolean)  # /GS
    568 _Same(_compile, 'DisableLanguageExtensions', _boolean)  # /Za
    569 _Same(_compile, 'DisableSpecificWarnings', _string_list)  # /wd
    570 _Same(_compile, 'EnableFiberSafeOptimizations', _boolean)  # /GT
    571 _Same(_compile, 'EnablePREfast', _boolean)  # /analyze Visible='false'
    572 _Same(_compile, 'ExpandAttributedSource', _boolean)  # /Fx
    573 _Same(_compile, 'FloatingPointExceptions', _boolean)  # /fp:except
    574 _Same(_compile, 'ForceConformanceInForLoopScope', _boolean)  # /Zc:forScope
    575 _Same(_compile, 'ForcedIncludeFiles', _file_list)  # /FI
    576 _Same(_compile, 'ForcedUsingFiles', _file_list)  # /FU
    577 _Same(_compile, 'GenerateXMLDocumentationFiles', _boolean)  # /doc
    578 _Same(_compile, 'IgnoreStandardIncludePath', _boolean)  # /X
    579 _Same(_compile, 'MinimalRebuild', _boolean)  # /Gm
    580 _Same(_compile, 'OmitDefaultLibName', _boolean)  # /Zl
    581 _Same(_compile, 'OmitFramePointers', _boolean)  # /Oy
    582 _Same(_compile, 'PreprocessorDefinitions', _string_list)  # /D
    583 _Same(_compile, 'ProgramDataBaseFileName', _file_name)  # /Fd
    584 _Same(_compile, 'RuntimeTypeInfo', _boolean)  # /GR
    585 _Same(_compile, 'ShowIncludes', _boolean)  # /showIncludes
    586 _Same(_compile, 'SmallerTypeCheck', _boolean)  # /RTCc
    587 _Same(_compile, 'StringPooling', _boolean)  # /GF
    588 _Same(_compile, 'SuppressStartupBanner', _boolean)  # /nologo
    589 _Same(_compile, 'TreatWChar_tAsBuiltInType', _boolean)  # /Zc:wchar_t
    590 _Same(_compile, 'UndefineAllPreprocessorDefinitions', _boolean)  # /u
    591 _Same(_compile, 'UndefinePreprocessorDefinitions', _string_list)  # /U
    592 _Same(_compile, 'UseFullPaths', _boolean)  # /FC
    593 _Same(_compile, 'WholeProgramOptimization', _boolean)  # /GL
    594 _Same(_compile, 'XMLDocumentationFileName', _file_name)
    595 _Same(_compile, 'CompileAsWinRT', _boolean)  # /ZW
    596 
    597 _Same(_compile, 'AssemblerOutput',
    598       _Enumeration(['NoListing',
    599                     'AssemblyCode',  # /FA
    600                     'All',  # /FAcs
    601                     'AssemblyAndMachineCode',  # /FAc
    602                     'AssemblyAndSourceCode']))  # /FAs
    603 _Same(_compile, 'BasicRuntimeChecks',
    604       _Enumeration(['Default',
    605                     'StackFrameRuntimeCheck',  # /RTCs
    606                     'UninitializedLocalUsageCheck',  # /RTCu
    607                     'EnableFastChecks']))  # /RTC1
    608 _Same(_compile, 'BrowseInformation',
    609       _Enumeration(['false',
    610                     'true',  # /FR
    611                     'true']))  # /Fr
    612 _Same(_compile, 'CallingConvention',
    613       _Enumeration(['Cdecl',  # /Gd
    614                     'FastCall',  # /Gr
    615                     'StdCall',  # /Gz
    616                     'VectorCall']))  # /Gv
    617 _Same(_compile, 'CompileAs',
    618       _Enumeration(['Default',
    619                     'CompileAsC',  # /TC
    620                     'CompileAsCpp']))  # /TP
    621 _Same(_compile, 'DebugInformationFormat',
    622       _Enumeration(['',  # Disabled
    623                     'OldStyle',  # /Z7
    624                     None,
    625                     'ProgramDatabase',  # /Zi
    626                     'EditAndContinue']))  # /ZI
    627 _Same(_compile, 'EnableEnhancedInstructionSet',
    628       _Enumeration(['NotSet',
    629                     'StreamingSIMDExtensions',  # /arch:SSE
    630                     'StreamingSIMDExtensions2',  # /arch:SSE2
    631                     'AdvancedVectorExtensions',  # /arch:AVX (vs2012+)
    632                     'NoExtensions',  # /arch:IA32 (vs2012+)
    633                     # This one only exists in the new msbuild format.
    634                     'AdvancedVectorExtensions2',  # /arch:AVX2 (vs2013r2+)
    635                     ]))
    636 _Same(_compile, 'ErrorReporting',
    637       _Enumeration(['None',  # /errorReport:none
    638                     'Prompt',  # /errorReport:prompt
    639                     'Queue'],  # /errorReport:queue
    640                    new=['Send']))  # /errorReport:send"
    641 _Same(_compile, 'ExceptionHandling',
    642       _Enumeration(['false',
    643                     'Sync',  # /EHsc
    644                     'Async'],  # /EHa
    645                    new=['SyncCThrow']))  # /EHs
    646 _Same(_compile, 'FavorSizeOrSpeed',
    647       _Enumeration(['Neither',
    648                     'Speed',  # /Ot
    649                     'Size']))  # /Os
    650 _Same(_compile, 'FloatingPointModel',
    651       _Enumeration(['Precise',  # /fp:precise
    652                     'Strict',  # /fp:strict
    653                     'Fast']))  # /fp:fast
    654 _Same(_compile, 'InlineFunctionExpansion',
    655       _Enumeration(['Default',
    656                     'OnlyExplicitInline',  # /Ob1
    657                     'AnySuitable'],  # /Ob2
    658                    new=['Disabled']))  # /Ob0
    659 _Same(_compile, 'Optimization',
    660       _Enumeration(['Disabled',  # /Od
    661                     'MinSpace',  # /O1
    662                     'MaxSpeed',  # /O2
    663                     'Full']))  # /Ox
    664 _Same(_compile, 'RuntimeLibrary',
    665       _Enumeration(['MultiThreaded',  # /MT
    666                     'MultiThreadedDebug',  # /MTd
    667                     'MultiThreadedDLL',  # /MD
    668                     'MultiThreadedDebugDLL']))  # /MDd
    669 _Same(_compile, 'StructMemberAlignment',
    670       _Enumeration(['Default',
    671                     '1Byte',  # /Zp1
    672                     '2Bytes',  # /Zp2
    673                     '4Bytes',  # /Zp4
    674                     '8Bytes',  # /Zp8
    675                     '16Bytes']))  # /Zp16
    676 _Same(_compile, 'WarningLevel',
    677       _Enumeration(['TurnOffAllWarnings',  # /W0
    678                     'Level1',  # /W1
    679                     'Level2',  # /W2
    680                     'Level3',  # /W3
    681                     'Level4'],  # /W4
    682                    new=['EnableAllWarnings']))  # /Wall
    683 
    684 # Options found in MSVS that have been renamed in MSBuild.
    685 _Renamed(_compile, 'EnableFunctionLevelLinking', 'FunctionLevelLinking',
    686          _boolean)  # /Gy
    687 _Renamed(_compile, 'EnableIntrinsicFunctions', 'IntrinsicFunctions',
    688          _boolean)  # /Oi
    689 _Renamed(_compile, 'KeepComments', 'PreprocessKeepComments', _boolean)  # /C
    690 _Renamed(_compile, 'ObjectFile', 'ObjectFileName', _file_name)  # /Fo
    691 _Renamed(_compile, 'OpenMP', 'OpenMPSupport', _boolean)  # /openmp
    692 _Renamed(_compile, 'PrecompiledHeaderThrough', 'PrecompiledHeaderFile',
    693          _file_name)  # Used with /Yc and /Yu
    694 _Renamed(_compile, 'PrecompiledHeaderFile', 'PrecompiledHeaderOutputFile',
    695          _file_name)  # /Fp
    696 _Renamed(_compile, 'UsePrecompiledHeader', 'PrecompiledHeader',
    697          _Enumeration(['NotUsing',  # VS recognized '' for this value too.
    698                        'Create',   # /Yc
    699                        'Use']))  # /Yu
    700 _Renamed(_compile, 'WarnAsError', 'TreatWarningAsError', _boolean)  # /WX
    701 
    702 _ConvertedToAdditionalOption(_compile, 'DefaultCharIsUnsigned', '/J')
    703 
    704 # MSVS options not found in MSBuild.
    705 _MSVSOnly(_compile, 'Detect64BitPortabilityProblems', _boolean)
    706 _MSVSOnly(_compile, 'UseUnicodeResponseFiles', _boolean)
    707 
    708 # MSBuild options not found in MSVS.
    709 _MSBuildOnly(_compile, 'BuildingInIDE', _boolean)
    710 _MSBuildOnly(_compile, 'CompileAsManaged',
    711              _Enumeration([], new=['false',
    712                                    'true']))  # /clr
    713 _MSBuildOnly(_compile, 'CreateHotpatchableImage', _boolean)  # /hotpatch
    714 _MSBuildOnly(_compile, 'MultiProcessorCompilation', _boolean)  # /MP
    715 _MSBuildOnly(_compile, 'PreprocessOutputPath', _string)  # /Fi
    716 _MSBuildOnly(_compile, 'ProcessorNumber', _integer)  # the number of processors
    717 _MSBuildOnly(_compile, 'TrackerLogDirectory', _folder_name)
    718 _MSBuildOnly(_compile, 'TreatSpecificWarningsAsErrors', _string_list)  # /we
    719 _MSBuildOnly(_compile, 'UseUnicodeForAssemblerListing', _boolean)  # /FAu
    720 
    721 # Defines a setting that needs very customized processing
    722 _CustomGeneratePreprocessedFile(_compile, 'GeneratePreprocessedFile')
    723 
    724 
    725 # Directives for converting MSVS VCLinkerTool to MSBuild Link.
    726 # See "c:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\1033\link.xml" for
    727 # the schema of the MSBuild Link settings.
    728 
    729 # Options that have the same name in MSVS and MSBuild
    730 _Same(_link, 'AdditionalDependencies', _file_list)
    731 _Same(_link, 'AdditionalLibraryDirectories', _folder_list)  # /LIBPATH
    732 #  /MANIFESTDEPENDENCY:
    733 _Same(_link, 'AdditionalManifestDependencies', _file_list)
    734 _Same(_link, 'AdditionalOptions', _string_list)
    735 _Same(_link, 'AddModuleNamesToAssembly', _file_list)  # /ASSEMBLYMODULE
    736 _Same(_link, 'AllowIsolation', _boolean)  # /ALLOWISOLATION
    737 _Same(_link, 'AssemblyLinkResource', _file_list)  # /ASSEMBLYLINKRESOURCE
    738 _Same(_link, 'BaseAddress', _string)  # /BASE
    739 _Same(_link, 'CLRUnmanagedCodeCheck', _boolean)  # /CLRUNMANAGEDCODECHECK
    740 _Same(_link, 'DelayLoadDLLs', _file_list)  # /DELAYLOAD
    741 _Same(_link, 'DelaySign', _boolean)  # /DELAYSIGN
    742 _Same(_link, 'EmbedManagedResourceFile', _file_list)  # /ASSEMBLYRESOURCE
    743 _Same(_link, 'EnableUAC', _boolean)  # /MANIFESTUAC
    744 _Same(_link, 'EntryPointSymbol', _string)  # /ENTRY
    745 _Same(_link, 'ForceSymbolReferences', _file_list)  # /INCLUDE
    746 _Same(_link, 'FunctionOrder', _file_name)  # /ORDER
    747 _Same(_link, 'GenerateDebugInformation', _boolean)  # /DEBUG
    748 _Same(_link, 'GenerateMapFile', _boolean)  # /MAP
    749 _Same(_link, 'HeapCommitSize', _string)
    750 _Same(_link, 'HeapReserveSize', _string)  # /HEAP
    751 _Same(_link, 'IgnoreAllDefaultLibraries', _boolean)  # /NODEFAULTLIB
    752 _Same(_link, 'IgnoreEmbeddedIDL', _boolean)  # /IGNOREIDL
    753 _Same(_link, 'ImportLibrary', _file_name)  # /IMPLIB
    754 _Same(_link, 'KeyContainer', _file_name)  # /KEYCONTAINER
    755 _Same(_link, 'KeyFile', _file_name)  # /KEYFILE
    756 _Same(_link, 'ManifestFile', _file_name)  # /ManifestFile
    757 _Same(_link, 'MapExports', _boolean)  # /MAPINFO:EXPORTS
    758 _Same(_link, 'MapFileName', _file_name)
    759 _Same(_link, 'MergedIDLBaseFileName', _file_name)  # /IDLOUT
    760 _Same(_link, 'MergeSections', _string)  # /MERGE
    761 _Same(_link, 'MidlCommandFile', _file_name)  # /MIDL
    762 _Same(_link, 'ModuleDefinitionFile', _file_name)  # /DEF
    763 _Same(_link, 'OutputFile', _file_name)  # /OUT
    764 _Same(_link, 'PerUserRedirection', _boolean)
    765 _Same(_link, 'Profile', _boolean)  # /PROFILE
    766 _Same(_link, 'ProfileGuidedDatabase', _file_name)  # /PGD
    767 _Same(_link, 'ProgramDatabaseFile', _file_name)  # /PDB
    768 _Same(_link, 'RegisterOutput', _boolean)
    769 _Same(_link, 'SetChecksum', _boolean)  # /RELEASE
    770 _Same(_link, 'StackCommitSize', _string)
    771 _Same(_link, 'StackReserveSize', _string)  # /STACK
    772 _Same(_link, 'StripPrivateSymbols', _file_name)  # /PDBSTRIPPED
    773 _Same(_link, 'SupportUnloadOfDelayLoadedDLL', _boolean)  # /DELAY:UNLOAD
    774 _Same(_link, 'SuppressStartupBanner', _boolean)  # /NOLOGO
    775 _Same(_link, 'SwapRunFromCD', _boolean)  # /SWAPRUN:CD
    776 _Same(_link, 'TurnOffAssemblyGeneration', _boolean)  # /NOASSEMBLY
    777 _Same(_link, 'TypeLibraryFile', _file_name)  # /TLBOUT
    778 _Same(_link, 'TypeLibraryResourceID', _integer)  # /TLBID
    779 _Same(_link, 'UACUIAccess', _boolean)  # /uiAccess='true'
    780 _Same(_link, 'Version', _string)  # /VERSION
    781 
    782 _Same(_link, 'EnableCOMDATFolding', _newly_boolean)  # /OPT:ICF
    783 _Same(_link, 'FixedBaseAddress', _newly_boolean)  # /FIXED
    784 _Same(_link, 'LargeAddressAware', _newly_boolean)  # /LARGEADDRESSAWARE
    785 _Same(_link, 'OptimizeReferences', _newly_boolean)  # /OPT:REF
    786 _Same(_link, 'RandomizedBaseAddress', _newly_boolean)  # /DYNAMICBASE
    787 _Same(_link, 'TerminalServerAware', _newly_boolean)  # /TSAWARE
    788 
    789 _subsystem_enumeration = _Enumeration(
    790     ['NotSet',
    791      'Console',  # /SUBSYSTEM:CONSOLE
    792      'Windows',  # /SUBSYSTEM:WINDOWS
    793      'Native',  # /SUBSYSTEM:NATIVE
    794      'EFI Application',  # /SUBSYSTEM:EFI_APPLICATION
    795      'EFI Boot Service Driver',  # /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER
    796      'EFI ROM',  # /SUBSYSTEM:EFI_ROM
    797      'EFI Runtime',  # /SUBSYSTEM:EFI_RUNTIME_DRIVER
    798      'WindowsCE'],  # /SUBSYSTEM:WINDOWSCE
    799     new=['POSIX'])  # /SUBSYSTEM:POSIX
    800 
    801 _target_machine_enumeration = _Enumeration(
    802     ['NotSet',
    803      'MachineX86',  # /MACHINE:X86
    804      None,
    805      'MachineARM',  # /MACHINE:ARM
    806      'MachineEBC',  # /MACHINE:EBC
    807      'MachineIA64',  # /MACHINE:IA64
    808      None,
    809      'MachineMIPS',  # /MACHINE:MIPS
    810      'MachineMIPS16',  # /MACHINE:MIPS16
    811      'MachineMIPSFPU',  # /MACHINE:MIPSFPU
    812      'MachineMIPSFPU16',  # /MACHINE:MIPSFPU16
    813      None,
    814      None,
    815      None,
    816      'MachineSH4',  # /MACHINE:SH4
    817      None,
    818      'MachineTHUMB',  # /MACHINE:THUMB
    819      'MachineX64'])  # /MACHINE:X64
    820 
    821 _Same(_link, 'AssemblyDebug',
    822       _Enumeration(['',
    823                     'true',  # /ASSEMBLYDEBUG
    824                     'false']))  # /ASSEMBLYDEBUG:DISABLE
    825 _Same(_link, 'CLRImageType',
    826       _Enumeration(['Default',
    827                     'ForceIJWImage',  # /CLRIMAGETYPE:IJW
    828                     'ForcePureILImage',  # /Switch="CLRIMAGETYPE:PURE
    829                     'ForceSafeILImage']))  # /Switch="CLRIMAGETYPE:SAFE
    830 _Same(_link, 'CLRThreadAttribute',
    831       _Enumeration(['DefaultThreadingAttribute',  # /CLRTHREADATTRIBUTE:NONE
    832                     'MTAThreadingAttribute',  # /CLRTHREADATTRIBUTE:MTA
    833                     'STAThreadingAttribute']))  # /CLRTHREADATTRIBUTE:STA
    834 _Same(_link, 'DataExecutionPrevention',
    835       _Enumeration(['',
    836                     'false',  # /NXCOMPAT:NO
    837                     'true']))  # /NXCOMPAT
    838 _Same(_link, 'Driver',
    839       _Enumeration(['NotSet',
    840                     'Driver',  # /Driver
    841                     'UpOnly',  # /DRIVER:UPONLY
    842                     'WDM']))  # /DRIVER:WDM
    843 _Same(_link, 'LinkTimeCodeGeneration',
    844       _Enumeration(['Default',
    845                     'UseLinkTimeCodeGeneration',  # /LTCG
    846                     'PGInstrument',  # /LTCG:PGInstrument
    847                     'PGOptimization',  # /LTCG:PGOptimize
    848                     'PGUpdate']))  # /LTCG:PGUpdate
    849 _Same(_link, 'ShowProgress',
    850       _Enumeration(['NotSet',
    851                     'LinkVerbose',  # /VERBOSE
    852                     'LinkVerboseLib'],  # /VERBOSE:Lib
    853                    new=['LinkVerboseICF',  # /VERBOSE:ICF
    854                         'LinkVerboseREF',  # /VERBOSE:REF
    855                         'LinkVerboseSAFESEH',  # /VERBOSE:SAFESEH
    856                         'LinkVerboseCLR']))  # /VERBOSE:CLR
    857 _Same(_link, 'SubSystem', _subsystem_enumeration)
    858 _Same(_link, 'TargetMachine', _target_machine_enumeration)
    859 _Same(_link, 'UACExecutionLevel',
    860       _Enumeration(['AsInvoker',  # /level='asInvoker'
    861                     'HighestAvailable',  # /level='highestAvailable'
    862                     'RequireAdministrator']))  # /level='requireAdministrator'
    863 _Same(_link, 'MinimumRequiredVersion', _string)
    864 _Same(_link, 'TreatLinkerWarningAsErrors', _boolean)  # /WX
    865 
    866 
    867 # Options found in MSVS that have been renamed in MSBuild.
    868 _Renamed(_link, 'ErrorReporting', 'LinkErrorReporting',
    869          _Enumeration(['NoErrorReport',  # /ERRORREPORT:NONE
    870                        'PromptImmediately',  # /ERRORREPORT:PROMPT
    871                        'QueueForNextLogin'],  # /ERRORREPORT:QUEUE
    872                       new=['SendErrorReport']))  # /ERRORREPORT:SEND
    873 _Renamed(_link, 'IgnoreDefaultLibraryNames', 'IgnoreSpecificDefaultLibraries',
    874          _file_list)  # /NODEFAULTLIB
    875 _Renamed(_link, 'ResourceOnlyDLL', 'NoEntryPoint', _boolean)  # /NOENTRY
    876 _Renamed(_link, 'SwapRunFromNet', 'SwapRunFromNET', _boolean)  # /SWAPRUN:NET
    877 
    878 _Moved(_link, 'GenerateManifest', '', _boolean)
    879 _Moved(_link, 'IgnoreImportLibrary', '', _boolean)
    880 _Moved(_link, 'LinkIncremental', '', _newly_boolean)
    881 _Moved(_link, 'LinkLibraryDependencies', 'ProjectReference', _boolean)
    882 _Moved(_link, 'UseLibraryDependencyInputs', 'ProjectReference', _boolean)
    883 
    884 # MSVS options not found in MSBuild.
    885 _MSVSOnly(_link, 'OptimizeForWindows98', _newly_boolean)
    886 _MSVSOnly(_link, 'UseUnicodeResponseFiles', _boolean)
    887 
    888 # MSBuild options not found in MSVS.
    889 _MSBuildOnly(_link, 'BuildingInIDE', _boolean)
    890 _MSBuildOnly(_link, 'ImageHasSafeExceptionHandlers', _boolean)  # /SAFESEH
    891 _MSBuildOnly(_link, 'LinkDLL', _boolean)  # /DLL Visible='false'
    892 _MSBuildOnly(_link, 'LinkStatus', _boolean)  # /LTCG:STATUS
    893 _MSBuildOnly(_link, 'PreventDllBinding', _boolean)  # /ALLOWBIND
    894 _MSBuildOnly(_link, 'SupportNobindOfDelayLoadedDLL', _boolean)  # /DELAY:NOBIND
    895 _MSBuildOnly(_link, 'TrackerLogDirectory', _folder_name)
    896 _MSBuildOnly(_link, 'MSDOSStubFileName', _file_name)  # /STUB Visible='false'
    897 _MSBuildOnly(_link, 'SectionAlignment', _integer)  # /ALIGN
    898 _MSBuildOnly(_link, 'SpecifySectionAttributes', _string)  # /SECTION
    899 _MSBuildOnly(_link, 'ForceFileOutput',
    900              _Enumeration([], new=['Enabled',  # /FORCE
    901                                    # /FORCE:MULTIPLE
    902                                    'MultiplyDefinedSymbolOnly',
    903                                    'UndefinedSymbolOnly']))  # /FORCE:UNRESOLVED
    904 _MSBuildOnly(_link, 'CreateHotPatchableImage',
    905              _Enumeration([], new=['Enabled',  # /FUNCTIONPADMIN
    906                                    'X86Image',  # /FUNCTIONPADMIN:5
    907                                    'X64Image',  # /FUNCTIONPADMIN:6
    908                                    'ItaniumImage']))  # /FUNCTIONPADMIN:16
    909 _MSBuildOnly(_link, 'CLRSupportLastError',
    910              _Enumeration([], new=['Enabled',  # /CLRSupportLastError
    911                                    'Disabled',  # /CLRSupportLastError:NO
    912                                    # /CLRSupportLastError:SYSTEMDLL
    913                                    'SystemDlls']))
    914 
    915 
    916 # Directives for converting VCResourceCompilerTool to ResourceCompile.
    917 # See "c:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\1033\rc.xml" for
    918 # the schema of the MSBuild ResourceCompile settings.
    919 
    920 _Same(_rc, 'AdditionalOptions', _string_list)
    921 _Same(_rc, 'AdditionalIncludeDirectories', _folder_list)  # /I
    922 _Same(_rc, 'Culture', _Integer(msbuild_base=16))
    923 _Same(_rc, 'IgnoreStandardIncludePath', _boolean)  # /X
    924 _Same(_rc, 'PreprocessorDefinitions', _string_list)  # /D
    925 _Same(_rc, 'ResourceOutputFileName', _string)  # /fo
    926 _Same(_rc, 'ShowProgress', _boolean)  # /v
    927 # There is no UI in VisualStudio 2008 to set the following properties.
    928 # However they are found in CL and other tools.  Include them here for
    929 # completeness, as they are very likely to have the same usage pattern.
    930 _Same(_rc, 'SuppressStartupBanner', _boolean)  # /nologo
    931 _Same(_rc, 'UndefinePreprocessorDefinitions', _string_list)  # /u
    932 
    933 # MSBuild options not found in MSVS.
    934 _MSBuildOnly(_rc, 'NullTerminateStrings', _boolean)  # /n
    935 _MSBuildOnly(_rc, 'TrackerLogDirectory', _folder_name)
    936 
    937 
    938 # Directives for converting VCMIDLTool to Midl.
    939 # See "c:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\1033\midl.xml" for
    940 # the schema of the MSBuild Midl settings.
    941 
    942 _Same(_midl, 'AdditionalIncludeDirectories', _folder_list)  # /I
    943 _Same(_midl, 'AdditionalOptions', _string_list)
    944 _Same(_midl, 'CPreprocessOptions', _string)  # /cpp_opt
    945 _Same(_midl, 'ErrorCheckAllocations', _boolean)  # /error allocation
    946 _Same(_midl, 'ErrorCheckBounds', _boolean)  # /error bounds_check
    947 _Same(_midl, 'ErrorCheckEnumRange', _boolean)  # /error enum
    948 _Same(_midl, 'ErrorCheckRefPointers', _boolean)  # /error ref
    949 _Same(_midl, 'ErrorCheckStubData', _boolean)  # /error stub_data
    950 _Same(_midl, 'GenerateStublessProxies', _boolean)  # /Oicf
    951 _Same(_midl, 'GenerateTypeLibrary', _boolean)
    952 _Same(_midl, 'HeaderFileName', _file_name)  # /h
    953 _Same(_midl, 'IgnoreStandardIncludePath', _boolean)  # /no_def_idir
    954 _Same(_midl, 'InterfaceIdentifierFileName', _file_name)  # /iid
    955 _Same(_midl, 'MkTypLibCompatible', _boolean)  # /mktyplib203
    956 _Same(_midl, 'OutputDirectory', _string)  # /out
    957 _Same(_midl, 'PreprocessorDefinitions', _string_list)  # /D
    958 _Same(_midl, 'ProxyFileName', _file_name)  # /proxy
    959 _Same(_midl, 'RedirectOutputAndErrors', _file_name)  # /o
    960 _Same(_midl, 'SuppressStartupBanner', _boolean)  # /nologo
    961 _Same(_midl, 'TypeLibraryName', _file_name)  # /tlb
    962 _Same(_midl, 'UndefinePreprocessorDefinitions', _string_list)  # /U
    963 _Same(_midl, 'WarnAsError', _boolean)  # /WX
    964 
    965 _Same(_midl, 'DefaultCharType',
    966       _Enumeration(['Unsigned',  # /char unsigned
    967                     'Signed',  # /char signed
    968                     'Ascii']))  # /char ascii7
    969 _Same(_midl, 'TargetEnvironment',
    970       _Enumeration(['NotSet',
    971                     'Win32',  # /env win32
    972                     'Itanium',  # /env ia64
    973                     'X64']))  # /env x64
    974 _Same(_midl, 'EnableErrorChecks',
    975       _Enumeration(['EnableCustom',
    976                     'None',  # /error none
    977                     'All']))  # /error all
    978 _Same(_midl, 'StructMemberAlignment',
    979       _Enumeration(['NotSet',
    980                     '1',  # Zp1
    981                     '2',  # Zp2
    982                     '4',  # Zp4
    983                     '8']))  # Zp8
    984 _Same(_midl, 'WarningLevel',
    985       _Enumeration(['0',  # /W0
    986                     '1',  # /W1
    987                     '2',  # /W2
    988                     '3',  # /W3
    989                     '4']))  # /W4
    990 
    991 _Renamed(_midl, 'DLLDataFileName', 'DllDataFileName', _file_name)  # /dlldata
    992 _Renamed(_midl, 'ValidateParameters', 'ValidateAllParameters',
    993          _boolean)  # /robust
    994 
    995 # MSBuild options not found in MSVS.
    996 _MSBuildOnly(_midl, 'ApplicationConfigurationMode', _boolean)  # /app_config
    997 _MSBuildOnly(_midl, 'ClientStubFile', _file_name)  # /cstub
    998 _MSBuildOnly(_midl, 'GenerateClientFiles',
    999              _Enumeration([], new=['Stub',  # /client stub
   1000                                    'None']))  # /client none
   1001 _MSBuildOnly(_midl, 'GenerateServerFiles',
   1002              _Enumeration([], new=['Stub',  # /client stub
   1003                                    'None']))  # /client none
   1004 _MSBuildOnly(_midl, 'LocaleID', _integer)  # /lcid DECIMAL
   1005 _MSBuildOnly(_midl, 'ServerStubFile', _file_name)  # /sstub
   1006 _MSBuildOnly(_midl, 'SuppressCompilerWarnings', _boolean)  # /no_warn
   1007 _MSBuildOnly(_midl, 'TrackerLogDirectory', _folder_name)
   1008 _MSBuildOnly(_midl, 'TypeLibFormat',
   1009              _Enumeration([], new=['NewFormat',  # /newtlb
   1010                                    'OldFormat']))  # /oldtlb
   1011 
   1012 
   1013 # Directives for converting VCLibrarianTool to Lib.
   1014 # See "c:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\1033\lib.xml" for
   1015 # the schema of the MSBuild Lib settings.
   1016 
   1017 _Same(_lib, 'AdditionalDependencies', _file_list)
   1018 _Same(_lib, 'AdditionalLibraryDirectories', _folder_list)  # /LIBPATH
   1019 _Same(_lib, 'AdditionalOptions', _string_list)
   1020 _Same(_lib, 'ExportNamedFunctions', _string_list)  # /EXPORT
   1021 _Same(_lib, 'ForceSymbolReferences', _string)  # /INCLUDE
   1022 _Same(_lib, 'IgnoreAllDefaultLibraries', _boolean)  # /NODEFAULTLIB
   1023 _Same(_lib, 'IgnoreSpecificDefaultLibraries', _file_list)  # /NODEFAULTLIB
   1024 _Same(_lib, 'ModuleDefinitionFile', _file_name)  # /DEF
   1025 _Same(_lib, 'OutputFile', _file_name)  # /OUT
   1026 _Same(_lib, 'SuppressStartupBanner', _boolean)  # /NOLOGO
   1027 _Same(_lib, 'UseUnicodeResponseFiles', _boolean)
   1028 _Same(_lib, 'LinkTimeCodeGeneration', _boolean)  # /LTCG
   1029 _Same(_lib, 'TargetMachine', _target_machine_enumeration)
   1030 
   1031 # TODO(jeanluc) _link defines the same value that gets moved to
   1032 # ProjectReference.  We may want to validate that they are consistent.
   1033 _Moved(_lib, 'LinkLibraryDependencies', 'ProjectReference', _boolean)
   1034 
   1035 _MSBuildOnly(_lib, 'DisplayLibrary', _string)  # /LIST Visible='false'
   1036 _MSBuildOnly(_lib, 'ErrorReporting',
   1037              _Enumeration([], new=['PromptImmediately',  # /ERRORREPORT:PROMPT
   1038                                    'QueueForNextLogin',  # /ERRORREPORT:QUEUE
   1039                                    'SendErrorReport',  # /ERRORREPORT:SEND
   1040                                    'NoErrorReport']))  # /ERRORREPORT:NONE
   1041 _MSBuildOnly(_lib, 'MinimumRequiredVersion', _string)
   1042 _MSBuildOnly(_lib, 'Name', _file_name)  # /NAME
   1043 _MSBuildOnly(_lib, 'RemoveObjects', _file_list)  # /REMOVE
   1044 _MSBuildOnly(_lib, 'SubSystem', _subsystem_enumeration)
   1045 _MSBuildOnly(_lib, 'TrackerLogDirectory', _folder_name)
   1046 _MSBuildOnly(_lib, 'TreatLibWarningAsErrors', _boolean)  # /WX
   1047 _MSBuildOnly(_lib, 'Verbose', _boolean)
   1048 
   1049 
   1050 # Directives for converting VCManifestTool to Mt.
   1051 # See "c:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\1033\mt.xml" for
   1052 # the schema of the MSBuild Lib settings.
   1053 
   1054 # Options that have the same name in MSVS and MSBuild
   1055 _Same(_manifest, 'AdditionalManifestFiles', _file_list)  # /manifest
   1056 _Same(_manifest, 'AdditionalOptions', _string_list)
   1057 _Same(_manifest, 'AssemblyIdentity', _string)  # /identity:
   1058 _Same(_manifest, 'ComponentFileName', _file_name)  # /dll
   1059 _Same(_manifest, 'GenerateCatalogFiles', _boolean)  # /makecdfs
   1060 _Same(_manifest, 'InputResourceManifests', _string)  # /inputresource
   1061 _Same(_manifest, 'OutputManifestFile', _file_name)  # /out
   1062 _Same(_manifest, 'RegistrarScriptFile', _file_name)  # /rgs
   1063 _Same(_manifest, 'ReplacementsFile', _file_name)  # /replacements
   1064 _Same(_manifest, 'SuppressStartupBanner', _boolean)  # /nologo
   1065 _Same(_manifest, 'TypeLibraryFile', _file_name)  # /tlb:
   1066 _Same(_manifest, 'UpdateFileHashes', _boolean)  # /hashupdate
   1067 _Same(_manifest, 'UpdateFileHashesSearchPath', _file_name)
   1068 _Same(_manifest, 'VerboseOutput', _boolean)  # /verbose
   1069 
   1070 # Options that have moved location.
   1071 _MovedAndRenamed(_manifest, 'ManifestResourceFile',
   1072                  'ManifestResourceCompile',
   1073                  'ResourceOutputFileName',
   1074                  _file_name)
   1075 _Moved(_manifest, 'EmbedManifest', '', _boolean)
   1076 
   1077 # MSVS options not found in MSBuild.
   1078 _MSVSOnly(_manifest, 'DependencyInformationFile', _file_name)
   1079 _MSVSOnly(_manifest, 'UseFAT32Workaround', _boolean)
   1080 _MSVSOnly(_manifest, 'UseUnicodeResponseFiles', _boolean)
   1081 
   1082 # MSBuild options not found in MSVS.
   1083 _MSBuildOnly(_manifest, 'EnableDPIAwareness', _boolean)
   1084 _MSBuildOnly(_manifest, 'GenerateCategoryTags', _boolean)  # /category
   1085 _MSBuildOnly(_manifest, 'ManifestFromManagedAssembly',
   1086              _file_name)  # /managedassemblyname
   1087 _MSBuildOnly(_manifest, 'OutputResourceManifests', _string)  # /outputresource
   1088 _MSBuildOnly(_manifest, 'SuppressDependencyElement', _boolean)  # /nodependency
   1089 _MSBuildOnly(_manifest, 'TrackerLogDirectory', _folder_name)
   1090 
   1091 
   1092 # Directives for MASM.
   1093 # See "$(VCTargetsPath)\BuildCustomizations\masm.xml" for the schema of the
   1094 # MSBuild MASM settings.
   1095 
   1096 # Options that have the same name in MSVS and MSBuild.
   1097 _Same(_masm, 'UseSafeExceptionHandlers', _boolean)  # /safeseh
   1098