Skip to content

Commit f4a9fb2

Browse files
[𝘀𝗽𝗿] initial version
Created using spr 1.3.4
2 parents 33fae08 + d5b8a8b commit f4a9fb2

19 files changed

+175
-88
lines changed

.ci/compute_projects.py

Lines changed: 88 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -49,15 +49,28 @@
4949
},
5050
"lld": {"bolt", "cross-project-tests"},
5151
# TODO(issues/132795): LLDB should be enabled on clang changes.
52-
"clang": {"clang-tools-extra", "compiler-rt", "cross-project-tests"},
53-
"clang-tools-extra": {"libc"},
52+
"clang": {"clang-tools-extra", "cross-project-tests"},
5453
"mlir": {"flang"},
5554
# Test everything if ci scripts are changed.
5655
# FIXME: Figure out what is missing and add here.
5756
".ci": {"llvm", "clang", "lld", "lldb"},
5857
}
5958

60-
DEPENDENT_RUNTIMES_TO_TEST = {"clang": {"libcxx", "libcxxabi", "libunwind"}}
59+
# This mapping describes runtimes that should be enabled for a specific project,
60+
# but not necessarily run for testing. The only case of this currently is lldb
61+
# which needs some runtimes enabled for tests.
62+
DEPENDENT_RUNTIMES_TO_BUILD = {"lldb": {"libcxx", "libcxxabi", "libunwind"}}
63+
64+
# This mapping describes runtimes that should be tested when the key project is
65+
# touched.
66+
DEPENDENT_RUNTIMES_TO_TEST = {
67+
"clang": {"compiler-rt"},
68+
}
69+
DEPENDENT_RUNTIMES_TO_TEST_MULTICONFIG = {
70+
"llvm": {"libcxx", "libcxxabi", "libunwind"},
71+
"clang": {"libcxx", "libcxxabi", "libunwind"},
72+
".ci": {"libcxx", "libcxxabi", "libunwind"},
73+
}
6174

6275
EXCLUDE_LINUX = {
6376
"cross-project-tests", # TODO(issues/132796): Tests are failing.
@@ -86,9 +99,6 @@
8699
"cross-project-tests",
87100
"flang",
88101
"libc",
89-
"libcxx",
90-
"libcxxabi",
91-
"libunwind",
92102
"lldb",
93103
"openmp",
94104
"polly",
@@ -115,10 +125,10 @@
115125
"polly": "check-polly",
116126
}
117127

118-
RUNTIMES = {"libcxx", "libcxxabi", "libunwind"}
128+
RUNTIMES = {"libcxx", "libcxxabi", "libunwind", "compiler-rt", "libc"}
119129

120130

121-
def _add_dependencies(projects: Set[str]) -> Set[str]:
131+
def _add_dependencies(projects: Set[str], runtimes: Set[str]) -> Set[str]:
122132
projects_with_dependents = set(projects)
123133
current_projects_count = 0
124134
while current_projects_count != len(projects_with_dependents):
@@ -127,9 +137,32 @@ def _add_dependencies(projects: Set[str]) -> Set[str]:
127137
if project not in PROJECT_DEPENDENCIES:
128138
continue
129139
projects_with_dependents.update(PROJECT_DEPENDENCIES[project])
140+
for runtime in runtimes:
141+
if runtime not in PROJECT_DEPENDENCIES:
142+
continue
143+
projects_with_dependents.update(PROJECT_DEPENDENCIES[runtime])
130144
return projects_with_dependents
131145

132146

147+
def _exclude_projects(current_projects: Set[str], platform: str) -> Set[str]:
148+
new_project_set = set(current_projects)
149+
if platform == "Linux":
150+
for to_exclude in EXCLUDE_LINUX:
151+
if to_exclude in new_project_set:
152+
new_project_set.remove(to_exclude)
153+
elif platform == "Windows":
154+
for to_exclude in EXCLUDE_WINDOWS:
155+
if to_exclude in new_project_set:
156+
new_project_set.remove(to_exclude)
157+
elif platform == "Darwin":
158+
for to_exclude in EXCLUDE_MAC:
159+
if to_exclude in new_project_set:
160+
new_project_set.remove(to_exclude)
161+
else:
162+
raise ValueError("Unexpected platform.")
163+
return new_project_set
164+
165+
133166
def _compute_projects_to_test(modified_projects: Set[str], platform: str) -> Set[str]:
134167
projects_to_test = set()
135168
for modified_project in modified_projects:
@@ -147,25 +180,14 @@ def _compute_projects_to_test(modified_projects: Set[str], platform: str) -> Set
147180
):
148181
continue
149182
projects_to_test.add(dependent_project)
150-
if platform == "Linux":
151-
for to_exclude in EXCLUDE_LINUX:
152-
if to_exclude in projects_to_test:
153-
projects_to_test.remove(to_exclude)
154-
elif platform == "Windows":
155-
for to_exclude in EXCLUDE_WINDOWS:
156-
if to_exclude in projects_to_test:
157-
projects_to_test.remove(to_exclude)
158-
elif platform == "Darwin":
159-
for to_exclude in EXCLUDE_MAC:
160-
if to_exclude in projects_to_test:
161-
projects_to_test.remove(to_exclude)
162-
else:
163-
raise ValueError("Unexpected platform.")
183+
projects_to_test = _exclude_projects(projects_to_test, platform)
164184
return projects_to_test
165185

