Skip to content

Commit 1f986d9

Browse files
[𝘀𝗽𝗿] initial version
Created using spr 1.3.6
2 parents 4903c11 + aea329e commit 1f986d9

File tree

4 files changed

+154
-53
lines changed

4 files changed

+154
-53
lines changed

.ci/compute_projects.py

Lines changed: 86 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,20 @@
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.
56-
# FIXME: Figure out what is missing and add here.
57-
".ci": {"llvm", "clang", "lld", "lldb"},
55+
".ci": {
56+
"llvm",
57+
"clang",
58+
"lld",
59+
"lldb",
60+
"bolt",
61+
"clang-tools-extra",
62+
"mlir",
63+
"polly",
64+
"flang",
65+
},
5866
}
5967

6068
# This mapping describes runtimes that should be enabled for a specific project,
@@ -64,7 +72,16 @@
6472

6573
# This mapping describes runtimes that should be tested when the key project is
6674
# touched.
67-
DEPENDENT_RUNTIMES_TO_TEST = {"clang": {"libcxx", "libcxxabi", "libunwind"}}
75+
DEPENDENT_RUNTIMES_TO_TEST = {
76+
"clang": {"compiler-rt"},
77+
"clang-tools-extra": {"libc"},
78+
".ci": {"compiler-rt", "libc"},
79+
}
80+
DEPENDENT_RUNTIMES_TO_TEST_NEEDS_RECONFIG = {
81+
"llvm": {"libcxx", "libcxxabi", "libunwind"},
82+
"clang": {"libcxx", "libcxxabi", "libunwind"},
83+
".ci": {"libcxx", "libcxxabi", "libunwind"},
84+
}
6885

6986
EXCLUDE_LINUX = {
7087
"cross-project-tests", # TODO(issues/132796): Tests are failing.
@@ -93,9 +110,6 @@
93110
"cross-project-tests",
94111
"flang",
95112
"libc",
96-
"libcxx",
97-
"libcxxabi",
98-
"libunwind",
99113
"lldb",
100114
"openmp",
101115
"polly",
@@ -122,10 +136,10 @@
122136
"polly": "check-polly",
123137
}
124138

125-
RUNTIMES = {"libcxx", "libcxxabi", "libunwind"}
139+
RUNTIMES = {"libcxx", "libcxxabi", "libunwind", "compiler-rt", "libc"}
126140

127141

128-
def _add_dependencies(projects: Set[str]) -> Set[str]:
142+
def _add_dependencies(projects: Set[str], runtimes: Set[str]) -> Set[str]:
129143
projects_with_dependents = set(projects)
130144
current_projects_count = 0
131145
while current_projects_count != len(projects_with_dependents):
@@ -134,9 +148,25 @@ def _add_dependencies(projects: Set[str]) -> Set[str]:
134148
if project not in PROJECT_DEPENDENCIES:
135149
continue
136150
projects_with_dependents.update(PROJECT_DEPENDENCIES[project])
151+
for runtime in runtimes:
152+
if runtime not in PROJECT_DEPENDENCIES:
153+
continue
154+
projects_with_dependents.update(PROJECT_DEPENDENCIES[runtime])
137155
return projects_with_dependents
138156

139157

158+
def _exclude_projects(current_projects: Set[str], platform: str) -> Set[str]:
159+
if platform == "Linux":
160+
to_exclude = EXCLUDE_LINUX
161+
elif platform == "Windows":
162+
to_exclude = EXCLUDE_WINDOWS
163+
elif platform == "Darwin":
164+
to_exclude = EXCLUDE_MAC
165+
else:
166+
raise ValueError(f"Unexpected platform: {platform}")
167+
return current_projects.difference(to_exclude)
168+
169+
140170
def _compute_projects_to_test(modified_projects: Set[str], platform: str) -> Set[str]:
141171
projects_to_test = set()
142172
for modified_project in modified_projects:
@@ -154,25 +184,14 @@ def _compute_projects_to_test(modified_projects: Set[str], platform: str) -> Set
154184
):
155185
continue
156186
projects_to_test.add(dependent_project)
157-
if platform == "Linux":
158-
for to_exclude in EXCLUDE_LINUX:
159-
if to_exclude in projects_to_test:
160-
projects_to_test.remove(to_exclude)
161-
elif platform == "Windows":
162-
for to_exclude in EXCLUDE_WINDOWS:
163-
if to_exclude in projects_to_test:
164-
projects_to_test.remove(to_exclude)
165-
elif platform == "Darwin":
166-
for to_exclude in EXCLUDE_MAC:
167-
if to_exclude in projects_to_test:
168-
projects_to_test.remove(to_exclude)
169-
else:
170-
raise ValueError("Unexpected platform.")
187+
projects_to_test = _exclude_projects(projects_to_test, platform)
171188
return projects_to_test
172189

