OLD | NEW |
1 # Copyright (c) 2012 Google Inc. All rights reserved. | 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 | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 r"""Code to validate and convert settings of the Microsoft build tools. | 5 r"""Code to validate and convert settings of the Microsoft build tools. |
6 | 6 |
7 This file contains code to validate and convert settings of the Microsoft | 7 This file contains code to validate and convert settings of the Microsoft |
8 build tools. The function ConvertToMSBuildSettings(), ValidateMSVSSettings(), | 8 build tools. The function ConvertToMSBuildSettings(), ValidateMSVSSettings(), |
9 and ValidateMSBuildSettings() are the entry points. | 9 and ValidateMSBuildSettings() are the entry points. |
10 | 10 |
11 This file was created by comparing the projects created by Visual Studio 2008 | 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. | 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 | 13 The MSBuild schemas were also considered. They are typically found in the |
14 MSBuild install directory, e.g. c:\Program Files (x86)\MSBuild | 14 MSBuild install directory, e.g. c:\Program Files (x86)\MSBuild |
15 """ | 15 """ |
16 | 16 |
| 17 from __future__ import print_function |
| 18 |
17 import sys | 19 import sys |
18 import re | 20 import re |
19 | 21 |
| 22 try: |
| 23 basestring = basestring |
| 24 except NameError: |
| 25 basestring = str |
| 26 |
20 # Dictionaries of settings validators. The key is the tool name, the value is | 27 # Dictionaries of settings validators. The key is the tool name, the value is |
21 # a dictionary mapping setting names to validation functions. | 28 # a dictionary mapping setting names to validation functions. |
22 _msvs_validators = {} | 29 _msvs_validators = {} |
23 _msbuild_validators = {} | 30 _msbuild_validators = {} |
24 | 31 |
25 | 32 |
26 # A dictionary of settings converters. The key is the tool name, the value is | 33 # A dictionary of settings converters. The key is the tool name, the value is |
27 # a dictionary mapping setting names to conversion functions. | 34 # a dictionary mapping setting names to conversion functions. |
28 _msvs_to_msbuild_converters = {} | 35 _msvs_to_msbuild_converters = {} |
29 | 36 |
(...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
393 # This may be unrecognized because it's an exclusion list. If the | 400 # This may be unrecognized because it's an exclusion list. If the |
394 # setting name has the _excluded suffix, then check the root name. | 401 # setting name has the _excluded suffix, then check the root name. |
395 unrecognized = True | 402 unrecognized = True |
396 m = re.match(_EXCLUDED_SUFFIX_RE, setting) | 403 m = re.match(_EXCLUDED_SUFFIX_RE, setting) |
397 if m: | 404 if m: |
398 root_setting = m.group(1) | 405 root_setting = m.group(1) |
399 unrecognized = root_setting not in settings | 406 unrecognized = root_setting not in settings |
400 | 407 |
401 if unrecognized: | 408 if unrecognized: |
402 # We don't know this setting. Give a warning. | 409 # We don't know this setting. Give a warning. |
403 print >> stderr, error_msg | 410 print(error_msg, file=stderr) |
404 | 411 |
405 | 412 |
406 def FixVCMacroSlashes(s): | 413 def FixVCMacroSlashes(s): |
407 """Replace macros which have excessive following slashes. | 414 """Replace macros which have excessive following slashes. |
408 | 415 |
409 These macros are known to have a built-in trailing slash. Furthermore, many | 416 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. | 417 scripts hiccup on processing paths with extra slashes in the middle. |
411 | 418 |
412 This list is probably not exhaustive. Add as needed. | 419 This list is probably not exhaustive. Add as needed. |
413 """ | 420 """ |
(...skipping 12 matching lines...) Expand all Loading... |
426 '$(ConfigurationName)': '$(Configuration)', | 433 '$(ConfigurationName)': '$(Configuration)', |
427 '$(InputDir)': '%(RelativeDir)', | 434 '$(InputDir)': '%(RelativeDir)', |
428 '$(InputExt)': '%(Extension)', | 435 '$(InputExt)': '%(Extension)', |
429 '$(InputFileName)': '%(Filename)%(Extension)', | 436 '$(InputFileName)': '%(Filename)%(Extension)', |
430 '$(InputName)': '%(Filename)', | 437 '$(InputName)': '%(Filename)', |
431 '$(InputPath)': '%(Identity)', | 438 '$(InputPath)': '%(Identity)', |
432 '$(ParentName)': '$(ProjectFileName)', | 439 '$(ParentName)': '$(ProjectFileName)', |
433 '$(PlatformName)': '$(Platform)', | 440 '$(PlatformName)': '$(Platform)', |
434 '$(SafeInputName)': '%(Filename)', | 441 '$(SafeInputName)': '%(Filename)', |
435 } | 442 } |
436 for old, new in replace_map.iteritems(): | 443 for old, new in replace_map.items(): |
437 s = s.replace(old, new) | 444 s = s.replace(old, new) |
438 s = FixVCMacroSlashes(s) | 445 s = FixVCMacroSlashes(s) |
439 return s | 446 return s |
440 | 447 |
441 | 448 |
442 def ConvertToMSBuildSettings(msvs_settings, stderr=sys.stderr): | 449 def ConvertToMSBuildSettings(msvs_settings, stderr=sys.stderr): |
443 """Converts MSVS settings (VS2008 and earlier) to MSBuild settings (VS2010+). | 450 """Converts MSVS settings (VS2008 and earlier) to MSBuild settings (VS2010+). |
444 | 451 |
445 Args: | 452 Args: |
446 msvs_settings: A dictionary. The key is the tool name. The values are | 453 msvs_settings: A dictionary. The key is the tool name. The values are |
447 themselves dictionaries of settings and their values. | 454 themselves dictionaries of settings and their values. |
448 stderr: The stream receiving the error messages. | 455 stderr: The stream receiving the error messages. |
449 | 456 |
450 Returns: | 457 Returns: |
451 A dictionary of MSBuild settings. The key is either the MSBuild tool name | 458 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 | 459 or the empty string (for the global settings). The values are themselves |
453 dictionaries of settings and their values. | 460 dictionaries of settings and their values. |
454 """ | 461 """ |
455 msbuild_settings = {} | 462 msbuild_settings = {} |
456 for msvs_tool_name, msvs_tool_settings in msvs_settings.iteritems(): | 463 for msvs_tool_name, msvs_tool_settings in msvs_settings.items(): |
457 if msvs_tool_name in _msvs_to_msbuild_converters: | 464 if msvs_tool_name in _msvs_to_msbuild_converters: |
458 msvs_tool = _msvs_to_msbuild_converters[msvs_tool_name] | 465 msvs_tool = _msvs_to_msbuild_converters[msvs_tool_name] |
459 for msvs_setting, msvs_value in msvs_tool_settings.iteritems(): | 466 for msvs_setting, msvs_value in msvs_tool_settings.items(): |
460 if msvs_setting in msvs_tool: | 467 if msvs_setting in msvs_tool: |
461 # Invoke the translation function. | 468 # Invoke the translation function. |
462 try: | 469 try: |
463 msvs_tool[msvs_setting](msvs_value, msbuild_settings) | 470 msvs_tool[msvs_setting](msvs_value, msbuild_settings) |
464 except ValueError, e: | 471 except ValueError as e: |
465 print >> stderr, ('Warning: while converting %s/%s to MSBuild, ' | 472 print(('Warning: while converting %s/%s to MSBuild, ' |
466 '%s' % (msvs_tool_name, msvs_setting, e)) | 473 '%s' % (msvs_tool_name, msvs_setting, e)), |
| 474 file=stderr) |
467 else: | 475 else: |
468 _ValidateExclusionSetting(msvs_setting, | 476 _ValidateExclusionSetting(msvs_setting, |
469 msvs_tool, | 477 msvs_tool, |
470 ('Warning: unrecognized setting %s/%s ' | 478 ('Warning: unrecognized setting %s/%s ' |
471 'while converting to MSBuild.' % | 479 'while converting to MSBuild.' % |
472 (msvs_tool_name, msvs_setting)), | 480 (msvs_tool_name, msvs_setting)), |
473 stderr) | 481 stderr) |
474 else: | 482 else: |
475 print >> stderr, ('Warning: unrecognized tool %s while converting to ' | 483 print(('Warning: unrecognized tool %s while converting to ' |
476 'MSBuild.' % msvs_tool_name) | 484 'MSBuild.' % msvs_tool_name), file=stderr) |
477 return msbuild_settings | 485 return msbuild_settings |
478 | 486 |
479 | 487 |
480 def ValidateMSVSSettings(settings, stderr=sys.stderr): | 488 def ValidateMSVSSettings(settings, stderr=sys.stderr): |
481 """Validates that the names of the settings are valid for MSVS. | 489 """Validates that the names of the settings are valid for MSVS. |
482 | 490 |
483 Args: | 491 Args: |
484 settings: A dictionary. The key is the tool name. The values are | 492 settings: A dictionary. The key is the tool name. The values are |
485 themselves dictionaries of settings and their values. | 493 themselves dictionaries of settings and their values. |
486 stderr: The stream receiving the error messages. | 494 stderr: The stream receiving the error messages. |
(...skipping 19 matching lines...) Expand all Loading... |
506 | 514 |
507 Args: | 515 Args: |
508 validators: A dictionary of tools and their validators. | 516 validators: A dictionary of tools and their validators. |
509 settings: A dictionary. The key is the tool name. The values are | 517 settings: A dictionary. The key is the tool name. The values are |
510 themselves dictionaries of settings and their values. | 518 themselves dictionaries of settings and their values. |
511 stderr: The stream receiving the error messages. | 519 stderr: The stream receiving the error messages. |
512 """ | 520 """ |
513 for tool_name in settings: | 521 for tool_name in settings: |
514 if tool_name in validators: | 522 if tool_name in validators: |
515 tool_validators = validators[tool_name] | 523 tool_validators = validators[tool_name] |
516 for setting, value in settings[tool_name].iteritems(): | 524 for setting, value in settings[tool_name].items(): |
517 if setting in tool_validators: | 525 if setting in tool_validators: |
518 try: | 526 try: |
519 tool_validators[setting](value) | 527 tool_validators[setting](value) |
520 except ValueError, e: | 528 except ValueError as e: |
521 print >> stderr, ('Warning: for %s/%s, %s' % | 529 print(('Warning: for %s/%s, %s' % |
522 (tool_name, setting, e)) | 530 (tool_name, setting, e)), file=stderr) |
523 else: | 531 else: |
524 _ValidateExclusionSetting(setting, | 532 _ValidateExclusionSetting(setting, |
525 tool_validators, | 533 tool_validators, |
526 ('Warning: unrecognized setting %s/%s' % | 534 ('Warning: unrecognized setting %s/%s' % |
527 (tool_name, setting)), | 535 (tool_name, setting)), |
528 stderr) | 536 stderr) |
529 | 537 |
530 else: | 538 else: |
531 print >> stderr, ('Warning: unrecognized tool %s' % tool_name) | 539 print(('Warning: unrecognized tool %s' % tool_name), file=stderr) |
532 | 540 |
533 | 541 |
534 # MSVS and MBuild names of the tools. | 542 # MSVS and MBuild names of the tools. |
535 _compile = _Tool('VCCLCompilerTool', 'ClCompile') | 543 _compile = _Tool('VCCLCompilerTool', 'ClCompile') |
536 _link = _Tool('VCLinkerTool', 'Link') | 544 _link = _Tool('VCLinkerTool', 'Link') |
537 _midl = _Tool('VCMIDLTool', 'Midl') | 545 _midl = _Tool('VCMIDLTool', 'Midl') |
538 _rc = _Tool('VCResourceCompilerTool', 'ResourceCompile') | 546 _rc = _Tool('VCResourceCompilerTool', 'ResourceCompile') |
539 _lib = _Tool('VCLibrarianTool', 'Lib') | 547 _lib = _Tool('VCLibrarianTool', 'Lib') |
540 _manifest = _Tool('VCManifestTool', 'Manifest') | 548 _manifest = _Tool('VCManifestTool', 'Manifest') |
541 _masm = _Tool('MASM', 'MASM') | 549 _masm = _Tool('MASM', 'MASM') |
(...skipping 545 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1087 _MSBuildOnly(_manifest, 'SuppressDependencyElement', _boolean) # /nodependency | 1095 _MSBuildOnly(_manifest, 'SuppressDependencyElement', _boolean) # /nodependency |
1088 _MSBuildOnly(_manifest, 'TrackerLogDirectory', _folder_name) | 1096 _MSBuildOnly(_manifest, 'TrackerLogDirectory', _folder_name) |
1089 | 1097 |
1090 | 1098 |
1091 # Directives for MASM. | 1099 # Directives for MASM. |
1092 # See "$(VCTargetsPath)\BuildCustomizations\masm.xml" for the schema of the | 1100 # See "$(VCTargetsPath)\BuildCustomizations\masm.xml" for the schema of the |
1093 # MSBuild MASM settings. | 1101 # MSBuild MASM settings. |
1094 | 1102 |
1095 # Options that have the same name in MSVS and MSBuild. | 1103 # Options that have the same name in MSVS and MSBuild. |
1096 _Same(_masm, 'UseSafeExceptionHandlers', _boolean) # /safeseh | 1104 _Same(_masm, 'UseSafeExceptionHandlers', _boolean) # /safeseh |
OLD | NEW |