Index: pylib/gyp/generator/msvs.py |
diff --git a/pylib/gyp/generator/msvs.py b/pylib/gyp/generator/msvs.py |
index f529d39a98d37c76b5eda390199f454cdd465dd1..28957e556b2b8209252f72287028ce39d5a49ec6 100644 |
--- a/pylib/gyp/generator/msvs.py |
+++ b/pylib/gyp/generator/msvs.py |
@@ -817,10 +817,10 @@ def _GenerateRulesForMSVS(p, output_dir, options, spec, |
if rules_external: |
_GenerateExternalRules(rules_external, output_dir, spec, |
sources, options, actions_to_add) |
- _AdjustSourcesForRules(spec, rules, sources, excluded_sources) |
+ _AdjustSourcesForRules(rules, sources, excluded_sources, False) |
-def _AdjustSourcesForRules(spec, rules, sources, excluded_sources): |
+def _AdjustSourcesForRules(rules, sources, excluded_sources, is_msbuild): |
# Add outputs generated by each rule (if applicable). |
for rule in rules: |
# Add in the outputs from this rule. |
@@ -837,7 +837,7 @@ def _AdjustSourcesForRules(spec, rules, sources, excluded_sources): |
outputs = OrderedSet(_FixPaths(outputs)) |
inputs.remove(_FixPath(trigger_file)) |
sources.update(inputs) |
- if not spec.get('msvs_external_builder'): |
+ if not is_msbuild: |
excluded_sources.update(inputs) |
sources.update(outputs) |
@@ -2013,7 +2013,7 @@ def GenerateOutput(target_list, target_dicts, data, params): |
def _GenerateMSBuildFiltersFile(filters_path, source_files, |
- extension_to_rule_name): |
+ rule_dependencies, extension_to_rule_name): |
"""Generate the filters file. |
This file is used by Visual Studio to organize the presentation of source |
@@ -2026,8 +2026,8 @@ def _GenerateMSBuildFiltersFile(filters_path, source_files, |
""" |
filter_group = [] |
source_group = [] |
- _AppendFiltersForMSBuild('', source_files, extension_to_rule_name, |
- filter_group, source_group) |
+ _AppendFiltersForMSBuild('', source_files, rule_dependencies, |
+ extension_to_rule_name, filter_group, source_group) |
if filter_group: |
content = ['Project', |
{'ToolsVersion': '4.0', |
@@ -2042,7 +2042,7 @@ def _GenerateMSBuildFiltersFile(filters_path, source_files, |
os.unlink(filters_path) |
-def _AppendFiltersForMSBuild(parent_filter_name, sources, |
+def _AppendFiltersForMSBuild(parent_filter_name, sources, rule_dependencies, |
extension_to_rule_name, |
filter_group, source_group): |
"""Creates the list of filters and sources to be added in the filter file. |
@@ -2068,11 +2068,12 @@ def _AppendFiltersForMSBuild(parent_filter_name, sources, |
['UniqueIdentifier', MSVSNew.MakeGuid(source.name)]]) |
# Recurse and add its dependents. |
_AppendFiltersForMSBuild(filter_name, source.contents, |
- extension_to_rule_name, |
+ rule_dependencies, extension_to_rule_name, |
filter_group, source_group) |
else: |
# It's a source. Create a source entry. |
- _, element = _MapFileToMsBuildSourceType(source, extension_to_rule_name) |
+ _, element = _MapFileToMsBuildSourceType(source, rule_dependencies, |
+ extension_to_rule_name) |
source_entry = [element, {'Include': source}] |
# Specify the filter it is part of, if any. |
if parent_filter_name: |
@@ -2080,7 +2081,8 @@ def _AppendFiltersForMSBuild(parent_filter_name, sources, |
source_group.append(source_entry) |
-def _MapFileToMsBuildSourceType(source, extension_to_rule_name): |
+def _MapFileToMsBuildSourceType(source, rule_dependencies, |
+ extension_to_rule_name): |
"""Returns the group and element type of the source file. |
Arguments: |
@@ -2106,6 +2108,9 @@ def _MapFileToMsBuildSourceType(source, extension_to_rule_name): |
elif ext == '.idl': |
group = 'midl' |
element = 'Midl' |
+ elif source in rule_dependencies: |
+ group = 'rule_dependency' |
+ element = 'CustomBuild' |
else: |
group = 'none' |
element = 'None' |
@@ -2115,7 +2120,8 @@ def _MapFileToMsBuildSourceType(source, extension_to_rule_name): |
def _GenerateRulesForMSBuild(output_dir, options, spec, |
sources, excluded_sources, |
props_files_of_rules, targets_files_of_rules, |
- actions_to_add, extension_to_rule_name): |
+ actions_to_add, rule_dependencies, |
+ extension_to_rule_name): |
# MSBuild rules are implemented using three files: an XML file, a .targets |
# file and a .props file. |
# See http://blogs.msdn.com/b/vcblog/archive/2010/04/21/quick-help-on-vs2010-custom-build-rule.aspx |
@@ -2131,6 +2137,7 @@ def _GenerateRulesForMSBuild(output_dir, options, spec, |
continue |
msbuild_rule = MSBuildRule(rule, spec) |
msbuild_rules.append(msbuild_rule) |
+ rule_dependencies.update(msbuild_rule.additional_dependencies.split(';')) |
extension_to_rule_name[msbuild_rule.extension] = msbuild_rule.rule_name |
if msbuild_rules: |
base = spec['target_name'] + options.suffix |
@@ -2152,7 +2159,7 @@ def _GenerateRulesForMSBuild(output_dir, options, spec, |
if rules_external: |
_GenerateExternalRules(rules_external, output_dir, spec, |
sources, options, actions_to_add) |
- _AdjustSourcesForRules(spec, rules, sources, excluded_sources) |
+ _AdjustSourcesForRules(rules, sources, excluded_sources, True) |
class MSBuildRule(object): |
@@ -3073,15 +3080,18 @@ def _VerifySourcesExist(sources, root_dir): |
return missing_sources |
-def _GetMSBuildSources(spec, sources, exclusions, extension_to_rule_name, |
- actions_spec, sources_handled_by_action, list_excluded): |
- groups = ['none', 'midl', 'include', 'compile', 'resource', 'rule'] |
+def _GetMSBuildSources(spec, sources, exclusions, rule_dependencies, |
+ extension_to_rule_name, actions_spec, |
+ sources_handled_by_action, list_excluded): |
+ groups = ['none', 'midl', 'include', 'compile', 'resource', 'rule', |
+ 'rule_dependency'] |
grouped_sources = {} |
for g in groups: |
grouped_sources[g] = [] |
_AddSources2(spec, sources, exclusions, grouped_sources, |
- extension_to_rule_name, sources_handled_by_action, list_excluded) |
+ rule_dependencies, extension_to_rule_name, |
+ sources_handled_by_action, list_excluded) |
sources = [] |
for g in groups: |
if grouped_sources[g]: |
@@ -3092,13 +3102,15 @@ def _GetMSBuildSources(spec, sources, exclusions, extension_to_rule_name, |
def _AddSources2(spec, sources, exclusions, grouped_sources, |
- extension_to_rule_name, sources_handled_by_action, |
+ rule_dependencies, extension_to_rule_name, |
+ sources_handled_by_action, |
list_excluded): |
extensions_excluded_from_precompile = [] |
for source in sources: |
if isinstance(source, MSVSProject.Filter): |
_AddSources2(spec, source.contents, exclusions, grouped_sources, |
- extension_to_rule_name, sources_handled_by_action, |
+ rule_dependencies, extension_to_rule_name, |
+ sources_handled_by_action, |
list_excluded) |
else: |
if not source in sources_handled_by_action: |
@@ -3141,7 +3153,7 @@ def _AddSources2(spec, sources, exclusions, grouped_sources, |
detail.append(['PrecompiledHeader', '']) |
detail.append(['ForcedIncludeFiles', '']) |
- group, element = _MapFileToMsBuildSourceType(source, |
+ group, element = _MapFileToMsBuildSourceType(source, rule_dependencies, |
extension_to_rule_name) |
grouped_sources[group].append([element, {'Include': source}] + detail) |
@@ -3185,6 +3197,7 @@ def _GenerateMSBuildProject(project, options, version, generator_flags): |
actions_to_add = {} |
props_files_of_rules = set() |
targets_files_of_rules = set() |
+ rule_dependencies = set() |
extension_to_rule_name = {} |
list_excluded = generator_flags.get('msvs_list_excluded_files', True) |
@@ -3193,10 +3206,11 @@ def _GenerateMSBuildProject(project, options, version, generator_flags): |
_GenerateRulesForMSBuild(project_dir, options, spec, |
sources, excluded_sources, |
props_files_of_rules, targets_files_of_rules, |
- actions_to_add, extension_to_rule_name) |
+ actions_to_add, rule_dependencies, |
+ extension_to_rule_name) |
else: |
rules = spec.get('rules', []) |
- _AdjustSourcesForRules(spec, rules, sources, excluded_sources) |
+ _AdjustSourcesForRules(rules, sources, excluded_sources, True) |
sources, excluded_sources, excluded_idl = ( |
_AdjustSourcesAndConvertToFilterHierarchy(spec, options, |
@@ -3219,6 +3233,7 @@ def _GenerateMSBuildProject(project, options, version, generator_flags): |
spec, actions_to_add) |
_GenerateMSBuildFiltersFile(project.path + '.filters', sources, |
+ rule_dependencies, |
extension_to_rule_name) |
missing_sources = _VerifySourcesExist(sources, project_dir) |
@@ -3258,8 +3273,8 @@ def _GenerateMSBuildProject(project, options, version, generator_flags): |
project.build_file) |
content += _GetMSBuildToolSettingsSections(spec, configurations) |
content += _GetMSBuildSources( |
- spec, sources, exclusions, extension_to_rule_name, actions_spec, |
- sources_handled_by_action, list_excluded) |
+ spec, sources, exclusions, rule_dependencies, extension_to_rule_name, |
+ actions_spec, sources_handled_by_action, list_excluded) |
content += _GetMSBuildProjectReferences(project) |
content += import_cpp_targets_section |
content += _GetMSBuildExtensionTargets(targets_files_of_rules) |