Skip to content

Commit 722214c

Browse files
committed
[cmake_frontend.py] cmake file api frontend
1 parent 81f12b9 commit 722214c

1 file changed

Lines changed: 162 additions & 0 deletions

File tree

clang_bind/cmake_frontend.py

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
import os
2+
import json
3+
4+
5+
class Codemodel:
6+
def __init__(self, reply_dir):
7+
self.reply_dir = reply_dir
8+
self.codemodel = {}
9+
self.codemodel_targets = {}
10+
11+
def set_codemodel(self, codemodel_file=None):
12+
if not codemodel_file:
13+
for file in os.listdir(self.reply_dir):
14+
if file.startswith("codemodel"):
15+
codemodel_file = os.path.join(self.reply_dir, file)
16+
with open(codemodel_file) as f:
17+
self.codemodel = json.load(f)
18+
19+
def get_codemodel(self):
20+
if not self.codemodel:
21+
self.set_codemodel()
22+
return self.codemodel
23+
24+
def set_codemodel_targets(self, codemodel=None):
25+
if not codemodel:
26+
codemodel = self.get_codemodel()
27+
configurations = codemodel.get("configurations", [])
28+
for configuration in configurations:
29+
targets = configuration.get("targets", [])
30+
for target in targets:
31+
self.codemodel_targets.update({target["name"]: target["jsonFile"]})
32+
33+
def get_codemodel_targets(self):
34+
if not self.codemodel_targets:
35+
self.set_codemodel_targets()
36+
return self.codemodel_targets
37+
38+
39+
class Target:
40+
def __init__(self, reply_dir, target_name):
41+
self.reply_dir = reply_dir
42+
self.target_file = Codemodel(reply_dir).get_codemodel_targets().get(target_name)
43+
self.target = {}
44+
45+
def set_target(self, target_file=None):
46+
if not target_file:
47+
target_file = self.target_file
48+
with open(os.path.join(self.reply_dir, target_file)) as f:
49+
self.target = json.load(f)
50+
51+
def get_target(self):
52+
if not self.target:
53+
self.set_target()
54+
return self.target
55+
56+
def get_artifacts(self):
57+
return [
58+
artifact.get("path") for artifact in self.get_target().get("artifacts", [])
59+
]
60+
61+
def get_commands(self):
62+
return self.get_target().get("backtraceGraph", {}).get("commands")
63+
64+
def get_compile_groups(self):
65+
return [
66+
{
67+
"fragments": [
68+
compile_command_fragment.get("fragment")
69+
for compile_command_fragment in compile_group.get(
70+
"compileCommandFragments", []
71+
)
72+
],
73+
"defines": [
74+
define.get("define") for define in compile_group.get("defines", [])
75+
],
76+
"includes": [
77+
include.get("path") for include in compile_group.get("includes", [])
78+
],
79+
"language": compile_group.get("language"),
80+
}
81+
for compile_group in self.get_target().get("compileGroups", [])
82+
]
83+
84+
def get_dependencies(self):
85+
return [
86+
dependency.get("id")
87+
for dependency in self.get_target().get("dependencies", [])
88+
]
89+
90+
def get_files(self):
91+
return self.get_target().get("backtraceGraph", {}).get("files")
92+
93+
def get_folder(self):
94+
return self.get_target().get("folder", {}).get("name")
95+
96+
def get_id(self):
97+
return self.get_target().get("id")
98+
99+
def get_install(self):
100+
install = self.get_target().get("install", {})
101+
return {
102+
"destinations": [
103+
destination.get("path")
104+
for destination in install.get("destinations", [])
105+
],
106+
"prefix": install.get("prefix", {}).get("path"),
107+
}
108+
109+
def get_link(self):
110+
link = self.get_target().get("link", {})
111+
command_fragments = link.get("commandFragments", [])
112+
return {
113+
"flags_fragments": [
114+
command_fragment.get("fragment")
115+
for command_fragment in command_fragments
116+
if command_fragment.get("role") == "flags"
117+
],
118+
"libraries_fragments": [
119+
command_fragment.get("fragment")
120+
for command_fragment in command_fragments
121+
if command_fragment.get("role") == "libraries"
122+
],
123+
"language": link.get("language"),
124+
}
125+
126+
def get_name(self):
127+
return self.get_target().get("name")
128+
129+
def get_name_on_disk(self):
130+
return self.get_target().get("nameOnDisk")
131+
132+
def get_paths(self):
133+
return self.get_target().get("paths")
134+
135+
def get_sources(self):
136+
return [sources.get("path") for sources in self.get_target().get("sources", [])]
137+
138+
def get_type(self):
139+
return self.get_target().get("type")
140+
141+
142+
class CMakeFileAPI:
143+
def __init__(self, build_dir):
144+
reply_dir = os.path.join(build_dir, ".cmake", "api", "v1", "reply")
145+
self.targets = {}
146+
for codemodel_target in Codemodel(reply_dir).get_codemodel_targets():
147+
target = Target(reply_dir, codemodel_target)
148+
self.targets[target.get_name()] = target
149+
150+
def get_dependencies(self, target=None):
151+
targets = [self.targets.get(target)] if target else self.targets.values()
152+
return {
153+
target.get_name(): list(
154+
map(lambda x: x.split("::")[0], target.get_dependencies())
155+
)
156+
for target in targets
157+
}
158+
159+
def get_sources(self, target=None):
160+
targets = [self.targets.get(target)] if target else self.targets.values()
161+
return {target.get_name(): target.get_sources() for target in targets}
162+

0 commit comments

Comments
 (0)