xref: /aosp_15_r20/art/tools/luci/config/main.star (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker#!/usr/bin/env lucicfg
2*795d594fSAndroid Build Coastguard Worker#
3*795d594fSAndroid Build Coastguard Worker# Copyright (C) 2021 The Android Open Source Project
4*795d594fSAndroid Build Coastguard Worker#
5*795d594fSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
6*795d594fSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
7*795d594fSAndroid Build Coastguard Worker# You may obtain a copy of the License at
8*795d594fSAndroid Build Coastguard Worker#
9*795d594fSAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
10*795d594fSAndroid Build Coastguard Worker#
11*795d594fSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
12*795d594fSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
13*795d594fSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*795d594fSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
15*795d594fSAndroid Build Coastguard Worker# limitations under the License.
16*795d594fSAndroid Build Coastguard Worker#
17*795d594fSAndroid Build Coastguard Worker
18*795d594fSAndroid Build Coastguard Worker"""LUCI project configuration for the production instance of LUCI.
19*795d594fSAndroid Build Coastguard Worker
20*795d594fSAndroid Build Coastguard WorkerAfter modifying this file execute it ('./main.star') to regenerate the configs.
21*795d594fSAndroid Build Coastguard Worker"""
22*795d594fSAndroid Build Coastguard Worker
23*795d594fSAndroid Build Coastguard Workerlucicfg.check_version("1.30.9", "Please update depot_tools")
24*795d594fSAndroid Build Coastguard Worker
25*795d594fSAndroid Build Coastguard Workerluci.builder.defaults.experiments.set({
26*795d594fSAndroid Build Coastguard Worker    "luci.recipes.use_python3": 100,
27*795d594fSAndroid Build Coastguard Worker})
28*795d594fSAndroid Build Coastguard Worker
29*795d594fSAndroid Build Coastguard Worker# Use LUCI Scheduler BBv2 names and add Scheduler realms configs.
30*795d594fSAndroid Build Coastguard Workerlucicfg.enable_experiment("crbug.com/1182002")
31*795d594fSAndroid Build Coastguard Worker
32*795d594fSAndroid Build Coastguard Worker# Tell lucicfg what files it is allowed to touch.
33*795d594fSAndroid Build Coastguard Workerlucicfg.config(
34*795d594fSAndroid Build Coastguard Worker    config_dir = "generated",
35*795d594fSAndroid Build Coastguard Worker    fail_on_warnings = True,
36*795d594fSAndroid Build Coastguard Worker    lint_checks = ["default"],
37*795d594fSAndroid Build Coastguard Worker)
38*795d594fSAndroid Build Coastguard Worker
39*795d594fSAndroid Build Coastguard Worker# TODO: Switch to project-scoped service account.
40*795d594fSAndroid Build Coastguard Worker
41*795d594fSAndroid Build Coastguard Workerluci.project(
42*795d594fSAndroid Build Coastguard Worker    name = "art",
43*795d594fSAndroid Build Coastguard Worker    buildbucket = "cr-buildbucket.appspot.com",
44*795d594fSAndroid Build Coastguard Worker    logdog = "luci-logdog.appspot.com",
45*795d594fSAndroid Build Coastguard Worker    milo = "luci-milo.appspot.com",
46*795d594fSAndroid Build Coastguard Worker    notify = "luci-notify.appspot.com",
47*795d594fSAndroid Build Coastguard Worker    scheduler = "luci-scheduler.appspot.com",
48*795d594fSAndroid Build Coastguard Worker    swarming = "chromium-swarm.appspot.com",
49*795d594fSAndroid Build Coastguard Worker    acls = [
50*795d594fSAndroid Build Coastguard Worker        # Publicly readable.
51*795d594fSAndroid Build Coastguard Worker        acl.entry(
52*795d594fSAndroid Build Coastguard Worker            roles = [
53*795d594fSAndroid Build Coastguard Worker                acl.BUILDBUCKET_READER,
54*795d594fSAndroid Build Coastguard Worker                acl.LOGDOG_READER,
55*795d594fSAndroid Build Coastguard Worker                acl.PROJECT_CONFIGS_READER,
56*795d594fSAndroid Build Coastguard Worker                acl.SCHEDULER_READER,
57*795d594fSAndroid Build Coastguard Worker            ],
58*795d594fSAndroid Build Coastguard Worker            groups = "all",
59*795d594fSAndroid Build Coastguard Worker        ),
60*795d594fSAndroid Build Coastguard Worker        acl.entry(
61*795d594fSAndroid Build Coastguard Worker            roles = [
62*795d594fSAndroid Build Coastguard Worker                acl.BUILDBUCKET_OWNER,
63*795d594fSAndroid Build Coastguard Worker                acl.SCHEDULER_OWNER,
64*795d594fSAndroid Build Coastguard Worker            ],
65*795d594fSAndroid Build Coastguard Worker            groups = "project-art-admins",
66*795d594fSAndroid Build Coastguard Worker        ),
67*795d594fSAndroid Build Coastguard Worker        acl.entry(
68*795d594fSAndroid Build Coastguard Worker            roles = acl.LOGDOG_WRITER,
69*795d594fSAndroid Build Coastguard Worker            groups = "luci-logdog-chromium-writers",
70*795d594fSAndroid Build Coastguard Worker        ),
71*795d594fSAndroid Build Coastguard Worker    ],
72*795d594fSAndroid Build Coastguard Worker    bindings = [
73*795d594fSAndroid Build Coastguard Worker        luci.binding(
74*795d594fSAndroid Build Coastguard Worker            roles = "role/swarming.poolOwner",
75*795d594fSAndroid Build Coastguard Worker            groups = "project-art-admins",
76*795d594fSAndroid Build Coastguard Worker        ),
77*795d594fSAndroid Build Coastguard Worker        luci.binding(
78*795d594fSAndroid Build Coastguard Worker            roles = "role/swarming.poolViewer",
79*795d594fSAndroid Build Coastguard Worker            groups = "all",
80*795d594fSAndroid Build Coastguard Worker        ),
81*795d594fSAndroid Build Coastguard Worker    ],
82*795d594fSAndroid Build Coastguard Worker)
83*795d594fSAndroid Build Coastguard Worker
84*795d594fSAndroid Build Coastguard Worker# Per-service tweaks.
85*795d594fSAndroid Build Coastguard Workerluci.logdog(gs_bucket = "chromium-luci-logdog")
86*795d594fSAndroid Build Coastguard Workerluci.milo(logo = "https://storage.googleapis.com/chrome-infra-public/logo/art-logo.png")
87*795d594fSAndroid Build Coastguard Worker
88*795d594fSAndroid Build Coastguard Worker# Allow admins to use LED and "Debug" button on every builder and bot.
89*795d594fSAndroid Build Coastguard Workerluci.binding(
90*795d594fSAndroid Build Coastguard Worker    realm = "@root",
91*795d594fSAndroid Build Coastguard Worker    roles = "role/swarming.poolUser",
92*795d594fSAndroid Build Coastguard Worker    groups = "project-art-admins",
93*795d594fSAndroid Build Coastguard Worker)
94*795d594fSAndroid Build Coastguard Workerluci.binding(
95*795d594fSAndroid Build Coastguard Worker    realm = "@root",
96*795d594fSAndroid Build Coastguard Worker    roles = "role/swarming.taskTriggerer",
97*795d594fSAndroid Build Coastguard Worker    groups = "project-art-admins",
98*795d594fSAndroid Build Coastguard Worker)
99*795d594fSAndroid Build Coastguard Worker
100*795d594fSAndroid Build Coastguard Worker# Resources shared by all subprojects.
101*795d594fSAndroid Build Coastguard Worker
102*795d594fSAndroid Build Coastguard Workerluci.realm(name = "pools/ci")
103*795d594fSAndroid Build Coastguard Workerluci.bucket(name = "ci")
104*795d594fSAndroid Build Coastguard Worker
105*795d594fSAndroid Build Coastguard Worker# Shadow bucket is needed for LED.
106*795d594fSAndroid Build Coastguard Workerluci.bucket(
107*795d594fSAndroid Build Coastguard Worker    name = "ci.shadow",
108*795d594fSAndroid Build Coastguard Worker    shadows = "ci",
109*795d594fSAndroid Build Coastguard Worker    bindings = [
110*795d594fSAndroid Build Coastguard Worker        luci.binding(
111*795d594fSAndroid Build Coastguard Worker            roles = "role/buildbucket.creator",
112*795d594fSAndroid Build Coastguard Worker            users = ["[email protected]"],
113*795d594fSAndroid Build Coastguard Worker        ),
114*795d594fSAndroid Build Coastguard Worker        luci.binding(
115*795d594fSAndroid Build Coastguard Worker            roles = "role/buildbucket.triggerer",
116*795d594fSAndroid Build Coastguard Worker            users = ["[email protected]"],
117*795d594fSAndroid Build Coastguard Worker        ),
118*795d594fSAndroid Build Coastguard Worker    ],
119*795d594fSAndroid Build Coastguard Worker    constraints = luci.bucket_constraints(
120*795d594fSAndroid Build Coastguard Worker        pools = ["luci.art.ci"],
121*795d594fSAndroid Build Coastguard Worker        service_accounts = ["[email protected]"],
122*795d594fSAndroid Build Coastguard Worker    ),
123*795d594fSAndroid Build Coastguard Worker    dynamic = True,
124*795d594fSAndroid Build Coastguard Worker)
125*795d594fSAndroid Build Coastguard Worker
126*795d594fSAndroid Build Coastguard Workerluci.notifier_template(
127*795d594fSAndroid Build Coastguard Worker    name = "default",
128*795d594fSAndroid Build Coastguard Worker    body = io.read_file("luci-notify.template"),
129*795d594fSAndroid Build Coastguard Worker)
130*795d594fSAndroid Build Coastguard Worker
131*795d594fSAndroid Build Coastguard Workerluci.console_view(
132*795d594fSAndroid Build Coastguard Worker    name = "luci",
133*795d594fSAndroid Build Coastguard Worker    repo = "https://android.googlesource.com/platform/art",
134*795d594fSAndroid Build Coastguard Worker    title = "ART LUCI Console",
135*795d594fSAndroid Build Coastguard Worker    refs = ["refs/heads/master"],
136*795d594fSAndroid Build Coastguard Worker    include_experimental_builds = True,
137*795d594fSAndroid Build Coastguard Worker)
138*795d594fSAndroid Build Coastguard Worker
139*795d594fSAndroid Build Coastguard Workerluci.notifier(
140*795d594fSAndroid Build Coastguard Worker    name = "art-team+chromium-buildbot",
141*795d594fSAndroid Build Coastguard Worker    on_new_status = [
142*795d594fSAndroid Build Coastguard Worker        "FAILURE",
143*795d594fSAndroid Build Coastguard Worker        "INFRA_FAILURE",
144*795d594fSAndroid Build Coastguard Worker    ],
145*795d594fSAndroid Build Coastguard Worker    notify_emails = [
146*795d594fSAndroid Build Coastguard Worker        "[email protected]",
147*795d594fSAndroid Build Coastguard Worker    ],
148*795d594fSAndroid Build Coastguard Worker)
149*795d594fSAndroid Build Coastguard Worker
150*795d594fSAndroid Build Coastguard Workerluci.gitiles_poller(
151*795d594fSAndroid Build Coastguard Worker    name = "art",
152*795d594fSAndroid Build Coastguard Worker    bucket = "ci",
153*795d594fSAndroid Build Coastguard Worker    repo = "https://android.googlesource.com/platform/art",
154*795d594fSAndroid Build Coastguard Worker    refs = ["refs/heads/master"],
155*795d594fSAndroid Build Coastguard Worker)
156*795d594fSAndroid Build Coastguard Worker
157*795d594fSAndroid Build Coastguard Workerluci.gitiles_poller(
158*795d594fSAndroid Build Coastguard Worker    name = "libcore",
159*795d594fSAndroid Build Coastguard Worker    bucket = "ci",
160*795d594fSAndroid Build Coastguard Worker    repo = "https://android.googlesource.com/platform/libcore",
161*795d594fSAndroid Build Coastguard Worker    refs = ["refs/heads/master"],
162*795d594fSAndroid Build Coastguard Worker)
163*795d594fSAndroid Build Coastguard Worker
164*795d594fSAndroid Build Coastguard Workerluci.gitiles_poller(
165*795d594fSAndroid Build Coastguard Worker    name = "vogar",
166*795d594fSAndroid Build Coastguard Worker    bucket = "ci",
167*795d594fSAndroid Build Coastguard Worker    repo = "https://android.googlesource.com/platform/external/vogar",
168*795d594fSAndroid Build Coastguard Worker    refs = ["refs/heads/master"],
169*795d594fSAndroid Build Coastguard Worker)
170*795d594fSAndroid Build Coastguard Worker
171*795d594fSAndroid Build Coastguard Workerluci.gitiles_poller(
172*795d594fSAndroid Build Coastguard Worker    name = "manifest",
173*795d594fSAndroid Build Coastguard Worker    bucket = "ci",
174*795d594fSAndroid Build Coastguard Worker    repo = "https://android.googlesource.com/platform/manifest",
175*795d594fSAndroid Build Coastguard Worker    refs = ["refs/heads/master-art"],
176*795d594fSAndroid Build Coastguard Worker)
177*795d594fSAndroid Build Coastguard Worker
178*795d594fSAndroid Build Coastguard Workerdef ci_builder(name, category, short_name, dimensions, properties={},
179*795d594fSAndroid Build Coastguard Worker               experiments={}, hidden=False):
180*795d594fSAndroid Build Coastguard Worker    luci.builder(
181*795d594fSAndroid Build Coastguard Worker        name = name,
182*795d594fSAndroid Build Coastguard Worker        bucket = "ci",
183*795d594fSAndroid Build Coastguard Worker        executable = luci.recipe(
184*795d594fSAndroid Build Coastguard Worker            cipd_package = "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",
185*795d594fSAndroid Build Coastguard Worker            cipd_version = "refs/heads/main",
186*795d594fSAndroid Build Coastguard Worker            name = "art",
187*795d594fSAndroid Build Coastguard Worker        ),
188*795d594fSAndroid Build Coastguard Worker        dimensions = dimensions | {
189*795d594fSAndroid Build Coastguard Worker            "pool": "luci.art.ci",
190*795d594fSAndroid Build Coastguard Worker        },
191*795d594fSAndroid Build Coastguard Worker        service_account = "[email protected]",
192*795d594fSAndroid Build Coastguard Worker
193*795d594fSAndroid Build Coastguard Worker        # Maximum delay between scheduling a build and the build actually starting.
194*795d594fSAndroid Build Coastguard Worker        # In a healthy state (enough free/idle devices), the delay is fairly small,
195*795d594fSAndroid Build Coastguard Worker        # but if enough devices are offline, this timeout will cause INFRA_FAILURE.
196*795d594fSAndroid Build Coastguard Worker        # Set the value reasonably high to prefer delayed builds over failing ones.
197*795d594fSAndroid Build Coastguard Worker        # NB: LUCI also enforces (expiration_timeout + execution_timeout <= 47).
198*795d594fSAndroid Build Coastguard Worker        expiration_timeout = 17 * time.hour,
199*795d594fSAndroid Build Coastguard Worker        execution_timeout = 30 * time.hour,
200*795d594fSAndroid Build Coastguard Worker        build_numbers = True,
201*795d594fSAndroid Build Coastguard Worker        properties = properties,
202*795d594fSAndroid Build Coastguard Worker        caches = [
203*795d594fSAndroid Build Coastguard Worker            # Directory called "art" that persists from build to build (one per bot).
204*795d594fSAndroid Build Coastguard Worker            # We can checkout and build in this directory to get fast incremental builds.
205*795d594fSAndroid Build Coastguard Worker            swarming.cache("art", name = "art"),
206*795d594fSAndroid Build Coastguard Worker        ],
207*795d594fSAndroid Build Coastguard Worker        notifies = ["art-team+chromium-buildbot"] if not hidden else [],
208*795d594fSAndroid Build Coastguard Worker        triggered_by = [
209*795d594fSAndroid Build Coastguard Worker            "art",
210*795d594fSAndroid Build Coastguard Worker            "libcore",
211*795d594fSAndroid Build Coastguard Worker            "manifest",
212*795d594fSAndroid Build Coastguard Worker            "vogar",
213*795d594fSAndroid Build Coastguard Worker        ],
214*795d594fSAndroid Build Coastguard Worker        experiments = experiments,
215*795d594fSAndroid Build Coastguard Worker    )
216*795d594fSAndroid Build Coastguard Worker    if not hidden:
217*795d594fSAndroid Build Coastguard Worker        luci.console_view_entry(
218*795d594fSAndroid Build Coastguard Worker            console_view = "luci",
219*795d594fSAndroid Build Coastguard Worker            builder = name,
220*795d594fSAndroid Build Coastguard Worker            category = category,
221*795d594fSAndroid Build Coastguard Worker            short_name = short_name,
222*795d594fSAndroid Build Coastguard Worker        )
223*795d594fSAndroid Build Coastguard Worker
224*795d594fSAndroid Build Coastguard Workerdef add_builder(mode,
225*795d594fSAndroid Build Coastguard Worker                arch,
226*795d594fSAndroid Build Coastguard Worker                bitness,
227*795d594fSAndroid Build Coastguard Worker                ndebug=False,
228*795d594fSAndroid Build Coastguard Worker                ngen=False,
229*795d594fSAndroid Build Coastguard Worker                cmc=False,
230*795d594fSAndroid Build Coastguard Worker                gcstress=False,
231*795d594fSAndroid Build Coastguard Worker                poison=False,
232*795d594fSAndroid Build Coastguard Worker                hidden=False):
233*795d594fSAndroid Build Coastguard Worker    def check_arg(value, valid_values):
234*795d594fSAndroid Build Coastguard Worker      if value not in valid_values:
235*795d594fSAndroid Build Coastguard Worker        fail("Argument '{}' was expected to be on of {}".format(value, valid_values))
236*795d594fSAndroid Build Coastguard Worker    check_arg(mode, ["target", "host", "qemu"])
237*795d594fSAndroid Build Coastguard Worker    check_arg(arch, ["arm", "x86", "riscv"])
238*795d594fSAndroid Build Coastguard Worker    check_arg(bitness, [32, 64])
239*795d594fSAndroid Build Coastguard Worker
240*795d594fSAndroid Build Coastguard Worker    # Create builder name based on the configuaration parameters.
241*795d594fSAndroid Build Coastguard Worker    name = mode + '.' + arch
242*795d594fSAndroid Build Coastguard Worker    name += '.gsctress' if gcstress else ''
243*795d594fSAndroid Build Coastguard Worker    name += '.poison' if poison else ''
244*795d594fSAndroid Build Coastguard Worker    name += '.ngen' if ngen else ''
245*795d594fSAndroid Build Coastguard Worker    name += '.cmc' if cmc else ''
246*795d594fSAndroid Build Coastguard Worker    name += '.ndebug' if ndebug else ''
247*795d594fSAndroid Build Coastguard Worker    name += '.' + str(bitness)
248*795d594fSAndroid Build Coastguard Worker    name = name.replace("ngen.cmc", "ngen-cmc")
249*795d594fSAndroid Build Coastguard Worker
250*795d594fSAndroid Build Coastguard Worker    # Define the LUCI console category (the tree layout).
251*795d594fSAndroid Build Coastguard Worker    # The "|" splits the tree node into sub-categories.
252*795d594fSAndroid Build Coastguard Worker    # Merge some name parts to reduce the tree depth.
253*795d594fSAndroid Build Coastguard Worker    category = name.replace(".", "|")
254*795d594fSAndroid Build Coastguard Worker    category = category.replace("host|", "host.")
255*795d594fSAndroid Build Coastguard Worker    category = category.replace("target|", "target.")
256*795d594fSAndroid Build Coastguard Worker
257*795d594fSAndroid Build Coastguard Worker    product = None
258*795d594fSAndroid Build Coastguard Worker    if arch == "arm":
259*795d594fSAndroid Build Coastguard Worker      product = "armv8" if bitness == 64 else "arm_krait"
260*795d594fSAndroid Build Coastguard Worker    if arch == "riscv":
261*795d594fSAndroid Build Coastguard Worker      product = "riscv64"
262*795d594fSAndroid Build Coastguard Worker
263*795d594fSAndroid Build Coastguard Worker    dimensions = {"os": "Android" if mode == "target" else "Ubuntu"}
264*795d594fSAndroid Build Coastguard Worker    if mode == "target":
265*795d594fSAndroid Build Coastguard Worker      if cmc:
266*795d594fSAndroid Build Coastguard Worker        # Request devices running Android 24Q3 (`AP1A` builds) for
267*795d594fSAndroid Build Coastguard Worker        # (`userfaultfd`-based) Concurrent Mark-Compact GC configurations.
268*795d594fSAndroid Build Coastguard Worker        # Currently (as of 2024-08-22), the only devices within the device pool
269*795d594fSAndroid Build Coastguard Worker        # allocated to ART that are running `AP1A` builds are Pixel 6 devices
270*795d594fSAndroid Build Coastguard Worker        # (all other device types are running older Android versions), which are
271*795d594fSAndroid Build Coastguard Worker        # also the only device model supporting `userfaultfd` among that pool.
272*795d594fSAndroid Build Coastguard Worker        dimensions |= {"device_os": "A"}
273*795d594fSAndroid Build Coastguard Worker      else:
274*795d594fSAndroid Build Coastguard Worker        # Run all other configurations on Android S since it is the oldest we support.
275*795d594fSAndroid Build Coastguard Worker        # Other than the `AP1A` builds above, all other devices are flashed to `SP2A`.
276*795d594fSAndroid Build Coastguard Worker        # This avoids allocating `userfaultfd` devices for tests that don't need it.
277*795d594fSAndroid Build Coastguard Worker        dimensions |= {"device_os": "S"}
278*795d594fSAndroid Build Coastguard Worker    elif mode == "host":
279*795d594fSAndroid Build Coastguard Worker      dimensions |= {"cores": "8"}
280*795d594fSAndroid Build Coastguard Worker    elif mode == "qemu":
281*795d594fSAndroid Build Coastguard Worker      dimensions |= {"cores": "16"}
282*795d594fSAndroid Build Coastguard Worker
283*795d594fSAndroid Build Coastguard Worker    testrunner_args = ['--verbose', '--host'] if mode == 'host' else ['--target', '--verbose']
284*795d594fSAndroid Build Coastguard Worker    testrunner_args += ['--ndebug'] if ndebug else ['--debug']
285*795d594fSAndroid Build Coastguard Worker    testrunner_args += ['--gcstress'] if gcstress else []
286*795d594fSAndroid Build Coastguard Worker
287*795d594fSAndroid Build Coastguard Worker    properties = {
288*795d594fSAndroid Build Coastguard Worker        "builder_group": "client.art",
289*795d594fSAndroid Build Coastguard Worker        "bitness": bitness,
290*795d594fSAndroid Build Coastguard Worker        "build_only": ("build_only" in name),
291*795d594fSAndroid Build Coastguard Worker        "debug": not ndebug,
292*795d594fSAndroid Build Coastguard Worker        "device": None if mode == "host" else "-".join(name.split("-")[:2]),
293*795d594fSAndroid Build Coastguard Worker        "on_virtual_machine": mode == "qemu",
294*795d594fSAndroid Build Coastguard Worker        "product": product,
295*795d594fSAndroid Build Coastguard Worker        "concurrent_collector": not cmc,
296*795d594fSAndroid Build Coastguard Worker        "generational_cc": not ngen,
297*795d594fSAndroid Build Coastguard Worker        "gcstress": gcstress,
298*795d594fSAndroid Build Coastguard Worker        "heap_poisoning": poison,
299*795d594fSAndroid Build Coastguard Worker        "testrunner_args": testrunner_args,
300*795d594fSAndroid Build Coastguard Worker    }
301*795d594fSAndroid Build Coastguard Worker
302*795d594fSAndroid Build Coastguard Worker    experiments = {"art.superproject": 100} if mode == "qemu" else {}
303*795d594fSAndroid Build Coastguard Worker
304*795d594fSAndroid Build Coastguard Worker    ci_builder(name=name,
305*795d594fSAndroid Build Coastguard Worker               category="|".join(category.split("|")[:-1]),
306*795d594fSAndroid Build Coastguard Worker               short_name=category.split("|")[-1],
307*795d594fSAndroid Build Coastguard Worker               dimensions=dimensions,
308*795d594fSAndroid Build Coastguard Worker               properties={k:v for k, v in properties.items() if v},
309*795d594fSAndroid Build Coastguard Worker               experiments=experiments,
310*795d594fSAndroid Build Coastguard Worker               hidden=hidden)
311*795d594fSAndroid Build Coastguard Worker
312*795d594fSAndroid Build Coastguard Workerdef add_builders():
313*795d594fSAndroid Build Coastguard Worker  for mode, arch in [("target", "arm"), ("host", "x86")]:
314*795d594fSAndroid Build Coastguard Worker    for bitness in [32, 64]:
315*795d594fSAndroid Build Coastguard Worker      # Add first to keep these builders together and left-aligned in the console.
316*795d594fSAndroid Build Coastguard Worker      add_builder(mode, arch, bitness)
317*795d594fSAndroid Build Coastguard Worker    for bitness in [32, 64]:
318*795d594fSAndroid Build Coastguard Worker      add_builder(mode, arch, bitness, ndebug=True)
319*795d594fSAndroid Build Coastguard Worker      if mode == "host":
320*795d594fSAndroid Build Coastguard Worker        add_builder(mode, arch, bitness, ngen=True, cmc=True)
321*795d594fSAndroid Build Coastguard Worker      add_builder(mode, arch, bitness, cmc=True)
322*795d594fSAndroid Build Coastguard Worker      add_builder(mode, arch, bitness, poison=True)
323*795d594fSAndroid Build Coastguard Worker      add_builder(mode, arch, bitness, gcstress=True)
324*795d594fSAndroid Build Coastguard Worker  add_builder('qemu', 'arm', bitness=64)
325*795d594fSAndroid Build Coastguard Worker  add_builder('qemu', 'riscv', bitness=64)
326*795d594fSAndroid Build Coastguard Worker
327*795d594fSAndroid Build Coastguard Workeradd_builders()