xref: /aosp_15_r20/external/cronet/build/config/siso/reproxy.star (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker# -*- bazel-starlark -*-
2*6777b538SAndroid Build Coastguard Worker# Copyright 2023 The Chromium Authors
3*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
4*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file.
5*6777b538SAndroid Build Coastguard Worker"""Siso configuration for rewriting remote calls into reproxy config."""
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Workerload("@builtin//encoding.star", "json")
8*6777b538SAndroid Build Coastguard Workerload("@builtin//lib/gn.star", "gn")
9*6777b538SAndroid Build Coastguard Workerload("@builtin//path.star", "path")
10*6777b538SAndroid Build Coastguard Workerload("@builtin//struct.star", "module")
11*6777b538SAndroid Build Coastguard Workerload("./clang_code_coverage_wrapper.star", "clang_code_coverage_wrapper")
12*6777b538SAndroid Build Coastguard Workerload("./config.star", "config")
13*6777b538SAndroid Build Coastguard Workerload("./platform.star", "platform")
14*6777b538SAndroid Build Coastguard Workerload("./rewrapper_cfg.star", "rewrapper_cfg")
15*6777b538SAndroid Build Coastguard Worker
16*6777b538SAndroid Build Coastguard Workerdef __filegroups(ctx):
17*6777b538SAndroid Build Coastguard Worker    return {}
18*6777b538SAndroid Build Coastguard Worker
19*6777b538SAndroid Build Coastguard Workerdef __parse_rewrapper_cmdline(ctx, cmd):
20*6777b538SAndroid Build Coastguard Worker    if not "rewrapper" in cmd.args[0]:
21*6777b538SAndroid Build Coastguard Worker        return [], "", False
22*6777b538SAndroid Build Coastguard Worker
23*6777b538SAndroid Build Coastguard Worker    # Example command:
24*6777b538SAndroid Build Coastguard Worker    #   ../../buildtools/reclient/rewrapper
25*6777b538SAndroid Build Coastguard Worker    #     -cfg=../../buildtools/reclient_cfgs/chromium-browser-clang/rewrapper_linux.cfg
26*6777b538SAndroid Build Coastguard Worker    #     -inputs=build/config/unsafe_buffers_paths.txt
27*6777b538SAndroid Build Coastguard Worker    #     -exec_root=/path/to/your/chromium/src/
28*6777b538SAndroid Build Coastguard Worker    #     ../../third_party/llvm-build/Release+Asserts/bin/clang++
29*6777b538SAndroid Build Coastguard Worker    #     [rest of clang args]
30*6777b538SAndroid Build Coastguard Worker    # We don't need to care about:
31*6777b538SAndroid Build Coastguard Worker    #   -exec_root: Siso already knows this.
32*6777b538SAndroid Build Coastguard Worker    wrapped_command_pos = -1
33*6777b538SAndroid Build Coastguard Worker    cfg_file = None
34*6777b538SAndroid Build Coastguard Worker    skip = ""
35*6777b538SAndroid Build Coastguard Worker    rw_ops = {}
36*6777b538SAndroid Build Coastguard Worker    for i, arg in enumerate(cmd.args):
37*6777b538SAndroid Build Coastguard Worker        if i == 0:
38*6777b538SAndroid Build Coastguard Worker            continue
39*6777b538SAndroid Build Coastguard Worker        if arg.startswith("-cfg="):
40*6777b538SAndroid Build Coastguard Worker            cfg_file = ctx.fs.canonpath(arg.removeprefix("-cfg="))
41*6777b538SAndroid Build Coastguard Worker            continue
42*6777b538SAndroid Build Coastguard Worker        if arg.startswith("-inputs=") or skip == "-inputs":
43*6777b538SAndroid Build Coastguard Worker            rw_ops["inputs"] = arg.removeprefix("-inputs=").split(",")
44*6777b538SAndroid Build Coastguard Worker            skip = ""
45*6777b538SAndroid Build Coastguard Worker            continue
46*6777b538SAndroid Build Coastguard Worker        if arg == "-inputs":
47*6777b538SAndroid Build Coastguard Worker            skip = arg
48*6777b538SAndroid Build Coastguard Worker            continue
49*6777b538SAndroid Build Coastguard Worker        if not arg.startswith("-"):
50*6777b538SAndroid Build Coastguard Worker            wrapped_command_pos = i
51*6777b538SAndroid Build Coastguard Worker            break
52*6777b538SAndroid Build Coastguard Worker    if wrapped_command_pos < 1:
53*6777b538SAndroid Build Coastguard Worker        fail("couldn't find first non-arg passed to rewrapper for %s" % str(cmd.args))
54*6777b538SAndroid Build Coastguard Worker    if not cfg_file:
55*6777b538SAndroid Build Coastguard Worker        return cmd.args[wrapped_command_pos:], rw_ops, True
56*6777b538SAndroid Build Coastguard Worker    rw_cfg_opts = rewrapper_cfg.parse(ctx, cfg_file)
57*6777b538SAndroid Build Coastguard Worker
58*6777b538SAndroid Build Coastguard Worker    # Command line options have higher priority than the ones in the cfg file.
59*6777b538SAndroid Build Coastguard Worker    rw_cfg_opts.update(rw_ops)
60*6777b538SAndroid Build Coastguard Worker    return cmd.args[wrapped_command_pos:], rw_cfg_opts, True
61*6777b538SAndroid Build Coastguard Worker
62*6777b538SAndroid Build Coastguard Workerdef __parse_cros_rewrapper_cmdline(ctx, cmd):
63*6777b538SAndroid Build Coastguard Worker    # fix cros sdk clang command line and extract rewrapper cfg.
64*6777b538SAndroid Build Coastguard Worker    # Example command:
65*6777b538SAndroid Build Coastguard Worker    #   ../../build/cros_cache/chrome-sdk/symlinks/amd64-generic+15629.0.0+target_toolchain/bin/x86_64-cros-linux-gnu-clang++
66*6777b538SAndroid Build Coastguard Worker    #  -MMD -MF obj/third_party/abseil-cpp/absl/base/base/spinlock.o.d
67*6777b538SAndroid Build Coastguard Worker    #  ...
68*6777b538SAndroid Build Coastguard Worker    #  --rewrapper-path /usr/local/google/home/ukai/src/chromium/src/build/args/chromeos/rewrapper_amd64-generic
69*6777b538SAndroid Build Coastguard Worker    #  --rewrapper-cfg ../../buildtools/reclient_cfgs/chromium-browser-clang/rewrapper_linux.cfg
70*6777b538SAndroid Build Coastguard Worker    #  -pipe -march=x86-64 -msse3 ...
71*6777b538SAndroid Build Coastguard Worker    cfg_file = None
72*6777b538SAndroid Build Coastguard Worker    skip = ""
73*6777b538SAndroid Build Coastguard Worker    args = []
74*6777b538SAndroid Build Coastguard Worker    toolchainpath = None
75*6777b538SAndroid Build Coastguard Worker    for i, arg in enumerate(cmd.args):
76*6777b538SAndroid Build Coastguard Worker        if i == 0:
77*6777b538SAndroid Build Coastguard Worker            toolchainpath = path.dir(path.dir(ctx.fs.canonpath(arg)))
78*6777b538SAndroid Build Coastguard Worker            args.append(arg)
79*6777b538SAndroid Build Coastguard Worker            continue
80*6777b538SAndroid Build Coastguard Worker        if skip:
81*6777b538SAndroid Build Coastguard Worker            if skip == "--rewrapper-cfg":
82*6777b538SAndroid Build Coastguard Worker                cfg_file = ctx.fs.canonpath(arg)
83*6777b538SAndroid Build Coastguard Worker            skip = ""
84*6777b538SAndroid Build Coastguard Worker            continue
85*6777b538SAndroid Build Coastguard Worker        if arg in ("--rewrapper-path", "--rewrapper-cfg"):
86*6777b538SAndroid Build Coastguard Worker            skip = arg
87*6777b538SAndroid Build Coastguard Worker            continue
88*6777b538SAndroid Build Coastguard Worker        args.append(arg)
89*6777b538SAndroid Build Coastguard Worker    if not cfg_file:
90*6777b538SAndroid Build Coastguard Worker        fail("couldn't find rewrapper cfg file in %s" % str(cmd.args))
91*6777b538SAndroid Build Coastguard Worker    rwcfg = rewrapper_cfg.parse(ctx, cfg_file)
92*6777b538SAndroid Build Coastguard Worker    inputs = rwcfg.get("inputs", [])
93*6777b538SAndroid Build Coastguard Worker    inputs.extend([
94*6777b538SAndroid Build Coastguard Worker        path.join(toolchainpath, "bin"),
95*6777b538SAndroid Build Coastguard Worker        path.join(toolchainpath, "lib"),
96*6777b538SAndroid Build Coastguard Worker        path.join(toolchainpath, "usr/bin"),
97*6777b538SAndroid Build Coastguard Worker        path.join(toolchainpath, "usr/lib64/clang"),
98*6777b538SAndroid Build Coastguard Worker        # TODO: b/320189180 - Simple Chrome builds should use libraries under usr/lib64.
99*6777b538SAndroid Build Coastguard Worker        # But, Ninja/Reclient also don't use them unexpectedly.
100*6777b538SAndroid Build Coastguard Worker    ])
101*6777b538SAndroid Build Coastguard Worker    rwcfg["inputs"] = inputs
102*6777b538SAndroid Build Coastguard Worker    rwcfg["preserve_symlinks"] = True
103*6777b538SAndroid Build Coastguard Worker    return args, rwcfg
104*6777b538SAndroid Build Coastguard Worker
105*6777b538SAndroid Build Coastguard Worker# TODO(b/278225415): change gn so this wrapper (and by extension this handler) becomes unnecessary.
106*6777b538SAndroid Build Coastguard Workerdef __parse_clang_code_coverage_wrapper_cmdline(ctx, cmd):
107*6777b538SAndroid Build Coastguard Worker    # Example command:
108*6777b538SAndroid Build Coastguard Worker    #   python3
109*6777b538SAndroid Build Coastguard Worker    #     ../../build/toolchain/clang_code_coverage_wrapper.py
110*6777b538SAndroid Build Coastguard Worker    #     --target-os=...
111*6777b538SAndroid Build Coastguard Worker    #     --files_to_instrument=...
112*6777b538SAndroid Build Coastguard Worker    #     ../../buildtools/reclient/rewrapper
113*6777b538SAndroid Build Coastguard Worker    #     -cfg=../../buildtools/reclient_cfgs/chromium-browser-clang/rewrapper_linux.cfg
114*6777b538SAndroid Build Coastguard Worker    #     -inputs=build/config/unsafe_buffers_paths.txt
115*6777b538SAndroid Build Coastguard Worker    #     -exec_root=/path/to/your/chromium/src/
116*6777b538SAndroid Build Coastguard Worker    #     ../../third_party/llvm-build/Release+Asserts/bin/clang++
117*6777b538SAndroid Build Coastguard Worker    #     [rest of clang args]
118*6777b538SAndroid Build Coastguard Worker    # We don't need to care about:
119*6777b538SAndroid Build Coastguard Worker    #   most args to clang_code_coverage_wrapper (need --files_to_instrument as tool_input)
120*6777b538SAndroid Build Coastguard Worker    #   -exec_root: Siso already knows this.
121*6777b538SAndroid Build Coastguard Worker    rewrapper_pos = -1
122*6777b538SAndroid Build Coastguard Worker    wrapped_command_pos = -1
123*6777b538SAndroid Build Coastguard Worker    cfg_file = None
124*6777b538SAndroid Build Coastguard Worker    skip = None
125*6777b538SAndroid Build Coastguard Worker    rw_ops = {}
126*6777b538SAndroid Build Coastguard Worker    for i, arg in enumerate(cmd.args):
127*6777b538SAndroid Build Coastguard Worker        if i < 2:
128*6777b538SAndroid Build Coastguard Worker            continue
129*6777b538SAndroid Build Coastguard Worker        if rewrapper_pos == -1 and not arg.startswith("-"):
130*6777b538SAndroid Build Coastguard Worker            rewrapper_pos = i
131*6777b538SAndroid Build Coastguard Worker            continue
132*6777b538SAndroid Build Coastguard Worker        if rewrapper_pos > 0 and arg.startswith("-cfg="):
133*6777b538SAndroid Build Coastguard Worker            cfg_file = ctx.fs.canonpath(arg.removeprefix("-cfg="))
134*6777b538SAndroid Build Coastguard Worker            continue
135*6777b538SAndroid Build Coastguard Worker        if arg.startswith("-inputs=") or skip == "-inputs":
136*6777b538SAndroid Build Coastguard Worker            rw_ops["inputs"] = arg.removeprefix("-inputs=").split(",")
137*6777b538SAndroid Build Coastguard Worker            skip = ""
138*6777b538SAndroid Build Coastguard Worker            continue
139*6777b538SAndroid Build Coastguard Worker        if arg == "-inputs":
140*6777b538SAndroid Build Coastguard Worker            skip = arg
141*6777b538SAndroid Build Coastguard Worker            continue
142*6777b538SAndroid Build Coastguard Worker        if rewrapper_pos > 0 and not arg.startswith("-"):
143*6777b538SAndroid Build Coastguard Worker            wrapped_command_pos = i
144*6777b538SAndroid Build Coastguard Worker            break
145*6777b538SAndroid Build Coastguard Worker    if rewrapper_pos < 1:
146*6777b538SAndroid Build Coastguard Worker        fail("couldn't find rewrapper in %s" % str(cmd.args))
147*6777b538SAndroid Build Coastguard Worker    if wrapped_command_pos < 1:
148*6777b538SAndroid Build Coastguard Worker        fail("couldn't find first non-arg passed to rewrapper for %s" % str(cmd.args))
149*6777b538SAndroid Build Coastguard Worker    if not cfg_file:
150*6777b538SAndroid Build Coastguard Worker        fail("couldn't find rewrapper cfg file in %s" % str(cmd.args))
151*6777b538SAndroid Build Coastguard Worker    coverage_wrapper_command = cmd.args[:rewrapper_pos] + cmd.args[wrapped_command_pos:]
152*6777b538SAndroid Build Coastguard Worker    clang_command = clang_code_coverage_wrapper.run(ctx, list(coverage_wrapper_command))
153*6777b538SAndroid Build Coastguard Worker    if len(clang_command) > 1 and "/chrome-sdk/" in clang_command[0]:
154*6777b538SAndroid Build Coastguard Worker        # TODO: implement cros sdk support under code coverage wrapper
155*6777b538SAndroid Build Coastguard Worker        fail("need to fix handler for cros sdk under code coverage wrapper")
156*6777b538SAndroid Build Coastguard Worker    rw_cfg_opts = rewrapper_cfg.parse(ctx, cfg_file)
157*6777b538SAndroid Build Coastguard Worker
158*6777b538SAndroid Build Coastguard Worker    # Command line options have higher priority than the ones in the cfg file.
159*6777b538SAndroid Build Coastguard Worker    rw_cfg_opts.update(rw_ops)
160*6777b538SAndroid Build Coastguard Worker    return clang_command, rw_cfg_opts
161*6777b538SAndroid Build Coastguard Worker
162*6777b538SAndroid Build Coastguard Workerdef __rewrite_rewrapper(ctx, cmd, use_large = False):
163*6777b538SAndroid Build Coastguard Worker    # If clang-coverage, needs different handling.
164*6777b538SAndroid Build Coastguard Worker    if len(cmd.args) > 2 and "clang_code_coverage_wrapper.py" in cmd.args[1]:
165*6777b538SAndroid Build Coastguard Worker        args, rwcfg = __parse_clang_code_coverage_wrapper_cmdline(ctx, cmd)
166*6777b538SAndroid Build Coastguard Worker    elif len(cmd.args) > 1 and "/chrome-sdk/" in cmd.args[0]:
167*6777b538SAndroid Build Coastguard Worker        args, rwcfg = __parse_cros_rewrapper_cmdline(ctx, cmd)
168*6777b538SAndroid Build Coastguard Worker    else:
169*6777b538SAndroid Build Coastguard Worker        # handling for generic rewrapper.
170*6777b538SAndroid Build Coastguard Worker        args, rwcfg, wrapped = __parse_rewrapper_cmdline(ctx, cmd)
171*6777b538SAndroid Build Coastguard Worker        if not wrapped:
172*6777b538SAndroid Build Coastguard Worker            print("command doesn't have rewrapper. %s" % str(cmd.args))
173*6777b538SAndroid Build Coastguard Worker            return
174*6777b538SAndroid Build Coastguard Worker    if not rwcfg:
175*6777b538SAndroid Build Coastguard Worker        fail("couldn't find rewrapper cfg file in %s" % str(cmd.args))
176*6777b538SAndroid Build Coastguard Worker    if use_large:
177*6777b538SAndroid Build Coastguard Worker        platform = rwcfg.get("platform", {})
178*6777b538SAndroid Build Coastguard Worker        if platform.get("OSFamily") == "Windows":
179*6777b538SAndroid Build Coastguard Worker            # Since there is no large Windows workers, it needs to run locally.
180*6777b538SAndroid Build Coastguard Worker            ctx.actions.fix(args = args)
181*6777b538SAndroid Build Coastguard Worker            return
182*6777b538SAndroid Build Coastguard Worker        if platform:
183*6777b538SAndroid Build Coastguard Worker            action_key = None
184*6777b538SAndroid Build Coastguard Worker            for key in rwcfg["platform"]:
185*6777b538SAndroid Build Coastguard Worker                if key.startswith("label:action_"):
186*6777b538SAndroid Build Coastguard Worker                    action_key = key
187*6777b538SAndroid Build Coastguard Worker                    break
188*6777b538SAndroid Build Coastguard Worker            if action_key:
189*6777b538SAndroid Build Coastguard Worker                rwcfg["platform"].pop(action_key)
190*6777b538SAndroid Build Coastguard Worker        else:
191*6777b538SAndroid Build Coastguard Worker            rwcfg["platform"] = {}
192*6777b538SAndroid Build Coastguard Worker        rwcfg["platform"].update({
193*6777b538SAndroid Build Coastguard Worker            "label:action_large": "1",
194*6777b538SAndroid Build Coastguard Worker        })
195*6777b538SAndroid Build Coastguard Worker
196*6777b538SAndroid Build Coastguard Worker        # Some large compiles take longer than the default timeout 2m.
197*6777b538SAndroid Build Coastguard Worker        rwcfg["exec_timeout"] = "4m"
198*6777b538SAndroid Build Coastguard Worker        rwcfg["reclient_timeout"] = "4m"
199*6777b538SAndroid Build Coastguard Worker    ctx.actions.fix(
200*6777b538SAndroid Build Coastguard Worker        args = args,
201*6777b538SAndroid Build Coastguard Worker        reproxy_config = json.encode(rwcfg),
202*6777b538SAndroid Build Coastguard Worker    )
203*6777b538SAndroid Build Coastguard Worker
204*6777b538SAndroid Build Coastguard Workerdef __rewrite_rewrapper_large(ctx, cmd):
205*6777b538SAndroid Build Coastguard Worker    return __rewrite_rewrapper(ctx, cmd, use_large = True)
206*6777b538SAndroid Build Coastguard Worker
207*6777b538SAndroid Build Coastguard Workerdef __strip_rewrapper(ctx, cmd):
208*6777b538SAndroid Build Coastguard Worker    # If clang-coverage, needs different handling.
209*6777b538SAndroid Build Coastguard Worker    if len(cmd.args) > 2 and "clang_code_coverage_wrapper.py" in cmd.args[1]:
210*6777b538SAndroid Build Coastguard Worker        args, _ = __parse_clang_code_coverage_wrapper_cmdline(ctx, cmd)
211*6777b538SAndroid Build Coastguard Worker    else:
212*6777b538SAndroid Build Coastguard Worker        args, _, wrapped = __parse_rewrapper_cmdline(ctx, cmd)
213*6777b538SAndroid Build Coastguard Worker        if not wrapped:
214*6777b538SAndroid Build Coastguard Worker            print("command doesn't have rewrapper. %s" % str(cmd.args))
215*6777b538SAndroid Build Coastguard Worker            return
216*6777b538SAndroid Build Coastguard Worker    ctx.actions.fix(args = args)
217*6777b538SAndroid Build Coastguard Worker
218*6777b538SAndroid Build Coastguard Worker__handlers = {
219*6777b538SAndroid Build Coastguard Worker    "rewrite_rewrapper": __rewrite_rewrapper,
220*6777b538SAndroid Build Coastguard Worker    "rewrite_rewrapper_large": __rewrite_rewrapper_large,
221*6777b538SAndroid Build Coastguard Worker    "strip_rewrapper": __strip_rewrapper,
222*6777b538SAndroid Build Coastguard Worker}
223*6777b538SAndroid Build Coastguard Worker
224*6777b538SAndroid Build Coastguard Workerdef __use_remoteexec(ctx):
225*6777b538SAndroid Build Coastguard Worker    if "args.gn" in ctx.metadata:
226*6777b538SAndroid Build Coastguard Worker        gn_args = gn.args(ctx)
227*6777b538SAndroid Build Coastguard Worker        if gn_args.get("use_remoteexec") == "true":
228*6777b538SAndroid Build Coastguard Worker            return True
229*6777b538SAndroid Build Coastguard Worker    return False
230*6777b538SAndroid Build Coastguard Worker
231*6777b538SAndroid Build Coastguard Workerdef __step_config(ctx, step_config):
232*6777b538SAndroid Build Coastguard Worker    # New rules to convert commands calling rewrapper to use reproxy instead.
233*6777b538SAndroid Build Coastguard Worker    new_rules = []
234*6777b538SAndroid Build Coastguard Worker
235*6777b538SAndroid Build Coastguard Worker    # Disable racing on builders since bots don't have many CPU cores.
236*6777b538SAndroid Build Coastguard Worker    # TODO: b/297807325 - Siso wants to handle local execution.
237*6777b538SAndroid Build Coastguard Worker    # However, Reclient's alerts require racing and local fallback to be
238*6777b538SAndroid Build Coastguard Worker    # done on Reproxy side.
239*6777b538SAndroid Build Coastguard Worker    exec_strategy = "racing"
240*6777b538SAndroid Build Coastguard Worker    if config.get(ctx, "builder"):
241*6777b538SAndroid Build Coastguard Worker        exec_strategy = "remote_local_fallback"
242*6777b538SAndroid Build Coastguard Worker
243*6777b538SAndroid Build Coastguard Worker    for rule in step_config["rules"]:
244*6777b538SAndroid Build Coastguard Worker        # Replace nacl-clang/clang++ rules without command_prefix, because they will incorrectly match rewrapper.
245*6777b538SAndroid Build Coastguard Worker        # Replace the original step rule with one that only rewrites rewrapper and convert its rewrapper config to reproxy config.
246*6777b538SAndroid Build Coastguard Worker        if rule["name"].find("nacl-clang") >= 0 and not rule.get("command_prefix"):
247*6777b538SAndroid Build Coastguard Worker            new_rule = {
248*6777b538SAndroid Build Coastguard Worker                "name": rule["name"],
249*6777b538SAndroid Build Coastguard Worker                "action": rule["action"],
250*6777b538SAndroid Build Coastguard Worker                "handler": "rewrite_rewrapper",
251*6777b538SAndroid Build Coastguard Worker            }
252*6777b538SAndroid Build Coastguard Worker            new_rules.append(new_rule)
253*6777b538SAndroid Build Coastguard Worker            continue
254*6777b538SAndroid Build Coastguard Worker
255*6777b538SAndroid Build Coastguard Worker        # clang cxx/cc/objcxx/objc will always have rewrapper config when use_remoteexec=true.
256*6777b538SAndroid Build Coastguard Worker        # Remove the native siso handling and replace with custom rewrapper-specific handling.
257*6777b538SAndroid Build Coastguard Worker        # All other rule values are not reused, instead use rewrapper config via handler.
258*6777b538SAndroid Build Coastguard Worker        # (In particular, command_prefix should be avoided because it will be rewrapper.)
259*6777b538SAndroid Build Coastguard Worker        if (rule["name"].startswith("clang/cxx") or rule["name"].startswith("clang/cc") or
260*6777b538SAndroid Build Coastguard Worker            rule["name"].startswith("clang-cl/cxx") or rule["name"].startswith("clang-cl/cc") or
261*6777b538SAndroid Build Coastguard Worker            rule["name"].startswith("clang/objc")):
262*6777b538SAndroid Build Coastguard Worker            if not rule.get("action"):
263*6777b538SAndroid Build Coastguard Worker                fail("clang rule %s found without action" % rule["name"])
264*6777b538SAndroid Build Coastguard Worker
265*6777b538SAndroid Build Coastguard Worker            new_rule = {
266*6777b538SAndroid Build Coastguard Worker                "name": rule["name"],
267*6777b538SAndroid Build Coastguard Worker                "action": rule["action"],
268*6777b538SAndroid Build Coastguard Worker                "exclude_input_patterns": rule.get("exclude_input_patterns"),
269*6777b538SAndroid Build Coastguard Worker                "handler": "rewrite_rewrapper",
270*6777b538SAndroid Build Coastguard Worker                "input_root_absolute_path": rule.get("input_root_absolute_path"),
271*6777b538SAndroid Build Coastguard Worker            }
272*6777b538SAndroid Build Coastguard Worker            new_rules.append(new_rule)
273*6777b538SAndroid Build Coastguard Worker            continue
274*6777b538SAndroid Build Coastguard Worker
275*6777b538SAndroid Build Coastguard Worker        # clang-coverage/ is handled by the rewrite_rewrapper handler of clang/{cxx, cc} action rules above, so ignore these rules.
276*6777b538SAndroid Build Coastguard Worker        if rule["name"].startswith("clang-coverage/"):
277*6777b538SAndroid Build Coastguard Worker            continue
278*6777b538SAndroid Build Coastguard Worker
279*6777b538SAndroid Build Coastguard Worker        # Add non-remote rules as-is.
280*6777b538SAndroid Build Coastguard Worker        if not rule.get("remote"):
281*6777b538SAndroid Build Coastguard Worker            new_rules.append(rule)
282*6777b538SAndroid Build Coastguard Worker            continue
283*6777b538SAndroid Build Coastguard Worker
284*6777b538SAndroid Build Coastguard Worker        # Finally handle remaining remote rules. It's assumed it is enough to only convert native remote config to reproxy config.
285*6777b538SAndroid Build Coastguard Worker        platform_ref = rule.get("platform_ref")
286*6777b538SAndroid Build Coastguard Worker        if platform_ref:
287*6777b538SAndroid Build Coastguard Worker            p = step_config["platforms"].get(platform_ref)
288*6777b538SAndroid Build Coastguard Worker            if not p:
289*6777b538SAndroid Build Coastguard Worker                fail("Rule %s uses undefined platform '%s'" % (rule["name"], platform_ref))
290*6777b538SAndroid Build Coastguard Worker        else:
291*6777b538SAndroid Build Coastguard Worker            p = step_config.get("platforms", {}).get("default")
292*6777b538SAndroid Build Coastguard Worker            if not p:
293*6777b538SAndroid Build Coastguard Worker                fail("Rule %s did not set platform_ref but no default platform exists" % rule["name"])
294*6777b538SAndroid Build Coastguard Worker        rule["reproxy_config"] = {
295*6777b538SAndroid Build Coastguard Worker            "platform": p,
296*6777b538SAndroid Build Coastguard Worker            "labels": {
297*6777b538SAndroid Build Coastguard Worker                "type": "tool",
298*6777b538SAndroid Build Coastguard Worker                "siso_rule": rule["name"],
299*6777b538SAndroid Build Coastguard Worker            },
300*6777b538SAndroid Build Coastguard Worker            "canonicalize_working_dir": rule.get("canonicalize_dir", False),
301*6777b538SAndroid Build Coastguard Worker            "exec_strategy": exec_strategy,
302*6777b538SAndroid Build Coastguard Worker            "exec_timeout": rule.get("timeout", "10m"),
303*6777b538SAndroid Build Coastguard Worker            "reclient_timeout": rule.get("timeout", "10m"),
304*6777b538SAndroid Build Coastguard Worker            "download_outputs": True,
305*6777b538SAndroid Build Coastguard Worker        }
306*6777b538SAndroid Build Coastguard Worker        new_rules.append(rule)
307*6777b538SAndroid Build Coastguard Worker
308*6777b538SAndroid Build Coastguard Worker    step_config["rules"] = new_rules
309*6777b538SAndroid Build Coastguard Worker    return step_config
310*6777b538SAndroid Build Coastguard Worker
311*6777b538SAndroid Build Coastguard Workerreproxy = module(
312*6777b538SAndroid Build Coastguard Worker    "reproxy",
313*6777b538SAndroid Build Coastguard Worker    enabled = __use_remoteexec,
314*6777b538SAndroid Build Coastguard Worker    step_config = __step_config,
315*6777b538SAndroid Build Coastguard Worker    filegroups = __filegroups,
316*6777b538SAndroid Build Coastguard Worker    handlers = __handlers,
317*6777b538SAndroid Build Coastguard Worker)
318