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
5r"""Code to validate and convert settings of the Microsoft build tools.
6
7This file contains code to validate and convert settings of the Microsoft
8build tools.  The function ConvertToMSBuildSettings(), ValidateMSVSSettings(),
9and ValidateMSBuildSettings() are the entry points.
10
11This file was created by comparing the projects created by Visual Studio 2008
12and Visual Studio 2010 for all available settings through the user interface.
13The MSBuild schemas were also considered.  They are typically found in the
14MSBuild install directory, e.g. c:\Program Files (x86)\MSBuild
15"""
16
17import sys
18import 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
35class _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
48def _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
62def _GetMSBuildToolSettings(msbuild_settings, tool):
63  """Returns an MSBuild tool dictionary.  Creates it if needed."""
64  return msbuild_settings.setdefault(tool.msbuild_name, {})
65
66
67class _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
105class _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
121class _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
140class _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
158class _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
178class _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
233def _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
244def _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
264def _Moved(tool, settings_name, msbuild_tool_name, setting_type):
265  _MovedAndRenamed(tool, settings_name, msbuild_tool_name, settings_name,
266                   setting_type)
267
268
269def _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
292def _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
309def _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
327def _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
348def _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
372fix_vc_macro_slashes_regex_list = ('IntDir', 'OutDir')
373fix_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
381def _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
406def 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
419def 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
442def 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
480def 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
491def 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
502def _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