Skip to content

Commit f754b71

Browse files
authored
LLVM_ENABLE_RUNTIMES=flang-rt for flang-aarch64-out-of-tree (#388)
Make `FlangBuilder.getFlangOutOfTreeBuildFactory` build the flang-rt runtime as an out-of-tree runtimes build with additional steps. Fixes some issues with FlangBuilder too: * Clears the build directories with the clean_obj flag set. Usually buildbot deletes the build directory whenever a CMakeLists.txt in a depends_on_projects subdirectory changes to get a clean build. Otherwise, an incompatible CMakeCache.txt will carry on forever. * Add `flang` and `flang-rt` as depends_on_projects. Otherwise, changes in these subdirectories do not trigger a build. Even worse, breaking commits will be attributed to the next commit in llvm/clang/mlir/openmp, as happed in e.g. https://lab.llvm.org/buildbot/#/builders/53/builds/11759 (commit causing the failure was llvm/llvm-project@fe8b323 ) This PR is not strictly necessary for llvm/llvm-project#124126, it just wouldn't build the runtime anymore. Affected builders: * flang-aarch64-out-of-tree Affected workers: * linaro-flang-aarch64-out-of-tree Tested locally on x86_64.
1 parent 17c126f commit f754b71

File tree

4 files changed

+105
-7
lines changed

4 files changed

+105
-7
lines changed

buildbot/osuosl/master/config/builders.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2395,6 +2395,9 @@
23952395
flang_extra_configure_args=[
23962396
"-DFLANG_ENABLE_WERROR=ON",
23972397
"-DCMAKE_BUILD_TYPE=Release",
2398+
],
2399+
flang_rt_extra_configure_args=[
2400+
"-DCMAKE_BUILD_TYPE=Release",
23982401
])},
23992402

