1 # Copyright (c) 2012 Google Inc. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
5 r"""Code to validate and convert settings of the Microsoft build tools.
7 This file contains code to validate and convert settings of the Microsoft
8 build tools. The function ConvertToMSBuildSettings(), ValidateMSVSSettings(),
9 and ValidateMSBuildSettings() are the entry points.
11 This file was created by comparing the projects created by Visual Studio 2008
12 and Visual Studio 2010 for all available settings through the user interface.
13 The MSBuild schemas were also considered. They are typically found in the
14 MSBuild install directory, e.g. c:\Program Files (x86)\MSBuild
20 # Dictionaries of settings validators. The key is the tool name, the value is
21 # a dictionary mapping setting names to validation functions.
23 _msbuild_validators = {}
26 # A dictionary of settings converters. The key is the tool name, the value is
27 # a dictionary mapping setting names to conversion functions.
28 _msvs_to_msbuild_converters = {}
31 # Tool name mapping from MSVS to MSBuild.
32 _msbuild_name_of_tool = {}
36 """Represents a tool used by MSVS or MSBuild.
39 msvs_name: The name of the tool in MSVS.
40 msbuild_name: The name of the tool in MSBuild.
43 def __init__(self, msvs_name, msbuild_name):
44 self.msvs_name = msvs_name
45 self.msbuild_name = msbuild_name
49 """Adds a tool to the four dictionaries used to process settings.
51 This only defines the tool. Each setting also needs to be added.
54 tool: The _Tool object to be added.
56 _msvs_validators[tool.msvs_name] = {}
57 _msbuild_validators[tool.msbuild_name] = {}
58 _msvs_to_msbuild_converters[tool.msvs_name] = {}
59 _msbuild_name_of_tool[tool.msvs_name] = tool.msbuild_name
62 def _GetMSBuildToolSettings(msbuild_settings, tool):
63 """Returns an MSBuild tool dictionary. Creates it if needed."""
64 return msbuild_settings.setdefault(tool.msbuild_name, {})
68 """Type of settings (Base class)."""
70 def ValidateMSVS(self, value):
71 """Verifies that the value is legal for MSVS.
74 value: the value to check for this type.
77 ValueError if value is not valid for MSVS.
80 def ValidateMSBuild(self, value):
81 """Verifies that the value is legal for MSBuild.
84 value: the value to check for this type.
87 ValueError if value is not valid for MSBuild.
90 def ConvertToMSBuild(self, value):
91 """Returns the MSBuild equivalent of the MSVS value given.
94 value: the MSVS value to convert.
97 the MSBuild equivalent.
100 ValueError if value is not valid.
105 class _String(_Type):
106 """A setting that's just a string."""
108 def ValidateMSVS(self, value):
109 if not isinstance(value, basestring):
110 raise ValueError('expected string; got %r' % value)
112 def ValidateMSBuild(self, value):
113 if not isinstance(value, basestring):
114 raise ValueError('expected string; got %r' % value)
116 def ConvertToMSBuild(self, value):
118 return ConvertVCMacrosToMSBuild(value)
121 class _StringList(_Type):
122 """A settings that's a list of strings."""
124 def ValidateMSVS(self, value):
125 if not isinstance(value, basestring) and not isinstance(value, list):
126 raise ValueError('expected string list; got %r' % value)
128 def ValidateMSBuild(self, value):
129 if not isinstance(value, basestring) and not isinstance(value, list):
130 raise ValueError('expected string list; got %r' % value)
132 def ConvertToMSBuild(self, value):
134 if isinstance(value, list):
135 return [ConvertVCMacrosToMSBuild(i) for i in value]
137 return ConvertVCMacrosToMSBuild(value)
140 class _Boolean(_Type):
141 """Boolean settings, can have the values 'false' or 'true'."""
143 def _Validate(self, value):
144 if value != 'true' and value != 'false':
145 raise ValueError('expected bool; got %r' % value)
147 def ValidateMSVS(self, value):
148 self._Validate(value)
150 def ValidateMSBuild(self, value):
151 self._Validate(value)
153 def ConvertToMSBuild(self, value):
154 self._Validate(value)
158 class _Integer(_Type):
159 """Integer settings."""
161 def __init__(self, msbuild_base=10):
163 self._msbuild_base = msbuild_base
165 def ValidateMSVS(self, value):
166 # Try to convert, this will raise ValueError if invalid.
167 self.ConvertToMSBuild(value)
169 def ValidateMSBuild(self, value):
170 # Try to convert, this will raise ValueError if invalid.
171 int(value, self._msbuild_base)
173 def ConvertToMSBuild(self, value):
174 msbuild_format = (self._msbuild_base == 10) and '%d' or '0x%04x'
175 return msbuild_format % int(value)
178 class _Enumeration(_Type):
179 """Type of settings that is an enumeration.
181 In MSVS, the values are indexes like '0', '1', and '2'.
182 MSBuild uses text labels that are more representative, like 'Win32'.
185 label_list: an array of MSBuild labels that correspond to the MSVS index.
186 In the rare cases where MSVS has skipped an index value, None is
187 used in the array to indicate the unused spot.
188 new: an array of labels that are new to MSBuild.
191 def __init__(self, label_list, new=None):
193 self._label_list = label_list
194 self._msbuild_values = set(value for value in label_list
195 if value is not None)
197 self._msbuild_values.update(new)
199 def ValidateMSVS(self, value):
200 # Try to convert. It will raise an exception if not valid.
201 self.ConvertToMSBuild(value)
203 def ValidateMSBuild(self, value):
204 if value not in self._msbuild_values:
205 raise ValueError('unrecognized enumerated value %s' % value)
207 def ConvertToMSBuild(self, value):
209 if index < 0 or index >= len(self._label_list):
210 raise ValueError('index value (%d) not in expected range [0, %d)' %
211 (index, len(self._label_list)))
212 label = self._label_list[index]
214 raise ValueError('converted value for %s not specified.' % value)
218 # Instantiate the various generic types.
219 _boolean = _Boolean()
220 _integer = _Integer()
221 # For now, we don't do any special validation on these types:
223 _file_name = _String()
224 _folder_name = _String()
225 _file_list = _StringList()
226 _folder_list = _StringList()
227 _string_list = _StringList()
228 # Some boolean settings went from numerical values to boolean. The
229 # mapping is 0: default, 1: false, 2: true.
230 _newly_boolean = _Enumeration(['', 'false', 'true'])
233 def _Same(tool, name, setting_type):
234 """Defines a setting that has the same name in MSVS and MSBuild.
237 tool: a dictionary that gives the names of the tool for MSVS and MSBuild.
238 name: the name of the setting.
239 setting_type: the type of this setting.
241 _Renamed(tool, name, name, setting_type)
244 def _Renamed(tool, msvs_name, msbuild_name, setting_type):
245 """Defines a setting for which the name has changed.
248 tool: a dictionary that gives the names of the tool for MSVS and MSBuild.
249 msvs_name: the name of the MSVS setting.
250 msbuild_name: the name of the MSBuild setting.
251 setting_type: the type of this setting.
254 def _Translate(value, msbuild_settings):
255 msbuild_tool_settings = _GetMSBuildToolSettings(msbuild_settings, tool)
256 msbuild_tool_settings[msbuild_name] = setting_type.ConvertToMSBuild(value)
258 _msvs_validators[tool.msvs_name][msvs_name] = setting_type.ValidateMSVS
259 _msbuild_validators[tool.msbuild_name][msbuild_name] = (
260 setting_type.ValidateMSBuild)
261 _msvs_to_msbuild_converters[tool.msvs_name][msvs_name] = _Translate
264 def _Moved(tool, settings_name, msbuild_tool_name, setting_type):
265 _MovedAndRenamed(tool, settings_name, msbuild_tool_name, settings_name,
269 def _MovedAndRenamed(tool, msvs_settings_name, msbuild_tool_name,
270 msbuild_settings_name, setting_type):
271 """Defines a setting that may have moved to a new section.
274 tool: a dictionary that gives the names of the tool for MSVS and MSBuild.
275 msvs_settings_name: the MSVS name of the setting.
276 msbuild_tool_name: the name of the MSBuild tool to place the setting under.
277 msbuild_settings_name: the MSBuild name of the setting.
278 setting_type: the type of this setting.
281 def _Translate(value, msbuild_settings):
282 tool_settings = msbuild_settings.setdefault(msbuild_tool_name, {})
283 tool_settings[msbuild_settings_name] = setting_type.ConvertToMSBuild(value)
285 _msvs_validators[tool.msvs_name][msvs_settings_name] = (
286 setting_type.ValidateMSVS)
287 validator = setting_type.ValidateMSBuild
288 _msbuild_validators[msbuild_tool_name][msbuild_settings_name] = validator
289 _msvs_to_msbuild_converters[tool.msvs_name][msvs_settings_name] = _Translate
292 def _MSVSOnly(tool, name, setting_type):
293 """Defines a setting that is only found in MSVS.
296 tool: a dictionary that gives the names of the tool for MSVS and MSBuild.
297 name: the name of the setting.
298 setting_type: the type of this setting.
301 def _Translate(unused_value, unused_msbuild_settings):
302 # Since this is for MSVS only settings, no translation will happen.
305 _msvs_validators[tool.msvs_name][name] = setting_type.ValidateMSVS
306 _msvs_to_msbuild_converters[tool.msvs_name][name] = _Translate
309 def _MSBuildOnly(tool, name, setting_type):
310 """Defines a setting that is only found in MSBuild.
313 tool: a dictionary that gives the names of the tool for MSVS and MSBuild.
314 name: the name of the setting.
315 setting_type: the type of this setting.
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
323 _msbuild_validators[tool.msbuild_name][name] = setting_type.ValidateMSBuild
324 _msvs_to_msbuild_converters[tool.msvs_name][name] = _Translate
327 def _ConvertedToAdditionalOption(tool, msvs_name, flag):
328 """Defines a setting that's handled via a command line option in MSBuild.
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
336 def _Translate(value, msbuild_settings):
338 tool_settings = _GetMSBuildToolSettings(msbuild_settings, tool)
339 if 'AdditionalOptions' in tool_settings:
340 new_flags = '%s %s' % (tool_settings['AdditionalOptions'], 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
348 def _CustomGeneratePreprocessedFile(tool, msvs_name):
349 def _Translate(value, msbuild_settings):
350 tool_settings = _GetMSBuildToolSettings(msbuild_settings, tool)
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'
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
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)
377 # Regular expression to detect keys that were generated by exclusion lists
378 _EXCLUDED_SUFFIX_RE = re.compile('^(.*)_excluded$')
381 def _ValidateExclusionSetting(setting, settings, error_msg, stderr=sys.stderr):
382 """Verify that 'setting' is valid if it is generated from an exclusion list.
384 If the setting appears to be generated from an exclusion list, the root name
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.
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.
396 m = re.match(_EXCLUDED_SUFFIX_RE, setting)
398 root_setting = m.group(1)
399 unrecognized = root_setting not in settings
402 # We don't know this setting. Give a warning.
403 print >> stderr, error_msg
406 def FixVCMacroSlashes(s):
407 """Replace macros which have excessive following slashes.
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.
412 This list is probably not exhaustive. Add as needed.
415 s = fix_vc_macro_slashes_regex.sub(r'\1', s)
419 def ConvertVCMacrosToMSBuild(s):
420 """Convert the the MSVS macros found in the string to the MSBuild equivalent.
422 This list is probably not exhaustive. Add as needed.
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)',
436 for old, new in replace_map.iteritems():
437 s = s.replace(old, new)
438 s = FixVCMacroSlashes(s)
442 def ConvertToMSBuildSettings(msvs_settings, stderr=sys.stderr):
443 """Converts MSVS settings (VS2008 and earlier) to MSBuild settings (VS2010+).
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.
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.
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.
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))
468 _ValidateExclusionSetting(msvs_setting,
470 ('Warning: unrecognized setting %s/%s '
471 'while converting to MSBuild.' %
472 (msvs_tool_name, msvs_setting)),
475 print >> stderr, ('Warning: unrecognized tool %s while converting to '
476 'MSBuild.' % msvs_tool_name)
477 return msbuild_settings
480 def ValidateMSVSSettings(settings, stderr=sys.stderr):
481 """Validates that the names of the settings are valid for MSVS.
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.
488 _ValidateSettings(_msvs_validators, settings, stderr)
491 def ValidateMSBuildSettings(settings, stderr=sys.stderr):
492 """Validates that the names of the settings are valid for MSBuild.
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.
499 _ValidateSettings(_msbuild_validators, settings, stderr)
502 def _ValidateSettings(validators, settings, stderr):
503 """Validates that the settings are valid for MSBuild or MSVS.
505 We currently only validate the names of the settings, not their values.
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.
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:
519 tool_validators[setting](value)
520 except ValueError, e:
521 print >> stderr, ('Warning: for %s/%s, %s' %
522 (tool_name, setting, e))
524 _ValidateExclusionSetting(setting,
526 ('Warning: unrecognized setting %s/%s' %
527 (tool_name, setting)),
531 print >> stderr, ('Warning: unrecognized tool %s' % tool_name)
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')
551 # Add sections only found in the MSBuild settings.
552 _msbuild_validators[''] = {}
553 _msbuild_validators['ProjectReference'] = {}
554 _msbuild_validators['ManifestResourceCompile'] = {}
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.
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)
596 _Same(_compile, 'AssemblerOutput',
597 _Enumeration(['NoListing',
598 'AssemblyCode', # /FA
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',
611 _Same(_compile, 'CallingConvention',
612 _Enumeration(['Cdecl', # /Gd
615 'VectorCall'])) # /Gv
616 _Same(_compile, 'CompileAs',
617 _Enumeration(['Default',
619 'CompileAsCpp'])) # /TP
620 _Same(_compile, 'DebugInformationFormat',
621 _Enumeration(['', # Disabled
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+)
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',
644 new=['SyncCThrow'])) # /EHs
645 _Same(_compile, 'FavorSizeOrSpeed',
646 _Enumeration(['Neither',
649 _Same(_compile, 'FloatingPointModel',
650 _Enumeration(['Precise', # /fp:precise
651 'Strict', # /fp:strict
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
663 _Same(_compile, 'RuntimeLibrary',
664 _Enumeration(['MultiThreaded', # /MT
665 'MultiThreadedDebug', # /MTd
666 'MultiThreadedDLL', # /MD
667 'MultiThreadedDebugDLL'])) # /MDd
668 _Same(_compile, 'StructMemberAlignment',
669 _Enumeration(['Default',
675 _Same(_compile, 'WarningLevel',
676 _Enumeration(['TurnOffAllWarnings', # /W0
681 new=['EnableAllWarnings'])) # /Wall
683 # Options found in MSVS that have been renamed in MSBuild.
684 _Renamed(_compile, 'EnableFunctionLevelLinking', 'FunctionLevelLinking',
686 _Renamed(_compile, 'EnableIntrinsicFunctions', 'IntrinsicFunctions',
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',
695 _Renamed(_compile, 'UsePrecompiledHeader', 'PrecompiledHeader',
696 _Enumeration(['NotUsing', # VS recognized '' for this value too.
699 _Renamed(_compile, 'WarnAsError', 'TreatWarningAsError', _boolean) # /WX
701 _ConvertedToAdditionalOption(_compile, 'DefaultCharIsUnsigned', '/J')
703 # MSVS options not found in MSBuild.
704 _MSVSOnly(_compile, 'Detect64BitPortabilityProblems', _boolean)
705 _MSVSOnly(_compile, 'UseUnicodeResponseFiles', _boolean)
707 # MSBuild options not found in MSVS.
708 _MSBuildOnly(_compile, 'BuildingInIDE', _boolean)
709 _MSBuildOnly(_compile, 'CompileAsManaged',
710 _Enumeration([], new=['false',
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
720 # Defines a setting that needs very customized processing
721 _CustomGeneratePreprocessedFile(_compile, 'GeneratePreprocessedFile')
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.
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
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
788 _subsystem_enumeration = _Enumeration(
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
800 _target_machine_enumeration = _Enumeration(
802 'MachineX86', # /MACHINE:X86
804 'MachineARM', # /MACHINE:ARM
805 'MachineEBC', # /MACHINE:EBC
806 'MachineIA64', # /MACHINE:IA64
808 'MachineMIPS', # /MACHINE:MIPS
809 'MachineMIPS16', # /MACHINE:MIPS16
810 'MachineMIPSFPU', # /MACHINE:MIPSFPU
811 'MachineMIPSFPU16', # /MACHINE:MIPSFPU16
815 'MachineSH4', # /MACHINE:SH4
817 'MachineTHUMB', # /MACHINE:THUMB
818 'MachineX64']) # /MACHINE:X64
820 _Same(_link, 'AssemblyDebug',
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',
835 'false', # /NXCOMPAT:NO
836 'true'])) # /NXCOMPAT
837 _Same(_link, 'Driver',
838 _Enumeration(['NotSet',
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
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
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)
883 # MSVS options not found in MSBuild.
884 _MSVSOnly(_link, 'OptimizeForWindows98', _newly_boolean)
885 _MSVSOnly(_link, 'UseUnicodeResponseFiles', _boolean)
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
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
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.
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
932 # MSBuild options not found in MSVS.
933 _MSBuildOnly(_rc, 'NullTerminateStrings', _boolean) # /n
934 _MSBuildOnly(_rc, 'TrackerLogDirectory', _folder_name)
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.
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
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
973 _Same(_midl, 'EnableErrorChecks',
974 _Enumeration(['EnableCustom',
975 'None', # /error none
976 'All'])) # /error all
977 _Same(_midl, 'StructMemberAlignment',
978 _Enumeration(['NotSet',
983 _Same(_midl, 'WarningLevel',
984 _Enumeration(['0', # /W0
990 _Renamed(_midl, 'DLLDataFileName', 'DllDataFileName', _file_name) # /dlldata
991 _Renamed(_midl, 'ValidateParameters', 'ValidateAllParameters',
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
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.
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)
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)
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)
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.
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
1069 # Options that have moved location.
1070 _MovedAndRenamed(_manifest, 'ManifestResourceFile',
1071 'ManifestResourceCompile',
1072 'ResourceOutputFileName',
1074 _Moved(_manifest, 'EmbedManifest', '', _boolean)
1076 # MSVS options not found in MSBuild.
1077 _MSVSOnly(_manifest, 'DependencyInformationFile', _file_name)
1078 _MSVSOnly(_manifest, 'UseFAT32Workaround', _boolean)
1079 _MSVSOnly(_manifest, 'UseUnicodeResponseFiles', _boolean)
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)
1091 # Directives for MASM.
1092 # See "$(VCTargetsPath)\BuildCustomizations\masm.xml" for the schema of the
1093 # MSBuild MASM settings.
1095 # Options that have the same name in MSVS and MSBuild.
1096 _Same(_masm, 'UseSafeExceptionHandlers', _boolean) # /safeseh