aboutsummaryrefslogtreecommitdiffhomepage
path: root/templates/vsprojects/vcxproj.filters_defs.include
blob: e7df8db76378c05dff6a34bfb7cc0387f591d6b5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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>\