forked from metamorph-inc/meta-core
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbuild_combined_sln.py
110 lines (93 loc) · 4.96 KB
/
build_combined_sln.py
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
"""
Builds a combined .sln file, enabling parallel build (which can be a couple minutes faster)
sln is based on:
src\CyPhyML.sln
externals\desert\desertVS2010.sln
src\Cyber2Code.sln
src\Cyber-Tools.sln
and some .vcxprojs
"""
import os
import os.path
import sys
import win32com.client
from time import sleep # FIXME appears there are races...
meta_path = os.path.dirname(os.path.abspath(__file__))
_vs_version = "12.0" # do not use VS 2010 or earlier
def allProjects(sln):
'''get all projects in a DTE solution, even ones in solution folders'''
import collections
q = collections.deque()
q.extend(sln)
while len(q):
i = q.pop()
if getattr(i, "CodeModel", None):
yield i
elif getattr(i, "ProjectItems", None):
q.extendleft(list(i.ProjectItems))
if getattr(i, "SubProject", None):
q.extendleft([i.SubProject])
#print str(i) + " " + str(win32com.client.DispatchEx("InterfaceEnum").Enum(i))
def get_projs(rel_sln, platform="Win32", configuration="Release"):
sln = win32com.client.DispatchEx("VisualStudio.Solution.%s" % _vs_version)
# print win32com.client.DispatchEx("InterfaceEnum").Enum(sln)
slnname = meta_path + "\\" + rel_sln
assert os.path.isfile(slnname)
sln.Open(slnname)
sleep(3)
desert_projects = [os.path.normpath(os.path.join(os.path.dirname(slnname), proj.UniqueName)) for proj in allProjects(sln)]
print desert_projects
desert_configs = {}
for solutionConfiguration2 in sln.SolutionBuild.SolutionConfigurations:
if solutionConfiguration2.Name == configuration and solutionConfiguration2.PlatformName == platform:
for solutionContext in solutionConfiguration2.SolutionContexts:
desert_configs[os.path.relpath(os.path.dirname(rel_sln) + "\\" + solutionContext.ProjectName, "src")] = solutionContext.ConfigurationName + "|" + solutionContext.PlatformName
sln.Close()
return (desert_projects, desert_configs)
desert_projects, desert_configs = get_projs(r"externals\desert\desertVS2010.sln", configuration="ReleaseUnicode")
#cyber_projects, cyber_configs = get_projs(r"src\Cyber2Code.sln")
#cybertools_projects, cybertools_configs = get_projs(r"src\Cyber-Tools.sln")
dep_projects = set(desert_projects)
dep_configs = dict(desert_configs.items())
sln = win32com.client.DispatchEx("VisualStudio.Solution.%s" % _vs_version)
# print win32com.client.DispatchEx("InterfaceEnum").Enum(sln)
sln.Open(meta_path + r"\src\CyPhyML.sln")
sleep(3)
cyphy_projects = [os.path.normpath(os.path.join(os.path.dirname(meta_path + r"\src\CyPhyML.sln"), proj.UniqueName)) for proj in allProjects(sln)]
dep_projects2 = []
for proj in dep_projects:
print proj
if proj not in cyphy_projects:
dep_projects2.append(sln.AddFromFile(proj, False))
for vcxproj in (r"3rdParty\ctemplate-1.0\vsprojects\libctemplate\libctemplate.vcxproj", r"src\MetaLink\MetaLink_maven.vcxproj"):
dep_projects2.append(sln.AddFromFile(os.path.join(meta_path, vcxproj), False))
dep_configs[os.path.relpath(vcxproj, "src")] = "Release|Win32"
dep_projects = dep_projects2
dep_projects_names = [proj.UniqueName for proj in dep_projects]
sleep(2.5)
sln.SaveAs(os.path.join(meta_path, r"src\CyPhyMLCombined.sln"))
for solutionConfiguration2 in sln.SolutionBuild.SolutionConfigurations:
if solutionConfiguration2.Name == "Release" and solutionConfiguration2.PlatformName == "Mixed Platforms":
for solutionContext in solutionConfiguration2.SolutionContexts:
if solutionContext.ProjectName in dep_projects_names:
solutionContext.ConfigurationName = dep_configs[solutionContext.ProjectName] # n.b. this does not work with VS 2010
proj_byname = dict(((os.path.basename(proj.FullName), proj) for proj in allProjects(sln)))
def add_dep(proj, dep):
bldDepends = sln.SolutionBuild.BuildDependencies.Item(proj_byname[proj].UniqueName)
bldDepends.AddProject(proj_byname[dep].UniqueName)
add_dep('DesignSpaceHelper.vcxproj', 'desert.vcxproj')
#add_dep('CyPhy2SFC_CodeGen.vcxproj', 'libctemplate.vcxproj')
#add_dep('Cyber2SLC_CodeGen.vcxproj', 'libctemplate.vcxproj')
#add_dep('CyberCS.csproj', 'CyberRegister.vcxproj')
add_dep('CyPhyMetaLinkBridgeClient.csproj', 'MetaLink_maven.vcxproj')
#for vcxproj in map(os.path.basename, cyber_projects):
# if vcxproj not in ('UpdateCyber2SLC_udm.vcxproj', 'Cyber.vcxproj'):
# add_dep(vcxproj, 'UpdateCyber2SLC_udm.vcxproj')
# TODO: copy solution dependencies from dependent slns
sln.SaveAs(os.path.join(meta_path, r"src\CyPhyMLCombined.sln"))
# .FullName > c:\....vcxproj
# .UniqueName > ..\externals\..vcxproj
# len([str(p) for p in allProjects(sln)])
# 'ComponentExporterUnitTests' in [str(p) for p in allProjects(sln)]
# AnalysisInterpreters (u'IUnknown', u'IDispatch', u'ISupportVSProperties', u'Project', u'ISupportErrorInfo')
# http://msdn.microsoft.com/en-US/library/envdte.projectitem_members(v=vs.80).aspx