blob: 8ae19180ea271b900a7d4d1781980cc8d00faaf5 [file] [log] [blame]
Ben Murdoch097c5b22016-05-18 11:27:45 +01001# 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