Skip to content

Commit 1011f71

Browse files
Merge branch 'main' into test
2 parents d4e6e44 + 4bdef46 commit 1011f71

File tree

18,742 files changed

+1322629
-639280
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

18,742 files changed

+1322629
-639280
lines changed

.ci/compute_projects.py

Lines changed: 118 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
PROJECT_DEPENDENCIES = {
2020
"llvm": set(),
2121
"clang": {"llvm"},
22+
"CIR": {"clang", "mlir"},
2223
"bolt": {"clang", "lld", "llvm"},
2324
"clang-tools-extra": {"clang", "llvm"},
2425
"compiler-rt": {"clang", "lld"},
@@ -49,15 +50,43 @@
4950
},
5051
"lld": {"bolt", "cross-project-tests"},
5152
# 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"},
53+
"clang": {"clang-tools-extra", "cross-project-tests"},
5454
"mlir": {"flang"},
5555
# Test everything if ci scripts are changed.
56-
# FIXME: Figure out what is missing and add here.
57-
".ci": {"llvm", "clang", "lld", "lldb"},
56+
".ci": {
57+
"llvm",
58+
"clang",
59+
"CIR",
60+
"lld",
61+
"lldb",
62+
"bolt",
63+
"clang-tools-extra",
64+
"mlir",
65+
"polly",
66+
"flang",
67+
"libclc",
68+
"openmp",
69+
},
5870
}
5971

60-
DEPENDENT_RUNTIMES_TO_TEST = {"clang": {"libcxx", "libcxxabi", "libunwind"}}
72+
# This mapping describes runtimes that should be enabled for a specific project,
73+
# but not necessarily run for testing. The only case of this currently is lldb
74+
# which needs some runtimes enabled for tests.
75+
DEPENDENT_RUNTIMES_TO_BUILD = {"lldb": {"libcxx", "libcxxabi", "libunwind"}}
76+
77+
# This mapping describes runtimes that should be tested when the key project is
78+
# touched.
79+
DEPENDENT_RUNTIMES_TO_TEST = {
80+
"clang": {"compiler-rt"},
81+
"clang-tools-extra": {"libc"},
82+
"libc": {"libc"},
83+
".ci": {"compiler-rt", "libc"},
84+
}
85+
DEPENDENT_RUNTIMES_TO_TEST_NEEDS_RECONFIG = {
86+
"llvm": {"libcxx", "libcxxabi", "libunwind"},
87+
"clang": {"libcxx", "libcxxabi", "libunwind"},
88+
".ci": {"libcxx", "libcxxabi", "libunwind"},
89+
}
6190

6291
EXCLUDE_LINUX = {
6392
"cross-project-tests", # TODO(issues/132796): Tests are failing.
@@ -86,9 +115,6 @@
86115
"cross-project-tests",
87116
"flang",
88117
"libc",
89-
"libcxx",
90-
"libcxxabi",
91-
"libunwind",
92118
"lldb",
93119
"openmp",
94120
"polly",
@@ -104,6 +130,7 @@
104130
"lldb": "check-lldb",
105131
"llvm": "check-llvm",
106132
"clang": "check-clang",
133+
"CIR": "check-clang-cir",
107134
"bolt": "check-bolt",
108135
"lld": "check-lld",
109136
"flang": "check-flang",
@@ -115,21 +142,35 @@
115142
"polly": "check-polly",
116143
}
117144

118-
RUNTIMES = {"libcxx", "libcxxabi", "libunwind"}
145+
RUNTIMES = {"libcxx", "libcxxabi", "libunwind", "compiler-rt", "libc"}
119146

120147

121-
def _add_dependencies(projects: Set[str]) -> Set[str]:
148+
def _add_dependencies(projects: Set[str], runtimes: Set[str]) -> Set[str]:
122149
projects_with_dependents = set(projects)
123150
current_projects_count = 0
124151
while current_projects_count != len(projects_with_dependents):
125152
current_projects_count = len(projects_with_dependents)
126153
for project in list(projects_with_dependents):
127-
if project not in PROJECT_DEPENDENCIES:
128-
continue
129-
projects_with_dependents.update(PROJECT_DEPENDENCIES[project])
154+
if project in PROJECT_DEPENDENCIES:
155+
projects_with_dependents.update(PROJECT_DEPENDENCIES[project])
156+
for runtime in runtimes:
157+
if runtime in PROJECT_DEPENDENCIES:
158+
projects_with_dependents.update(PROJECT_DEPENDENCIES[runtime])
130159
return projects_with_dependents
131160

132161

162+
def _exclude_projects(current_projects: Set[str], platform: str) -> Set[str]:
163+
if platform == "Linux":
164+
to_exclude = EXCLUDE_LINUX
165+
elif platform == "Windows":
166+
to_exclude = EXCLUDE_WINDOWS
167+
elif platform == "Darwin":
168+
to_exclude = EXCLUDE_MAC
169+
else:
170+
raise ValueError(f"Unexpected platform: {platform}")
171+
return current_projects.difference(to_exclude)
172+
173+
133174
def _compute_projects_to_test(modified_projects: Set[str], platform: str) -> Set[str]:
134175
projects_to_test = set()
135176
for modified_project in modified_projects:
@@ -147,50 +188,52 @@ def _compute_projects_to_test(modified_projects: Set[str], platform: str) -> Set
147188
):
148189
continue
149190
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.")
191+
projects_to_test = _exclude_projects(projects_to_test, platform)
164192
return projects_to_test
165193

166194

167-
def _compute_projects_to_build(projects_to_test: Set[str]) -> Set[str]:
168-
return _add_dependencies(projects_to_test)
195+
def _compute_projects_to_build(
196+
projects_to_test: Set[str], runtimes: Set[str]
197+
) -> Set[str]:
198+
return _add_dependencies(projects_to_test, runtimes)
169199