166186

167-
def _compute_projects_to_build(projects_to_test: Set[str]) -> Set[str]:
168-
return _add_dependencies(projects_to_test)
187+
def _compute_projects_to_build(
188+
projects_to_test: Set[str], runtimes: Set[str]
189+
) -> Set[str]:
190+
return _add_dependencies(projects_to_test, runtimes)
169191

170192

171193
def _compute_project_check_targets(projects_to_test: Set[str]) -> Set[str]:
@@ -177,20 +199,36 @@ def _compute_project_check_targets(projects_to_test: Set[str]) -> Set[str]:
177199
return check_targets
178200

179201

180-
def _compute_runtimes_to_test(projects_to_test: Set[str]) -> Set[str]:
202+
def _compute_runtimes_to_test(modified_projects: Set[str], platform: str) -> Set[str]:
181203
runtimes_to_test = set()
182-
for project_to_test in projects_to_test:
183-
if project_to_test not in DEPENDENT_RUNTIMES_TO_TEST:
204+
for modified_project in modified_projects:
205+
if modified_project not in DEPENDENT_RUNTIMES_TO_TEST:
184206
continue
185-
runtimes_to_test.update(DEPENDENT_RUNTIMES_TO_TEST[project_to_test])
186-
return runtimes_to_test
207+
runtimes_to_test.update(DEPENDENT_RUNTIMES_TO_TEST[modified_project])
208+
return _exclude_projects(runtimes_to_test, platform)
187209

188210

189-
def _compute_runtime_check_targets(runtimes_to_test: Set[str]) -> Set[str]:
190-
check_targets = set()
191-
for runtime_to_test in runtimes_to_test:
192-
check_targets.add(PROJECT_CHECK_TARGETS[runtime_to_test])
193-
return check_targets
211+
def _compute_runtimes_to_test_multiconfig(
212+
modified_projects: Set[str], platform: str
213+
) -> Set[str]:
214+
runtimes_to_test = set()
215+
for modified_project in modified_projects:
216+
if modified_project not in DEPENDENT_RUNTIMES_TO_TEST_MULTICONFIG:
217+
continue
218+
runtimes_to_test.update(
219+
DEPENDENT_RUNTIMES_TO_TEST_MULTICONFIG[modified_project]
220+
)
221+
return _exclude_projects(runtimes_to_test, platform)
222+
223+
224+
def _compute_runtimes_to_build(
225+
runtimes_to_test: Set[str], modified_projects: Set[str], platform: str
226+
) -> Set[str]:
227+
runtimes_to_build = set(runtimes_to_test)
228+
for modified_project in modified_projects:
229+
if modified_project in DEPENDENT_RUNTIMES_TO_BUILD:
230+
runtimes_to_build.update(DEPENDENT_RUNTIMES_TO_BUILD[modified_project])
231+
return _exclude_projects(runtimes_to_build, platform)
194232

195233

