Index: third_party/grpc/templates/vsprojects/vcxproj.filters_defs.include |
diff --git a/third_party/grpc/templates/vsprojects/vcxproj.filters_defs.include b/third_party/grpc/templates/vsprojects/vcxproj.filters_defs.include |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e7df8db76378c05dff6a34bfb7cc0387f591d6b5 |
--- /dev/null |
+++ b/third_party/grpc/templates/vsprojects/vcxproj.filters_defs.include |
@@ -0,0 +1,70 @@ |
+<%! |
+ import re |
+ import hashlib |
+ |
+ def calc_to_filter(path): |
+ return '\\'.join(path.split('/')[:-1]) |
+%>\ |
+<%def name="get_repo_root(proj)">${'$(SolutionDir)\..'}</%def>\ |
+<%def name="to_windows_path(path)">${path.replace('/','\\')}</%def>\ |
+<%def name="to_filter(path)">${calc_to_filter(path)}</%def>\ |
+<%def name="filter_to_guid(proj, filter)">${re.sub('(........)(....)(....)(....)', r'\1-\2-\3-\4-', hashlib.md5(''.join([filter, proj])).hexdigest())}</%def>\ |
+<%def name="gen_filters(name, collection)">\ |
+% for project in vsprojects: |
+ % if project.name == name: |
+<?xml version="1.0" encoding="utf-8"?> |
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
+ % if project.get('src',[]): |
+ <ItemGroup> |
+ % for src_name in project.src: |
+ <ClCompile Include="${get_repo_root(project)}\${to_windows_path(src_name)}"> |
+ <Filter>${to_filter(src_name)}</Filter> |
+ </ClCompile> |
+ % endfor |
+ </ItemGroup> |
+ % endif |
+ % if project.get('dll_def', None): |
+ <ItemGroup> |
+ <None Include="${get_repo_root(project)}\${to_windows_path(project.dll_def)}" /> |
+ </ItemGroup> |
+ % endif |
+ % if project.get('public_headers',[]): |
+ <ItemGroup> |
+ % for public_header in project.public_headers: |
+ <ClInclude Include="${get_repo_root(project)}\${to_windows_path(public_header)}"> |
+ <Filter>${to_filter(public_header)}</Filter> |
+ </ClInclude> |
+ % endfor |
+ </ItemGroup> |
+ % endif |
+ % if project.get('headers',[]): |
+ <ItemGroup> |
+ % for header in project.headers: |
+ <ClInclude Include="${get_repo_root(project)}\${to_windows_path(header)}"> |
+ <Filter>${to_filter(header)}</Filter> |
+ </ClInclude> |
+ % endfor |
+ </ItemGroup> |
+ % endif |
+<% |
+ filters = set() |
+ files = project.get('src', []) + project.get('public_headers', []) + project.get('headers', []) |
+ for file in files: |
+ filter = calc_to_filter(file) |
+ paths = filter.split('\\') |
+ for i in range(len(paths)): |
+ filters.add('\\'.join(paths[:i + 1])) |
+ |
+ filters = sorted(filters) |
+%> |
+ <ItemGroup> |
+ % for filter in filters: |
+ <Filter Include="${filter}"> |
+ <UniqueIdentifier>{${filter_to_guid(project.name, filter)}}</UniqueIdentifier> |
+ </Filter> |
+ % endfor |
+ </ItemGroup> |
+</Project> |
+ % endif |
+% endfor |
+</%def>\ |