170200

171201
def _compute_project_check_targets(projects_to_test: Set[str]) -> Set[str]:
172202
check_targets = set()
173203
for project_to_test in projects_to_test:
174-
if project_to_test not in PROJECT_CHECK_TARGETS:
175-
continue
176-
check_targets.add(PROJECT_CHECK_TARGETS[project_to_test])
204+
if project_to_test in PROJECT_CHECK_TARGETS:
205+
check_targets.add(PROJECT_CHECK_TARGETS[project_to_test])
177206
return check_targets
178207

179208

180-
def _compute_runtimes_to_test(projects_to_test: Set[str]) -> Set[str]:
209+
def _compute_runtimes_to_test(modified_projects: Set[str], platform: str) -> Set[str]:
181210
runtimes_to_test = set()
182-
for project_to_test in projects_to_test:
183-
if project_to_test not in DEPENDENT_RUNTIMES_TO_TEST:
184-
continue
185-
runtimes_to_test.update(DEPENDENT_RUNTIMES_TO_TEST[project_to_test])
186-
return runtimes_to_test
211+
for modified_project in modified_projects:
212+
if modified_project in DEPENDENT_RUNTIMES_TO_TEST:
213+
runtimes_to_test.update(DEPENDENT_RUNTIMES_TO_TEST[modified_project])
214+
return _exclude_projects(runtimes_to_test, platform)
187215

188216

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
217+
def _compute_runtimes_to_test_needs_reconfig(
218+
modified_projects: Set[str], platform: str
219+
) -> Set[str]:
220+
runtimes_to_test = set()
221+
for modified_project in modified_projects:
222+
if modified_project in DEPENDENT_RUNTIMES_TO_TEST_NEEDS_RECONFIG:
223+
runtimes_to_test.update(
224+
DEPENDENT_RUNTIMES_TO_TEST_NEEDS_RECONFIG[modified_project]
225+
)
226+
return _exclude_projects(runtimes_to_test, platform)
227+
228+
229+
def _compute_runtimes_to_build(
230+
runtimes_to_test: Set[str], modified_projects: Set[str], platform: str
231+
) -> Set[str]:
232+
runtimes_to_build = set(runtimes_to_test)
233+
for modified_project in modified_projects:
234+
if modified_project in DEPENDENT_RUNTIMES_TO_BUILD:
235+
runtimes_to_build.update(DEPENDENT_RUNTIMES_TO_BUILD[modified_project])
236+
return _exclude_projects(runtimes_to_build, platform)
194237

195238

196239
def _get_modified_projects(modified_files: list[str]) -> Set[str]:
@@ -207,26 +250,54 @@ def _get_modified_projects(modified_files: list[str]) -> Set[str]:
207250
# capacity.
208251
if len(path_parts) > 3 and path_parts[:3] == ("llvm", "utils", "gn"):
209252
continue
253+
# If the file is in the clang/lib/CIR directory, add the CIR project.
254+
if len(path_parts) > 3 and (
255+
path_parts[:3] == ("clang", "lib", "CIR")
256+
or path_parts[:3] == ("clang", "test", "CIR")
257+
or path_parts[:4] == ("clang", "include", "clang", "CIR")
258+
):
259+
modified_projects.add("CIR")
260+
# Fall through to add clang.
210261
modified_projects.add(pathlib.Path(modified_file).parts[0])
211262
return modified_projects
212263

213264

214265
def get_env_variables(modified_files: list[str], platform: str) -> Set[str]:
215266
modified_projects = _get_modified_projects(modified_files)
216267
projects_to_test = _compute_projects_to_test(modified_projects, platform)
217-
projects_to_build = _compute_projects_to_build(projects_to_test)
268+
runtimes_to_test = _compute_runtimes_to_test(modified_projects, platform)
269+
runtimes_to_test_needs_reconfig = _compute_runtimes_to_test_needs_reconfig(
270+
modified_projects, platform
271+
)
272+
runtimes_to_build = _compute_runtimes_to_build(
273+
runtimes_to_test | runtimes_to_test_needs_reconfig, modified_projects, platform
274+
)
275+
projects_to_build = _compute_projects_to_build(projects_to_test, runtimes_to_build)
218276
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)
277+
runtimes_check_targets = _compute_project_check_targets(runtimes_to_test)
278+
runtimes_check_targets_needs_reconfig = _compute_project_check_targets(
279+
runtimes_to_test_needs_reconfig
280+
)
281+
282+
# CIR is used as a pseudo-project in this script. It is built as part of the
283+
# clang build, but it requires an explicit option to enable. We set that
284+
# option here, and remove it from the projects_to_build list.
285+
enable_cir = "ON" if "CIR" in projects_to_build else "OFF"
286+
projects_to_build.discard("CIR")
287+
221288
# We use a semicolon to separate the projects/runtimes as they get passed
222289
# to the CMake invocation and thus we need to use the CMake list separator
223290
# (;). We use spaces to separate the check targets as they end up getting
224291
# passed to ninja.
225292
return {
226293
"projects_to_build": ";".join(sorted(projects_to_build)),
227294
"project_check_targets": " ".join(sorted(projects_check_targets)),
228-
"runtimes_to_build": ";".join(sorted(runtimes_to_test)),
295+
"runtimes_to_build": ";".join(sorted(runtimes_to_build)),
229296
"runtimes_check_targets": " ".join(sorted(runtimes_check_targets)),
297+
"runtimes_check_targets_needs_reconfig": " ".join(
298+
sorted(runtimes_check_targets_needs_reconfig)
299+
),
300+
"enable_cir": enable_cir,
230301
}
231302

232303

0 commit comments

Comments
 (0)