196234
def _get_modified_projects(modified_files: list[str]) -> Set[str]:
@@ -214,19 +252,31 @@ def _get_modified_projects(modified_files: list[str]) -> Set[str]:
214252
def get_env_variables(modified_files: list[str], platform: str) -> Set[str]:
215253
modified_projects = _get_modified_projects(modified_files)
216254
projects_to_test = _compute_projects_to_test(modified_projects, platform)
217-
projects_to_build = _compute_projects_to_build(projects_to_test)
255+
runtimes_to_test = _compute_runtimes_to_test(modified_projects, platform)
256+
runtimes_to_test_multiconfig = _compute_runtimes_to_test_multiconfig(
257+
modified_projects, platform
258+
)
259+
runtimes_to_build = _compute_runtimes_to_build(
260+
runtimes_to_test | runtimes_to_test_multiconfig, modified_projects, platform
261+
)
262+
projects_to_build = _compute_projects_to_build(projects_to_test, runtimes_to_build)
218263
projects_check_targets = _compute_project_check_targets(projects_to_test)
219-
runtimes_to_test = _compute_runtimes_to_test(projects_to_test)
220-
runtimes_check_targets = _compute_runtime_check_targets(runtimes_to_test)
264+
runtimes_check_targets = _compute_project_check_targets(runtimes_to_test)
265+
runtimes_check_targets_multiconfig = _compute_project_check_targets(
266+
runtimes_to_test_multiconfig
267+
)
221268
# We use a semicolon to separate the projects/runtimes as they get passed
222269
# to the CMake invocation and thus we need to use the CMake list separator
223270
# (;). We use spaces to separate the check targets as they end up getting
224271
# passed to ninja.
225272
return {
226273
"projects_to_build": ";".join(sorted(projects_to_build)),
227274
"project_check_targets": " ".join(sorted(projects_check_targets)),
228-
"runtimes_to_build": ";".join(sorted(runtimes_to_test)),
275+
"runtimes_to_build": ";".join(sorted(runtimes_to_build)),
229276
"runtimes_check_targets": " ".join(sorted(runtimes_check_targets)),
277+
"runtimes_check_targets_multiconfig": " ".join(
278+
sorted(runtimes_check_targets_multiconfig)
279+
),
230280
}
231281

232282

.ci/compute_projects_test.py

Lines changed: 50 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ def test_llvm(self):
2626
)
2727
self.assertEqual(
2828
env_variables["runtimes_check_targets"],
29+
"",
30+
)
31+
self.assertEqual(
32+
env_variables["runtimes_check_targets_multiconfig"],
2933
"check-cxx check-cxxabi check-unwind",
3034
)
3135

@@ -46,6 +50,10 @@ def test_llvm_windows(self):
4650
)
4751
self.assertEqual(
4852
env_variables["runtimes_check_targets"],
53+
"",
54+
)
55+
self.assertEqual(
56+
env_variables["runtimes_check_targets_multiconfig"],
4957
"check-cxx check-cxxabi check-unwind",
5058
)
5159

@@ -66,6 +74,10 @@ def test_llvm_mac(self):
6674
)
6775
self.assertEqual(
6876
env_variables["runtimes_check_targets"],
77+
"",
78+
)
79+
self.assertEqual(
80+
env_variables["runtimes_check_targets_multiconfig"],
6981
"check-cxx check-cxxabi check-unwind",
7082
)
7183

@@ -75,17 +87,21 @@ def test_clang(self):
7587
)
7688
self.assertEqual(
7789
env_variables["projects_to_build"],
78-
"clang;clang-tools-extra;compiler-rt;lld;llvm",
90+
"clang;clang-tools-extra;lld;llvm",
7991
)
8092
self.assertEqual(
8193
env_variables["project_check_targets"],
82-
"check-clang check-clang-tools check-compiler-rt",
94+
"check-clang check-clang-tools",
8395
)
8496
self.assertEqual(
85-
env_variables["runtimes_to_build"], "libcxx;libcxxabi;libunwind"
97+
env_variables["runtimes_to_build"], "compiler-rt;libcxx;libcxxabi;libunwind"
8698
)
8799
self.assertEqual(
88100
env_variables["runtimes_check_targets"],
101+
"check-compiler-rt",
102+
)
103+
self.assertEqual(
104+
env_variables["runtimes_check_targets_multiconfig"],
89105
"check-cxx check-cxxabi check-unwind",
90106
)
91107

@@ -104,6 +120,10 @@ def test_clang_windows(self):
104120
)
105121
self.assertEqual(
106122
env_variables["runtimes_check_targets"],
123+
"",
124+
)
125+
self.assertEqual(
126+
env_variables["runtimes_check_targets_multiconfig"],
107127
"check-cxx check-cxxabi check-unwind",
108128
)
109129

@@ -115,6 +135,7 @@ def test_bolt(self):
115135
self.assertEqual(env_variables["project_check_targets"], "check-bolt")
116136
self.assertEqual(env_variables["runtimes_to_build"], "")
117137
self.assertEqual(env_variables["runtimes_check_targets"], "")
138+
self.assertEqual(env_variables["runtimes_check_targets_multiconfig"], "")
118139

