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