173190

174-
def _compute_projects_to_build(projects_to_test: Set[str]) -> Set[str]:
175-
return _add_dependencies(projects_to_test)
191+
def _compute_projects_to_build(
192+
projects_to_test: Set[str], runtimes: Set[str]
193+
) -> Set[str]:
194+
return _add_dependencies(projects_to_test, runtimes)
176195

177196

178197
def _compute_project_check_targets(projects_to_test: Set[str]) -> Set[str]:
@@ -184,24 +203,36 @@ def _compute_project_check_targets(projects_to_test: Set[str]) -> Set[str]:
184203
return check_targets
185204

186205

187-
def _compute_runtimes_to_test(projects_to_test: Set[str]) -> Set[str]:
206+
def _compute_runtimes_to_test(modified_projects: Set[str], platform: str) -> Set[str]:
188207
runtimes_to_test = set()
189-
for project_to_test in projects_to_test:
190-
if project_to_test in DEPENDENT_RUNTIMES_TO_TEST:
191-
runtimes_to_test.update(DEPENDENT_RUNTIMES_TO_TEST[project_to_test])
192-
if project_to_test in DEPENDENT_RUNTIMES_TO_BUILD:
193-
runtimes_to_test.update(DEPENDENT_RUNTIMES_TO_BUILD[project_to_test])
194-
return runtimes_to_test
208+
for modified_project in modified_projects:
209+
if modified_project not in DEPENDENT_RUNTIMES_TO_TEST:
210+
continue
211+
runtimes_to_test.update(DEPENDENT_RUNTIMES_TO_TEST[modified_project])
212+
return _exclude_projects(runtimes_to_test, platform)
195213

196214

197-
def _compute_runtime_check_targets(projects_to_test: Set[str]) -> Set[str]:
198-
check_targets = set()
199-
for project_to_test in projects_to_test:
200-
if project_to_test not in DEPENDENT_RUNTIMES_TO_TEST:
215+
def _compute_runtimes_to_test_needs_reconfig(
216+
modified_projects: Set[str], platform: str
217+
) -> Set[str]:
218+
runtimes_to_test = set()
219+
for modified_project in modified_projects:
220+
if modified_project not in DEPENDENT_RUNTIMES_TO_TEST_NEEDS_RECONFIG:
201221
continue
202-
for runtime_to_test in DEPENDENT_RUNTIMES_TO_TEST[project_to_test]:
203-
check_targets.add(PROJECT_CHECK_TARGETS[runtime_to_test])
204-
return check_targets
222+
runtimes_to_test.update(
223+
DEPENDENT_RUNTIMES_TO_TEST_NEEDS_RECONFIG[modified_project]
224+
)
225+
return _exclude_projects(runtimes_to_test, platform)
226+
227+
228+
def _compute_runtimes_to_build(
229+
runtimes_to_test: Set[str], modified_projects: Set[str], platform: str
230+
) -> Set[str]:
231+
runtimes_to_build = set(runtimes_to_test)
232+
for modified_project in modified_projects:
233+
if modified_project in DEPENDENT_RUNTIMES_TO_BUILD:
234+
runtimes_to_build.update(DEPENDENT_RUNTIMES_TO_BUILD[modified_project])
235+
return _exclude_projects(runtimes_to_build, platform)
205236

206237