119140
def test_lldb(self):
120141
env_variables = compute_projects.get_env_variables(
@@ -124,6 +145,7 @@ def test_lldb(self):
124145
self.assertEqual(env_variables["project_check_targets"], "check-lldb")
125146
self.assertEqual(env_variables["runtimes_to_build"], "")
126147
self.assertEqual(env_variables["runtimes_check_targets"], "")
148+
self.assertEqual(env_variables["runtimes_check_targets_multiconfig"], "")
127149

128150
def test_mlir(self):
129151
env_variables = compute_projects.get_env_variables(
@@ -135,6 +157,7 @@ def test_mlir(self):
135157
)
136158
self.assertEqual(env_variables["runtimes_to_build"], "")
137159
self.assertEqual(env_variables["runtimes_check_targets"], "")
160+
self.assertEqual(env_variables["runtimes_check_targets_multiconfig"], "")
138161

139162
def test_flang(self):
140163
env_variables = compute_projects.get_env_variables(
@@ -144,6 +167,7 @@ def test_flang(self):
144167
self.assertEqual(env_variables["project_check_targets"], "check-flang")
145168
self.assertEqual(env_variables["runtimes_to_build"], "")
146169
self.assertEqual(env_variables["runtimes_check_targets"], "")
170+
self.assertEqual(env_variables["runtimes_check_targets_multiconfig"], "")
147171

148172
def test_invalid_subproject(self):
149173
env_variables = compute_projects.get_env_variables(
@@ -153,13 +177,15 @@ def test_invalid_subproject(self):
153177
self.assertEqual(env_variables["project_check_targets"], "")
154178
self.assertEqual(env_variables["runtimes_to_build"], "")
155179
self.assertEqual(env_variables["runtimes_check_targets"], "")
180+
self.assertEqual(env_variables["runtimes_check_targets_multiconfig"], "")
156181

157182
def test_top_level_file(self):
158183
env_variables = compute_projects.get_env_variables(["README.md"], "Linux")
159184
self.assertEqual(env_variables["projects_to_build"], "")
160185
self.assertEqual(env_variables["project_check_targets"], "")
161186
self.assertEqual(env_variables["runtimes_to_build"], "")
162187
self.assertEqual(env_variables["runtimes_check_targets"], "")
188+
self.assertEqual(env_variables["runtimes_check_targets_multiconfig"], "")
163189

164190
def test_exclude_runtiems_in_projects(self):
165191
env_variables = compute_projects.get_env_variables(
@@ -169,6 +195,7 @@ def test_exclude_runtiems_in_projects(self):
169195
self.assertEqual(env_variables["project_check_targets"], "")
170196
self.assertEqual(env_variables["runtimes_to_build"], "")
171197
self.assertEqual(env_variables["runtimes_check_targets"], "")
198+
self.assertEqual(env_variables["runtimes_check_targets_multiconfig"], "")
172199

173200
def test_exclude_docs(self):
174201
env_variables = compute_projects.get_env_variables(
@@ -178,6 +205,7 @@ def test_exclude_docs(self):
178205
self.assertEqual(env_variables["project_check_targets"], "")
179206
self.assertEqual(env_variables["runtimes_to_build"], "")
180207
self.assertEqual(env_variables["runtimes_check_targets"], "")
208+
self.assertEqual(env_variables["runtimes_check_targets_multiconfig"], "")
181209

182210
def test_exclude_gn(self):
183211
env_variables = compute_projects.get_env_variables(
@@ -187,6 +215,7 @@ def test_exclude_gn(self):
187215
self.assertEqual(env_variables["project_check_targets"], "")
188216
self.assertEqual(env_variables["runtimes_to_build"], "")
189217
self.assertEqual(env_variables["runtimes_check_targets"], "")
218+
self.assertEqual(env_variables["runtimes_check_targets_multiconfig"], "")
190219

191220
def test_ci(self):
192221
env_variables = compute_projects.get_env_variables(
@@ -198,13 +227,30 @@ def test_ci(self):
198227
"check-clang check-lld check-lldb check-llvm",
199228
)
200229
self.assertEqual(
201-
env_variables["runtimes_to_build"], "libcxx;libcxxabi;libunwind"
230+
env_variables["runtimes_to_build"],
231+
"libcxx;libcxxabi;libunwind",
202232
)
203233
self.assertEqual(
204234
env_variables["runtimes_check_targets"],
235+
"",
236+
)
237+
self.assertEqual(
238+
env_variables["runtimes_check_targets_multiconfig"],
205239
"check-cxx check-cxxabi check-unwind",
206240
)
207241

242+
def test_lldb(self):
243+
env_variables = compute_projects.get_env_variables(
244+
["lldb/CMakeLists.txt"], "Linux"
245+
)
246+
self.assertEqual(env_variables["projects_to_build"], "clang;lldb;llvm")
247+
self.assertEqual(env_variables["project_check_targets"], "check-lldb")
248+
self.assertEqual(
249+
env_variables["runtimes_to_build"], "libcxx;libcxxabi;libunwind"
250+
)
251+
self.assertEqual(env_variables["runtimes_check_targets"], "")
252+
self.assertEqual(env_variables["runtimes_check_targets_multiconfig"], "")
253+
208254

209255
if __name__ == "__main__":
210256
unittest.main()

0 commit comments

Comments
 (0)