1#! /usr/bin/env python3
2
3import fileinput
4import glob
5import os
6import uuid
7
8dirs = set()
9
10tlv1 = ""
11for file in glob.iglob("src/libsodium/**/*.c", recursive=True):
12    file = file.replace("/", "\\")
13    tlv1 = tlv1 + "    <ClCompile Include=\"{}\" />\r\n".format(file)
14
15tlv2 = ""
16for file in glob.iglob("src/libsodium/**/*.h", recursive=True):
17    file = file.replace("/", "\\")
18    tlv2 = tlv2 + "    <ClInclude Include=\"{}\" />\r\n".format(file)
19
20tlf1 = ""
21for file in glob.iglob("src/libsodium/**/*.c", recursive=True):
22    file = file.replace("/", "\\")
23    tlf1 = tlf1 + "    <ClCompile Include=\"{}\">\r\n".format(file)
24    tlf1 = tlf1 + "      <Filter>Source Files</Filter>\r\n"
25    tlf1 = tlf1 + "    </ClCompile>\r\n"
26
27tlf2 = ""
28for file in glob.iglob("src/libsodium/**/*.h", recursive=True):
29    file = file.replace("/", "\\")
30    tlf2 = tlf2 + "    <ClInclude Include=\"{}\">\r\n".format(file)
31    tlf2 = tlf2 + "      <Filter>Header Files</Filter>\r\n"
32    tlf2 = tlf2 + "    </ClInclude>\r\n"
33
34v1 = ""
35for file in glob.iglob("src/libsodium/**/*.c", recursive=True):
36    file = file.replace("/", "\\")
37    v1 = v1 + \
38        "    <ClCompile Include=\"..\\..\\..\\..\\{}\" />\r\n".format(file)
39
40v2 = ""
41for file in glob.iglob("src/libsodium/**/*.h", recursive=True):
42    file = file.replace("/", "\\")
43    v2 = v2 + \
44        "    <ClInclude Include=\"..\\..\\..\\..\\{}\" />\r\n".format(file)
45
46f1 = ""
47for file in glob.iglob("src/libsodium/**/*.c", recursive=True):
48    basedir = os.path.dirname(file).replace("src/libsodium/", "")
49    t = basedir
50    while t != '':
51        dirs.add(t)
52        t = os.path.dirname(t)
53    basedir = basedir.replace("/", "\\")
54    file = file.replace("/", "\\")
55    f1 = f1 + "    <ClCompile Include=\"..\\..\\..\\..\\{}\">\r\n".format(file)
56    f1 = f1 + "      <Filter>{}</Filter>\r\n".format(basedir)
57    f1 = f1 + "    </ClCompile>\r\n"
58
59f2 = ""
60for file in glob.iglob("src/libsodium/**/*.h", recursive=True):
61    basedir = os.path.dirname(file).replace("src/libsodium/", "")
62    t = basedir
63    while t != '':
64        dirs.add(t)
65        t = os.path.dirname(t)
66    basedir = basedir.replace("/", "\\")
67    file = file.replace("/", "\\")
68    f2 = f2 + "    <ClInclude Include=\"..\\..\\..\\..\\{}\">\r\n".format(file)
69    f2 = f2 + "      <Filter>{}</Filter>\r\n".format(basedir)
70    f2 = f2 + "    </ClInclude>\r\n"
71
72fd = ""
73dirs = list(dirs)
74dirs.sort()
75for dir in dirs:
76    dir = dir.replace("/", "\\")
77    uid = uuid.uuid3(uuid.UUID(bytes=b'LibSodiumMSVCUID'), dir)
78    fd = fd + "    <Filter Include=\"{}\">\r\n".format(dir)
79    fd = fd + \
80        "      <UniqueIdentifier>{{{}}}</UniqueIdentifier>\r\n".format(uid)
81    fd = fd + "    </Filter>\r\n"
82
83
84def apply_template(tplfile, outfile, sbox):
85    tpl = ""
86    with open(tplfile, 'rb') as fd:
87        tpl = fd.read()
88    for s in sbox.keys():
89        tpl = tpl.replace(str.encode(
90            "{{" + s + "}}", "utf8"), str.encode(str.strip(sbox[s]), "utf8"))
91
92    with open(outfile, 'wb') as fd:
93        fd.write(tpl)
94
95sbox = {"tlv1": tlv1, "tlv2": tlv2, "tlf1": tlf1, "tlf2": tlf2, "v1": v1,
96        "v2": v2, "f1": f1, "f2": f2, "fd": fd}
97
98sd = os.path.dirname(os.path.realpath(__file__))
99
100apply_template(sd + "/tl_libsodium.vcxproj.filters.tpl",
101               "libsodium.vcxproj.filters", sbox)
102
103sbox.update({"platform": "v140"})
104apply_template(sd + "/tl_libsodium.vcxproj.tpl",
105               "libsodium.vcxproj", sbox)
106
107apply_template(sd + "/libsodium.vcxproj.filters.tpl",
108               "builds/msvc/vs2017/libsodium/libsodium.vcxproj.filters", sbox)
109apply_template(sd + "/libsodium.vcxproj.filters.tpl",
110               "builds/msvc/vs2015/libsodium/libsodium.vcxproj.filters", sbox)
111apply_template(sd + "/libsodium.vcxproj.filters.tpl",
112               "builds/msvc/vs2013/libsodium/libsodium.vcxproj.filters", sbox)
113apply_template(sd + "/libsodium.vcxproj.filters.tpl",
114               "builds/msvc/vs2012/libsodium/libsodium.vcxproj.filters", sbox)
115apply_template(sd + "/libsodium.vcxproj.filters.tpl",
116               "builds/msvc/vs2010/libsodium/libsodium.vcxproj.filters", sbox)
117
118sbox.update({"platform": "v141"})
119apply_template(sd + "/libsodium.vcxproj.tpl",
120               "builds/msvc/vs2017/libsodium/libsodium.vcxproj", sbox)
121
122sbox.update({"platform": "v140"})
123apply_template(sd + "/libsodium.vcxproj.tpl",
124               "builds/msvc/vs2015/libsodium/libsodium.vcxproj", sbox)
125
126sbox.update({"platform": "v120"})
127apply_template(sd + "/libsodium.vcxproj.tpl",
128               "builds/msvc/vs2013/libsodium/libsodium.vcxproj", sbox)
129
130sbox.update({"platform": "v110"})
131apply_template(sd + "/libsodium.vcxproj.tpl",
132               "builds/msvc/vs2012/libsodium/libsodium.vcxproj", sbox)
133
134sbox.update({"platform": "v100"})
135apply_template(sd + "/libsodium.vcxproj.tpl",
136               "builds/msvc/vs2010/libsodium/libsodium.vcxproj", sbox)
137