24002403
{'name' : "flang-aarch64-debug-reverse-iteration",

zorg/buildbot/builders/FlangBuilder.py

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,25 @@
11
from zorg.buildbot.commands.CmakeCommand import CmakeCommand
22
from zorg.buildbot.process.factory import LLVMBuildFactory
33
from zorg.buildbot.builders.UnifiedTreeBuilder import addNinjaSteps, getCmakeWithNinjaBuildFactory
4+
from buildbot.plugins import util, steps
5+
import os
46

57
def getFlangOutOfTreeBuildFactory(
68
checks = None,
79
clean = False,
810
llvm_extra_configure_args = None,
911
flang_extra_configure_args = None,
12+
flang_rt_extra_configure_args = None,
1013
env = None,
1114
**kwargs):
1215

1316
if env is None:
1417
env = dict()
1518

1619
f = getCmakeWithNinjaBuildFactory(
17-
depends_on_projects=['llvm','clang','mlir','openmp'],
20+
depends_on_projects=['llvm','clang','mlir','openmp','flang','flang-rt'],
21+
enable_projects=['llvm','clang','mlir'],
22+
enable_runtimes=['openmp'],
1823
obj_dir="build_llvm",
1924
checks=[],
2025
clean=clean,
@@ -25,6 +30,12 @@ def getFlangOutOfTreeBuildFactory(
2530
if checks is None:
2631
checks = ['check-all']
2732

33+
cleanBuildRequested = (
34+
lambda step: step.build.getProperty("clean")
35+
or step.build.getProperty("clean_obj")
36+
or clean
37+
)
38+
2839
# Make a local copy of the flang configure args, as we are going to modify that.
2940
if flang_extra_configure_args:
3041
flang_cmake_args = flang_extra_configure_args[:]
@@ -52,6 +63,16 @@ def getFlangOutOfTreeBuildFactory(
5263
LLVMBuildFactory.pathRelativeTo(clang_dir, flang_obj_dir)),
5364
])
5465

66+
f.addStep(
67+
steps.RemoveDirectory(
68+
name=f"clean-{flang_obj_dir}-dir",
69+
dir=flang_obj_dir,
70+
haltOnFailure=False,
71+
flunkOnFailure=False,
72+
doStepIf=cleanBuildRequested,
73+
)
74+
)
75+
5576
# We can't use addCmakeSteps as that would use the path in f.llvm_srcdir.
5677
f.addStep(CmakeCommand(name="cmake-configure-flang",
5778
haltOnFailure=True,
@@ -71,4 +92,58 @@ def getFlangOutOfTreeBuildFactory(
7192
stage_name="flang",
7293
**kwargs)
7394

95+
## Build Flang-RT as a standalone runtime
96+
flang_rt_obj_dir = "build_flang-rt"
97+
98+
flang_rt_cmake_args = ["-GNinja"]
99+
if flang_rt_extra_configure_args:
100+
flang_rt_cmake_args += flang_rt_extra_configure_args
101+
102+
# Use LLVM from the getCmakeWithNinjaBuildFactory step.
103+
flang_rt_cmake_args += [
104+
util.Interpolate(f"-DLLVM_BINARY_DIR=%(prop:builddir)s/{f.obj_dir}"),
105+
"-DLLVM_ENABLE_RUNTIMES=flang-rt",
106+
]
107+
108+
# Use the Fortran compiler from the previous step.
109+
flang_rt_cmake_args += [
110+
util.Interpolate(
111+
f"-DCMAKE_Fortran_COMPILER=%(prop:builddir)s/{flang_obj_dir}/bin/flang"
112+
),
113+
"-DCMAKE_Fortran_COMPILER_WORKS=ON",
114+
]
115+
116+
f.addStep(
117+
steps.RemoveDirectory(
118+
name=f"clean-{flang_rt_obj_dir}-dir",
119+
dir=flang_rt_obj_dir,
120+
haltOnFailure=False,
121+
flunkOnFailure=False,
122+
doStepIf=cleanBuildRequested,
123+
)
124+
)
125+
126+
f.addStep(
127+
CmakeCommand(
128+
name="cmake-configure-flang-rt",
129+
haltOnFailure=True,
130+
description=["CMake", "configure", "Flang-RT"],
131+
options=flang_rt_cmake_args,
132+
path=LLVMBuildFactory.pathRelativeTo(
133+
os.path.join(f.monorepo_dir, "runtimes"), flang_rt_obj_dir
134+
),
135+
env=env,
136+
workdir=flang_rt_obj_dir,
137+
**kwargs,
138+
)
139+
)
140+
141+
addNinjaSteps(
142+
f,
143+
obj_dir=flang_rt_obj_dir,
144+
checks=['check-flang-rt'],
145+
env=env,
146+
stage_name="flang-rt",
147+
**kwargs)
148+
74149
return f

zorg/buildbot/builders/UnifiedTreeBuilder.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
def getLLVMBuildFactoryAndPrepareForSourcecodeSteps(
1818
depends_on_projects = None,
19+
enable_projects = "auto",
1920
enable_runtimes = "auto",
2021
llvm_srcdir = None,
2122
src_to_build_dir = None,
@@ -34,6 +35,7 @@ def cleanBuildRequestedByProperty(step):
3435

3536
f = LLVMBuildFactory(
3637
depends_on_projects=depends_on_projects,
38+
enable_projects=enable_projects,
3739
enable_runtimes=enable_runtimes,
3840
llvm_srcdir=llvm_srcdir,
3941
src_to_build_dir=src_to_build_dir,
@@ -56,6 +58,7 @@ def cleanBuildRequestedByProperty(step):
5658

5759
def getLLVMBuildFactoryAndSourcecodeSteps(
5860
depends_on_projects = None,
61+
enable_projects = "auto",
5962
enable_runtimes = "auto",
6063
llvm_srcdir = None,
6164
src_to_build_dir = None,
@@ -66,6 +69,7 @@ def getLLVMBuildFactoryAndSourcecodeSteps(
6669

6770
f = getLLVMBuildFactoryAndPrepareForSourcecodeSteps(
6871
depends_on_projects=depends_on_projects,
72+
enable_projects=enable_projects,
6973
enable_runtimes=enable_runtimes,
7074
llvm_srcdir=llvm_srcdir,
7175
src_to_build_dir=src_to_build_dir,
@@ -254,6 +258,7 @@ def trunc50(name):
254258

255259
def getCmakeBuildFactory(
256260
depends_on_projects = None,
261+
enable_projects = "auto",
257262
enable_runtimes = "auto",
258263
llvm_srcdir = None,
259264
src_to_build_dir = None,
@@ -267,6 +272,7 @@ def getCmakeBuildFactory(
267272

268273
f = getLLVMBuildFactoryAndSourcecodeSteps(
269274
depends_on_projects=depends_on_projects,
275+
enable_projects=enable_projects,
270276
enable_runtimes=enable_runtimes,
271277
llvm_srcdir=llvm_srcdir,
272278
src_to_build_dir=src_to_build_dir,
@@ -298,6 +304,7 @@ def getCmakeBuildFactory(
298304

299305
def getCmakeWithNinjaBuildFactory(
300306
depends_on_projects = None,
307+
enable_projects = "auto",
301308
enable_runtimes = "auto",
302309
targets = None,
303310
llvm_srcdir = None,
@@ -335,6 +342,7 @@ def getCmakeWithNinjaBuildFactory(
335342

336343
f = getCmakeBuildFactory(
337344
depends_on_projects=depends_on_projects,
345+
enable_projects=enable_projects,
338346
enable_runtimes=enable_runtimes,
339347
llvm_srcdir=llvm_srcdir,
340348
src_to_build_dir=src_to_build_dir,

zorg/buildbot/process/factory.py

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -73,13 +73,25 @@ def __init__(self, steps=None, depends_on_projects=None, hint=None, **kwargs):
7373
# Let's just use the given list, no need to discover.
7474
self.enable_runtimes = frozenset(enable_runtimes)
7575

76-
# Update the list of dependencies.
77-
if depends_on_projects is None:
78-
self.depends_on_projects.update(self.enable_runtimes)
79-
8076
# Build the list of projects to enable.
81-
self.enable_projects = \
82-
self.depends_on_projects.difference(self.enable_runtimes)
77+
enable_projects = kwargs.pop('enable_projects', None)
78+
if enable_projects is None or enable_projects == "auto":
79+
# Assume that all non-runtimes depends_on_projects dirs are projects.
80+
self.enable_projects = \
81+
self.depends_on_projects.difference(self.enable_runtimes)
82+
elif enable_projects == "all":
83+
raise Exception("enable_projects='all' not yet supported")
84+
else:
85+
self.enable_projects = frozenset(enable_projects)
86+
87+
# Update the list of dependencies.
88+
if depends_on_projects is None:
89+
self.depends_on_projects.update(self.enable_projects)
90+
self.depends_on_projects.update(self.enable_runtimes)
91+
92+
assert self.enable_projects.issubset(self.depends_on_projects), \
93+
"all enable_projects must be listed in depends_on_projects, or it will be skipped by the scheduler"
94+
#FIXME: The same must hold for self.enable_runtimes but some builders violate it.
8395

8496
# Directories.
8597
self.monorepo_dir = kwargs.pop('llvm_srcdir', None)

0 commit comments

Comments
 (0)