"Fossies" - the Fresh Open Source Software Archive

Member "Atom/resources/app/apm/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings.py" (11 Apr 2017, 45045 Bytes) of package /windows/misc/atom-windows.zip:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) Python source code syntax highlighting (style: standard) with prefixed line numbers. Alternatively you can here view or download the uninterpreted source code file.

    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 
  596 _Same(_compile, 'AssemblerOutput',
  597       _Enumeration(['NoListing',
  598                     'AssemblyCode',  # /FA
  599                     'All',  # /FAcs
  600                     'AssemblyAndMachineCode',  # /FAc
  601                     'AssemblyAndSourceCode']))  # /FAs
  602 _Same(_compile, 'BasicRuntimeChecks',
  603       _Enumeration(['Default',
  604                     'StackFrameRuntimeCheck',  # /RTCs
  605                     'UninitializedLocalUsageCheck',  # /RTCu
  606                     'EnableFastChecks']))  # /RTC1
  607 _Same(_compile, 'BrowseInformation',
  608       _Enumeration(['false',
  609                     'true',  # /FR
  610                     'true']))  # /Fr
  611 _Same(_compile, 'CallingConvention',
  612       _Enumeration(['Cdecl',  # /Gd
  613                     'FastCall',  # /Gr
  614                     'StdCall',  # /Gz
  615                     'VectorCall']))  # /Gv
  616 _Same(_compile, 'CompileAs',
  617       _Enumeration(['Default',
  618                     'CompileAsC',  # /TC
  619                     'CompileAsCpp']))  # /TP
  620 _Same(_compile, 'DebugInformationFormat',
  621       _Enumeration(['',  # Disabled
  622                     'OldStyle',  # /Z7
  623                     None,
  624                     'ProgramDatabase',  # /Zi
  625                     'EditAndContinue']))  # /ZI
  626 _Same(_compile, 'EnableEnhancedInstructionSet',
  627       _Enumeration(['NotSet',
  628                     'StreamingSIMDExtensions',  # /arch:SSE
  629                     'StreamingSIMDExtensions2',  # /arch:SSE2
  630                     'AdvancedVectorExtensions',  # /arch:AVX (vs2012+)
  631                     'NoExtensions',  # /arch:IA32 (vs2012+)
  632                     # This one only exists in the new msbuild format.
  633                     'AdvancedVectorExtensions2',  # /arch:AVX2 (vs2013r2+)
  634                     ]))
  635 _Same(_compile, 'ErrorReporting',
  636       _Enumeration(['None',  # /errorReport:none
  637                     'Prompt',  # /errorReport:prompt
  638                     'Queue'],  # /errorReport:queue
  639                    new=['Send']))  # /errorReport:send"
  640 _Same(_compile, 'ExceptionHandling',
  641       _Enumeration(['false',
  642                     'Sync',  # /EHsc
  643                     'Async'],  # /EHa
  644                    new=['SyncCThrow']))  # /EHs
  645 _Same(_compile, 'FavorSizeOrSpeed',
  646       _Enumeration(['Neither',
  647                     'Speed',  # /Ot
  648                     'Size']))  # /Os
  649 _Same(_compile, 'FloatingPointModel',
  650       _Enumeration(['Precise',  # /fp:precise
  651                     'Strict',  # /fp:strict
  652                     'Fast']))  # /fp:fast
  653 _Same(_compile, 'InlineFunctionExpansion',
  654       _Enumeration(['Default',
  655                     'OnlyExplicitInline',  # /Ob1
  656                     'AnySuitable'],  # /Ob2
  657                    new=['Disabled']))  # /Ob0
  658 _Same(_compile, 'Optimization',
  659       _Enumeration(['Disabled',  # /Od
  660                     'MinSpace',  # /O1
  661                     'MaxSpeed',  # /O2
  662                     'Full']))  # /Ox
  663 _Same(_compile, 'RuntimeLibrary',
  664       _Enumeration(['MultiThreaded',  # /MT
  665                     'MultiThreadedDebug',  # /MTd
  666                     'MultiThreadedDLL',  # /MD
  667                     'MultiThreadedDebugDLL']))  # /MDd
  668 _Same(_compile, 'StructMemberAlignment',
  669       _Enumeration(['Default',
  670                     '1Byte',  # /Zp1
  671                     '2Bytes',  # /Zp2
  672                     '4Bytes',  # /Zp4
  673                     '8Bytes',  # /Zp8
  674                     '16Bytes']))  # /Zp16
  675 _Same(_compile, 'WarningLevel',
  676       _Enumeration(['TurnOffAllWarnings',  # /W0
  677                     'Level1',  # /W1
  678                     'Level2',  # /W2
  679                     'Level3',  # /W3
  680                     'Level4'],  # /W4
  681                    new=['EnableAllWarnings']))  # /Wall
  682 
  683 # Options found in MSVS that have been renamed in MSBuild.
  684 _Renamed(_compile, 'EnableFunctionLevelLinking', 'FunctionLevelLinking',
  685          _boolean)  # /Gy
  686 _Renamed(_compile, 'EnableIntrinsicFunctions', 'IntrinsicFunctions',
  687          _boolean)  # /Oi
  688 _Renamed(_compile, 'KeepComments', 'PreprocessKeepComments', _boolean)  # /C
  689 _Renamed(_compile, 'ObjectFile', 'ObjectFileName', _file_name)  # /Fo
  690 _Renamed(_compile, 'OpenMP', 'OpenMPSupport', _boolean)  # /openmp
  691 _Renamed(_compile, 'PrecompiledHeaderThrough', 'PrecompiledHeaderFile',
  692          _file_name)  # Used with /Yc and /Yu
  693 _Renamed(_compile, 'PrecompiledHeaderFile', 'PrecompiledHeaderOutputFile',
  694          _file_name)  # /Fp
  695 _Renamed(_compile, 'UsePrecompiledHeader', 'PrecompiledHeader',
  696          _Enumeration(['NotUsing',  # VS recognized '' for this value too.
  697                        'Create',   # /Yc
  698                        'Use']))  # /Yu
  699 _Renamed(_compile, 'WarnAsError', 'TreatWarningAsError', _boolean)  # /WX
  700 
  701 _ConvertedToAdditionalOption(_compile, 'DefaultCharIsUnsigned', '/J')
  702 
  703 # MSVS options not found in MSBuild.
  704 _MSVSOnly(_compile, 'Detect64BitPortabilityProblems', _boolean)
  705 _MSVSOnly(_compile, 'UseUnicodeResponseFiles', _boolean)
  706 
  707 # MSBuild options not found in MSVS.
  708 _MSBuildOnly(_compile, 'BuildingInIDE', _boolean)
  709 _MSBuildOnly(_compile, 'CompileAsManaged',
  710              _Enumeration([], new=['false',
  711                                    'true']))  # /clr
  712 _MSBuildOnly(_compile, 'CreateHotpatchableImage', _boolean)  # /hotpatch
  713 _MSBuildOnly(_compile, 'MultiProcessorCompilation', _boolean)  # /MP
  714 _MSBuildOnly(_compile, 'PreprocessOutputPath', _string)  # /Fi
  715 _MSBuildOnly(_compile, 'ProcessorNumber', _integer)  # the number of processors
  716 _MSBuildOnly(_compile, 'TrackerLogDirectory', _folder_name)
  717 _MSBuildOnly(_compile, 'TreatSpecificWarningsAsErrors', _string_list)  # /we
  718 _MSBuildOnly(_compile, 'UseUnicodeForAssemblerListing', _boolean)  # /FAu
  719 
  720 # Defines a setting that needs very customized processing
  721 _CustomGeneratePreprocessedFile(_compile, 'GeneratePreprocessedFile')
  722 
  723 
  724 # Directives for converting MSVS VCLinkerTool to MSBuild Link.
  725 # See "c:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\1033\link.xml" for
  726 # the schema of the MSBuild Link settings.
  727 
  728 # Options that have the same name in MSVS and MSBuild
  729 _Same(_link, 'AdditionalDependencies', _file_list)
  730 _Same(_link, 'AdditionalLibraryDirectories', _folder_list)  # /LIBPATH
  731 #  /MANIFESTDEPENDENCY:
  732 _Same(_link, 'AdditionalManifestDependencies', _file_list)
  733 _Same(_link, 'AdditionalOptions', _string_list)
  734 _Same(_link, 'AddModuleNamesToAssembly', _file_list)  # /ASSEMBLYMODULE
  735 _Same(_link, 'AllowIsolation', _boolean)  # /ALLOWISOLATION
  736 _Same(_link, 'AssemblyLinkResource', _file_list)  # /ASSEMBLYLINKRESOURCE
  737 _Same(_link, 'BaseAddress', _string)  # /BASE
  738 _Same(_link, 'CLRUnmanagedCodeCheck', _boolean)  # /CLRUNMANAGEDCODECHECK
  739 _Same(_link, 'DelayLoadDLLs', _file_list)  # /DELAYLOAD
  740 _Same(_link, 'DelaySign', _boolean)  # /DELAYSIGN
  741 _Same(_link, 'EmbedManagedResourceFile', _file_list)  # /ASSEMBLYRESOURCE
  742 _Same(_link, 'EnableUAC', _boolean)  # /MANIFESTUAC
  743 _Same(_link, 'EntryPointSymbol', _string)  # /ENTRY
  744 _Same(_link, 'ForceSymbolReferences', _file_list)  # /INCLUDE
  745 _Same(_link, 'FunctionOrder', _file_name)  # /ORDER
  746 _Same(_link, 'GenerateDebugInformation', _boolean)  # /DEBUG
  747 _Same(_link, 'GenerateMapFile', _boolean)  # /MAP
  748 _Same(_link, 'HeapCommitSize', _string)
  749 _Same(_link, 'HeapReserveSize', _string)  # /HEAP
  750 _Same(_link, 'IgnoreAllDefaultLibraries', _boolean)  # /NODEFAULTLIB
  751 _Same(_link, 'IgnoreEmbeddedIDL', _boolean)  # /IGNOREIDL
  752 _Same(_link, 'ImportLibrary', _file_name)  # /IMPLIB
  753 _Same(_link, 'KeyContainer', _file_name)  # /KEYCONTAINER
  754 _Same(_link, 'KeyFile', _file_name)  # /KEYFILE
  755 _Same(_link, 'ManifestFile', _file_name)  # /ManifestFile
  756 _Same(_link, 'MapExports', _boolean)  # /MAPINFO:EXPORTS
  757 _Same(_link, 'MapFileName', _file_name)
  758 _Same(_link, 'MergedIDLBaseFileName', _file_name)  # /IDLOUT
  759 _Same(_link, 'MergeSections', _string)  # /MERGE
  760 _Same(_link, 'MidlCommandFile', _file_name)  # /MIDL
  761 _Same(_link, 'ModuleDefinitionFile', _file_name)  # /DEF
  762 _Same(_link, 'OutputFile', _file_name)  # /OUT
  763 _Same(_link, 'PerUserRedirection', _boolean)
  764 _Same(_link, 'Profile', _boolean)  # /PROFILE
  765 _Same(_link, 'ProfileGuidedDatabase', _file_name)  # /PGD
  766 _Same(_link, 'ProgramDatabaseFile', _file_name)  # /PDB
  767 _Same(_link, 'RegisterOutput', _boolean)
  768 _Same(_link, 'SetChecksum', _boolean)  # /RELEASE
  769 _Same(_link, 'StackCommitSize', _string)
  770 _Same(_link, 'StackReserveSize', _string)  # /STACK
  771 _Same(_link, 'StripPrivateSymbols', _file_name)  # /PDBSTRIPPED
  772 _Same(_link, 'SupportUnloadOfDelayLoadedDLL', _boolean)  # /DELAY:UNLOAD
  773 _Same(_link, 'SuppressStartupBanner', _boolean)  # /NOLOGO
  774 _Same(_link, 'SwapRunFromCD', _boolean)  # /SWAPRUN:CD
  775 _Same(_link, 'TurnOffAssemblyGeneration', _boolean)  # /NOASSEMBLY
  776 _Same(_link, 'TypeLibraryFile', _file_name)  # /TLBOUT
  777 _Same(_link, 'TypeLibraryResourceID', _integer)  # /TLBID
  778 _Same(_link, 'UACUIAccess', _boolean)  # /uiAccess='true'
  779 _Same(_link, 'Version', _string)  # /VERSION
  780 
  781 _Same(_link, 'EnableCOMDATFolding', _newly_boolean)  # /OPT:ICF
  782 _Same(_link, 'FixedBaseAddress', _newly_boolean)  # /FIXED
  783 _Same(_link, 'LargeAddressAware', _newly_boolean)  # /LARGEADDRESSAWARE
  784 _Same(_link, 'OptimizeReferences', _newly_boolean)  # /OPT:REF
  785 _Same(_link, 'RandomizedBaseAddress', _newly_boolean)  # /DYNAMICBASE
  786 _Same(_link, 'TerminalServerAware', _newly_boolean)  # /TSAWARE
  787 
  788 _subsystem_enumeration = _Enumeration(
  789     ['NotSet',
  790      'Console',  # /SUBSYSTEM:CONSOLE
  791      'Windows',  # /SUBSYSTEM:WINDOWS
  792      'Native',  # /SUBSYSTEM:NATIVE
  793      'EFI Application',  # /SUBSYSTEM:EFI_APPLICATION
  794      'EFI Boot Service Driver',  # /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER
  795      'EFI ROM',  # /SUBSYSTEM:EFI_ROM
  796      'EFI Runtime',  # /SUBSYSTEM:EFI_RUNTIME_DRIVER
  797      'WindowsCE'],  # /SUBSYSTEM:WINDOWSCE
  798     new=['POSIX'])  # /SUBSYSTEM:POSIX
  799 
  800 _target_machine_enumeration = _Enumeration(
  801     ['NotSet',
  802      'MachineX86',  # /MACHINE:X86
  803      None,
  804      'MachineARM',  # /MACHINE:ARM
  805      'MachineEBC',  # /MACHINE:EBC
  806      'MachineIA64',  # /MACHINE:IA64
  807      None,
  808      'MachineMIPS',  # /MACHINE:MIPS
  809      'MachineMIPS16',  # /MACHINE:MIPS16
  810      'MachineMIPSFPU',  # /MACHINE:MIPSFPU
  811      'MachineMIPSFPU16',  # /MACHINE:MIPSFPU16
  812      None,
  813      None,
  814      None,
  815      'MachineSH4',  # /MACHINE:SH4
  816      None,
  817      'MachineTHUMB',  # /MACHINE:THUMB
  818      'MachineX64'])  # /MACHINE:X64
  819 
  820 _Same(_link, 'AssemblyDebug',
  821       _Enumeration(['',
  822                     'true',  # /ASSEMBLYDEBUG
  823                     'false']))  # /ASSEMBLYDEBUG:DISABLE
  824 _Same(_link, 'CLRImageType',
  825       _Enumeration(['Default',
  826                     'ForceIJWImage',  # /CLRIMAGETYPE:IJW
  827                     'ForcePureILImage',  # /Switch="CLRIMAGETYPE:PURE
  828                     'ForceSafeILImage']))  # /Switch="CLRIMAGETYPE:SAFE
  829 _Same(_link, 'CLRThreadAttribute',
  830       _Enumeration(['DefaultThreadingAttribute',  # /CLRTHREADATTRIBUTE:NONE
  831                     'MTAThreadingAttribute',  # /CLRTHREADATTRIBUTE:MTA
  832                     'STAThreadingAttribute']))  # /CLRTHREADATTRIBUTE:STA
  833 _Same(_link, 'DataExecutionPrevention',
  834       _Enumeration(['',
  835                     'false',  # /NXCOMPAT:NO
  836                     'true']))  # /NXCOMPAT
  837 _Same(_link, 'Driver',
  838       _Enumeration(['NotSet',
  839                     'Driver',  # /Driver
  840                     'UpOnly',  # /DRIVER:UPONLY
  841                     'WDM']))  # /DRIVER:WDM
  842 _Same(_link, 'LinkTimeCodeGeneration',
  843       _Enumeration(['Default',
  844                     'UseLinkTimeCodeGeneration',  # /LTCG
  845                     'PGInstrument',  # /LTCG:PGInstrument
  846                     'PGOptimization',  # /LTCG:PGOptimize
  847                     'PGUpdate']))  # /LTCG:PGUpdate
  848 _Same(_link, 'ShowProgress',
  849       _Enumeration(['NotSet',
  850                     'LinkVerbose',  # /VERBOSE
  851                     'LinkVerboseLib'],  # /VERBOSE:Lib
  852                    new=['LinkVerboseICF',  # /VERBOSE:ICF
  853                         'LinkVerboseREF',  # /VERBOSE:REF
  854                         'LinkVerboseSAFESEH',  # /VERBOSE:SAFESEH
  855                         'LinkVerboseCLR']))  # /VERBOSE:CLR
  856 _Same(_link, 'SubSystem', _subsystem_enumeration)
  857 _Same(_link, 'TargetMachine', _target_machine_enumeration)
  858 _Same(_link, 'UACExecutionLevel',
  859       _Enumeration(['AsInvoker',  # /level='asInvoker'
  860                     'HighestAvailable',  # /level='highestAvailable'
  861                     'RequireAdministrator']))  # /level='requireAdministrator'
  862 _Same(_link, 'MinimumRequiredVersion', _string)
  863 _Same(_link, 'TreatLinkerWarningAsErrors', _boolean)  # /WX
  864 
  865 
  866 # Options found in MSVS that have been renamed in MSBuild.
  867 _Renamed(_link, 'ErrorReporting', 'LinkErrorReporting',
  868          _Enumeration(['NoErrorReport',  # /ERRORREPORT:NONE
  869                        'PromptImmediately',  # /ERRORREPORT:PROMPT
  870                        'QueueForNextLogin'],  # /ERRORREPORT:QUEUE
  871                       new=['SendErrorReport']))  # /ERRORREPORT:SEND
  872 _Renamed(_link, 'IgnoreDefaultLibraryNames', 'IgnoreSpecificDefaultLibraries',
  873          _file_list)  # /NODEFAULTLIB
  874 _Renamed(_link, 'ResourceOnlyDLL', 'NoEntryPoint', _boolean)  # /NOENTRY
  875 _Renamed(_link, 'SwapRunFromNet', 'SwapRunFromNET', _boolean)  # /SWAPRUN:NET
  876 
  877 _Moved(_link, 'GenerateManifest', '', _boolean)
  878 _Moved(_link, 'IgnoreImportLibrary', '', _boolean)
  879 _Moved(_link, 'LinkIncremental', '', _newly_boolean)
  880 _Moved(_link, 'LinkLibraryDependencies', 'ProjectReference', _boolean)
  881 _Moved(_link, 'UseLibraryDependencyInputs', 'ProjectReference', _boolean)
  882 
  883 # MSVS options not found in MSBuild.
  884 _MSVSOnly(_link, 'OptimizeForWindows98', _newly_boolean)
  885 _MSVSOnly(_link, 'UseUnicodeResponseFiles', _boolean)
  886 
  887 # MSBuild options not found in MSVS.
  888 _MSBuildOnly(_link, 'BuildingInIDE', _boolean)
  889 _MSBuildOnly(_link, 'ImageHasSafeExceptionHandlers', _boolean)  # /SAFESEH
  890 _MSBuildOnly(_link, 'LinkDLL', _boolean)  # /DLL Visible='false'
  891 _MSBuildOnly(_link, 'LinkStatus', _boolean)  # /LTCG:STATUS
  892 _MSBuildOnly(_link, 'PreventDllBinding', _boolean)  # /ALLOWBIND
  893 _MSBuildOnly(_link, 'SupportNobindOfDelayLoadedDLL', _boolean)  # /DELAY:NOBIND
  894 _MSBuildOnly(_link, 'TrackerLogDirectory', _folder_name)
  895 _MSBuildOnly(_link, 'MSDOSStubFileName', _file_name)  # /STUB Visible='false'
  896 _MSBuildOnly(_link, 'SectionAlignment', _integer)  # /ALIGN
  897 _MSBuildOnly(_link, 'SpecifySectionAttributes', _string)  # /SECTION
  898 _MSBuildOnly(_link, 'ForceFileOutput',
  899              _Enumeration([], new=['Enabled',  # /FORCE
  900                                    # /FORCE:MULTIPLE
  901                                    'MultiplyDefinedSymbolOnly',
  902                                    'UndefinedSymbolOnly']))  # /FORCE:UNRESOLVED
  903 _MSBuildOnly(_link, 'CreateHotPatchableImage',
  904              _Enumeration([], new=['Enabled',  # /FUNCTIONPADMIN
  905                                    'X86Image',  # /FUNCTIONPADMIN:5
  906                                    'X64Image',  # /FUNCTIONPADMIN:6
  907                                    'ItaniumImage']))  # /FUNCTIONPADMIN:16
  908 _MSBuildOnly(_link, 'CLRSupportLastError',
  909              _Enumeration([], new=['Enabled',  # /CLRSupportLastError
  910                                    'Disabled',  # /CLRSupportLastError:NO
  911                                    # /CLRSupportLastError:SYSTEMDLL
  912                                    'SystemDlls']))
  913 
  914 
  915 # Directives for converting VCResourceCompilerTool to ResourceCompile.
  916 # See "c:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\1033\rc.xml" for
  917 # the schema of the MSBuild ResourceCompile settings.
  918 
  919 _Same(_rc, 'AdditionalOptions', _string_list)
  920 _Same(_rc, 'AdditionalIncludeDirectories', _folder_list)  # /I
  921 _Same(_rc, 'Culture', _Integer(msbuild_base=16))
  922 _Same(_rc, 'IgnoreStandardIncludePath', _boolean)  # /X
  923 _Same(_rc, 'PreprocessorDefinitions', _string_list)  # /D
  924 _Same(_rc, 'ResourceOutputFileName', _string)  # /fo
  925 _Same(_rc, 'ShowProgress', _boolean)  # /v
  926 # There is no UI in VisualStudio 2008 to set the following properties.
  927 # However they are found in CL and other tools.  Include them here for
  928 # completeness, as they are very likely to have the same usage pattern.
  929 _Same(_rc, 'SuppressStartupBanner', _boolean)  # /nologo
  930 _Same(_rc, 'UndefinePreprocessorDefinitions', _string_list)  # /u
  931 
  932 # MSBuild options not found in MSVS.
  933 _MSBuildOnly(_rc, 'NullTerminateStrings', _boolean)  # /n
  934 _MSBuildOnly(_rc, 'TrackerLogDirectory', _folder_name)
  935 
  936 
  937 # Directives for converting VCMIDLTool to Midl.
  938 # See "c:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\1033\midl.xml" for
  939 # the schema of the MSBuild Midl settings.
  940 
  941 _Same(_midl, 'AdditionalIncludeDirectories', _folder_list)  # /I
  942 _Same(_midl, 'AdditionalOptions', _string_list)
  943 _Same(_midl, 'CPreprocessOptions', _string)  # /cpp_opt
  944 _Same(_midl, 'ErrorCheckAllocations', _boolean)  # /error allocation
  945 _Same(_midl, 'ErrorCheckBounds', _boolean)  # /error bounds_check
  946 _Same(_midl, 'ErrorCheckEnumRange', _boolean)  # /error enum
  947 _Same(_midl, 'ErrorCheckRefPointers', _boolean)  # /error ref
  948 _Same(_midl, 'ErrorCheckStubData', _boolean)  # /error stub_data
  949 _Same(_midl, 'GenerateStublessProxies', _boolean)  # /Oicf
  950 _Same(_midl, 'GenerateTypeLibrary', _boolean)
  951 _Same(_midl, 'HeaderFileName', _file_name)  # /h
  952 _Same(_midl, 'IgnoreStandardIncludePath', _boolean)  # /no_def_idir
  953 _Same(_midl, 'InterfaceIdentifierFileName', _file_name)  # /iid
  954 _Same(_midl, 'MkTypLibCompatible', _boolean)  # /mktyplib203
  955 _Same(_midl, 'OutputDirectory', _string)  # /out
  956 _Same(_midl, 'PreprocessorDefinitions', _string_list)  # /D
  957 _Same(_midl, 'ProxyFileName', _file_name)  # /proxy
  958 _Same(_midl, 'RedirectOutputAndErrors', _file_name)  # /o
  959 _Same(_midl, 'SuppressStartupBanner', _boolean)  # /nologo
  960 _Same(_midl, 'TypeLibraryName', _file_name)  # /tlb
  961 _Same(_midl, 'UndefinePreprocessorDefinitions', _string_list)  # /U
  962 _Same(_midl, 'WarnAsError', _boolean)  # /WX
  963 
  964 _Same(_midl, 'DefaultCharType',
  965       _Enumeration(['Unsigned',  # /char unsigned
  966                     'Signed',  # /char signed
  967                     'Ascii']))  # /char ascii7
  968 _Same(_midl, 'TargetEnvironment',
  969       _Enumeration(['NotSet',
  970                     'Win32',  # /env win32
  971                     'Itanium',  # /env ia64
  972                     'X64']))  # /env x64
  973 _Same(_midl, 'EnableErrorChecks',
  974       _Enumeration(['EnableCustom',
  975                     'None',  # /error none
  976                     'All']))  # /error all
  977 _Same(_midl, 'StructMemberAlignment',
  978       _Enumeration(['NotSet',
  979                     '1',  # Zp1
  980                     '2',  # Zp2
  981                     '4',  # Zp4
  982                     '8']))  # Zp8
  983 _Same(_midl, 'WarningLevel',
  984       _Enumeration(['0',  # /W0
  985                     '1',  # /W1
  986                     '2',  # /W2
  987                     '3',  # /W3
  988                     '4']))  # /W4
  989 
  990 _Renamed(_midl, 'DLLDataFileName', 'DllDataFileName', _file_name)  # /dlldata
  991 _Renamed(_midl, 'ValidateParameters', 'ValidateAllParameters',
  992          _boolean)  # /robust
  993 
  994 # MSBuild options not found in MSVS.
  995 _MSBuildOnly(_midl, 'ApplicationConfigurationMode', _boolean)  # /app_config
  996 _MSBuildOnly(_midl, 'ClientStubFile', _file_name)  # /cstub
  997 _MSBuildOnly(_midl, 'GenerateClientFiles',
  998              _Enumeration([], new=['Stub',  # /client stub
  999                                    'None']))  # /client none
 1000 _MSBuildOnly(_midl, 'GenerateServerFiles',
 1001              _Enumeration([], new=['Stub',  # /client stub
 1002                                    'None']))  # /client none
 1003 _MSBuildOnly(_midl, 'LocaleID', _integer)  # /lcid DECIMAL
 1004 _MSBuildOnly(_midl, 'ServerStubFile', _file_name)  # /sstub
 1005 _MSBuildOnly(_midl, 'SuppressCompilerWarnings', _boolean)  # /no_warn
 1006 _MSBuildOnly(_midl, 'TrackerLogDirectory', _folder_name)
 1007 _MSBuildOnly(_midl, 'TypeLibFormat',
 1008              _Enumeration([], new=['NewFormat',  # /newtlb
 1009                                    'OldFormat']))  # /oldtlb
 1010 
 1011 
 1012 # Directives for converting VCLibrarianTool to Lib.
 1013 # See "c:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\1033\lib.xml" for
 1014 # the schema of the MSBuild Lib settings.
 1015 
 1016 _Same(_lib, 'AdditionalDependencies', _file_list)
 1017 _Same(_lib, 'AdditionalLibraryDirectories', _folder_list)  # /LIBPATH
 1018 _Same(_lib, 'AdditionalOptions', _string_list)
 1019 _Same(_lib, 'ExportNamedFunctions', _string_list)  # /EXPORT
 1020 _Same(_lib, 'ForceSymbolReferences', _string)  # /INCLUDE
 1021 _Same(_lib, 'IgnoreAllDefaultLibraries', _boolean)  # /NODEFAULTLIB
 1022 _Same(_lib, 'IgnoreSpecificDefaultLibraries', _file_list)  # /NODEFAULTLIB
 1023 _Same(_lib, 'ModuleDefinitionFile', _file_name)  # /DEF
 1024 _Same(_lib, 'OutputFile', _file_name)  # /OUT
 1025 _Same(_lib, 'SuppressStartupBanner', _boolean)  # /NOLOGO
 1026 _Same(_lib, 'UseUnicodeResponseFiles', _boolean)
 1027 _Same(_lib, 'LinkTimeCodeGeneration', _boolean)  # /LTCG
 1028 _Same(_lib, 'TargetMachine', _target_machine_enumeration)
 1029 
 1030 # TODO(jeanluc) _link defines the same value that gets moved to
 1031 # ProjectReference.  We may want to validate that they are consistent.
 1032 _Moved(_lib, 'LinkLibraryDependencies', 'ProjectReference', _boolean)
 1033 
 1034 _MSBuildOnly(_lib, 'DisplayLibrary', _string)  # /LIST Visible='false'
 1035 _MSBuildOnly(_lib, 'ErrorReporting',
 1036              _Enumeration([], new=['PromptImmediately',  # /ERRORREPORT:PROMPT
 1037                                    'QueueForNextLogin',  # /ERRORREPORT:QUEUE
 1038                                    'SendErrorReport',  # /ERRORREPORT:SEND
 1039                                    'NoErrorReport']))  # /ERRORREPORT:NONE
 1040 _MSBuildOnly(_lib, 'MinimumRequiredVersion', _string)
 1041 _MSBuildOnly(_lib, 'Name', _file_name)  # /NAME
 1042 _MSBuildOnly(_lib, 'RemoveObjects', _file_list)  # /REMOVE
 1043 _MSBuildOnly(_lib, 'SubSystem', _subsystem_enumeration)
 1044 _MSBuildOnly(_lib, 'TrackerLogDirectory', _folder_name)
 1045 _MSBuildOnly(_lib, 'TreatLibWarningAsErrors', _boolean)  # /WX
 1046 _MSBuildOnly(_lib, 'Verbose', _boolean)
 1047 
 1048 
 1049 # Directives for converting VCManifestTool to Mt.
 1050 # See "c:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\1033\mt.xml" for
 1051 # the schema of the MSBuild Lib settings.
 1052 
 1053 # Options that have the same name in MSVS and MSBuild
 1054 _Same(_manifest, 'AdditionalManifestFiles', _file_list)  # /manifest
 1055 _Same(_manifest, 'AdditionalOptions', _string_list)
 1056 _Same(_manifest, 'AssemblyIdentity', _string)  # /identity:
 1057 _Same(_manifest, 'ComponentFileName', _file_name)  # /dll
 1058 _Same(_manifest, 'GenerateCatalogFiles', _boolean)  # /makecdfs
 1059 _Same(_manifest, 'InputResourceManifests', _string)  # /inputresource
 1060 _Same(_manifest, 'OutputManifestFile', _file_name)  # /out
 1061 _Same(_manifest, 'RegistrarScriptFile', _file_name)  # /rgs
 1062 _Same(_manifest, 'ReplacementsFile', _file_name)  # /replacements
 1063 _Same(_manifest, 'SuppressStartupBanner', _boolean)  # /nologo
 1064 _Same(_manifest, 'TypeLibraryFile', _file_name)  # /tlb:
 1065 _Same(_manifest, 'UpdateFileHashes', _boolean)  # /hashupdate
 1066 _Same(_manifest, 'UpdateFileHashesSearchPath', _file_name)
 1067 _Same(_manifest, 'VerboseOutput', _boolean)  # /verbose
 1068 
 1069 # Options that have moved location.
 1070 _MovedAndRenamed(_manifest, 'ManifestResourceFile',
 1071                  'ManifestResourceCompile',
 1072                  'ResourceOutputFileName',
 1073                  _file_name)
 1074 _Moved(_manifest, 'EmbedManifest', '', _boolean)
 1075 
 1076 # MSVS options not found in MSBuild.
 1077 _MSVSOnly(_manifest, 'DependencyInformationFile', _file_name)
 1078 _MSVSOnly(_manifest, 'UseFAT32Workaround', _boolean)
 1079 _MSVSOnly(_manifest, 'UseUnicodeResponseFiles', _boolean)
 1080 
 1081 # MSBuild options not found in MSVS.
 1082 _MSBuildOnly(_manifest, 'EnableDPIAwareness', _boolean)
 1083 _MSBuildOnly(_manifest, 'GenerateCategoryTags', _boolean)  # /category
 1084 _MSBuildOnly(_manifest, 'ManifestFromManagedAssembly',
 1085              _file_name)  # /managedassemblyname
 1086 _MSBuildOnly(_manifest, 'OutputResourceManifests', _string)  # /outputresource
 1087 _MSBuildOnly(_manifest, 'SuppressDependencyElement', _boolean)  # /nodependency
 1088 _MSBuildOnly(_manifest, 'TrackerLogDirectory', _folder_name)
 1089 
 1090 
 1091 # Directives for MASM.
 1092 # See "$(VCTargetsPath)\BuildCustomizations\masm.xml" for the schema of the
 1093 # MSBuild MASM settings.
 1094 
 1095 # Options that have the same name in MSVS and MSBuild.
 1096 _Same(_masm, 'UseSafeExceptionHandlers', _boolean)  # /safeseh