207238
def _get_modified_projects(modified_files: list[str]) -> Set[str]:
@@ -225,10 +256,19 @@ def _get_modified_projects(modified_files: list[str]) -> Set[str]:
225256
def get_env_variables(modified_files: list[str], platform: str) -> Set[str]:
226257
modified_projects = _get_modified_projects(modified_files)
227258
projects_to_test = _compute_projects_to_test(modified_projects, platform)
228-
projects_to_build = _compute_projects_to_build(projects_to_test)
259+
runtimes_to_test = _compute_runtimes_to_test(modified_projects, platform)
260+
runtimes_to_test_needs_reconfig = _compute_runtimes_to_test_needs_reconfig(
261+
modified_projects, platform
262+
)
263+
runtimes_to_build = _compute_runtimes_to_build(
264+
runtimes_to_test | runtimes_to_test_needs_reconfig, modified_projects, platform
265+
)
266+
projects_to_build = _compute_projects_to_build(projects_to_test, runtimes_to_build)
229267
projects_check_targets = _compute_project_check_targets(projects_to_test)
230-
runtimes_to_build = _compute_runtimes_to_test(projects_to_test)
231-
runtimes_check_targets = _compute_runtime_check_targets(projects_to_test)
268+
runtimes_check_targets = _compute_project_check_targets(runtimes_to_test)
269+
runtimes_check_targets_needs_reconfig = _compute_project_check_targets(
270+
runtimes_to_test_needs_reconfig
271+
)
232272
# We use a semicolon to separate the projects/runtimes as they get passed
233273
# to the CMake invocation and thus we need to use the CMake list separator
234274
# (;). We use spaces to separate the check targets as they end up getting
@@ -238,6 +278,9 @@ def get_env_variables(modified_files: list[str], platform: str) -> Set[str]:
238278
"project_check_targets": " ".join(sorted(projects_check_targets)),
239279
"runtimes_to_build": ";".join(sorted(runtimes_to_build)),
240280
"runtimes_check_targets": " ".join(sorted(runtimes_check_targets)),
281+
"runtimes_check_targets_needs_reconfig": " ".join(
282+
sorted(runtimes_check_targets_needs_reconfig)
283+
),
241284
}
242285

243286

.ci/compute_projects_test.py

Lines changed: 56 additions & 6 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_needs_reconfig"],
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_needs_reconfig"],
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_needs_reconfig"],
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_needs_reconfig"],
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_needs_reconfig"],
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_needs_reconfig"], "")
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_needs_reconfig"], "")
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_needs_reconfig"], "")
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_needs_reconfig"], "")
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_needs_reconfig"], "")
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_needs_reconfig"], "")
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_needs_reconfig"], "")
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_needs_reconfig"], "")
181209

182210
def test_exclude_gn(self):
183211
env_variables = compute_projects.get_env_variables(
@@ -187,21 +215,30 @@ 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_needs_reconfig"], "")
190219

191220
def test_ci(self):
192221
env_variables = compute_projects.get_env_variables(
193222
[".ci/compute_projects.py"], "Linux"
194223
)
195-
self.assertEqual(env_variables["projects_to_build"], "clang;lld;lldb;llvm")
224+
self.assertEqual(
225+
env_variables["projects_to_build"],
226+
"bolt;clang;clang-tools-extra;flang;lld;lldb;llvm;mlir;polly",
227+
)
196228
self.assertEqual(
197229
env_variables["project_check_targets"],
198-
"check-clang check-lld check-lldb check-llvm",
230+
"check-bolt check-clang check-clang-tools check-flang check-lld check-lldb check-llvm check-mlir check-polly",
199231
)
200232
self.assertEqual(
201-
env_variables["runtimes_to_build"], "libcxx;libcxxabi;libunwind"
233+
env_variables["runtimes_to_build"],
234+
"compiler-rt;libc;libcxx;libcxxabi;libunwind",
202235
)
203236
self.assertEqual(
204237
env_variables["runtimes_check_targets"],
238+
"check-compiler-rt check-libc",
239+
)
240+
self.assertEqual(
241+
env_variables["runtimes_check_targets_needs_reconfig"],
205242
"check-cxx check-cxxabi check-unwind",
206243
)
207244

@@ -215,6 +252,19 @@ def test_lldb(self):
215252
env_variables["runtimes_to_build"], "libcxx;libcxxabi;libunwind"
216253
)
217254
self.assertEqual(env_variables["runtimes_check_targets"], "")
255+
self.assertEqual(env_variables["runtimes_check_targets_needs_reconfig"], "")
256+
257+
def test_clang_tools_extra(self):
258+
env_variables = compute_projects.get_env_variables(
259+
["clang-tools-extra/CMakeLists.txt"], "Linux"
260+
)
261+
self.assertEqual(
262+
env_variables["projects_to_build"], "clang;clang-tools-extra;lld;llvm"
263+
)
264+
self.assertEqual(env_variables["project_check_targets"], "check-clang-tools")
265+
self.assertEqual(env_variables["runtimes_to_build"], "libc")
266+
self.assertEqual(env_variables["runtimes_check_targets"], "check-libc")
267+
self.assertEqual(env_variables["runtimes_check_targets_needs_reconfig"], "")
218268

219269

220270
if __name__ == "__main__":

0 commit comments

Comments
 (0)