Chromium Code Reviews| 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 import copy | 5 import copy |
| 6 import ntpath | 6 import ntpath |
| 7 import os | 7 import os |
| 8 import posixpath | 8 import posixpath |
| 9 import re | 9 import re |
| 10 import subprocess | 10 import subprocess |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 56 | 56 |
| 57 # The msvs specific sections that hold paths | 57 # The msvs specific sections that hold paths |
| 58 generator_additional_path_sections = [ | 58 generator_additional_path_sections = [ |
| 59 'msvs_cygwin_dirs', | 59 'msvs_cygwin_dirs', |
| 60 'msvs_props', | 60 'msvs_props', |
| 61 ] | 61 ] |
| 62 | 62 |
| 63 | 63 |
| 64 generator_additional_non_configuration_keys = [ | 64 generator_additional_non_configuration_keys = [ |
| 65 'msvs_cygwin_dirs', | 65 'msvs_cygwin_dirs', |
| 66 'msvs_ninja_out_dir', | |
| 66 'msvs_cygwin_shell', | 67 'msvs_cygwin_shell', |
| 67 'msvs_large_pdb', | 68 'msvs_large_pdb', |
| 68 'msvs_shard', | 69 'msvs_shard', |
| 69 ] | 70 ] |
| 70 | 71 |
| 71 | 72 |
| 72 # List of precompiled header related keys. | 73 # List of precompiled header related keys. |
| 73 precomp_keys = [ | 74 precomp_keys = [ |
| 74 'msvs_precompiled_header', | 75 'msvs_precompiled_header', |
| 75 'msvs_precompiled_source', | 76 'msvs_precompiled_source', |
| (...skipping 826 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 902 | 903 |
| 903 platforms = _GetUniquePlatforms(spec) | 904 platforms = _GetUniquePlatforms(spec) |
| 904 p = MSVSProject.Writer(project.path, version, spec['target_name'], | 905 p = MSVSProject.Writer(project.path, version, spec['target_name'], |
| 905 project.guid, platforms) | 906 project.guid, platforms) |
| 906 | 907 |
| 907 # Get directory project file is in. | 908 # Get directory project file is in. |
| 908 project_dir = os.path.split(project.path)[0] | 909 project_dir = os.path.split(project.path)[0] |
| 909 gyp_path = _NormalizedSource(project.build_file) | 910 gyp_path = _NormalizedSource(project.build_file) |
| 910 relative_path_of_gyp_file = gyp.common.RelativePath(gyp_path, project_dir) | 911 relative_path_of_gyp_file = gyp.common.RelativePath(gyp_path, project_dir) |
| 911 | 912 |
| 912 config_type = _GetMSVSConfigurationType(spec, project.build_file) | 913 config_type = _GetMSVSConfigurationType(spec, project.build_file, None) |
| 913 for config_name, config in spec['configurations'].iteritems(): | 914 for config_name, config in spec['configurations'].iteritems(): |
| 914 _AddConfigurationToMSVSProject(p, spec, config_type, config_name, config) | 915 _AddConfigurationToMSVSProject(p, spec, config_type, config_name, config) |
| 915 | 916 |
| 916 # Prepare list of sources and excluded sources. | 917 # Prepare list of sources and excluded sources. |
| 917 gyp_file = os.path.split(project.build_file)[1] | 918 gyp_file = os.path.split(project.build_file)[1] |
| 918 sources, excluded_sources = _PrepareListOfSources(spec, generator_flags, | 919 sources, excluded_sources = _PrepareListOfSources(spec, generator_flags, |
| 919 gyp_file) | 920 gyp_file) |
| 920 | 921 |
| 921 # Add rules. | 922 # Add rules. |
| 922 actions_to_add = {} | 923 actions_to_add = {} |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 979 Returns: | 980 Returns: |
| 980 The MSVSUserFile object created. | 981 The MSVSUserFile object created. |
| 981 """ | 982 """ |
| 982 (domain, username) = _GetDomainAndUserName() | 983 (domain, username) = _GetDomainAndUserName() |
| 983 vcuser_filename = '.'.join([proj_path, domain, username, 'user']) | 984 vcuser_filename = '.'.join([proj_path, domain, username, 'user']) |
| 984 user_file = MSVSUserFile.Writer(vcuser_filename, version, | 985 user_file = MSVSUserFile.Writer(vcuser_filename, version, |
| 985 spec['target_name']) | 986 spec['target_name']) |
| 986 return user_file | 987 return user_file |
| 987 | 988 |
| 988 | 989 |
| 989 def _GetMSVSConfigurationType(spec, build_file): | 990 def _GetMSVSConfigurationType(spec, build_file, external_builder): |
| 990 """Returns the configuration type for this project. | 991 """Returns the configuration type for this project. |
| 991 | 992 |
| 992 It's a number defined by Microsoft. May raise an exception. | 993 It's a number defined by Microsoft. May raise an exception. |
| 993 | 994 |
| 994 Args: | 995 Args: |
| 995 spec: The target dictionary containing the properties of the target. | 996 spec: The target dictionary containing the properties of the target. |
| 996 build_file: The path of the gyp file. | 997 build_file: The path of the gyp file. |
| 998 external_builder: The external builder specified in the generator flags. | |
| 997 Returns: | 999 Returns: |
| 998 An integer, the configuration type. | 1000 An integer, the configuration type. |
| 999 """ | 1001 """ |
| 1002 if external_builder != None: | |
| 1003 return '10' # Utility type | |
| 1000 try: | 1004 try: |
| 1001 config_type = { | 1005 config_type = { |
| 1002 'executable': '1', # .exe | 1006 'executable': '1', # .exe |
| 1003 'shared_library': '2', # .dll | 1007 'shared_library': '2', # .dll |
| 1004 'loadable_module': '2', # .dll | 1008 'loadable_module': '2', # .dll |
| 1005 'static_library': '4', # .lib | 1009 'static_library': '4', # .lib |
| 1006 'none': '10', # Utility type | 1010 'none': '10', # Utility type |
| 1007 }[spec['type']] | 1011 }[spec['type']] |
| 1008 except KeyError: | 1012 except KeyError: |
| 1009 if spec.get('type'): | 1013 if spec.get('type'): |
| (...skipping 639 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1649 config_platform_overrides = {} | 1653 config_platform_overrides = {} |
| 1650 for config_name, c in spec['configurations'].iteritems(): | 1654 for config_name, c in spec['configurations'].iteritems(): |
| 1651 config_fullname = _ConfigFullName(config_name, c) | 1655 config_fullname = _ConfigFullName(config_name, c) |
| 1652 platform = c.get('msvs_target_platform', _ConfigPlatform(c)) | 1656 platform = c.get('msvs_target_platform', _ConfigPlatform(c)) |
| 1653 fixed_config_fullname = '%s|%s' % ( | 1657 fixed_config_fullname = '%s|%s' % ( |
| 1654 _ConfigBaseName(config_name, _ConfigPlatform(c)), platform) | 1658 _ConfigBaseName(config_name, _ConfigPlatform(c)), platform) |
| 1655 config_platform_overrides[config_fullname] = fixed_config_fullname | 1659 config_platform_overrides[config_fullname] = fixed_config_fullname |
| 1656 return config_platform_overrides | 1660 return config_platform_overrides |
| 1657 | 1661 |
| 1658 | 1662 |
| 1659 def _CreateProjectObjects(target_list, target_dicts, options, msvs_version): | 1663 def _CreateProjectObjects(target_list, target_dicts, options, msvs_version, |
| 1664 set_dependencies): | |
| 1660 """Create a MSVSProject object for the targets found in target list. | 1665 """Create a MSVSProject object for the targets found in target list. |
| 1661 | 1666 |
| 1662 Arguments: | 1667 Arguments: |
| 1663 target_list: the list of targets to generate project objects for. | 1668 target_list: the list of targets to generate project objects for. |
| 1664 target_dicts: the dictionary of specifications. | 1669 target_dicts: the dictionary of specifications. |
| 1665 options: global generator options. | 1670 options: global generator options. |
| 1666 msvs_version: the MSVSVersion object. | 1671 msvs_version: the MSVSVersion object. |
| 1672 set_dependencies: flag to control whether to set dependencies or not. | |
| 1667 Returns: | 1673 Returns: |
| 1668 A set of created projects, keyed by target. | 1674 A set of created projects, keyed by target. |
| 1669 """ | 1675 """ |
| 1670 global fixpath_prefix | 1676 global fixpath_prefix |
| 1671 # Generate each project. | 1677 # Generate each project. |
| 1672 projects = {} | 1678 projects = {} |
| 1673 for qualified_target in target_list: | 1679 for qualified_target in target_list: |
| 1674 spec = target_dicts[qualified_target] | 1680 spec = target_dicts[qualified_target] |
| 1675 if spec['toolset'] != 'target': | 1681 if spec['toolset'] != 'target': |
| 1676 raise GypError( | 1682 raise GypError( |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 1688 guid=guid, | 1694 guid=guid, |
| 1689 spec=spec, | 1695 spec=spec, |
| 1690 build_file=build_file, | 1696 build_file=build_file, |
| 1691 config_platform_overrides=overrides, | 1697 config_platform_overrides=overrides, |
| 1692 fixpath_prefix=fixpath_prefix) | 1698 fixpath_prefix=fixpath_prefix) |
| 1693 # Set project toolset if any (MS build only) | 1699 # Set project toolset if any (MS build only) |
| 1694 if msvs_version.UsesVcxproj(): | 1700 if msvs_version.UsesVcxproj(): |
| 1695 obj.set_msbuild_toolset( | 1701 obj.set_msbuild_toolset( |
| 1696 _GetMsbuildToolsetOfProject(proj_path, spec, msvs_version)) | 1702 _GetMsbuildToolsetOfProject(proj_path, spec, msvs_version)) |
| 1697 projects[qualified_target] = obj | 1703 projects[qualified_target] = obj |
| 1698 # Set all the dependencies | 1704 |
| 1699 for project in projects.values(): | 1705 if set_dependencies: |
| 1700 deps = project.spec.get('dependencies', []) | 1706 # Set all the dependencies |
| 1701 deps = [projects[d] for d in deps] | 1707 for project in projects.values(): |
| 1702 project.set_dependencies(deps) | 1708 deps = project.spec.get('dependencies', []) |
| 1709 deps = [projects[d] for d in deps] | |
| 1710 project.set_dependencies(deps) | |
| 1703 return projects | 1711 return projects |
| 1704 | 1712 |
| 1705 | 1713 |
| 1706 def CalculateVariables(default_variables, params): | 1714 def CalculateVariables(default_variables, params): |
| 1707 """Generated variables that require params to be known.""" | 1715 """Generated variables that require params to be known.""" |
| 1708 | 1716 |
| 1709 generator_flags = params.get('generator_flags', {}) | 1717 generator_flags = params.get('generator_flags', {}) |
| 1710 | 1718 |
| 1711 # Select project file format version (if unset, default to auto detecting). | 1719 # Select project file format version (if unset, default to auto detecting). |
| 1712 msvs_version = MSVSVersion.SelectVisualStudioVersion( | 1720 msvs_version = MSVSVersion.SelectVisualStudioVersion( |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1775 target_list, target_dicts, generator_default_variables) | 1783 target_list, target_dicts, generator_default_variables) |
| 1776 | 1784 |
| 1777 # Prepare the set of configurations. | 1785 # Prepare the set of configurations. |
| 1778 configs = set() | 1786 configs = set() |
| 1779 for qualified_target in target_list: | 1787 for qualified_target in target_list: |
| 1780 spec = target_dicts[qualified_target] | 1788 spec = target_dicts[qualified_target] |
| 1781 for config_name, config in spec['configurations'].iteritems(): | 1789 for config_name, config in spec['configurations'].iteritems(): |
| 1782 configs.add(_ConfigFullName(config_name, config)) | 1790 configs.add(_ConfigFullName(config_name, config)) |
| 1783 configs = list(configs) | 1791 configs = list(configs) |
| 1784 | 1792 |
| 1785 # Figure out all the projects that will be generated and their guids | 1793 # Figure out all the projects that will be generated and their guids, but |
| 1794 # don't set dependencies if we are using an external builder like ninja | |
| 1795 set_dependencies = generator_flags.get('msvs_external_builder', None) == None | |
| 1786 project_objects = _CreateProjectObjects(target_list, target_dicts, options, | 1796 project_objects = _CreateProjectObjects(target_list, target_dicts, options, |
| 1787 msvs_version) | 1797 msvs_version, set_dependencies) |
| 1788 | 1798 |
| 1789 # Generate each project. | 1799 # Generate each project. |
| 1790 missing_sources = [] | 1800 missing_sources = [] |
| 1791 for project in project_objects.values(): | 1801 for project in project_objects.values(): |
| 1792 fixpath_prefix = project.fixpath_prefix | 1802 fixpath_prefix = project.fixpath_prefix |
| 1793 missing_sources.extend(_GenerateProject(project, options, msvs_version, | 1803 missing_sources.extend(_GenerateProject(project, options, msvs_version, |
| 1794 generator_flags)) | 1804 generator_flags)) |
| 1795 fixpath_prefix = None | 1805 fixpath_prefix = None |
| 1796 | 1806 |
| 1797 for build_file in data: | 1807 for build_file in data: |
| (...skipping 621 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2419 namespace = os.path.splitext(gyp_file_name)[0] | 2429 namespace = os.path.splitext(gyp_file_name)[0] |
| 2420 return [ | 2430 return [ |
| 2421 ['PropertyGroup', {'Label': 'Globals'}, | 2431 ['PropertyGroup', {'Label': 'Globals'}, |
| 2422 ['ProjectGuid', guid], | 2432 ['ProjectGuid', guid], |
| 2423 ['Keyword', 'Win32Proj'], | 2433 ['Keyword', 'Win32Proj'], |
| 2424 ['RootNamespace', namespace], | 2434 ['RootNamespace', namespace], |
| 2425 ] | 2435 ] |
| 2426 ] | 2436 ] |
| 2427 | 2437 |
| 2428 | 2438 |
| 2429 def _GetMSBuildConfigurationDetails(spec, build_file): | 2439 def _GetMSBuildConfigurationDetails(spec, build_file, external_builder): |
| 2430 properties = {} | 2440 properties = {} |
| 2431 for name, settings in spec['configurations'].iteritems(): | 2441 for name, settings in spec['configurations'].iteritems(): |
| 2432 msbuild_attributes = _GetMSBuildAttributes(spec, settings, build_file) | 2442 msbuild_attributes = _GetMSBuildAttributes(spec, settings, build_file, |
| 2443 external_builder) | |
| 2433 condition = _GetConfigurationCondition(name, settings) | 2444 condition = _GetConfigurationCondition(name, settings) |
| 2434 character_set = msbuild_attributes.get('CharacterSet') | 2445 character_set = msbuild_attributes.get('CharacterSet') |
| 2435 _AddConditionalProperty(properties, condition, 'ConfigurationType', | 2446 _AddConditionalProperty(properties, condition, 'ConfigurationType', |
| 2436 msbuild_attributes['ConfigurationType']) | 2447 msbuild_attributes['ConfigurationType']) |
| 2437 if character_set: | 2448 if character_set: |
| 2438 _AddConditionalProperty(properties, condition, 'CharacterSet', | 2449 _AddConditionalProperty(properties, condition, 'CharacterSet', |
| 2439 character_set) | 2450 character_set) |
| 2440 return _GetMSBuildPropertyGroup(spec, 'Configuration', properties) | 2451 return _GetMSBuildPropertyGroup(spec, 'Configuration', properties) |
| 2441 | 2452 |
| 2442 | 2453 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2489 'Condition': "exists('%s')" % user_props, | 2500 'Condition': "exists('%s')" % user_props, |
| 2490 'Label': 'LocalAppDataPlatform' | 2501 'Label': 'LocalAppDataPlatform' |
| 2491 } | 2502 } |
| 2492 ] | 2503 ] |
| 2493 ] | 2504 ] |
| 2494 for props_file in props: | 2505 for props_file in props: |
| 2495 import_group.append(['Import', {'Project':props_file}]) | 2506 import_group.append(['Import', {'Project':props_file}]) |
| 2496 sheets.append(import_group) | 2507 sheets.append(import_group) |
| 2497 return sheets | 2508 return sheets |
| 2498 | 2509 |
| 2499 def _ConvertMSVSBuildAttributes(spec, config, build_file): | 2510 def _ConvertMSVSBuildAttributes(spec, config, build_file, external_builder): |
| 2500 config_type = _GetMSVSConfigurationType(spec, build_file) | 2511 config_type = _GetMSVSConfigurationType(spec, build_file, external_builder) |
| 2501 msvs_attributes = _GetMSVSAttributes(spec, config, config_type) | 2512 msvs_attributes = _GetMSVSAttributes(spec, config, config_type) |
| 2502 msbuild_attributes = {} | 2513 msbuild_attributes = {} |
| 2503 for a in msvs_attributes: | 2514 for a in msvs_attributes: |
| 2504 if a in ['IntermediateDirectory', 'OutputDirectory']: | 2515 if a in ['IntermediateDirectory', 'OutputDirectory']: |
| 2505 directory = MSVSSettings.ConvertVCMacrosToMSBuild(msvs_attributes[a]) | 2516 directory = MSVSSettings.ConvertVCMacrosToMSBuild(msvs_attributes[a]) |
| 2506 if not directory.endswith('\\'): | 2517 if not directory.endswith('\\'): |
| 2507 directory += '\\' | 2518 directory += '\\' |
| 2508 msbuild_attributes[a] = directory | 2519 msbuild_attributes[a] = directory |
| 2509 elif a == 'CharacterSet': | 2520 elif a == 'CharacterSet': |
| 2510 msbuild_attributes[a] = _ConvertMSVSCharacterSet(msvs_attributes[a]) | 2521 msbuild_attributes[a] = _ConvertMSVSCharacterSet(msvs_attributes[a]) |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 2529 if config_type.isdigit(): | 2540 if config_type.isdigit(): |
| 2530 config_type = { | 2541 config_type = { |
| 2531 '1': 'Application', | 2542 '1': 'Application', |
| 2532 '2': 'DynamicLibrary', | 2543 '2': 'DynamicLibrary', |
| 2533 '4': 'StaticLibrary', | 2544 '4': 'StaticLibrary', |
| 2534 '10': 'Utility' | 2545 '10': 'Utility' |
| 2535 }[config_type] | 2546 }[config_type] |
| 2536 return config_type | 2547 return config_type |
| 2537 | 2548 |
| 2538 | 2549 |
| 2539 def _GetMSBuildAttributes(spec, config, build_file): | 2550 def _GetMSBuildAttributes(spec, config, build_file, external_builder): |
| 2540 if 'msbuild_configuration_attributes' not in config: | 2551 if 'msbuild_configuration_attributes' not in config: |
| 2541 msbuild_attributes = _ConvertMSVSBuildAttributes(spec, config, build_file) | 2552 msbuild_attributes = _ConvertMSVSBuildAttributes(spec, config, build_file, |
| 2542 | 2553 external_builder) |
| 2543 else: | 2554 else: |
| 2544 config_type = _GetMSVSConfigurationType(spec, build_file) | 2555 config_type = _GetMSVSConfigurationType(spec, build_file, external_builder) |
| 2545 config_type = _ConvertMSVSConfigurationType(config_type) | 2556 config_type = _ConvertMSVSConfigurationType(config_type) |
| 2546 msbuild_attributes = config.get('msbuild_configuration_attributes', {}) | 2557 msbuild_attributes = config.get('msbuild_configuration_attributes', {}) |
| 2547 msbuild_attributes.setdefault('ConfigurationType', config_type) | 2558 msbuild_attributes.setdefault('ConfigurationType', config_type) |
| 2548 output_dir = msbuild_attributes.get('OutputDirectory', | 2559 output_dir = msbuild_attributes.get('OutputDirectory', |
| 2549 '$(SolutionDir)$(Configuration)') | 2560 '$(SolutionDir)$(Configuration)') |
| 2550 msbuild_attributes['OutputDirectory'] = _FixPath(output_dir) + '\\' | 2561 msbuild_attributes['OutputDirectory'] = _FixPath(output_dir) + '\\' |
| 2551 if 'IntermediateDirectory' not in msbuild_attributes: | 2562 if 'IntermediateDirectory' not in msbuild_attributes: |
| 2552 intermediate = _FixPath('$(Configuration)') + '\\' | 2563 intermediate = _FixPath('$(Configuration)') + '\\' |
| 2553 msbuild_attributes['IntermediateDirectory'] = intermediate | 2564 msbuild_attributes['IntermediateDirectory'] = intermediate |
| 2554 if 'CharacterSet' in msbuild_attributes: | 2565 if 'CharacterSet' in msbuild_attributes: |
| 2555 msbuild_attributes['CharacterSet'] = _ConvertMSVSCharacterSet( | 2566 msbuild_attributes['CharacterSet'] = _ConvertMSVSCharacterSet( |
| 2556 msbuild_attributes['CharacterSet']) | 2567 msbuild_attributes['CharacterSet']) |
| 2557 if 'TargetName' not in msbuild_attributes: | 2568 if 'TargetName' not in msbuild_attributes: |
| 2558 prefix = spec.get('product_prefix', '') | 2569 prefix = spec.get('product_prefix', '') |
| 2559 product_name = spec.get('product_name', '$(ProjectName)') | 2570 product_name = spec.get('product_name', '$(ProjectName)') |
| 2560 target_name = prefix + product_name | 2571 target_name = prefix + product_name |
| 2561 msbuild_attributes['TargetName'] = target_name | 2572 msbuild_attributes['TargetName'] = target_name |
| 2562 | 2573 |
| 2574 if external_builder == 'ninja': | |
|
scottmg
2013/04/15 19:37:58
it feels a bit odd to try to genericize to "extern
Dirk Pranke
2013/04/16 00:41:04
Maybe we should at least validate the value of ext
| |
| 2575 ninja_out_dir = spec.get('msvs_ninja_out_dir', '.') + '/$(Configuration)' | |
| 2576 msbuild_attributes['OutputDirectory'] = _FixPath(ninja_out_dir) + '\\' | |
| 2577 | |
| 2563 # Make sure that 'TargetPath' matches 'Lib.OutputFile' or 'Link.OutputFile' | 2578 # Make sure that 'TargetPath' matches 'Lib.OutputFile' or 'Link.OutputFile' |
| 2564 # (depending on the tool used) to avoid MSB8012 warning. | 2579 # (depending on the tool used) to avoid MSB8012 warning. |
| 2565 msbuild_tool_map = { | 2580 msbuild_tool_map = { |
| 2566 'executable': 'Link', | 2581 'executable': 'Link', |
| 2567 'shared_library': 'Link', | 2582 'shared_library': 'Link', |
| 2568 'loadable_module': 'Link', | 2583 'loadable_module': 'Link', |
| 2569 'static_library': 'Lib', | 2584 'static_library': 'Lib', |
| 2570 } | 2585 } |
| 2571 msbuild_tool = msbuild_tool_map.get(spec['type']) | 2586 msbuild_tool = msbuild_tool_map.get(spec['type']) |
| 2572 if msbuild_tool: | 2587 if msbuild_tool: |
| 2573 msbuild_settings = config['finalized_msbuild_settings'] | 2588 msbuild_settings = config['finalized_msbuild_settings'] |
| 2574 out_file = msbuild_settings[msbuild_tool].get('OutputFile') | 2589 out_file = msbuild_settings[msbuild_tool].get('OutputFile') |
| 2575 if out_file: | 2590 if out_file: |
| 2576 msbuild_attributes['TargetPath'] = _FixPath(out_file) | 2591 msbuild_attributes['TargetPath'] = _FixPath(out_file) |
| 2577 | 2592 |
| 2578 return msbuild_attributes | 2593 return msbuild_attributes |
| 2579 | 2594 |
| 2580 | 2595 |
| 2581 def _GetMSBuildConfigurationGlobalProperties(spec, configurations, build_file): | 2596 def _GetMSBuildConfigurationGlobalProperties(spec, configurations, build_file, |
| 2597 external_builder): | |
| 2582 # TODO(jeanluc) We could optimize out the following and do it only if | 2598 # TODO(jeanluc) We could optimize out the following and do it only if |
| 2583 # there are actions. | 2599 # there are actions. |
| 2584 # TODO(jeanluc) Handle the equivalent of setting 'CYGWIN=nontsec'. | 2600 # TODO(jeanluc) Handle the equivalent of setting 'CYGWIN=nontsec'. |
| 2585 new_paths = [] | 2601 new_paths = [] |
| 2586 cygwin_dirs = spec.get('msvs_cygwin_dirs', ['.'])[0] | 2602 cygwin_dirs = spec.get('msvs_cygwin_dirs', ['.'])[0] |
| 2587 if cygwin_dirs: | 2603 if cygwin_dirs: |
| 2588 cyg_path = '$(MSBuildProjectDirectory)\\%s\\bin\\' % _FixPath(cygwin_dirs) | 2604 cyg_path = '$(MSBuildProjectDirectory)\\%s\\bin\\' % _FixPath(cygwin_dirs) |
| 2589 new_paths.append(cyg_path) | 2605 new_paths.append(cyg_path) |
| 2590 # TODO(jeanluc) Change the convention to have both a cygwin_dir and a | 2606 # TODO(jeanluc) Change the convention to have both a cygwin_dir and a |
| 2591 # python_dir. | 2607 # python_dir. |
| 2592 python_path = cyg_path.replace('cygwin\\bin', 'python_26') | 2608 python_path = cyg_path.replace('cygwin\\bin', 'python_26') |
| 2593 new_paths.append(python_path) | 2609 new_paths.append(python_path) |
| 2594 if new_paths: | 2610 if new_paths: |
| 2595 new_paths = '$(ExecutablePath);' + ';'.join(new_paths) | 2611 new_paths = '$(ExecutablePath);' + ';'.join(new_paths) |
| 2596 | 2612 |
| 2597 properties = {} | 2613 properties = {} |
| 2598 for (name, configuration) in sorted(configurations.iteritems()): | 2614 for (name, configuration) in sorted(configurations.iteritems()): |
| 2599 condition = _GetConfigurationCondition(name, configuration) | 2615 condition = _GetConfigurationCondition(name, configuration) |
| 2600 attributes = _GetMSBuildAttributes(spec, configuration, build_file) | 2616 attributes = _GetMSBuildAttributes(spec, configuration, build_file, |
| 2617 external_builder) | |
| 2601 msbuild_settings = configuration['finalized_msbuild_settings'] | 2618 msbuild_settings = configuration['finalized_msbuild_settings'] |
| 2602 _AddConditionalProperty(properties, condition, 'IntDir', | 2619 _AddConditionalProperty(properties, condition, 'IntDir', |
| 2603 attributes['IntermediateDirectory']) | 2620 attributes['IntermediateDirectory']) |
| 2604 _AddConditionalProperty(properties, condition, 'OutDir', | 2621 _AddConditionalProperty(properties, condition, 'OutDir', |
| 2605 attributes['OutputDirectory']) | 2622 attributes['OutputDirectory']) |
| 2606 _AddConditionalProperty(properties, condition, 'TargetName', | 2623 _AddConditionalProperty(properties, condition, 'TargetName', |
| 2607 attributes['TargetName']) | 2624 attributes['TargetName']) |
| 2608 | 2625 |
| 2626 if external_builder != None: | |
|
Dirk Pranke
2013/04/16 00:41:04
Nit: this can probably be just 'if external_builde
| |
| 2627 # External builders are Utility projects, so we need to explicitly | |
| 2628 # specify the target extension, based on the spec's type. | |
| 2629 ext_map = { | |
| 2630 'executable': '.exe', | |
| 2631 'shared_library': '.dll', | |
| 2632 'loadable_module': '.dll', | |
|
scottmg
2013/04/15 19:37:58
this looks a lot like the table in MSVSUtil.py, co
| |
| 2633 'static_library': '.lib', | |
| 2634 } | |
| 2635 ext = ext_map.get(spec['type']) | |
| 2636 if ext: | |
| 2637 _AddConditionalProperty(properties, condition, 'TargetExt', ext) | |
| 2638 | |
| 2609 if attributes.get('TargetPath'): | 2639 if attributes.get('TargetPath'): |
| 2610 _AddConditionalProperty(properties, condition, 'TargetPath', | 2640 _AddConditionalProperty(properties, condition, 'TargetPath', |
| 2611 attributes['TargetPath']) | 2641 attributes['TargetPath']) |
| 2612 | 2642 |
| 2613 if new_paths: | 2643 if new_paths: |
| 2614 _AddConditionalProperty(properties, condition, 'ExecutablePath', | 2644 _AddConditionalProperty(properties, condition, 'ExecutablePath', |
| 2615 new_paths) | 2645 new_paths) |
| 2616 tool_settings = msbuild_settings.get('', {}) | 2646 tool_settings = msbuild_settings.get('', {}) |
| 2617 for name, value in sorted(tool_settings.iteritems()): | 2647 for name, value in sorted(tool_settings.iteritems()): |
| 2618 formatted_value = _GetValueFormattedForMSBuild('', name, value) | 2648 formatted_value = _GetValueFormattedForMSBuild('', name, value) |
| (...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2942 spec = project.spec | 2972 spec = project.spec |
| 2943 configurations = spec['configurations'] | 2973 configurations = spec['configurations'] |
| 2944 project_dir, project_file_name = os.path.split(project.path) | 2974 project_dir, project_file_name = os.path.split(project.path) |
| 2945 msbuildproj_dir = os.path.dirname(project.path) | 2975 msbuildproj_dir = os.path.dirname(project.path) |
| 2946 if msbuildproj_dir and not os.path.exists(msbuildproj_dir): | 2976 if msbuildproj_dir and not os.path.exists(msbuildproj_dir): |
| 2947 os.makedirs(msbuildproj_dir) | 2977 os.makedirs(msbuildproj_dir) |
| 2948 # Prepare list of sources and excluded sources. | 2978 # Prepare list of sources and excluded sources. |
| 2949 gyp_path = _NormalizedSource(project.build_file) | 2979 gyp_path = _NormalizedSource(project.build_file) |
| 2950 relative_path_of_gyp_file = gyp.common.RelativePath(gyp_path, project_dir) | 2980 relative_path_of_gyp_file = gyp.common.RelativePath(gyp_path, project_dir) |
| 2951 | 2981 |
| 2982 external_builder = generator_flags.get('msvs_external_builder', None) | |
|
Dirk Pranke
2013/04/16 00:41:04
Nit: we should verify that external_builder == 'ni
| |
| 2983 | |
| 2952 gyp_file = os.path.split(project.build_file)[1] | 2984 gyp_file = os.path.split(project.build_file)[1] |
| 2953 sources, excluded_sources = _PrepareListOfSources(spec, generator_flags, | 2985 sources, excluded_sources = _PrepareListOfSources(spec, generator_flags, |
| 2954 gyp_file) | 2986 gyp_file) |
| 2955 # Add rules. | 2987 # Add rules. |
| 2956 actions_to_add = {} | 2988 actions_to_add = {} |
| 2957 props_files_of_rules = set() | 2989 props_files_of_rules = set() |
| 2958 targets_files_of_rules = set() | 2990 targets_files_of_rules = set() |
| 2959 extension_to_rule_name = {} | 2991 extension_to_rule_name = {} |
| 2960 list_excluded = generator_flags.get('msvs_list_excluded_files', True) | 2992 list_excluded = generator_flags.get('msvs_list_excluded_files', True) |
| 2961 _GenerateRulesForMSBuild(project_dir, options, spec, | 2993 |
| 2962 sources, excluded_sources, | 2994 # Don't generate rules if we are using an external builder like ninja. |
| 2963 props_files_of_rules, targets_files_of_rules, | 2995 if external_builder != None: |
|
Dirk Pranke
2013/04/16 00:41:04
same nit.
| |
| 2964 actions_to_add, extension_to_rule_name) | 2996 _GenerateRulesForMSBuild(project_dir, options, spec, |
| 2997 sources, excluded_sources, | |
| 2998 props_files_of_rules, targets_files_of_rules, | |
| 2999 actions_to_add, extension_to_rule_name) | |
| 3000 | |
| 2965 sources, excluded_sources, excluded_idl = ( | 3001 sources, excluded_sources, excluded_idl = ( |
| 2966 _AdjustSourcesAndConvertToFilterHierarchy(spec, options, | 3002 _AdjustSourcesAndConvertToFilterHierarchy(spec, options, |
| 2967 project_dir, sources, | 3003 project_dir, sources, |
| 2968 excluded_sources, | 3004 excluded_sources, |
| 2969 list_excluded)) | 3005 list_excluded)) |
| 2970 _AddActions(actions_to_add, spec, project.build_file) | |
| 2971 _AddCopies(actions_to_add, spec) | |
| 2972 | 3006 |
| 2973 # NOTE: this stanza must appear after all actions have been decided. | 3007 # Don't add actions if we are using an external builder like ninja. |
| 2974 # Don't excluded sources with actions attached, or they won't run. | 3008 if external_builder != None: |
|
Dirk Pranke
2013/04/16 00:41:04
same nit.
| |
| 2975 excluded_sources = _FilterActionsFromExcluded( | 3009 _AddActions(actions_to_add, spec, project.build_file) |
| 2976 excluded_sources, actions_to_add) | 3010 _AddCopies(actions_to_add, spec) |
| 3011 | |
| 3012 # NOTE: this stanza must appear after all actions have been decided. | |
| 3013 # Don't excluded sources with actions attached, or they won't run. | |
| 3014 excluded_sources = _FilterActionsFromExcluded( | |
| 3015 excluded_sources, actions_to_add) | |
| 2977 | 3016 |
| 2978 exclusions = _GetExcludedFilesFromBuild(spec, excluded_sources, excluded_idl) | 3017 exclusions = _GetExcludedFilesFromBuild(spec, excluded_sources, excluded_idl) |
| 2979 actions_spec, sources_handled_by_action = _GenerateActionsForMSBuild( | 3018 actions_spec, sources_handled_by_action = _GenerateActionsForMSBuild( |
| 2980 spec, actions_to_add) | 3019 spec, actions_to_add) |
| 2981 | 3020 |
| 2982 _GenerateMSBuildFiltersFile(project.path + '.filters', sources, | 3021 _GenerateMSBuildFiltersFile(project.path + '.filters', sources, |
| 2983 extension_to_rule_name) | 3022 extension_to_rule_name) |
| 2984 missing_sources = _VerifySourcesExist(sources, project_dir) | 3023 missing_sources = _VerifySourcesExist(sources, project_dir) |
| 2985 | 3024 |
| 2986 for configuration in configurations.itervalues(): | 3025 for configuration in configurations.itervalues(): |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 2999 content = [ | 3038 content = [ |
| 3000 'Project', | 3039 'Project', |
| 3001 {'xmlns': 'http://schemas.microsoft.com/developer/msbuild/2003', | 3040 {'xmlns': 'http://schemas.microsoft.com/developer/msbuild/2003', |
| 3002 'ToolsVersion': version.ProjectVersion(), | 3041 'ToolsVersion': version.ProjectVersion(), |
| 3003 'DefaultTargets': 'Build' | 3042 'DefaultTargets': 'Build' |
| 3004 }] | 3043 }] |
| 3005 | 3044 |
| 3006 content += _GetMSBuildProjectConfigurations(configurations) | 3045 content += _GetMSBuildProjectConfigurations(configurations) |
| 3007 content += _GetMSBuildGlobalProperties(spec, project.guid, project_file_name) | 3046 content += _GetMSBuildGlobalProperties(spec, project.guid, project_file_name) |
| 3008 content += import_default_section | 3047 content += import_default_section |
| 3009 content += _GetMSBuildConfigurationDetails(spec, project.build_file) | 3048 content += _GetMSBuildConfigurationDetails(spec, project.build_file, |
| 3049 external_builder) | |
| 3010 content += _GetMSBuildLocalProperties(project.msbuild_toolset) | 3050 content += _GetMSBuildLocalProperties(project.msbuild_toolset) |
| 3011 content += import_cpp_props_section | 3051 content += import_cpp_props_section |
| 3012 content += _GetMSBuildExtensions(props_files_of_rules) | 3052 content += _GetMSBuildExtensions(props_files_of_rules) |
| 3013 content += _GetMSBuildPropertySheets(configurations) | 3053 content += _GetMSBuildPropertySheets(configurations) |
| 3014 content += macro_section | 3054 content += macro_section |
| 3015 content += _GetMSBuildConfigurationGlobalProperties(spec, configurations, | 3055 content += _GetMSBuildConfigurationGlobalProperties(spec, configurations, |
| 3016 project.build_file) | 3056 project.build_file, |
| 3057 external_builder) | |
| 3017 content += _GetMSBuildToolSettingsSections(spec, configurations) | 3058 content += _GetMSBuildToolSettingsSections(spec, configurations) |
| 3018 content += _GetMSBuildSources( | 3059 content += _GetMSBuildSources( |
| 3019 spec, sources, exclusions, extension_to_rule_name, actions_spec, | 3060 spec, sources, exclusions, extension_to_rule_name, actions_spec, |
| 3020 sources_handled_by_action, list_excluded) | 3061 sources_handled_by_action, list_excluded) |
| 3021 content += _GetMSBuildProjectReferences(project) | 3062 content += _GetMSBuildProjectReferences(project) |
| 3022 content += import_cpp_targets_section | 3063 content += import_cpp_targets_section |
| 3023 content += _GetMSBuildExtensionTargets(targets_files_of_rules) | 3064 content += _GetMSBuildExtensionTargets(targets_files_of_rules) |
| 3024 | 3065 |
| 3066 if external_builder == 'ninja': | |
| 3067 content += _GetMSBuildNinjaTarget(spec, 'Build', | |
| 3068 ['-j', '${NUMBER_OF_PROCESSORS_PLUS_1}']) | |
|
scottmg
2013/04/15 19:37:58
ninja determines -j automatically, don't specify i
| |
| 3069 content += _GetMSBuildNinjaTarget(spec, 'Clean', ['-t', 'clean']) | |
| 3070 | |
| 3025 # TODO(jeanluc) File a bug to get rid of runas. We had in MSVS: | 3071 # TODO(jeanluc) File a bug to get rid of runas. We had in MSVS: |
| 3026 # has_run_as = _WriteMSVSUserFile(project.path, version, spec) | 3072 # has_run_as = _WriteMSVSUserFile(project.path, version, spec) |
| 3027 | 3073 |
| 3028 easy_xml.WriteXmlIfChanged(content, project.path, pretty=True, win32=True) | 3074 easy_xml.WriteXmlIfChanged(content, project.path, pretty=True, win32=True) |
| 3029 | 3075 |
| 3030 return missing_sources | 3076 return missing_sources |
| 3031 | 3077 |
| 3078 def _GetMSBuildNinjaTarget(spec, msbuild_target_name, ninja_args): | |
|
scottmg
2013/04/15 19:37:58
docstring
| |
| 3079 cmd = [ | |
| 3080 'ninja.exe', | |
|
scottmg
2013/04/15 19:37:58
i don't love the hardcoding here either. perhaps a
| |
| 3081 '-C', | |
| 3082 '$(OutDir)', | |
| 3083 ] | |
| 3084 cmd.extend(ninja_args) | |
| 3085 cmd.append(spec['target_name']) | |
| 3086 cmd = _BuildCommandLineForRuleRaw(spec, cmd, True, False, True, True) | |
| 3087 target = ['Target', {'Name': msbuild_target_name}] | |
| 3088 target.append(['Exec', {'Command': cmd}]) | |
| 3089 return [target] | |
| 3032 | 3090 |
| 3033 def _GetMSBuildExtensions(props_files_of_rules): | 3091 def _GetMSBuildExtensions(props_files_of_rules): |
| 3034 extensions = ['ImportGroup', {'Label': 'ExtensionSettings'}] | 3092 extensions = ['ImportGroup', {'Label': 'ExtensionSettings'}] |
| 3035 for props_file in props_files_of_rules: | 3093 for props_file in props_files_of_rules: |
| 3036 extensions.append(['Import', {'Project': props_file}]) | 3094 extensions.append(['Import', {'Project': props_file}]) |
| 3037 return [extensions] | 3095 return [extensions] |
| 3038 | 3096 |
| 3039 | 3097 |
| 3040 def _GetMSBuildExtensionTargets(targets_files_of_rules): | 3098 def _GetMSBuildExtensionTargets(targets_files_of_rules): |
| 3041 targets_node = ['ImportGroup', {'Label': 'ExtensionTargets'}] | 3099 targets_node = ['ImportGroup', {'Label': 'ExtensionTargets'}] |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3108 action_spec.extend( | 3166 action_spec.extend( |
| 3109 # TODO(jeanluc) 'Document' for all or just if as_sources? | 3167 # TODO(jeanluc) 'Document' for all or just if as_sources? |
| 3110 [['FileType', 'Document'], | 3168 [['FileType', 'Document'], |
| 3111 ['Command', command], | 3169 ['Command', command], |
| 3112 ['Message', description], | 3170 ['Message', description], |
| 3113 ['Outputs', outputs] | 3171 ['Outputs', outputs] |
| 3114 ]) | 3172 ]) |
| 3115 if additional_inputs: | 3173 if additional_inputs: |
| 3116 action_spec.append(['AdditionalInputs', additional_inputs]) | 3174 action_spec.append(['AdditionalInputs', additional_inputs]) |
| 3117 actions_spec.append(action_spec) | 3175 actions_spec.append(action_spec) |
| OLD | NEW |